Merge "Fix error color states and alphas and sizes of lock screen icons" into oc-dr1-dev
am: 905fcf0787
Change-Id: I71cbb691f3bfe8d4d37fd09d5d1bc5ef83146090
diff --git a/Android.bp b/Android.bp
index 33f3213..cb840cf 100644
--- a/Android.bp
+++ b/Android.bp
@@ -16,8 +16,6 @@
cc_library {
name: "libplatformprotos",
host_supported: true,
- // b/34740546, work around clang-tidy segmentation fault.
- tidy_checks: ["-modernize*"],
proto: {
export_proto_headers: true,
include_dirs: ["external/protobuf/src"],
diff --git a/Android.mk b/Android.mk
index 3b44255..69c8c2c 100644
--- a/Android.mk
+++ b/Android.mk
@@ -71,8 +71,6 @@
core/java/android/accounts/IAccountManagerResponse.aidl \
core/java/android/accounts/IAccountAuthenticator.aidl \
core/java/android/accounts/IAccountAuthenticatorResponse.aidl \
- core/java/android/app/IActivityContainer.aidl \
- core/java/android/app/IActivityContainerCallback.aidl \
core/java/android/app/IActivityController.aidl \
core/java/android/app/IActivityManager.aidl \
core/java/android/app/IActivityPendingResult.aidl \
@@ -84,6 +82,7 @@
core/java/android/app/ITaskStackListener.aidl \
core/java/android/app/IBackupAgent.aidl \
core/java/android/app/IEphemeralResolver.aidl \
+ core/java/android/app/IInputForwarder.aidl \
core/java/android/app/IInstantAppResolver.aidl \
core/java/android/app/IInstrumentationWatcher.aidl \
core/java/android/app/INotificationManager.aidl \
@@ -440,10 +439,6 @@
location/java/android/location/INetInitiatedListener.aidl \
location/java/com/android/internal/location/ILocationProvider.aidl \
media/java/android/media/IAudioService.aidl \
- ../av/drm/libmediadrm/aidl/android/media/ICas.aidl \
- ../av/drm/libmediadrm/aidl/android/media/ICasListener.aidl \
- ../av/drm/libmediadrm/aidl/android/media/IDescrambler.aidl \
- ../av/drm/libmediadrm/aidl/android/media/IMediaCasService.aidl \
media/java/android/media/IAudioFocusDispatcher.aidl \
media/java/android/media/IAudioRoutesObserver.aidl \
media/java/android/media/IMediaHTTPConnection.aidl \
@@ -506,7 +501,7 @@
telecomm/java/com/android/internal/telecom/RemoteServiceCallback.aidl \
telephony/java/android/telephony/mbms/IMbmsDownloadManagerCallback.aidl \
telephony/java/android/telephony/mbms/IMbmsStreamingManagerCallback.aidl \
- telephony/java/android/telephony/mbms/IDownloadCallback.aidl \
+ telephony/java/android/telephony/mbms/IDownloadProgressListener.aidl \
telephony/java/android/telephony/mbms/IStreamingServiceCallback.aidl \
telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl \
telephony/java/android/telephony/mbms/vendor/IMbmsStreamingService.aidl \
@@ -616,6 +611,8 @@
android.hardware.vibrator-V1.1-java-constants \
android.hardware.wifi-V1.0-java-constants \
+include hardware/interfaces/cas/1.0/CasHal.mk
+
# Loaded with System.loadLibrary by android.view.textclassifier
LOCAL_REQUIRED_MODULES += libtextclassifier
@@ -648,7 +645,6 @@
aidl_files := \
frameworks/base/telephony/java/android/telephony/mbms/DownloadRequest.aidl \
- frameworks/base/telephony/java/android/telephony/mbms/DownloadStatus.aidl \
frameworks/base/telephony/java/android/telephony/mbms/FileInfo.aidl \
frameworks/base/telephony/java/android/telephony/mbms/FileServiceInfo.aidl \
frameworks/base/telephony/java/android/telephony/mbms/ServiceInfo.aidl \
@@ -716,7 +712,9 @@
frameworks/base/core/java/android/print/PrinterInfo.aidl \
frameworks/base/core/java/android/print/PrintJobId.aidl \
frameworks/base/core/java/android/printservice/recommendation/RecommendationInfo.aidl \
+ frameworks/base/core/java/android/hardware/radio/ProgramSelector.aidl \
frameworks/base/core/java/android/hardware/radio/RadioManager.aidl \
+ frameworks/base/core/java/android/hardware/radio/RadioMetadata.aidl \
frameworks/base/core/java/android/hardware/usb/UsbDevice.aidl \
frameworks/base/core/java/android/hardware/usb/UsbInterface.aidl \
frameworks/base/core/java/android/hardware/usb/UsbEndpoint.aidl \
@@ -732,6 +730,7 @@
frameworks/base/core/java/android/os/DropBoxManager.aidl \
frameworks/base/core/java/android/os/Bundle.aidl \
frameworks/base/core/java/android/os/Debug.aidl \
+ frameworks/base/core/java/android/os/SharedMemory.aidl \
frameworks/base/core/java/android/os/StrictMode.aidl \
frameworks/base/core/java/android/accessibilityservice/AccessibilityServiceInfo.aidl \
frameworks/base/core/java/android/net/Network.aidl \
@@ -876,7 +875,6 @@
# The result will be relative to frameworks/base.
fwbase_dirs_to_document := \
legacy-test/src \
- test-runner/src \
$(patsubst $(LOCAL_PATH)/%,%, \
$(wildcard \
$(foreach dir, $(FRAMEWORKS_BASE_JAVA_SRC_DIRS), \
@@ -894,6 +892,12 @@
../opt/net/voip/src/java/android/net/rtp \
../opt/net/voip/src/java/android/net/sip
+framework_base_android_test_mock_src_files := \
+ $(call all-java-files-under, test-runner/src/android/test/mock)
+
+framework_base_android_test_runner_excluding_mock_src_files := \
+ $(filter-out $(framework_base_android_test_mock_src_files), $(call all-java-files-under, test-runner/src))
+
# These are relative to frameworks/base
dirs_to_check_apis := \
$(fwbase_dirs_to_document) \
@@ -913,8 +917,8 @@
# FRAMEWORKS_BASE_SUBDIRS comes from build/core/pathmap.mk
dirs_to_document := \
$(dirs_to_check_apis) \
- $(addprefix ../../, $(FRAMEWORKS_DATA_BINDING_JAVA_SRC_DIRS)) \
- $(addprefix ../../, $(FRAMEWORKS_SUPPORT_JAVA_SRC_DIRS)) \
+ test-runner/src \
+ $(addprefix ../../, $(FRAMEWORKS_DATA_BINDING_JAVA_SRC_DIRS))
patterns_to_not_document := \
$(call find-no-docs-pattern, $(dirs_to_document))
@@ -936,7 +940,9 @@
# These are relative to frameworks/base
framework_docs_LOCAL_API_CHECK_SRC_FILES := \
- $(call find-other-java-files, $(dirs_to_check_apis)) \
+ $(framework_base_android_test_mock_src_files) \
+ $(framework_base_android_test_runner_excluding_mock_src_files) \
+ $(call all-java-files-under, $(dirs_to_check_apis)) \
$(common_src_files)
# This is used by ide.mk as the list of source files that are
@@ -960,8 +966,11 @@
ext \
icu4j \
framework \
- voip-common
+ voip-common \
+ android.test.mock \
+# Platform docs can refer to Support Library APIs, but we don't actually build
+# them as part of the docs target, so we need to include them on the classpath.
framework_docs_LOCAL_JAVA_LIBRARIES := \
$(framework_docs_LOCAL_API_CHECK_JAVA_LIBRARIES) \
$(FRAMEWORKS_SUPPORT_JAVA_LIBRARIES)
@@ -1008,16 +1017,11 @@
-werror -hide 111 -hide 113 -hide 121 \
-overview $(LOCAL_PATH)/core/java/overview.html \
-# Allow the support library to add its own droiddoc options.
-include $(LOCAL_PATH)/../support/droiddoc.mk
-
framework_docs_LOCAL_API_CHECK_ADDITIONAL_JAVA_DIR:= \
$(call intermediates-dir-for,JAVA_LIBRARIES,framework,,COMMON)
framework_docs_LOCAL_ADDITIONAL_JAVA_DIR:= \
- $(framework_docs_LOCAL_API_CHECK_ADDITIONAL_JAVA_DIR) \
- $(foreach lib,$(FRAMEWORKS_SUPPORT_JAVA_LIBRARIES),$(call intermediates-dir-for,JAVA_LIBRARIES,$(lib),,COMMON)) \
- $(foreach lib,$(FRAMEWORKS_SUPPORT_JAVA_LIBRARIES),$(call intermediates-dir-for,JAVA_LIBRARIES,$(lib)-res,,COMMON))
+ $(framework_docs_LOCAL_API_CHECK_ADDITIONAL_JAVA_DIR)
framework_docs_LOCAL_ADDITIONAL_DEPENDENCIES := \
frameworks/base/docs/knowntags.txt \
@@ -1060,6 +1064,11 @@
-resourcesdir $(LOCAL_PATH)/docs/html/reference/images/ \
-resourcesoutdir reference/android/images/
+# Federate Support Library references against local API file.
+framework_docs_LOCAL_DROIDDOC_OPTIONS += \
+ -federate SupportLib https://developer.android.com \
+ -federationapi SupportLib prebuilts/sdk/current/support-api.txt
+
# ==== the api stubs and current.xml ===========================
include $(CLEAR_VARS)
diff --git a/apct-tests/perftests/core/src/android/database/CursorWindowPerfTest.java b/apct-tests/perftests/core/src/android/database/CursorWindowPerfTest.java
new file mode 100644
index 0000000..897d0ae
--- /dev/null
+++ b/apct-tests/perftests/core/src/android/database/CursorWindowPerfTest.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2017 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.database;
+
+import static org.junit.Assert.assertTrue;
+
+import android.content.Context;
+import android.database.sqlite.SQLiteCursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.perftests.utils.BenchmarkState;
+import android.perftests.utils.PerfStatusReporter;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.LargeTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@LargeTest
+public class CursorWindowPerfTest {
+ @Rule
+ public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();
+
+ private static Context getContext() {
+ return InstrumentationRegistry.getTargetContext();
+ }
+
+ private static final String DB_NAME = CursorWindowPerfTest.class.toString();
+
+ private static SQLiteDatabase sDatabase;
+
+ @BeforeClass
+ public static void setup() {
+ getContext().deleteDatabase(DB_NAME);
+ sDatabase = getContext().openOrCreateDatabase(DB_NAME, Context.MODE_PRIVATE, null);
+
+ for (TableHelper helper : TableHelper.TABLE_HELPERS) {
+ sDatabase.execSQL(helper.createSql());
+ final String insert = helper.insertSql();
+
+ // this test only needs 1 row
+ sDatabase.execSQL(insert, helper.createItem(0));
+ }
+
+ }
+
+ @AfterClass
+ public static void teardown() {
+ getContext().deleteDatabase(DB_NAME);
+ }
+
+ @Test
+ public void loadInt() {
+ loadRowFromCursorWindow(TableHelper.INT_1, false);
+ }
+
+ @Test
+ public void loadInt_doubleRef() {
+ loadRowFromCursorWindow(TableHelper.INT_1, true);
+ }
+
+ @Test
+ public void load10Ints() {
+ loadRowFromCursorWindow(TableHelper.INT_10, false);
+ }
+
+ @Test
+ public void loadUser() {
+ loadRowFromCursorWindow(TableHelper.USER, false);
+ }
+
+ private void loadRowFromCursorWindow(TableHelper helper, boolean doubleRef) {
+ try (Cursor cursor = sDatabase.rawQuery(helper.readSql(), new String[0])) {
+ TableHelper.CursorReader reader = helper.createReader(cursor);
+
+ SQLiteCursor sqLiteCursor = (SQLiteCursor) cursor;
+
+ sqLiteCursor.getCount(); // load one window
+ CursorWindow window = sqLiteCursor.getWindow();
+ assertTrue("must have enough rows", window.getNumRows() >= 1);
+ int start = window.getStartPosition();
+
+ BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+
+ if (!doubleRef) {
+ // normal access
+ while (state.keepRunning()) {
+ cursor.moveToPosition(start);
+ reader.read();
+ }
+ } else {
+ // add an extra window acquire/release to measure overhead
+ while (state.keepRunning()) {
+ cursor.moveToPosition(start);
+ try {
+ window.acquireReference();
+ reader.read();
+ } finally {
+ window.releaseReference();
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/apct-tests/perftests/core/src/android/database/TableHelper.java b/apct-tests/perftests/core/src/android/database/TableHelper.java
new file mode 100644
index 0000000..48f3781
--- /dev/null
+++ b/apct-tests/perftests/core/src/android/database/TableHelper.java
@@ -0,0 +1,223 @@
+/*
+ * Copyright (C) 2017 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.database;
+
+import java.util.Date;
+import java.util.UUID;
+
+/**
+ * Helper class for creating and querying data from a database in performance tests.
+ *
+ * Subclasses can define different table/query formats.
+ */
+public abstract class TableHelper {
+
+ public interface CursorReader {
+ void read();
+ }
+
+ public abstract String createSql();
+ public abstract String insertSql();
+ public abstract Object[] createItem(int id);
+ public abstract String readSql();
+ public abstract CursorReader createReader(Cursor cursor);
+
+ /**
+ * 1 column, single integer
+ */
+ public static TableHelper INT_1 = new TableHelper() {
+ @Override
+ public String createSql() {
+ return "CREATE TABLE `Int1` ("
+ + "`a` INTEGER,"
+ + " PRIMARY KEY(`a`))";
+ }
+
+ @Override
+ public String insertSql() {
+ return "INSERT INTO `Int1`(`a`)"
+ + " VALUES (?)";
+ }
+
+ @Override
+ public Object[] createItem(int id) {
+ return new Object[] {
+ id,
+ };
+ }
+
+ @Override
+ public String readSql() {
+ return "SELECT * from Int1";
+ }
+
+ @Override
+ public CursorReader createReader(final Cursor cursor) {
+ final int cursorIndexOfA = cursor.getColumnIndexOrThrow("a");
+ return () -> {
+ cursor.getInt(cursorIndexOfA);
+ };
+ }
+ };
+ /**
+ * 10 columns of integers
+ */
+ public static TableHelper INT_10 = new TableHelper() {
+ @Override
+ public String createSql() {
+ return "CREATE TABLE `Int10` ("
+ + "`a` INTEGER,"
+ + " `b` INTEGER,"
+ + " `c` INTEGER,"
+ + " `d` INTEGER,"
+ + " `e` INTEGER,"
+ + " `f` INTEGER,"
+ + " `g` INTEGER,"
+ + " `h` INTEGER,"
+ + " `i` INTEGER,"
+ + " `j` INTEGER,"
+ + " PRIMARY KEY(`a`))";
+ }
+
+ @Override
+ public String insertSql() {
+ return "INSERT INTO `Int10`(`a`,`b`,`c`,`d`,`e`,`f`,`g`,`h`,`i`,`j`)"
+ + " VALUES (?,?,?,?,?,?,?,?,?,?)";
+ }
+
+ @Override
+ public Object[] createItem(int id) {
+ return new Object[] {
+ id,
+ id + 1,
+ id + 2,
+ id + 3,
+ id + 4,
+ id + 5,
+ id + 6,
+ id + 7,
+ id + 8,
+ id + 9,
+ };
+ }
+
+ @Override
+ public String readSql() {
+ return "SELECT * from Int10";
+ }
+
+ @Override
+ public CursorReader createReader(final Cursor cursor) {
+ final int cursorIndexOfA = cursor.getColumnIndexOrThrow("a");
+ final int cursorIndexOfB = cursor.getColumnIndexOrThrow("b");
+ final int cursorIndexOfC = cursor.getColumnIndexOrThrow("c");
+ final int cursorIndexOfD = cursor.getColumnIndexOrThrow("d");
+ final int cursorIndexOfE = cursor.getColumnIndexOrThrow("e");
+ final int cursorIndexOfF = cursor.getColumnIndexOrThrow("f");
+ final int cursorIndexOfG = cursor.getColumnIndexOrThrow("g");
+ final int cursorIndexOfH = cursor.getColumnIndexOrThrow("h");
+ final int cursorIndexOfI = cursor.getColumnIndexOrThrow("i");
+ final int cursorIndexOfJ = cursor.getColumnIndexOrThrow("j");
+ return () -> {
+ cursor.getInt(cursorIndexOfA);
+ cursor.getInt(cursorIndexOfB);
+ cursor.getInt(cursorIndexOfC);
+ cursor.getInt(cursorIndexOfD);
+ cursor.getInt(cursorIndexOfE);
+ cursor.getInt(cursorIndexOfF);
+ cursor.getInt(cursorIndexOfG);
+ cursor.getInt(cursorIndexOfH);
+ cursor.getInt(cursorIndexOfI);
+ cursor.getInt(cursorIndexOfJ);
+ };
+ }
+ };
+
+ /**
+ * Mock up of 'user' table with various ints/strings
+ */
+ public static TableHelper USER = new TableHelper() {
+ @Override
+ public String createSql() {
+ return "CREATE TABLE `User` ("
+ + "`mId` INTEGER,"
+ + " `mName` TEXT,"
+ + " `mLastName` TEXT,"
+ + " `mAge` INTEGER,"
+ + " `mAdmin` INTEGER,"
+ + " `mWeight` DOUBLE,"
+ + " `mBirthday` INTEGER,"
+ + " `mMoreText` TEXT,"
+ + " PRIMARY KEY(`mId`))";
+ }
+
+ @Override
+ public String insertSql() {
+ return "INSERT INTO `User`(`mId`,`mName`,`mLastName`,`mAge`,"
+ + "`mAdmin`,`mWeight`,`mBirthday`,`mMoreText`) VALUES (?,?,?,?,?,?,?,?)";
+ }
+
+ @Override
+ public Object[] createItem(int id) {
+ return new Object[] {
+ id,
+ UUID.randomUUID().toString(),
+ UUID.randomUUID().toString(),
+ (int) (10 + Math.random() * 50),
+ 0,
+ (float)0,
+ new Date().getTime(),
+ UUID.randomUUID().toString(),
+ };
+ }
+
+ @Override
+ public String readSql() {
+ return "SELECT * from User";
+ }
+
+ @Override
+ public CursorReader createReader(final Cursor cursor) {
+ final int cursorIndexOfMId = cursor.getColumnIndexOrThrow("mId");
+ final int cursorIndexOfMName = cursor.getColumnIndexOrThrow("mName");
+ final int cursorIndexOfMLastName = cursor.getColumnIndexOrThrow("mLastName");
+ final int cursorIndexOfMAge = cursor.getColumnIndexOrThrow("mAge");
+ final int cursorIndexOfMAdmin = cursor.getColumnIndexOrThrow("mAdmin");
+ final int cursorIndexOfMWeight = cursor.getColumnIndexOrThrow("mWeight");
+ final int cursorIndexOfMBirthday = cursor.getColumnIndexOrThrow("mBirthday");
+ final int cursorIndexOfMMoreTextField = cursor.getColumnIndexOrThrow("mMoreText");
+ return () -> {
+ cursor.getInt(cursorIndexOfMId);
+ cursor.getString(cursorIndexOfMName);
+ cursor.getString(cursorIndexOfMLastName);
+ cursor.getInt(cursorIndexOfMAge);
+ cursor.getInt(cursorIndexOfMAdmin);
+ cursor.getFloat(cursorIndexOfMWeight);
+ if (!cursor.isNull(cursorIndexOfMBirthday)) {
+ cursor.getLong(cursorIndexOfMBirthday);
+ }
+ cursor.getString(cursorIndexOfMMoreTextField);
+ };
+ }
+ };
+
+ public static TableHelper[] TABLE_HELPERS = new TableHelper[] {
+ INT_1,
+ INT_10,
+ USER,
+ };
+}
diff --git a/apct-tests/perftests/core/src/android/os/ParcelPerfTest.java b/apct-tests/perftests/core/src/android/os/ParcelPerfTest.java
index 8cd45f7..a92597f 100644
--- a/apct-tests/perftests/core/src/android/os/ParcelPerfTest.java
+++ b/apct-tests/perftests/core/src/android/os/ParcelPerfTest.java
@@ -57,6 +57,46 @@
}
@Test
+ public void timeGetDataPosition() {
+ final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ while (state.keepRunning()) {
+ mParcel.dataPosition();
+ }
+ }
+
+ @Test
+ public void timeSetDataSize() {
+ final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ while (state.keepRunning()) {
+ mParcel.setDataSize(0);
+ }
+ }
+
+ @Test
+ public void timeGetDataSize() {
+ final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ while (state.keepRunning()) {
+ mParcel.dataSize();
+ }
+ }
+
+ @Test
+ public void timeSetDataCapacity() {
+ final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ while (state.keepRunning()) {
+ mParcel.setDataCapacity(0);
+ }
+ }
+
+ @Test
+ public void timeGetDataCapacity() {
+ final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ while (state.keepRunning()) {
+ mParcel.dataCapacity();
+ }
+ }
+
+ @Test
public void timeWriteByte() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
final byte val = 0xF;
@@ -112,4 +152,19 @@
mParcel.readLong();
}
}
+
+ @Test
+ public void timeObtainRecycle() {
+ // Use up the pooled instances.
+ // A lot bigger than the actual size but in case someone increased it.
+ final int POOL_SIZE = 100;
+ for (int i = 0; i < POOL_SIZE; i++) {
+ Parcel.obtain();
+ }
+
+ final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ while (state.keepRunning()) {
+ Parcel.obtain().recycle();
+ }
+ }
}
diff --git a/apct-tests/perftests/multiuser/Android.mk b/apct-tests/perftests/multiuser/Android.mk
index f670043..e3f7775 100644
--- a/apct-tests/perftests/multiuser/Android.mk
+++ b/apct-tests/perftests/multiuser/Android.mk
@@ -20,8 +20,7 @@
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_STATIC_JAVA_LIBRARIES := \
- android-support-test \
- apct-perftests-utils
+ android-support-test
LOCAL_PACKAGE_NAME := MultiUserPerfTests
diff --git a/apct-tests/perftests/multiuser/src/android/multiuser/BenchmarkResults.java b/apct-tests/perftests/multiuser/src/android/multiuser/BenchmarkResults.java
new file mode 100644
index 0000000..e417ca7
--- /dev/null
+++ b/apct-tests/perftests/multiuser/src/android/multiuser/BenchmarkResults.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2017 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.multiuser;
+
+import android.os.Bundle;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.concurrent.TimeUnit;
+
+public class BenchmarkResults {
+ private final ArrayList<Long> mResults = new ArrayList<>();
+
+ public void addDuration(long duration) {
+ mResults.add(TimeUnit.NANOSECONDS.toMillis(duration));
+ }
+
+ public Bundle getStatsToReport() {
+ final Bundle stats = new Bundle();
+ stats.putDouble("Mean (ms)", mean());
+ return stats;
+ }
+
+ public Bundle getStatsToLog() {
+ final Bundle stats = new Bundle();
+ stats.putDouble("Mean (ms)", mean());
+ stats.putDouble("Median (ms)", median());
+ stats.putDouble("Sigma (ms)", standardDeviation());
+ return stats;
+ }
+
+ public ArrayList<Long> getAllDurations() {
+ return mResults;
+ }
+
+ private double mean() {
+ final int size = mResults.size();
+ long sum = 0;
+ for (int i = 0; i < size; ++i) {
+ sum += mResults.get(i);
+ }
+ return (double) sum / size;
+ }
+
+ private double median() {
+ final int size = mResults.size();
+ if (size == 0) {
+ return 0f;
+ }
+ Collections.sort(mResults);
+ final int idx = size / 2;
+ return size % 2 == 0
+ ? (double) (mResults.get(idx) + mResults.get(idx - 1)) / 2
+ : mResults.get(idx);
+ }
+
+ private double standardDeviation() {
+ final int size = mResults.size();
+ if (size == 0) {
+ return 0f;
+ }
+ final double mean = mean();
+ double sd = 0;
+ for (int i = 0; i < size; ++i) {
+ double diff = mResults.get(i) - mean;
+ sd += diff * diff;
+ }
+ return Math.sqrt(sd / size);
+ }
+}
diff --git a/apct-tests/perftests/multiuser/src/android/multiuser/BenchmarkResultsReporter.java b/apct-tests/perftests/multiuser/src/android/multiuser/BenchmarkResultsReporter.java
new file mode 100644
index 0000000..d3a3ce5
--- /dev/null
+++ b/apct-tests/perftests/multiuser/src/android/multiuser/BenchmarkResultsReporter.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2017 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.multiuser;
+
+import android.app.Activity;
+import android.app.Instrumentation;
+import android.os.Bundle;
+import android.support.test.InstrumentationRegistry;
+import android.util.Log;
+
+import org.junit.rules.TestRule;
+import org.junit.runner.Description;
+import org.junit.runners.model.Statement;
+
+import java.util.ArrayList;
+
+public class BenchmarkResultsReporter implements TestRule {
+ private final BenchmarkRunner mRunner;
+
+ public BenchmarkResultsReporter(BenchmarkRunner benchmarkRunner) {
+ mRunner = benchmarkRunner;
+ }
+
+ @Override
+ public Statement apply(final Statement base, final Description description) {
+ return new Statement() {
+ @Override
+ public void evaluate() throws Throwable {
+ base.evaluate();
+ final Bundle stats = mRunner.getStatsToReport();
+ final String summary = getSummaryString(description.getMethodName(),
+ mRunner.getStatsToLog());
+ logSummary(description.getTestClass().getSimpleName(), summary,
+ mRunner.getAllDurations());
+ stats.putString(Instrumentation.REPORT_KEY_STREAMRESULT, summary);
+ InstrumentationRegistry.getInstrumentation().sendStatus(
+ Activity.RESULT_OK, stats);
+ }
+ };
+ }
+
+ private void logSummary(String tag, String summary, ArrayList<Long> durations) {
+ final StringBuilder sb = new StringBuilder(summary);
+ final int size = durations.size();
+ for (int i = 0; i < size; ++i) {
+ sb.append("\n").append(i).append("->").append(durations.get(i));
+ }
+ Log.d(tag, sb.toString());
+ }
+
+ private String getSummaryString(String testName, Bundle stats) {
+ final StringBuilder sb = new StringBuilder();
+ sb.append("\n\n").append(getKey(testName));
+ for (String key : stats.keySet()) {
+ sb.append("\n").append(key).append(": ").append(stats.get(key));
+ }
+ return sb.toString();
+ }
+
+ private String getKey(String testName) {
+ return testName.replaceAll("Perf$", "");
+ }
+}
diff --git a/apct-tests/perftests/multiuser/src/android/multiuser/BenchmarkRunner.java b/apct-tests/perftests/multiuser/src/android/multiuser/BenchmarkRunner.java
new file mode 100644
index 0000000..c7bebf3
--- /dev/null
+++ b/apct-tests/perftests/multiuser/src/android/multiuser/BenchmarkRunner.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2017 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.multiuser;
+
+import android.os.Bundle;
+import android.os.SystemClock;
+
+import java.util.ArrayList;
+
+// Based on //platform/frameworks/base/apct-tests/perftests/utils/BenchmarkState.java
+public class BenchmarkRunner {
+
+ private static long COOL_OFF_PERIOD_MS = 2000;
+
+ private static final int NUM_ITERATIONS = 4;
+
+ private static final int NOT_STARTED = 0; // The benchmark has not started yet.
+ private static final int RUNNING = 1; // The benchmark is running.
+ private static final int PAUSED = 2; // The benchmark is paused
+ private static final int FINISHED = 3; // The benchmark has stopped.
+
+ private final BenchmarkResults mResults = new BenchmarkResults();
+ private int mState = NOT_STARTED; // Current benchmark state.
+ private int mIteration;
+
+ public long mStartTimeNs;
+ public long mPausedDurationNs;
+ public long mPausedTimeNs;
+
+ public boolean keepRunning() {
+ switch (mState) {
+ case NOT_STARTED:
+ mState = RUNNING;
+ prepareForNextRun();
+ return true;
+ case RUNNING:
+ mIteration++;
+ return startNextTestRun();
+ case PAUSED:
+ throw new IllegalStateException("Benchmarking is in paused state");
+ case FINISHED:
+ throw new IllegalStateException("Benchmarking is finished");
+ default:
+ throw new IllegalStateException("BenchmarkRunner is in unknown state");
+ }
+ }
+
+ private boolean startNextTestRun() {
+ mResults.addDuration(System.nanoTime() - mStartTimeNs - mPausedDurationNs);
+ if (mIteration == NUM_ITERATIONS) {
+ mState = FINISHED;
+ return false;
+ } else {
+ prepareForNextRun();
+ return true;
+ }
+ }
+
+ private void prepareForNextRun() {
+ // TODO: Once http://b/63115387 is fixed, look into using "am wait-for-broadcast-idle"
+ // command instead of waiting for a fixed amount of time.
+ SystemClock.sleep(COOL_OFF_PERIOD_MS);
+ mStartTimeNs = System.nanoTime();
+ mPausedDurationNs = 0;
+ }
+
+ public void pauseTiming() {
+ if (mState != RUNNING) {
+ throw new IllegalStateException("Unable to pause the runner: not running currently");
+ }
+ mPausedTimeNs = System.nanoTime();
+ mState = PAUSED;
+ }
+
+ public void resumeTiming() {
+ if (mState != PAUSED) {
+ throw new IllegalStateException("Unable to resume the runner: already running");
+ }
+ mPausedDurationNs += System.nanoTime() - mPausedTimeNs;
+ mState = RUNNING;
+ }
+
+ public Bundle getStatsToReport() {
+ return mResults.getStatsToReport();
+ }
+
+ public Bundle getStatsToLog() {
+ return mResults.getStatsToLog();
+ }
+
+ public ArrayList<Long> getAllDurations() {
+ return mResults.getAllDurations();
+ }
+}
\ No newline at end of file
diff --git a/apct-tests/perftests/multiuser/src/android/multiuser/UserLifecycleTest.java b/apct-tests/perftests/multiuser/src/android/multiuser/UserLifecycleTest.java
deleted file mode 100644
index e89157b..0000000
--- a/apct-tests/perftests/multiuser/src/android/multiuser/UserLifecycleTest.java
+++ /dev/null
@@ -1,308 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.multiuser;
-
-import android.app.ActivityManager;
-import android.app.IActivityManager;
-import android.app.IStopUserCallback;
-import android.app.UserSwitchObserver;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.UserInfo;
-import android.os.RemoteException;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.perftests.utils.BenchmarkState;
-import android.perftests.utils.PerfStatusReporter;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.ArrayList;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Perf tests for user life cycle events.
- *
- * Running the tests:
- * make MultiUserPerfTests &&
- * adb install -r \
- * ${ANDROID_PRODUCT_OUT}/data/app/MultiUserPerfTests/MultiUserPerfTests.apk &&
- * adb shell am instrument -e class android.multiuser.UserLifecycleTest \
- * -w com.android.perftests.multiuser/android.support.test.runner.AndroidJUnitRunner
- */
-@LargeTest
-@RunWith(AndroidJUnit4.class)
-public class UserLifecycleTest {
- private final int TIMEOUT_IN_SECOND = 10;
- private final int CHECK_USER_REMOVED_INTERVAL_MS = 200;
-
- private UserManager mUm;
- private ActivityManager mAm;
- private IActivityManager mIam;
- private BenchmarkState mState;
- private ArrayList<Integer> mUsersToRemove;
-
- @Rule
- public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();
-
- @Before
- public void setUp() {
- final Context context = InstrumentationRegistry.getContext();
- mUm = UserManager.get(context);
- mAm = context.getSystemService(ActivityManager.class);
- mIam = ActivityManager.getService();
- mState = mPerfStatusReporter.getBenchmarkState();
- mUsersToRemove = new ArrayList<>();
- }
-
- @After
- public void tearDown() {
- for (int userId : mUsersToRemove) {
- try {
- mUm.removeUser(userId);
- } catch (Exception e) {
- // Ignore
- }
- }
- }
-
- @Test
- public void createAndStartUserPerf() throws Exception {
- while (mState.keepRunning()) {
- final UserInfo userInfo = mUm.createUser("TestUser", 0);
-
- final CountDownLatch latch = new CountDownLatch(1);
- registerBroadcastReceiver(Intent.ACTION_USER_STARTED, latch, userInfo.id);
- mIam.startUserInBackground(userInfo.id);
- latch.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS);
-
- mState.pauseTiming();
- removeUser(userInfo.id);
- mState.resumeTiming();
- }
- }
-
- @Test
- public void switchUserPerf() throws Exception {
- while (mState.keepRunning()) {
- mState.pauseTiming();
- final int startUser = mAm.getCurrentUser();
- final UserInfo userInfo = mUm.createUser("TestUser", 0);
- mState.resumeTiming();
-
- switchUser(userInfo.id);
-
- mState.pauseTiming();
- switchUser(startUser);
- removeUser(userInfo.id);
- mState.resumeTiming();
- }
- }
-
- @Test
- public void stopUserPerf() throws Exception {
- while (mState.keepRunning()) {
- mState.pauseTiming();
- final UserInfo userInfo = mUm.createUser("TestUser", 0);
- final CountDownLatch latch = new CountDownLatch(1);
- registerBroadcastReceiver(Intent.ACTION_USER_STARTED, latch, userInfo.id);
- mIam.startUserInBackground(userInfo.id);
- latch.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS);
- mState.resumeTiming();
-
- stopUser(userInfo.id, false);
-
- mState.pauseTiming();
- removeUser(userInfo.id);
- mState.resumeTiming();
- }
- }
-
- @Test
- public void lockedBootCompletedPerf() throws Exception {
- while (mState.keepRunning()) {
- mState.pauseTiming();
- final int startUser = mAm.getCurrentUser();
- final UserInfo userInfo = mUm.createUser("TestUser", 0);
- final CountDownLatch latch = new CountDownLatch(1);
- registerUserSwitchObserver(null, latch, userInfo.id);
- mState.resumeTiming();
-
- mAm.switchUser(userInfo.id);
- latch.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS);
-
- mState.pauseTiming();
- switchUser(startUser);
- removeUser(userInfo.id);
- mState.resumeTiming();
- }
- }
-
- @Test
- public void managedProfileUnlockPerf() throws Exception {
- while (mState.keepRunning()) {
- mState.pauseTiming();
- final UserInfo userInfo = mUm.createProfileForUser("TestUser",
- UserInfo.FLAG_MANAGED_PROFILE, mAm.getCurrentUser());
- final CountDownLatch latch = new CountDownLatch(1);
- registerBroadcastReceiver(Intent.ACTION_USER_UNLOCKED, latch, userInfo.id);
- mState.resumeTiming();
-
- mIam.startUserInBackground(userInfo.id);
- latch.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS);
-
- mState.pauseTiming();
- removeUser(userInfo.id);
- mState.resumeTiming();
- }
- }
-
- @Test
- public void ephemeralUserStoppedPerf() throws Exception {
- while (mState.keepRunning()) {
- mState.pauseTiming();
- final int startUser = mAm.getCurrentUser();
- final UserInfo userInfo = mUm.createUser("TestUser",
- UserInfo.FLAG_EPHEMERAL | UserInfo.FLAG_DEMO);
- switchUser(userInfo.id);
- final CountDownLatch latch = new CountDownLatch(1);
- InstrumentationRegistry.getContext().registerReceiver(new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (Intent.ACTION_USER_STOPPED.equals(intent.getAction()) && intent.getIntExtra(
- Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL) == userInfo.id) {
- latch.countDown();
- }
- }
- }, new IntentFilter(Intent.ACTION_USER_STOPPED));
- final CountDownLatch switchLatch = new CountDownLatch(1);
- registerUserSwitchObserver(switchLatch, null, startUser);
- mState.resumeTiming();
-
- mAm.switchUser(startUser);
- latch.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS);
-
- mState.pauseTiming();
- switchLatch.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS);
- removeUser(userInfo.id);
- mState.resumeTiming();
- }
- }
-
- @Test
- public void managedProfileStoppedPerf() throws Exception {
- while (mState.keepRunning()) {
- mState.pauseTiming();
- final UserInfo userInfo = mUm.createProfileForUser("TestUser",
- UserInfo.FLAG_MANAGED_PROFILE, mAm.getCurrentUser());
- final CountDownLatch latch = new CountDownLatch(1);
- registerBroadcastReceiver(Intent.ACTION_USER_UNLOCKED, latch, userInfo.id);
- mIam.startUserInBackground(userInfo.id);
- latch.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS);
- mState.resumeTiming();
-
- stopUser(userInfo.id, true);
-
- mState.pauseTiming();
- removeUser(userInfo.id);
- mState.resumeTiming();
- }
- }
-
- private void switchUser(int userId) throws Exception {
- final CountDownLatch latch = new CountDownLatch(1);
- registerUserSwitchObserver(latch, null, userId);
- mAm.switchUser(userId);
- latch.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS);
- }
-
- private void stopUser(int userId, boolean force) throws Exception {
- final CountDownLatch latch = new CountDownLatch(1);
- mIam.stopUser(userId, force /* force */, new IStopUserCallback.Stub() {
- @Override
- public void userStopped(int userId) throws RemoteException {
- latch.countDown();
- }
-
- @Override
- public void userStopAborted(int userId) throws RemoteException {
- }
- });
- latch.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS);
- }
-
- private void registerUserSwitchObserver(final CountDownLatch switchLatch,
- final CountDownLatch bootCompleteLatch, final int userId) throws Exception {
- ActivityManager.getService().registerUserSwitchObserver(
- new UserSwitchObserver() {
- @Override
- public void onUserSwitchComplete(int newUserId) throws RemoteException {
- if (switchLatch != null && userId == newUserId) {
- switchLatch.countDown();
- }
- }
-
- @Override
- public void onLockedBootComplete(int newUserId) {
- if (bootCompleteLatch != null && userId == newUserId) {
- bootCompleteLatch.countDown();
- }
- }
- }, "UserLifecycleTest");
- }
-
- private void registerBroadcastReceiver(final String action, final CountDownLatch latch,
- final int userId) {
- InstrumentationRegistry.getContext().registerReceiverAsUser(new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (action.equals(intent.getAction()) && intent.getIntExtra(
- Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL) == userId) {
- latch.countDown();
- }
- }
- }, UserHandle.of(userId), new IntentFilter(action), null, null);
- }
-
- private void removeUser(int userId) {
- try {
- mUm.removeUser(userId);
- final long startTime = System.currentTimeMillis();
- final long timeoutInMs = TIMEOUT_IN_SECOND * 1000;
- while (mUm.getUserInfo(userId) != null &&
- System.currentTimeMillis() - startTime < timeoutInMs) {
- TimeUnit.MILLISECONDS.sleep(CHECK_USER_REMOVED_INTERVAL_MS);
- }
- } catch (InterruptedException e) {
- Thread.currentThread().interrupt();
- } catch (Exception e) {
- // Ignore
- }
- if (mUm.getUserInfo(userId) != null) {
- mUsersToRemove.add(userId);
- }
- }
-}
diff --git a/apct-tests/perftests/multiuser/src/android/multiuser/UserLifecycleTests.java b/apct-tests/perftests/multiuser/src/android/multiuser/UserLifecycleTests.java
new file mode 100644
index 0000000..855be08
--- /dev/null
+++ b/apct-tests/perftests/multiuser/src/android/multiuser/UserLifecycleTests.java
@@ -0,0 +1,315 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.multiuser;
+
+import android.app.ActivityManager;
+import android.app.IActivityManager;
+import android.app.IStopUserCallback;
+import android.app.UserSwitchObserver;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.UserInfo;
+import android.os.RemoteException;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.LargeTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.ArrayList;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Perf tests for user life cycle events.
+ *
+ * Running the tests:
+ *
+ * make MultiUserPerfTests &&
+ * adb install -r \
+ * ${ANDROID_PRODUCT_OUT}/data/app/MultiUserPerfTests/MultiUserPerfTests.apk &&
+ * adb shell am instrument -e class android.multiuser.UserLifecycleTests \
+ * -w com.android.perftests.multiuser/android.support.test.runner.AndroidJUnitRunner
+ *
+ * or
+ *
+ * bit MultiUserPerfTests:android.multiuser.UserLifecycleTests
+ *
+ * Note: If you use bit for running the tests, benchmark results won't be printed on the host side.
+ * But in either case, results can be checked on the device side 'adb logcat -s UserLifecycleTests'
+ */
+@LargeTest
+@RunWith(AndroidJUnit4.class)
+public class UserLifecycleTests {
+ private static final String TAG = UserLifecycleTests.class.getSimpleName();
+
+ private final int TIMEOUT_IN_SECOND = 30;
+ private final int CHECK_USER_REMOVED_INTERVAL_MS = 200;
+
+ private UserManager mUm;
+ private ActivityManager mAm;
+ private IActivityManager mIam;
+ private ArrayList<Integer> mUsersToRemove;
+
+ private final BenchmarkRunner mRunner = new BenchmarkRunner();
+ @Rule
+ public BenchmarkResultsReporter mReporter = new BenchmarkResultsReporter(mRunner);
+
+ @Before
+ public void setUp() {
+ final Context context = InstrumentationRegistry.getContext();
+ mUm = UserManager.get(context);
+ mAm = context.getSystemService(ActivityManager.class);
+ mIam = ActivityManager.getService();
+ mUsersToRemove = new ArrayList<>();
+ }
+
+ @After
+ public void tearDown() {
+ for (int userId : mUsersToRemove) {
+ try {
+ mUm.removeUser(userId);
+ } catch (Exception e) {
+ // Ignore
+ }
+ }
+ }
+
+ @Test
+ public void createAndStartUser() throws Exception {
+ while (mRunner.keepRunning()) {
+ final UserInfo userInfo = mUm.createUser("TestUser", 0);
+
+ final CountDownLatch latch = new CountDownLatch(1);
+ registerBroadcastReceiver(Intent.ACTION_USER_STARTED, latch, userInfo.id);
+ mIam.startUserInBackground(userInfo.id);
+ latch.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS);
+
+ mRunner.pauseTiming();
+ removeUser(userInfo.id);
+ mRunner.resumeTiming();
+ }
+ }
+
+ @Test
+ public void switchUser() throws Exception {
+ while (mRunner.keepRunning()) {
+ mRunner.pauseTiming();
+ final int startUser = mAm.getCurrentUser();
+ final UserInfo userInfo = mUm.createUser("TestUser", 0);
+ mRunner.resumeTiming();
+
+ switchUser(userInfo.id);
+
+ mRunner.pauseTiming();
+ switchUser(startUser);
+ removeUser(userInfo.id);
+ mRunner.resumeTiming();
+ }
+ }
+
+ @Test
+ public void stopUser() throws Exception {
+ while (mRunner.keepRunning()) {
+ mRunner.pauseTiming();
+ final UserInfo userInfo = mUm.createUser("TestUser", 0);
+ final CountDownLatch latch = new CountDownLatch(1);
+ registerBroadcastReceiver(Intent.ACTION_USER_STARTED, latch, userInfo.id);
+ mIam.startUserInBackground(userInfo.id);
+ latch.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS);
+ mRunner.resumeTiming();
+
+ stopUser(userInfo.id, false);
+
+ mRunner.pauseTiming();
+ removeUser(userInfo.id);
+ mRunner.resumeTiming();
+ }
+ }
+
+ @Test
+ public void lockedBootCompleted() throws Exception {
+ while (mRunner.keepRunning()) {
+ mRunner.pauseTiming();
+ final int startUser = mAm.getCurrentUser();
+ final UserInfo userInfo = mUm.createUser("TestUser", 0);
+ final CountDownLatch latch = new CountDownLatch(1);
+ registerUserSwitchObserver(null, latch, userInfo.id);
+ mRunner.resumeTiming();
+
+ mAm.switchUser(userInfo.id);
+ latch.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS);
+
+ mRunner.pauseTiming();
+ switchUser(startUser);
+ removeUser(userInfo.id);
+ mRunner.resumeTiming();
+ }
+ }
+
+ @Test
+ public void managedProfileUnlock() throws Exception {
+ while (mRunner.keepRunning()) {
+ mRunner.pauseTiming();
+ final UserInfo userInfo = mUm.createProfileForUser("TestUser",
+ UserInfo.FLAG_MANAGED_PROFILE, mAm.getCurrentUser());
+ final CountDownLatch latch = new CountDownLatch(1);
+ registerBroadcastReceiver(Intent.ACTION_USER_UNLOCKED, latch, userInfo.id);
+ mRunner.resumeTiming();
+
+ mIam.startUserInBackground(userInfo.id);
+ latch.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS);
+
+ mRunner.pauseTiming();
+ removeUser(userInfo.id);
+ mRunner.resumeTiming();
+ }
+ }
+
+ @Test
+ public void ephemeralUserStopped() throws Exception {
+ while (mRunner.keepRunning()) {
+ mRunner.pauseTiming();
+ final int startUser = mAm.getCurrentUser();
+ final UserInfo userInfo = mUm.createUser("TestUser",
+ UserInfo.FLAG_EPHEMERAL | UserInfo.FLAG_DEMO);
+ switchUser(userInfo.id);
+ final CountDownLatch latch = new CountDownLatch(1);
+ InstrumentationRegistry.getContext().registerReceiver(new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (Intent.ACTION_USER_STOPPED.equals(intent.getAction()) && intent.getIntExtra(
+ Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL) == userInfo.id) {
+ latch.countDown();
+ }
+ }
+ }, new IntentFilter(Intent.ACTION_USER_STOPPED));
+ final CountDownLatch switchLatch = new CountDownLatch(1);
+ registerUserSwitchObserver(switchLatch, null, startUser);
+ mRunner.resumeTiming();
+
+ mAm.switchUser(startUser);
+ latch.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS);
+
+ mRunner.pauseTiming();
+ switchLatch.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS);
+ removeUser(userInfo.id);
+ mRunner.resumeTiming();
+ }
+ }
+
+ @Test
+ public void managedProfileStopped() throws Exception {
+ while (mRunner.keepRunning()) {
+ mRunner.pauseTiming();
+ final UserInfo userInfo = mUm.createProfileForUser("TestUser",
+ UserInfo.FLAG_MANAGED_PROFILE, mAm.getCurrentUser());
+ final CountDownLatch latch = new CountDownLatch(1);
+ registerBroadcastReceiver(Intent.ACTION_USER_UNLOCKED, latch, userInfo.id);
+ mIam.startUserInBackground(userInfo.id);
+ latch.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS);
+ mRunner.resumeTiming();
+
+ stopUser(userInfo.id, true);
+
+ mRunner.pauseTiming();
+ removeUser(userInfo.id);
+ mRunner.resumeTiming();
+ }
+ }
+
+ private void switchUser(int userId) throws Exception {
+ final CountDownLatch latch = new CountDownLatch(1);
+ registerUserSwitchObserver(latch, null, userId);
+ mAm.switchUser(userId);
+ latch.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS);
+ }
+
+ private void stopUser(int userId, boolean force) throws Exception {
+ final CountDownLatch latch = new CountDownLatch(1);
+ mIam.stopUser(userId, force /* force */, new IStopUserCallback.Stub() {
+ @Override
+ public void userStopped(int userId) throws RemoteException {
+ latch.countDown();
+ }
+
+ @Override
+ public void userStopAborted(int userId) throws RemoteException {
+ }
+ });
+ latch.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS);
+ }
+
+ private void registerUserSwitchObserver(final CountDownLatch switchLatch,
+ final CountDownLatch bootCompleteLatch, final int userId) throws Exception {
+ ActivityManager.getService().registerUserSwitchObserver(
+ new UserSwitchObserver() {
+ @Override
+ public void onUserSwitchComplete(int newUserId) throws RemoteException {
+ if (switchLatch != null && userId == newUserId) {
+ switchLatch.countDown();
+ }
+ }
+
+ @Override
+ public void onLockedBootComplete(int newUserId) {
+ if (bootCompleteLatch != null && userId == newUserId) {
+ bootCompleteLatch.countDown();
+ }
+ }
+ }, TAG);
+ }
+
+ private void registerBroadcastReceiver(final String action, final CountDownLatch latch,
+ final int userId) {
+ InstrumentationRegistry.getContext().registerReceiverAsUser(new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (action.equals(intent.getAction()) && intent.getIntExtra(
+ Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL) == userId) {
+ latch.countDown();
+ }
+ }
+ }, UserHandle.of(userId), new IntentFilter(action), null, null);
+ }
+
+ private void removeUser(int userId) {
+ try {
+ mUm.removeUser(userId);
+ final long startTime = System.currentTimeMillis();
+ final long timeoutInMs = TIMEOUT_IN_SECOND * 1000;
+ while (mUm.getUserInfo(userId) != null &&
+ System.currentTimeMillis() - startTime < timeoutInMs) {
+ TimeUnit.MILLISECONDS.sleep(CHECK_USER_REMOVED_INTERVAL_MS);
+ }
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ } catch (Exception e) {
+ // Ignore
+ }
+ if (mUm.getUserInfo(userId) != null) {
+ mUsersToRemove.add(userId);
+ }
+ }
+}
diff --git a/api/current.txt b/api/current.txt
index 67280d0..b4c6089 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -121,6 +121,7 @@
field public static final java.lang.String REQUEST_IGNORE_BATTERY_OPTIMIZATIONS = "android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS";
field public static final java.lang.String REQUEST_INSTALL_PACKAGES = "android.permission.REQUEST_INSTALL_PACKAGES";
field public static final deprecated java.lang.String RESTART_PACKAGES = "android.permission.RESTART_PACKAGES";
+ field public static final java.lang.String SEND_EMBMS_INTENTS = "android.permission.SEND_EMBMS_INTENTS";
field public static final java.lang.String SEND_RESPOND_VIA_MESSAGE = "android.permission.SEND_RESPOND_VIA_MESSAGE";
field public static final java.lang.String SEND_SMS = "android.permission.SEND_SMS";
field public static final java.lang.String SET_ALARM = "com.android.alarm.permission.SET_ALARM";
@@ -388,6 +389,7 @@
field public static final int childIndicatorRight = 16843024; // 0x1010110
field public static final int childIndicatorStart = 16843731; // 0x10103d3
field public static final int choiceMode = 16843051; // 0x101012b
+ field public static final int classLoader = 16844139; // 0x101056b
field public static final int clearTaskOnLaunch = 16842773; // 0x1010015
field public static final int clickable = 16842981; // 0x10100e5
field public static final int clipChildren = 16842986; // 0x10100ea
@@ -1180,6 +1182,7 @@
field public static final int showSilent = 16843259; // 0x10101fb
field public static final int showText = 16843949; // 0x10104ad
field public static final deprecated int showWeekNumber = 16843582; // 0x101033e
+ field public static final int showWhenLocked = 16844137; // 0x1010569
field public static final deprecated int shownWeekCount = 16843585; // 0x1010341
field public static final int shrinkColumns = 16843082; // 0x101014a
field public static final deprecated int singleLine = 16843101; // 0x101015d
@@ -1438,6 +1441,7 @@
field public static final int trimPathOffset = 16843786; // 0x101040a
field public static final int trimPathStart = 16843784; // 0x1010408
field public static final int tunerCount = 16844061; // 0x101051d
+ field public static final int turnScreenOn = 16844138; // 0x101056a
field public static final int type = 16843169; // 0x10101a1
field public static final int typeface = 16842902; // 0x1010096
field public static final int uiOptions = 16843672; // 0x1010398
@@ -1935,6 +1939,7 @@
field public static final int VideoView_error_text_invalid_progressive_playback = 17039381; // 0x1040015
field public static final int VideoView_error_text_unknown = 17039377; // 0x1040011
field public static final int VideoView_error_title = 17039378; // 0x1040012
+ field public static final int autofill = 17039386; // 0x104001a
field public static final int cancel = 17039360; // 0x1040000
field public static final int copy = 17039361; // 0x1040001
field public static final int copyUrl = 17039362; // 0x1040002
@@ -3162,6 +3167,7 @@
public final class AnimatorSet extends android.animation.Animator {
ctor public AnimatorSet();
+ method public android.animation.AnimatorSet clone();
method public java.util.ArrayList<android.animation.Animator> getChildAnimations();
method public long getCurrentPlayTime();
method public long getDuration();
@@ -3280,6 +3286,7 @@
public final class ObjectAnimator extends android.animation.ValueAnimator {
ctor public ObjectAnimator();
+ method public android.animation.ObjectAnimator clone();
method public java.lang.String getPropertyName();
method public java.lang.Object getTarget();
method public static android.animation.ObjectAnimator ofArgb(java.lang.Object, java.lang.String, int...);
@@ -3305,6 +3312,7 @@
method public static <T, V> android.animation.ObjectAnimator ofObject(T, android.util.Property<T, V>, android.animation.TypeConverter<android.graphics.PointF, V>, android.graphics.Path);
method public static android.animation.ObjectAnimator ofPropertyValuesHolder(java.lang.Object, android.animation.PropertyValuesHolder...);
method public void setAutoCancel(boolean);
+ method public android.animation.ObjectAnimator setDuration(long);
method public void setProperty(android.util.Property);
method public void setPropertyName(java.lang.String);
}
@@ -3386,6 +3394,7 @@
ctor public ValueAnimator();
method public void addUpdateListener(android.animation.ValueAnimator.AnimatorUpdateListener);
method public static boolean areAnimatorsEnabled();
+ method public android.animation.ValueAnimator clone();
method public float getAnimatedFraction();
method public java.lang.Object getAnimatedValue();
method public java.lang.Object getAnimatedValue(java.lang.String);
@@ -3759,10 +3768,12 @@
method public final void setResult(int);
method public final void setResult(int, android.content.Intent);
method public final deprecated void setSecondaryProgress(int);
+ method public void setShowWhenLocked(boolean);
method public void setTaskDescription(android.app.ActivityManager.TaskDescription);
method public void setTitle(java.lang.CharSequence);
method public void setTitle(int);
method public deprecated void setTitleColor(int);
+ method public void setTurnScreenOn(boolean);
method public void setVisible(boolean);
method public final void setVolumeControlStream(int);
method public void setVrModeEnabled(boolean, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
@@ -4204,6 +4215,12 @@
public class Application extends android.content.ContextWrapper implements android.content.ComponentCallbacks2 {
ctor public Application();
+ method public android.app.Activity instantiateActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent);
+ method public android.app.backup.BackupAgent instantiateBackupAgent(java.lang.ClassLoader, java.lang.String);
+ method public android.app.Instrumentation instantiateInstrumentation(java.lang.ClassLoader, java.lang.String);
+ method public android.content.ContentProvider instantiateProvider(java.lang.ClassLoader, java.lang.String);
+ method public android.content.BroadcastReceiver instantiateReceiver(java.lang.ClassLoader, java.lang.String, android.content.Intent);
+ method public android.app.Service instantiateService(java.lang.ClassLoader, java.lang.String, android.content.Intent);
method public void onConfigurationChanged(android.content.res.Configuration);
method public void onCreate();
method public void onLowMemory();
@@ -4959,6 +4976,7 @@
ctor public IntentService(java.lang.String);
method public android.os.IBinder onBind(android.content.Intent);
method protected abstract void onHandleIntent(android.content.Intent);
+ method public void onStart(android.content.Intent, int);
method public void setIntentRedelivery(boolean);
}
@@ -5592,6 +5610,7 @@
method public java.util.List<android.app.NotificationChannelGroup> getNotificationChannelGroups();
method public java.util.List<android.app.NotificationChannel> getNotificationChannels();
method public android.app.NotificationManager.Policy getNotificationPolicy();
+ method public boolean isNotificationListenerAccessGranted(android.content.ComponentName);
method public boolean isNotificationPolicyAccessGranted();
method public void notify(int, android.app.Notification);
method public void notify(java.lang.String, int, android.app.Notification);
@@ -10714,6 +10733,7 @@
field public static final java.lang.String FEATURE_NFC_HOST_CARD_EMULATION = "android.hardware.nfc.hce";
field public static final java.lang.String FEATURE_NFC_HOST_CARD_EMULATION_NFCF = "android.hardware.nfc.hcef";
field public static final java.lang.String FEATURE_OPENGLES_EXTENSION_PACK = "android.hardware.opengles.aep";
+ field public static final java.lang.String FEATURE_PC = "android.hardware.type.pc";
field public static final java.lang.String FEATURE_PICTURE_IN_PICTURE = "android.software.picture_in_picture";
field public static final java.lang.String FEATURE_PRINTING = "android.software.print";
field public static final java.lang.String FEATURE_SCREEN_LANDSCAPE = "android.hardware.screen.landscape";
@@ -10755,6 +10775,7 @@
field public static final java.lang.String FEATURE_WIFI = "android.hardware.wifi";
field public static final java.lang.String FEATURE_WIFI_AWARE = "android.hardware.wifi.aware";
field public static final java.lang.String FEATURE_WIFI_DIRECT = "android.hardware.wifi.direct";
+ field public static final java.lang.String FEATURE_WIFI_PASSPOINT = "android.hardware.wifi.passpoint";
field public static final int GET_ACTIVITIES = 1; // 0x1
field public static final int GET_CONFIGURATIONS = 16384; // 0x4000
field public static final deprecated int GET_DISABLED_COMPONENTS = 512; // 0x200
@@ -11061,6 +11082,7 @@
public static class AssetFileDescriptor.AutoCloseInputStream extends android.os.ParcelFileDescriptor.AutoCloseInputStream {
ctor public AssetFileDescriptor.AutoCloseInputStream(android.content.res.AssetFileDescriptor) throws java.io.IOException;
+ method public void mark(int);
}
public static class AssetFileDescriptor.AutoCloseOutputStream extends android.os.ParcelFileDescriptor.AutoCloseOutputStream {
@@ -11368,6 +11390,7 @@
method public void copyStringToBuffer(int, android.database.CharArrayBuffer);
method public void deactivate();
method public void fillWindow(int, android.database.CursorWindow);
+ method protected void finalize();
method public byte[] getBlob(int);
method public int getColumnCount();
method public int getColumnIndex(java.lang.String);
@@ -11849,6 +11872,7 @@
method public void beginTransactionWithListenerNonExclusive(android.database.sqlite.SQLiteTransactionListener);
method public android.database.sqlite.SQLiteStatement compileStatement(java.lang.String) throws android.database.SQLException;
method public static android.database.sqlite.SQLiteDatabase create(android.database.sqlite.SQLiteDatabase.CursorFactory);
+ method public static android.database.sqlite.SQLiteDatabase createInMemory(android.database.sqlite.SQLiteDatabase.OpenParams);
method public int delete(java.lang.String, java.lang.String, java.lang.String[]);
method public static boolean deleteDatabase(java.io.File);
method public void disableWriteAheadLogging();
@@ -11878,6 +11902,7 @@
method public boolean needUpgrade(int);
method protected void onAllReferencesReleased();
method public static android.database.sqlite.SQLiteDatabase openDatabase(java.lang.String, android.database.sqlite.SQLiteDatabase.CursorFactory, int);
+ method public static android.database.sqlite.SQLiteDatabase openDatabase(java.lang.String, android.database.sqlite.SQLiteDatabase.OpenParams);
method public static android.database.sqlite.SQLiteDatabase openDatabase(java.lang.String, android.database.sqlite.SQLiteDatabase.CursorFactory, int, android.database.DatabaseErrorHandler);
method public static android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.io.File, android.database.sqlite.SQLiteDatabase.CursorFactory);
method public static android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, android.database.sqlite.SQLiteDatabase.CursorFactory);
@@ -11928,6 +11953,26 @@
method public abstract android.database.Cursor newCursor(android.database.sqlite.SQLiteDatabase, android.database.sqlite.SQLiteCursorDriver, java.lang.String, android.database.sqlite.SQLiteQuery);
}
+ public static final class SQLiteDatabase.OpenParams {
+ method public android.database.sqlite.SQLiteDatabase.CursorFactory getCursorFactory();
+ method public android.database.DatabaseErrorHandler getErrorHandler();
+ method public int getLookasideSlotCount();
+ method public int getLookasideSlotSize();
+ method public int getOpenFlags();
+ }
+
+ public static final class SQLiteDatabase.OpenParams.Builder {
+ ctor public SQLiteDatabase.OpenParams.Builder();
+ ctor public SQLiteDatabase.OpenParams.Builder(android.database.sqlite.SQLiteDatabase.OpenParams);
+ method public android.database.sqlite.SQLiteDatabase.OpenParams.Builder addOpenFlags(int);
+ method public android.database.sqlite.SQLiteDatabase.OpenParams build();
+ method public android.database.sqlite.SQLiteDatabase.OpenParams.Builder removeOpenFlags(int);
+ method public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setCursorFactory(android.database.sqlite.SQLiteDatabase.CursorFactory);
+ method public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setErrorHandler(android.database.DatabaseErrorHandler);
+ method public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setLookasideConfig(int, int);
+ method public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setOpenFlags(int);
+ }
+
public class SQLiteDatabaseCorruptException extends android.database.sqlite.SQLiteException {
ctor public SQLiteDatabaseCorruptException();
ctor public SQLiteDatabaseCorruptException(java.lang.String);
@@ -11981,6 +12026,7 @@
method public void onDowngrade(android.database.sqlite.SQLiteDatabase, int, int);
method public void onOpen(android.database.sqlite.SQLiteDatabase);
method public abstract void onUpgrade(android.database.sqlite.SQLiteDatabase, int, int);
+ method public void setLookasideConfig(int, int);
method public void setWriteAheadLoggingEnabled(boolean);
}
@@ -13842,6 +13888,7 @@
method public void scheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable, long);
method public void setAlpha(int);
method public void setColorFilter(android.graphics.ColorFilter);
+ method public void setDither(boolean);
method public void setOpacity(int);
method public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);
}
@@ -13922,6 +13969,7 @@
method public void setAlpha(int);
method public void setAntiAlias(boolean);
method public void setColorFilter(android.graphics.ColorFilter);
+ method public void setDither(boolean);
method public void setGravity(int);
method public void setMipMap(boolean);
method public void setTargetDensity(android.graphics.Canvas);
@@ -14047,6 +14095,7 @@
method public void setAlpha(int);
method public void setColorFilter(android.graphics.ColorFilter);
method protected void setConstantState(android.graphics.drawable.DrawableContainer.DrawableContainerState);
+ method public void setDither(boolean);
method public void setEnterFadeDuration(int);
method public void setExitFadeDuration(int);
method public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);
@@ -14113,6 +14162,7 @@
method public void setColors(int[]);
method public void setCornerRadii(float[]);
method public void setCornerRadius(float);
+ method public void setDither(boolean);
method public void setGradientCenter(float, float);
method public void setGradientRadius(float);
method public void setGradientType(int);
@@ -14207,6 +14257,7 @@
method public void scheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable, long);
method public void setAlpha(int);
method public void setColorFilter(android.graphics.ColorFilter);
+ method public void setDither(boolean);
method public void setDrawable(int, android.graphics.drawable.Drawable);
method public boolean setDrawableByLayerId(int, android.graphics.drawable.Drawable);
method public void setId(int, int);
@@ -14247,6 +14298,7 @@
method public android.graphics.Paint getPaint();
method public void setAlpha(int);
method public void setColorFilter(android.graphics.ColorFilter);
+ method public void setDither(boolean);
method public void setTargetDensity(android.graphics.Canvas);
method public void setTargetDensity(android.util.DisplayMetrics);
method public void setTargetDensity(int);
@@ -14309,6 +14361,7 @@
method protected void onDraw(android.graphics.drawable.shapes.Shape, android.graphics.Canvas, android.graphics.Paint);
method public void setAlpha(int);
method public void setColorFilter(android.graphics.ColorFilter);
+ method public void setDither(boolean);
method public void setIntrinsicHeight(int);
method public void setIntrinsicWidth(int);
method public void setPadding(int, int, int, int);
@@ -14350,27 +14403,32 @@
public class ArcShape extends android.graphics.drawable.shapes.RectShape {
ctor public ArcShape(float, float);
+ method public android.graphics.drawable.shapes.ArcShape clone() throws java.lang.CloneNotSupportedException;
method public final float getStartAngle();
method public final float getSweepAngle();
}
public class OvalShape extends android.graphics.drawable.shapes.RectShape {
ctor public OvalShape();
+ method public android.graphics.drawable.shapes.OvalShape clone() throws java.lang.CloneNotSupportedException;
}
public class PathShape extends android.graphics.drawable.shapes.Shape {
ctor public PathShape(android.graphics.Path, float, float);
+ method public android.graphics.drawable.shapes.PathShape clone() throws java.lang.CloneNotSupportedException;
method public void draw(android.graphics.Canvas, android.graphics.Paint);
}
public class RectShape extends android.graphics.drawable.shapes.Shape {
ctor public RectShape();
+ method public android.graphics.drawable.shapes.RectShape clone() throws java.lang.CloneNotSupportedException;
method public void draw(android.graphics.Canvas, android.graphics.Paint);
method protected final android.graphics.RectF rect();
}
public class RoundRectShape extends android.graphics.drawable.shapes.RectShape {
ctor public RoundRectShape(float[], android.graphics.RectF, float[]);
+ method public android.graphics.drawable.shapes.RoundRectShape clone() throws java.lang.CloneNotSupportedException;
}
public abstract class Shape implements java.lang.Cloneable {
@@ -14455,6 +14513,7 @@
method public final void autoFocus(android.hardware.Camera.AutoFocusCallback);
method public final void cancelAutoFocus();
method public final boolean enableShutterSound(boolean);
+ method protected void finalize();
method public static void getCameraInfo(int, android.hardware.Camera.CameraInfo);
method public static int getNumberOfCameras();
method public android.hardware.Camera.Parameters getParameters();
@@ -15064,6 +15123,7 @@
method public <T> T get(android.hardware.camera2.CameraCharacteristics.Key<T>);
method public java.util.List<android.hardware.camera2.CaptureRequest.Key<?>> getAvailableCaptureRequestKeys();
method public java.util.List<android.hardware.camera2.CaptureResult.Key<?>> getAvailableCaptureResultKeys();
+ method public java.util.List<android.hardware.camera2.CameraCharacteristics.Key<?>> getKeys();
field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES;
field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AE_AVAILABLE_ANTIBANDING_MODES;
field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AE_AVAILABLE_MODES;
@@ -15420,6 +15480,7 @@
public final class CaptureRequest extends android.hardware.camera2.CameraMetadata implements android.os.Parcelable {
method public int describeContents();
method public <T> T get(android.hardware.camera2.CaptureRequest.Key<T>);
+ method public java.util.List<android.hardware.camera2.CaptureRequest.Key<?>> getKeys();
method public java.lang.Object getTag();
method public boolean isReprocess();
method public void writeToParcel(android.os.Parcel, int);
@@ -15498,6 +15559,7 @@
public class CaptureResult extends android.hardware.camera2.CameraMetadata {
method public <T> T get(android.hardware.camera2.CaptureResult.Key<T>);
method public long getFrameNumber();
+ method public java.util.List<android.hardware.camera2.CaptureResult.Key<?>> getKeys();
method public android.hardware.camera2.CaptureRequest getRequest();
method public int getSequenceId();
field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Boolean> BLACK_LEVEL_LOCK;
@@ -15789,9 +15851,12 @@
field public static final int FINGERPRINT_ERROR_CANCELED = 5; // 0x5
field public static final int FINGERPRINT_ERROR_HW_UNAVAILABLE = 1; // 0x1
field public static final int FINGERPRINT_ERROR_LOCKOUT = 7; // 0x7
+ field public static final int FINGERPRINT_ERROR_LOCKOUT_PERMANENT = 9; // 0x9
field public static final int FINGERPRINT_ERROR_NO_SPACE = 4; // 0x4
field public static final int FINGERPRINT_ERROR_TIMEOUT = 3; // 0x3
field public static final int FINGERPRINT_ERROR_UNABLE_TO_PROCESS = 2; // 0x2
+ field public static final int FINGERPRINT_ERROR_UNABLE_TO_REMOVE = 6; // 0x6
+ field public static final int FINGERPRINT_ERROR_VENDOR = 8; // 0x8
}
public static abstract class FingerprintManager.AuthenticationCallback {
@@ -17931,6 +17996,7 @@
}
public class DateIntervalFormat extends android.icu.text.UFormat {
+ method public synchronized java.lang.Object clone();
method public final java.lang.StringBuffer format(java.lang.Object, java.lang.StringBuffer, java.text.FieldPosition);
method public final synchronized java.lang.StringBuffer format(android.icu.util.DateInterval, java.lang.StringBuffer, java.text.FieldPosition);
method public final synchronized java.lang.StringBuffer format(android.icu.util.Calendar, android.icu.util.Calendar, java.lang.StringBuffer, java.text.FieldPosition);
@@ -18714,6 +18780,7 @@
public final class RuleBasedCollator extends android.icu.text.Collator {
ctor public RuleBasedCollator(java.lang.String) throws java.lang.Exception;
+ method public android.icu.text.RuleBasedCollator cloneAsThawed();
method public int compare(java.lang.String, java.lang.String);
method public android.icu.text.CollationElementIterator getCollationElementIterator(java.lang.String);
method public android.icu.text.CollationElementIterator getCollationElementIterator(java.text.CharacterIterator);
@@ -18740,6 +18807,7 @@
method public void setFrenchCollation(boolean);
method public void setFrenchCollationDefault();
method public void setLowerCaseFirst(boolean);
+ method public android.icu.text.RuleBasedCollator setMaxVariable(int);
method public void setNumericCollation(boolean);
method public void setNumericCollationDefault();
method public void setStrengthDefault();
@@ -21260,6 +21328,7 @@
ctor public AudioRecord(int, int, int, int, int) throws java.lang.IllegalArgumentException;
method public void addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler);
method public deprecated void addOnRoutingChangedListener(android.media.AudioRecord.OnRoutingChangedListener, android.os.Handler);
+ method protected void finalize();
method public int getAudioFormat();
method public int getAudioSessionId();
method public int getAudioSource();
@@ -21364,6 +21433,7 @@
method public deprecated void addOnRoutingChangedListener(android.media.AudioTrack.OnRoutingChangedListener, android.os.Handler);
method public int attachAuxEffect(int);
method public android.media.VolumeShaper createVolumeShaper(android.media.VolumeShaper.Configuration);
+ method protected void finalize();
method public void flush();
method public int getAudioFormat();
method public int getAudioSessionId();
@@ -21762,6 +21832,7 @@
method public boolean clearQueue();
method public java.lang.Object clone() throws java.lang.CloneNotSupportedException;
method public boolean closeJetFile();
+ method protected void finalize();
method public static android.media.JetPlayer getJetPlayer();
method public static int getMaxTracks();
method public boolean loadJetFile(java.lang.String);
@@ -21801,6 +21872,7 @@
ctor public MediaCas(int) throws android.media.MediaCasException.UnsupportedCasException;
method public void close();
method public static android.media.MediaCas.PluginDescriptor[] enumeratePlugins();
+ method protected void finalize();
method public static boolean isSystemIdSupported(int);
method public android.media.MediaCas.Session openSession() throws android.media.MediaCasException;
method public void processEmm(byte[], int, int) throws android.media.MediaCasException;
@@ -21857,6 +21929,7 @@
method public static android.view.Surface createPersistentInputSurface();
method public final int dequeueInputBuffer(long);
method public final int dequeueOutputBuffer(android.media.MediaCodec.BufferInfo, long);
+ method protected void finalize();
method public final void flush();
method public android.media.MediaCodecInfo getCodecInfo();
method public java.nio.ByteBuffer getInputBuffer(int);
@@ -22097,6 +22170,8 @@
field public static final int AVCLevel51 = 32768; // 0x8000
field public static final int AVCLevel52 = 65536; // 0x10000
field public static final int AVCProfileBaseline = 1; // 0x1
+ field public static final int AVCProfileConstrainedBaseline = 65536; // 0x10000
+ field public static final int AVCProfileConstrainedHigh = 524288; // 0x80000
field public static final int AVCProfileExtended = 4; // 0x4
field public static final int AVCProfileHigh = 8; // 0x8
field public static final int AVCProfileHigh10 = 16; // 0x10
@@ -22268,6 +22343,7 @@
public final class MediaCrypto {
ctor public MediaCrypto(java.util.UUID, byte[]) throws android.media.MediaCryptoException;
+ method protected void finalize();
method public static final boolean isCryptoSchemeSupported(java.util.UUID);
method public final void release();
method public final boolean requiresSecureDecoderComponent(java.lang.String);
@@ -22288,6 +22364,7 @@
ctor public MediaDescrambler(int) throws android.media.MediaCasException.UnsupportedCasException;
method public void close();
method public final int descramble(java.nio.ByteBuffer, java.nio.ByteBuffer, android.media.MediaCodec.CryptoInfo);
+ method protected void finalize();
method public final boolean requiresSecureDecoderComponent(java.lang.String);
method public final void setMediaCasSession(android.media.MediaCas.Session);
}
@@ -22330,6 +22407,7 @@
public final class MediaDrm {
ctor public MediaDrm(java.util.UUID) throws android.media.UnsupportedSchemeException;
method public void closeSession(byte[]);
+ method protected void finalize();
method public android.media.MediaDrm.CryptoSession getCryptoSession(byte[], java.lang.String, java.lang.String);
method public android.media.MediaDrm.KeyRequest getKeyRequest(byte[], byte[], java.lang.String, int, java.util.HashMap<java.lang.String, java.lang.String>) throws android.media.NotProvisionedException;
method public byte[] getPropertyByteArray(java.lang.String);
@@ -22426,6 +22504,7 @@
public final class MediaExtractor {
ctor public MediaExtractor();
method public boolean advance();
+ method protected void finalize();
method public long getCachedDuration();
method public android.media.MediaExtractor.CasInfo getCasInfo(int);
method public android.media.DrmInitData getDrmInitData();
@@ -22727,6 +22806,7 @@
method public static android.media.MediaPlayer create(android.content.Context, int, android.media.AudioAttributes, int);
method public android.media.VolumeShaper createVolumeShaper(android.media.VolumeShaper.Configuration);
method public void deselectTrack(int) throws java.lang.IllegalStateException;
+ method protected void finalize();
method public int getAudioSessionId();
method public int getCurrentPosition();
method public android.media.MediaPlayer.DrmInfo getDrmInfo();
@@ -22922,6 +23002,7 @@
public class MediaRecorder {
ctor public MediaRecorder();
+ method protected void finalize();
method public static final int getAudioSourceMax();
method public int getMaxAmplitude() throws java.lang.IllegalStateException;
method public android.os.PersistableBundle getMetrics();
@@ -23193,6 +23274,7 @@
public final class MediaSync {
ctor public MediaSync();
method public final android.view.Surface createInputSurface();
+ method protected void finalize();
method public void flush();
method public android.media.PlaybackParams getPlaybackParams();
method public android.media.SyncParams getSyncParams();
@@ -23312,6 +23394,10 @@
public deprecated class RemoteControlClient.MetadataEditor extends android.media.MediaMetadataEditor {
method public synchronized void apply();
+ method public synchronized android.media.RemoteControlClient.MetadataEditor putBitmap(int, android.graphics.Bitmap) throws java.lang.IllegalArgumentException;
+ method public synchronized android.media.RemoteControlClient.MetadataEditor putLong(int, long) throws java.lang.IllegalArgumentException;
+ method public synchronized android.media.RemoteControlClient.MetadataEditor putObject(int, java.lang.Object) throws java.lang.IllegalArgumentException;
+ method public synchronized android.media.RemoteControlClient.MetadataEditor putString(int, java.lang.String) throws java.lang.IllegalArgumentException;
field public static final int BITMAP_KEY_ARTWORK = 100; // 0x64
}
@@ -23358,6 +23444,7 @@
}
public class Ringtone {
+ method protected void finalize();
method public android.media.AudioAttributes getAudioAttributes();
method public deprecated int getStreamType();
method public java.lang.String getTitle(android.content.Context);
@@ -23411,6 +23498,7 @@
ctor public deprecated SoundPool(int, int, int);
method public final void autoPause();
method public final void autoResume();
+ method protected void finalize();
method public int load(java.lang.String, int);
method public int load(android.content.Context, int, int);
method public int load(android.content.res.AssetFileDescriptor, int);
@@ -23479,6 +23567,7 @@
public class ToneGenerator {
ctor public ToneGenerator(int, int);
+ method protected void finalize();
method public final int getAudioSessionId();
method public void release();
method public boolean startTone(int);
@@ -23611,6 +23700,7 @@
public final class VolumeShaper implements java.lang.AutoCloseable {
method public void apply(android.media.VolumeShaper.Operation);
method public void close();
+ method protected void finalize();
method public float getVolume();
method public void replace(android.media.VolumeShaper.Configuration, android.media.VolumeShaper.Operation, boolean);
}
@@ -23665,6 +23755,7 @@
}
public class AudioEffect {
+ method protected void finalize();
method public android.media.audiofx.AudioEffect.Descriptor getDescriptor() throws java.lang.IllegalStateException;
method public boolean getEnabled() throws java.lang.IllegalStateException;
method public int getId() throws java.lang.IllegalStateException;
@@ -23917,6 +24008,7 @@
public class Visualizer {
ctor public Visualizer(int) throws java.lang.RuntimeException, java.lang.UnsupportedOperationException;
+ method protected void finalize();
method public int getCaptureSize() throws java.lang.IllegalStateException;
method public static int[] getCaptureSizeRange();
method public boolean getEnabled();
@@ -24474,6 +24566,7 @@
method public static boolean isChannelUriForPassthroughInput(android.net.Uri);
method public static boolean isChannelUriForTunerInput(android.net.Uri);
method public static boolean isProgramUri(android.net.Uri);
+ method public static boolean isRecordedProgramUri(android.net.Uri);
method public static void requestChannelBrowsable(android.content.Context, long);
field public static final java.lang.String ACTION_INITIALIZE_PROGRAMS = "android.media.tv.action.INITIALIZE_PROGRAMS";
field public static final java.lang.String ACTION_PREVIEW_PROGRAM_ADDED_TO_WATCH_NEXT = "android.media.tv.action.PREVIEW_PROGRAM_ADDED_TO_WATCH_NEXT";
@@ -25608,6 +25701,7 @@
field public static final int TRANSPORT_BLUETOOTH = 2; // 0x2
field public static final int TRANSPORT_CELLULAR = 0; // 0x0
field public static final int TRANSPORT_ETHERNET = 3; // 0x3
+ field public static final int TRANSPORT_LOWPAN = 6; // 0x6
field public static final int TRANSPORT_VPN = 4; // 0x4
field public static final int TRANSPORT_WIFI = 1; // 0x1
field public static final int TRANSPORT_WIFI_AWARE = 5; // 0x5
@@ -25923,6 +26017,7 @@
method public boolean protect(java.net.Socket);
method public boolean protect(java.net.DatagramSocket);
method public boolean setUnderlyingNetworks(android.net.Network[]);
+ field public static final java.lang.String METADATA_SUPPORTS_ALWAYS_ON = "android.net.VpnService.SUPPORTS_ALWAYS_ON";
field public static final java.lang.String SERVICE_INTERFACE = "android.net.VpnService";
}
@@ -26975,7 +27070,8 @@
method public abstract void onSuccess();
}
- public static class WifiP2pManager.Channel {
+ public static class WifiP2pManager.Channel implements java.lang.AutoCloseable {
+ method public void close();
}
public static abstract interface WifiP2pManager.ChannelListener {
@@ -30514,6 +30610,7 @@
field public static final int N = 24; // 0x18
field public static final int N_MR1 = 25; // 0x19
field public static final int O = 26; // 0x1a
+ field public static final int O_MR1 = 10000; // 0x2710
}
public final class Bundle extends android.os.BaseBundle implements java.lang.Cloneable android.os.Parcelable {
@@ -30579,6 +30676,7 @@
method public void putStringArrayList(java.lang.String, java.util.ArrayList<java.lang.String>);
method public void readFromParcel(android.os.Parcel);
method public void setClassLoader(java.lang.ClassLoader);
+ method public synchronized java.lang.String toString();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.os.Bundle> CREATOR;
field public static final android.os.Bundle EMPTY;
@@ -30809,6 +30907,7 @@
public abstract class FileObserver {
ctor public FileObserver(java.lang.String);
ctor public FileObserver(java.lang.String, int);
+ method protected void finalize();
method public abstract void onEvent(int, java.lang.String);
method public void startWatching();
method public void stopWatching();
@@ -30960,11 +31059,12 @@
public class MemoryFile {
ctor public MemoryFile(java.lang.String, int) throws java.io.IOException;
- method public synchronized boolean allowPurging(boolean) throws java.io.IOException;
+ method public deprecated synchronized boolean allowPurging(boolean) throws java.io.IOException;
method public void close();
+ method public java.io.FileDescriptor getFileDescriptor() throws java.io.IOException;
method public java.io.InputStream getInputStream();
method public java.io.OutputStream getOutputStream();
- method public boolean isPurgingAllowed();
+ method public deprecated boolean isPurgingAllowed();
method public int length();
method public int readBytes(byte[], int, int, int) throws java.io.IOException;
method public void writeBytes(byte[], int, int, int) throws java.io.IOException;
@@ -31261,6 +31361,7 @@
method public int describeContents();
method public android.os.PersistableBundle getPersistableBundle(java.lang.String);
method public void putPersistableBundle(java.lang.String, android.os.PersistableBundle);
+ method public synchronized java.lang.String toString();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.os.PersistableBundle> CREATOR;
field public static final android.os.PersistableBundle EMPTY;
@@ -31388,6 +31489,22 @@
field public static final android.os.Parcelable.Creator<android.os.ResultReceiver> CREATOR;
}
+ public final class SharedMemory implements java.io.Closeable android.os.Parcelable {
+ method public void close();
+ method public static android.os.SharedMemory create(java.lang.String, int) throws android.system.ErrnoException;
+ method public int describeContents();
+ method public int getFd();
+ method public java.io.FileDescriptor getFileDescriptor();
+ method public int getSize();
+ method public java.nio.ByteBuffer map(int, int, int) throws android.system.ErrnoException;
+ method public java.nio.ByteBuffer mapReadOnly() throws android.system.ErrnoException;
+ method public java.nio.ByteBuffer mapReadWrite() throws android.system.ErrnoException;
+ method public boolean setProtect(int);
+ method public static void unmap(java.nio.ByteBuffer);
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.os.SharedMemory> CREATOR;
+ }
+
public class StatFs {
ctor public StatFs(java.lang.String);
method public deprecated int getAvailableBlocks();
@@ -31792,6 +31909,7 @@
method public android.os.storage.StorageVolume getStorageVolume(java.io.File);
method public java.util.List<android.os.storage.StorageVolume> getStorageVolumes();
method public java.util.UUID getUuidForPath(java.io.File) throws java.io.IOException;
+ method public boolean isAllocationSupported(java.io.FileDescriptor);
method public boolean isCacheBehaviorGroup(java.io.File) throws java.io.IOException;
method public boolean isCacheBehaviorTombstone(java.io.File) throws java.io.IOException;
method public boolean isEncrypted(java.io.File);
@@ -35583,6 +35701,7 @@
method public static android.renderscript.AllocationAdapter create1D(android.renderscript.RenderScript, android.renderscript.Allocation);
method public static android.renderscript.AllocationAdapter create2D(android.renderscript.RenderScript, android.renderscript.Allocation);
method public static android.renderscript.AllocationAdapter createTyped(android.renderscript.RenderScript, android.renderscript.Allocation, android.renderscript.Type);
+ method public synchronized void resize(int);
method public void setFace(android.renderscript.Type.CubemapFace);
method public void setLOD(int);
method public void setX(int);
@@ -36842,6 +36961,30 @@
field public static final java.lang.String SERVICE_META_DATA = "android.autofill";
}
+ public final class CharSequenceTransformation implements android.os.Parcelable android.service.autofill.Transformation {
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.service.autofill.CharSequenceTransformation> CREATOR;
+ }
+
+ public static class CharSequenceTransformation.Builder {
+ ctor public CharSequenceTransformation.Builder(android.view.autofill.AutofillId, java.util.regex.Pattern, java.lang.String);
+ method public android.service.autofill.CharSequenceTransformation.Builder addField(android.view.autofill.AutofillId, java.util.regex.Pattern, java.lang.String);
+ method public android.service.autofill.CharSequenceTransformation build();
+ }
+
+ public final class CustomDescription implements android.os.Parcelable {
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.service.autofill.CustomDescription> CREATOR;
+ }
+
+ public static class CustomDescription.Builder {
+ ctor public CustomDescription.Builder(android.widget.RemoteViews);
+ method public android.service.autofill.CustomDescription.Builder addChild(int, android.service.autofill.Transformation);
+ method public android.service.autofill.CustomDescription build();
+ }
+
public final class Dataset implements android.os.Parcelable {
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
@@ -36915,6 +37058,25 @@
method public android.service.autofill.FillResponse.Builder setSaveInfo(android.service.autofill.SaveInfo);
}
+ public final class ImageTransformation implements android.os.Parcelable android.service.autofill.Transformation {
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.service.autofill.ImageTransformation> CREATOR;
+ }
+
+ public static class ImageTransformation.Builder {
+ ctor public ImageTransformation.Builder(android.view.autofill.AutofillId, java.util.regex.Pattern, int);
+ method public android.service.autofill.ImageTransformation.Builder addOption(java.util.regex.Pattern, int);
+ method public android.service.autofill.ImageTransformation build();
+ }
+
+ public final class LuhnChecksumValidator implements android.os.Parcelable android.service.autofill.Validator {
+ ctor public LuhnChecksumValidator(android.view.autofill.AutofillId...);
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.service.autofill.LuhnChecksumValidator> CREATOR;
+ }
+
public final class SaveCallback {
method public void onFailure(java.lang.CharSequence);
method public void onSuccess();
@@ -36937,11 +37099,14 @@
public static final class SaveInfo.Builder {
ctor public SaveInfo.Builder(int, android.view.autofill.AutofillId[]);
+ ctor public SaveInfo.Builder(int);
method public android.service.autofill.SaveInfo build();
+ method public android.service.autofill.SaveInfo.Builder setCustomDescription(android.service.autofill.CustomDescription);
method public android.service.autofill.SaveInfo.Builder setDescription(java.lang.CharSequence);
method public android.service.autofill.SaveInfo.Builder setFlags(int);
method public android.service.autofill.SaveInfo.Builder setNegativeAction(int, android.content.IntentSender);
method public android.service.autofill.SaveInfo.Builder setOptionalIds(android.view.autofill.AutofillId[]);
+ method public android.service.autofill.SaveInfo.Builder setValidator(android.service.autofill.Validator);
}
public final class SaveRequest implements android.os.Parcelable {
@@ -36952,6 +37117,24 @@
field public static final android.os.Parcelable.Creator<android.service.autofill.SaveRequest> CREATOR;
}
+ public final class SimpleRegexValidator implements android.os.Parcelable android.service.autofill.Validator {
+ ctor public SimpleRegexValidator(android.view.autofill.AutofillId, java.util.regex.Pattern);
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.service.autofill.SimpleRegexValidator> CREATOR;
+ }
+
+ public abstract interface Transformation {
+ }
+
+ public abstract interface Validator {
+ }
+
+ public final class Validators {
+ method public static android.service.autofill.Validator and(android.service.autofill.Validator...);
+ method public static android.service.autofill.Validator or(android.service.autofill.Validator...);
+ }
+
}
package android.service.carrier {
@@ -37585,8 +37768,10 @@
method public android.view.SurfaceHolder getSurfaceHolder();
method public boolean isPreview();
method public boolean isVisible();
+ method public void notifyColorsChanged();
method public void onApplyWindowInsets(android.view.WindowInsets);
method public android.os.Bundle onCommand(java.lang.String, int, int, int, android.os.Bundle, boolean);
+ method public android.app.WallpaperColors onComputeColors();
method public void onCreate(android.view.SurfaceHolder);
method public void onDesiredSizeChanged(int, int);
method public void onDestroy();
@@ -38168,6 +38353,7 @@
field public static final int FD_CLOEXEC;
field public static final int FIONREAD;
field public static final int F_DUPFD;
+ field public static final int F_DUPFD_CLOEXEC;
field public static final int F_GETFD;
field public static final int F_GETFL;
field public static final int F_GETLK;
@@ -38262,7 +38448,9 @@
field public static final int NI_NUMERICSERV;
field public static final int O_ACCMODE;
field public static final int O_APPEND;
+ field public static final int O_CLOEXEC;
field public static final int O_CREAT;
+ field public static final int O_DSYNC;
field public static final int O_EXCL;
field public static final int O_NOCTTY;
field public static final int O_NOFOLLOW;
@@ -38508,14 +38696,18 @@
public final class StructStat {
ctor public StructStat(long, long, int, long, int, int, long, long, long, long, long, long, long);
+ ctor public StructStat(long, long, int, long, int, int, long, long, android.system.StructTimespec, android.system.StructTimespec, android.system.StructTimespec, long, long);
+ field public final android.system.StructTimespec st_atim;
field public final long st_atime;
field public final long st_blksize;
field public final long st_blocks;
+ field public final android.system.StructTimespec st_ctim;
field public final long st_ctime;
field public final long st_dev;
field public final int st_gid;
field public final long st_ino;
field public final int st_mode;
+ field public final android.system.StructTimespec st_mtim;
field public final long st_mtime;
field public final long st_nlink;
field public final long st_rdev;
@@ -38538,6 +38730,13 @@
field public final long f_namemax;
}
+ public final class StructTimespec implements java.lang.Comparable {
+ ctor public StructTimespec(long, long);
+ method public int compareTo(android.system.StructTimespec);
+ field public final long tv_nsec;
+ field public final long tv_sec;
+ }
+
public final class StructUtsname {
ctor public StructUtsname(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
field public final java.lang.String machine;
@@ -38671,7 +38870,8 @@
public static final class Call.RttCall {
method public int getRttAudioMode();
- method public java.lang.String read();
+ method public java.lang.String read() throws java.io.IOException;
+ method public java.lang.String readImmediately() throws java.io.IOException;
method public void setRttMode(int);
method public void write(java.lang.String) throws java.io.IOException;
field public static final int RTT_MODE_FULL = 1; // 0x1
@@ -39338,7 +39538,7 @@
method public android.os.PersistableBundle getConfigForSubId(int);
method public void notifyConfigChangedForSubId(int);
field public static final java.lang.String ACTION_CARRIER_CONFIG_CHANGED = "android.telephony.action.CARRIER_CONFIG_CHANGED";
- field public static final int DATA_CYCLE_THRESHOLD_DISABLED = -2; // 0xfffffffe
+ field public static final deprecated int DATA_CYCLE_THRESHOLD_DISABLED = -2; // 0xfffffffe
field public static final java.lang.String KEY_ADDITIONAL_CALL_SETTING_BOOL = "additional_call_setting_bool";
field public static final java.lang.String KEY_ALLOW_ADDING_APNS_BOOL = "allow_adding_apns_bool";
field public static final java.lang.String KEY_ALLOW_ADD_CALL_DURING_VIDEO_CALL_BOOL = "allow_add_call_during_video_call";
@@ -39380,9 +39580,10 @@
field public static final java.lang.String KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_VAL_STRING = "ci_action_on_sys_update_extra_val_string";
field public static final java.lang.String KEY_CI_ACTION_ON_SYS_UPDATE_INTENT_STRING = "ci_action_on_sys_update_intent_string";
field public static final java.lang.String KEY_CONFIG_IMS_PACKAGE_OVERRIDE_STRING = "config_ims_package_override_string";
+ field public static final java.lang.String KEY_CONFIG_PLANS_PACKAGE_OVERRIDE_STRING = "config_plans_package_override_string";
field public static final java.lang.String KEY_CSP_ENABLED_BOOL = "csp_enabled_bool";
- field public static final java.lang.String KEY_DATA_LIMIT_THRESHOLD_BYTES_LONG = "data_limit_threshold_bytes_long";
- field public static final java.lang.String KEY_DATA_WARNING_THRESHOLD_BYTES_LONG = "data_warning_threshold_bytes_long";
+ field public static final deprecated java.lang.String KEY_DATA_LIMIT_THRESHOLD_BYTES_LONG = "data_limit_threshold_bytes_long";
+ field public static final deprecated java.lang.String KEY_DATA_WARNING_THRESHOLD_BYTES_LONG = "data_warning_threshold_bytes_long";
field public static final java.lang.String KEY_DEFAULT_SIM_CALL_MANAGER_STRING = "default_sim_call_manager_string";
field public static final java.lang.String KEY_DEFAULT_VM_NUMBER_STRING = "default_vm_number_string";
field public static final java.lang.String KEY_DIAL_STRING_REPLACE_STRING_ARRAY = "dial_string_replace_string_array";
@@ -39439,7 +39640,7 @@
field public static final java.lang.String KEY_MMS_UA_PROF_TAG_NAME_STRING = "uaProfTagName";
field public static final java.lang.String KEY_MMS_UA_PROF_URL_STRING = "uaProfUrl";
field public static final java.lang.String KEY_MMS_USER_AGENT_STRING = "userAgent";
- field public static final java.lang.String KEY_MONTHLY_DATA_CYCLE_DAY_INT = "monthly_data_cycle_day_int";
+ field public static final deprecated java.lang.String KEY_MONTHLY_DATA_CYCLE_DAY_INT = "monthly_data_cycle_day_int";
field public static final java.lang.String KEY_ONLY_SINGLE_DC_ALLOWED_INT_ARRAY = "only_single_dc_allowed_int_array";
field public static final java.lang.String KEY_OPERATOR_SELECTION_EXPAND_BOOL = "operator_selection_expand_bool";
field public static final java.lang.String KEY_PREFER_2G_BOOL = "prefer_2g_bool";
@@ -39951,8 +40152,10 @@
method public static int getDefaultSmsSubscriptionId();
method public static int getDefaultSubscriptionId();
method public static int getDefaultVoiceSubscriptionId();
+ method public java.util.List<android.telephony.SubscriptionPlan> getSubscriptionPlans(int);
method public boolean isNetworkRoaming(int);
method public void removeOnSubscriptionsChangedListener(android.telephony.SubscriptionManager.OnSubscriptionsChangedListener);
+ method public void setSubscriptionPlans(int, java.util.List<android.telephony.SubscriptionPlan>);
field public static final java.lang.String ACTION_DEFAULT_SMS_SUBSCRIPTION_CHANGED = "android.telephony.action.DEFAULT_SMS_SUBSCRIPTION_CHANGED";
field public static final java.lang.String ACTION_DEFAULT_SUBSCRIPTION_CHANGED = "android.telephony.action.DEFAULT_SUBSCRIPTION_CHANGED";
field public static final int DATA_ROAMING_DISABLE = 0; // 0x0
@@ -39966,6 +40169,38 @@
method public void onSubscriptionsChanged();
}
+ public final class SubscriptionPlan implements android.os.Parcelable {
+ method public java.util.Iterator<android.util.Pair<java.time.ZonedDateTime, java.time.ZonedDateTime>> cycleIterator();
+ method public int describeContents();
+ method public int getDataLimitBehavior();
+ method public long getDataLimitBytes();
+ method public long getDataUsageBytes();
+ method public long getDataUsageTime();
+ method public java.lang.CharSequence getSummary();
+ method public java.lang.CharSequence getTitle();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final long BYTES_UNKNOWN = -1L; // 0xffffffffffffffffL
+ field public static final long BYTES_UNLIMITED = 9223372036854775807L; // 0x7fffffffffffffffL
+ field public static final android.os.Parcelable.Creator<android.telephony.SubscriptionPlan> CREATOR;
+ field public static final int LIMIT_BEHAVIOR_BILLED = 1; // 0x1
+ field public static final int LIMIT_BEHAVIOR_DISABLED = 0; // 0x0
+ field public static final int LIMIT_BEHAVIOR_THROTTLED = 2; // 0x2
+ field public static final int LIMIT_BEHAVIOR_UNKNOWN = -1; // 0xffffffff
+ field public static final long TIME_UNKNOWN = -1L; // 0xffffffffffffffffL
+ }
+
+ public static class SubscriptionPlan.Builder {
+ method public android.telephony.SubscriptionPlan build();
+ method public static android.telephony.SubscriptionPlan.Builder createNonrecurring(java.time.ZonedDateTime, java.time.ZonedDateTime);
+ method public static android.telephony.SubscriptionPlan.Builder createRecurringDaily(java.time.ZonedDateTime);
+ method public static android.telephony.SubscriptionPlan.Builder createRecurringMonthly(java.time.ZonedDateTime);
+ method public static android.telephony.SubscriptionPlan.Builder createRecurringWeekly(java.time.ZonedDateTime);
+ method public android.telephony.SubscriptionPlan.Builder setDataLimit(long, int);
+ method public android.telephony.SubscriptionPlan.Builder setDataUsage(long, long);
+ method public android.telephony.SubscriptionPlan.Builder setSummary(java.lang.CharSequence);
+ method public android.telephony.SubscriptionPlan.Builder setTitle(java.lang.CharSequence);
+ }
+
public class TelephonyManager {
method public boolean canChangeDtmfToneLength();
method public android.telephony.TelephonyManager createForPhoneAccountHandle(android.telecom.PhoneAccountHandle);
@@ -40067,6 +40302,7 @@
field public static final java.lang.String EXTRA_CALL_VOICEMAIL_INTENT = "android.telephony.extra.CALL_VOICEMAIL_INTENT";
field public static final java.lang.String EXTRA_HIDE_PUBLIC_SETTINGS = "android.telephony.extra.HIDE_PUBLIC_SETTINGS";
field public static final java.lang.String EXTRA_INCOMING_NUMBER = "incoming_number";
+ field public static final java.lang.String EXTRA_IS_REFRESH = "android.telephony.extra.IS_REFRESH";
field public static final java.lang.String EXTRA_LAUNCH_VOICEMAIL_SETTINGS_INTENT = "android.telephony.extra.LAUNCH_VOICEMAIL_SETTINGS_INTENT";
field public static final java.lang.String EXTRA_NOTIFICATION_COUNT = "android.telephony.extra.NOTIFICATION_COUNT";
field public static final java.lang.String EXTRA_PHONE_ACCOUNT_HANDLE = "android.telephony.extra.PHONE_ACCOUNT_HANDLE";
@@ -40268,6 +40504,7 @@
public static deprecated class SmsMessage.SubmitPdu {
ctor public deprecated SmsMessage.SubmitPdu();
+ method public deprecated java.lang.String toString();
field public deprecated byte[] encodedMessage;
field public deprecated byte[] encodedScAddress;
}
@@ -40331,6 +40568,7 @@
method public java.util.List<junit.framework.TestCase> getTestCases();
method public java.lang.String getTestClassName();
method public junit.framework.TestResult getTestResult();
+ method protected java.lang.Class loadSuiteClass(java.lang.String) throws java.lang.ClassNotFoundException;
method protected void runFailed(java.lang.String);
method public void runTest();
method public void runTest(junit.framework.TestResult);
@@ -40591,10 +40829,12 @@
ctor protected MockContentProvider();
ctor public MockContentProvider(android.content.Context);
ctor public MockContentProvider(android.content.Context, java.lang.String, java.lang.String, android.content.pm.PathPermission[]);
+ method public android.content.ContentProviderResult[] applyBatch(java.util.ArrayList<android.content.ContentProviderOperation>);
method public int delete(android.net.Uri, java.lang.String, java.lang.String[]);
method public java.lang.String getType(android.net.Uri);
method public android.net.Uri insert(android.net.Uri, android.content.ContentValues);
method public boolean onCreate();
+ method public android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle);
method public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
method public int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
}
@@ -40864,6 +41104,10 @@
public deprecated class MockResources extends android.content.res.Resources {
ctor public MockResources();
+ method public int getColor(int) throws android.content.res.Resources.NotFoundException;
+ method public android.content.res.ColorStateList getColorStateList(int) throws android.content.res.Resources.NotFoundException;
+ method public android.graphics.drawable.Drawable getDrawable(int) throws android.content.res.Resources.NotFoundException;
+ method public void updateConfiguration(android.content.res.Configuration, android.util.DisplayMetrics);
}
}
@@ -41099,6 +41343,7 @@
public static class InputFilter.AllCaps implements android.text.InputFilter {
ctor public InputFilter.AllCaps();
+ ctor public InputFilter.AllCaps(java.util.Locale);
method public java.lang.CharSequence filter(java.lang.CharSequence, int, int, android.text.Spanned, int, int);
}
@@ -42111,6 +42356,7 @@
public abstract class MetricAffectingSpan extends android.text.style.CharacterStyle implements android.text.style.UpdateLayout {
ctor public MetricAffectingSpan();
+ method public android.text.style.MetricAffectingSpan getUnderlying();
method public abstract void updateMeasureState(android.text.TextPaint);
}
@@ -42791,14 +43037,28 @@
public class TransitionSet extends android.transition.Transition {
ctor public TransitionSet();
ctor public TransitionSet(android.content.Context, android.util.AttributeSet);
+ method public android.transition.TransitionSet addListener(android.transition.Transition.TransitionListener);
+ method public android.transition.TransitionSet addTarget(android.view.View);
+ method public android.transition.TransitionSet addTarget(int);
+ method public android.transition.TransitionSet addTarget(java.lang.String);
+ method public android.transition.TransitionSet addTarget(java.lang.Class);
method public android.transition.TransitionSet addTransition(android.transition.Transition);
method public void captureEndValues(android.transition.TransitionValues);
method public void captureStartValues(android.transition.TransitionValues);
+ method public android.transition.TransitionSet clone();
method public int getOrdering();
method public android.transition.Transition getTransitionAt(int);
method public int getTransitionCount();
+ method public android.transition.TransitionSet removeListener(android.transition.Transition.TransitionListener);
+ method public android.transition.TransitionSet removeTarget(int);
+ method public android.transition.TransitionSet removeTarget(android.view.View);
+ method public android.transition.TransitionSet removeTarget(java.lang.Class);
+ method public android.transition.TransitionSet removeTarget(java.lang.String);
method public android.transition.TransitionSet removeTransition(android.transition.Transition);
+ method public android.transition.TransitionSet setDuration(long);
+ method public android.transition.TransitionSet setInterpolator(android.animation.TimeInterpolator);
method public android.transition.TransitionSet setOrdering(int);
+ method public android.transition.TransitionSet setStartDelay(long);
field public static final int ORDERING_SEQUENTIAL = 1; // 0x1
field public static final int ORDERING_TOGETHER = 0; // 0x0
}
@@ -42963,6 +43223,9 @@
public class Base64InputStream extends java.io.FilterInputStream {
ctor public Base64InputStream(java.io.InputStream, int);
+ method public int available();
+ method public void mark(int);
+ method public void reset();
}
public class Base64OutputStream extends java.io.FilterOutputStream {
@@ -43961,6 +44224,7 @@
method public android.os.Vibrator getVibrator();
method public boolean[] hasKeys(int...);
method public boolean hasMicrophone();
+ method public boolean isEnabled();
method public boolean isVirtual();
method public boolean supportsSource(int);
method public void writeToParcel(android.os.Parcel, int);
@@ -44991,11 +45255,15 @@
public class Surface implements android.os.Parcelable {
ctor public Surface(android.graphics.SurfaceTexture);
method public int describeContents();
+ method public boolean isAutoRefreshEnabled();
+ method public boolean isSharedBufferModeEnabled();
method public boolean isValid();
method public android.graphics.Canvas lockCanvas(android.graphics.Rect) throws java.lang.IllegalArgumentException, android.view.Surface.OutOfResourcesException;
method public android.graphics.Canvas lockHardwareCanvas();
method public void readFromParcel(android.os.Parcel);
method public void release();
+ method public void setAutoRefreshEnabled(boolean);
+ method public void setSharedBufferModeEnabled(boolean);
method public deprecated void unlockCanvas(android.graphics.Canvas);
method public void unlockCanvasAndPost(android.graphics.Canvas);
method public void writeToParcel(android.os.Parcel, int);
@@ -45076,6 +45344,7 @@
method public android.graphics.Canvas lockCanvas();
method public android.graphics.Canvas lockCanvas(android.graphics.Rect);
method protected final void onDraw(android.graphics.Canvas);
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
method public void setOpaque(boolean);
method public void setSurfaceTexture(android.graphics.SurfaceTexture);
method public void setSurfaceTextureListener(android.view.TextureView.SurfaceTextureListener);
@@ -46099,6 +46368,7 @@
method public int getLayoutMode();
method public android.animation.LayoutTransition getLayoutTransition();
method public int getNestedScrollAxes();
+ method public android.view.ViewGroupOverlay getOverlay();
method public int getPersistentDrawingCache();
method public boolean getTouchscreenBlocksFocus();
method public int indexOfChild(android.view.View);
@@ -46529,6 +46799,7 @@
method public final boolean isActive();
method public abstract boolean isFloating();
method public abstract boolean isShortcutKey(int, android.view.KeyEvent);
+ method public boolean isWideColorGamut();
method public final void makeActive();
method protected abstract void onActive();
method public abstract void onConfigurationChanged(android.content.res.Configuration);
@@ -46791,12 +47062,12 @@
field public static final int FLAG_SCALED = 16384; // 0x4000
field public static final int FLAG_SECURE = 8192; // 0x2000
field public static final int FLAG_SHOW_WALLPAPER = 1048576; // 0x100000
- field public static final int FLAG_SHOW_WHEN_LOCKED = 524288; // 0x80000
+ field public static final deprecated int FLAG_SHOW_WHEN_LOCKED = 524288; // 0x80000
field public static final int FLAG_SPLIT_TOUCH = 8388608; // 0x800000
field public static final deprecated int FLAG_TOUCHABLE_WHEN_WAKING = 64; // 0x40
field public static final int FLAG_TRANSLUCENT_NAVIGATION = 134217728; // 0x8000000
field public static final int FLAG_TRANSLUCENT_STATUS = 67108864; // 0x4000000
- field public static final int FLAG_TURN_SCREEN_ON = 2097152; // 0x200000
+ field public static final deprecated int FLAG_TURN_SCREEN_ON = 2097152; // 0x200000
field public static final int FLAG_WATCH_OUTSIDE_TOUCH = 262144; // 0x40000
field public static final int FORMAT_CHANGED = 8; // 0x8
field public static final int LAST_APPLICATION_WINDOW = 99; // 0x63
@@ -46950,6 +47221,7 @@
}
public final class AccessibilityManager {
+ method public void addAccessibilityRequestPreparer(android.view.accessibility.AccessibilityRequestPreparer);
method public boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener);
method public void addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener, android.os.Handler);
method public boolean addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener);
@@ -46960,6 +47232,7 @@
method public void interrupt();
method public boolean isEnabled();
method public boolean isTouchExplorationEnabled();
+ method public void removeAccessibilityRequestPreparer(android.view.accessibility.AccessibilityRequestPreparer);
method public boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener);
method public boolean removeTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener);
method public void sendAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
@@ -47276,6 +47549,13 @@
method public void setToIndex(int);
}
+ public abstract class AccessibilityRequestPreparer {
+ ctor public AccessibilityRequestPreparer(android.view.View, int);
+ method public android.view.View getView();
+ method public abstract void onPrepareExtraData(int, java.lang.String, android.os.Bundle, android.os.Message);
+ field public static final int REQUEST_TYPE_EXTRA_DATA = 1; // 0x1
+ }
+
public final class AccessibilityWindowInfo implements android.os.Parcelable {
method public int describeContents();
method public android.view.accessibility.AccessibilityNodeInfo getAnchor();
@@ -47368,6 +47648,7 @@
ctor public Animation(android.content.Context, android.util.AttributeSet);
method protected void applyTransformation(float, android.view.animation.Transformation);
method public void cancel();
+ method protected android.view.animation.Animation clone() throws java.lang.CloneNotSupportedException;
method public long computeDurationHint();
method protected void ensureInterpolator();
method public int getBackgroundColor();
@@ -47439,6 +47720,7 @@
ctor public AnimationSet(android.content.Context, android.util.AttributeSet);
ctor public AnimationSet(boolean);
method public void addAnimation(android.view.animation.Animation);
+ method protected android.view.animation.AnimationSet clone() throws java.lang.CloneNotSupportedException;
method public java.util.List<android.view.animation.Animation> getAnimations();
}
@@ -47643,6 +47925,8 @@
method public void notifyViewEntered(android.view.View, int, android.graphics.Rect);
method public void notifyViewExited(android.view.View);
method public void notifyViewExited(android.view.View, int);
+ method public void notifyViewVisibilityChanged(android.view.View, boolean);
+ method public void notifyViewVisibilityChanged(android.view.View, int, boolean);
method public void registerCallback(android.view.autofill.AutofillManager.AutofillCallback);
method public void requestAutofill(android.view.View);
method public void requestAutofill(android.view.View, int, android.graphics.Rect);
@@ -48289,6 +48573,10 @@
public final deprecated class CookieSyncManager extends android.webkit.WebSyncManager {
method public static android.webkit.CookieSyncManager createInstance(android.content.Context);
method public static android.webkit.CookieSyncManager getInstance();
+ method public deprecated void resetSync();
+ method public deprecated void startSync();
+ method public deprecated void stopSync();
+ method public deprecated void sync();
method protected deprecated void syncFromRamToFlash();
field protected static final java.lang.String LOGTAG = "websync";
field protected android.webkit.WebViewDatabase mDataBase;
@@ -48370,6 +48658,13 @@
method public abstract int rendererPriorityAtExit();
}
+ public abstract class SafeBrowsingResponse {
+ ctor public SafeBrowsingResponse();
+ method public abstract void backToSafety(boolean);
+ method public abstract void proceed(boolean);
+ method public abstract void showInterstitial(boolean);
+ }
+
public class ServiceWorkerClient {
ctor public ServiceWorkerClient();
method public android.webkit.WebResourceResponse shouldInterceptRequest(android.webkit.WebResourceRequest);
@@ -48790,6 +49085,7 @@
method public int getRendererRequestedPriority();
method public deprecated float getScale();
method public android.webkit.WebSettings getSettings();
+ method public android.view.textclassifier.TextClassifier getTextClassifier();
method public java.lang.String getTitle();
method public java.lang.String getUrl();
method public android.webkit.WebChromeClient getWebChromeClient();
@@ -48797,6 +49093,7 @@
method public void goBack();
method public void goBackOrForward(int);
method public void goForward();
+ method public static void initSafeBrowsing(android.content.Context, android.webkit.ValueCallback<java.lang.Boolean>);
method public void invokeZoomPicker();
method public boolean isPrivateBrowsingEnabled();
method public void loadData(java.lang.String, java.lang.String, java.lang.String);
@@ -48836,11 +49133,15 @@
method public void setNetworkAvailable(boolean);
method public deprecated void setPictureListener(android.webkit.WebView.PictureListener);
method public void setRendererPriorityPolicy(int, boolean);
+ method public static void setSafeBrowsingWhitelist(java.util.List<java.lang.String>, android.webkit.ValueCallback<java.lang.Boolean>);
+ method public void setTextClassifier(android.view.textclassifier.TextClassifier);
method public deprecated void setVerticalScrollbarOverlay(boolean);
method public void setWebChromeClient(android.webkit.WebChromeClient);
method public static void setWebContentsDebuggingEnabled(boolean);
method public void setWebViewClient(android.webkit.WebViewClient);
+ method public deprecated boolean shouldDelayChildPressedState();
method public deprecated boolean showFindDialog(java.lang.String, boolean);
+ method public static void shutdownSafeBrowsing();
method public void stopLoading();
method public void zoomBy(float);
method public boolean zoomIn();
@@ -48903,6 +49204,7 @@
method public void onReceivedLoginRequest(android.webkit.WebView, java.lang.String, java.lang.String, java.lang.String);
method public void onReceivedSslError(android.webkit.WebView, android.webkit.SslErrorHandler, android.net.http.SslError);
method public boolean onRenderProcessGone(android.webkit.WebView, android.webkit.RenderProcessGoneDetail);
+ method public void onSafeBrowsingHit(android.webkit.WebView, android.webkit.WebResourceRequest, int, android.webkit.SafeBrowsingResponse);
method public void onScaleChanged(android.webkit.WebView, float, float);
method public deprecated void onTooManyRedirects(android.webkit.WebView, android.os.Message, android.os.Message);
method public void onUnhandledKeyEvent(android.webkit.WebView, android.view.KeyEvent);
@@ -48927,6 +49229,10 @@
field public static final int ERROR_UNSAFE_RESOURCE = -16; // 0xfffffff0
field public static final int ERROR_UNSUPPORTED_AUTH_SCHEME = -3; // 0xfffffffd
field public static final int ERROR_UNSUPPORTED_SCHEME = -10; // 0xfffffff6
+ field public static final int SAFE_BROWSING_THREAT_MALWARE = 1; // 0x1
+ field public static final int SAFE_BROWSING_THREAT_PHISHING = 2; // 0x2
+ field public static final int SAFE_BROWSING_THREAT_UNKNOWN = 0; // 0x0
+ field public static final int SAFE_BROWSING_THREAT_UNWANTED_SOFTWARE = 3; // 0x3
}
public abstract class WebViewDatabase {
@@ -48963,6 +49269,7 @@
method public void clearTextFilter();
method public void deferNotifyDataSetChanged();
method public void fling(int);
+ method public android.widget.AbsListView.LayoutParams generateLayoutParams(android.util.AttributeSet);
method public int getCacheColorHint();
method public int getCheckedItemCount();
method public long[] getCheckedItemIds();
@@ -49129,6 +49436,9 @@
ctor public ActionMenuView(android.content.Context);
ctor public ActionMenuView(android.content.Context, android.util.AttributeSet);
method public void dismissPopupMenus();
+ method protected android.widget.ActionMenuView.LayoutParams generateDefaultLayoutParams();
+ method public android.widget.ActionMenuView.LayoutParams generateLayoutParams(android.util.AttributeSet);
+ method protected android.widget.ActionMenuView.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
method public android.view.Menu getMenu();
method public android.graphics.drawable.Drawable getOverflowIcon();
method public int getPopupTheme();
@@ -49304,7 +49614,6 @@
method public void addAll(T...);
method public void clear();
method public static android.widget.ArrayAdapter<java.lang.CharSequence> createFromResource(android.content.Context, int, int);
- method public java.lang.CharSequence[] getAutofillOptions();
method public android.content.Context getContext();
method public int getCount();
method public android.content.res.Resources.Theme getDropDownViewTheme();
@@ -49394,6 +49703,7 @@
method public void notifyDataSetChanged();
method public void notifyDataSetInvalidated();
method public void registerDataSetObserver(android.database.DataSetObserver);
+ method public void setAutofillOptions(java.lang.CharSequence...);
method public void unregisterDataSetObserver(android.database.DataSetObserver);
}
@@ -49672,6 +49982,7 @@
ctor public EditText(android.content.Context, android.util.AttributeSet, int);
ctor public EditText(android.content.Context, android.util.AttributeSet, int, int);
method public void extendSelection(int);
+ method public android.text.Editable getText();
method public void selectAll();
method public void setSelection(int, int);
method public void setSelection(int);
@@ -49793,6 +50104,8 @@
ctor public FrameLayout(android.content.Context, android.util.AttributeSet);
ctor public FrameLayout(android.content.Context, android.util.AttributeSet, int);
ctor public FrameLayout(android.content.Context, android.util.AttributeSet, int, int);
+ method protected android.widget.FrameLayout.LayoutParams generateDefaultLayoutParams();
+ method public android.widget.FrameLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
method public deprecated boolean getConsiderGoneChildrenWhenMeasuring();
method public boolean getMeasureAllChildren();
method protected void onLayout(boolean, int, int, int, int);
@@ -49839,6 +50152,9 @@
ctor public GridLayout(android.content.Context, android.util.AttributeSet);
ctor public GridLayout(android.content.Context, android.util.AttributeSet, int);
ctor public GridLayout(android.content.Context, android.util.AttributeSet, int, int);
+ method protected android.widget.GridLayout.LayoutParams generateDefaultLayoutParams();
+ method public android.widget.GridLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
+ method protected android.widget.GridLayout.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
method public int getAlignmentMode();
method public int getColumnCount();
method public int getOrientation();
@@ -50051,6 +50367,9 @@
ctor public LinearLayout(android.content.Context, android.util.AttributeSet);
ctor public LinearLayout(android.content.Context, android.util.AttributeSet, int);
ctor public LinearLayout(android.content.Context, android.util.AttributeSet, int, int);
+ method protected android.widget.LinearLayout.LayoutParams generateDefaultLayoutParams();
+ method public android.widget.LinearLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
+ method protected android.widget.LinearLayout.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
method public int getBaselineAlignedChildIndex();
method public android.graphics.drawable.Drawable getDividerDrawable();
method public int getDividerPadding();
@@ -50437,6 +50756,8 @@
method public final synchronized void incrementSecondaryProgressBy(int);
method public boolean isAnimating();
method public synchronized boolean isIndeterminate();
+ method protected synchronized void onDraw(android.graphics.Canvas);
+ method protected synchronized void onMeasure(int, int);
method public void onRestoreInstanceState(android.os.Parcelable);
method public android.os.Parcelable onSaveInstanceState();
method public synchronized void setIndeterminate(boolean);
@@ -50492,6 +50813,7 @@
ctor public RadioGroup(android.content.Context, android.util.AttributeSet);
method public void check(int);
method public void clearCheck();
+ method public android.widget.RadioGroup.LayoutParams generateLayoutParams(android.util.AttributeSet);
method public int getCheckedRadioButtonId();
method public void setOnCheckedChangeListener(android.widget.RadioGroup.OnCheckedChangeListener);
}
@@ -50534,6 +50856,7 @@
ctor public RelativeLayout(android.content.Context, android.util.AttributeSet);
ctor public RelativeLayout(android.content.Context, android.util.AttributeSet, int);
ctor public RelativeLayout(android.content.Context, android.util.AttributeSet, int, int);
+ method public android.widget.RelativeLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
method public int getGravity();
method protected void onLayout(boolean, int, int, int, int);
method public void setGravity(int);
@@ -51077,6 +51400,7 @@
public class TableLayout extends android.widget.LinearLayout {
ctor public TableLayout(android.content.Context);
ctor public TableLayout(android.content.Context, android.util.AttributeSet);
+ method public android.widget.TableLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
method public boolean isColumnCollapsed(int);
method public boolean isColumnShrinkable(int);
method public boolean isColumnStretchable(int);
@@ -51101,6 +51425,7 @@
public class TableRow extends android.widget.LinearLayout {
ctor public TableRow(android.content.Context);
ctor public TableRow(android.content.Context, android.util.AttributeSet);
+ method public android.widget.TableRow.LayoutParams generateLayoutParams(android.util.AttributeSet);
method public android.view.View getVirtualChildAt(int);
method public int getVirtualChildCount();
}
@@ -51442,6 +51767,7 @@
ctor public ToggleButton(android.content.Context);
method public java.lang.CharSequence getTextOff();
method public java.lang.CharSequence getTextOn();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
method public void setTextOff(java.lang.CharSequence);
method public void setTextOn(java.lang.CharSequence);
}
@@ -51453,6 +51779,9 @@
ctor public Toolbar(android.content.Context, android.util.AttributeSet, int, int);
method public void collapseActionView();
method public void dismissPopupMenus();
+ method protected android.widget.Toolbar.LayoutParams generateDefaultLayoutParams();
+ method public android.widget.Toolbar.LayoutParams generateLayoutParams(android.util.AttributeSet);
+ method protected android.widget.Toolbar.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
method public int getContentInsetEnd();
method public int getContentInsetEndWithActions();
method public int getContentInsetLeft();
@@ -51974,6 +52303,13 @@
public class BaseDexClassLoader extends java.lang.ClassLoader {
ctor public BaseDexClassLoader(java.lang.String, java.io.File, java.lang.String, java.lang.ClassLoader);
method public java.lang.String findLibrary(java.lang.String);
+ method protected java.util.Enumeration<java.net.URL> findResources(java.lang.String);
+ method protected synchronized java.lang.Package getPackage(java.lang.String);
+ }
+
+ public final class DelegateLastClassLoader extends dalvik.system.PathClassLoader {
+ ctor public DelegateLastClassLoader(java.lang.String, java.lang.ClassLoader);
+ ctor public DelegateLastClassLoader(java.lang.String, java.lang.String, java.lang.ClassLoader);
}
public class DexClassLoader extends dalvik.system.BaseDexClassLoader {
@@ -51992,6 +52328,7 @@
}
public final class InMemoryDexClassLoader extends dalvik.system.BaseDexClassLoader {
+ ctor public InMemoryDexClassLoader(java.nio.ByteBuffer[], java.lang.ClassLoader);
ctor public InMemoryDexClassLoader(java.nio.ByteBuffer, java.lang.ClassLoader);
}
@@ -52195,6 +52532,10 @@
public class BufferedInputStream extends java.io.FilterInputStream {
ctor public BufferedInputStream(java.io.InputStream);
ctor public BufferedInputStream(java.io.InputStream, int);
+ method public synchronized int available() throws java.io.IOException;
+ method public synchronized int read() throws java.io.IOException;
+ method public synchronized int read(byte[], int, int) throws java.io.IOException;
+ method public synchronized long skip(long) throws java.io.IOException;
field protected volatile byte[] buf;
field protected int count;
field protected int marklimit;
@@ -52205,6 +52546,9 @@
public class BufferedOutputStream extends java.io.FilterOutputStream {
ctor public BufferedOutputStream(java.io.OutputStream);
ctor public BufferedOutputStream(java.io.OutputStream, int);
+ method public synchronized void flush() throws java.io.IOException;
+ method public synchronized void write(int) throws java.io.IOException;
+ method public synchronized void write(byte[], int, int) throws java.io.IOException;
field protected byte[] buf;
field protected int count;
}
@@ -52230,7 +52574,12 @@
public class ByteArrayInputStream extends java.io.InputStream {
ctor public ByteArrayInputStream(byte[]);
ctor public ByteArrayInputStream(byte[], int, int);
+ method public synchronized int available();
+ method public void mark(int);
method public synchronized int read();
+ method public synchronized int read(byte[], int, int);
+ method public synchronized void reset();
+ method public synchronized long skip(long);
field protected byte[] buf;
field protected int count;
field protected int mark;
@@ -52243,9 +52592,11 @@
method public synchronized void reset();
method public synchronized int size();
method public synchronized byte[] toByteArray();
+ method public synchronized java.lang.String toString();
method public synchronized java.lang.String toString(java.lang.String) throws java.io.UnsupportedEncodingException;
method public deprecated synchronized java.lang.String toString(int);
method public synchronized void write(int);
+ method public synchronized void write(byte[], int, int);
method public synchronized void writeTo(java.io.OutputStream) throws java.io.IOException;
field protected byte[] buf;
field protected int count;
@@ -52265,12 +52616,17 @@
public class CharArrayWriter extends java.io.Writer {
ctor public CharArrayWriter();
ctor public CharArrayWriter(int);
+ method public java.io.CharArrayWriter append(java.lang.CharSequence);
+ method public java.io.CharArrayWriter append(java.lang.CharSequence, int, int);
+ method public java.io.CharArrayWriter append(char);
method public void close();
method public void flush();
method public void reset();
method public int size();
method public char[] toCharArray();
+ method public void write(int);
method public void write(char[], int, int);
+ method public void write(java.lang.String, int, int);
method public void writeTo(java.io.Writer) throws java.io.IOException;
field protected char[] buf;
field protected int count;
@@ -52357,6 +52713,8 @@
public class DataOutputStream extends java.io.FilterOutputStream implements java.io.DataOutput {
ctor public DataOutputStream(java.io.OutputStream);
method public final int size();
+ method public synchronized void write(int) throws java.io.IOException;
+ method public synchronized void write(byte[], int, int) throws java.io.IOException;
method public final void writeBoolean(boolean) throws java.io.IOException;
method public final void writeByte(int) throws java.io.IOException;
method public final void writeBytes(java.lang.String) throws java.io.IOException;
@@ -52456,6 +52814,7 @@
ctor public FileInputStream(java.lang.String) throws java.io.FileNotFoundException;
ctor public FileInputStream(java.io.File) throws java.io.FileNotFoundException;
ctor public FileInputStream(java.io.FileDescriptor);
+ method protected void finalize() throws java.io.IOException;
method public java.nio.channels.FileChannel getChannel();
method public final java.io.FileDescriptor getFD() throws java.io.IOException;
method public int read() throws java.io.IOException;
@@ -52472,6 +52831,7 @@
ctor public FileOutputStream(java.io.File) throws java.io.FileNotFoundException;
ctor public FileOutputStream(java.io.File, boolean) throws java.io.FileNotFoundException;
ctor public FileOutputStream(java.io.FileDescriptor);
+ method protected void finalize() throws java.io.IOException;
method public java.nio.channels.FileChannel getChannel();
method public final java.io.FileDescriptor getFD() throws java.io.IOException;
method public void write(int) throws java.io.IOException;
@@ -52585,6 +52945,8 @@
public deprecated class LineNumberInputStream extends java.io.FilterInputStream {
ctor public LineNumberInputStream(java.io.InputStream);
method public int getLineNumber();
+ method public void mark(int);
+ method public void reset() throws java.io.IOException;
method public void setLineNumber(int);
}
@@ -52814,8 +53176,10 @@
ctor public PipedInputStream(java.io.PipedOutputStream, int) throws java.io.IOException;
ctor public PipedInputStream();
ctor public PipedInputStream(int);
+ method public synchronized int available() throws java.io.IOException;
method public void connect(java.io.PipedOutputStream) throws java.io.IOException;
method public synchronized int read() throws java.io.IOException;
+ method public synchronized int read(byte[], int, int) throws java.io.IOException;
method protected synchronized void receive(int) throws java.io.IOException;
field protected static final int PIPE_SIZE = 1024; // 0x400
field protected byte[] buffer;
@@ -52827,6 +53191,7 @@
ctor public PipedOutputStream(java.io.PipedInputStream) throws java.io.IOException;
ctor public PipedOutputStream();
method public synchronized void connect(java.io.PipedInputStream) throws java.io.IOException;
+ method public synchronized void flush() throws java.io.IOException;
method public void write(int) throws java.io.IOException;
}
@@ -52837,7 +53202,9 @@
ctor public PipedReader(int);
method public void close() throws java.io.IOException;
method public void connect(java.io.PipedWriter) throws java.io.IOException;
+ method public synchronized int read() throws java.io.IOException;
method public synchronized int read(char[], int, int) throws java.io.IOException;
+ method public synchronized boolean ready() throws java.io.IOException;
}
public class PipedWriter extends java.io.Writer {
@@ -52862,6 +53229,8 @@
method public java.io.PrintStream append(char);
method public boolean checkError();
method protected void clearError();
+ method public void close();
+ method public void flush();
method public java.io.PrintStream format(java.lang.String, java.lang.Object...);
method public java.io.PrintStream format(java.util.Locale, java.lang.String, java.lang.Object...);
method public void print(boolean);
@@ -52886,6 +53255,8 @@
method public void println(java.lang.String);
method public void println(java.lang.Object);
method protected void setError();
+ method public void write(int);
+ method public void write(byte[], int, int);
}
public class PrintWriter extends java.io.Writer {
@@ -52897,6 +53268,9 @@
ctor public PrintWriter(java.lang.String, java.lang.String) throws java.io.FileNotFoundException, java.io.UnsupportedEncodingException;
ctor public PrintWriter(java.io.File) throws java.io.FileNotFoundException;
ctor public PrintWriter(java.io.File, java.lang.String) throws java.io.FileNotFoundException, java.io.UnsupportedEncodingException;
+ method public java.io.PrintWriter append(java.lang.CharSequence);
+ method public java.io.PrintWriter append(java.lang.CharSequence, int, int);
+ method public java.io.PrintWriter append(char);
method public boolean checkError();
method protected void clearError();
method public void close();
@@ -52925,13 +53299,18 @@
method public void println(java.lang.String);
method public void println(java.lang.Object);
method protected void setError();
+ method public void write(int);
method public void write(char[], int, int);
+ method public void write(char[]);
+ method public void write(java.lang.String, int, int);
+ method public void write(java.lang.String);
field protected java.io.Writer out;
}
public class PushbackInputStream extends java.io.FilterInputStream {
ctor public PushbackInputStream(java.io.InputStream, int);
ctor public PushbackInputStream(java.io.InputStream);
+ method public synchronized void close() throws java.io.IOException;
method public void unread(int) throws java.io.IOException;
method public void unread(byte[], int, int) throws java.io.IOException;
method public void unread(byte[]) throws java.io.IOException;
@@ -53055,7 +53434,11 @@
public deprecated class StringBufferInputStream extends java.io.InputStream {
ctor public StringBufferInputStream(java.lang.String);
+ method public synchronized int available();
method public synchronized int read();
+ method public synchronized int read(byte[], int, int);
+ method public synchronized void reset();
+ method public synchronized long skip(long);
field protected java.lang.String buffer;
field protected int count;
field protected int pos;
@@ -53070,10 +53453,16 @@
public class StringWriter extends java.io.Writer {
ctor public StringWriter();
ctor public StringWriter(int);
+ method public java.io.StringWriter append(java.lang.CharSequence);
+ method public java.io.StringWriter append(java.lang.CharSequence, int, int);
+ method public java.io.StringWriter append(char);
method public void close() throws java.io.IOException;
method public void flush();
method public java.lang.StringBuffer getBuffer();
+ method public void write(int);
method public void write(char[], int, int);
+ method public void write(java.lang.String);
+ method public void write(java.lang.String, int, int);
}
public class SyncFailedException extends java.io.IOException {
@@ -53088,6 +53477,7 @@
public class UncheckedIOException extends java.lang.RuntimeException {
ctor public UncheckedIOException(java.lang.String, java.io.IOException);
ctor public UncheckedIOException(java.io.IOException);
+ method public java.io.IOException getCause();
}
public class UnsupportedEncodingException extends java.io.IOException {
@@ -53097,6 +53487,7 @@
public class WriteAbortedException extends java.io.ObjectStreamException {
ctor public WriteAbortedException(java.lang.String, java.lang.Exception);
+ method public java.lang.Throwable getCause();
field public java.lang.Exception detail;
}
@@ -53864,6 +54255,7 @@
ctor public ClassNotFoundException();
ctor public ClassNotFoundException(java.lang.String);
ctor public ClassNotFoundException(java.lang.String, java.lang.Throwable);
+ method public java.lang.Throwable getCause();
method public java.lang.Throwable getException();
}
@@ -53968,6 +54360,7 @@
ctor public ExceptionInInitializerError();
ctor public ExceptionInInitializerError(java.lang.Throwable);
ctor public ExceptionInInitializerError(java.lang.String);
+ method public java.lang.Throwable getCause();
method public java.lang.Throwable getException();
}
@@ -54755,8 +55148,16 @@
method public synchronized java.lang.StringBuffer append(float);
method public synchronized java.lang.StringBuffer append(double);
method public synchronized java.lang.StringBuffer appendCodePoint(int);
+ method public synchronized int capacity();
+ method public synchronized char charAt(int);
+ method public synchronized int codePointAt(int);
+ method public synchronized int codePointBefore(int);
+ method public synchronized int codePointCount(int, int);
method public synchronized java.lang.StringBuffer delete(int, int);
method public synchronized java.lang.StringBuffer deleteCharAt(int);
+ method public synchronized void ensureCapacity(int);
+ method public synchronized void getChars(int, int, char[], int);
+ method public synchronized int indexOf(java.lang.String, int);
method public synchronized java.lang.StringBuffer insert(int, char[], int, int);
method public synchronized java.lang.StringBuffer insert(int, java.lang.Object);
method public synchronized java.lang.StringBuffer insert(int, java.lang.String);
@@ -54769,9 +55170,18 @@
method public java.lang.StringBuffer insert(int, long);
method public java.lang.StringBuffer insert(int, float);
method public java.lang.StringBuffer insert(int, double);
+ method public synchronized int lastIndexOf(java.lang.String, int);
+ method public synchronized int length();
+ method public synchronized int offsetByCodePoints(int, int);
method public synchronized java.lang.StringBuffer replace(int, int, java.lang.String);
method public synchronized java.lang.StringBuffer reverse();
+ method public synchronized void setCharAt(int, char);
+ method public synchronized void setLength(int);
+ method public synchronized java.lang.CharSequence subSequence(int, int);
+ method public synchronized java.lang.String substring(int);
+ method public synchronized java.lang.String substring(int, int);
method public synchronized java.lang.String toString();
+ method public synchronized void trimToSize();
}
public final class StringBuilder extends java.lang.AbstractStringBuilder implements java.lang.CharSequence java.io.Serializable {
@@ -55426,6 +55836,7 @@
ctor protected InvocationTargetException();
ctor public InvocationTargetException(java.lang.Throwable);
ctor public InvocationTargetException(java.lang.Throwable, java.lang.String);
+ method public java.lang.Throwable getCause();
method public java.lang.Throwable getTargetException();
}
@@ -55541,6 +55952,7 @@
public class UndeclaredThrowableException extends java.lang.RuntimeException {
ctor public UndeclaredThrowableException(java.lang.Throwable);
ctor public UndeclaredThrowableException(java.lang.Throwable, java.lang.String);
+ method public java.lang.Throwable getCause();
method public java.lang.Throwable getUndeclaredThrowable();
}
@@ -56438,6 +56850,7 @@
method public java.lang.String getQuery();
method public java.lang.String getRef();
method public java.lang.String getUserInfo();
+ method public synchronized int hashCode();
method public java.net.URLConnection openConnection() throws java.io.IOException;
method public java.net.URLConnection openConnection(java.net.Proxy) throws java.io.IOException;
method public final java.io.InputStream openStream() throws java.io.IOException;
@@ -56667,7 +57080,6 @@
method public final int arrayOffset();
method public abstract java.nio.CharBuffer asReadOnlyBuffer();
method public final char charAt(int);
- method public java.util.stream.IntStream chars();
method public abstract java.nio.CharBuffer compact();
method public int compareTo(java.nio.CharBuffer);
method public abstract java.nio.CharBuffer duplicate();
@@ -57524,6 +57936,7 @@
public final class DirectoryIteratorException extends java.util.ConcurrentModificationException {
ctor public DirectoryIteratorException(java.io.IOException);
+ method public java.io.IOException getCause();
}
public class DirectoryNotEmptyException extends java.nio.file.FileSystemException {
@@ -58489,9 +58902,11 @@
public static class KeyStore.PasswordProtection implements javax.security.auth.Destroyable java.security.KeyStore.ProtectionParameter {
ctor public KeyStore.PasswordProtection(char[]);
ctor public KeyStore.PasswordProtection(char[], java.lang.String, java.security.spec.AlgorithmParameterSpec);
+ method public synchronized void destroy() throws javax.security.auth.DestroyFailedException;
method public synchronized char[] getPassword();
method public java.lang.String getProtectionAlgorithm();
method public java.security.spec.AlgorithmParameterSpec getProtectionParameters();
+ method public synchronized boolean isDestroyed();
}
public static final class KeyStore.PrivateKeyEntry implements java.security.KeyStore.Entry {
@@ -58671,6 +59086,7 @@
public class PrivilegedActionException extends java.lang.Exception {
ctor public PrivilegedActionException(java.lang.Exception);
+ method public java.lang.Throwable getCause();
method public java.lang.Exception getException();
}
@@ -58693,22 +59109,30 @@
method public synchronized java.lang.Object compute(java.lang.Object, java.util.function.BiFunction<? super java.lang.Object, ? super java.lang.Object, ? extends java.lang.Object>);
method public synchronized java.lang.Object computeIfAbsent(java.lang.Object, java.util.function.Function<? super java.lang.Object, ? extends java.lang.Object>);
method public synchronized java.lang.Object computeIfPresent(java.lang.Object, java.util.function.BiFunction<? super java.lang.Object, ? super java.lang.Object, ? extends java.lang.Object>);
+ method public java.util.Enumeration<java.lang.Object> elements();
+ method public synchronized java.util.Set<java.util.Map.Entry<java.lang.Object, java.lang.Object>> entrySet();
method public synchronized void forEach(java.util.function.BiConsumer<? super java.lang.Object, ? super java.lang.Object>);
+ method public java.lang.Object get(java.lang.Object);
method public java.lang.String getInfo();
method public java.lang.String getName();
method public synchronized java.lang.Object getOrDefault(java.lang.Object, java.lang.Object);
method public synchronized java.security.Provider.Service getService(java.lang.String, java.lang.String);
method public synchronized java.util.Set<java.security.Provider.Service> getServices();
method public double getVersion();
+ method public java.util.Set<java.lang.Object> keySet();
+ method public java.util.Enumeration<java.lang.Object> keys();
method public synchronized java.lang.Object merge(java.lang.Object, java.lang.Object, java.util.function.BiFunction<? super java.lang.Object, ? super java.lang.Object, ? extends java.lang.Object>);
method public synchronized java.lang.Object put(java.lang.Object, java.lang.Object);
method public synchronized void putAll(java.util.Map<?, ?>);
method public synchronized java.lang.Object putIfAbsent(java.lang.Object, java.lang.Object);
method protected synchronized void putService(java.security.Provider.Service);
+ method public synchronized java.lang.Object remove(java.lang.Object);
method protected synchronized void removeService(java.security.Provider.Service);
method public synchronized boolean replace(java.lang.Object, java.lang.Object, java.lang.Object);
method public synchronized java.lang.Object replace(java.lang.Object, java.lang.Object);
method public synchronized void replaceAll(java.util.function.BiFunction<? super java.lang.Object, ? super java.lang.Object, ? extends java.lang.Object>);
+ method public java.lang.String toString();
+ method public java.util.Collection<java.lang.Object> values();
}
public static class Provider.Service {
@@ -58754,7 +59178,9 @@
method public final java.security.Provider getProvider();
method public static byte[] getSeed(int);
method protected final int next(int);
+ method public synchronized void nextBytes(byte[]);
method public synchronized void setSeed(byte[]);
+ method public void setSeed(long);
}
public abstract class SecureRandomSpi implements java.io.Serializable {
@@ -59301,6 +59727,7 @@
public abstract class PKIXRevocationChecker extends java.security.cert.PKIXCertPathChecker {
ctor protected PKIXRevocationChecker();
+ method public java.security.cert.PKIXRevocationChecker clone();
method public java.util.List<java.security.cert.Extension> getOcspExtensions();
method public java.net.URI getOcspResponder();
method public java.security.cert.X509Certificate getOcspResponderCert();
@@ -61553,7 +61980,6 @@
public final class DayOfWeek extends java.lang.Enum implements java.time.temporal.TemporalAccessor java.time.temporal.TemporalAdjuster {
method public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
method public static java.time.DayOfWeek from(java.time.temporal.TemporalAccessor);
- method public int get(java.time.temporal.TemporalField);
method public java.lang.String getDisplayName(java.time.format.TextStyle, java.util.Locale);
method public long getLong(java.time.temporal.TemporalField);
method public int getValue();
@@ -61561,8 +61987,6 @@
method public java.time.DayOfWeek minus(long);
method public static java.time.DayOfWeek of(int);
method public java.time.DayOfWeek plus(long);
- method public <R> R query(java.time.temporal.TemporalQuery<R>);
- method public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
method public static java.time.DayOfWeek valueOf(java.lang.String);
method public static final java.time.DayOfWeek[] values();
enum_constant public static final java.time.DayOfWeek FRIDAY;
@@ -61638,6 +62062,8 @@
method public boolean isBefore(java.time.Instant);
method public boolean isSupported(java.time.temporal.TemporalField);
method public boolean isSupported(java.time.temporal.TemporalUnit);
+ method public java.time.Instant minus(java.time.temporal.TemporalAmount);
+ method public java.time.Instant minus(long, java.time.temporal.TemporalUnit);
method public java.time.Instant minusMillis(long);
method public java.time.Instant minusNanos(long);
method public java.time.Instant minusSeconds(long);
@@ -61647,6 +62073,7 @@
method public static java.time.Instant ofEpochSecond(long);
method public static java.time.Instant ofEpochSecond(long, long);
method public static java.time.Instant parse(java.lang.CharSequence);
+ method public java.time.Instant plus(java.time.temporal.TemporalAmount);
method public java.time.Instant plus(long, java.time.temporal.TemporalUnit);
method public java.time.Instant plusMillis(long);
method public java.time.Instant plusNanos(long);
@@ -61654,6 +62081,7 @@
method public long toEpochMilli();
method public java.time.Instant truncatedTo(java.time.temporal.TemporalUnit);
method public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
+ method public java.time.Instant with(java.time.temporal.TemporalAdjuster);
method public java.time.Instant with(java.time.temporal.TemporalField, long);
field public static final java.time.Instant EPOCH;
field public static final java.time.Instant MAX;
@@ -61663,6 +62091,7 @@
public final class LocalDate implements java.time.chrono.ChronoLocalDate java.io.Serializable java.time.temporal.Temporal java.time.temporal.TemporalAdjuster {
method public java.time.LocalDateTime atStartOfDay();
method public java.time.ZonedDateTime atStartOfDay(java.time.ZoneId);
+ method public java.time.LocalDateTime atTime(java.time.LocalTime);
method public java.time.LocalDateTime atTime(int, int);
method public java.time.LocalDateTime atTime(int, int, int);
method public java.time.LocalDateTime atTime(int, int, int, int);
@@ -61677,6 +62106,8 @@
method public int getMonthValue();
method public int getYear();
method public int lengthOfMonth();
+ method public java.time.LocalDate minus(java.time.temporal.TemporalAmount);
+ method public java.time.LocalDate minus(long, java.time.temporal.TemporalUnit);
method public java.time.LocalDate minusDays(long);
method public java.time.LocalDate minusMonths(long);
method public java.time.LocalDate minusWeeks(long);
@@ -61690,12 +62121,16 @@
method public static java.time.LocalDate ofYearDay(int, int);
method public static java.time.LocalDate parse(java.lang.CharSequence);
method public static java.time.LocalDate parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
+ method public java.time.LocalDate plus(java.time.temporal.TemporalAmount);
+ method public java.time.LocalDate plus(long, java.time.temporal.TemporalUnit);
method public java.time.LocalDate plusDays(long);
method public java.time.LocalDate plusMonths(long);
method public java.time.LocalDate plusWeeks(long);
method public java.time.LocalDate plusYears(long);
method public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
method public java.time.Period until(java.time.chrono.ChronoLocalDate);
+ method public java.time.LocalDate with(java.time.temporal.TemporalAdjuster);
+ method public java.time.LocalDate with(java.time.temporal.TemporalField, long);
method public java.time.LocalDate withDayOfMonth(int);
method public java.time.LocalDate withDayOfYear(int);
method public java.time.LocalDate withMonth(int);
@@ -61720,6 +62155,8 @@
method public int getSecond();
method public int getYear();
method public boolean isSupported(java.time.temporal.TemporalField);
+ method public java.time.LocalDateTime minus(java.time.temporal.TemporalAmount);
+ method public java.time.LocalDateTime minus(long, java.time.temporal.TemporalUnit);
method public java.time.LocalDateTime minusDays(long);
method public java.time.LocalDateTime minusHours(long);
method public java.time.LocalDateTime minusMinutes(long);
@@ -61742,6 +62179,7 @@
method public static java.time.LocalDateTime ofInstant(java.time.Instant, java.time.ZoneId);
method public static java.time.LocalDateTime parse(java.lang.CharSequence);
method public static java.time.LocalDateTime parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
+ method public java.time.LocalDateTime plus(java.time.temporal.TemporalAmount);
method public java.time.LocalDateTime plus(long, java.time.temporal.TemporalUnit);
method public java.time.LocalDateTime plusDays(long);
method public java.time.LocalDateTime plusHours(long);
@@ -61755,6 +62193,7 @@
method public java.time.LocalTime toLocalTime();
method public java.time.LocalDateTime truncatedTo(java.time.temporal.TemporalUnit);
method public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
+ method public java.time.LocalDateTime with(java.time.temporal.TemporalAdjuster);
method public java.time.LocalDateTime with(java.time.temporal.TemporalField, long);
method public java.time.LocalDateTime withDayOfMonth(int);
method public java.time.LocalDateTime withDayOfYear(int);
@@ -61784,6 +62223,8 @@
method public boolean isBefore(java.time.LocalTime);
method public boolean isSupported(java.time.temporal.TemporalField);
method public boolean isSupported(java.time.temporal.TemporalUnit);
+ method public java.time.LocalTime minus(java.time.temporal.TemporalAmount);
+ method public java.time.LocalTime minus(long, java.time.temporal.TemporalUnit);
method public java.time.LocalTime minusHours(long);
method public java.time.LocalTime minusMinutes(long);
method public java.time.LocalTime minusNanos(long);
@@ -61798,6 +62239,7 @@
method public static java.time.LocalTime ofSecondOfDay(long);
method public static java.time.LocalTime parse(java.lang.CharSequence);
method public static java.time.LocalTime parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
+ method public java.time.LocalTime plus(java.time.temporal.TemporalAmount);
method public java.time.LocalTime plus(long, java.time.temporal.TemporalUnit);
method public java.time.LocalTime plusHours(long);
method public java.time.LocalTime plusMinutes(long);
@@ -61807,6 +62249,7 @@
method public int toSecondOfDay();
method public java.time.LocalTime truncatedTo(java.time.temporal.TemporalUnit);
method public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
+ method public java.time.LocalTime with(java.time.temporal.TemporalAdjuster);
method public java.time.LocalTime with(java.time.temporal.TemporalField, long);
method public java.time.LocalTime withHour(int);
method public java.time.LocalTime withMinute(int);
@@ -61823,7 +62266,6 @@
method public int firstDayOfYear(boolean);
method public java.time.Month firstMonthOfQuarter();
method public static java.time.Month from(java.time.temporal.TemporalAccessor);
- method public int get(java.time.temporal.TemporalField);
method public java.lang.String getDisplayName(java.time.format.TextStyle, java.util.Locale);
method public long getLong(java.time.temporal.TemporalField);
method public int getValue();
@@ -61834,8 +62276,6 @@
method public java.time.Month minus(long);
method public static java.time.Month of(int);
method public java.time.Month plus(long);
- method public <R> R query(java.time.temporal.TemporalQuery<R>);
- method public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
method public static java.time.Month valueOf(java.lang.String);
method public static final java.time.Month[] values();
enum_constant public static final java.time.Month APRIL;
@@ -61902,6 +62342,8 @@
method public boolean isEqual(java.time.OffsetDateTime);
method public boolean isSupported(java.time.temporal.TemporalField);
method public boolean isSupported(java.time.temporal.TemporalUnit);
+ method public java.time.OffsetDateTime minus(java.time.temporal.TemporalAmount);
+ method public java.time.OffsetDateTime minus(long, java.time.temporal.TemporalUnit);
method public java.time.OffsetDateTime minusDays(long);
method public java.time.OffsetDateTime minusHours(long);
method public java.time.OffsetDateTime minusMinutes(long);
@@ -61919,6 +62361,7 @@
method public static java.time.OffsetDateTime ofInstant(java.time.Instant, java.time.ZoneId);
method public static java.time.OffsetDateTime parse(java.lang.CharSequence);
method public static java.time.OffsetDateTime parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
+ method public java.time.OffsetDateTime plus(java.time.temporal.TemporalAmount);
method public java.time.OffsetDateTime plus(long, java.time.temporal.TemporalUnit);
method public java.time.OffsetDateTime plusDays(long);
method public java.time.OffsetDateTime plusHours(long);
@@ -61938,6 +62381,7 @@
method public java.time.ZonedDateTime toZonedDateTime();
method public java.time.OffsetDateTime truncatedTo(java.time.temporal.TemporalUnit);
method public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
+ method public java.time.OffsetDateTime with(java.time.temporal.TemporalAdjuster);
method public java.time.OffsetDateTime with(java.time.temporal.TemporalField, long);
method public java.time.OffsetDateTime withDayOfMonth(int);
method public java.time.OffsetDateTime withDayOfYear(int);
@@ -61970,6 +62414,8 @@
method public boolean isEqual(java.time.OffsetTime);
method public boolean isSupported(java.time.temporal.TemporalField);
method public boolean isSupported(java.time.temporal.TemporalUnit);
+ method public java.time.OffsetTime minus(java.time.temporal.TemporalAmount);
+ method public java.time.OffsetTime minus(long, java.time.temporal.TemporalUnit);
method public java.time.OffsetTime minusHours(long);
method public java.time.OffsetTime minusMinutes(long);
method public java.time.OffsetTime minusNanos(long);
@@ -61982,6 +62428,7 @@
method public static java.time.OffsetTime ofInstant(java.time.Instant, java.time.ZoneId);
method public static java.time.OffsetTime parse(java.lang.CharSequence);
method public static java.time.OffsetTime parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
+ method public java.time.OffsetTime plus(java.time.temporal.TemporalAmount);
method public java.time.OffsetTime plus(long, java.time.temporal.TemporalUnit);
method public java.time.OffsetTime plusHours(long);
method public java.time.OffsetTime plusMinutes(long);
@@ -61990,6 +62437,7 @@
method public java.time.LocalTime toLocalTime();
method public java.time.OffsetTime truncatedTo(java.time.temporal.TemporalUnit);
method public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
+ method public java.time.OffsetTime with(java.time.temporal.TemporalAdjuster);
method public java.time.OffsetTime with(java.time.temporal.TemporalField, long);
method public java.time.OffsetTime withHour(int);
method public java.time.OffsetTime withMinute(int);
@@ -62016,6 +62464,7 @@
method public java.time.Period minusMonths(long);
method public java.time.Period minusYears(long);
method public java.time.Period multipliedBy(int);
+ method public java.time.Period negated();
method public java.time.Period normalized();
method public static java.time.Period of(int, int, int);
method public static java.time.Period ofDays(int);
@@ -62054,6 +62503,8 @@
method public boolean isSupported(java.time.temporal.TemporalUnit);
method public boolean isValidMonthDay(java.time.MonthDay);
method public int length();
+ method public java.time.Year minus(java.time.temporal.TemporalAmount);
+ method public java.time.Year minus(long, java.time.temporal.TemporalUnit);
method public java.time.Year minusYears(long);
method public static java.time.Year now();
method public static java.time.Year now(java.time.ZoneId);
@@ -62061,9 +62512,11 @@
method public static java.time.Year of(int);
method public static java.time.Year parse(java.lang.CharSequence);
method public static java.time.Year parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
+ method public java.time.Year plus(java.time.temporal.TemporalAmount);
method public java.time.Year plus(long, java.time.temporal.TemporalUnit);
method public java.time.Year plusYears(long);
method public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
+ method public java.time.Year with(java.time.temporal.TemporalAdjuster);
method public java.time.Year with(java.time.temporal.TemporalField, long);
field public static final int MAX_VALUE = 999999999; // 0x3b9ac9ff
field public static final int MIN_VALUE = -999999999; // 0xc4653601
@@ -62088,6 +62541,8 @@
method public boolean isValidDay(int);
method public int lengthOfMonth();
method public int lengthOfYear();
+ method public java.time.YearMonth minus(java.time.temporal.TemporalAmount);
+ method public java.time.YearMonth minus(long, java.time.temporal.TemporalUnit);
method public java.time.YearMonth minusMonths(long);
method public java.time.YearMonth minusYears(long);
method public static java.time.YearMonth now();
@@ -62097,10 +62552,12 @@
method public static java.time.YearMonth of(int, int);
method public static java.time.YearMonth parse(java.lang.CharSequence);
method public static java.time.YearMonth parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
+ method public java.time.YearMonth plus(java.time.temporal.TemporalAmount);
method public java.time.YearMonth plus(long, java.time.temporal.TemporalUnit);
method public java.time.YearMonth plusMonths(long);
method public java.time.YearMonth plusYears(long);
method public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
+ method public java.time.YearMonth with(java.time.temporal.TemporalAdjuster);
method public java.time.YearMonth with(java.time.temporal.TemporalField, long);
method public java.time.YearMonth withMonth(int);
method public java.time.YearMonth withYear(int);
@@ -62124,7 +62581,6 @@
method public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
method public int compareTo(java.time.ZoneOffset);
method public static java.time.ZoneOffset from(java.time.temporal.TemporalAccessor);
- method public int get(java.time.temporal.TemporalField);
method public java.lang.String getId();
method public long getLong(java.time.temporal.TemporalField);
method public java.time.zone.ZoneRules getRules();
@@ -62135,8 +62591,6 @@
method public static java.time.ZoneOffset ofHoursMinutes(int, int);
method public static java.time.ZoneOffset ofHoursMinutesSeconds(int, int, int);
method public static java.time.ZoneOffset ofTotalSeconds(int);
- method public <R> R query(java.time.temporal.TemporalQuery<R>);
- method public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
field public static final java.time.ZoneOffset MAX;
field public static final java.time.ZoneOffset MIN;
field public static final java.time.ZoneOffset UTC;
@@ -62157,6 +62611,8 @@
method public int getYear();
method public java.time.ZoneId getZone();
method public boolean isSupported(java.time.temporal.TemporalField);
+ method public java.time.ZonedDateTime minus(java.time.temporal.TemporalAmount);
+ method public java.time.ZonedDateTime minus(long, java.time.temporal.TemporalUnit);
method public java.time.ZonedDateTime minusDays(long);
method public java.time.ZonedDateTime minusHours(long);
method public java.time.ZonedDateTime minusMinutes(long);
@@ -62177,6 +62633,7 @@
method public static java.time.ZonedDateTime ofStrict(java.time.LocalDateTime, java.time.ZoneOffset, java.time.ZoneId);
method public static java.time.ZonedDateTime parse(java.lang.CharSequence);
method public static java.time.ZonedDateTime parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
+ method public java.time.ZonedDateTime plus(java.time.temporal.TemporalAmount);
method public java.time.ZonedDateTime plus(long, java.time.temporal.TemporalUnit);
method public java.time.ZonedDateTime plusDays(long);
method public java.time.ZonedDateTime plusHours(long);
@@ -62186,10 +62643,12 @@
method public java.time.ZonedDateTime plusSeconds(long);
method public java.time.ZonedDateTime plusWeeks(long);
method public java.time.ZonedDateTime plusYears(long);
+ method public java.time.LocalDate toLocalDate();
method public java.time.LocalDateTime toLocalDateTime();
method public java.time.OffsetDateTime toOffsetDateTime();
method public java.time.ZonedDateTime truncatedTo(java.time.temporal.TemporalUnit);
method public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
+ method public java.time.ZonedDateTime with(java.time.temporal.TemporalAdjuster);
method public java.time.ZonedDateTime with(java.time.temporal.TemporalField, long);
method public java.time.ZonedDateTime withDayOfMonth(int);
method public java.time.ZonedDateTime withDayOfYear(int);
@@ -62234,17 +62693,27 @@
method public default boolean isSupported(java.time.temporal.TemporalUnit);
method public abstract int lengthOfMonth();
method public default int lengthOfYear();
+ method public default java.time.chrono.ChronoLocalDate minus(java.time.temporal.TemporalAmount);
+ method public default java.time.chrono.ChronoLocalDate minus(long, java.time.temporal.TemporalUnit);
+ method public default java.time.chrono.ChronoLocalDate plus(java.time.temporal.TemporalAmount);
method public default java.time.chrono.ChronoLocalDate plus(long, java.time.temporal.TemporalUnit);
method public static java.util.Comparator<java.time.chrono.ChronoLocalDate> timeLineOrder();
method public default long toEpochDay();
method public abstract java.lang.String toString();
method public abstract long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
method public abstract java.time.chrono.ChronoPeriod until(java.time.chrono.ChronoLocalDate);
+ method public default java.time.chrono.ChronoLocalDate with(java.time.temporal.TemporalAdjuster);
method public default java.time.chrono.ChronoLocalDate with(java.time.temporal.TemporalField, long);
}
abstract class ChronoLocalDateImpl<D extends java.time.chrono.ChronoLocalDate> implements java.time.chrono.ChronoLocalDate java.io.Serializable java.time.temporal.Temporal java.time.temporal.TemporalAdjuster {
+ method public D minus(java.time.temporal.TemporalAmount);
+ method public D minus(long, java.time.temporal.TemporalUnit);
+ method public D plus(java.time.temporal.TemporalAmount);
+ method public D plus(long, java.time.temporal.TemporalUnit);
method public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
+ method public D with(java.time.temporal.TemporalAdjuster);
+ method public D with(java.time.temporal.TemporalField, long);
}
public abstract interface ChronoLocalDateTime<D extends java.time.chrono.ChronoLocalDate> implements java.lang.Comparable java.time.temporal.Temporal java.time.temporal.TemporalAdjuster {
@@ -62261,6 +62730,9 @@
method public default boolean isEqual(java.time.chrono.ChronoLocalDateTime<?>);
method public abstract boolean isSupported(java.time.temporal.TemporalField);
method public default boolean isSupported(java.time.temporal.TemporalUnit);
+ method public default java.time.chrono.ChronoLocalDateTime<D> minus(java.time.temporal.TemporalAmount);
+ method public default java.time.chrono.ChronoLocalDateTime<D> minus(long, java.time.temporal.TemporalUnit);
+ method public default java.time.chrono.ChronoLocalDateTime<D> plus(java.time.temporal.TemporalAmount);
method public abstract java.time.chrono.ChronoLocalDateTime<D> plus(long, java.time.temporal.TemporalUnit);
method public static java.util.Comparator<java.time.chrono.ChronoLocalDateTime<?>> timeLineOrder();
method public default long toEpochSecond(java.time.ZoneOffset);
@@ -62268,6 +62740,7 @@
method public abstract D toLocalDate();
method public abstract java.time.LocalTime toLocalTime();
method public abstract java.lang.String toString();
+ method public default java.time.chrono.ChronoLocalDateTime<D> with(java.time.temporal.TemporalAdjuster);
method public abstract java.time.chrono.ChronoLocalDateTime<D> with(java.time.temporal.TemporalField, long);
}
@@ -62305,6 +62778,9 @@
method public default boolean isEqual(java.time.chrono.ChronoZonedDateTime<?>);
method public abstract boolean isSupported(java.time.temporal.TemporalField);
method public default boolean isSupported(java.time.temporal.TemporalUnit);
+ method public default java.time.chrono.ChronoZonedDateTime<D> minus(java.time.temporal.TemporalAmount);
+ method public default java.time.chrono.ChronoZonedDateTime<D> minus(long, java.time.temporal.TemporalUnit);
+ method public default java.time.chrono.ChronoZonedDateTime<D> plus(java.time.temporal.TemporalAmount);
method public abstract java.time.chrono.ChronoZonedDateTime<D> plus(long, java.time.temporal.TemporalUnit);
method public static java.util.Comparator<java.time.chrono.ChronoZonedDateTime<?>> timeLineOrder();
method public default long toEpochSecond();
@@ -62313,6 +62789,7 @@
method public abstract java.time.chrono.ChronoLocalDateTime<D> toLocalDateTime();
method public default java.time.LocalTime toLocalTime();
method public abstract java.lang.String toString();
+ method public default java.time.chrono.ChronoZonedDateTime<D> with(java.time.temporal.TemporalAdjuster);
method public abstract java.time.chrono.ChronoZonedDateTime<D> with(java.time.temporal.TemporalField, long);
method public abstract java.time.chrono.ChronoZonedDateTime<D> withEarlierOffsetAtOverlap();
method public abstract java.time.chrono.ChronoZonedDateTime<D> withLaterOffsetAtOverlap();
@@ -62379,6 +62856,7 @@
method public java.time.chrono.ChronoLocalDateTime<java.time.chrono.HijrahDate> localDateTime(java.time.temporal.TemporalAccessor);
method public int prolepticYear(java.time.chrono.Era, int);
method public java.time.temporal.ValueRange range(java.time.temporal.ChronoField);
+ method public java.time.chrono.HijrahDate resolveDate(java.util.Map<java.time.temporal.TemporalField, java.lang.Long>, java.time.format.ResolverStyle);
method public java.time.chrono.ChronoZonedDateTime<java.time.chrono.HijrahDate> zonedDateTime(java.time.temporal.TemporalAccessor);
method public java.time.chrono.ChronoZonedDateTime<java.time.chrono.HijrahDate> zonedDateTime(java.time.Instant, java.time.ZoneId);
field public static final java.time.chrono.HijrahChronology INSTANCE;
@@ -62390,23 +62868,24 @@
method public java.time.chrono.HijrahChronology getChronology();
method public java.time.chrono.HijrahEra getEra();
method public long getLong(java.time.temporal.TemporalField);
- method public boolean isLeapYear();
method public int lengthOfMonth();
- method public int lengthOfYear();
+ method public java.time.chrono.HijrahDate minus(java.time.temporal.TemporalAmount);
+ method public java.time.chrono.HijrahDate minus(long, java.time.temporal.TemporalUnit);
method public static java.time.chrono.HijrahDate now();
method public static java.time.chrono.HijrahDate now(java.time.ZoneId);
method public static java.time.chrono.HijrahDate now(java.time.Clock);
method public static java.time.chrono.HijrahDate of(int, int, int);
- method public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
- method public long toEpochDay();
+ method public java.time.chrono.HijrahDate plus(java.time.temporal.TemporalAmount);
+ method public java.time.chrono.HijrahDate plus(long, java.time.temporal.TemporalUnit);
method public java.time.chrono.ChronoPeriod until(java.time.chrono.ChronoLocalDate);
+ method public java.time.chrono.HijrahDate with(java.time.temporal.TemporalField, long);
+ method public java.time.chrono.HijrahDate with(java.time.temporal.TemporalAdjuster);
method public java.time.chrono.HijrahDate withVariant(java.time.chrono.HijrahChronology);
}
public final class HijrahEra extends java.lang.Enum implements java.time.chrono.Era {
method public int getValue();
method public static java.time.chrono.HijrahEra of(int);
- method public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
method public static java.time.chrono.HijrahEra valueOf(java.lang.String);
method public static final java.time.chrono.HijrahEra[] values();
enum_constant public static final java.time.chrono.HijrahEra AH;
@@ -62431,6 +62910,7 @@
method public java.time.Period period(int, int, int);
method public int prolepticYear(java.time.chrono.Era, int);
method public java.time.temporal.ValueRange range(java.time.temporal.ChronoField);
+ method public java.time.LocalDate resolveDate(java.util.Map<java.time.temporal.TemporalField, java.lang.Long>, java.time.format.ResolverStyle);
method public java.time.ZonedDateTime zonedDateTime(java.time.temporal.TemporalAccessor);
method public java.time.ZonedDateTime zonedDateTime(java.time.Instant, java.time.ZoneId);
field public static final java.time.chrono.IsoChronology INSTANCE;
@@ -62463,6 +62943,7 @@
method public java.time.chrono.ChronoLocalDateTime<java.time.chrono.JapaneseDate> localDateTime(java.time.temporal.TemporalAccessor);
method public int prolepticYear(java.time.chrono.Era, int);
method public java.time.temporal.ValueRange range(java.time.temporal.ChronoField);
+ method public java.time.chrono.JapaneseDate resolveDate(java.util.Map<java.time.temporal.TemporalField, java.lang.Long>, java.time.format.ResolverStyle);
method public java.time.chrono.ChronoZonedDateTime<java.time.chrono.JapaneseDate> zonedDateTime(java.time.temporal.TemporalAccessor);
method public java.time.chrono.ChronoZonedDateTime<java.time.chrono.JapaneseDate> zonedDateTime(java.time.Instant, java.time.ZoneId);
field public static final java.time.chrono.JapaneseChronology INSTANCE;
@@ -62474,17 +62955,19 @@
method public java.time.chrono.JapaneseChronology getChronology();
method public java.time.chrono.JapaneseEra getEra();
method public long getLong(java.time.temporal.TemporalField);
- method public boolean isSupported(java.time.temporal.TemporalField);
method public int lengthOfMonth();
- method public int lengthOfYear();
+ method public java.time.chrono.JapaneseDate minus(java.time.temporal.TemporalAmount);
+ method public java.time.chrono.JapaneseDate minus(long, java.time.temporal.TemporalUnit);
method public static java.time.chrono.JapaneseDate now();
method public static java.time.chrono.JapaneseDate now(java.time.ZoneId);
method public static java.time.chrono.JapaneseDate now(java.time.Clock);
method public static java.time.chrono.JapaneseDate of(java.time.chrono.JapaneseEra, int, int, int);
method public static java.time.chrono.JapaneseDate of(int, int, int);
- method public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
- method public long toEpochDay();
+ method public java.time.chrono.JapaneseDate plus(java.time.temporal.TemporalAmount);
+ method public java.time.chrono.JapaneseDate plus(long, java.time.temporal.TemporalUnit);
method public java.time.chrono.ChronoPeriod until(java.time.chrono.ChronoLocalDate);
+ method public java.time.chrono.JapaneseDate with(java.time.temporal.TemporalField, long);
+ method public java.time.chrono.JapaneseDate with(java.time.temporal.TemporalAdjuster);
}
public final class JapaneseEra implements java.time.chrono.Era java.io.Serializable {
@@ -62516,6 +62999,7 @@
method public java.time.chrono.ChronoLocalDateTime<java.time.chrono.MinguoDate> localDateTime(java.time.temporal.TemporalAccessor);
method public int prolepticYear(java.time.chrono.Era, int);
method public java.time.temporal.ValueRange range(java.time.temporal.ChronoField);
+ method public java.time.chrono.MinguoDate resolveDate(java.util.Map<java.time.temporal.TemporalField, java.lang.Long>, java.time.format.ResolverStyle);
method public java.time.chrono.ChronoZonedDateTime<java.time.chrono.MinguoDate> zonedDateTime(java.time.temporal.TemporalAccessor);
method public java.time.chrono.ChronoZonedDateTime<java.time.chrono.MinguoDate> zonedDateTime(java.time.Instant, java.time.ZoneId);
field public static final java.time.chrono.MinguoChronology INSTANCE;
@@ -62528,13 +63012,17 @@
method public java.time.chrono.MinguoEra getEra();
method public long getLong(java.time.temporal.TemporalField);
method public int lengthOfMonth();
+ method public java.time.chrono.MinguoDate minus(java.time.temporal.TemporalAmount);
+ method public java.time.chrono.MinguoDate minus(long, java.time.temporal.TemporalUnit);
method public static java.time.chrono.MinguoDate now();
method public static java.time.chrono.MinguoDate now(java.time.ZoneId);
method public static java.time.chrono.MinguoDate now(java.time.Clock);
method public static java.time.chrono.MinguoDate of(int, int, int);
- method public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
- method public long toEpochDay();
+ method public java.time.chrono.MinguoDate plus(java.time.temporal.TemporalAmount);
+ method public java.time.chrono.MinguoDate plus(long, java.time.temporal.TemporalUnit);
method public java.time.chrono.ChronoPeriod until(java.time.chrono.ChronoLocalDate);
+ method public java.time.chrono.MinguoDate with(java.time.temporal.TemporalField, long);
+ method public java.time.chrono.MinguoDate with(java.time.temporal.TemporalAdjuster);
}
public final class MinguoEra extends java.lang.Enum implements java.time.chrono.Era {
@@ -62564,6 +63052,7 @@
method public java.time.chrono.ChronoLocalDateTime<java.time.chrono.ThaiBuddhistDate> localDateTime(java.time.temporal.TemporalAccessor);
method public int prolepticYear(java.time.chrono.Era, int);
method public java.time.temporal.ValueRange range(java.time.temporal.ChronoField);
+ method public java.time.chrono.ThaiBuddhistDate resolveDate(java.util.Map<java.time.temporal.TemporalField, java.lang.Long>, java.time.format.ResolverStyle);
method public java.time.chrono.ChronoZonedDateTime<java.time.chrono.ThaiBuddhistDate> zonedDateTime(java.time.temporal.TemporalAccessor);
method public java.time.chrono.ChronoZonedDateTime<java.time.chrono.ThaiBuddhistDate> zonedDateTime(java.time.Instant, java.time.ZoneId);
field public static final java.time.chrono.ThaiBuddhistChronology INSTANCE;
@@ -62576,13 +63065,17 @@
method public java.time.chrono.ThaiBuddhistEra getEra();
method public long getLong(java.time.temporal.TemporalField);
method public int lengthOfMonth();
+ method public java.time.chrono.ThaiBuddhistDate minus(java.time.temporal.TemporalAmount);
+ method public java.time.chrono.ThaiBuddhistDate minus(long, java.time.temporal.TemporalUnit);
method public static java.time.chrono.ThaiBuddhistDate now();
method public static java.time.chrono.ThaiBuddhistDate now(java.time.ZoneId);
method public static java.time.chrono.ThaiBuddhistDate now(java.time.Clock);
method public static java.time.chrono.ThaiBuddhistDate of(int, int, int);
- method public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
- method public long toEpochDay();
+ method public java.time.chrono.ThaiBuddhistDate plus(java.time.temporal.TemporalAmount);
+ method public java.time.chrono.ThaiBuddhistDate plus(long, java.time.temporal.TemporalUnit);
method public java.time.chrono.ChronoPeriod until(java.time.chrono.ChronoLocalDate);
+ method public java.time.chrono.ThaiBuddhistDate with(java.time.temporal.TemporalField, long);
+ method public java.time.chrono.ThaiBuddhistDate with(java.time.temporal.TemporalAdjuster);
}
public final class ThaiBuddhistEra extends java.lang.Enum implements java.time.chrono.Era {
@@ -62761,7 +63254,6 @@
method public int checkValidIntValue(long);
method public long checkValidValue(long);
method public java.time.temporal.TemporalUnit getBaseUnit();
- method public java.lang.String getDisplayName(java.util.Locale);
method public long getFrom(java.time.temporal.TemporalAccessor);
method public java.time.temporal.TemporalUnit getRangeUnit();
method public boolean isDateBased();
@@ -62809,7 +63301,6 @@
method public java.time.Duration getDuration();
method public boolean isDateBased();
method public boolean isDurationEstimated();
- method public boolean isSupportedBy(java.time.temporal.Temporal);
method public boolean isTimeBased();
method public static java.time.temporal.ChronoUnit valueOf(java.lang.String);
method public static final java.time.temporal.ChronoUnit[] values();
@@ -63149,7 +63640,6 @@
method public E removeLast();
method public boolean removeLastOccurrence(java.lang.Object);
method public int size();
- method public java.util.Spliterator<E> spliterator();
}
public class ArrayList<E> extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable {
@@ -63160,11 +63650,7 @@
method public void ensureCapacity(int);
method public void forEach(java.util.function.Consumer<? super E>);
method public E get(int);
- method public boolean removeIf(java.util.function.Predicate<? super E>);
- method public void replaceAll(java.util.function.UnaryOperator<E>);
method public int size();
- method public void sort(java.util.Comparator<? super E>);
- method public java.util.Spliterator<E> spliterator();
method public void trimToSize();
}
@@ -63535,6 +64021,7 @@
method public default boolean removeIf(java.util.function.Predicate<? super E>);
method public abstract boolean retainAll(java.util.Collection<?>);
method public abstract int size();
+ method public default java.util.Spliterator<E> spliterator();
method public default java.util.stream.Stream<E> stream();
method public abstract java.lang.Object[] toArray();
method public abstract <T> T[] toArray(T[]);
@@ -63875,18 +64362,7 @@
ctor public HashMap();
ctor public HashMap(java.util.Map<? extends K, ? extends V>);
method public java.lang.Object clone();
- method public V compute(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>);
- method public V computeIfAbsent(K, java.util.function.Function<? super K, ? extends V>);
- method public V computeIfPresent(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>);
method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
- method public void forEach(java.util.function.BiConsumer<? super K, ? super V>);
- method public V getOrDefault(java.lang.Object, V);
- method public V merge(K, V, java.util.function.BiFunction<? super V, ? super V, ? extends V>);
- method public V putIfAbsent(K, V);
- method public boolean remove(java.lang.Object, java.lang.Object);
- method public boolean replace(K, V, V);
- method public V replace(K, V);
- method public void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>);
}
public class HashSet<E> extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable java.util.Set {
@@ -63897,7 +64373,6 @@
method public java.lang.Object clone();
method public java.util.Iterator<E> iterator();
method public int size();
- method public java.util.Spliterator<E> spliterator();
}
public class Hashtable<K, V> extends java.util.Dictionary implements java.lang.Cloneable java.util.Map java.io.Serializable {
@@ -63915,9 +64390,11 @@
method public boolean containsValue(java.lang.Object);
method public synchronized java.util.Enumeration<V> elements();
method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
+ method public synchronized boolean equals(java.lang.Object);
method public synchronized void forEach(java.util.function.BiConsumer<? super K, ? super V>);
method public synchronized V get(java.lang.Object);
method public synchronized V getOrDefault(java.lang.Object, V);
+ method public synchronized int hashCode();
method public synchronized boolean isEmpty();
method public java.util.Set<K> keySet();
method public synchronized java.util.Enumeration<K> keys();
@@ -63932,6 +64409,7 @@
method public synchronized V replace(K, V);
method public synchronized void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>);
method public synchronized int size();
+ method public synchronized java.lang.String toString();
method public java.util.Collection<V> values();
}
@@ -63941,8 +64419,6 @@
ctor public IdentityHashMap(java.util.Map<? extends K, ? extends V>);
method public java.lang.Object clone();
method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
- method public void forEach(java.util.function.BiConsumer<? super K, ? super V>);
- method public void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>);
}
public class IllegalFormatCodePointException extends java.util.IllegalFormatException {
@@ -64053,7 +64529,6 @@
method public E removeLast();
method public boolean removeLastOccurrence(java.lang.Object);
method public int size();
- method public java.util.Spliterator<E> spliterator();
}
public abstract interface List<E> implements java.util.Collection {
@@ -64676,6 +65151,7 @@
ctor public SimpleTimeZone(int, java.lang.String, int, int, int, int, int, int, int, int, int, int, int);
method public int getOffset(int, int, int, int, int, int);
method public int getRawOffset();
+ method public synchronized int hashCode();
method public boolean inDaylightTime(java.util.Date);
method public void setDSTSavings(int);
method public void setEndRule(int, int, int, int);
@@ -64948,7 +65424,6 @@
method public K firstKey();
method public java.util.Map.Entry<K, V> floorEntry(K);
method public K floorKey(K);
- method public void forEach(java.util.function.BiConsumer<? super K, ? super V>);
method public java.util.NavigableMap<K, V> headMap(K, boolean);
method public java.util.SortedMap<K, V> headMap(K);
method public java.util.Map.Entry<K, V> higherEntry(K);
@@ -64960,9 +65435,6 @@
method public java.util.NavigableSet<K> navigableKeySet();
method public java.util.Map.Entry<K, V> pollFirstEntry();
method public java.util.Map.Entry<K, V> pollLastEntry();
- method public boolean replace(K, V, V);
- method public V replace(K, V);
- method public void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>);
method public java.util.NavigableMap<K, V> subMap(K, boolean, K, boolean);
method public java.util.SortedMap<K, V> subMap(K, K);
method public java.util.NavigableMap<K, V> tailMap(K, boolean);
@@ -64990,7 +65462,6 @@
method public E pollFirst();
method public E pollLast();
method public int size();
- method public java.util.Spliterator<E> spliterator();
method public java.util.NavigableSet<E> subSet(E, boolean, E, boolean);
method public java.util.SortedSet<E> subSet(E, E);
method public java.util.NavigableSet<E> tailSet(E, boolean);
@@ -65027,30 +65498,49 @@
ctor public Vector(int);
ctor public Vector();
ctor public Vector(java.util.Collection<? extends E>);
+ method public synchronized boolean add(E);
+ method public synchronized boolean addAll(java.util.Collection<? extends E>);
+ method public synchronized boolean addAll(int, java.util.Collection<? extends E>);
method public synchronized void addElement(E);
method public synchronized int capacity();
method public synchronized java.lang.Object clone();
+ method public synchronized boolean containsAll(java.util.Collection<?>);
method public synchronized void copyInto(java.lang.Object[]);
method public synchronized E elementAt(int);
method public java.util.Enumeration<E> elements();
method public synchronized void ensureCapacity(int);
+ method public synchronized boolean equals(java.lang.Object);
method public synchronized E firstElement();
method public synchronized void forEach(java.util.function.Consumer<? super E>);
method public synchronized E get(int);
+ method public synchronized int hashCode();
method public synchronized int indexOf(java.lang.Object, int);
method public synchronized void insertElementAt(E, int);
+ method public synchronized boolean isEmpty();
+ method public synchronized java.util.Iterator<E> iterator();
method public synchronized E lastElement();
+ method public synchronized int lastIndexOf(java.lang.Object);
method public synchronized int lastIndexOf(java.lang.Object, int);
+ method public synchronized java.util.ListIterator<E> listIterator(int);
+ method public synchronized java.util.ListIterator<E> listIterator();
+ method public synchronized E remove(int);
+ method public synchronized boolean removeAll(java.util.Collection<?>);
method public synchronized void removeAllElements();
method public synchronized boolean removeElement(java.lang.Object);
method public synchronized void removeElementAt(int);
method public synchronized boolean removeIf(java.util.function.Predicate<? super E>);
+ method protected synchronized void removeRange(int, int);
method public synchronized void replaceAll(java.util.function.UnaryOperator<E>);
+ method public synchronized boolean retainAll(java.util.Collection<?>);
+ method public synchronized E set(int, E);
method public synchronized void setElementAt(E, int);
method public synchronized void setSize(int);
method public synchronized int size();
method public synchronized void sort(java.util.Comparator<? super E>);
- method public java.util.Spliterator<E> spliterator();
+ method public synchronized java.util.List<E> subList(int, int);
+ method public synchronized java.lang.Object[] toArray();
+ method public synchronized <T> T[] toArray(T[]);
+ method public synchronized java.lang.String toString();
method public synchronized void trimToSize();
field protected int capacityIncrement;
field protected int elementCount;
@@ -65063,8 +65553,6 @@
ctor public WeakHashMap();
ctor public WeakHashMap(java.util.Map<? extends K, ? extends V>);
method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
- method public void forEach(java.util.function.BiConsumer<? super K, ? super V>);
- method public void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>);
}
}
@@ -65099,7 +65587,6 @@
method public void put(E) throws java.lang.InterruptedException;
method public int remainingCapacity();
method public int size();
- method public java.util.Spliterator<E> spliterator();
method public E take() throws java.lang.InterruptedException;
}
@@ -65290,13 +65777,9 @@
ctor public ConcurrentHashMap(java.util.Map<? extends K, ? extends V>);
ctor public ConcurrentHashMap(int, float);
ctor public ConcurrentHashMap(int, float, int);
- method public V compute(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>);
- method public V computeIfAbsent(K, java.util.function.Function<? super K, ? extends V>);
- method public V computeIfPresent(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>);
method public boolean contains(java.lang.Object);
method public java.util.Enumeration<V> elements();
method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
- method public void forEach(java.util.function.BiConsumer<? super K, ? super V>);
method public void forEach(long, java.util.function.BiConsumer<? super K, ? super V>);
method public <U> void forEach(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.Consumer<? super U>);
method public void forEachEntry(long, java.util.function.Consumer<? super java.util.Map.Entry<K, V>>);
@@ -65305,14 +65788,11 @@
method public <U> void forEachKey(long, java.util.function.Function<? super K, ? extends U>, java.util.function.Consumer<? super U>);
method public void forEachValue(long, java.util.function.Consumer<? super V>);
method public <U> void forEachValue(long, java.util.function.Function<? super V, ? extends U>, java.util.function.Consumer<? super U>);
- method public V getOrDefault(java.lang.Object, V);
method public java.util.concurrent.ConcurrentHashMap.KeySetView<K, V> keySet(V);
method public java.util.Enumeration<K> keys();
method public long mappingCount();
- method public V merge(K, V, java.util.function.BiFunction<? super V, ? super V, ? extends V>);
method public static <K> java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet();
method public static <K> java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet(int);
- method public V putIfAbsent(K, V);
method public <U> U reduce(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>);
method public java.util.Map.Entry<K, V> reduceEntries(long, java.util.function.BiFunction<java.util.Map.Entry<K, V>, java.util.Map.Entry<K, V>, ? extends java.util.Map.Entry<K, V>>);
method public <U> U reduceEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>);
@@ -65332,10 +65812,6 @@
method public double reduceValuesToDouble(long, java.util.function.ToDoubleFunction<? super V>, double, java.util.function.DoubleBinaryOperator);
method public int reduceValuesToInt(long, java.util.function.ToIntFunction<? super V>, int, java.util.function.IntBinaryOperator);
method public long reduceValuesToLong(long, java.util.function.ToLongFunction<? super V>, long, java.util.function.LongBinaryOperator);
- method public boolean remove(java.lang.Object, java.lang.Object);
- method public boolean replace(K, V, V);
- method public V replace(K, V);
- method public void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>);
method public <U> U search(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>);
method public <U> U searchEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>);
method public <U> U searchKeys(long, java.util.function.Function<? super K, ? extends U>);
@@ -65396,7 +65872,6 @@
method public E removeLast();
method public boolean removeLastOccurrence(java.lang.Object);
method public int size();
- method public java.util.Spliterator<E> spliterator();
}
public class ConcurrentLinkedQueue<E> extends java.util.AbstractQueue implements java.util.Queue java.io.Serializable {
@@ -65407,7 +65882,6 @@
method public E peek();
method public E poll();
method public int size();
- method public java.util.Spliterator<E> spliterator();
}
public abstract interface ConcurrentMap<K, V> implements java.util.Map {
@@ -65439,9 +65913,6 @@
method public K ceilingKey(K);
method public java.util.concurrent.ConcurrentSkipListMap<K, V> clone();
method public java.util.Comparator<? super K> comparator();
- method public V compute(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>);
- method public V computeIfAbsent(K, java.util.function.Function<? super K, ? extends V>);
- method public V computeIfPresent(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>);
method public java.util.NavigableSet<K> descendingKeySet();
method public java.util.concurrent.ConcurrentNavigableMap<K, V> descendingMap();
method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
@@ -65449,25 +65920,18 @@
method public K firstKey();
method public java.util.Map.Entry<K, V> floorEntry(K);
method public K floorKey(K);
- method public void forEach(java.util.function.BiConsumer<? super K, ? super V>);
- method public V getOrDefault(java.lang.Object, V);
method public java.util.concurrent.ConcurrentNavigableMap<K, V> headMap(K, boolean);
method public java.util.concurrent.ConcurrentNavigableMap<K, V> headMap(K);
method public java.util.Map.Entry<K, V> higherEntry(K);
method public K higherKey(K);
+ method public java.util.NavigableSet<K> keySet();
method public java.util.Map.Entry<K, V> lastEntry();
method public K lastKey();
method public java.util.Map.Entry<K, V> lowerEntry(K);
method public K lowerKey(K);
- method public V merge(K, V, java.util.function.BiFunction<? super V, ? super V, ? extends V>);
method public java.util.NavigableSet<K> navigableKeySet();
method public java.util.Map.Entry<K, V> pollFirstEntry();
method public java.util.Map.Entry<K, V> pollLastEntry();
- method public V putIfAbsent(K, V);
- method public boolean remove(java.lang.Object, java.lang.Object);
- method public boolean replace(K, V, V);
- method public V replace(K, V);
- method public void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>);
method public java.util.concurrent.ConcurrentNavigableMap<K, V> subMap(K, boolean, K, boolean);
method public java.util.concurrent.ConcurrentNavigableMap<K, V> subMap(K, K);
method public java.util.concurrent.ConcurrentNavigableMap<K, V> tailMap(K, boolean);
@@ -65495,7 +65959,6 @@
method public E pollFirst();
method public E pollLast();
method public int size();
- method public java.util.Spliterator<E> spliterator();
method public java.util.NavigableSet<E> subSet(E, boolean, E, boolean);
method public java.util.NavigableSet<E> subSet(E, E);
method public java.util.NavigableSet<E> tailSet(E, boolean);
@@ -65542,9 +66005,7 @@
ctor public CopyOnWriteArraySet(java.util.Collection<? extends E>);
method public void forEach(java.util.function.Consumer<? super E>);
method public java.util.Iterator<E> iterator();
- method public boolean removeIf(java.util.function.Predicate<? super E>);
method public int size();
- method public java.util.Spliterator<E> spliterator();
}
public class CountDownLatch {
@@ -65703,6 +66164,7 @@
method public java.lang.Thread.UncaughtExceptionHandler getUncaughtExceptionHandler();
method public boolean hasQueuedSubmissions();
method public <T> T invoke(java.util.concurrent.ForkJoinTask<T>);
+ method public <T> java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>);
method public boolean isQuiescent();
method public boolean isShutdown();
method public boolean isTerminated();
@@ -65712,6 +66174,9 @@
method public void shutdown();
method public java.util.List<java.lang.Runnable> shutdownNow();
method public <T> java.util.concurrent.ForkJoinTask<T> submit(java.util.concurrent.ForkJoinTask<T>);
+ method public <T> java.util.concurrent.ForkJoinTask<T> submit(java.util.concurrent.Callable<T>);
+ method public <T> java.util.concurrent.ForkJoinTask<T> submit(java.lang.Runnable, T);
+ method public java.util.concurrent.ForkJoinTask<?> submit(java.lang.Runnable);
field public static final java.util.concurrent.ForkJoinPool.ForkJoinWorkerThreadFactory defaultForkJoinWorkerThreadFactory;
}
@@ -65835,7 +66300,6 @@
method public E removeLast();
method public boolean removeLastOccurrence(java.lang.Object);
method public int size();
- method public java.util.Spliterator<E> spliterator();
method public E take() throws java.lang.InterruptedException;
method public E takeFirst() throws java.lang.InterruptedException;
method public E takeLast() throws java.lang.InterruptedException;
@@ -65856,7 +66320,6 @@
method public void put(E) throws java.lang.InterruptedException;
method public int remainingCapacity();
method public int size();
- method public java.util.Spliterator<E> spliterator();
method public E take() throws java.lang.InterruptedException;
}
@@ -65876,7 +66339,6 @@
method public void put(E);
method public int remainingCapacity();
method public int size();
- method public java.util.Spliterator<E> spliterator();
method public E take() throws java.lang.InterruptedException;
method public void transfer(E) throws java.lang.InterruptedException;
method public boolean tryTransfer(E);
@@ -65924,7 +66386,6 @@
method public void put(E);
method public int remainingCapacity();
method public int size();
- method public java.util.Spliterator<E> spliterator();
method public E take() throws java.lang.InterruptedException;
}
@@ -66028,7 +66489,6 @@
method public void put(E) throws java.lang.InterruptedException;
method public int remainingCapacity();
method public int size();
- method public java.util.Spliterator<E> spliterator();
method public E take() throws java.lang.InterruptedException;
}
@@ -66040,9 +66500,11 @@
method public static java.util.concurrent.ThreadLocalRandom current();
method public double nextDouble(double);
method public double nextDouble(double, double);
+ method public double nextGaussian();
method public int nextInt(int, int);
method public long nextLong(long);
method public long nextLong(long, long);
+ method public void setSeed(long);
}
public class ThreadPoolExecutor extends java.util.concurrent.AbstractExecutorService {
@@ -66056,6 +66518,7 @@
method public boolean awaitTermination(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
method protected void beforeExecute(java.lang.Thread, java.lang.Runnable);
method public void execute(java.lang.Runnable);
+ method protected void finalize();
method public int getActiveCount();
method public long getCompletedTaskCount();
method public int getCorePoolSize();
@@ -66926,8 +67389,11 @@
ctor public JarFile(java.io.File) throws java.io.IOException;
ctor public JarFile(java.io.File, boolean) throws java.io.IOException;
ctor public JarFile(java.io.File, boolean, int) throws java.io.IOException;
+ method public java.util.Enumeration<java.util.jar.JarEntry> entries();
+ method public synchronized java.io.InputStream getInputStream(java.util.zip.ZipEntry) throws java.io.IOException;
method public java.util.jar.JarEntry getJarEntry(java.lang.String);
method public java.util.jar.Manifest getManifest() throws java.io.IOException;
+ method public java.util.stream.Stream<java.util.jar.JarEntry> stream();
field public static final java.lang.String MANIFEST_NAME = "META-INF/MANIFEST.MF";
}
@@ -67007,6 +67473,8 @@
public class ConsoleHandler extends java.util.logging.StreamHandler {
ctor public ConsoleHandler();
+ method public void close();
+ method public void publish(java.util.logging.LogRecord);
}
public class ErrorManager {
@@ -67796,6 +68264,7 @@
method public int deflate(byte[]);
method public int deflate(byte[], int, int, int);
method public void end();
+ method protected void finalize();
method public void finish();
method public boolean finished();
method public int getAdler();
@@ -67828,6 +68297,8 @@
ctor public DeflaterInputStream(java.io.InputStream);
ctor public DeflaterInputStream(java.io.InputStream, java.util.zip.Deflater);
ctor public DeflaterInputStream(java.io.InputStream, java.util.zip.Deflater, int);
+ method public void mark(int);
+ method public void reset() throws java.io.IOException;
field protected final byte[] buf;
field protected final java.util.zip.Deflater def;
}
@@ -67858,6 +68329,7 @@
ctor public GZIPOutputStream(java.io.OutputStream, int, boolean) throws java.io.IOException;
ctor public GZIPOutputStream(java.io.OutputStream) throws java.io.IOException;
ctor public GZIPOutputStream(java.io.OutputStream, boolean) throws java.io.IOException;
+ method public synchronized void write(byte[], int, int) throws java.io.IOException;
field protected java.util.zip.CRC32 crc;
}
@@ -67865,6 +68337,7 @@
ctor public Inflater(boolean);
ctor public Inflater();
method public void end();
+ method protected void finalize();
method public boolean finished();
method public int getAdler();
method public long getBytesRead();
@@ -67991,6 +68464,7 @@
ctor public ZipFile(java.io.File, java.nio.charset.Charset) throws java.io.IOException;
method public void close() throws java.io.IOException;
method public java.util.Enumeration<? extends java.util.zip.ZipEntry> entries();
+ method protected void finalize() throws java.io.IOException;
method public java.lang.String getComment();
method public java.util.zip.ZipEntry getEntry(java.lang.String);
method public java.io.InputStream getInputStream(java.util.zip.ZipEntry) throws java.io.IOException;
@@ -68097,6 +68571,7 @@
method public void setComment(java.lang.String);
method public void setLevel(int);
method public void setMethod(int);
+ method public synchronized void write(byte[], int, int) throws java.io.IOException;
field public static final int CENATT = 36; // 0x24
field public static final int CENATX = 38; // 0x26
field public static final int CENCOM = 32; // 0x20
@@ -68253,6 +68728,7 @@
public class ExemptionMechanism {
ctor protected ExemptionMechanism(javax.crypto.ExemptionMechanismSpi, java.security.Provider, java.lang.String);
+ method protected void finalize();
method public final byte[] genExemptionBlob() throws javax.crypto.ExemptionMechanismException, java.lang.IllegalStateException;
method public final int genExemptionBlob(byte[]) throws javax.crypto.ExemptionMechanismException, java.lang.IllegalStateException, javax.crypto.ShortBufferException;
method public final int genExemptionBlob(byte[], int) throws javax.crypto.ExemptionMechanismException, java.lang.IllegalStateException, javax.crypto.ShortBufferException;
@@ -70641,6 +71117,7 @@
ctor public TransformerException(java.lang.String, java.lang.Throwable);
ctor public TransformerException(java.lang.String, javax.xml.transform.SourceLocator);
ctor public TransformerException(java.lang.String, javax.xml.transform.SourceLocator, java.lang.Throwable);
+ method public java.lang.Throwable getCause();
method public java.lang.Throwable getException();
method public java.lang.String getLocationAsString();
method public javax.xml.transform.SourceLocator getLocator();
@@ -70911,6 +71388,7 @@
public class XPathException extends java.lang.Exception {
ctor public XPathException(java.lang.String);
ctor public XPathException(java.lang.Throwable);
+ method public java.lang.Throwable getCause();
}
public abstract interface XPathExpression {
@@ -71339,6 +71817,8 @@
public class JSONException extends java.lang.Exception {
ctor public JSONException(java.lang.String);
+ ctor public JSONException(java.lang.String, java.lang.Throwable);
+ ctor public JSONException(java.lang.Throwable);
}
public class JSONObject {
diff --git a/api/removed.txt b/api/removed.txt
index 49b72e15..ca34142 100644
--- a/api/removed.txt
+++ b/api/removed.txt
@@ -15,6 +15,7 @@
public class Notification implements android.os.Parcelable {
method public deprecated java.lang.String getChannel();
+ method public static java.lang.Class<? extends android.app.Notification.Style> getNotificationStyleClass(java.lang.String);
method public deprecated long getTimeout();
method public deprecated void setLatestEventInfo(android.content.Context, java.lang.CharSequence, java.lang.CharSequence, android.app.PendingIntent);
}
@@ -266,6 +267,14 @@
}
+package android.net.wifi {
+
+ public class WifiManager {
+ method public deprecated boolean setWifiApEnabled(android.net.wifi.WifiConfiguration, boolean);
+ }
+
+}
+
package android.os {
public class BatteryManager {
@@ -301,18 +310,8 @@
package android.os.storage {
public class StorageManager {
- method public deprecated void allocateBytes(java.io.File, long, int) throws java.io.IOException;
- method public deprecated long getAllocatableBytes(java.io.File, int) throws java.io.IOException;
- method public deprecated long getCacheQuotaBytes(java.io.File) throws java.io.IOException;
- method public deprecated long getCacheQuotaBytes() throws java.io.IOException;
- method public deprecated long getCacheSizeBytes(java.io.File) throws java.io.IOException;
- method public deprecated long getCacheSizeBytes() throws java.io.IOException;
- method public deprecated long getExternalCacheQuotaBytes() throws java.io.IOException;
- method public deprecated long getExternalCacheSizeBytes() throws java.io.IOException;
method public android.os.storage.StorageVolume getPrimaryVolume();
method public android.os.storage.StorageVolume[] getVolumeList();
- method public deprecated boolean isCacheBehaviorAtomic(java.io.File) throws java.io.IOException;
- method public deprecated void setCacheBehaviorAtomic(java.io.File, boolean) throws java.io.IOException;
}
}
@@ -451,6 +450,26 @@
}
+package android.service.notification {
+
+ public abstract class NotificationListenerService extends android.app.Service {
+ method public android.service.notification.StatusBarNotification[] getActiveNotifications(int);
+ method public android.service.notification.StatusBarNotification[] getActiveNotifications(java.lang.String[], int);
+ method public void registerAsSystemService(android.content.Context, android.content.ComponentName, int) throws android.os.RemoteException;
+ method public final void setOnNotificationPostedTrim(int);
+ method public final void snoozeNotification(java.lang.String, java.lang.String);
+ method public void unregisterAsSystemService() throws android.os.RemoteException;
+ field public static final int TRIM_FULL = 0; // 0x0
+ field public static final int TRIM_LIGHT = 1; // 0x1
+ }
+
+ public static class NotificationListenerService.Ranking {
+ method public java.util.List<java.lang.String> getAdditionalPeople();
+ method public java.util.List<android.service.notification.SnoozeCriterion> getSnoozeCriteria();
+ }
+
+}
+
package android.speech.tts {
public abstract class UtteranceProgressListener {
diff --git a/api/system-current.txt b/api/system-current.txt
index 00b97a7..57bf4b4 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -6,12 +6,13 @@
public static final class Manifest.permission {
ctor public Manifest.permission();
+ field public static final java.lang.String ACCESS_BROADCAST_RADIO = "android.permission.ACCESS_BROADCAST_RADIO";
field public static final java.lang.String ACCESS_CACHE_FILESYSTEM = "android.permission.ACCESS_CACHE_FILESYSTEM";
field public static final java.lang.String ACCESS_CHECKIN_PROPERTIES = "android.permission.ACCESS_CHECKIN_PROPERTIES";
field public static final java.lang.String ACCESS_COARSE_LOCATION = "android.permission.ACCESS_COARSE_LOCATION";
field public static final java.lang.String ACCESS_DRM_CERTIFICATES = "android.permission.ACCESS_DRM_CERTIFICATES";
field public static final java.lang.String ACCESS_FINE_LOCATION = "android.permission.ACCESS_FINE_LOCATION";
- field public static final java.lang.String ACCESS_FM_RADIO = "android.permission.ACCESS_FM_RADIO";
+ field public static final deprecated java.lang.String ACCESS_FM_RADIO = "android.permission.ACCESS_FM_RADIO";
field public static final java.lang.String ACCESS_LOCATION_EXTRA_COMMANDS = "android.permission.ACCESS_LOCATION_EXTRA_COMMANDS";
field public static final java.lang.String ACCESS_MOCK_LOCATION = "android.permission.ACCESS_MOCK_LOCATION";
field public static final java.lang.String ACCESS_MTP = "android.permission.ACCESS_MTP";
@@ -22,6 +23,7 @@
field public static final java.lang.String ACCESS_SURFACE_FLINGER = "android.permission.ACCESS_SURFACE_FLINGER";
field public static final java.lang.String ACCESS_WIFI_STATE = "android.permission.ACCESS_WIFI_STATE";
field public static final java.lang.String ACCOUNT_MANAGER = "android.permission.ACCOUNT_MANAGER";
+ field public static final java.lang.String ACTIVITY_EMBEDDING = "android.permission.ACTIVITY_EMBEDDING";
field public static final java.lang.String ADD_VOICEMAIL = "com.android.voicemail.permission.ADD_VOICEMAIL";
field public static final java.lang.String ALLOCATE_AGGRESSIVE = "android.permission.ALLOCATE_AGGRESSIVE";
field public static final java.lang.String ALLOW_ANY_CODEC_FOR_PLAYBACK = "android.permission.ALLOW_ANY_CODEC_FOR_PLAYBACK";
@@ -120,6 +122,7 @@
field public static final java.lang.String GRANT_RUNTIME_PERMISSIONS = "android.permission.GRANT_RUNTIME_PERMISSIONS";
field public static final java.lang.String HARDWARE_TEST = "android.permission.HARDWARE_TEST";
field public static final java.lang.String HDMI_CEC = "android.permission.HDMI_CEC";
+ field public static final java.lang.String HIDE_NON_SYSTEM_OVERLAY_WINDOWS = "android.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS";
field public static final java.lang.String INJECT_EVENTS = "android.permission.INJECT_EVENTS";
field public static final java.lang.String INSTALL_GRANT_RUNTIME_PERMISSIONS = "android.permission.INSTALL_GRANT_RUNTIME_PERMISSIONS";
field public static final java.lang.String INSTALL_LOCATION_PROVIDER = "android.permission.INSTALL_LOCATION_PROVIDER";
@@ -156,7 +159,7 @@
field public static final java.lang.String MODIFY_AUDIO_SETTINGS = "android.permission.MODIFY_AUDIO_SETTINGS";
field public static final java.lang.String MODIFY_CELL_BROADCASTS = "android.permission.MODIFY_CELL_BROADCASTS";
field public static final java.lang.String MODIFY_DAY_NIGHT_MODE = "android.permission.MODIFY_DAY_NIGHT_MODE";
- field public static final java.lang.String MODIFY_NETWORK_ACCOUNTING = "android.permission.MODIFY_NETWORK_ACCOUNTING";
+ field public static final deprecated java.lang.String MODIFY_NETWORK_ACCOUNTING = "android.permission.MODIFY_NETWORK_ACCOUNTING";
field public static final java.lang.String MODIFY_PARENTAL_CONTROLS = "android.permission.MODIFY_PARENTAL_CONTROLS";
field public static final java.lang.String MODIFY_PHONE_STATE = "android.permission.MODIFY_PHONE_STATE";
field public static final java.lang.String MOUNT_FORMAT_FILESYSTEMS = "android.permission.MOUNT_FORMAT_FILESYSTEMS";
@@ -178,6 +181,7 @@
field public static final java.lang.String READ_CALENDAR = "android.permission.READ_CALENDAR";
field public static final java.lang.String READ_CALL_LOG = "android.permission.READ_CALL_LOG";
field public static final java.lang.String READ_CONTACTS = "android.permission.READ_CONTACTS";
+ field public static final java.lang.String READ_CONTENT_RATING_SYSTEMS = "android.permission.READ_CONTENT_RATING_SYSTEMS";
field public static final java.lang.String READ_DREAM_STATE = "android.permission.READ_DREAM_STATE";
field public static final java.lang.String READ_EXTERNAL_STORAGE = "android.permission.READ_EXTERNAL_STORAGE";
field public static final java.lang.String READ_FRAME_BUFFER = "android.permission.READ_FRAME_BUFFER";
@@ -188,6 +192,8 @@
field public static final java.lang.String READ_OEM_UNLOCK_STATE = "android.permission.READ_OEM_UNLOCK_STATE";
field public static final java.lang.String READ_PHONE_NUMBERS = "android.permission.READ_PHONE_NUMBERS";
field public static final java.lang.String READ_PHONE_STATE = "android.permission.READ_PHONE_STATE";
+ field public static final java.lang.String READ_PRINT_SERVICES = "android.permission.READ_PRINT_SERVICES";
+ field public static final java.lang.String READ_PRINT_SERVICE_RECOMMENDATIONS = "android.permission.READ_PRINT_SERVICE_RECOMMENDATIONS";
field public static final java.lang.String READ_PRIVILEGED_PHONE_STATE = "android.permission.READ_PRIVILEGED_PHONE_STATE";
field public static final java.lang.String READ_SEARCH_INDEXABLES = "android.permission.READ_SEARCH_INDEXABLES";
field public static final java.lang.String READ_SMS = "android.permission.READ_SMS";
@@ -221,6 +227,7 @@
field public static final java.lang.String RETRIEVE_WINDOW_CONTENT = "android.permission.RETRIEVE_WINDOW_CONTENT";
field public static final java.lang.String REVOKE_RUNTIME_PERMISSIONS = "android.permission.REVOKE_RUNTIME_PERMISSIONS";
field public static final java.lang.String SCORE_NETWORKS = "android.permission.SCORE_NETWORKS";
+ field public static final java.lang.String SEND_EMBMS_INTENTS = "android.permission.SEND_EMBMS_INTENTS";
field public static final java.lang.String SEND_RESPOND_VIA_MESSAGE = "android.permission.SEND_RESPOND_VIA_MESSAGE";
field public static final java.lang.String SEND_SMS = "android.permission.SEND_SMS";
field public static final java.lang.String SEND_SMS_NO_CONFIRMATION = "android.permission.SEND_SMS_NO_CONFIRMATION";
@@ -509,6 +516,7 @@
field public static final int childIndicatorRight = 16843024; // 0x1010110
field public static final int childIndicatorStart = 16843731; // 0x10103d3
field public static final int choiceMode = 16843051; // 0x101012b
+ field public static final int classLoader = 16844139; // 0x101056b
field public static final int clearTaskOnLaunch = 16842773; // 0x1010015
field public static final int clickable = 16842981; // 0x10100e5
field public static final int clipChildren = 16842986; // 0x10100ea
@@ -1307,6 +1315,7 @@
field public static final int showSilent = 16843259; // 0x10101fb
field public static final int showText = 16843949; // 0x10104ad
field public static final deprecated int showWeekNumber = 16843582; // 0x101033e
+ field public static final int showWhenLocked = 16844137; // 0x1010569
field public static final deprecated int shownWeekCount = 16843585; // 0x1010341
field public static final int shrinkColumns = 16843082; // 0x101014a
field public static final deprecated int singleLine = 16843101; // 0x101015d
@@ -1565,6 +1574,7 @@
field public static final int trimPathOffset = 16843786; // 0x101040a
field public static final int trimPathStart = 16843784; // 0x1010408
field public static final int tunerCount = 16844061; // 0x101051d
+ field public static final int turnScreenOn = 16844138; // 0x101056a
field public static final int type = 16843169; // 0x10101a1
field public static final int typeface = 16842902; // 0x1010096
field public static final int uiOptions = 16843672; // 0x1010398
@@ -2064,6 +2074,7 @@
field public static final int VideoView_error_text_invalid_progressive_playback = 17039381; // 0x1040015
field public static final int VideoView_error_text_unknown = 17039377; // 0x1040011
field public static final int VideoView_error_title = 17039378; // 0x1040012
+ field public static final int autofill = 17039386; // 0x104001a
field public static final int cancel = 17039360; // 0x1040000
field public static final int copy = 17039361; // 0x1040001
field public static final int copyUrl = 17039362; // 0x1040002
@@ -3293,6 +3304,7 @@
public final class AnimatorSet extends android.animation.Animator {
ctor public AnimatorSet();
+ method public android.animation.AnimatorSet clone();
method public java.util.ArrayList<android.animation.Animator> getChildAnimations();
method public long getCurrentPlayTime();
method public long getDuration();
@@ -3411,6 +3423,7 @@
public final class ObjectAnimator extends android.animation.ValueAnimator {
ctor public ObjectAnimator();
+ method public android.animation.ObjectAnimator clone();
method public java.lang.String getPropertyName();
method public java.lang.Object getTarget();
method public static android.animation.ObjectAnimator ofArgb(java.lang.Object, java.lang.String, int...);
@@ -3436,6 +3449,7 @@
method public static <T, V> android.animation.ObjectAnimator ofObject(T, android.util.Property<T, V>, android.animation.TypeConverter<android.graphics.PointF, V>, android.graphics.Path);
method public static android.animation.ObjectAnimator ofPropertyValuesHolder(java.lang.Object, android.animation.PropertyValuesHolder...);
method public void setAutoCancel(boolean);
+ method public android.animation.ObjectAnimator setDuration(long);
method public void setProperty(android.util.Property);
method public void setPropertyName(java.lang.String);
}
@@ -3517,6 +3531,7 @@
ctor public ValueAnimator();
method public void addUpdateListener(android.animation.ValueAnimator.AnimatorUpdateListener);
method public static boolean areAnimatorsEnabled();
+ method public android.animation.ValueAnimator clone();
method public float getAnimatedFraction();
method public java.lang.Object getAnimatedValue();
method public java.lang.Object getAnimatedValue(java.lang.String);
@@ -3895,10 +3910,12 @@
method public final void setResult(int);
method public final void setResult(int, android.content.Intent);
method public final deprecated void setSecondaryProgress(int);
+ method public void setShowWhenLocked(boolean);
method public void setTaskDescription(android.app.ActivityManager.TaskDescription);
method public void setTitle(java.lang.CharSequence);
method public void setTitle(int);
method public deprecated void setTitleColor(int);
+ method public void setTurnScreenOn(boolean);
method public void setVisible(boolean);
method public final void setVolumeControlStream(int);
method public void setVrModeEnabled(boolean, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
@@ -4359,6 +4376,12 @@
public class Application extends android.content.ContextWrapper implements android.content.ComponentCallbacks2 {
ctor public Application();
+ method public android.app.Activity instantiateActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent);
+ method public android.app.backup.BackupAgent instantiateBackupAgent(java.lang.ClassLoader, java.lang.String);
+ method public android.app.Instrumentation instantiateInstrumentation(java.lang.ClassLoader, java.lang.String);
+ method public android.content.ContentProvider instantiateProvider(java.lang.ClassLoader, java.lang.String);
+ method public android.content.BroadcastReceiver instantiateReceiver(java.lang.ClassLoader, java.lang.String, android.content.Intent);
+ method public android.app.Service instantiateService(java.lang.ClassLoader, java.lang.String, android.content.Intent);
method public void onConfigurationChanged(android.content.res.Configuration);
method public void onCreate();
method public void onLowMemory();
@@ -5141,6 +5164,7 @@
ctor public IntentService(java.lang.String);
method public android.os.IBinder onBind(android.content.Intent);
method protected abstract void onHandleIntent(android.content.Intent);
+ method public void onStart(android.content.Intent, int);
method public void setIntentRedelivery(boolean);
}
@@ -5798,6 +5822,7 @@
method public java.util.List<android.app.NotificationChannelGroup> getNotificationChannelGroups();
method public java.util.List<android.app.NotificationChannel> getNotificationChannels();
method public android.app.NotificationManager.Policy getNotificationPolicy();
+ method public boolean isNotificationListenerAccessGranted(android.content.ComponentName);
method public boolean isNotificationPolicyAccessGranted();
method public void notify(int, android.app.Notification);
method public void notify(java.lang.String, int, android.app.Notification);
@@ -6681,6 +6706,7 @@
field public static final java.lang.String ACTION_SET_NEW_PASSWORD = "android.app.action.SET_NEW_PASSWORD";
field public static final java.lang.String ACTION_SET_PROFILE_OWNER = "android.app.action.SET_PROFILE_OWNER";
field public static final java.lang.String ACTION_START_ENCRYPTION = "android.app.action.START_ENCRYPTION";
+ field public static final java.lang.String ACTION_STATE_USER_SETUP_COMPLETE = "android.app.action.STATE_USER_SETUP_COMPLETE";
field public static final java.lang.String ACTION_SYSTEM_UPDATE_POLICY_CHANGED = "android.app.action.SYSTEM_UPDATE_POLICY_CHANGED";
field public static final java.lang.String DELEGATION_APP_RESTRICTIONS = "delegation-app-restrictions";
field public static final java.lang.String DELEGATION_BLOCK_UNINSTALL = "delegation-block-uninstall";
@@ -11197,6 +11223,7 @@
method public void setDontKillApp(boolean);
method public void setGrantedRuntimePermissions(java.lang.String[]);
method public void setInstallAsInstantApp(boolean);
+ method public void setInstallAsVirtualPreload();
method public void setInstallLocation(int);
method public void setInstallReason(int);
method public void setOriginatingUid(int);
@@ -11337,6 +11364,7 @@
method public abstract java.util.List<android.content.pm.ResolveInfo> queryIntentContentProviders(android.content.Intent, int);
method public abstract java.util.List<android.content.pm.ResolveInfo> queryIntentServices(android.content.Intent, int);
method public abstract java.util.List<android.content.pm.PermissionInfo> queryPermissionsByGroup(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public abstract void registerDexModule(java.lang.String, android.content.pm.PackageManager.DexModuleRegisterCallback);
method public abstract void removeOnPermissionsChangeListener(android.content.pm.PackageManager.OnPermissionsChangedListener);
method public abstract deprecated void removePackageFromPreferred(java.lang.String);
method public abstract void removePermission(java.lang.String);
@@ -11376,6 +11404,7 @@
field public static final java.lang.String FEATURE_BACKUP = "android.software.backup";
field public static final java.lang.String FEATURE_BLUETOOTH = "android.hardware.bluetooth";
field public static final java.lang.String FEATURE_BLUETOOTH_LE = "android.hardware.bluetooth_le";
+ field public static final java.lang.String FEATURE_BROADCAST_RADIO = "android.hardware.broadcastradio";
field public static final java.lang.String FEATURE_CAMERA = "android.hardware.camera";
field public static final java.lang.String FEATURE_CAMERA_ANY = "android.hardware.camera.any";
field public static final java.lang.String FEATURE_CAMERA_AUTOFOCUS = "android.hardware.camera.autofocus";
@@ -11415,6 +11444,7 @@
field public static final java.lang.String FEATURE_NFC_HOST_CARD_EMULATION = "android.hardware.nfc.hce";
field public static final java.lang.String FEATURE_NFC_HOST_CARD_EMULATION_NFCF = "android.hardware.nfc.hcef";
field public static final java.lang.String FEATURE_OPENGLES_EXTENSION_PACK = "android.hardware.opengles.aep";
+ field public static final java.lang.String FEATURE_PC = "android.hardware.type.pc";
field public static final java.lang.String FEATURE_PICTURE_IN_PICTURE = "android.software.picture_in_picture";
field public static final java.lang.String FEATURE_PRINTING = "android.software.print";
field public static final java.lang.String FEATURE_SCREEN_LANDSCAPE = "android.hardware.screen.landscape";
@@ -11457,6 +11487,7 @@
field public static final java.lang.String FEATURE_WIFI = "android.hardware.wifi";
field public static final java.lang.String FEATURE_WIFI_AWARE = "android.hardware.wifi.aware";
field public static final java.lang.String FEATURE_WIFI_DIRECT = "android.hardware.wifi.direct";
+ field public static final java.lang.String FEATURE_WIFI_PASSPOINT = "android.hardware.wifi.passpoint";
field public static final int FLAG_PERMISSION_GRANTED_BY_DEFAULT = 32; // 0x20
field public static final int FLAG_PERMISSION_POLICY_FIXED = 4; // 0x4
field public static final int FLAG_PERMISSION_REVIEW_REQUIRED = 64; // 0x40
@@ -11556,6 +11587,11 @@
field public static final int VERSION_CODE_HIGHEST = -1; // 0xffffffff
}
+ public static abstract class PackageManager.DexModuleRegisterCallback {
+ ctor public PackageManager.DexModuleRegisterCallback();
+ method public abstract void onDexModuleRegistered(java.lang.String, boolean, java.lang.String);
+ }
+
public static class PackageManager.NameNotFoundException extends android.util.AndroidException {
ctor public PackageManager.NameNotFoundException();
ctor public PackageManager.NameNotFoundException(java.lang.String);
@@ -11841,6 +11877,7 @@
public static class AssetFileDescriptor.AutoCloseInputStream extends android.os.ParcelFileDescriptor.AutoCloseInputStream {
ctor public AssetFileDescriptor.AutoCloseInputStream(android.content.res.AssetFileDescriptor) throws java.io.IOException;
+ method public void mark(int);
}
public static class AssetFileDescriptor.AutoCloseOutputStream extends android.os.ParcelFileDescriptor.AutoCloseOutputStream {
@@ -12148,6 +12185,7 @@
method public void copyStringToBuffer(int, android.database.CharArrayBuffer);
method public void deactivate();
method public void fillWindow(int, android.database.CursorWindow);
+ method protected void finalize();
method public byte[] getBlob(int);
method public int getColumnCount();
method public int getColumnIndex(java.lang.String);
@@ -12629,6 +12667,7 @@
method public void beginTransactionWithListenerNonExclusive(android.database.sqlite.SQLiteTransactionListener);
method public android.database.sqlite.SQLiteStatement compileStatement(java.lang.String) throws android.database.SQLException;
method public static android.database.sqlite.SQLiteDatabase create(android.database.sqlite.SQLiteDatabase.CursorFactory);
+ method public static android.database.sqlite.SQLiteDatabase createInMemory(android.database.sqlite.SQLiteDatabase.OpenParams);
method public int delete(java.lang.String, java.lang.String, java.lang.String[]);
method public static boolean deleteDatabase(java.io.File);
method public void disableWriteAheadLogging();
@@ -12658,6 +12697,7 @@
method public boolean needUpgrade(int);
method protected void onAllReferencesReleased();
method public static android.database.sqlite.SQLiteDatabase openDatabase(java.lang.String, android.database.sqlite.SQLiteDatabase.CursorFactory, int);
+ method public static android.database.sqlite.SQLiteDatabase openDatabase(java.lang.String, android.database.sqlite.SQLiteDatabase.OpenParams);
method public static android.database.sqlite.SQLiteDatabase openDatabase(java.lang.String, android.database.sqlite.SQLiteDatabase.CursorFactory, int, android.database.DatabaseErrorHandler);
method public static android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.io.File, android.database.sqlite.SQLiteDatabase.CursorFactory);
method public static android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, android.database.sqlite.SQLiteDatabase.CursorFactory);
@@ -12708,6 +12748,26 @@
method public abstract android.database.Cursor newCursor(android.database.sqlite.SQLiteDatabase, android.database.sqlite.SQLiteCursorDriver, java.lang.String, android.database.sqlite.SQLiteQuery);
}
+ public static final class SQLiteDatabase.OpenParams {
+ method public android.database.sqlite.SQLiteDatabase.CursorFactory getCursorFactory();
+ method public android.database.DatabaseErrorHandler getErrorHandler();
+ method public int getLookasideSlotCount();
+ method public int getLookasideSlotSize();
+ method public int getOpenFlags();
+ }
+
+ public static final class SQLiteDatabase.OpenParams.Builder {
+ ctor public SQLiteDatabase.OpenParams.Builder();
+ ctor public SQLiteDatabase.OpenParams.Builder(android.database.sqlite.SQLiteDatabase.OpenParams);
+ method public android.database.sqlite.SQLiteDatabase.OpenParams.Builder addOpenFlags(int);
+ method public android.database.sqlite.SQLiteDatabase.OpenParams build();
+ method public android.database.sqlite.SQLiteDatabase.OpenParams.Builder removeOpenFlags(int);
+ method public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setCursorFactory(android.database.sqlite.SQLiteDatabase.CursorFactory);
+ method public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setErrorHandler(android.database.DatabaseErrorHandler);
+ method public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setLookasideConfig(int, int);
+ method public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setOpenFlags(int);
+ }
+
public class SQLiteDatabaseCorruptException extends android.database.sqlite.SQLiteException {
ctor public SQLiteDatabaseCorruptException();
ctor public SQLiteDatabaseCorruptException(java.lang.String);
@@ -12761,6 +12821,7 @@
method public void onDowngrade(android.database.sqlite.SQLiteDatabase, int, int);
method public void onOpen(android.database.sqlite.SQLiteDatabase);
method public abstract void onUpgrade(android.database.sqlite.SQLiteDatabase, int, int);
+ method public void setLookasideConfig(int, int);
method public void setWriteAheadLoggingEnabled(boolean);
}
@@ -14622,6 +14683,7 @@
method public void scheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable, long);
method public void setAlpha(int);
method public void setColorFilter(android.graphics.ColorFilter);
+ method public void setDither(boolean);
method public void setOpacity(int);
method public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);
}
@@ -14702,6 +14764,7 @@
method public void setAlpha(int);
method public void setAntiAlias(boolean);
method public void setColorFilter(android.graphics.ColorFilter);
+ method public void setDither(boolean);
method public void setGravity(int);
method public void setMipMap(boolean);
method public void setTargetDensity(android.graphics.Canvas);
@@ -14827,6 +14890,7 @@
method public void setAlpha(int);
method public void setColorFilter(android.graphics.ColorFilter);
method protected void setConstantState(android.graphics.drawable.DrawableContainer.DrawableContainerState);
+ method public void setDither(boolean);
method public void setEnterFadeDuration(int);
method public void setExitFadeDuration(int);
method public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);
@@ -14893,6 +14957,7 @@
method public void setColors(int[]);
method public void setCornerRadii(float[]);
method public void setCornerRadius(float);
+ method public void setDither(boolean);
method public void setGradientCenter(float, float);
method public void setGradientRadius(float);
method public void setGradientType(int);
@@ -14987,6 +15052,7 @@
method public void scheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable, long);
method public void setAlpha(int);
method public void setColorFilter(android.graphics.ColorFilter);
+ method public void setDither(boolean);
method public void setDrawable(int, android.graphics.drawable.Drawable);
method public boolean setDrawableByLayerId(int, android.graphics.drawable.Drawable);
method public void setId(int, int);
@@ -15027,6 +15093,7 @@
method public android.graphics.Paint getPaint();
method public void setAlpha(int);
method public void setColorFilter(android.graphics.ColorFilter);
+ method public void setDither(boolean);
method public void setTargetDensity(android.graphics.Canvas);
method public void setTargetDensity(android.util.DisplayMetrics);
method public void setTargetDensity(int);
@@ -15089,6 +15156,7 @@
method protected void onDraw(android.graphics.drawable.shapes.Shape, android.graphics.Canvas, android.graphics.Paint);
method public void setAlpha(int);
method public void setColorFilter(android.graphics.ColorFilter);
+ method public void setDither(boolean);
method public void setIntrinsicHeight(int);
method public void setIntrinsicWidth(int);
method public void setPadding(int, int, int, int);
@@ -15130,27 +15198,32 @@
public class ArcShape extends android.graphics.drawable.shapes.RectShape {
ctor public ArcShape(float, float);
+ method public android.graphics.drawable.shapes.ArcShape clone() throws java.lang.CloneNotSupportedException;
method public final float getStartAngle();
method public final float getSweepAngle();
}
public class OvalShape extends android.graphics.drawable.shapes.RectShape {
ctor public OvalShape();
+ method public android.graphics.drawable.shapes.OvalShape clone() throws java.lang.CloneNotSupportedException;
}
public class PathShape extends android.graphics.drawable.shapes.Shape {
ctor public PathShape(android.graphics.Path, float, float);
+ method public android.graphics.drawable.shapes.PathShape clone() throws java.lang.CloneNotSupportedException;
method public void draw(android.graphics.Canvas, android.graphics.Paint);
}
public class RectShape extends android.graphics.drawable.shapes.Shape {
ctor public RectShape();
+ method public android.graphics.drawable.shapes.RectShape clone() throws java.lang.CloneNotSupportedException;
method public void draw(android.graphics.Canvas, android.graphics.Paint);
method protected final android.graphics.RectF rect();
}
public class RoundRectShape extends android.graphics.drawable.shapes.RectShape {
ctor public RoundRectShape(float[], android.graphics.RectF, float[]);
+ method public android.graphics.drawable.shapes.RoundRectShape clone() throws java.lang.CloneNotSupportedException;
}
public abstract class Shape implements java.lang.Cloneable {
@@ -15235,6 +15308,7 @@
method public final void autoFocus(android.hardware.Camera.AutoFocusCallback);
method public final void cancelAutoFocus();
method public final boolean enableShutterSound(boolean);
+ method protected void finalize();
method public static void getCameraInfo(int, android.hardware.Camera.CameraInfo);
method public static int getNumberOfCameras();
method public android.hardware.Camera.Parameters getParameters();
@@ -15852,6 +15926,7 @@
method public <T> T get(android.hardware.camera2.CameraCharacteristics.Key<T>);
method public java.util.List<android.hardware.camera2.CaptureRequest.Key<?>> getAvailableCaptureRequestKeys();
method public java.util.List<android.hardware.camera2.CaptureResult.Key<?>> getAvailableCaptureResultKeys();
+ method public java.util.List<android.hardware.camera2.CameraCharacteristics.Key<?>> getKeys();
field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES;
field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AE_AVAILABLE_ANTIBANDING_MODES;
field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AE_AVAILABLE_MODES;
@@ -16212,6 +16287,7 @@
public final class CaptureRequest extends android.hardware.camera2.CameraMetadata implements android.os.Parcelable {
method public int describeContents();
method public <T> T get(android.hardware.camera2.CaptureRequest.Key<T>);
+ method public java.util.List<android.hardware.camera2.CaptureRequest.Key<?>> getKeys();
method public java.lang.Object getTag();
method public boolean isReprocess();
method public void writeToParcel(android.os.Parcel, int);
@@ -16290,6 +16366,7 @@
public class CaptureResult extends android.hardware.camera2.CameraMetadata {
method public <T> T get(android.hardware.camera2.CaptureResult.Key<T>);
method public long getFrameNumber();
+ method public java.util.List<android.hardware.camera2.CaptureResult.Key<?>> getKeys();
method public android.hardware.camera2.CaptureRequest getRequest();
method public int getSequenceId();
field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Boolean> BLACK_LEVEL_LOCK;
@@ -16588,9 +16665,12 @@
field public static final int FINGERPRINT_ERROR_CANCELED = 5; // 0x5
field public static final int FINGERPRINT_ERROR_HW_UNAVAILABLE = 1; // 0x1
field public static final int FINGERPRINT_ERROR_LOCKOUT = 7; // 0x7
+ field public static final int FINGERPRINT_ERROR_LOCKOUT_PERMANENT = 9; // 0x9
field public static final int FINGERPRINT_ERROR_NO_SPACE = 4; // 0x4
field public static final int FINGERPRINT_ERROR_TIMEOUT = 3; // 0x3
field public static final int FINGERPRINT_ERROR_UNABLE_TO_PROCESS = 2; // 0x2
+ field public static final int FINGERPRINT_ERROR_UNABLE_TO_REMOVE = 6; // 0x6
+ field public static final int FINGERPRINT_ERROR_VENDOR = 8; // 0x8
}
public static abstract class FingerprintManager.AuthenticationCallback {
@@ -17140,6 +17220,64 @@
package android.hardware.radio {
+ public final class ProgramSelector implements android.os.Parcelable {
+ ctor public ProgramSelector(int, android.hardware.radio.ProgramSelector.Identifier, android.hardware.radio.ProgramSelector.Identifier[], long[]);
+ method public static android.hardware.radio.ProgramSelector createAmFmSelector(int, int);
+ method public static android.hardware.radio.ProgramSelector createAmFmSelector(int, int, int);
+ method public int describeContents();
+ method public android.hardware.radio.ProgramSelector.Identifier[] getAllIds(int);
+ method public long getFirstId(int);
+ method public android.hardware.radio.ProgramSelector.Identifier getPrimaryId();
+ method public int getProgramType();
+ method public android.hardware.radio.ProgramSelector.Identifier[] getSecondaryIds();
+ method public long[] getVendorIds();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.hardware.radio.ProgramSelector> CREATOR;
+ field public static final int IDENTIFIER_TYPE_AMFM_FREQUENCY = 1; // 0x1
+ field public static final int IDENTIFIER_TYPE_DAB_ENSEMBLE = 6; // 0x6
+ field public static final int IDENTIFIER_TYPE_DAB_FREQUENCY = 8; // 0x8
+ field public static final int IDENTIFIER_TYPE_DAB_SCID = 7; // 0x7
+ field public static final int IDENTIFIER_TYPE_DAB_SIDECC = 5; // 0x5
+ field public static final int IDENTIFIER_TYPE_DRMO_FREQUENCY = 10; // 0xa
+ field public static final int IDENTIFIER_TYPE_DRMO_MODULATION = 11; // 0xb
+ field public static final int IDENTIFIER_TYPE_DRMO_SERVICE_ID = 9; // 0x9
+ field public static final int IDENTIFIER_TYPE_HD_STATION_ID_EXT = 3; // 0x3
+ field public static final int IDENTIFIER_TYPE_HD_SUBCHANNEL = 4; // 0x4
+ field public static final int IDENTIFIER_TYPE_RDS_PI = 2; // 0x2
+ field public static final int IDENTIFIER_TYPE_SXM_CHANNEL = 13; // 0xd
+ field public static final int IDENTIFIER_TYPE_SXM_SERVICE_ID = 12; // 0xc
+ field public static final int IDENTIFIER_TYPE_VENDOR1_PRIMARY = 14; // 0xe
+ field public static final int IDENTIFIER_TYPE_VENDOR2_PRIMARY = 15; // 0xf
+ field public static final int IDENTIFIER_TYPE_VENDOR3_PRIMARY = 16; // 0x10
+ field public static final int IDENTIFIER_TYPE_VENDOR4_PRIMARY = 17; // 0x11
+ field public static final int PROGRAM_TYPE_AM = 1; // 0x1
+ field public static final int PROGRAM_TYPE_AM_HD = 3; // 0x3
+ field public static final int PROGRAM_TYPE_DAB = 5; // 0x5
+ field public static final int PROGRAM_TYPE_DRMO = 6; // 0x6
+ field public static final int PROGRAM_TYPE_FM = 2; // 0x2
+ field public static final int PROGRAM_TYPE_FM_HD = 4; // 0x4
+ field public static final int PROGRAM_TYPE_SXM = 7; // 0x7
+ field public static final int PROGRAM_TYPE_VENDOR1 = 8; // 0x8
+ field public static final int PROGRAM_TYPE_VENDOR2 = 9; // 0x9
+ field public static final int PROGRAM_TYPE_VENDOR3 = 10; // 0xa
+ field public static final int PROGRAM_TYPE_VENDOR4 = 11; // 0xb
+ }
+
+ public static final class ProgramSelector.Identifier implements android.os.Parcelable {
+ ctor public ProgramSelector.Identifier(int, long);
+ method public int describeContents();
+ method public int getType();
+ method public long getValue();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.hardware.radio.ProgramSelector.Identifier> CREATOR;
+ }
+
+ public static abstract class ProgramSelector.IdentifierType implements java.lang.annotation.Annotation {
+ }
+
+ public static abstract class ProgramSelector.ProgramType implements java.lang.annotation.Annotation {
+ }
+
public class RadioManager {
method public int listModules(java.util.List<android.hardware.radio.RadioManager.ModuleProperties>);
method public android.hardware.radio.RadioTuner openTuner(int, android.hardware.radio.RadioManager.BandConfig, boolean, android.hardware.radio.RadioTuner.Callback, android.os.Handler);
@@ -17147,6 +17285,7 @@
field public static final int BAND_AM_HD = 3; // 0x3
field public static final int BAND_FM = 1; // 0x1
field public static final int BAND_FM_HD = 2; // 0x2
+ field public static final int BAND_INVALID = -1; // 0xffffffff
field public static final int CLASS_AM_FM = 0; // 0x0
field public static final int CLASS_DT = 2; // 0x2
field public static final int CLASS_SAT = 1; // 0x1
@@ -17182,6 +17321,9 @@
field public static final android.os.Parcelable.Creator<android.hardware.radio.RadioManager.AmBandDescriptor> CREATOR;
}
+ public static abstract class RadioManager.Band implements java.lang.annotation.Annotation {
+ }
+
public static class RadioManager.BandConfig implements android.os.Parcelable {
method public int describeContents();
method public int getLowerLimit();
@@ -17200,6 +17342,8 @@
method public int getSpacing();
method public int getType();
method public int getUpperLimit();
+ method public boolean isAmBand();
+ method public boolean isFmBand();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.hardware.radio.RadioManager.BandDescriptor> CREATOR;
}
@@ -17243,20 +17387,31 @@
method public int getNumTuners();
method public java.lang.String getProduct();
method public java.lang.String getSerial();
+ method public java.lang.String getServiceName();
+ method public java.lang.String getVendorInfo();
method public java.lang.String getVersion();
+ method public boolean isBackgroundScanningSupported();
method public boolean isCaptureSupported();
+ method public boolean isProgramIdentifierSupported(int);
+ method public boolean isProgramTypeSupported(int);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.hardware.radio.RadioManager.ModuleProperties> CREATOR;
}
public static class RadioManager.ProgramInfo implements android.os.Parcelable {
method public int describeContents();
- method public int getChannel();
+ method public deprecated int getChannel();
method public android.hardware.radio.RadioMetadata getMetadata();
+ method public android.hardware.radio.ProgramSelector getSelector();
method public int getSignalStrength();
- method public int getSubChannel();
+ method public deprecated int getSubChannel();
+ method public java.lang.String getVendorInfo();
method public boolean isDigital();
+ method public boolean isLive();
+ method public boolean isMuted();
method public boolean isStereo();
+ method public boolean isTrafficAnnouncementActive();
+ method public boolean isTrafficProgram();
method public boolean isTuned();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.hardware.radio.RadioManager.ProgramInfo> CREATOR;
@@ -17265,7 +17420,7 @@
public final class RadioMetadata implements android.os.Parcelable {
method public boolean containsKey(java.lang.String);
method public int describeContents();
- method public android.graphics.Bitmap getBitmap(java.lang.String);
+ method public deprecated android.graphics.Bitmap getBitmap(java.lang.String);
method public android.hardware.radio.RadioMetadata.Clock getClock(java.lang.String);
method public int getInt(java.lang.String);
method public java.lang.String getString(java.lang.String);
@@ -17309,19 +17464,27 @@
public abstract class RadioTuner {
ctor public RadioTuner();
method public abstract int cancel();
+ method public abstract void cancelAnnouncement();
method public abstract void close();
method public abstract int getConfiguration(android.hardware.radio.RadioManager.BandConfig[]);
method public abstract boolean getMute();
method public abstract int getProgramInformation(android.hardware.radio.RadioManager.ProgramInfo[]);
+ method public abstract java.util.List<android.hardware.radio.RadioManager.ProgramInfo> getProgramList(java.lang.String);
method public abstract boolean hasControl();
+ method public abstract boolean isAnalogForced();
method public abstract boolean isAntennaConnected();
method public abstract int scan(int, boolean);
+ method public abstract void setAnalogForced(boolean);
method public abstract int setConfiguration(android.hardware.radio.RadioManager.BandConfig);
method public abstract int setMute(boolean);
+ method public abstract boolean startBackgroundScan();
method public abstract int step(int, boolean);
- method public abstract int tune(int, int);
+ method public abstract deprecated int tune(int, int);
+ method public abstract void tune(android.hardware.radio.ProgramSelector);
field public static final int DIRECTION_DOWN = 1; // 0x1
field public static final int DIRECTION_UP = 0; // 0x0
+ field public static final int ERROR_BACKGROUND_SCAN_FAILED = 6; // 0x6
+ field public static final int ERROR_BACKGROUND_SCAN_UNAVAILABLE = 5; // 0x5
field public static final int ERROR_CANCELLED = 2; // 0x2
field public static final int ERROR_CONFIG = 4; // 0x4
field public static final int ERROR_HARDWARE_FAILURE = 0; // 0x0
@@ -17332,12 +17495,15 @@
public static abstract class RadioTuner.Callback {
ctor public RadioTuner.Callback();
method public void onAntennaState(boolean);
+ method public void onBackgroundScanAvailabilityChange(boolean);
+ method public void onBackgroundScanComplete();
method public void onConfigurationChanged(android.hardware.radio.RadioManager.BandConfig);
method public void onControlChanged(boolean);
method public void onEmergencyAnnouncement(boolean);
method public void onError(int);
- method public void onMetadataChanged(android.hardware.radio.RadioMetadata);
+ method public deprecated void onMetadataChanged(android.hardware.radio.RadioMetadata);
method public void onProgramInfoChanged(android.hardware.radio.RadioManager.ProgramInfo);
+ method public void onProgramListChanged();
method public void onTrafficAnnouncement(boolean);
}
@@ -19439,6 +19605,7 @@
}
public class DateIntervalFormat extends android.icu.text.UFormat {
+ method public synchronized java.lang.Object clone();
method public final java.lang.StringBuffer format(java.lang.Object, java.lang.StringBuffer, java.text.FieldPosition);
method public final synchronized java.lang.StringBuffer format(android.icu.util.DateInterval, java.lang.StringBuffer, java.text.FieldPosition);
method public final synchronized java.lang.StringBuffer format(android.icu.util.Calendar, android.icu.util.Calendar, java.lang.StringBuffer, java.text.FieldPosition);
@@ -20222,6 +20389,7 @@
public final class RuleBasedCollator extends android.icu.text.Collator {
ctor public RuleBasedCollator(java.lang.String) throws java.lang.Exception;
+ method public android.icu.text.RuleBasedCollator cloneAsThawed();
method public int compare(java.lang.String, java.lang.String);
method public android.icu.text.CollationElementIterator getCollationElementIterator(java.lang.String);
method public android.icu.text.CollationElementIterator getCollationElementIterator(java.text.CharacterIterator);
@@ -20248,6 +20416,7 @@
method public void setFrenchCollation(boolean);
method public void setFrenchCollationDefault();
method public void setLowerCaseFirst(boolean);
+ method public android.icu.text.RuleBasedCollator setMaxVariable(int);
method public void setNumericCollation(boolean);
method public void setNumericCollationDefault();
method public void setStrengthDefault();
@@ -23100,6 +23269,7 @@
ctor public AudioRecord(android.media.AudioAttributes, android.media.AudioFormat, int, int) throws java.lang.IllegalArgumentException;
method public void addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler);
method public deprecated void addOnRoutingChangedListener(android.media.AudioRecord.OnRoutingChangedListener, android.os.Handler);
+ method protected void finalize();
method public int getAudioFormat();
method public int getAudioSessionId();
method public int getAudioSource();
@@ -23206,6 +23376,7 @@
method public deprecated void addOnRoutingChangedListener(android.media.AudioTrack.OnRoutingChangedListener, android.os.Handler);
method public int attachAuxEffect(int);
method public android.media.VolumeShaper createVolumeShaper(android.media.VolumeShaper.Configuration);
+ method protected void finalize();
method public void flush();
method public int getAudioFormat();
method public int getAudioSessionId();
@@ -23604,6 +23775,7 @@
method public boolean clearQueue();
method public java.lang.Object clone() throws java.lang.CloneNotSupportedException;
method public boolean closeJetFile();
+ method protected void finalize();
method public static android.media.JetPlayer getJetPlayer();
method public static int getMaxTracks();
method public boolean loadJetFile(java.lang.String);
@@ -23643,6 +23815,7 @@
ctor public MediaCas(int) throws android.media.MediaCasException.UnsupportedCasException;
method public void close();
method public static android.media.MediaCas.PluginDescriptor[] enumeratePlugins();
+ method protected void finalize();
method public static boolean isSystemIdSupported(int);
method public android.media.MediaCas.Session openSession() throws android.media.MediaCasException;
method public void processEmm(byte[], int, int) throws android.media.MediaCasException;
@@ -23699,6 +23872,7 @@
method public static android.view.Surface createPersistentInputSurface();
method public final int dequeueInputBuffer(long);
method public final int dequeueOutputBuffer(android.media.MediaCodec.BufferInfo, long);
+ method protected void finalize();
method public final void flush();
method public android.media.MediaCodecInfo getCodecInfo();
method public java.nio.ByteBuffer getInputBuffer(int);
@@ -23939,6 +24113,8 @@
field public static final int AVCLevel51 = 32768; // 0x8000
field public static final int AVCLevel52 = 65536; // 0x10000
field public static final int AVCProfileBaseline = 1; // 0x1
+ field public static final int AVCProfileConstrainedBaseline = 65536; // 0x10000
+ field public static final int AVCProfileConstrainedHigh = 524288; // 0x80000
field public static final int AVCProfileExtended = 4; // 0x4
field public static final int AVCProfileHigh = 8; // 0x8
field public static final int AVCProfileHigh10 = 16; // 0x10
@@ -24110,6 +24286,7 @@
public final class MediaCrypto {
ctor public MediaCrypto(java.util.UUID, byte[]) throws android.media.MediaCryptoException;
+ method protected void finalize();
method public static final boolean isCryptoSchemeSupported(java.util.UUID);
method public final void release();
method public final boolean requiresSecureDecoderComponent(java.lang.String);
@@ -24130,6 +24307,7 @@
ctor public MediaDescrambler(int) throws android.media.MediaCasException.UnsupportedCasException;
method public void close();
method public final int descramble(java.nio.ByteBuffer, java.nio.ByteBuffer, android.media.MediaCodec.CryptoInfo);
+ method protected void finalize();
method public final boolean requiresSecureDecoderComponent(java.lang.String);
method public final void setMediaCasSession(android.media.MediaCas.Session);
}
@@ -24172,6 +24350,7 @@
public final class MediaDrm {
ctor public MediaDrm(java.util.UUID) throws android.media.UnsupportedSchemeException;
method public void closeSession(byte[]);
+ method protected void finalize();
method public android.media.MediaDrm.CryptoSession getCryptoSession(byte[], java.lang.String, java.lang.String);
method public android.media.MediaDrm.KeyRequest getKeyRequest(byte[], byte[], java.lang.String, int, java.util.HashMap<java.lang.String, java.lang.String>) throws android.media.NotProvisionedException;
method public byte[] getPropertyByteArray(java.lang.String);
@@ -24268,6 +24447,7 @@
public final class MediaExtractor {
ctor public MediaExtractor();
method public boolean advance();
+ method protected void finalize();
method public long getCachedDuration();
method public android.media.MediaExtractor.CasInfo getCasInfo(int);
method public android.media.DrmInitData getDrmInitData();
@@ -24569,6 +24749,7 @@
method public static android.media.MediaPlayer create(android.content.Context, int, android.media.AudioAttributes, int);
method public android.media.VolumeShaper createVolumeShaper(android.media.VolumeShaper.Configuration);
method public void deselectTrack(int) throws java.lang.IllegalStateException;
+ method protected void finalize();
method public int getAudioSessionId();
method public int getCurrentPosition();
method public android.media.MediaPlayer.DrmInfo getDrmInfo();
@@ -24764,6 +24945,7 @@
public class MediaRecorder {
ctor public MediaRecorder();
+ method protected void finalize();
method public static final int getAudioSourceMax();
method public int getMaxAmplitude() throws java.lang.IllegalStateException;
method public android.os.PersistableBundle getMetrics();
@@ -25037,6 +25219,7 @@
public final class MediaSync {
ctor public MediaSync();
method public final android.view.Surface createInputSurface();
+ method protected void finalize();
method public void flush();
method public android.media.PlaybackParams getPlaybackParams();
method public android.media.SyncParams getSyncParams();
@@ -25165,6 +25348,10 @@
public deprecated class RemoteControlClient.MetadataEditor extends android.media.MediaMetadataEditor {
method public synchronized void apply();
+ method public synchronized android.media.RemoteControlClient.MetadataEditor putBitmap(int, android.graphics.Bitmap) throws java.lang.IllegalArgumentException;
+ method public synchronized android.media.RemoteControlClient.MetadataEditor putLong(int, long) throws java.lang.IllegalArgumentException;
+ method public synchronized android.media.RemoteControlClient.MetadataEditor putObject(int, java.lang.Object) throws java.lang.IllegalArgumentException;
+ method public synchronized android.media.RemoteControlClient.MetadataEditor putString(int, java.lang.String) throws java.lang.IllegalArgumentException;
field public static final int BITMAP_KEY_ARTWORK = 100; // 0x64
}
@@ -25211,6 +25398,7 @@
}
public class Ringtone {
+ method protected void finalize();
method public android.media.AudioAttributes getAudioAttributes();
method public deprecated int getStreamType();
method public java.lang.String getTitle(android.content.Context);
@@ -25264,6 +25452,7 @@
ctor public deprecated SoundPool(int, int, int);
method public final void autoPause();
method public final void autoResume();
+ method protected void finalize();
method public int load(java.lang.String, int);
method public int load(android.content.Context, int, int);
method public int load(android.content.res.AssetFileDescriptor, int);
@@ -25332,6 +25521,7 @@
public class ToneGenerator {
ctor public ToneGenerator(int, int);
+ method protected void finalize();
method public final int getAudioSessionId();
method public void release();
method public boolean startTone(int);
@@ -25464,6 +25654,7 @@
public final class VolumeShaper implements java.lang.AutoCloseable {
method public void apply(android.media.VolumeShaper.Operation);
method public void close();
+ method protected void finalize();
method public float getVolume();
method public void replace(android.media.VolumeShaper.Configuration, android.media.VolumeShaper.Operation, boolean);
}
@@ -25518,6 +25709,7 @@
}
public class AudioEffect {
+ method protected void finalize();
method public android.media.audiofx.AudioEffect.Descriptor getDescriptor() throws java.lang.IllegalStateException;
method public boolean getEnabled() throws java.lang.IllegalStateException;
method public int getId() throws java.lang.IllegalStateException;
@@ -25770,6 +25962,7 @@
public class Visualizer {
ctor public Visualizer(int) throws java.lang.RuntimeException, java.lang.UnsupportedOperationException;
+ method protected void finalize();
method public int getCaptureSize() throws java.lang.IllegalStateException;
method public static int[] getCaptureSizeRange();
method public boolean getEnabled();
@@ -26461,6 +26654,7 @@
method public static boolean isChannelUriForPassthroughInput(android.net.Uri);
method public static boolean isChannelUriForTunerInput(android.net.Uri);
method public static boolean isProgramUri(android.net.Uri);
+ method public static boolean isRecordedProgramUri(android.net.Uri);
method public static void requestChannelBrowsable(android.content.Context, long);
field public static final java.lang.String ACTION_CHANNEL_BROWSABLE_REQUESTED = "android.media.tv.action.CHANNEL_BROWSABLE_REQUESTED";
field public static final java.lang.String ACTION_INITIALIZE_PROGRAMS = "android.media.tv.action.INITIALIZE_PROGRAMS";
@@ -27804,6 +27998,7 @@
field public static final int TRANSPORT_BLUETOOTH = 2; // 0x2
field public static final int TRANSPORT_CELLULAR = 0; // 0x0
field public static final int TRANSPORT_ETHERNET = 3; // 0x3
+ field public static final int TRANSPORT_LOWPAN = 6; // 0x6
field public static final int TRANSPORT_VPN = 4; // 0x4
field public static final int TRANSPORT_WIFI = 1; // 0x1
field public static final int TRANSPORT_WIFI_AWARE = 5; // 0x5
@@ -28033,6 +28228,7 @@
method public static void incrementOperationCount(int, int);
method public static void setThreadStatsTag(int);
method public static void setThreadStatsTagBackup();
+ method public static void setThreadStatsTagCode();
method public static void setThreadStatsTagRestore();
method public static void setThreadStatsUid(int);
method public static void tagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
@@ -28187,6 +28383,7 @@
method public boolean protect(java.net.Socket);
method public boolean protect(java.net.DatagramSocket);
method public boolean setUnderlyingNetworks(android.net.Network[]);
+ field public static final java.lang.String METADATA_SUPPORTS_ALWAYS_ON = "android.net.VpnService.SUPPORTS_ALWAYS_ON";
field public static final java.lang.String SERVICE_INTERFACE = "android.net.VpnService";
}
@@ -29067,7 +29264,7 @@
method public void setTdlsEnabled(java.net.InetAddress, boolean);
method public void setTdlsEnabledWithMacAddress(java.lang.String, boolean);
method public boolean setWifiApConfiguration(android.net.wifi.WifiConfiguration);
- method public boolean setWifiApEnabled(android.net.wifi.WifiConfiguration, boolean);
+ method public deprecated boolean setWifiApEnabled(android.net.wifi.WifiConfiguration, boolean);
method public boolean setWifiEnabled(boolean);
method public void startLocalOnlyHotspot(android.net.wifi.WifiManager.LocalOnlyHotspotCallback, android.os.Handler);
method public deprecated boolean startLocationRestrictedScan(android.os.WorkSource);
@@ -29671,7 +29868,8 @@
method public abstract void onSuccess();
}
- public static class WifiP2pManager.Channel {
+ public static class WifiP2pManager.Channel implements java.lang.AutoCloseable {
+ method public void close();
}
public static abstract interface WifiP2pManager.ChannelListener {
@@ -33224,6 +33422,7 @@
field public static final int N = 24; // 0x18
field public static final int N_MR1 = 25; // 0x19
field public static final int O = 26; // 0x1a
+ field public static final int O_MR1 = 10000; // 0x2710
}
public final class Bundle extends android.os.BaseBundle implements java.lang.Cloneable android.os.Parcelable {
@@ -33289,6 +33488,7 @@
method public void putStringArrayList(java.lang.String, java.util.ArrayList<java.lang.String>);
method public void readFromParcel(android.os.Parcel);
method public void setClassLoader(java.lang.ClassLoader);
+ method public synchronized java.lang.String toString();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.os.Bundle> CREATOR;
field public static final android.os.Bundle EMPTY;
@@ -33530,6 +33730,7 @@
public abstract class FileObserver {
ctor public FileObserver(java.lang.String);
ctor public FileObserver(java.lang.String, int);
+ method protected void finalize();
method public abstract void onEvent(int, java.lang.String);
method public void startWatching();
method public void stopWatching();
@@ -33702,11 +33903,12 @@
public class MemoryFile {
ctor public MemoryFile(java.lang.String, int) throws java.io.IOException;
- method public synchronized boolean allowPurging(boolean) throws java.io.IOException;
+ method public deprecated synchronized boolean allowPurging(boolean) throws java.io.IOException;
method public void close();
+ method public java.io.FileDescriptor getFileDescriptor() throws java.io.IOException;
method public java.io.InputStream getInputStream();
method public java.io.OutputStream getOutputStream();
- method public boolean isPurgingAllowed();
+ method public deprecated boolean isPurgingAllowed();
method public int length();
method public int readBytes(byte[], int, int, int) throws java.io.IOException;
method public void writeBytes(byte[], int, int, int) throws java.io.IOException;
@@ -34003,6 +34205,7 @@
method public int describeContents();
method public android.os.PersistableBundle getPersistableBundle(java.lang.String);
method public void putPersistableBundle(java.lang.String, android.os.PersistableBundle);
+ method public synchronized java.lang.String toString();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.os.PersistableBundle> CREATOR;
field public static final android.os.PersistableBundle EMPTY;
@@ -34013,7 +34216,7 @@
method public boolean isIgnoringBatteryOptimizations(java.lang.String);
method public boolean isInteractive();
method public boolean isPowerSaveMode();
- method public boolean isScreenBrightnessBoosted();
+ method public deprecated boolean isScreenBrightnessBoosted();
method public deprecated boolean isScreenOn();
method public boolean isSustainedPerformanceModeSupported();
method public boolean isWakeLockLevelSupported(int);
@@ -34023,7 +34226,7 @@
field public static final int ACQUIRE_CAUSES_WAKEUP = 268435456; // 0x10000000
field public static final java.lang.String ACTION_DEVICE_IDLE_MODE_CHANGED = "android.os.action.DEVICE_IDLE_MODE_CHANGED";
field public static final java.lang.String ACTION_POWER_SAVE_MODE_CHANGED = "android.os.action.POWER_SAVE_MODE_CHANGED";
- field public static final java.lang.String ACTION_SCREEN_BRIGHTNESS_BOOST_CHANGED = "android.os.action.SCREEN_BRIGHTNESS_BOOST_CHANGED";
+ field public static final deprecated java.lang.String ACTION_SCREEN_BRIGHTNESS_BOOST_CHANGED = "android.os.action.SCREEN_BRIGHTNESS_BOOST_CHANGED";
field public static final deprecated int FULL_WAKE_LOCK = 26; // 0x1a
field public static final int ON_AFTER_RELEASE = 536870912; // 0x20000000
field public static final int PARTIAL_WAKE_LOCK = 1; // 0x1
@@ -34159,6 +34362,22 @@
field public static final android.os.Parcelable.Creator<android.os.ResultReceiver> CREATOR;
}
+ public final class SharedMemory implements java.io.Closeable android.os.Parcelable {
+ method public void close();
+ method public static android.os.SharedMemory create(java.lang.String, int) throws android.system.ErrnoException;
+ method public int describeContents();
+ method public int getFd();
+ method public java.io.FileDescriptor getFileDescriptor();
+ method public int getSize();
+ method public java.nio.ByteBuffer map(int, int, int) throws android.system.ErrnoException;
+ method public java.nio.ByteBuffer mapReadOnly() throws android.system.ErrnoException;
+ method public java.nio.ByteBuffer mapReadWrite() throws android.system.ErrnoException;
+ method public boolean setProtect(int);
+ method public static void unmap(java.nio.ByteBuffer);
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.os.SharedMemory> CREATOR;
+ }
+
public class StatFs {
ctor public StatFs(java.lang.String);
method public deprecated int getAvailableBlocks();
@@ -34291,6 +34510,7 @@
method public void resetStatus();
method public void resume();
method public void suspend();
+ method public boolean unbind();
}
public static final class UpdateEngine.ErrorCodeConstants {
@@ -34643,6 +34863,7 @@
method public android.os.storage.StorageVolume getStorageVolume(java.io.File);
method public java.util.List<android.os.storage.StorageVolume> getStorageVolumes();
method public java.util.UUID getUuidForPath(java.io.File) throws java.io.IOException;
+ method public boolean isAllocationSupported(java.io.FileDescriptor);
method public boolean isCacheBehaviorGroup(java.io.File) throws java.io.IOException;
method public boolean isCacheBehaviorTombstone(java.io.File) throws java.io.IOException;
method public boolean isEncrypted(java.io.File);
@@ -38426,6 +38647,22 @@
field public static final java.lang.String TYPE = "type";
}
+ public final class TimeZoneRulesDataContract {
+ field public static final java.lang.String AUTHORITY = "com.android.timezone";
+ }
+
+ public static final class TimeZoneRulesDataContract.Operation {
+ field public static final java.lang.String COLUMN_DISTRO_MAJOR_VERSION = "distro_major_version";
+ field public static final java.lang.String COLUMN_DISTRO_MINOR_VERSION = "distro_minor_version";
+ field public static final java.lang.String COLUMN_REVISION = "revision";
+ field public static final java.lang.String COLUMN_RULES_VERSION = "rules_version";
+ field public static final java.lang.String COLUMN_TYPE = "type";
+ field public static final android.net.Uri CONTENT_URI;
+ field public static final java.lang.String TYPE_INSTALL = "INSTALL";
+ field public static final java.lang.String TYPE_NO_OP = "NOOP";
+ field public static final java.lang.String TYPE_UNINSTALL = "UNINSTALL";
+ }
+
public class UserDictionary {
ctor public UserDictionary();
field public static final java.lang.String AUTHORITY = "user_dictionary";
@@ -38640,6 +38877,7 @@
method public static android.renderscript.AllocationAdapter create1D(android.renderscript.RenderScript, android.renderscript.Allocation);
method public static android.renderscript.AllocationAdapter create2D(android.renderscript.RenderScript, android.renderscript.Allocation);
method public static android.renderscript.AllocationAdapter createTyped(android.renderscript.RenderScript, android.renderscript.Allocation, android.renderscript.Type);
+ method public synchronized void resize(int);
method public void setFace(android.renderscript.Type.CubemapFace);
method public void setLOD(int);
method public void setX(int);
@@ -39911,6 +40149,30 @@
field public static final java.lang.String SERVICE_META_DATA = "android.autofill";
}
+ public final class CharSequenceTransformation implements android.os.Parcelable android.service.autofill.Transformation {
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.service.autofill.CharSequenceTransformation> CREATOR;
+ }
+
+ public static class CharSequenceTransformation.Builder {
+ ctor public CharSequenceTransformation.Builder(android.view.autofill.AutofillId, java.util.regex.Pattern, java.lang.String);
+ method public android.service.autofill.CharSequenceTransformation.Builder addField(android.view.autofill.AutofillId, java.util.regex.Pattern, java.lang.String);
+ method public android.service.autofill.CharSequenceTransformation build();
+ }
+
+ public final class CustomDescription implements android.os.Parcelable {
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.service.autofill.CustomDescription> CREATOR;
+ }
+
+ public static class CustomDescription.Builder {
+ ctor public CustomDescription.Builder(android.widget.RemoteViews);
+ method public android.service.autofill.CustomDescription.Builder addChild(int, android.service.autofill.Transformation);
+ method public android.service.autofill.CustomDescription build();
+ }
+
public final class Dataset implements android.os.Parcelable {
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
@@ -39984,6 +40246,25 @@
method public android.service.autofill.FillResponse.Builder setSaveInfo(android.service.autofill.SaveInfo);
}
+ public final class ImageTransformation implements android.os.Parcelable android.service.autofill.Transformation {
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.service.autofill.ImageTransformation> CREATOR;
+ }
+
+ public static class ImageTransformation.Builder {
+ ctor public ImageTransformation.Builder(android.view.autofill.AutofillId, java.util.regex.Pattern, int);
+ method public android.service.autofill.ImageTransformation.Builder addOption(java.util.regex.Pattern, int);
+ method public android.service.autofill.ImageTransformation build();
+ }
+
+ public final class LuhnChecksumValidator implements android.os.Parcelable android.service.autofill.Validator {
+ ctor public LuhnChecksumValidator(android.view.autofill.AutofillId...);
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.service.autofill.LuhnChecksumValidator> CREATOR;
+ }
+
public final class SaveCallback {
method public void onFailure(java.lang.CharSequence);
method public void onSuccess();
@@ -40006,11 +40287,14 @@
public static final class SaveInfo.Builder {
ctor public SaveInfo.Builder(int, android.view.autofill.AutofillId[]);
+ ctor public SaveInfo.Builder(int);
method public android.service.autofill.SaveInfo build();
+ method public android.service.autofill.SaveInfo.Builder setCustomDescription(android.service.autofill.CustomDescription);
method public android.service.autofill.SaveInfo.Builder setDescription(java.lang.CharSequence);
method public android.service.autofill.SaveInfo.Builder setFlags(int);
method public android.service.autofill.SaveInfo.Builder setNegativeAction(int, android.content.IntentSender);
method public android.service.autofill.SaveInfo.Builder setOptionalIds(android.view.autofill.AutofillId[]);
+ method public android.service.autofill.SaveInfo.Builder setValidator(android.service.autofill.Validator);
}
public final class SaveRequest implements android.os.Parcelable {
@@ -40021,6 +40305,24 @@
field public static final android.os.Parcelable.Creator<android.service.autofill.SaveRequest> CREATOR;
}
+ public final class SimpleRegexValidator implements android.os.Parcelable android.service.autofill.Validator {
+ ctor public SimpleRegexValidator(android.view.autofill.AutofillId, java.util.regex.Pattern);
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.service.autofill.SimpleRegexValidator> CREATOR;
+ }
+
+ public abstract interface Transformation {
+ }
+
+ public abstract interface Validator {
+ }
+
+ public final class Validators {
+ method public static android.service.autofill.Validator and(android.service.autofill.Validator...);
+ method public static android.service.autofill.Validator or(android.service.autofill.Validator...);
+ }
+
}
package android.service.carrier {
@@ -40797,8 +41099,10 @@
method public android.view.SurfaceHolder getSurfaceHolder();
method public boolean isPreview();
method public boolean isVisible();
+ method public void notifyColorsChanged();
method public void onApplyWindowInsets(android.view.WindowInsets);
method public android.os.Bundle onCommand(java.lang.String, int, int, int, android.os.Bundle, boolean);
+ method public android.app.WallpaperColors onComputeColors();
method public void onCreate(android.view.SurfaceHolder);
method public void onDesiredSizeChanged(int, int);
method public void onDestroy();
@@ -41380,6 +41684,7 @@
field public static final int FD_CLOEXEC;
field public static final int FIONREAD;
field public static final int F_DUPFD;
+ field public static final int F_DUPFD_CLOEXEC;
field public static final int F_GETFD;
field public static final int F_GETFL;
field public static final int F_GETLK;
@@ -41474,7 +41779,9 @@
field public static final int NI_NUMERICSERV;
field public static final int O_ACCMODE;
field public static final int O_APPEND;
+ field public static final int O_CLOEXEC;
field public static final int O_CREAT;
+ field public static final int O_DSYNC;
field public static final int O_EXCL;
field public static final int O_NOCTTY;
field public static final int O_NOFOLLOW;
@@ -41720,14 +42027,18 @@
public final class StructStat {
ctor public StructStat(long, long, int, long, int, int, long, long, long, long, long, long, long);
+ ctor public StructStat(long, long, int, long, int, int, long, long, android.system.StructTimespec, android.system.StructTimespec, android.system.StructTimespec, long, long);
+ field public final android.system.StructTimespec st_atim;
field public final long st_atime;
field public final long st_blksize;
field public final long st_blocks;
+ field public final android.system.StructTimespec st_ctim;
field public final long st_ctime;
field public final long st_dev;
field public final int st_gid;
field public final long st_ino;
field public final int st_mode;
+ field public final android.system.StructTimespec st_mtim;
field public final long st_mtime;
field public final long st_nlink;
field public final long st_rdev;
@@ -41750,6 +42061,13 @@
field public final long f_namemax;
}
+ public final class StructTimespec implements java.lang.Comparable {
+ ctor public StructTimespec(long, long);
+ method public int compareTo(android.system.StructTimespec);
+ field public final long tv_nsec;
+ field public final long tv_sec;
+ }
+
public final class StructUtsname {
ctor public StructUtsname(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
field public final java.lang.String machine;
@@ -41908,7 +42226,8 @@
public static final class Call.RttCall {
method public int getRttAudioMode();
- method public java.lang.String read();
+ method public java.lang.String read() throws java.io.IOException;
+ method public java.lang.String readImmediately() throws java.io.IOException;
method public void setRttMode(int);
method public void write(java.lang.String) throws java.io.IOException;
field public static final int RTT_MODE_FULL = 1; // 0x1
@@ -42768,7 +43087,7 @@
method public void notifyConfigChangedForSubId(int);
method public void updateConfigForPhoneId(int, java.lang.String);
field public static final java.lang.String ACTION_CARRIER_CONFIG_CHANGED = "android.telephony.action.CARRIER_CONFIG_CHANGED";
- field public static final int DATA_CYCLE_THRESHOLD_DISABLED = -2; // 0xfffffffe
+ field public static final deprecated int DATA_CYCLE_THRESHOLD_DISABLED = -2; // 0xfffffffe
field public static final java.lang.String KEY_ADDITIONAL_CALL_SETTING_BOOL = "additional_call_setting_bool";
field public static final java.lang.String KEY_ALLOW_ADDING_APNS_BOOL = "allow_adding_apns_bool";
field public static final java.lang.String KEY_ALLOW_ADD_CALL_DURING_VIDEO_CALL_BOOL = "allow_add_call_during_video_call";
@@ -42810,9 +43129,10 @@
field public static final java.lang.String KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_VAL_STRING = "ci_action_on_sys_update_extra_val_string";
field public static final java.lang.String KEY_CI_ACTION_ON_SYS_UPDATE_INTENT_STRING = "ci_action_on_sys_update_intent_string";
field public static final java.lang.String KEY_CONFIG_IMS_PACKAGE_OVERRIDE_STRING = "config_ims_package_override_string";
+ field public static final java.lang.String KEY_CONFIG_PLANS_PACKAGE_OVERRIDE_STRING = "config_plans_package_override_string";
field public static final java.lang.String KEY_CSP_ENABLED_BOOL = "csp_enabled_bool";
- field public static final java.lang.String KEY_DATA_LIMIT_THRESHOLD_BYTES_LONG = "data_limit_threshold_bytes_long";
- field public static final java.lang.String KEY_DATA_WARNING_THRESHOLD_BYTES_LONG = "data_warning_threshold_bytes_long";
+ field public static final deprecated java.lang.String KEY_DATA_LIMIT_THRESHOLD_BYTES_LONG = "data_limit_threshold_bytes_long";
+ field public static final deprecated java.lang.String KEY_DATA_WARNING_THRESHOLD_BYTES_LONG = "data_warning_threshold_bytes_long";
field public static final java.lang.String KEY_DEFAULT_SIM_CALL_MANAGER_STRING = "default_sim_call_manager_string";
field public static final java.lang.String KEY_DEFAULT_VM_NUMBER_STRING = "default_vm_number_string";
field public static final java.lang.String KEY_DIAL_STRING_REPLACE_STRING_ARRAY = "dial_string_replace_string_array";
@@ -42869,7 +43189,7 @@
field public static final java.lang.String KEY_MMS_UA_PROF_TAG_NAME_STRING = "uaProfTagName";
field public static final java.lang.String KEY_MMS_UA_PROF_URL_STRING = "uaProfUrl";
field public static final java.lang.String KEY_MMS_USER_AGENT_STRING = "userAgent";
- field public static final java.lang.String KEY_MONTHLY_DATA_CYCLE_DAY_INT = "monthly_data_cycle_day_int";
+ field public static final deprecated java.lang.String KEY_MONTHLY_DATA_CYCLE_DAY_INT = "monthly_data_cycle_day_int";
field public static final java.lang.String KEY_ONLY_SINGLE_DC_ALLOWED_INT_ARRAY = "only_single_dc_allowed_int_array";
field public static final java.lang.String KEY_OPERATOR_SELECTION_EXPAND_BOOL = "operator_selection_expand_bool";
field public static final java.lang.String KEY_PREFER_2G_BOOL = "prefer_2g_bool";
@@ -43383,8 +43703,10 @@
method public static int getDefaultSmsSubscriptionId();
method public static int getDefaultSubscriptionId();
method public static int getDefaultVoiceSubscriptionId();
+ method public java.util.List<android.telephony.SubscriptionPlan> getSubscriptionPlans(int);
method public boolean isNetworkRoaming(int);
method public void removeOnSubscriptionsChangedListener(android.telephony.SubscriptionManager.OnSubscriptionsChangedListener);
+ method public void setSubscriptionPlans(int, java.util.List<android.telephony.SubscriptionPlan>);
field public static final java.lang.String ACTION_DEFAULT_SMS_SUBSCRIPTION_CHANGED = "android.telephony.action.DEFAULT_SMS_SUBSCRIPTION_CHANGED";
field public static final java.lang.String ACTION_DEFAULT_SUBSCRIPTION_CHANGED = "android.telephony.action.DEFAULT_SUBSCRIPTION_CHANGED";
field public static final int DATA_ROAMING_DISABLE = 0; // 0x0
@@ -43398,6 +43720,38 @@
method public void onSubscriptionsChanged();
}
+ public final class SubscriptionPlan implements android.os.Parcelable {
+ method public java.util.Iterator<android.util.Pair<java.time.ZonedDateTime, java.time.ZonedDateTime>> cycleIterator();
+ method public int describeContents();
+ method public int getDataLimitBehavior();
+ method public long getDataLimitBytes();
+ method public long getDataUsageBytes();
+ method public long getDataUsageTime();
+ method public java.lang.CharSequence getSummary();
+ method public java.lang.CharSequence getTitle();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final long BYTES_UNKNOWN = -1L; // 0xffffffffffffffffL
+ field public static final long BYTES_UNLIMITED = 9223372036854775807L; // 0x7fffffffffffffffL
+ field public static final android.os.Parcelable.Creator<android.telephony.SubscriptionPlan> CREATOR;
+ field public static final int LIMIT_BEHAVIOR_BILLED = 1; // 0x1
+ field public static final int LIMIT_BEHAVIOR_DISABLED = 0; // 0x0
+ field public static final int LIMIT_BEHAVIOR_THROTTLED = 2; // 0x2
+ field public static final int LIMIT_BEHAVIOR_UNKNOWN = -1; // 0xffffffff
+ field public static final long TIME_UNKNOWN = -1L; // 0xffffffffffffffffL
+ }
+
+ public static class SubscriptionPlan.Builder {
+ method public android.telephony.SubscriptionPlan build();
+ method public static android.telephony.SubscriptionPlan.Builder createNonrecurring(java.time.ZonedDateTime, java.time.ZonedDateTime);
+ method public static android.telephony.SubscriptionPlan.Builder createRecurringDaily(java.time.ZonedDateTime);
+ method public static android.telephony.SubscriptionPlan.Builder createRecurringMonthly(java.time.ZonedDateTime);
+ method public static android.telephony.SubscriptionPlan.Builder createRecurringWeekly(java.time.ZonedDateTime);
+ method public android.telephony.SubscriptionPlan.Builder setDataLimit(long, int);
+ method public android.telephony.SubscriptionPlan.Builder setDataUsage(long, long);
+ method public android.telephony.SubscriptionPlan.Builder setSummary(java.lang.CharSequence);
+ method public android.telephony.SubscriptionPlan.Builder setTitle(java.lang.CharSequence);
+ }
+
public final class TelephonyHistogram implements android.os.Parcelable {
ctor public TelephonyHistogram(int, int, int);
ctor public TelephonyHistogram(android.telephony.TelephonyHistogram);
@@ -43567,6 +43921,7 @@
field public static final java.lang.String EXTRA_CALL_VOICEMAIL_INTENT = "android.telephony.extra.CALL_VOICEMAIL_INTENT";
field public static final java.lang.String EXTRA_HIDE_PUBLIC_SETTINGS = "android.telephony.extra.HIDE_PUBLIC_SETTINGS";
field public static final java.lang.String EXTRA_INCOMING_NUMBER = "incoming_number";
+ field public static final java.lang.String EXTRA_IS_REFRESH = "android.telephony.extra.IS_REFRESH";
field public static final java.lang.String EXTRA_LAUNCH_VOICEMAIL_SETTINGS_INTENT = "android.telephony.extra.LAUNCH_VOICEMAIL_SETTINGS_INTENT";
field public static final java.lang.String EXTRA_NOTIFICATION_COUNT = "android.telephony.extra.NOTIFICATION_COUNT";
field public static final java.lang.String EXTRA_PHONE_ACCOUNT_HANDLE = "android.telephony.extra.PHONE_ACCOUNT_HANDLE";
@@ -43772,6 +44127,7 @@
public static deprecated class SmsMessage.SubmitPdu {
ctor public deprecated SmsMessage.SubmitPdu();
+ method public deprecated java.lang.String toString();
field public deprecated byte[] encodedMessage;
field public deprecated byte[] encodedScAddress;
}
@@ -43844,6 +44200,7 @@
method public java.util.List<junit.framework.TestCase> getTestCases();
method public java.lang.String getTestClassName();
method public junit.framework.TestResult getTestResult();
+ method protected java.lang.Class loadSuiteClass(java.lang.String) throws java.lang.ClassNotFoundException;
method protected void runFailed(java.lang.String);
method public void runTest();
method public void runTest(junit.framework.TestResult);
@@ -44104,10 +44461,12 @@
ctor protected MockContentProvider();
ctor public MockContentProvider(android.content.Context);
ctor public MockContentProvider(android.content.Context, java.lang.String, java.lang.String, android.content.pm.PathPermission[]);
+ method public android.content.ContentProviderResult[] applyBatch(java.util.ArrayList<android.content.ContentProviderOperation>);
method public int delete(android.net.Uri, java.lang.String, java.lang.String[]);
method public java.lang.String getType(android.net.Uri);
method public android.net.Uri insert(android.net.Uri, android.content.ContentValues);
method public boolean onCreate();
+ method public android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle);
method public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
method public int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
}
@@ -44379,6 +44738,7 @@
method public java.util.List<android.content.pm.ResolveInfo> queryIntentContentProviders(android.content.Intent, int);
method public java.util.List<android.content.pm.ResolveInfo> queryIntentServices(android.content.Intent, int);
method public java.util.List<android.content.pm.PermissionInfo> queryPermissionsByGroup(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public void registerDexModule(java.lang.String, android.content.pm.PackageManager.DexModuleRegisterCallback);
method public void removeOnPermissionsChangeListener(android.content.pm.PackageManager.OnPermissionsChangedListener);
method public void removePackageFromPreferred(java.lang.String);
method public void removePermission(java.lang.String);
@@ -44401,6 +44761,10 @@
public deprecated class MockResources extends android.content.res.Resources {
ctor public MockResources();
+ method public int getColor(int) throws android.content.res.Resources.NotFoundException;
+ method public android.content.res.ColorStateList getColorStateList(int) throws android.content.res.Resources.NotFoundException;
+ method public android.graphics.drawable.Drawable getDrawable(int) throws android.content.res.Resources.NotFoundException;
+ method public void updateConfiguration(android.content.res.Configuration, android.util.DisplayMetrics);
}
}
@@ -44636,6 +45000,7 @@
public static class InputFilter.AllCaps implements android.text.InputFilter {
ctor public InputFilter.AllCaps();
+ ctor public InputFilter.AllCaps(java.util.Locale);
method public java.lang.CharSequence filter(java.lang.CharSequence, int, int, android.text.Spanned, int, int);
}
@@ -45648,6 +46013,7 @@
public abstract class MetricAffectingSpan extends android.text.style.CharacterStyle implements android.text.style.UpdateLayout {
ctor public MetricAffectingSpan();
+ method public android.text.style.MetricAffectingSpan getUnderlying();
method public abstract void updateMeasureState(android.text.TextPaint);
}
@@ -46328,14 +46694,28 @@
public class TransitionSet extends android.transition.Transition {
ctor public TransitionSet();
ctor public TransitionSet(android.content.Context, android.util.AttributeSet);
+ method public android.transition.TransitionSet addListener(android.transition.Transition.TransitionListener);
+ method public android.transition.TransitionSet addTarget(android.view.View);
+ method public android.transition.TransitionSet addTarget(int);
+ method public android.transition.TransitionSet addTarget(java.lang.String);
+ method public android.transition.TransitionSet addTarget(java.lang.Class);
method public android.transition.TransitionSet addTransition(android.transition.Transition);
method public void captureEndValues(android.transition.TransitionValues);
method public void captureStartValues(android.transition.TransitionValues);
+ method public android.transition.TransitionSet clone();
method public int getOrdering();
method public android.transition.Transition getTransitionAt(int);
method public int getTransitionCount();
+ method public android.transition.TransitionSet removeListener(android.transition.Transition.TransitionListener);
+ method public android.transition.TransitionSet removeTarget(int);
+ method public android.transition.TransitionSet removeTarget(android.view.View);
+ method public android.transition.TransitionSet removeTarget(java.lang.Class);
+ method public android.transition.TransitionSet removeTarget(java.lang.String);
method public android.transition.TransitionSet removeTransition(android.transition.Transition);
+ method public android.transition.TransitionSet setDuration(long);
+ method public android.transition.TransitionSet setInterpolator(android.animation.TimeInterpolator);
method public android.transition.TransitionSet setOrdering(int);
+ method public android.transition.TransitionSet setStartDelay(long);
field public static final int ORDERING_SEQUENTIAL = 1; // 0x1
field public static final int ORDERING_TOGETHER = 0; // 0x0
}
@@ -46500,6 +46880,9 @@
public class Base64InputStream extends java.io.FilterInputStream {
ctor public Base64InputStream(java.io.InputStream, int);
+ method public int available();
+ method public void mark(int);
+ method public void reset();
}
public class Base64OutputStream extends java.io.FilterOutputStream {
@@ -47500,6 +47883,7 @@
method public android.os.Vibrator getVibrator();
method public boolean[] hasKeys(int...);
method public boolean hasMicrophone();
+ method public boolean isEnabled();
method public boolean isVirtual();
method public boolean supportsSource(int);
method public void writeToParcel(android.os.Parcel, int);
@@ -48530,11 +48914,15 @@
public class Surface implements android.os.Parcelable {
ctor public Surface(android.graphics.SurfaceTexture);
method public int describeContents();
+ method public boolean isAutoRefreshEnabled();
+ method public boolean isSharedBufferModeEnabled();
method public boolean isValid();
method public android.graphics.Canvas lockCanvas(android.graphics.Rect) throws java.lang.IllegalArgumentException, android.view.Surface.OutOfResourcesException;
method public android.graphics.Canvas lockHardwareCanvas();
method public void readFromParcel(android.os.Parcel);
method public void release();
+ method public void setAutoRefreshEnabled(boolean);
+ method public void setSharedBufferModeEnabled(boolean);
method public deprecated void unlockCanvas(android.graphics.Canvas);
method public void unlockCanvasAndPost(android.graphics.Canvas);
method public void writeToParcel(android.os.Parcel, int);
@@ -48615,6 +49003,7 @@
method public android.graphics.Canvas lockCanvas();
method public android.graphics.Canvas lockCanvas(android.graphics.Rect);
method protected final void onDraw(android.graphics.Canvas);
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
method public void setOpaque(boolean);
method public void setSurfaceTexture(android.graphics.SurfaceTexture);
method public void setSurfaceTextureListener(android.view.TextureView.SurfaceTextureListener);
@@ -49638,6 +50027,7 @@
method public int getLayoutMode();
method public android.animation.LayoutTransition getLayoutTransition();
method public int getNestedScrollAxes();
+ method public android.view.ViewGroupOverlay getOverlay();
method public int getPersistentDrawingCache();
method public boolean getTouchscreenBlocksFocus();
method public int indexOfChild(android.view.View);
@@ -50068,6 +50458,7 @@
method public final boolean isActive();
method public abstract boolean isFloating();
method public abstract boolean isShortcutKey(int, android.view.KeyEvent);
+ method public boolean isWideColorGamut();
method public final void makeActive();
method protected abstract void onActive();
method public abstract void onConfigurationChanged(android.content.res.Configuration);
@@ -50334,12 +50725,12 @@
field public static final int FLAG_SCALED = 16384; // 0x4000
field public static final int FLAG_SECURE = 8192; // 0x2000
field public static final int FLAG_SHOW_WALLPAPER = 1048576; // 0x100000
- field public static final int FLAG_SHOW_WHEN_LOCKED = 524288; // 0x80000
+ field public static final deprecated int FLAG_SHOW_WHEN_LOCKED = 524288; // 0x80000
field public static final int FLAG_SPLIT_TOUCH = 8388608; // 0x800000
field public static final deprecated int FLAG_TOUCHABLE_WHEN_WAKING = 64; // 0x40
field public static final int FLAG_TRANSLUCENT_NAVIGATION = 134217728; // 0x8000000
field public static final int FLAG_TRANSLUCENT_STATUS = 67108864; // 0x4000000
- field public static final int FLAG_TURN_SCREEN_ON = 2097152; // 0x200000
+ field public static final deprecated int FLAG_TURN_SCREEN_ON = 2097152; // 0x200000
field public static final int FLAG_WATCH_OUTSIDE_TOUCH = 262144; // 0x40000
field public static final int FORMAT_CHANGED = 8; // 0x8
field public static final int LAST_APPLICATION_WINDOW = 99; // 0x63
@@ -50493,6 +50884,7 @@
}
public final class AccessibilityManager {
+ method public void addAccessibilityRequestPreparer(android.view.accessibility.AccessibilityRequestPreparer);
method public boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener);
method public void addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener, android.os.Handler);
method public boolean addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener);
@@ -50504,6 +50896,7 @@
method public static boolean isAccessibilityButtonSupported();
method public boolean isEnabled();
method public boolean isTouchExplorationEnabled();
+ method public void removeAccessibilityRequestPreparer(android.view.accessibility.AccessibilityRequestPreparer);
method public boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener);
method public boolean removeTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener);
method public void sendAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
@@ -50820,6 +51213,13 @@
method public void setToIndex(int);
}
+ public abstract class AccessibilityRequestPreparer {
+ ctor public AccessibilityRequestPreparer(android.view.View, int);
+ method public android.view.View getView();
+ method public abstract void onPrepareExtraData(int, java.lang.String, android.os.Bundle, android.os.Message);
+ field public static final int REQUEST_TYPE_EXTRA_DATA = 1; // 0x1
+ }
+
public final class AccessibilityWindowInfo implements android.os.Parcelable {
method public int describeContents();
method public android.view.accessibility.AccessibilityNodeInfo getAnchor();
@@ -50912,6 +51312,7 @@
ctor public Animation(android.content.Context, android.util.AttributeSet);
method protected void applyTransformation(float, android.view.animation.Transformation);
method public void cancel();
+ method protected android.view.animation.Animation clone() throws java.lang.CloneNotSupportedException;
method public long computeDurationHint();
method protected void ensureInterpolator();
method public int getBackgroundColor();
@@ -50983,6 +51384,7 @@
ctor public AnimationSet(android.content.Context, android.util.AttributeSet);
ctor public AnimationSet(boolean);
method public void addAnimation(android.view.animation.Animation);
+ method protected android.view.animation.AnimationSet clone() throws java.lang.CloneNotSupportedException;
method public java.util.List<android.view.animation.Animation> getAnimations();
}
@@ -51187,6 +51589,8 @@
method public void notifyViewEntered(android.view.View, int, android.graphics.Rect);
method public void notifyViewExited(android.view.View);
method public void notifyViewExited(android.view.View, int);
+ method public void notifyViewVisibilityChanged(android.view.View, boolean);
+ method public void notifyViewVisibilityChanged(android.view.View, int, boolean);
method public void registerCallback(android.view.autofill.AutofillManager.AutofillCallback);
method public void requestAutofill(android.view.View);
method public void requestAutofill(android.view.View, int, android.graphics.Rect);
@@ -51838,6 +52242,10 @@
public final deprecated class CookieSyncManager extends android.webkit.WebSyncManager {
method public static android.webkit.CookieSyncManager createInstance(android.content.Context);
method public static android.webkit.CookieSyncManager getInstance();
+ method public deprecated void resetSync();
+ method public deprecated void startSync();
+ method public deprecated void stopSync();
+ method public deprecated void sync();
method protected deprecated void syncFromRamToFlash();
field protected static final java.lang.String LOGTAG = "websync";
field protected android.webkit.WebViewDatabase mDataBase;
@@ -51968,6 +52376,13 @@
method public abstract int rendererPriorityAtExit();
}
+ public abstract class SafeBrowsingResponse {
+ ctor public SafeBrowsingResponse();
+ method public abstract void backToSafety(boolean);
+ method public abstract void proceed(boolean);
+ method public abstract void showInterstitial(boolean);
+ }
+
public class ServiceWorkerClient {
ctor public ServiceWorkerClient();
method public android.webkit.WebResourceResponse shouldInterceptRequest(android.webkit.WebResourceRequest);
@@ -52427,6 +52842,7 @@
method public int getRendererRequestedPriority();
method public deprecated float getScale();
method public android.webkit.WebSettings getSettings();
+ method public android.view.textclassifier.TextClassifier getTextClassifier();
method public java.lang.String getTitle();
method public java.lang.String getUrl();
method public android.webkit.WebChromeClient getWebChromeClient();
@@ -52435,6 +52851,7 @@
method public void goBack();
method public void goBackOrForward(int);
method public void goForward();
+ method public static void initSafeBrowsing(android.content.Context, android.webkit.ValueCallback<java.lang.Boolean>);
method public void invokeZoomPicker();
method public boolean isPrivateBrowsingEnabled();
method public void loadData(java.lang.String, java.lang.String, java.lang.String);
@@ -52474,11 +52891,15 @@
method public void setNetworkAvailable(boolean);
method public deprecated void setPictureListener(android.webkit.WebView.PictureListener);
method public void setRendererPriorityPolicy(int, boolean);
+ method public static void setSafeBrowsingWhitelist(java.util.List<java.lang.String>, android.webkit.ValueCallback<java.lang.Boolean>);
+ method public void setTextClassifier(android.view.textclassifier.TextClassifier);
method public deprecated void setVerticalScrollbarOverlay(boolean);
method public void setWebChromeClient(android.webkit.WebChromeClient);
method public static void setWebContentsDebuggingEnabled(boolean);
method public void setWebViewClient(android.webkit.WebViewClient);
+ method public deprecated boolean shouldDelayChildPressedState();
method public deprecated boolean showFindDialog(java.lang.String, boolean);
+ method public static void shutdownSafeBrowsing();
method public void stopLoading();
method public void zoomBy(float);
method public boolean zoomIn();
@@ -52572,6 +52993,7 @@
method public void onReceivedLoginRequest(android.webkit.WebView, java.lang.String, java.lang.String, java.lang.String);
method public void onReceivedSslError(android.webkit.WebView, android.webkit.SslErrorHandler, android.net.http.SslError);
method public boolean onRenderProcessGone(android.webkit.WebView, android.webkit.RenderProcessGoneDetail);
+ method public void onSafeBrowsingHit(android.webkit.WebView, android.webkit.WebResourceRequest, int, android.webkit.SafeBrowsingResponse);
method public void onScaleChanged(android.webkit.WebView, float, float);
method public deprecated void onTooManyRedirects(android.webkit.WebView, android.os.Message, android.os.Message);
method public void onUnhandledKeyEvent(android.webkit.WebView, android.view.KeyEvent);
@@ -52596,6 +53018,10 @@
field public static final int ERROR_UNSAFE_RESOURCE = -16; // 0xfffffff0
field public static final int ERROR_UNSUPPORTED_AUTH_SCHEME = -3; // 0xfffffffd
field public static final int ERROR_UNSUPPORTED_SCHEME = -10; // 0xfffffff6
+ field public static final int SAFE_BROWSING_THREAT_MALWARE = 1; // 0x1
+ field public static final int SAFE_BROWSING_THREAT_PHISHING = 2; // 0x2
+ field public static final int SAFE_BROWSING_THREAT_UNKNOWN = 0; // 0x0
+ field public static final int SAFE_BROWSING_THREAT_UNWANTED_SOFTWARE = 3; // 0x3
}
public abstract class WebViewDatabase {
@@ -52666,8 +53092,11 @@
method public abstract java.lang.String findAddress(java.lang.String);
method public abstract void freeMemoryForTests();
method public abstract java.lang.String getDefaultUserAgent(android.content.Context);
+ method public abstract void initSafeBrowsing(android.content.Context, android.webkit.ValueCallback<java.lang.Boolean>);
method public abstract android.net.Uri[] parseFileChooserResult(int, android.content.Intent);
+ method public abstract void setSafeBrowsingWhitelist(java.util.List<java.lang.String>, android.webkit.ValueCallback<java.lang.Boolean>);
method public abstract void setWebContentsDebuggingEnabled(boolean);
+ method public abstract void shutdownSafeBrowsing();
}
public class WebViewFragment extends android.app.Fragment {
@@ -52872,6 +53301,7 @@
method public void clearTextFilter();
method public void deferNotifyDataSetChanged();
method public void fling(int);
+ method public android.widget.AbsListView.LayoutParams generateLayoutParams(android.util.AttributeSet);
method public int getCacheColorHint();
method public int getCheckedItemCount();
method public long[] getCheckedItemIds();
@@ -53038,6 +53468,9 @@
ctor public ActionMenuView(android.content.Context);
ctor public ActionMenuView(android.content.Context, android.util.AttributeSet);
method public void dismissPopupMenus();
+ method protected android.widget.ActionMenuView.LayoutParams generateDefaultLayoutParams();
+ method public android.widget.ActionMenuView.LayoutParams generateLayoutParams(android.util.AttributeSet);
+ method protected android.widget.ActionMenuView.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
method public android.view.Menu getMenu();
method public android.graphics.drawable.Drawable getOverflowIcon();
method public int getPopupTheme();
@@ -53213,7 +53646,6 @@
method public void addAll(T...);
method public void clear();
method public static android.widget.ArrayAdapter<java.lang.CharSequence> createFromResource(android.content.Context, int, int);
- method public java.lang.CharSequence[] getAutofillOptions();
method public android.content.Context getContext();
method public int getCount();
method public android.content.res.Resources.Theme getDropDownViewTheme();
@@ -53303,6 +53735,7 @@
method public void notifyDataSetChanged();
method public void notifyDataSetInvalidated();
method public void registerDataSetObserver(android.database.DataSetObserver);
+ method public void setAutofillOptions(java.lang.CharSequence...);
method public void unregisterDataSetObserver(android.database.DataSetObserver);
}
@@ -53581,6 +54014,7 @@
ctor public EditText(android.content.Context, android.util.AttributeSet, int);
ctor public EditText(android.content.Context, android.util.AttributeSet, int, int);
method public void extendSelection(int);
+ method public android.text.Editable getText();
method public void selectAll();
method public void setSelection(int, int);
method public void setSelection(int);
@@ -53702,6 +54136,8 @@
ctor public FrameLayout(android.content.Context, android.util.AttributeSet);
ctor public FrameLayout(android.content.Context, android.util.AttributeSet, int);
ctor public FrameLayout(android.content.Context, android.util.AttributeSet, int, int);
+ method protected android.widget.FrameLayout.LayoutParams generateDefaultLayoutParams();
+ method public android.widget.FrameLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
method public deprecated boolean getConsiderGoneChildrenWhenMeasuring();
method public boolean getMeasureAllChildren();
method protected void onLayout(boolean, int, int, int, int);
@@ -53748,6 +54184,9 @@
ctor public GridLayout(android.content.Context, android.util.AttributeSet);
ctor public GridLayout(android.content.Context, android.util.AttributeSet, int);
ctor public GridLayout(android.content.Context, android.util.AttributeSet, int, int);
+ method protected android.widget.GridLayout.LayoutParams generateDefaultLayoutParams();
+ method public android.widget.GridLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
+ method protected android.widget.GridLayout.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
method public int getAlignmentMode();
method public int getColumnCount();
method public int getOrientation();
@@ -53960,6 +54399,9 @@
ctor public LinearLayout(android.content.Context, android.util.AttributeSet);
ctor public LinearLayout(android.content.Context, android.util.AttributeSet, int);
ctor public LinearLayout(android.content.Context, android.util.AttributeSet, int, int);
+ method protected android.widget.LinearLayout.LayoutParams generateDefaultLayoutParams();
+ method public android.widget.LinearLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
+ method protected android.widget.LinearLayout.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
method public int getBaselineAlignedChildIndex();
method public android.graphics.drawable.Drawable getDividerDrawable();
method public int getDividerPadding();
@@ -54346,6 +54788,8 @@
method public final synchronized void incrementSecondaryProgressBy(int);
method public boolean isAnimating();
method public synchronized boolean isIndeterminate();
+ method protected synchronized void onDraw(android.graphics.Canvas);
+ method protected synchronized void onMeasure(int, int);
method public void onRestoreInstanceState(android.os.Parcelable);
method public android.os.Parcelable onSaveInstanceState();
method public synchronized void setIndeterminate(boolean);
@@ -54401,6 +54845,7 @@
ctor public RadioGroup(android.content.Context, android.util.AttributeSet);
method public void check(int);
method public void clearCheck();
+ method public android.widget.RadioGroup.LayoutParams generateLayoutParams(android.util.AttributeSet);
method public int getCheckedRadioButtonId();
method public void setOnCheckedChangeListener(android.widget.RadioGroup.OnCheckedChangeListener);
}
@@ -54443,6 +54888,7 @@
ctor public RelativeLayout(android.content.Context, android.util.AttributeSet);
ctor public RelativeLayout(android.content.Context, android.util.AttributeSet, int);
ctor public RelativeLayout(android.content.Context, android.util.AttributeSet, int, int);
+ method public android.widget.RelativeLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
method public int getGravity();
method protected void onLayout(boolean, int, int, int, int);
method public void setGravity(int);
@@ -54986,6 +55432,7 @@
public class TableLayout extends android.widget.LinearLayout {
ctor public TableLayout(android.content.Context);
ctor public TableLayout(android.content.Context, android.util.AttributeSet);
+ method public android.widget.TableLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
method public boolean isColumnCollapsed(int);
method public boolean isColumnShrinkable(int);
method public boolean isColumnStretchable(int);
@@ -55010,6 +55457,7 @@
public class TableRow extends android.widget.LinearLayout {
ctor public TableRow(android.content.Context);
ctor public TableRow(android.content.Context, android.util.AttributeSet);
+ method public android.widget.TableRow.LayoutParams generateLayoutParams(android.util.AttributeSet);
method public android.view.View getVirtualChildAt(int);
method public int getVirtualChildCount();
}
@@ -55351,6 +55799,7 @@
ctor public ToggleButton(android.content.Context);
method public java.lang.CharSequence getTextOff();
method public java.lang.CharSequence getTextOn();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
method public void setTextOff(java.lang.CharSequence);
method public void setTextOn(java.lang.CharSequence);
}
@@ -55362,6 +55811,9 @@
ctor public Toolbar(android.content.Context, android.util.AttributeSet, int, int);
method public void collapseActionView();
method public void dismissPopupMenus();
+ method protected android.widget.Toolbar.LayoutParams generateDefaultLayoutParams();
+ method public android.widget.Toolbar.LayoutParams generateLayoutParams(android.util.AttributeSet);
+ method protected android.widget.Toolbar.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
method public int getContentInsetEnd();
method public int getContentInsetEndWithActions();
method public int getContentInsetLeft();
@@ -55883,6 +56335,13 @@
public class BaseDexClassLoader extends java.lang.ClassLoader {
ctor public BaseDexClassLoader(java.lang.String, java.io.File, java.lang.String, java.lang.ClassLoader);
method public java.lang.String findLibrary(java.lang.String);
+ method protected java.util.Enumeration<java.net.URL> findResources(java.lang.String);
+ method protected synchronized java.lang.Package getPackage(java.lang.String);
+ }
+
+ public final class DelegateLastClassLoader extends dalvik.system.PathClassLoader {
+ ctor public DelegateLastClassLoader(java.lang.String, java.lang.ClassLoader);
+ ctor public DelegateLastClassLoader(java.lang.String, java.lang.String, java.lang.ClassLoader);
}
public class DexClassLoader extends dalvik.system.BaseDexClassLoader {
@@ -55901,6 +56360,7 @@
}
public final class InMemoryDexClassLoader extends dalvik.system.BaseDexClassLoader {
+ ctor public InMemoryDexClassLoader(java.nio.ByteBuffer[], java.lang.ClassLoader);
ctor public InMemoryDexClassLoader(java.nio.ByteBuffer, java.lang.ClassLoader);
}
@@ -56104,6 +56564,10 @@
public class BufferedInputStream extends java.io.FilterInputStream {
ctor public BufferedInputStream(java.io.InputStream);
ctor public BufferedInputStream(java.io.InputStream, int);
+ method public synchronized int available() throws java.io.IOException;
+ method public synchronized int read() throws java.io.IOException;
+ method public synchronized int read(byte[], int, int) throws java.io.IOException;
+ method public synchronized long skip(long) throws java.io.IOException;
field protected volatile byte[] buf;
field protected int count;
field protected int marklimit;
@@ -56114,6 +56578,9 @@
public class BufferedOutputStream extends java.io.FilterOutputStream {
ctor public BufferedOutputStream(java.io.OutputStream);
ctor public BufferedOutputStream(java.io.OutputStream, int);
+ method public synchronized void flush() throws java.io.IOException;
+ method public synchronized void write(int) throws java.io.IOException;
+ method public synchronized void write(byte[], int, int) throws java.io.IOException;
field protected byte[] buf;
field protected int count;
}
@@ -56139,7 +56606,12 @@
public class ByteArrayInputStream extends java.io.InputStream {
ctor public ByteArrayInputStream(byte[]);
ctor public ByteArrayInputStream(byte[], int, int);
+ method public synchronized int available();
+ method public void mark(int);
method public synchronized int read();
+ method public synchronized int read(byte[], int, int);
+ method public synchronized void reset();
+ method public synchronized long skip(long);
field protected byte[] buf;
field protected int count;
field protected int mark;
@@ -56152,9 +56624,11 @@
method public synchronized void reset();
method public synchronized int size();
method public synchronized byte[] toByteArray();
+ method public synchronized java.lang.String toString();
method public synchronized java.lang.String toString(java.lang.String) throws java.io.UnsupportedEncodingException;
method public deprecated synchronized java.lang.String toString(int);
method public synchronized void write(int);
+ method public synchronized void write(byte[], int, int);
method public synchronized void writeTo(java.io.OutputStream) throws java.io.IOException;
field protected byte[] buf;
field protected int count;
@@ -56174,12 +56648,17 @@
public class CharArrayWriter extends java.io.Writer {
ctor public CharArrayWriter();
ctor public CharArrayWriter(int);
+ method public java.io.CharArrayWriter append(java.lang.CharSequence);
+ method public java.io.CharArrayWriter append(java.lang.CharSequence, int, int);
+ method public java.io.CharArrayWriter append(char);
method public void close();
method public void flush();
method public void reset();
method public int size();
method public char[] toCharArray();
+ method public void write(int);
method public void write(char[], int, int);
+ method public void write(java.lang.String, int, int);
method public void writeTo(java.io.Writer) throws java.io.IOException;
field protected char[] buf;
field protected int count;
@@ -56266,6 +56745,8 @@
public class DataOutputStream extends java.io.FilterOutputStream implements java.io.DataOutput {
ctor public DataOutputStream(java.io.OutputStream);
method public final int size();
+ method public synchronized void write(int) throws java.io.IOException;
+ method public synchronized void write(byte[], int, int) throws java.io.IOException;
method public final void writeBoolean(boolean) throws java.io.IOException;
method public final void writeByte(int) throws java.io.IOException;
method public final void writeBytes(java.lang.String) throws java.io.IOException;
@@ -56365,6 +56846,7 @@
ctor public FileInputStream(java.lang.String) throws java.io.FileNotFoundException;
ctor public FileInputStream(java.io.File) throws java.io.FileNotFoundException;
ctor public FileInputStream(java.io.FileDescriptor);
+ method protected void finalize() throws java.io.IOException;
method public java.nio.channels.FileChannel getChannel();
method public final java.io.FileDescriptor getFD() throws java.io.IOException;
method public int read() throws java.io.IOException;
@@ -56381,6 +56863,7 @@
ctor public FileOutputStream(java.io.File) throws java.io.FileNotFoundException;
ctor public FileOutputStream(java.io.File, boolean) throws java.io.FileNotFoundException;
ctor public FileOutputStream(java.io.FileDescriptor);
+ method protected void finalize() throws java.io.IOException;
method public java.nio.channels.FileChannel getChannel();
method public final java.io.FileDescriptor getFD() throws java.io.IOException;
method public void write(int) throws java.io.IOException;
@@ -56494,6 +56977,8 @@
public deprecated class LineNumberInputStream extends java.io.FilterInputStream {
ctor public LineNumberInputStream(java.io.InputStream);
method public int getLineNumber();
+ method public void mark(int);
+ method public void reset() throws java.io.IOException;
method public void setLineNumber(int);
}
@@ -56723,8 +57208,10 @@
ctor public PipedInputStream(java.io.PipedOutputStream, int) throws java.io.IOException;
ctor public PipedInputStream();
ctor public PipedInputStream(int);
+ method public synchronized int available() throws java.io.IOException;
method public void connect(java.io.PipedOutputStream) throws java.io.IOException;
method public synchronized int read() throws java.io.IOException;
+ method public synchronized int read(byte[], int, int) throws java.io.IOException;
method protected synchronized void receive(int) throws java.io.IOException;
field protected static final int PIPE_SIZE = 1024; // 0x400
field protected byte[] buffer;
@@ -56736,6 +57223,7 @@
ctor public PipedOutputStream(java.io.PipedInputStream) throws java.io.IOException;
ctor public PipedOutputStream();
method public synchronized void connect(java.io.PipedInputStream) throws java.io.IOException;
+ method public synchronized void flush() throws java.io.IOException;
method public void write(int) throws java.io.IOException;
}
@@ -56746,7 +57234,9 @@
ctor public PipedReader(int);
method public void close() throws java.io.IOException;
method public void connect(java.io.PipedWriter) throws java.io.IOException;
+ method public synchronized int read() throws java.io.IOException;
method public synchronized int read(char[], int, int) throws java.io.IOException;
+ method public synchronized boolean ready() throws java.io.IOException;
}
public class PipedWriter extends java.io.Writer {
@@ -56771,6 +57261,8 @@
method public java.io.PrintStream append(char);
method public boolean checkError();
method protected void clearError();
+ method public void close();
+ method public void flush();
method public java.io.PrintStream format(java.lang.String, java.lang.Object...);
method public java.io.PrintStream format(java.util.Locale, java.lang.String, java.lang.Object...);
method public void print(boolean);
@@ -56795,6 +57287,8 @@
method public void println(java.lang.String);
method public void println(java.lang.Object);
method protected void setError();
+ method public void write(int);
+ method public void write(byte[], int, int);
}
public class PrintWriter extends java.io.Writer {
@@ -56806,6 +57300,9 @@
ctor public PrintWriter(java.lang.String, java.lang.String) throws java.io.FileNotFoundException, java.io.UnsupportedEncodingException;
ctor public PrintWriter(java.io.File) throws java.io.FileNotFoundException;
ctor public PrintWriter(java.io.File, java.lang.String) throws java.io.FileNotFoundException, java.io.UnsupportedEncodingException;
+ method public java.io.PrintWriter append(java.lang.CharSequence);
+ method public java.io.PrintWriter append(java.lang.CharSequence, int, int);
+ method public java.io.PrintWriter append(char);
method public boolean checkError();
method protected void clearError();
method public void close();
@@ -56834,13 +57331,18 @@
method public void println(java.lang.String);
method public void println(java.lang.Object);
method protected void setError();
+ method public void write(int);
method public void write(char[], int, int);
+ method public void write(char[]);
+ method public void write(java.lang.String, int, int);
+ method public void write(java.lang.String);
field protected java.io.Writer out;
}
public class PushbackInputStream extends java.io.FilterInputStream {
ctor public PushbackInputStream(java.io.InputStream, int);
ctor public PushbackInputStream(java.io.InputStream);
+ method public synchronized void close() throws java.io.IOException;
method public void unread(int) throws java.io.IOException;
method public void unread(byte[], int, int) throws java.io.IOException;
method public void unread(byte[]) throws java.io.IOException;
@@ -56964,7 +57466,11 @@
public deprecated class StringBufferInputStream extends java.io.InputStream {
ctor public StringBufferInputStream(java.lang.String);
+ method public synchronized int available();
method public synchronized int read();
+ method public synchronized int read(byte[], int, int);
+ method public synchronized void reset();
+ method public synchronized long skip(long);
field protected java.lang.String buffer;
field protected int count;
field protected int pos;
@@ -56979,10 +57485,16 @@
public class StringWriter extends java.io.Writer {
ctor public StringWriter();
ctor public StringWriter(int);
+ method public java.io.StringWriter append(java.lang.CharSequence);
+ method public java.io.StringWriter append(java.lang.CharSequence, int, int);
+ method public java.io.StringWriter append(char);
method public void close() throws java.io.IOException;
method public void flush();
method public java.lang.StringBuffer getBuffer();
+ method public void write(int);
method public void write(char[], int, int);
+ method public void write(java.lang.String);
+ method public void write(java.lang.String, int, int);
}
public class SyncFailedException extends java.io.IOException {
@@ -56997,6 +57509,7 @@
public class UncheckedIOException extends java.lang.RuntimeException {
ctor public UncheckedIOException(java.lang.String, java.io.IOException);
ctor public UncheckedIOException(java.io.IOException);
+ method public java.io.IOException getCause();
}
public class UnsupportedEncodingException extends java.io.IOException {
@@ -57006,6 +57519,7 @@
public class WriteAbortedException extends java.io.ObjectStreamException {
ctor public WriteAbortedException(java.lang.String, java.lang.Exception);
+ method public java.lang.Throwable getCause();
field public java.lang.Exception detail;
}
@@ -57773,6 +58287,7 @@
ctor public ClassNotFoundException();
ctor public ClassNotFoundException(java.lang.String);
ctor public ClassNotFoundException(java.lang.String, java.lang.Throwable);
+ method public java.lang.Throwable getCause();
method public java.lang.Throwable getException();
}
@@ -57877,6 +58392,7 @@
ctor public ExceptionInInitializerError();
ctor public ExceptionInInitializerError(java.lang.Throwable);
ctor public ExceptionInInitializerError(java.lang.String);
+ method public java.lang.Throwable getCause();
method public java.lang.Throwable getException();
}
@@ -58664,8 +59180,16 @@
method public synchronized java.lang.StringBuffer append(float);
method public synchronized java.lang.StringBuffer append(double);
method public synchronized java.lang.StringBuffer appendCodePoint(int);
+ method public synchronized int capacity();
+ method public synchronized char charAt(int);
+ method public synchronized int codePointAt(int);
+ method public synchronized int codePointBefore(int);
+ method public synchronized int codePointCount(int, int);
method public synchronized java.lang.StringBuffer delete(int, int);
method public synchronized java.lang.StringBuffer deleteCharAt(int);
+ method public synchronized void ensureCapacity(int);
+ method public synchronized void getChars(int, int, char[], int);
+ method public synchronized int indexOf(java.lang.String, int);
method public synchronized java.lang.StringBuffer insert(int, char[], int, int);
method public synchronized java.lang.StringBuffer insert(int, java.lang.Object);
method public synchronized java.lang.StringBuffer insert(int, java.lang.String);
@@ -58678,9 +59202,18 @@
method public java.lang.StringBuffer insert(int, long);
method public java.lang.StringBuffer insert(int, float);
method public java.lang.StringBuffer insert(int, double);
+ method public synchronized int lastIndexOf(java.lang.String, int);
+ method public synchronized int length();
+ method public synchronized int offsetByCodePoints(int, int);
method public synchronized java.lang.StringBuffer replace(int, int, java.lang.String);
method public synchronized java.lang.StringBuffer reverse();
+ method public synchronized void setCharAt(int, char);
+ method public synchronized void setLength(int);
+ method public synchronized java.lang.CharSequence subSequence(int, int);
+ method public synchronized java.lang.String substring(int);
+ method public synchronized java.lang.String substring(int, int);
method public synchronized java.lang.String toString();
+ method public synchronized void trimToSize();
}
public final class StringBuilder extends java.lang.AbstractStringBuilder implements java.lang.CharSequence java.io.Serializable {
@@ -59335,6 +59868,7 @@
ctor protected InvocationTargetException();
ctor public InvocationTargetException(java.lang.Throwable);
ctor public InvocationTargetException(java.lang.Throwable, java.lang.String);
+ method public java.lang.Throwable getCause();
method public java.lang.Throwable getTargetException();
}
@@ -59450,6 +59984,7 @@
public class UndeclaredThrowableException extends java.lang.RuntimeException {
ctor public UndeclaredThrowableException(java.lang.Throwable);
ctor public UndeclaredThrowableException(java.lang.Throwable, java.lang.String);
+ method public java.lang.Throwable getCause();
method public java.lang.Throwable getUndeclaredThrowable();
}
@@ -60347,6 +60882,7 @@
method public java.lang.String getQuery();
method public java.lang.String getRef();
method public java.lang.String getUserInfo();
+ method public synchronized int hashCode();
method public java.net.URLConnection openConnection() throws java.io.IOException;
method public java.net.URLConnection openConnection(java.net.Proxy) throws java.io.IOException;
method public final java.io.InputStream openStream() throws java.io.IOException;
@@ -60576,7 +61112,6 @@
method public final int arrayOffset();
method public abstract java.nio.CharBuffer asReadOnlyBuffer();
method public final char charAt(int);
- method public java.util.stream.IntStream chars();
method public abstract java.nio.CharBuffer compact();
method public int compareTo(java.nio.CharBuffer);
method public abstract java.nio.CharBuffer duplicate();
@@ -61433,6 +61968,7 @@
public final class DirectoryIteratorException extends java.util.ConcurrentModificationException {
ctor public DirectoryIteratorException(java.io.IOException);
+ method public java.io.IOException getCause();
}
public class DirectoryNotEmptyException extends java.nio.file.FileSystemException {
@@ -62398,9 +62934,11 @@
public static class KeyStore.PasswordProtection implements javax.security.auth.Destroyable java.security.KeyStore.ProtectionParameter {
ctor public KeyStore.PasswordProtection(char[]);
ctor public KeyStore.PasswordProtection(char[], java.lang.String, java.security.spec.AlgorithmParameterSpec);
+ method public synchronized void destroy() throws javax.security.auth.DestroyFailedException;
method public synchronized char[] getPassword();
method public java.lang.String getProtectionAlgorithm();
method public java.security.spec.AlgorithmParameterSpec getProtectionParameters();
+ method public synchronized boolean isDestroyed();
}
public static final class KeyStore.PrivateKeyEntry implements java.security.KeyStore.Entry {
@@ -62580,6 +63118,7 @@
public class PrivilegedActionException extends java.lang.Exception {
ctor public PrivilegedActionException(java.lang.Exception);
+ method public java.lang.Throwable getCause();
method public java.lang.Exception getException();
}
@@ -62602,22 +63141,30 @@
method public synchronized java.lang.Object compute(java.lang.Object, java.util.function.BiFunction<? super java.lang.Object, ? super java.lang.Object, ? extends java.lang.Object>);
method public synchronized java.lang.Object computeIfAbsent(java.lang.Object, java.util.function.Function<? super java.lang.Object, ? extends java.lang.Object>);
method public synchronized java.lang.Object computeIfPresent(java.lang.Object, java.util.function.BiFunction<? super java.lang.Object, ? super java.lang.Object, ? extends java.lang.Object>);
+ method public java.util.Enumeration<java.lang.Object> elements();
+ method public synchronized java.util.Set<java.util.Map.Entry<java.lang.Object, java.lang.Object>> entrySet();
method public synchronized void forEach(java.util.function.BiConsumer<? super java.lang.Object, ? super java.lang.Object>);
+ method public java.lang.Object get(java.lang.Object);
method public java.lang.String getInfo();
method public java.lang.String getName();
method public synchronized java.lang.Object getOrDefault(java.lang.Object, java.lang.Object);
method public synchronized java.security.Provider.Service getService(java.lang.String, java.lang.String);
method public synchronized java.util.Set<java.security.Provider.Service> getServices();
method public double getVersion();
+ method public java.util.Set<java.lang.Object> keySet();
+ method public java.util.Enumeration<java.lang.Object> keys();
method public synchronized java.lang.Object merge(java.lang.Object, java.lang.Object, java.util.function.BiFunction<? super java.lang.Object, ? super java.lang.Object, ? extends java.lang.Object>);
method public synchronized java.lang.Object put(java.lang.Object, java.lang.Object);
method public synchronized void putAll(java.util.Map<?, ?>);
method public synchronized java.lang.Object putIfAbsent(java.lang.Object, java.lang.Object);
method protected synchronized void putService(java.security.Provider.Service);
+ method public synchronized java.lang.Object remove(java.lang.Object);
method protected synchronized void removeService(java.security.Provider.Service);
method public synchronized boolean replace(java.lang.Object, java.lang.Object, java.lang.Object);
method public synchronized java.lang.Object replace(java.lang.Object, java.lang.Object);
method public synchronized void replaceAll(java.util.function.BiFunction<? super java.lang.Object, ? super java.lang.Object, ? extends java.lang.Object>);
+ method public java.lang.String toString();
+ method public java.util.Collection<java.lang.Object> values();
}
public static class Provider.Service {
@@ -62663,7 +63210,9 @@
method public final java.security.Provider getProvider();
method public static byte[] getSeed(int);
method protected final int next(int);
+ method public synchronized void nextBytes(byte[]);
method public synchronized void setSeed(byte[]);
+ method public void setSeed(long);
}
public abstract class SecureRandomSpi implements java.io.Serializable {
@@ -63210,6 +63759,7 @@
public abstract class PKIXRevocationChecker extends java.security.cert.PKIXCertPathChecker {
ctor protected PKIXRevocationChecker();
+ method public java.security.cert.PKIXRevocationChecker clone();
method public java.util.List<java.security.cert.Extension> getOcspExtensions();
method public java.net.URI getOcspResponder();
method public java.security.cert.X509Certificate getOcspResponderCert();
@@ -65462,7 +66012,6 @@
public final class DayOfWeek extends java.lang.Enum implements java.time.temporal.TemporalAccessor java.time.temporal.TemporalAdjuster {
method public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
method public static java.time.DayOfWeek from(java.time.temporal.TemporalAccessor);
- method public int get(java.time.temporal.TemporalField);
method public java.lang.String getDisplayName(java.time.format.TextStyle, java.util.Locale);
method public long getLong(java.time.temporal.TemporalField);
method public int getValue();
@@ -65470,8 +66019,6 @@
method public java.time.DayOfWeek minus(long);
method public static java.time.DayOfWeek of(int);
method public java.time.DayOfWeek plus(long);
- method public <R> R query(java.time.temporal.TemporalQuery<R>);
- method public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
method public static java.time.DayOfWeek valueOf(java.lang.String);
method public static final java.time.DayOfWeek[] values();
enum_constant public static final java.time.DayOfWeek FRIDAY;
@@ -65547,6 +66094,8 @@
method public boolean isBefore(java.time.Instant);
method public boolean isSupported(java.time.temporal.TemporalField);
method public boolean isSupported(java.time.temporal.TemporalUnit);
+ method public java.time.Instant minus(java.time.temporal.TemporalAmount);
+ method public java.time.Instant minus(long, java.time.temporal.TemporalUnit);
method public java.time.Instant minusMillis(long);
method public java.time.Instant minusNanos(long);
method public java.time.Instant minusSeconds(long);
@@ -65556,6 +66105,7 @@
method public static java.time.Instant ofEpochSecond(long);
method public static java.time.Instant ofEpochSecond(long, long);
method public static java.time.Instant parse(java.lang.CharSequence);
+ method public java.time.Instant plus(java.time.temporal.TemporalAmount);
method public java.time.Instant plus(long, java.time.temporal.TemporalUnit);
method public java.time.Instant plusMillis(long);
method public java.time.Instant plusNanos(long);
@@ -65563,6 +66113,7 @@
method public long toEpochMilli();
method public java.time.Instant truncatedTo(java.time.temporal.TemporalUnit);
method public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
+ method public java.time.Instant with(java.time.temporal.TemporalAdjuster);
method public java.time.Instant with(java.time.temporal.TemporalField, long);
field public static final java.time.Instant EPOCH;
field public static final java.time.Instant MAX;
@@ -65572,6 +66123,7 @@
public final class LocalDate implements java.time.chrono.ChronoLocalDate java.io.Serializable java.time.temporal.Temporal java.time.temporal.TemporalAdjuster {
method public java.time.LocalDateTime atStartOfDay();
method public java.time.ZonedDateTime atStartOfDay(java.time.ZoneId);
+ method public java.time.LocalDateTime atTime(java.time.LocalTime);
method public java.time.LocalDateTime atTime(int, int);
method public java.time.LocalDateTime atTime(int, int, int);
method public java.time.LocalDateTime atTime(int, int, int, int);
@@ -65586,6 +66138,8 @@
method public int getMonthValue();
method public int getYear();
method public int lengthOfMonth();
+ method public java.time.LocalDate minus(java.time.temporal.TemporalAmount);
+ method public java.time.LocalDate minus(long, java.time.temporal.TemporalUnit);
method public java.time.LocalDate minusDays(long);
method public java.time.LocalDate minusMonths(long);
method public java.time.LocalDate minusWeeks(long);
@@ -65599,12 +66153,16 @@
method public static java.time.LocalDate ofYearDay(int, int);
method public static java.time.LocalDate parse(java.lang.CharSequence);
method public static java.time.LocalDate parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
+ method public java.time.LocalDate plus(java.time.temporal.TemporalAmount);
+ method public java.time.LocalDate plus(long, java.time.temporal.TemporalUnit);
method public java.time.LocalDate plusDays(long);
method public java.time.LocalDate plusMonths(long);
method public java.time.LocalDate plusWeeks(long);
method public java.time.LocalDate plusYears(long);
method public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
method public java.time.Period until(java.time.chrono.ChronoLocalDate);
+ method public java.time.LocalDate with(java.time.temporal.TemporalAdjuster);
+ method public java.time.LocalDate with(java.time.temporal.TemporalField, long);
method public java.time.LocalDate withDayOfMonth(int);
method public java.time.LocalDate withDayOfYear(int);
method public java.time.LocalDate withMonth(int);
@@ -65629,6 +66187,8 @@
method public int getSecond();
method public int getYear();
method public boolean isSupported(java.time.temporal.TemporalField);
+ method public java.time.LocalDateTime minus(java.time.temporal.TemporalAmount);
+ method public java.time.LocalDateTime minus(long, java.time.temporal.TemporalUnit);
method public java.time.LocalDateTime minusDays(long);
method public java.time.LocalDateTime minusHours(long);
method public java.time.LocalDateTime minusMinutes(long);
@@ -65651,6 +66211,7 @@
method public static java.time.LocalDateTime ofInstant(java.time.Instant, java.time.ZoneId);
method public static java.time.LocalDateTime parse(java.lang.CharSequence);
method public static java.time.LocalDateTime parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
+ method public java.time.LocalDateTime plus(java.time.temporal.TemporalAmount);
method public java.time.LocalDateTime plus(long, java.time.temporal.TemporalUnit);
method public java.time.LocalDateTime plusDays(long);
method public java.time.LocalDateTime plusHours(long);
@@ -65664,6 +66225,7 @@
method public java.time.LocalTime toLocalTime();
method public java.time.LocalDateTime truncatedTo(java.time.temporal.TemporalUnit);
method public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
+ method public java.time.LocalDateTime with(java.time.temporal.TemporalAdjuster);
method public java.time.LocalDateTime with(java.time.temporal.TemporalField, long);
method public java.time.LocalDateTime withDayOfMonth(int);
method public java.time.LocalDateTime withDayOfYear(int);
@@ -65693,6 +66255,8 @@
method public boolean isBefore(java.time.LocalTime);
method public boolean isSupported(java.time.temporal.TemporalField);
method public boolean isSupported(java.time.temporal.TemporalUnit);
+ method public java.time.LocalTime minus(java.time.temporal.TemporalAmount);
+ method public java.time.LocalTime minus(long, java.time.temporal.TemporalUnit);
method public java.time.LocalTime minusHours(long);
method public java.time.LocalTime minusMinutes(long);
method public java.time.LocalTime minusNanos(long);
@@ -65707,6 +66271,7 @@
method public static java.time.LocalTime ofSecondOfDay(long);
method public static java.time.LocalTime parse(java.lang.CharSequence);
method public static java.time.LocalTime parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
+ method public java.time.LocalTime plus(java.time.temporal.TemporalAmount);
method public java.time.LocalTime plus(long, java.time.temporal.TemporalUnit);
method public java.time.LocalTime plusHours(long);
method public java.time.LocalTime plusMinutes(long);
@@ -65716,6 +66281,7 @@
method public int toSecondOfDay();
method public java.time.LocalTime truncatedTo(java.time.temporal.TemporalUnit);
method public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
+ method public java.time.LocalTime with(java.time.temporal.TemporalAdjuster);
method public java.time.LocalTime with(java.time.temporal.TemporalField, long);
method public java.time.LocalTime withHour(int);
method public java.time.LocalTime withMinute(int);
@@ -65732,7 +66298,6 @@
method public int firstDayOfYear(boolean);
method public java.time.Month firstMonthOfQuarter();
method public static java.time.Month from(java.time.temporal.TemporalAccessor);
- method public int get(java.time.temporal.TemporalField);
method public java.lang.String getDisplayName(java.time.format.TextStyle, java.util.Locale);
method public long getLong(java.time.temporal.TemporalField);
method public int getValue();
@@ -65743,8 +66308,6 @@
method public java.time.Month minus(long);
method public static java.time.Month of(int);
method public java.time.Month plus(long);
- method public <R> R query(java.time.temporal.TemporalQuery<R>);
- method public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
method public static java.time.Month valueOf(java.lang.String);
method public static final java.time.Month[] values();
enum_constant public static final java.time.Month APRIL;
@@ -65811,6 +66374,8 @@
method public boolean isEqual(java.time.OffsetDateTime);
method public boolean isSupported(java.time.temporal.TemporalField);
method public boolean isSupported(java.time.temporal.TemporalUnit);
+ method public java.time.OffsetDateTime minus(java.time.temporal.TemporalAmount);
+ method public java.time.OffsetDateTime minus(long, java.time.temporal.TemporalUnit);
method public java.time.OffsetDateTime minusDays(long);
method public java.time.OffsetDateTime minusHours(long);
method public java.time.OffsetDateTime minusMinutes(long);
@@ -65828,6 +66393,7 @@
method public static java.time.OffsetDateTime ofInstant(java.time.Instant, java.time.ZoneId);
method public static java.time.OffsetDateTime parse(java.lang.CharSequence);
method public static java.time.OffsetDateTime parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
+ method public java.time.OffsetDateTime plus(java.time.temporal.TemporalAmount);
method public java.time.OffsetDateTime plus(long, java.time.temporal.TemporalUnit);
method public java.time.OffsetDateTime plusDays(long);
method public java.time.OffsetDateTime plusHours(long);
@@ -65847,6 +66413,7 @@
method public java.time.ZonedDateTime toZonedDateTime();
method public java.time.OffsetDateTime truncatedTo(java.time.temporal.TemporalUnit);
method public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
+ method public java.time.OffsetDateTime with(java.time.temporal.TemporalAdjuster);
method public java.time.OffsetDateTime with(java.time.temporal.TemporalField, long);
method public java.time.OffsetDateTime withDayOfMonth(int);
method public java.time.OffsetDateTime withDayOfYear(int);
@@ -65879,6 +66446,8 @@
method public boolean isEqual(java.time.OffsetTime);
method public boolean isSupported(java.time.temporal.TemporalField);
method public boolean isSupported(java.time.temporal.TemporalUnit);
+ method public java.time.OffsetTime minus(java.time.temporal.TemporalAmount);
+ method public java.time.OffsetTime minus(long, java.time.temporal.TemporalUnit);
method public java.time.OffsetTime minusHours(long);
method public java.time.OffsetTime minusMinutes(long);
method public java.time.OffsetTime minusNanos(long);
@@ -65891,6 +66460,7 @@
method public static java.time.OffsetTime ofInstant(java.time.Instant, java.time.ZoneId);
method public static java.time.OffsetTime parse(java.lang.CharSequence);
method public static java.time.OffsetTime parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
+ method public java.time.OffsetTime plus(java.time.temporal.TemporalAmount);
method public java.time.OffsetTime plus(long, java.time.temporal.TemporalUnit);
method public java.time.OffsetTime plusHours(long);
method public java.time.OffsetTime plusMinutes(long);
@@ -65899,6 +66469,7 @@
method public java.time.LocalTime toLocalTime();
method public java.time.OffsetTime truncatedTo(java.time.temporal.TemporalUnit);
method public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
+ method public java.time.OffsetTime with(java.time.temporal.TemporalAdjuster);
method public java.time.OffsetTime with(java.time.temporal.TemporalField, long);
method public java.time.OffsetTime withHour(int);
method public java.time.OffsetTime withMinute(int);
@@ -65925,6 +66496,7 @@
method public java.time.Period minusMonths(long);
method public java.time.Period minusYears(long);
method public java.time.Period multipliedBy(int);
+ method public java.time.Period negated();
method public java.time.Period normalized();
method public static java.time.Period of(int, int, int);
method public static java.time.Period ofDays(int);
@@ -65963,6 +66535,8 @@
method public boolean isSupported(java.time.temporal.TemporalUnit);
method public boolean isValidMonthDay(java.time.MonthDay);
method public int length();
+ method public java.time.Year minus(java.time.temporal.TemporalAmount);
+ method public java.time.Year minus(long, java.time.temporal.TemporalUnit);
method public java.time.Year minusYears(long);
method public static java.time.Year now();
method public static java.time.Year now(java.time.ZoneId);
@@ -65970,9 +66544,11 @@
method public static java.time.Year of(int);
method public static java.time.Year parse(java.lang.CharSequence);
method public static java.time.Year parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
+ method public java.time.Year plus(java.time.temporal.TemporalAmount);
method public java.time.Year plus(long, java.time.temporal.TemporalUnit);
method public java.time.Year plusYears(long);
method public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
+ method public java.time.Year with(java.time.temporal.TemporalAdjuster);
method public java.time.Year with(java.time.temporal.TemporalField, long);
field public static final int MAX_VALUE = 999999999; // 0x3b9ac9ff
field public static final int MIN_VALUE = -999999999; // 0xc4653601
@@ -65997,6 +66573,8 @@
method public boolean isValidDay(int);
method public int lengthOfMonth();
method public int lengthOfYear();
+ method public java.time.YearMonth minus(java.time.temporal.TemporalAmount);
+ method public java.time.YearMonth minus(long, java.time.temporal.TemporalUnit);
method public java.time.YearMonth minusMonths(long);
method public java.time.YearMonth minusYears(long);
method public static java.time.YearMonth now();
@@ -66006,10 +66584,12 @@
method public static java.time.YearMonth of(int, int);
method public static java.time.YearMonth parse(java.lang.CharSequence);
method public static java.time.YearMonth parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
+ method public java.time.YearMonth plus(java.time.temporal.TemporalAmount);
method public java.time.YearMonth plus(long, java.time.temporal.TemporalUnit);
method public java.time.YearMonth plusMonths(long);
method public java.time.YearMonth plusYears(long);
method public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
+ method public java.time.YearMonth with(java.time.temporal.TemporalAdjuster);
method public java.time.YearMonth with(java.time.temporal.TemporalField, long);
method public java.time.YearMonth withMonth(int);
method public java.time.YearMonth withYear(int);
@@ -66033,7 +66613,6 @@
method public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
method public int compareTo(java.time.ZoneOffset);
method public static java.time.ZoneOffset from(java.time.temporal.TemporalAccessor);
- method public int get(java.time.temporal.TemporalField);
method public java.lang.String getId();
method public long getLong(java.time.temporal.TemporalField);
method public java.time.zone.ZoneRules getRules();
@@ -66044,8 +66623,6 @@
method public static java.time.ZoneOffset ofHoursMinutes(int, int);
method public static java.time.ZoneOffset ofHoursMinutesSeconds(int, int, int);
method public static java.time.ZoneOffset ofTotalSeconds(int);
- method public <R> R query(java.time.temporal.TemporalQuery<R>);
- method public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
field public static final java.time.ZoneOffset MAX;
field public static final java.time.ZoneOffset MIN;
field public static final java.time.ZoneOffset UTC;
@@ -66066,6 +66643,8 @@
method public int getYear();
method public java.time.ZoneId getZone();
method public boolean isSupported(java.time.temporal.TemporalField);
+ method public java.time.ZonedDateTime minus(java.time.temporal.TemporalAmount);
+ method public java.time.ZonedDateTime minus(long, java.time.temporal.TemporalUnit);
method public java.time.ZonedDateTime minusDays(long);
method public java.time.ZonedDateTime minusHours(long);
method public java.time.ZonedDateTime minusMinutes(long);
@@ -66086,6 +66665,7 @@
method public static java.time.ZonedDateTime ofStrict(java.time.LocalDateTime, java.time.ZoneOffset, java.time.ZoneId);
method public static java.time.ZonedDateTime parse(java.lang.CharSequence);
method public static java.time.ZonedDateTime parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
+ method public java.time.ZonedDateTime plus(java.time.temporal.TemporalAmount);
method public java.time.ZonedDateTime plus(long, java.time.temporal.TemporalUnit);
method public java.time.ZonedDateTime plusDays(long);
method public java.time.ZonedDateTime plusHours(long);
@@ -66095,10 +66675,12 @@
method public java.time.ZonedDateTime plusSeconds(long);
method public java.time.ZonedDateTime plusWeeks(long);
method public java.time.ZonedDateTime plusYears(long);
+ method public java.time.LocalDate toLocalDate();
method public java.time.LocalDateTime toLocalDateTime();
method public java.time.OffsetDateTime toOffsetDateTime();
method public java.time.ZonedDateTime truncatedTo(java.time.temporal.TemporalUnit);
method public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
+ method public java.time.ZonedDateTime with(java.time.temporal.TemporalAdjuster);
method public java.time.ZonedDateTime with(java.time.temporal.TemporalField, long);
method public java.time.ZonedDateTime withDayOfMonth(int);
method public java.time.ZonedDateTime withDayOfYear(int);
@@ -66143,17 +66725,27 @@
method public default boolean isSupported(java.time.temporal.TemporalUnit);
method public abstract int lengthOfMonth();
method public default int lengthOfYear();
+ method public default java.time.chrono.ChronoLocalDate minus(java.time.temporal.TemporalAmount);
+ method public default java.time.chrono.ChronoLocalDate minus(long, java.time.temporal.TemporalUnit);
+ method public default java.time.chrono.ChronoLocalDate plus(java.time.temporal.TemporalAmount);
method public default java.time.chrono.ChronoLocalDate plus(long, java.time.temporal.TemporalUnit);
method public static java.util.Comparator<java.time.chrono.ChronoLocalDate> timeLineOrder();
method public default long toEpochDay();
method public abstract java.lang.String toString();
method public abstract long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
method public abstract java.time.chrono.ChronoPeriod until(java.time.chrono.ChronoLocalDate);
+ method public default java.time.chrono.ChronoLocalDate with(java.time.temporal.TemporalAdjuster);
method public default java.time.chrono.ChronoLocalDate with(java.time.temporal.TemporalField, long);
}
abstract class ChronoLocalDateImpl<D extends java.time.chrono.ChronoLocalDate> implements java.time.chrono.ChronoLocalDate java.io.Serializable java.time.temporal.Temporal java.time.temporal.TemporalAdjuster {
+ method public D minus(java.time.temporal.TemporalAmount);
+ method public D minus(long, java.time.temporal.TemporalUnit);
+ method public D plus(java.time.temporal.TemporalAmount);
+ method public D plus(long, java.time.temporal.TemporalUnit);
method public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
+ method public D with(java.time.temporal.TemporalAdjuster);
+ method public D with(java.time.temporal.TemporalField, long);
}
public abstract interface ChronoLocalDateTime<D extends java.time.chrono.ChronoLocalDate> implements java.lang.Comparable java.time.temporal.Temporal java.time.temporal.TemporalAdjuster {
@@ -66170,6 +66762,9 @@
method public default boolean isEqual(java.time.chrono.ChronoLocalDateTime<?>);
method public abstract boolean isSupported(java.time.temporal.TemporalField);
method public default boolean isSupported(java.time.temporal.TemporalUnit);
+ method public default java.time.chrono.ChronoLocalDateTime<D> minus(java.time.temporal.TemporalAmount);
+ method public default java.time.chrono.ChronoLocalDateTime<D> minus(long, java.time.temporal.TemporalUnit);
+ method public default java.time.chrono.ChronoLocalDateTime<D> plus(java.time.temporal.TemporalAmount);
method public abstract java.time.chrono.ChronoLocalDateTime<D> plus(long, java.time.temporal.TemporalUnit);
method public static java.util.Comparator<java.time.chrono.ChronoLocalDateTime<?>> timeLineOrder();
method public default long toEpochSecond(java.time.ZoneOffset);
@@ -66177,6 +66772,7 @@
method public abstract D toLocalDate();
method public abstract java.time.LocalTime toLocalTime();
method public abstract java.lang.String toString();
+ method public default java.time.chrono.ChronoLocalDateTime<D> with(java.time.temporal.TemporalAdjuster);
method public abstract java.time.chrono.ChronoLocalDateTime<D> with(java.time.temporal.TemporalField, long);
}
@@ -66214,6 +66810,9 @@
method public default boolean isEqual(java.time.chrono.ChronoZonedDateTime<?>);
method public abstract boolean isSupported(java.time.temporal.TemporalField);
method public default boolean isSupported(java.time.temporal.TemporalUnit);
+ method public default java.time.chrono.ChronoZonedDateTime<D> minus(java.time.temporal.TemporalAmount);
+ method public default java.time.chrono.ChronoZonedDateTime<D> minus(long, java.time.temporal.TemporalUnit);
+ method public default java.time.chrono.ChronoZonedDateTime<D> plus(java.time.temporal.TemporalAmount);
method public abstract java.time.chrono.ChronoZonedDateTime<D> plus(long, java.time.temporal.TemporalUnit);
method public static java.util.Comparator<java.time.chrono.ChronoZonedDateTime<?>> timeLineOrder();
method public default long toEpochSecond();
@@ -66222,6 +66821,7 @@
method public abstract java.time.chrono.ChronoLocalDateTime<D> toLocalDateTime();
method public default java.time.LocalTime toLocalTime();
method public abstract java.lang.String toString();
+ method public default java.time.chrono.ChronoZonedDateTime<D> with(java.time.temporal.TemporalAdjuster);
method public abstract java.time.chrono.ChronoZonedDateTime<D> with(java.time.temporal.TemporalField, long);
method public abstract java.time.chrono.ChronoZonedDateTime<D> withEarlierOffsetAtOverlap();
method public abstract java.time.chrono.ChronoZonedDateTime<D> withLaterOffsetAtOverlap();
@@ -66288,6 +66888,7 @@
method public java.time.chrono.ChronoLocalDateTime<java.time.chrono.HijrahDate> localDateTime(java.time.temporal.TemporalAccessor);
method public int prolepticYear(java.time.chrono.Era, int);
method public java.time.temporal.ValueRange range(java.time.temporal.ChronoField);
+ method public java.time.chrono.HijrahDate resolveDate(java.util.Map<java.time.temporal.TemporalField, java.lang.Long>, java.time.format.ResolverStyle);
method public java.time.chrono.ChronoZonedDateTime<java.time.chrono.HijrahDate> zonedDateTime(java.time.temporal.TemporalAccessor);
method public java.time.chrono.ChronoZonedDateTime<java.time.chrono.HijrahDate> zonedDateTime(java.time.Instant, java.time.ZoneId);
field public static final java.time.chrono.HijrahChronology INSTANCE;
@@ -66299,23 +66900,24 @@
method public java.time.chrono.HijrahChronology getChronology();
method public java.time.chrono.HijrahEra getEra();
method public long getLong(java.time.temporal.TemporalField);
- method public boolean isLeapYear();
method public int lengthOfMonth();
- method public int lengthOfYear();
+ method public java.time.chrono.HijrahDate minus(java.time.temporal.TemporalAmount);
+ method public java.time.chrono.HijrahDate minus(long, java.time.temporal.TemporalUnit);
method public static java.time.chrono.HijrahDate now();
method public static java.time.chrono.HijrahDate now(java.time.ZoneId);
method public static java.time.chrono.HijrahDate now(java.time.Clock);
method public static java.time.chrono.HijrahDate of(int, int, int);
- method public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
- method public long toEpochDay();
+ method public java.time.chrono.HijrahDate plus(java.time.temporal.TemporalAmount);
+ method public java.time.chrono.HijrahDate plus(long, java.time.temporal.TemporalUnit);
method public java.time.chrono.ChronoPeriod until(java.time.chrono.ChronoLocalDate);
+ method public java.time.chrono.HijrahDate with(java.time.temporal.TemporalField, long);
+ method public java.time.chrono.HijrahDate with(java.time.temporal.TemporalAdjuster);
method public java.time.chrono.HijrahDate withVariant(java.time.chrono.HijrahChronology);
}
public final class HijrahEra extends java.lang.Enum implements java.time.chrono.Era {
method public int getValue();
method public static java.time.chrono.HijrahEra of(int);
- method public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
method public static java.time.chrono.HijrahEra valueOf(java.lang.String);
method public static final java.time.chrono.HijrahEra[] values();
enum_constant public static final java.time.chrono.HijrahEra AH;
@@ -66340,6 +66942,7 @@
method public java.time.Period period(int, int, int);
method public int prolepticYear(java.time.chrono.Era, int);
method public java.time.temporal.ValueRange range(java.time.temporal.ChronoField);
+ method public java.time.LocalDate resolveDate(java.util.Map<java.time.temporal.TemporalField, java.lang.Long>, java.time.format.ResolverStyle);
method public java.time.ZonedDateTime zonedDateTime(java.time.temporal.TemporalAccessor);
method public java.time.ZonedDateTime zonedDateTime(java.time.Instant, java.time.ZoneId);
field public static final java.time.chrono.IsoChronology INSTANCE;
@@ -66372,6 +66975,7 @@
method public java.time.chrono.ChronoLocalDateTime<java.time.chrono.JapaneseDate> localDateTime(java.time.temporal.TemporalAccessor);
method public int prolepticYear(java.time.chrono.Era, int);
method public java.time.temporal.ValueRange range(java.time.temporal.ChronoField);
+ method public java.time.chrono.JapaneseDate resolveDate(java.util.Map<java.time.temporal.TemporalField, java.lang.Long>, java.time.format.ResolverStyle);
method public java.time.chrono.ChronoZonedDateTime<java.time.chrono.JapaneseDate> zonedDateTime(java.time.temporal.TemporalAccessor);
method public java.time.chrono.ChronoZonedDateTime<java.time.chrono.JapaneseDate> zonedDateTime(java.time.Instant, java.time.ZoneId);
field public static final java.time.chrono.JapaneseChronology INSTANCE;
@@ -66383,17 +66987,19 @@
method public java.time.chrono.JapaneseChronology getChronology();
method public java.time.chrono.JapaneseEra getEra();
method public long getLong(java.time.temporal.TemporalField);
- method public boolean isSupported(java.time.temporal.TemporalField);
method public int lengthOfMonth();
- method public int lengthOfYear();
+ method public java.time.chrono.JapaneseDate minus(java.time.temporal.TemporalAmount);
+ method public java.time.chrono.JapaneseDate minus(long, java.time.temporal.TemporalUnit);
method public static java.time.chrono.JapaneseDate now();
method public static java.time.chrono.JapaneseDate now(java.time.ZoneId);
method public static java.time.chrono.JapaneseDate now(java.time.Clock);
method public static java.time.chrono.JapaneseDate of(java.time.chrono.JapaneseEra, int, int, int);
method public static java.time.chrono.JapaneseDate of(int, int, int);
- method public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
- method public long toEpochDay();
+ method public java.time.chrono.JapaneseDate plus(java.time.temporal.TemporalAmount);
+ method public java.time.chrono.JapaneseDate plus(long, java.time.temporal.TemporalUnit);
method public java.time.chrono.ChronoPeriod until(java.time.chrono.ChronoLocalDate);
+ method public java.time.chrono.JapaneseDate with(java.time.temporal.TemporalField, long);
+ method public java.time.chrono.JapaneseDate with(java.time.temporal.TemporalAdjuster);
}
public final class JapaneseEra implements java.time.chrono.Era java.io.Serializable {
@@ -66425,6 +67031,7 @@
method public java.time.chrono.ChronoLocalDateTime<java.time.chrono.MinguoDate> localDateTime(java.time.temporal.TemporalAccessor);
method public int prolepticYear(java.time.chrono.Era, int);
method public java.time.temporal.ValueRange range(java.time.temporal.ChronoField);
+ method public java.time.chrono.MinguoDate resolveDate(java.util.Map<java.time.temporal.TemporalField, java.lang.Long>, java.time.format.ResolverStyle);
method public java.time.chrono.ChronoZonedDateTime<java.time.chrono.MinguoDate> zonedDateTime(java.time.temporal.TemporalAccessor);
method public java.time.chrono.ChronoZonedDateTime<java.time.chrono.MinguoDate> zonedDateTime(java.time.Instant, java.time.ZoneId);
field public static final java.time.chrono.MinguoChronology INSTANCE;
@@ -66437,13 +67044,17 @@
method public java.time.chrono.MinguoEra getEra();
method public long getLong(java.time.temporal.TemporalField);
method public int lengthOfMonth();
+ method public java.time.chrono.MinguoDate minus(java.time.temporal.TemporalAmount);
+ method public java.time.chrono.MinguoDate minus(long, java.time.temporal.TemporalUnit);
method public static java.time.chrono.MinguoDate now();
method public static java.time.chrono.MinguoDate now(java.time.ZoneId);
method public static java.time.chrono.MinguoDate now(java.time.Clock);
method public static java.time.chrono.MinguoDate of(int, int, int);
- method public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
- method public long toEpochDay();
+ method public java.time.chrono.MinguoDate plus(java.time.temporal.TemporalAmount);
+ method public java.time.chrono.MinguoDate plus(long, java.time.temporal.TemporalUnit);
method public java.time.chrono.ChronoPeriod until(java.time.chrono.ChronoLocalDate);
+ method public java.time.chrono.MinguoDate with(java.time.temporal.TemporalField, long);
+ method public java.time.chrono.MinguoDate with(java.time.temporal.TemporalAdjuster);
}
public final class MinguoEra extends java.lang.Enum implements java.time.chrono.Era {
@@ -66473,6 +67084,7 @@
method public java.time.chrono.ChronoLocalDateTime<java.time.chrono.ThaiBuddhistDate> localDateTime(java.time.temporal.TemporalAccessor);
method public int prolepticYear(java.time.chrono.Era, int);
method public java.time.temporal.ValueRange range(java.time.temporal.ChronoField);
+ method public java.time.chrono.ThaiBuddhistDate resolveDate(java.util.Map<java.time.temporal.TemporalField, java.lang.Long>, java.time.format.ResolverStyle);
method public java.time.chrono.ChronoZonedDateTime<java.time.chrono.ThaiBuddhistDate> zonedDateTime(java.time.temporal.TemporalAccessor);
method public java.time.chrono.ChronoZonedDateTime<java.time.chrono.ThaiBuddhistDate> zonedDateTime(java.time.Instant, java.time.ZoneId);
field public static final java.time.chrono.ThaiBuddhistChronology INSTANCE;
@@ -66485,13 +67097,17 @@
method public java.time.chrono.ThaiBuddhistEra getEra();
method public long getLong(java.time.temporal.TemporalField);
method public int lengthOfMonth();
+ method public java.time.chrono.ThaiBuddhistDate minus(java.time.temporal.TemporalAmount);
+ method public java.time.chrono.ThaiBuddhistDate minus(long, java.time.temporal.TemporalUnit);
method public static java.time.chrono.ThaiBuddhistDate now();
method public static java.time.chrono.ThaiBuddhistDate now(java.time.ZoneId);
method public static java.time.chrono.ThaiBuddhistDate now(java.time.Clock);
method public static java.time.chrono.ThaiBuddhistDate of(int, int, int);
- method public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
- method public long toEpochDay();
+ method public java.time.chrono.ThaiBuddhistDate plus(java.time.temporal.TemporalAmount);
+ method public java.time.chrono.ThaiBuddhistDate plus(long, java.time.temporal.TemporalUnit);
method public java.time.chrono.ChronoPeriod until(java.time.chrono.ChronoLocalDate);
+ method public java.time.chrono.ThaiBuddhistDate with(java.time.temporal.TemporalField, long);
+ method public java.time.chrono.ThaiBuddhistDate with(java.time.temporal.TemporalAdjuster);
}
public final class ThaiBuddhistEra extends java.lang.Enum implements java.time.chrono.Era {
@@ -66670,7 +67286,6 @@
method public int checkValidIntValue(long);
method public long checkValidValue(long);
method public java.time.temporal.TemporalUnit getBaseUnit();
- method public java.lang.String getDisplayName(java.util.Locale);
method public long getFrom(java.time.temporal.TemporalAccessor);
method public java.time.temporal.TemporalUnit getRangeUnit();
method public boolean isDateBased();
@@ -66718,7 +67333,6 @@
method public java.time.Duration getDuration();
method public boolean isDateBased();
method public boolean isDurationEstimated();
- method public boolean isSupportedBy(java.time.temporal.Temporal);
method public boolean isTimeBased();
method public static java.time.temporal.ChronoUnit valueOf(java.lang.String);
method public static final java.time.temporal.ChronoUnit[] values();
@@ -67058,7 +67672,6 @@
method public E removeLast();
method public boolean removeLastOccurrence(java.lang.Object);
method public int size();
- method public java.util.Spliterator<E> spliterator();
}
public class ArrayList<E> extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable {
@@ -67069,11 +67682,7 @@
method public void ensureCapacity(int);
method public void forEach(java.util.function.Consumer<? super E>);
method public E get(int);
- method public boolean removeIf(java.util.function.Predicate<? super E>);
- method public void replaceAll(java.util.function.UnaryOperator<E>);
method public int size();
- method public void sort(java.util.Comparator<? super E>);
- method public java.util.Spliterator<E> spliterator();
method public void trimToSize();
}
@@ -67444,6 +68053,7 @@
method public default boolean removeIf(java.util.function.Predicate<? super E>);
method public abstract boolean retainAll(java.util.Collection<?>);
method public abstract int size();
+ method public default java.util.Spliterator<E> spliterator();
method public default java.util.stream.Stream<E> stream();
method public abstract java.lang.Object[] toArray();
method public abstract <T> T[] toArray(T[]);
@@ -67784,18 +68394,7 @@
ctor public HashMap();
ctor public HashMap(java.util.Map<? extends K, ? extends V>);
method public java.lang.Object clone();
- method public V compute(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>);
- method public V computeIfAbsent(K, java.util.function.Function<? super K, ? extends V>);
- method public V computeIfPresent(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>);
method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
- method public void forEach(java.util.function.BiConsumer<? super K, ? super V>);
- method public V getOrDefault(java.lang.Object, V);
- method public V merge(K, V, java.util.function.BiFunction<? super V, ? super V, ? extends V>);
- method public V putIfAbsent(K, V);
- method public boolean remove(java.lang.Object, java.lang.Object);
- method public boolean replace(K, V, V);
- method public V replace(K, V);
- method public void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>);
}
public class HashSet<E> extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable java.util.Set {
@@ -67806,7 +68405,6 @@
method public java.lang.Object clone();
method public java.util.Iterator<E> iterator();
method public int size();
- method public java.util.Spliterator<E> spliterator();
}
public class Hashtable<K, V> extends java.util.Dictionary implements java.lang.Cloneable java.util.Map java.io.Serializable {
@@ -67824,9 +68422,11 @@
method public boolean containsValue(java.lang.Object);
method public synchronized java.util.Enumeration<V> elements();
method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
+ method public synchronized boolean equals(java.lang.Object);
method public synchronized void forEach(java.util.function.BiConsumer<? super K, ? super V>);
method public synchronized V get(java.lang.Object);
method public synchronized V getOrDefault(java.lang.Object, V);
+ method public synchronized int hashCode();
method public synchronized boolean isEmpty();
method public java.util.Set<K> keySet();
method public synchronized java.util.Enumeration<K> keys();
@@ -67841,6 +68441,7 @@
method public synchronized V replace(K, V);
method public synchronized void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>);
method public synchronized int size();
+ method public synchronized java.lang.String toString();
method public java.util.Collection<V> values();
}
@@ -67850,8 +68451,6 @@
ctor public IdentityHashMap(java.util.Map<? extends K, ? extends V>);
method public java.lang.Object clone();
method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
- method public void forEach(java.util.function.BiConsumer<? super K, ? super V>);
- method public void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>);
}
public class IllegalFormatCodePointException extends java.util.IllegalFormatException {
@@ -67962,7 +68561,6 @@
method public E removeLast();
method public boolean removeLastOccurrence(java.lang.Object);
method public int size();
- method public java.util.Spliterator<E> spliterator();
}
public abstract interface List<E> implements java.util.Collection {
@@ -68585,6 +69183,7 @@
ctor public SimpleTimeZone(int, java.lang.String, int, int, int, int, int, int, int, int, int, int, int);
method public int getOffset(int, int, int, int, int, int);
method public int getRawOffset();
+ method public synchronized int hashCode();
method public boolean inDaylightTime(java.util.Date);
method public void setDSTSavings(int);
method public void setEndRule(int, int, int, int);
@@ -68857,7 +69456,6 @@
method public K firstKey();
method public java.util.Map.Entry<K, V> floorEntry(K);
method public K floorKey(K);
- method public void forEach(java.util.function.BiConsumer<? super K, ? super V>);
method public java.util.NavigableMap<K, V> headMap(K, boolean);
method public java.util.SortedMap<K, V> headMap(K);
method public java.util.Map.Entry<K, V> higherEntry(K);
@@ -68869,9 +69467,6 @@
method public java.util.NavigableSet<K> navigableKeySet();
method public java.util.Map.Entry<K, V> pollFirstEntry();
method public java.util.Map.Entry<K, V> pollLastEntry();
- method public boolean replace(K, V, V);
- method public V replace(K, V);
- method public void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>);
method public java.util.NavigableMap<K, V> subMap(K, boolean, K, boolean);
method public java.util.SortedMap<K, V> subMap(K, K);
method public java.util.NavigableMap<K, V> tailMap(K, boolean);
@@ -68899,7 +69494,6 @@
method public E pollFirst();
method public E pollLast();
method public int size();
- method public java.util.Spliterator<E> spliterator();
method public java.util.NavigableSet<E> subSet(E, boolean, E, boolean);
method public java.util.SortedSet<E> subSet(E, E);
method public java.util.NavigableSet<E> tailSet(E, boolean);
@@ -68936,30 +69530,49 @@
ctor public Vector(int);
ctor public Vector();
ctor public Vector(java.util.Collection<? extends E>);
+ method public synchronized boolean add(E);
+ method public synchronized boolean addAll(java.util.Collection<? extends E>);
+ method public synchronized boolean addAll(int, java.util.Collection<? extends E>);
method public synchronized void addElement(E);
method public synchronized int capacity();
method public synchronized java.lang.Object clone();
+ method public synchronized boolean containsAll(java.util.Collection<?>);
method public synchronized void copyInto(java.lang.Object[]);
method public synchronized E elementAt(int);
method public java.util.Enumeration<E> elements();
method public synchronized void ensureCapacity(int);
+ method public synchronized boolean equals(java.lang.Object);
method public synchronized E firstElement();
method public synchronized void forEach(java.util.function.Consumer<? super E>);
method public synchronized E get(int);
+ method public synchronized int hashCode();
method public synchronized int indexOf(java.lang.Object, int);
method public synchronized void insertElementAt(E, int);
+ method public synchronized boolean isEmpty();
+ method public synchronized java.util.Iterator<E> iterator();
method public synchronized E lastElement();
+ method public synchronized int lastIndexOf(java.lang.Object);
method public synchronized int lastIndexOf(java.lang.Object, int);
+ method public synchronized java.util.ListIterator<E> listIterator(int);
+ method public synchronized java.util.ListIterator<E> listIterator();
+ method public synchronized E remove(int);
+ method public synchronized boolean removeAll(java.util.Collection<?>);
method public synchronized void removeAllElements();
method public synchronized boolean removeElement(java.lang.Object);
method public synchronized void removeElementAt(int);
method public synchronized boolean removeIf(java.util.function.Predicate<? super E>);
+ method protected synchronized void removeRange(int, int);
method public synchronized void replaceAll(java.util.function.UnaryOperator<E>);
+ method public synchronized boolean retainAll(java.util.Collection<?>);
+ method public synchronized E set(int, E);
method public synchronized void setElementAt(E, int);
method public synchronized void setSize(int);
method public synchronized int size();
method public synchronized void sort(java.util.Comparator<? super E>);
- method public java.util.Spliterator<E> spliterator();
+ method public synchronized java.util.List<E> subList(int, int);
+ method public synchronized java.lang.Object[] toArray();
+ method public synchronized <T> T[] toArray(T[]);
+ method public synchronized java.lang.String toString();
method public synchronized void trimToSize();
field protected int capacityIncrement;
field protected int elementCount;
@@ -68972,8 +69585,6 @@
ctor public WeakHashMap();
ctor public WeakHashMap(java.util.Map<? extends K, ? extends V>);
method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
- method public void forEach(java.util.function.BiConsumer<? super K, ? super V>);
- method public void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>);
}
}
@@ -69008,7 +69619,6 @@
method public void put(E) throws java.lang.InterruptedException;
method public int remainingCapacity();
method public int size();
- method public java.util.Spliterator<E> spliterator();
method public E take() throws java.lang.InterruptedException;
}
@@ -69199,13 +69809,9 @@
ctor public ConcurrentHashMap(java.util.Map<? extends K, ? extends V>);
ctor public ConcurrentHashMap(int, float);
ctor public ConcurrentHashMap(int, float, int);
- method public V compute(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>);
- method public V computeIfAbsent(K, java.util.function.Function<? super K, ? extends V>);
- method public V computeIfPresent(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>);
method public boolean contains(java.lang.Object);
method public java.util.Enumeration<V> elements();
method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
- method public void forEach(java.util.function.BiConsumer<? super K, ? super V>);
method public void forEach(long, java.util.function.BiConsumer<? super K, ? super V>);
method public <U> void forEach(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.Consumer<? super U>);
method public void forEachEntry(long, java.util.function.Consumer<? super java.util.Map.Entry<K, V>>);
@@ -69214,14 +69820,11 @@
method public <U> void forEachKey(long, java.util.function.Function<? super K, ? extends U>, java.util.function.Consumer<? super U>);
method public void forEachValue(long, java.util.function.Consumer<? super V>);
method public <U> void forEachValue(long, java.util.function.Function<? super V, ? extends U>, java.util.function.Consumer<? super U>);
- method public V getOrDefault(java.lang.Object, V);
method public java.util.concurrent.ConcurrentHashMap.KeySetView<K, V> keySet(V);
method public java.util.Enumeration<K> keys();
method public long mappingCount();
- method public V merge(K, V, java.util.function.BiFunction<? super V, ? super V, ? extends V>);
method public static <K> java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet();
method public static <K> java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet(int);
- method public V putIfAbsent(K, V);
method public <U> U reduce(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>);
method public java.util.Map.Entry<K, V> reduceEntries(long, java.util.function.BiFunction<java.util.Map.Entry<K, V>, java.util.Map.Entry<K, V>, ? extends java.util.Map.Entry<K, V>>);
method public <U> U reduceEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>);
@@ -69241,10 +69844,6 @@
method public double reduceValuesToDouble(long, java.util.function.ToDoubleFunction<? super V>, double, java.util.function.DoubleBinaryOperator);
method public int reduceValuesToInt(long, java.util.function.ToIntFunction<? super V>, int, java.util.function.IntBinaryOperator);
method public long reduceValuesToLong(long, java.util.function.ToLongFunction<? super V>, long, java.util.function.LongBinaryOperator);
- method public boolean remove(java.lang.Object, java.lang.Object);
- method public boolean replace(K, V, V);
- method public V replace(K, V);
- method public void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>);
method public <U> U search(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>);
method public <U> U searchEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>);
method public <U> U searchKeys(long, java.util.function.Function<? super K, ? extends U>);
@@ -69305,7 +69904,6 @@
method public E removeLast();
method public boolean removeLastOccurrence(java.lang.Object);
method public int size();
- method public java.util.Spliterator<E> spliterator();
}
public class ConcurrentLinkedQueue<E> extends java.util.AbstractQueue implements java.util.Queue java.io.Serializable {
@@ -69316,7 +69914,6 @@
method public E peek();
method public E poll();
method public int size();
- method public java.util.Spliterator<E> spliterator();
}
public abstract interface ConcurrentMap<K, V> implements java.util.Map {
@@ -69348,9 +69945,6 @@
method public K ceilingKey(K);
method public java.util.concurrent.ConcurrentSkipListMap<K, V> clone();
method public java.util.Comparator<? super K> comparator();
- method public V compute(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>);
- method public V computeIfAbsent(K, java.util.function.Function<? super K, ? extends V>);
- method public V computeIfPresent(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>);
method public java.util.NavigableSet<K> descendingKeySet();
method public java.util.concurrent.ConcurrentNavigableMap<K, V> descendingMap();
method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
@@ -69358,25 +69952,18 @@
method public K firstKey();
method public java.util.Map.Entry<K, V> floorEntry(K);
method public K floorKey(K);
- method public void forEach(java.util.function.BiConsumer<? super K, ? super V>);
- method public V getOrDefault(java.lang.Object, V);
method public java.util.concurrent.ConcurrentNavigableMap<K, V> headMap(K, boolean);
method public java.util.concurrent.ConcurrentNavigableMap<K, V> headMap(K);
method public java.util.Map.Entry<K, V> higherEntry(K);
method public K higherKey(K);
+ method public java.util.NavigableSet<K> keySet();
method public java.util.Map.Entry<K, V> lastEntry();
method public K lastKey();
method public java.util.Map.Entry<K, V> lowerEntry(K);
method public K lowerKey(K);
- method public V merge(K, V, java.util.function.BiFunction<? super V, ? super V, ? extends V>);
method public java.util.NavigableSet<K> navigableKeySet();
method public java.util.Map.Entry<K, V> pollFirstEntry();
method public java.util.Map.Entry<K, V> pollLastEntry();
- method public V putIfAbsent(K, V);
- method public boolean remove(java.lang.Object, java.lang.Object);
- method public boolean replace(K, V, V);
- method public V replace(K, V);
- method public void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>);
method public java.util.concurrent.ConcurrentNavigableMap<K, V> subMap(K, boolean, K, boolean);
method public java.util.concurrent.ConcurrentNavigableMap<K, V> subMap(K, K);
method public java.util.concurrent.ConcurrentNavigableMap<K, V> tailMap(K, boolean);
@@ -69404,7 +69991,6 @@
method public E pollFirst();
method public E pollLast();
method public int size();
- method public java.util.Spliterator<E> spliterator();
method public java.util.NavigableSet<E> subSet(E, boolean, E, boolean);
method public java.util.NavigableSet<E> subSet(E, E);
method public java.util.NavigableSet<E> tailSet(E, boolean);
@@ -69451,9 +70037,7 @@
ctor public CopyOnWriteArraySet(java.util.Collection<? extends E>);
method public void forEach(java.util.function.Consumer<? super E>);
method public java.util.Iterator<E> iterator();
- method public boolean removeIf(java.util.function.Predicate<? super E>);
method public int size();
- method public java.util.Spliterator<E> spliterator();
}
public class CountDownLatch {
@@ -69612,6 +70196,7 @@
method public java.lang.Thread.UncaughtExceptionHandler getUncaughtExceptionHandler();
method public boolean hasQueuedSubmissions();
method public <T> T invoke(java.util.concurrent.ForkJoinTask<T>);
+ method public <T> java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>);
method public boolean isQuiescent();
method public boolean isShutdown();
method public boolean isTerminated();
@@ -69621,6 +70206,9 @@
method public void shutdown();
method public java.util.List<java.lang.Runnable> shutdownNow();
method public <T> java.util.concurrent.ForkJoinTask<T> submit(java.util.concurrent.ForkJoinTask<T>);
+ method public <T> java.util.concurrent.ForkJoinTask<T> submit(java.util.concurrent.Callable<T>);
+ method public <T> java.util.concurrent.ForkJoinTask<T> submit(java.lang.Runnable, T);
+ method public java.util.concurrent.ForkJoinTask<?> submit(java.lang.Runnable);
field public static final java.util.concurrent.ForkJoinPool.ForkJoinWorkerThreadFactory defaultForkJoinWorkerThreadFactory;
}
@@ -69744,7 +70332,6 @@
method public E removeLast();
method public boolean removeLastOccurrence(java.lang.Object);
method public int size();
- method public java.util.Spliterator<E> spliterator();
method public E take() throws java.lang.InterruptedException;
method public E takeFirst() throws java.lang.InterruptedException;
method public E takeLast() throws java.lang.InterruptedException;
@@ -69765,7 +70352,6 @@
method public void put(E) throws java.lang.InterruptedException;
method public int remainingCapacity();
method public int size();
- method public java.util.Spliterator<E> spliterator();
method public E take() throws java.lang.InterruptedException;
}
@@ -69785,7 +70371,6 @@
method public void put(E);
method public int remainingCapacity();
method public int size();
- method public java.util.Spliterator<E> spliterator();
method public E take() throws java.lang.InterruptedException;
method public void transfer(E) throws java.lang.InterruptedException;
method public boolean tryTransfer(E);
@@ -69833,7 +70418,6 @@
method public void put(E);
method public int remainingCapacity();
method public int size();
- method public java.util.Spliterator<E> spliterator();
method public E take() throws java.lang.InterruptedException;
}
@@ -69937,7 +70521,6 @@
method public void put(E) throws java.lang.InterruptedException;
method public int remainingCapacity();
method public int size();
- method public java.util.Spliterator<E> spliterator();
method public E take() throws java.lang.InterruptedException;
}
@@ -69949,9 +70532,11 @@
method public static java.util.concurrent.ThreadLocalRandom current();
method public double nextDouble(double);
method public double nextDouble(double, double);
+ method public double nextGaussian();
method public int nextInt(int, int);
method public long nextLong(long);
method public long nextLong(long, long);
+ method public void setSeed(long);
}
public class ThreadPoolExecutor extends java.util.concurrent.AbstractExecutorService {
@@ -69965,6 +70550,7 @@
method public boolean awaitTermination(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
method protected void beforeExecute(java.lang.Thread, java.lang.Runnable);
method public void execute(java.lang.Runnable);
+ method protected void finalize();
method public int getActiveCount();
method public long getCompletedTaskCount();
method public int getCorePoolSize();
@@ -70835,8 +71421,11 @@
ctor public JarFile(java.io.File) throws java.io.IOException;
ctor public JarFile(java.io.File, boolean) throws java.io.IOException;
ctor public JarFile(java.io.File, boolean, int) throws java.io.IOException;
+ method public java.util.Enumeration<java.util.jar.JarEntry> entries();
+ method public synchronized java.io.InputStream getInputStream(java.util.zip.ZipEntry) throws java.io.IOException;
method public java.util.jar.JarEntry getJarEntry(java.lang.String);
method public java.util.jar.Manifest getManifest() throws java.io.IOException;
+ method public java.util.stream.Stream<java.util.jar.JarEntry> stream();
field public static final java.lang.String MANIFEST_NAME = "META-INF/MANIFEST.MF";
}
@@ -70916,6 +71505,8 @@
public class ConsoleHandler extends java.util.logging.StreamHandler {
ctor public ConsoleHandler();
+ method public void close();
+ method public void publish(java.util.logging.LogRecord);
}
public class ErrorManager {
@@ -71705,6 +72296,7 @@
method public int deflate(byte[]);
method public int deflate(byte[], int, int, int);
method public void end();
+ method protected void finalize();
method public void finish();
method public boolean finished();
method public int getAdler();
@@ -71737,6 +72329,8 @@
ctor public DeflaterInputStream(java.io.InputStream);
ctor public DeflaterInputStream(java.io.InputStream, java.util.zip.Deflater);
ctor public DeflaterInputStream(java.io.InputStream, java.util.zip.Deflater, int);
+ method public void mark(int);
+ method public void reset() throws java.io.IOException;
field protected final byte[] buf;
field protected final java.util.zip.Deflater def;
}
@@ -71767,6 +72361,7 @@
ctor public GZIPOutputStream(java.io.OutputStream, int, boolean) throws java.io.IOException;
ctor public GZIPOutputStream(java.io.OutputStream) throws java.io.IOException;
ctor public GZIPOutputStream(java.io.OutputStream, boolean) throws java.io.IOException;
+ method public synchronized void write(byte[], int, int) throws java.io.IOException;
field protected java.util.zip.CRC32 crc;
}
@@ -71774,6 +72369,7 @@
ctor public Inflater(boolean);
ctor public Inflater();
method public void end();
+ method protected void finalize();
method public boolean finished();
method public int getAdler();
method public long getBytesRead();
@@ -71900,6 +72496,7 @@
ctor public ZipFile(java.io.File, java.nio.charset.Charset) throws java.io.IOException;
method public void close() throws java.io.IOException;
method public java.util.Enumeration<? extends java.util.zip.ZipEntry> entries();
+ method protected void finalize() throws java.io.IOException;
method public java.lang.String getComment();
method public java.util.zip.ZipEntry getEntry(java.lang.String);
method public java.io.InputStream getInputStream(java.util.zip.ZipEntry) throws java.io.IOException;
@@ -72006,6 +72603,7 @@
method public void setComment(java.lang.String);
method public void setLevel(int);
method public void setMethod(int);
+ method public synchronized void write(byte[], int, int) throws java.io.IOException;
field public static final int CENATT = 36; // 0x24
field public static final int CENATX = 38; // 0x26
field public static final int CENCOM = 32; // 0x20
@@ -72162,6 +72760,7 @@
public class ExemptionMechanism {
ctor protected ExemptionMechanism(javax.crypto.ExemptionMechanismSpi, java.security.Provider, java.lang.String);
+ method protected void finalize();
method public final byte[] genExemptionBlob() throws javax.crypto.ExemptionMechanismException, java.lang.IllegalStateException;
method public final int genExemptionBlob(byte[]) throws javax.crypto.ExemptionMechanismException, java.lang.IllegalStateException, javax.crypto.ShortBufferException;
method public final int genExemptionBlob(byte[], int) throws javax.crypto.ExemptionMechanismException, java.lang.IllegalStateException, javax.crypto.ShortBufferException;
@@ -74550,6 +75149,7 @@
ctor public TransformerException(java.lang.String, java.lang.Throwable);
ctor public TransformerException(java.lang.String, javax.xml.transform.SourceLocator);
ctor public TransformerException(java.lang.String, javax.xml.transform.SourceLocator, java.lang.Throwable);
+ method public java.lang.Throwable getCause();
method public java.lang.Throwable getException();
method public java.lang.String getLocationAsString();
method public javax.xml.transform.SourceLocator getLocator();
@@ -74820,6 +75420,7 @@
public class XPathException extends java.lang.Exception {
ctor public XPathException(java.lang.String);
ctor public XPathException(java.lang.Throwable);
+ method public java.lang.Throwable getCause();
}
public abstract interface XPathExpression {
@@ -75248,6 +75849,8 @@
public class JSONException extends java.lang.Exception {
ctor public JSONException(java.lang.String);
+ ctor public JSONException(java.lang.String, java.lang.Throwable);
+ ctor public JSONException(java.lang.Throwable);
}
public class JSONObject {
diff --git a/api/system-removed.txt b/api/system-removed.txt
index 48f62b1..dfadae4 100644
--- a/api/system-removed.txt
+++ b/api/system-removed.txt
@@ -295,18 +295,8 @@
package android.os.storage {
public class StorageManager {
- method public deprecated void allocateBytes(java.io.File, long, int) throws java.io.IOException;
- method public deprecated long getAllocatableBytes(java.io.File, int) throws java.io.IOException;
- method public deprecated long getCacheQuotaBytes(java.io.File) throws java.io.IOException;
- method public deprecated long getCacheQuotaBytes() throws java.io.IOException;
- method public deprecated long getCacheSizeBytes(java.io.File) throws java.io.IOException;
- method public deprecated long getCacheSizeBytes() throws java.io.IOException;
- method public deprecated long getExternalCacheQuotaBytes() throws java.io.IOException;
- method public deprecated long getExternalCacheSizeBytes() throws java.io.IOException;
method public android.os.storage.StorageVolume getPrimaryVolume();
method public android.os.storage.StorageVolume[] getVolumeList();
- method public deprecated boolean isCacheBehaviorAtomic(java.io.File) throws java.io.IOException;
- method public deprecated void setCacheBehaviorAtomic(java.io.File, boolean) throws java.io.IOException;
}
}
diff --git a/api/test-current.txt b/api/test-current.txt
index e657170..52a659e 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -121,6 +121,7 @@
field public static final java.lang.String REQUEST_IGNORE_BATTERY_OPTIMIZATIONS = "android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS";
field public static final java.lang.String REQUEST_INSTALL_PACKAGES = "android.permission.REQUEST_INSTALL_PACKAGES";
field public static final deprecated java.lang.String RESTART_PACKAGES = "android.permission.RESTART_PACKAGES";
+ field public static final java.lang.String SEND_EMBMS_INTENTS = "android.permission.SEND_EMBMS_INTENTS";
field public static final java.lang.String SEND_RESPOND_VIA_MESSAGE = "android.permission.SEND_RESPOND_VIA_MESSAGE";
field public static final java.lang.String SEND_SMS = "android.permission.SEND_SMS";
field public static final java.lang.String SET_ALARM = "com.android.alarm.permission.SET_ALARM";
@@ -388,6 +389,7 @@
field public static final int childIndicatorRight = 16843024; // 0x1010110
field public static final int childIndicatorStart = 16843731; // 0x10103d3
field public static final int choiceMode = 16843051; // 0x101012b
+ field public static final int classLoader = 16844139; // 0x101056b
field public static final int clearTaskOnLaunch = 16842773; // 0x1010015
field public static final int clickable = 16842981; // 0x10100e5
field public static final int clipChildren = 16842986; // 0x10100ea
@@ -1180,6 +1182,7 @@
field public static final int showSilent = 16843259; // 0x10101fb
field public static final int showText = 16843949; // 0x10104ad
field public static final deprecated int showWeekNumber = 16843582; // 0x101033e
+ field public static final int showWhenLocked = 16844137; // 0x1010569
field public static final deprecated int shownWeekCount = 16843585; // 0x1010341
field public static final int shrinkColumns = 16843082; // 0x101014a
field public static final deprecated int singleLine = 16843101; // 0x101015d
@@ -1438,6 +1441,7 @@
field public static final int trimPathOffset = 16843786; // 0x101040a
field public static final int trimPathStart = 16843784; // 0x1010408
field public static final int tunerCount = 16844061; // 0x101051d
+ field public static final int turnScreenOn = 16844138; // 0x101056a
field public static final int type = 16843169; // 0x10101a1
field public static final int typeface = 16842902; // 0x1010096
field public static final int uiOptions = 16843672; // 0x1010398
@@ -1935,6 +1939,7 @@
field public static final int VideoView_error_text_invalid_progressive_playback = 17039381; // 0x1040015
field public static final int VideoView_error_text_unknown = 17039377; // 0x1040011
field public static final int VideoView_error_title = 17039378; // 0x1040012
+ field public static final int autofill = 17039386; // 0x104001a
field public static final int cancel = 17039360; // 0x1040000
field public static final int copy = 17039361; // 0x1040001
field public static final int copyUrl = 17039362; // 0x1040002
@@ -3162,6 +3167,7 @@
public final class AnimatorSet extends android.animation.Animator {
ctor public AnimatorSet();
+ method public android.animation.AnimatorSet clone();
method public java.util.ArrayList<android.animation.Animator> getChildAnimations();
method public long getCurrentPlayTime();
method public long getDuration();
@@ -3280,6 +3286,7 @@
public final class ObjectAnimator extends android.animation.ValueAnimator {
ctor public ObjectAnimator();
+ method public android.animation.ObjectAnimator clone();
method public java.lang.String getPropertyName();
method public java.lang.Object getTarget();
method public static android.animation.ObjectAnimator ofArgb(java.lang.Object, java.lang.String, int...);
@@ -3305,6 +3312,7 @@
method public static <T, V> android.animation.ObjectAnimator ofObject(T, android.util.Property<T, V>, android.animation.TypeConverter<android.graphics.PointF, V>, android.graphics.Path);
method public static android.animation.ObjectAnimator ofPropertyValuesHolder(java.lang.Object, android.animation.PropertyValuesHolder...);
method public void setAutoCancel(boolean);
+ method public android.animation.ObjectAnimator setDuration(long);
method public void setProperty(android.util.Property);
method public void setPropertyName(java.lang.String);
}
@@ -3386,6 +3394,7 @@
ctor public ValueAnimator();
method public void addUpdateListener(android.animation.ValueAnimator.AnimatorUpdateListener);
method public static boolean areAnimatorsEnabled();
+ method public android.animation.ValueAnimator clone();
method public float getAnimatedFraction();
method public java.lang.Object getAnimatedValue();
method public java.lang.Object getAnimatedValue(java.lang.String);
@@ -3761,10 +3770,12 @@
method public final void setResult(int);
method public final void setResult(int, android.content.Intent);
method public final deprecated void setSecondaryProgress(int);
+ method public void setShowWhenLocked(boolean);
method public void setTaskDescription(android.app.ActivityManager.TaskDescription);
method public void setTitle(java.lang.CharSequence);
method public void setTitle(int);
method public deprecated void setTitleColor(int);
+ method public void setTurnScreenOn(boolean);
method public void setVisible(boolean);
method public final void setVolumeControlStream(int);
method public void setVrModeEnabled(boolean, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
@@ -4217,6 +4228,12 @@
public class Application extends android.content.ContextWrapper implements android.content.ComponentCallbacks2 {
ctor public Application();
+ method public android.app.Activity instantiateActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent);
+ method public android.app.backup.BackupAgent instantiateBackupAgent(java.lang.ClassLoader, java.lang.String);
+ method public android.app.Instrumentation instantiateInstrumentation(java.lang.ClassLoader, java.lang.String);
+ method public android.content.ContentProvider instantiateProvider(java.lang.ClassLoader, java.lang.String);
+ method public android.content.BroadcastReceiver instantiateReceiver(java.lang.ClassLoader, java.lang.String, android.content.Intent);
+ method public android.app.Service instantiateService(java.lang.ClassLoader, java.lang.String, android.content.Intent);
method public void onConfigurationChanged(android.content.res.Configuration);
method public void onCreate();
method public void onLowMemory();
@@ -4972,6 +4989,7 @@
ctor public IntentService(java.lang.String);
method public android.os.IBinder onBind(android.content.Intent);
method protected abstract void onHandleIntent(android.content.Intent);
+ method public void onStart(android.content.Intent, int);
method public void setIntentRedelivery(boolean);
}
@@ -5606,6 +5624,7 @@
method public java.util.List<android.app.NotificationChannelGroup> getNotificationChannelGroups();
method public java.util.List<android.app.NotificationChannel> getNotificationChannels();
method public android.app.NotificationManager.Policy getNotificationPolicy();
+ method public boolean isNotificationListenerAccessGranted(android.content.ComponentName);
method public boolean isNotificationPolicyAccessGranted();
method public void notify(int, android.app.Notification);
method public void notify(java.lang.String, int, android.app.Notification);
@@ -10654,6 +10673,7 @@
method public abstract int getPackageUid(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
method public abstract java.lang.String[] getPackagesForUid(int);
method public abstract java.util.List<android.content.pm.PackageInfo> getPackagesHoldingPermissions(java.lang.String[], int);
+ method public abstract java.lang.String getPermissionControllerPackageName();
method public abstract android.content.pm.PermissionGroupInfo getPermissionGroupInfo(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
method public abstract android.content.pm.PermissionInfo getPermissionInfo(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
method public abstract int getPreferredActivities(java.util.List<android.content.IntentFilter>, java.util.List<android.content.ComponentName>, java.lang.String);
@@ -10755,6 +10775,7 @@
field public static final java.lang.String FEATURE_NFC_HOST_CARD_EMULATION = "android.hardware.nfc.hce";
field public static final java.lang.String FEATURE_NFC_HOST_CARD_EMULATION_NFCF = "android.hardware.nfc.hcef";
field public static final java.lang.String FEATURE_OPENGLES_EXTENSION_PACK = "android.hardware.opengles.aep";
+ field public static final java.lang.String FEATURE_PC = "android.hardware.type.pc";
field public static final java.lang.String FEATURE_PICTURE_IN_PICTURE = "android.software.picture_in_picture";
field public static final java.lang.String FEATURE_PRINTING = "android.software.print";
field public static final java.lang.String FEATURE_SCREEN_LANDSCAPE = "android.hardware.screen.landscape";
@@ -10796,6 +10817,7 @@
field public static final java.lang.String FEATURE_WIFI = "android.hardware.wifi";
field public static final java.lang.String FEATURE_WIFI_AWARE = "android.hardware.wifi.aware";
field public static final java.lang.String FEATURE_WIFI_DIRECT = "android.hardware.wifi.direct";
+ field public static final java.lang.String FEATURE_WIFI_PASSPOINT = "android.hardware.wifi.passpoint";
field public static final int GET_ACTIVITIES = 1; // 0x1
field public static final int GET_CONFIGURATIONS = 16384; // 0x4000
field public static final deprecated int GET_DISABLED_COMPONENTS = 512; // 0x200
@@ -11104,6 +11126,7 @@
public static class AssetFileDescriptor.AutoCloseInputStream extends android.os.ParcelFileDescriptor.AutoCloseInputStream {
ctor public AssetFileDescriptor.AutoCloseInputStream(android.content.res.AssetFileDescriptor) throws java.io.IOException;
+ method public void mark(int);
}
public static class AssetFileDescriptor.AutoCloseOutputStream extends android.os.ParcelFileDescriptor.AutoCloseOutputStream {
@@ -11411,6 +11434,7 @@
method public void copyStringToBuffer(int, android.database.CharArrayBuffer);
method public void deactivate();
method public void fillWindow(int, android.database.CursorWindow);
+ method protected void finalize();
method public byte[] getBlob(int);
method public int getColumnCount();
method public int getColumnIndex(java.lang.String);
@@ -11892,6 +11916,7 @@
method public void beginTransactionWithListenerNonExclusive(android.database.sqlite.SQLiteTransactionListener);
method public android.database.sqlite.SQLiteStatement compileStatement(java.lang.String) throws android.database.SQLException;
method public static android.database.sqlite.SQLiteDatabase create(android.database.sqlite.SQLiteDatabase.CursorFactory);
+ method public static android.database.sqlite.SQLiteDatabase createInMemory(android.database.sqlite.SQLiteDatabase.OpenParams);
method public int delete(java.lang.String, java.lang.String, java.lang.String[]);
method public static boolean deleteDatabase(java.io.File);
method public void disableWriteAheadLogging();
@@ -11921,6 +11946,7 @@
method public boolean needUpgrade(int);
method protected void onAllReferencesReleased();
method public static android.database.sqlite.SQLiteDatabase openDatabase(java.lang.String, android.database.sqlite.SQLiteDatabase.CursorFactory, int);
+ method public static android.database.sqlite.SQLiteDatabase openDatabase(java.lang.String, android.database.sqlite.SQLiteDatabase.OpenParams);
method public static android.database.sqlite.SQLiteDatabase openDatabase(java.lang.String, android.database.sqlite.SQLiteDatabase.CursorFactory, int, android.database.DatabaseErrorHandler);
method public static android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.io.File, android.database.sqlite.SQLiteDatabase.CursorFactory);
method public static android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, android.database.sqlite.SQLiteDatabase.CursorFactory);
@@ -11971,6 +11997,26 @@
method public abstract android.database.Cursor newCursor(android.database.sqlite.SQLiteDatabase, android.database.sqlite.SQLiteCursorDriver, java.lang.String, android.database.sqlite.SQLiteQuery);
}
+ public static final class SQLiteDatabase.OpenParams {
+ method public android.database.sqlite.SQLiteDatabase.CursorFactory getCursorFactory();
+ method public android.database.DatabaseErrorHandler getErrorHandler();
+ method public int getLookasideSlotCount();
+ method public int getLookasideSlotSize();
+ method public int getOpenFlags();
+ }
+
+ public static final class SQLiteDatabase.OpenParams.Builder {
+ ctor public SQLiteDatabase.OpenParams.Builder();
+ ctor public SQLiteDatabase.OpenParams.Builder(android.database.sqlite.SQLiteDatabase.OpenParams);
+ method public android.database.sqlite.SQLiteDatabase.OpenParams.Builder addOpenFlags(int);
+ method public android.database.sqlite.SQLiteDatabase.OpenParams build();
+ method public android.database.sqlite.SQLiteDatabase.OpenParams.Builder removeOpenFlags(int);
+ method public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setCursorFactory(android.database.sqlite.SQLiteDatabase.CursorFactory);
+ method public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setErrorHandler(android.database.DatabaseErrorHandler);
+ method public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setLookasideConfig(int, int);
+ method public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setOpenFlags(int);
+ }
+
public class SQLiteDatabaseCorruptException extends android.database.sqlite.SQLiteException {
ctor public SQLiteDatabaseCorruptException();
ctor public SQLiteDatabaseCorruptException(java.lang.String);
@@ -11986,6 +12032,31 @@
ctor public SQLiteDatatypeMismatchException(java.lang.String);
}
+ public final class SQLiteDebug {
+ method public static void dump(android.util.Printer, java.lang.String[]);
+ method public static android.database.sqlite.SQLiteDebug.PagerStats getDatabaseInfo();
+ field public static final boolean DEBUG_SQL_LOG;
+ field public static final boolean DEBUG_SQL_STATEMENTS;
+ field public static final boolean DEBUG_SQL_TIME;
+ }
+
+ public static class SQLiteDebug.DbStats {
+ ctor public SQLiteDebug.DbStats(java.lang.String, long, long, int, int, int, int);
+ field public java.lang.String cache;
+ field public java.lang.String dbName;
+ field public long dbSize;
+ field public int lookaside;
+ field public long pageSize;
+ }
+
+ public static class SQLiteDebug.PagerStats {
+ ctor public SQLiteDebug.PagerStats();
+ field public java.util.ArrayList<android.database.sqlite.SQLiteDebug.DbStats> dbStats;
+ field public int largestMemAlloc;
+ field public int memoryUsed;
+ field public int pageCacheOverflow;
+ }
+
public class SQLiteDiskIOException extends android.database.sqlite.SQLiteException {
ctor public SQLiteDiskIOException();
ctor public SQLiteDiskIOException(java.lang.String);
@@ -12024,6 +12095,7 @@
method public void onDowngrade(android.database.sqlite.SQLiteDatabase, int, int);
method public void onOpen(android.database.sqlite.SQLiteDatabase);
method public abstract void onUpgrade(android.database.sqlite.SQLiteDatabase, int, int);
+ method public void setLookasideConfig(int, int);
method public void setWriteAheadLoggingEnabled(boolean);
}
@@ -13886,6 +13958,7 @@
method public void scheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable, long);
method public void setAlpha(int);
method public void setColorFilter(android.graphics.ColorFilter);
+ method public void setDither(boolean);
method public void setOpacity(int);
method public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);
field public static final float MASK_SIZE = 100.0f;
@@ -13967,6 +14040,7 @@
method public void setAlpha(int);
method public void setAntiAlias(boolean);
method public void setColorFilter(android.graphics.ColorFilter);
+ method public void setDither(boolean);
method public void setGravity(int);
method public void setMipMap(boolean);
method public void setTargetDensity(android.graphics.Canvas);
@@ -14094,6 +14168,7 @@
method public void setAlpha(int);
method public void setColorFilter(android.graphics.ColorFilter);
method protected void setConstantState(android.graphics.drawable.DrawableContainer.DrawableContainerState);
+ method public void setDither(boolean);
method public void setEnterFadeDuration(int);
method public void setExitFadeDuration(int);
method public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);
@@ -14160,6 +14235,7 @@
method public void setColors(int[]);
method public void setCornerRadii(float[]);
method public void setCornerRadius(float);
+ method public void setDither(boolean);
method public void setGradientCenter(float, float);
method public void setGradientRadius(float);
method public void setGradientType(int);
@@ -14254,6 +14330,7 @@
method public void scheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable, long);
method public void setAlpha(int);
method public void setColorFilter(android.graphics.ColorFilter);
+ method public void setDither(boolean);
method public void setDrawable(int, android.graphics.drawable.Drawable);
method public boolean setDrawableByLayerId(int, android.graphics.drawable.Drawable);
method public void setId(int, int);
@@ -14294,6 +14371,7 @@
method public android.graphics.Paint getPaint();
method public void setAlpha(int);
method public void setColorFilter(android.graphics.ColorFilter);
+ method public void setDither(boolean);
method public void setTargetDensity(android.graphics.Canvas);
method public void setTargetDensity(android.util.DisplayMetrics);
method public void setTargetDensity(int);
@@ -14356,6 +14434,7 @@
method protected void onDraw(android.graphics.drawable.shapes.Shape, android.graphics.Canvas, android.graphics.Paint);
method public void setAlpha(int);
method public void setColorFilter(android.graphics.ColorFilter);
+ method public void setDither(boolean);
method public void setIntrinsicHeight(int);
method public void setIntrinsicWidth(int);
method public void setPadding(int, int, int, int);
@@ -14398,27 +14477,32 @@
public class ArcShape extends android.graphics.drawable.shapes.RectShape {
ctor public ArcShape(float, float);
+ method public android.graphics.drawable.shapes.ArcShape clone() throws java.lang.CloneNotSupportedException;
method public final float getStartAngle();
method public final float getSweepAngle();
}
public class OvalShape extends android.graphics.drawable.shapes.RectShape {
ctor public OvalShape();
+ method public android.graphics.drawable.shapes.OvalShape clone() throws java.lang.CloneNotSupportedException;
}
public class PathShape extends android.graphics.drawable.shapes.Shape {
ctor public PathShape(android.graphics.Path, float, float);
+ method public android.graphics.drawable.shapes.PathShape clone() throws java.lang.CloneNotSupportedException;
method public void draw(android.graphics.Canvas, android.graphics.Paint);
}
public class RectShape extends android.graphics.drawable.shapes.Shape {
ctor public RectShape();
+ method public android.graphics.drawable.shapes.RectShape clone() throws java.lang.CloneNotSupportedException;
method public void draw(android.graphics.Canvas, android.graphics.Paint);
method protected final android.graphics.RectF rect();
}
public class RoundRectShape extends android.graphics.drawable.shapes.RectShape {
ctor public RoundRectShape(float[], android.graphics.RectF, float[]);
+ method public android.graphics.drawable.shapes.RoundRectShape clone() throws java.lang.CloneNotSupportedException;
}
public abstract class Shape implements java.lang.Cloneable {
@@ -14503,6 +14587,7 @@
method public final void autoFocus(android.hardware.Camera.AutoFocusCallback);
method public final void cancelAutoFocus();
method public final boolean enableShutterSound(boolean);
+ method protected void finalize();
method public static void getCameraInfo(int, android.hardware.Camera.CameraInfo);
method public static int getNumberOfCameras();
method public android.hardware.Camera.Parameters getParameters();
@@ -15112,6 +15197,7 @@
method public <T> T get(android.hardware.camera2.CameraCharacteristics.Key<T>);
method public java.util.List<android.hardware.camera2.CaptureRequest.Key<?>> getAvailableCaptureRequestKeys();
method public java.util.List<android.hardware.camera2.CaptureResult.Key<?>> getAvailableCaptureResultKeys();
+ method public java.util.List<android.hardware.camera2.CameraCharacteristics.Key<?>> getKeys();
field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES;
field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AE_AVAILABLE_ANTIBANDING_MODES;
field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AE_AVAILABLE_MODES;
@@ -15472,6 +15558,7 @@
public final class CaptureRequest extends android.hardware.camera2.CameraMetadata implements android.os.Parcelable {
method public int describeContents();
method public <T> T get(android.hardware.camera2.CaptureRequest.Key<T>);
+ method public java.util.List<android.hardware.camera2.CaptureRequest.Key<?>> getKeys();
method public java.lang.Object getTag();
method public boolean isReprocess();
method public void writeToParcel(android.os.Parcel, int);
@@ -15550,6 +15637,7 @@
public class CaptureResult extends android.hardware.camera2.CameraMetadata {
method public <T> T get(android.hardware.camera2.CaptureResult.Key<T>);
method public long getFrameNumber();
+ method public java.util.List<android.hardware.camera2.CaptureResult.Key<?>> getKeys();
method public android.hardware.camera2.CaptureRequest getRequest();
method public int getSequenceId();
field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Boolean> BLACK_LEVEL_LOCK;
@@ -15841,9 +15929,12 @@
field public static final int FINGERPRINT_ERROR_CANCELED = 5; // 0x5
field public static final int FINGERPRINT_ERROR_HW_UNAVAILABLE = 1; // 0x1
field public static final int FINGERPRINT_ERROR_LOCKOUT = 7; // 0x7
+ field public static final int FINGERPRINT_ERROR_LOCKOUT_PERMANENT = 9; // 0x9
field public static final int FINGERPRINT_ERROR_NO_SPACE = 4; // 0x4
field public static final int FINGERPRINT_ERROR_TIMEOUT = 3; // 0x3
field public static final int FINGERPRINT_ERROR_UNABLE_TO_PROCESS = 2; // 0x2
+ field public static final int FINGERPRINT_ERROR_UNABLE_TO_REMOVE = 6; // 0x6
+ field public static final int FINGERPRINT_ERROR_VENDOR = 8; // 0x8
}
public static abstract class FingerprintManager.AuthenticationCallback {
@@ -17983,6 +18074,7 @@
}
public class DateIntervalFormat extends android.icu.text.UFormat {
+ method public synchronized java.lang.Object clone();
method public final java.lang.StringBuffer format(java.lang.Object, java.lang.StringBuffer, java.text.FieldPosition);
method public final synchronized java.lang.StringBuffer format(android.icu.util.DateInterval, java.lang.StringBuffer, java.text.FieldPosition);
method public final synchronized java.lang.StringBuffer format(android.icu.util.Calendar, android.icu.util.Calendar, java.lang.StringBuffer, java.text.FieldPosition);
@@ -18766,6 +18858,7 @@
public final class RuleBasedCollator extends android.icu.text.Collator {
ctor public RuleBasedCollator(java.lang.String) throws java.lang.Exception;
+ method public android.icu.text.RuleBasedCollator cloneAsThawed();
method public int compare(java.lang.String, java.lang.String);
method public android.icu.text.CollationElementIterator getCollationElementIterator(java.lang.String);
method public android.icu.text.CollationElementIterator getCollationElementIterator(java.text.CharacterIterator);
@@ -18792,6 +18885,7 @@
method public void setFrenchCollation(boolean);
method public void setFrenchCollationDefault();
method public void setLowerCaseFirst(boolean);
+ method public android.icu.text.RuleBasedCollator setMaxVariable(int);
method public void setNumericCollation(boolean);
method public void setNumericCollationDefault();
method public void setStrengthDefault();
@@ -21370,6 +21464,7 @@
ctor public AudioRecord(int, int, int, int, int) throws java.lang.IllegalArgumentException;
method public void addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler);
method public deprecated void addOnRoutingChangedListener(android.media.AudioRecord.OnRoutingChangedListener, android.os.Handler);
+ method protected void finalize();
method public int getAudioFormat();
method public int getAudioSessionId();
method public int getAudioSource();
@@ -21474,6 +21569,7 @@
method public deprecated void addOnRoutingChangedListener(android.media.AudioTrack.OnRoutingChangedListener, android.os.Handler);
method public int attachAuxEffect(int);
method public android.media.VolumeShaper createVolumeShaper(android.media.VolumeShaper.Configuration);
+ method protected void finalize();
method public void flush();
method public int getAudioFormat();
method public int getAudioSessionId();
@@ -21872,6 +21968,7 @@
method public boolean clearQueue();
method public java.lang.Object clone() throws java.lang.CloneNotSupportedException;
method public boolean closeJetFile();
+ method protected void finalize();
method public static android.media.JetPlayer getJetPlayer();
method public static int getMaxTracks();
method public boolean loadJetFile(java.lang.String);
@@ -21911,6 +22008,7 @@
ctor public MediaCas(int) throws android.media.MediaCasException.UnsupportedCasException;
method public void close();
method public static android.media.MediaCas.PluginDescriptor[] enumeratePlugins();
+ method protected void finalize();
method public static boolean isSystemIdSupported(int);
method public android.media.MediaCas.Session openSession() throws android.media.MediaCasException;
method public void processEmm(byte[], int, int) throws android.media.MediaCasException;
@@ -21967,6 +22065,7 @@
method public static android.view.Surface createPersistentInputSurface();
method public final int dequeueInputBuffer(long);
method public final int dequeueOutputBuffer(android.media.MediaCodec.BufferInfo, long);
+ method protected void finalize();
method public final void flush();
method public android.media.MediaCodecInfo getCodecInfo();
method public java.nio.ByteBuffer getInputBuffer(int);
@@ -22207,6 +22306,8 @@
field public static final int AVCLevel51 = 32768; // 0x8000
field public static final int AVCLevel52 = 65536; // 0x10000
field public static final int AVCProfileBaseline = 1; // 0x1
+ field public static final int AVCProfileConstrainedBaseline = 65536; // 0x10000
+ field public static final int AVCProfileConstrainedHigh = 524288; // 0x80000
field public static final int AVCProfileExtended = 4; // 0x4
field public static final int AVCProfileHigh = 8; // 0x8
field public static final int AVCProfileHigh10 = 16; // 0x10
@@ -22378,6 +22479,7 @@
public final class MediaCrypto {
ctor public MediaCrypto(java.util.UUID, byte[]) throws android.media.MediaCryptoException;
+ method protected void finalize();
method public static final boolean isCryptoSchemeSupported(java.util.UUID);
method public final void release();
method public final boolean requiresSecureDecoderComponent(java.lang.String);
@@ -22398,6 +22500,7 @@
ctor public MediaDescrambler(int) throws android.media.MediaCasException.UnsupportedCasException;
method public void close();
method public final int descramble(java.nio.ByteBuffer, java.nio.ByteBuffer, android.media.MediaCodec.CryptoInfo);
+ method protected void finalize();
method public final boolean requiresSecureDecoderComponent(java.lang.String);
method public final void setMediaCasSession(android.media.MediaCas.Session);
}
@@ -22440,6 +22543,7 @@
public final class MediaDrm {
ctor public MediaDrm(java.util.UUID) throws android.media.UnsupportedSchemeException;
method public void closeSession(byte[]);
+ method protected void finalize();
method public android.media.MediaDrm.CryptoSession getCryptoSession(byte[], java.lang.String, java.lang.String);
method public android.media.MediaDrm.KeyRequest getKeyRequest(byte[], byte[], java.lang.String, int, java.util.HashMap<java.lang.String, java.lang.String>) throws android.media.NotProvisionedException;
method public byte[] getPropertyByteArray(java.lang.String);
@@ -22536,6 +22640,7 @@
public final class MediaExtractor {
ctor public MediaExtractor();
method public boolean advance();
+ method protected void finalize();
method public long getCachedDuration();
method public android.media.MediaExtractor.CasInfo getCasInfo(int);
method public android.media.DrmInitData getDrmInitData();
@@ -22837,6 +22942,7 @@
method public static android.media.MediaPlayer create(android.content.Context, int, android.media.AudioAttributes, int);
method public android.media.VolumeShaper createVolumeShaper(android.media.VolumeShaper.Configuration);
method public void deselectTrack(int) throws java.lang.IllegalStateException;
+ method protected void finalize();
method public int getAudioSessionId();
method public int getCurrentPosition();
method public android.media.MediaPlayer.DrmInfo getDrmInfo();
@@ -23032,6 +23138,7 @@
public class MediaRecorder {
ctor public MediaRecorder();
+ method protected void finalize();
method public static final int getAudioSourceMax();
method public int getMaxAmplitude() throws java.lang.IllegalStateException;
method public android.os.PersistableBundle getMetrics();
@@ -23303,6 +23410,7 @@
public final class MediaSync {
ctor public MediaSync();
method public final android.view.Surface createInputSurface();
+ method protected void finalize();
method public void flush();
method public android.media.PlaybackParams getPlaybackParams();
method public android.media.SyncParams getSyncParams();
@@ -23422,6 +23530,10 @@
public deprecated class RemoteControlClient.MetadataEditor extends android.media.MediaMetadataEditor {
method public synchronized void apply();
+ method public synchronized android.media.RemoteControlClient.MetadataEditor putBitmap(int, android.graphics.Bitmap) throws java.lang.IllegalArgumentException;
+ method public synchronized android.media.RemoteControlClient.MetadataEditor putLong(int, long) throws java.lang.IllegalArgumentException;
+ method public synchronized android.media.RemoteControlClient.MetadataEditor putObject(int, java.lang.Object) throws java.lang.IllegalArgumentException;
+ method public synchronized android.media.RemoteControlClient.MetadataEditor putString(int, java.lang.String) throws java.lang.IllegalArgumentException;
field public static final int BITMAP_KEY_ARTWORK = 100; // 0x64
}
@@ -23468,6 +23580,7 @@
}
public class Ringtone {
+ method protected void finalize();
method public android.media.AudioAttributes getAudioAttributes();
method public deprecated int getStreamType();
method public java.lang.String getTitle(android.content.Context);
@@ -23521,6 +23634,7 @@
ctor public deprecated SoundPool(int, int, int);
method public final void autoPause();
method public final void autoResume();
+ method protected void finalize();
method public int load(java.lang.String, int);
method public int load(android.content.Context, int, int);
method public int load(android.content.res.AssetFileDescriptor, int);
@@ -23589,6 +23703,7 @@
public class ToneGenerator {
ctor public ToneGenerator(int, int);
+ method protected void finalize();
method public final int getAudioSessionId();
method public void release();
method public boolean startTone(int);
@@ -23721,6 +23836,7 @@
public final class VolumeShaper implements java.lang.AutoCloseable {
method public void apply(android.media.VolumeShaper.Operation);
method public void close();
+ method protected void finalize();
method public float getVolume();
method public void replace(android.media.VolumeShaper.Configuration, android.media.VolumeShaper.Operation, boolean);
}
@@ -23775,6 +23891,7 @@
}
public class AudioEffect {
+ method protected void finalize();
method public android.media.audiofx.AudioEffect.Descriptor getDescriptor() throws java.lang.IllegalStateException;
method public boolean getEnabled() throws java.lang.IllegalStateException;
method public int getId() throws java.lang.IllegalStateException;
@@ -24027,6 +24144,7 @@
public class Visualizer {
ctor public Visualizer(int) throws java.lang.RuntimeException, java.lang.UnsupportedOperationException;
+ method protected void finalize();
method public int getCaptureSize() throws java.lang.IllegalStateException;
method public static int[] getCaptureSizeRange();
method public boolean getEnabled();
@@ -24584,6 +24702,7 @@
method public static boolean isChannelUriForPassthroughInput(android.net.Uri);
method public static boolean isChannelUriForTunerInput(android.net.Uri);
method public static boolean isProgramUri(android.net.Uri);
+ method public static boolean isRecordedProgramUri(android.net.Uri);
method public static void requestChannelBrowsable(android.content.Context, long);
field public static final java.lang.String ACTION_INITIALIZE_PROGRAMS = "android.media.tv.action.INITIALIZE_PROGRAMS";
field public static final java.lang.String ACTION_PREVIEW_PROGRAM_ADDED_TO_WATCH_NEXT = "android.media.tv.action.PREVIEW_PROGRAM_ADDED_TO_WATCH_NEXT";
@@ -25718,6 +25837,7 @@
field public static final int TRANSPORT_BLUETOOTH = 2; // 0x2
field public static final int TRANSPORT_CELLULAR = 0; // 0x0
field public static final int TRANSPORT_ETHERNET = 3; // 0x3
+ field public static final int TRANSPORT_LOWPAN = 6; // 0x6
field public static final int TRANSPORT_VPN = 4; // 0x4
field public static final int TRANSPORT_WIFI = 1; // 0x1
field public static final int TRANSPORT_WIFI_AWARE = 5; // 0x5
@@ -26033,6 +26153,7 @@
method public boolean protect(java.net.Socket);
method public boolean protect(java.net.DatagramSocket);
method public boolean setUnderlyingNetworks(android.net.Network[]);
+ field public static final java.lang.String METADATA_SUPPORTS_ALWAYS_ON = "android.net.VpnService.SUPPORTS_ALWAYS_ON";
field public static final java.lang.String SERVICE_INTERFACE = "android.net.VpnService";
}
@@ -27085,7 +27206,8 @@
method public abstract void onSuccess();
}
- public static class WifiP2pManager.Channel {
+ public static class WifiP2pManager.Channel implements java.lang.AutoCloseable {
+ method public void close();
}
public static abstract interface WifiP2pManager.ChannelListener {
@@ -30624,6 +30746,7 @@
field public static final int N = 24; // 0x18
field public static final int N_MR1 = 25; // 0x19
field public static final int O = 26; // 0x1a
+ field public static final int O_MR1 = 10000; // 0x2710
}
public final class Bundle extends android.os.BaseBundle implements java.lang.Cloneable android.os.Parcelable {
@@ -30689,6 +30812,7 @@
method public void putStringArrayList(java.lang.String, java.util.ArrayList<java.lang.String>);
method public void readFromParcel(android.os.Parcel);
method public void setClassLoader(java.lang.ClassLoader);
+ method public synchronized java.lang.String toString();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.os.Bundle> CREATOR;
field public static final android.os.Bundle EMPTY;
@@ -30919,6 +31043,7 @@
public abstract class FileObserver {
ctor public FileObserver(java.lang.String);
ctor public FileObserver(java.lang.String, int);
+ method protected void finalize();
method public abstract void onEvent(int, java.lang.String);
method public void startWatching();
method public void stopWatching();
@@ -31091,11 +31216,12 @@
public class MemoryFile {
ctor public MemoryFile(java.lang.String, int) throws java.io.IOException;
- method public synchronized boolean allowPurging(boolean) throws java.io.IOException;
+ method public deprecated synchronized boolean allowPurging(boolean) throws java.io.IOException;
method public void close();
+ method public java.io.FileDescriptor getFileDescriptor() throws java.io.IOException;
method public java.io.InputStream getInputStream();
method public java.io.OutputStream getOutputStream();
- method public boolean isPurgingAllowed();
+ method public deprecated boolean isPurgingAllowed();
method public int length();
method public int readBytes(byte[], int, int, int) throws java.io.IOException;
method public void writeBytes(byte[], int, int, int) throws java.io.IOException;
@@ -31392,6 +31518,7 @@
method public int describeContents();
method public android.os.PersistableBundle getPersistableBundle(java.lang.String);
method public void putPersistableBundle(java.lang.String, android.os.PersistableBundle);
+ method public synchronized java.lang.String toString();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.os.PersistableBundle> CREATOR;
field public static final android.os.PersistableBundle EMPTY;
@@ -31520,6 +31647,22 @@
field public static final android.os.Parcelable.Creator<android.os.ResultReceiver> CREATOR;
}
+ public final class SharedMemory implements java.io.Closeable android.os.Parcelable {
+ method public void close();
+ method public static android.os.SharedMemory create(java.lang.String, int) throws android.system.ErrnoException;
+ method public int describeContents();
+ method public int getFd();
+ method public java.io.FileDescriptor getFileDescriptor();
+ method public int getSize();
+ method public java.nio.ByteBuffer map(int, int, int) throws android.system.ErrnoException;
+ method public java.nio.ByteBuffer mapReadOnly() throws android.system.ErrnoException;
+ method public java.nio.ByteBuffer mapReadWrite() throws android.system.ErrnoException;
+ method public boolean setProtect(int);
+ method public static void unmap(java.nio.ByteBuffer);
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.os.SharedMemory> CREATOR;
+ }
+
public class StatFs {
ctor public StatFs(java.lang.String);
method public deprecated int getAvailableBlocks();
@@ -31544,6 +31687,7 @@
method public static android.os.StrictMode.VmPolicy getVmPolicy();
method public static void noteSlowCall(java.lang.String);
method public static void setThreadPolicy(android.os.StrictMode.ThreadPolicy);
+ method public static void setViolationListener(android.os.StrictMode.ViolationListener);
method public static void setVmPolicy(android.os.StrictMode.VmPolicy);
}
@@ -31577,6 +31721,10 @@
method public android.os.StrictMode.ThreadPolicy.Builder permitUnbufferedIo();
}
+ public static abstract interface StrictMode.ViolationListener {
+ method public abstract void onViolation(java.lang.String);
+ }
+
public static final class StrictMode.VmPolicy {
field public static final android.os.StrictMode.VmPolicy LAX;
}
@@ -31927,6 +32075,7 @@
method public android.os.storage.StorageVolume getStorageVolume(java.io.File);
method public java.util.List<android.os.storage.StorageVolume> getStorageVolumes();
method public java.util.UUID getUuidForPath(java.io.File) throws java.io.IOException;
+ method public boolean isAllocationSupported(java.io.FileDescriptor);
method public boolean isCacheBehaviorGroup(java.io.File) throws java.io.IOException;
method public boolean isCacheBehaviorTombstone(java.io.File) throws java.io.IOException;
method public boolean isEncrypted(java.io.File);
@@ -32618,9 +32767,7 @@
public final class PrintManager {
method public java.util.List<android.print.PrintJob> getPrintJobs();
- method public java.util.List<android.printservice.PrintServiceInfo> getPrintServices(int);
method public android.print.PrintJob print(java.lang.String, android.print.PrintDocumentAdapter, android.print.PrintAttributes);
- field public static final int ALL_SERVICES = 3; // 0x3
}
public final class PrinterCapabilitiesInfo implements android.os.Parcelable {
@@ -32750,13 +32897,6 @@
field public static final java.lang.String SERVICE_META_DATA = "android.printservice";
}
- public final class PrintServiceInfo implements android.os.Parcelable {
- method public int describeContents();
- method public android.content.ComponentName getComponentName();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.printservice.PrintServiceInfo> CREATOR;
- }
-
public abstract class PrinterDiscoverySession {
ctor public PrinterDiscoverySession();
method public final void addPrinters(java.util.List<android.print.PrinterInfo>);
@@ -35023,7 +35163,7 @@
field public static final java.lang.String DISABLED_PRINT_SERVICES = "disabled_print_services";
field public static final java.lang.String ENABLED_ACCESSIBILITY_SERVICES = "enabled_accessibility_services";
field public static final java.lang.String ENABLED_INPUT_METHODS = "enabled_input_methods";
- field public static final java.lang.String ENABLED_NOTIFICATION_POLICY_ACCESS_PACKAGES = "enabled_notification_policy_access_packages";
+ field public static final deprecated java.lang.String ENABLED_NOTIFICATION_POLICY_ACCESS_PACKAGES = "enabled_notification_policy_access_packages";
field public static final deprecated java.lang.String HTTP_PROXY = "http_proxy";
field public static final java.lang.String INPUT_METHOD_SELECTOR_VISIBILITY = "input_method_selector_visibility";
field public static final deprecated java.lang.String INSTALL_NON_MARKET_APPS = "install_non_market_apps";
@@ -35055,6 +35195,7 @@
field public static final java.lang.String TTS_ENABLED_PLUGINS = "tts_enabled_plugins";
field public static final deprecated java.lang.String TTS_USE_DEFAULTS = "tts_use_defaults";
field public static final deprecated java.lang.String USB_MASS_STORAGE_ENABLED = "usb_mass_storage_enabled";
+ field public static final java.lang.String USER_SETUP_COMPLETE = "user_setup_complete";
field public static final deprecated java.lang.String USE_GOOGLE_MAIL = "use_google_mail";
field public static final java.lang.String VOICE_INTERACTION_SERVICE = "voice_interaction_service";
field public static final deprecated java.lang.String WIFI_MAX_DHCP_RETRY_COUNT = "wifi_max_dhcp_retry_count";
@@ -35737,6 +35878,7 @@
method public static android.renderscript.AllocationAdapter create1D(android.renderscript.RenderScript, android.renderscript.Allocation);
method public static android.renderscript.AllocationAdapter create2D(android.renderscript.RenderScript, android.renderscript.Allocation);
method public static android.renderscript.AllocationAdapter createTyped(android.renderscript.RenderScript, android.renderscript.Allocation, android.renderscript.Type);
+ method public synchronized void resize(int);
method public void setFace(android.renderscript.Type.CubemapFace);
method public void setLOD(int);
method public void setX(int);
@@ -37008,6 +37150,31 @@
field public static final java.lang.String SERVICE_META_DATA = "android.autofill";
}
+ public final class CharSequenceTransformation implements android.os.Parcelable android.service.autofill.Transformation {
+ method public void apply(android.service.autofill.ValueFinder, android.widget.RemoteViews, int) throws java.lang.Exception;
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.service.autofill.CharSequenceTransformation> CREATOR;
+ }
+
+ public static class CharSequenceTransformation.Builder {
+ ctor public CharSequenceTransformation.Builder(android.view.autofill.AutofillId, java.util.regex.Pattern, java.lang.String);
+ method public android.service.autofill.CharSequenceTransformation.Builder addField(android.view.autofill.AutofillId, java.util.regex.Pattern, java.lang.String);
+ method public android.service.autofill.CharSequenceTransformation build();
+ }
+
+ public final class CustomDescription implements android.os.Parcelable {
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.service.autofill.CustomDescription> CREATOR;
+ }
+
+ public static class CustomDescription.Builder {
+ ctor public CustomDescription.Builder(android.widget.RemoteViews);
+ method public android.service.autofill.CustomDescription.Builder addChild(int, android.service.autofill.Transformation);
+ method public android.service.autofill.CustomDescription build();
+ }
+
public final class Dataset implements android.os.Parcelable {
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
@@ -37081,6 +37248,27 @@
method public android.service.autofill.FillResponse.Builder setSaveInfo(android.service.autofill.SaveInfo);
}
+ public final class ImageTransformation implements android.os.Parcelable android.service.autofill.Transformation {
+ method public void apply(android.service.autofill.ValueFinder, android.widget.RemoteViews, int) throws java.lang.Exception;
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.service.autofill.ImageTransformation> CREATOR;
+ }
+
+ public static class ImageTransformation.Builder {
+ ctor public ImageTransformation.Builder(android.view.autofill.AutofillId, java.util.regex.Pattern, int);
+ method public android.service.autofill.ImageTransformation.Builder addOption(java.util.regex.Pattern, int);
+ method public android.service.autofill.ImageTransformation build();
+ }
+
+ public final class LuhnChecksumValidator implements android.os.Parcelable android.service.autofill.Validator {
+ ctor public LuhnChecksumValidator(android.view.autofill.AutofillId...);
+ method public int describeContents();
+ method public boolean isValid(android.service.autofill.ValueFinder);
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.service.autofill.LuhnChecksumValidator> CREATOR;
+ }
+
public final class SaveCallback {
method public void onFailure(java.lang.CharSequence);
method public void onSuccess();
@@ -37103,11 +37291,14 @@
public static final class SaveInfo.Builder {
ctor public SaveInfo.Builder(int, android.view.autofill.AutofillId[]);
+ ctor public SaveInfo.Builder(int);
method public android.service.autofill.SaveInfo build();
+ method public android.service.autofill.SaveInfo.Builder setCustomDescription(android.service.autofill.CustomDescription);
method public android.service.autofill.SaveInfo.Builder setDescription(java.lang.CharSequence);
method public android.service.autofill.SaveInfo.Builder setFlags(int);
method public android.service.autofill.SaveInfo.Builder setNegativeAction(int, android.content.IntentSender);
method public android.service.autofill.SaveInfo.Builder setOptionalIds(android.view.autofill.AutofillId[]);
+ method public android.service.autofill.SaveInfo.Builder setValidator(android.service.autofill.Validator);
}
public final class SaveRequest implements android.os.Parcelable {
@@ -37118,6 +37309,29 @@
field public static final android.os.Parcelable.Creator<android.service.autofill.SaveRequest> CREATOR;
}
+ public final class SimpleRegexValidator implements android.os.Parcelable android.service.autofill.Validator {
+ ctor public SimpleRegexValidator(android.view.autofill.AutofillId, java.util.regex.Pattern);
+ method public int describeContents();
+ method public boolean isValid(android.service.autofill.ValueFinder);
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.service.autofill.SimpleRegexValidator> CREATOR;
+ }
+
+ public abstract interface Transformation {
+ }
+
+ public abstract interface Validator {
+ }
+
+ public final class Validators {
+ method public static android.service.autofill.Validator and(android.service.autofill.Validator...);
+ method public static android.service.autofill.Validator or(android.service.autofill.Validator...);
+ }
+
+ public abstract interface ValueFinder {
+ method public abstract java.lang.String findByAutofillId(android.view.autofill.AutofillId);
+ }
+
}
package android.service.carrier {
@@ -37425,7 +37639,6 @@
method public static void requestRebind(android.content.ComponentName);
method public final void requestUnbind();
method public final void setNotificationsShown(java.lang.String[]);
- method public final void snoozeNotification(java.lang.String, java.lang.String);
method public final void snoozeNotification(java.lang.String, long);
method public final void updateNotificationChannel(java.lang.String, android.os.UserHandle, android.app.NotificationChannel);
field public static final int HINT_HOST_DISABLE_CALL_EFFECTS = 4; // 0x4
@@ -37466,14 +37679,12 @@
public static class NotificationListenerService.Ranking {
ctor public NotificationListenerService.Ranking();
method public boolean canShowBadge();
- method public java.util.List<java.lang.String> getAdditionalPeople();
method public android.app.NotificationChannel getChannel();
method public int getImportance();
method public java.lang.CharSequence getImportanceExplanation();
method public java.lang.String getKey();
method public java.lang.String getOverrideGroupKey();
method public int getRank();
- method public java.util.List<android.service.notification.SnoozeCriterion> getSnoozeCriteria();
method public int getSuppressedVisualEffects();
method public boolean isAmbient();
method public boolean matchesInterruptionFilter();
@@ -37792,8 +38003,10 @@
method public android.view.SurfaceHolder getSurfaceHolder();
method public boolean isPreview();
method public boolean isVisible();
+ method public void notifyColorsChanged();
method public void onApplyWindowInsets(android.view.WindowInsets);
method public android.os.Bundle onCommand(java.lang.String, int, int, int, android.os.Bundle, boolean);
+ method public android.app.WallpaperColors onComputeColors();
method public void onCreate(android.view.SurfaceHolder);
method public void onDesiredSizeChanged(int, int);
method public void onDestroy();
@@ -38375,6 +38588,7 @@
field public static final int FD_CLOEXEC;
field public static final int FIONREAD;
field public static final int F_DUPFD;
+ field public static final int F_DUPFD_CLOEXEC;
field public static final int F_GETFD;
field public static final int F_GETFL;
field public static final int F_GETLK;
@@ -38469,7 +38683,9 @@
field public static final int NI_NUMERICSERV;
field public static final int O_ACCMODE;
field public static final int O_APPEND;
+ field public static final int O_CLOEXEC;
field public static final int O_CREAT;
+ field public static final int O_DSYNC;
field public static final int O_EXCL;
field public static final int O_NOCTTY;
field public static final int O_NOFOLLOW;
@@ -38715,14 +38931,18 @@
public final class StructStat {
ctor public StructStat(long, long, int, long, int, int, long, long, long, long, long, long, long);
+ ctor public StructStat(long, long, int, long, int, int, long, long, android.system.StructTimespec, android.system.StructTimespec, android.system.StructTimespec, long, long);
+ field public final android.system.StructTimespec st_atim;
field public final long st_atime;
field public final long st_blksize;
field public final long st_blocks;
+ field public final android.system.StructTimespec st_ctim;
field public final long st_ctime;
field public final long st_dev;
field public final int st_gid;
field public final long st_ino;
field public final int st_mode;
+ field public final android.system.StructTimespec st_mtim;
field public final long st_mtime;
field public final long st_nlink;
field public final long st_rdev;
@@ -38745,6 +38965,13 @@
field public final long f_namemax;
}
+ public final class StructTimespec implements java.lang.Comparable {
+ ctor public StructTimespec(long, long);
+ method public int compareTo(android.system.StructTimespec);
+ field public final long tv_nsec;
+ field public final long tv_sec;
+ }
+
public final class StructUtsname {
ctor public StructUtsname(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
field public final java.lang.String machine;
@@ -38878,7 +39105,7 @@
public static final class Call.RttCall {
method public int getRttAudioMode();
- method public java.lang.String read();
+ method public java.lang.String read() throws java.io.IOException;
method public java.lang.String readImmediately() throws java.io.IOException;
method public void setRttMode(int);
method public void write(java.lang.String) throws java.io.IOException;
@@ -39562,7 +39789,7 @@
method public android.os.PersistableBundle getConfigForSubId(int);
method public void notifyConfigChangedForSubId(int);
field public static final java.lang.String ACTION_CARRIER_CONFIG_CHANGED = "android.telephony.action.CARRIER_CONFIG_CHANGED";
- field public static final int DATA_CYCLE_THRESHOLD_DISABLED = -2; // 0xfffffffe
+ field public static final deprecated int DATA_CYCLE_THRESHOLD_DISABLED = -2; // 0xfffffffe
field public static final java.lang.String KEY_ADDITIONAL_CALL_SETTING_BOOL = "additional_call_setting_bool";
field public static final java.lang.String KEY_ALLOW_ADDING_APNS_BOOL = "allow_adding_apns_bool";
field public static final java.lang.String KEY_ALLOW_ADD_CALL_DURING_VIDEO_CALL_BOOL = "allow_add_call_during_video_call";
@@ -39604,9 +39831,10 @@
field public static final java.lang.String KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_VAL_STRING = "ci_action_on_sys_update_extra_val_string";
field public static final java.lang.String KEY_CI_ACTION_ON_SYS_UPDATE_INTENT_STRING = "ci_action_on_sys_update_intent_string";
field public static final java.lang.String KEY_CONFIG_IMS_PACKAGE_OVERRIDE_STRING = "config_ims_package_override_string";
+ field public static final java.lang.String KEY_CONFIG_PLANS_PACKAGE_OVERRIDE_STRING = "config_plans_package_override_string";
field public static final java.lang.String KEY_CSP_ENABLED_BOOL = "csp_enabled_bool";
- field public static final java.lang.String KEY_DATA_LIMIT_THRESHOLD_BYTES_LONG = "data_limit_threshold_bytes_long";
- field public static final java.lang.String KEY_DATA_WARNING_THRESHOLD_BYTES_LONG = "data_warning_threshold_bytes_long";
+ field public static final deprecated java.lang.String KEY_DATA_LIMIT_THRESHOLD_BYTES_LONG = "data_limit_threshold_bytes_long";
+ field public static final deprecated java.lang.String KEY_DATA_WARNING_THRESHOLD_BYTES_LONG = "data_warning_threshold_bytes_long";
field public static final java.lang.String KEY_DEFAULT_SIM_CALL_MANAGER_STRING = "default_sim_call_manager_string";
field public static final java.lang.String KEY_DEFAULT_VM_NUMBER_STRING = "default_vm_number_string";
field public static final java.lang.String KEY_DIAL_STRING_REPLACE_STRING_ARRAY = "dial_string_replace_string_array";
@@ -39663,7 +39891,7 @@
field public static final java.lang.String KEY_MMS_UA_PROF_TAG_NAME_STRING = "uaProfTagName";
field public static final java.lang.String KEY_MMS_UA_PROF_URL_STRING = "uaProfUrl";
field public static final java.lang.String KEY_MMS_USER_AGENT_STRING = "userAgent";
- field public static final java.lang.String KEY_MONTHLY_DATA_CYCLE_DAY_INT = "monthly_data_cycle_day_int";
+ field public static final deprecated java.lang.String KEY_MONTHLY_DATA_CYCLE_DAY_INT = "monthly_data_cycle_day_int";
field public static final java.lang.String KEY_ONLY_SINGLE_DC_ALLOWED_INT_ARRAY = "only_single_dc_allowed_int_array";
field public static final java.lang.String KEY_OPERATOR_SELECTION_EXPAND_BOOL = "operator_selection_expand_bool";
field public static final java.lang.String KEY_PREFER_2G_BOOL = "prefer_2g_bool";
@@ -40175,8 +40403,10 @@
method public static int getDefaultSmsSubscriptionId();
method public static int getDefaultSubscriptionId();
method public static int getDefaultVoiceSubscriptionId();
+ method public java.util.List<android.telephony.SubscriptionPlan> getSubscriptionPlans(int);
method public boolean isNetworkRoaming(int);
method public void removeOnSubscriptionsChangedListener(android.telephony.SubscriptionManager.OnSubscriptionsChangedListener);
+ method public void setSubscriptionPlans(int, java.util.List<android.telephony.SubscriptionPlan>);
field public static final java.lang.String ACTION_DEFAULT_SMS_SUBSCRIPTION_CHANGED = "android.telephony.action.DEFAULT_SMS_SUBSCRIPTION_CHANGED";
field public static final java.lang.String ACTION_DEFAULT_SUBSCRIPTION_CHANGED = "android.telephony.action.DEFAULT_SUBSCRIPTION_CHANGED";
field public static final int DATA_ROAMING_DISABLE = 0; // 0x0
@@ -40190,6 +40420,38 @@
method public void onSubscriptionsChanged();
}
+ public final class SubscriptionPlan implements android.os.Parcelable {
+ method public java.util.Iterator<android.util.Pair<java.time.ZonedDateTime, java.time.ZonedDateTime>> cycleIterator();
+ method public int describeContents();
+ method public int getDataLimitBehavior();
+ method public long getDataLimitBytes();
+ method public long getDataUsageBytes();
+ method public long getDataUsageTime();
+ method public java.lang.CharSequence getSummary();
+ method public java.lang.CharSequence getTitle();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final long BYTES_UNKNOWN = -1L; // 0xffffffffffffffffL
+ field public static final long BYTES_UNLIMITED = 9223372036854775807L; // 0x7fffffffffffffffL
+ field public static final android.os.Parcelable.Creator<android.telephony.SubscriptionPlan> CREATOR;
+ field public static final int LIMIT_BEHAVIOR_BILLED = 1; // 0x1
+ field public static final int LIMIT_BEHAVIOR_DISABLED = 0; // 0x0
+ field public static final int LIMIT_BEHAVIOR_THROTTLED = 2; // 0x2
+ field public static final int LIMIT_BEHAVIOR_UNKNOWN = -1; // 0xffffffff
+ field public static final long TIME_UNKNOWN = -1L; // 0xffffffffffffffffL
+ }
+
+ public static class SubscriptionPlan.Builder {
+ method public android.telephony.SubscriptionPlan build();
+ method public static android.telephony.SubscriptionPlan.Builder createNonrecurring(java.time.ZonedDateTime, java.time.ZonedDateTime);
+ method public static android.telephony.SubscriptionPlan.Builder createRecurringDaily(java.time.ZonedDateTime);
+ method public static android.telephony.SubscriptionPlan.Builder createRecurringMonthly(java.time.ZonedDateTime);
+ method public static android.telephony.SubscriptionPlan.Builder createRecurringWeekly(java.time.ZonedDateTime);
+ method public android.telephony.SubscriptionPlan.Builder setDataLimit(long, int);
+ method public android.telephony.SubscriptionPlan.Builder setDataUsage(long, long);
+ method public android.telephony.SubscriptionPlan.Builder setSummary(java.lang.CharSequence);
+ method public android.telephony.SubscriptionPlan.Builder setTitle(java.lang.CharSequence);
+ }
+
public class TelephonyManager {
method public boolean canChangeDtmfToneLength();
method public android.telephony.TelephonyManager createForPhoneAccountHandle(android.telecom.PhoneAccountHandle);
@@ -40291,6 +40553,7 @@
field public static final java.lang.String EXTRA_CALL_VOICEMAIL_INTENT = "android.telephony.extra.CALL_VOICEMAIL_INTENT";
field public static final java.lang.String EXTRA_HIDE_PUBLIC_SETTINGS = "android.telephony.extra.HIDE_PUBLIC_SETTINGS";
field public static final java.lang.String EXTRA_INCOMING_NUMBER = "incoming_number";
+ field public static final java.lang.String EXTRA_IS_REFRESH = "android.telephony.extra.IS_REFRESH";
field public static final java.lang.String EXTRA_LAUNCH_VOICEMAIL_SETTINGS_INTENT = "android.telephony.extra.LAUNCH_VOICEMAIL_SETTINGS_INTENT";
field public static final java.lang.String EXTRA_NOTIFICATION_COUNT = "android.telephony.extra.NOTIFICATION_COUNT";
field public static final java.lang.String EXTRA_PHONE_ACCOUNT_HANDLE = "android.telephony.extra.PHONE_ACCOUNT_HANDLE";
@@ -40492,6 +40755,7 @@
public static deprecated class SmsMessage.SubmitPdu {
ctor public deprecated SmsMessage.SubmitPdu();
+ method public deprecated java.lang.String toString();
field public deprecated byte[] encodedMessage;
field public deprecated byte[] encodedScAddress;
}
@@ -40555,6 +40819,7 @@
method public java.util.List<junit.framework.TestCase> getTestCases();
method public java.lang.String getTestClassName();
method public junit.framework.TestResult getTestResult();
+ method protected java.lang.Class loadSuiteClass(java.lang.String) throws java.lang.ClassNotFoundException;
method protected void runFailed(java.lang.String);
method public void runTest();
method public void runTest(junit.framework.TestResult);
@@ -40815,10 +41080,12 @@
ctor protected MockContentProvider();
ctor public MockContentProvider(android.content.Context);
ctor public MockContentProvider(android.content.Context, java.lang.String, java.lang.String, android.content.pm.PathPermission[]);
+ method public android.content.ContentProviderResult[] applyBatch(java.util.ArrayList<android.content.ContentProviderOperation>);
method public int delete(android.net.Uri, java.lang.String, java.lang.String[]);
method public java.lang.String getType(android.net.Uri);
method public android.net.Uri insert(android.net.Uri, android.content.ContentValues);
method public boolean onCreate();
+ method public android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle);
method public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
method public int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
}
@@ -41044,6 +41311,7 @@
method public int getPackageUid(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
method public java.lang.String[] getPackagesForUid(int);
method public java.util.List<android.content.pm.PackageInfo> getPackagesHoldingPermissions(java.lang.String[], int);
+ method public java.lang.String getPermissionControllerPackageName();
method public android.content.pm.PermissionGroupInfo getPermissionGroupInfo(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
method public android.content.pm.PermissionInfo getPermissionInfo(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
method public int getPreferredActivities(java.util.List<android.content.IntentFilter>, java.util.List<android.content.ComponentName>, java.lang.String);
@@ -41092,6 +41360,10 @@
public deprecated class MockResources extends android.content.res.Resources {
ctor public MockResources();
+ method public int getColor(int) throws android.content.res.Resources.NotFoundException;
+ method public android.content.res.ColorStateList getColorStateList(int) throws android.content.res.Resources.NotFoundException;
+ method public android.graphics.drawable.Drawable getDrawable(int) throws android.content.res.Resources.NotFoundException;
+ method public void updateConfiguration(android.content.res.Configuration, android.util.DisplayMetrics);
}
}
@@ -41327,6 +41599,7 @@
public static class InputFilter.AllCaps implements android.text.InputFilter {
ctor public InputFilter.AllCaps();
+ ctor public InputFilter.AllCaps(java.util.Locale);
method public java.lang.CharSequence filter(java.lang.CharSequence, int, int, android.text.Spanned, int, int);
}
@@ -42339,6 +42612,7 @@
public abstract class MetricAffectingSpan extends android.text.style.CharacterStyle implements android.text.style.UpdateLayout {
ctor public MetricAffectingSpan();
+ method public android.text.style.MetricAffectingSpan getUnderlying();
method public abstract void updateMeasureState(android.text.TextPaint);
}
@@ -43020,14 +43294,28 @@
public class TransitionSet extends android.transition.Transition {
ctor public TransitionSet();
ctor public TransitionSet(android.content.Context, android.util.AttributeSet);
+ method public android.transition.TransitionSet addListener(android.transition.Transition.TransitionListener);
+ method public android.transition.TransitionSet addTarget(android.view.View);
+ method public android.transition.TransitionSet addTarget(int);
+ method public android.transition.TransitionSet addTarget(java.lang.String);
+ method public android.transition.TransitionSet addTarget(java.lang.Class);
method public android.transition.TransitionSet addTransition(android.transition.Transition);
method public void captureEndValues(android.transition.TransitionValues);
method public void captureStartValues(android.transition.TransitionValues);
+ method public android.transition.TransitionSet clone();
method public int getOrdering();
method public android.transition.Transition getTransitionAt(int);
method public int getTransitionCount();
+ method public android.transition.TransitionSet removeListener(android.transition.Transition.TransitionListener);
+ method public android.transition.TransitionSet removeTarget(int);
+ method public android.transition.TransitionSet removeTarget(android.view.View);
+ method public android.transition.TransitionSet removeTarget(java.lang.Class);
+ method public android.transition.TransitionSet removeTarget(java.lang.String);
method public android.transition.TransitionSet removeTransition(android.transition.Transition);
+ method public android.transition.TransitionSet setDuration(long);
+ method public android.transition.TransitionSet setInterpolator(android.animation.TimeInterpolator);
method public android.transition.TransitionSet setOrdering(int);
+ method public android.transition.TransitionSet setStartDelay(long);
field public static final int ORDERING_SEQUENTIAL = 1; // 0x1
field public static final int ORDERING_TOGETHER = 0; // 0x0
}
@@ -43192,6 +43480,9 @@
public class Base64InputStream extends java.io.FilterInputStream {
ctor public Base64InputStream(java.io.InputStream, int);
+ method public int available();
+ method public void mark(int);
+ method public void reset();
}
public class Base64OutputStream extends java.io.FilterOutputStream {
@@ -44026,6 +44317,7 @@
method public abstract void invalidate();
method public void invalidateContentRect();
method public boolean isTitleOptional();
+ method public boolean isUiFocusable();
method public void onWindowFocusChanged(boolean);
method public abstract void setCustomView(android.view.View);
method public abstract void setSubtitle(java.lang.CharSequence);
@@ -44357,6 +44649,7 @@
method public android.os.Vibrator getVibrator();
method public boolean[] hasKeys(int...);
method public boolean hasMicrophone();
+ method public boolean isEnabled();
method public boolean isVirtual();
method public boolean supportsSource(int);
method public void writeToParcel(android.os.Parcel, int);
@@ -45392,11 +45685,15 @@
public class Surface implements android.os.Parcelable {
ctor public Surface(android.graphics.SurfaceTexture);
method public int describeContents();
+ method public boolean isAutoRefreshEnabled();
+ method public boolean isSharedBufferModeEnabled();
method public boolean isValid();
method public android.graphics.Canvas lockCanvas(android.graphics.Rect) throws java.lang.IllegalArgumentException, android.view.Surface.OutOfResourcesException;
method public android.graphics.Canvas lockHardwareCanvas();
method public void readFromParcel(android.os.Parcel);
method public void release();
+ method public void setAutoRefreshEnabled(boolean);
+ method public void setSharedBufferModeEnabled(boolean);
method public deprecated void unlockCanvas(android.graphics.Canvas);
method public void unlockCanvasAndPost(android.graphics.Canvas);
method public void writeToParcel(android.os.Parcel, int);
@@ -45477,6 +45774,7 @@
method public android.graphics.Canvas lockCanvas();
method public android.graphics.Canvas lockCanvas(android.graphics.Rect);
method protected final void onDraw(android.graphics.Canvas);
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
method public void setOpaque(boolean);
method public void setSurfaceTexture(android.graphics.SurfaceTexture);
method public void setSurfaceTextureListener(android.view.TextureView.SurfaceTextureListener);
@@ -45972,6 +46270,7 @@
method public void setFocusable(int);
method public void setFocusableInTouchMode(boolean);
method public void setFocusedByDefault(boolean);
+ method public final void setFocusedInCluster();
method public void setForeground(android.graphics.drawable.Drawable);
method public void setForegroundGravity(int);
method public void setForegroundTintList(android.content.res.ColorStateList);
@@ -46509,6 +46808,7 @@
method public int getLayoutMode();
method public android.animation.LayoutTransition getLayoutTransition();
method public int getNestedScrollAxes();
+ method public android.view.ViewGroupOverlay getOverlay();
method public int getPersistentDrawingCache();
method public boolean getTouchscreenBlocksFocus();
method public int indexOfChild(android.view.View);
@@ -46939,6 +47239,7 @@
method public final boolean isActive();
method public abstract boolean isFloating();
method public abstract boolean isShortcutKey(int, android.view.KeyEvent);
+ method public boolean isWideColorGamut();
method public final void makeActive();
method protected abstract void onActive();
method public abstract void onConfigurationChanged(android.content.res.Configuration);
@@ -47202,12 +47503,12 @@
field public static final int FLAG_SCALED = 16384; // 0x4000
field public static final int FLAG_SECURE = 8192; // 0x2000
field public static final int FLAG_SHOW_WALLPAPER = 1048576; // 0x100000
- field public static final int FLAG_SHOW_WHEN_LOCKED = 524288; // 0x80000
+ field public static final deprecated int FLAG_SHOW_WHEN_LOCKED = 524288; // 0x80000
field public static final int FLAG_SPLIT_TOUCH = 8388608; // 0x800000
field public static final deprecated int FLAG_TOUCHABLE_WHEN_WAKING = 64; // 0x40
field public static final int FLAG_TRANSLUCENT_NAVIGATION = 134217728; // 0x8000000
field public static final int FLAG_TRANSLUCENT_STATUS = 67108864; // 0x4000000
- field public static final int FLAG_TURN_SCREEN_ON = 2097152; // 0x200000
+ field public static final deprecated int FLAG_TURN_SCREEN_ON = 2097152; // 0x200000
field public static final int FLAG_WATCH_OUTSIDE_TOUCH = 262144; // 0x40000
field public static final int FORMAT_CHANGED = 8; // 0x8
field public static final int LAST_APPLICATION_WINDOW = 99; // 0x63
@@ -47793,6 +48094,7 @@
ctor public Animation(android.content.Context, android.util.AttributeSet);
method protected void applyTransformation(float, android.view.animation.Transformation);
method public void cancel();
+ method protected android.view.animation.Animation clone() throws java.lang.CloneNotSupportedException;
method public long computeDurationHint();
method protected void ensureInterpolator();
method public int getBackgroundColor();
@@ -47864,6 +48166,7 @@
ctor public AnimationSet(android.content.Context, android.util.AttributeSet);
ctor public AnimationSet(boolean);
method public void addAnimation(android.view.animation.Animation);
+ method protected android.view.animation.AnimationSet clone() throws java.lang.CloneNotSupportedException;
method public java.util.List<android.view.animation.Animation> getAnimations();
}
@@ -48050,6 +48353,7 @@
package android.view.autofill {
public final class AutofillId implements android.os.Parcelable {
+ ctor public AutofillId(int);
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.view.autofill.AutofillId> CREATOR;
@@ -48068,6 +48372,8 @@
method public void notifyViewEntered(android.view.View, int, android.graphics.Rect);
method public void notifyViewExited(android.view.View);
method public void notifyViewExited(android.view.View, int);
+ method public void notifyViewVisibilityChanged(android.view.View, boolean);
+ method public void notifyViewVisibilityChanged(android.view.View, int, boolean);
method public void registerCallback(android.view.autofill.AutofillManager.AutofillCallback);
method public void requestAutofill(android.view.View);
method public void requestAutofill(android.view.View, int, android.graphics.Rect);
@@ -48714,6 +49020,10 @@
public final deprecated class CookieSyncManager extends android.webkit.WebSyncManager {
method public static android.webkit.CookieSyncManager createInstance(android.content.Context);
method public static android.webkit.CookieSyncManager getInstance();
+ method public deprecated void resetSync();
+ method public deprecated void startSync();
+ method public deprecated void stopSync();
+ method public deprecated void sync();
method protected deprecated void syncFromRamToFlash();
field protected static final java.lang.String LOGTAG = "websync";
field protected android.webkit.WebViewDatabase mDataBase;
@@ -48795,6 +49105,13 @@
method public abstract int rendererPriorityAtExit();
}
+ public abstract class SafeBrowsingResponse {
+ ctor public SafeBrowsingResponse();
+ method public abstract void backToSafety(boolean);
+ method public abstract void proceed(boolean);
+ method public abstract void showInterstitial(boolean);
+ }
+
public class ServiceWorkerClient {
ctor public ServiceWorkerClient();
method public android.webkit.WebResourceResponse shouldInterceptRequest(android.webkit.WebResourceRequest);
@@ -49215,6 +49532,7 @@
method public int getRendererRequestedPriority();
method public deprecated float getScale();
method public android.webkit.WebSettings getSettings();
+ method public android.view.textclassifier.TextClassifier getTextClassifier();
method public java.lang.String getTitle();
method public java.lang.String getUrl();
method public android.webkit.WebChromeClient getWebChromeClient();
@@ -49222,6 +49540,7 @@
method public void goBack();
method public void goBackOrForward(int);
method public void goForward();
+ method public static void initSafeBrowsing(android.content.Context, android.webkit.ValueCallback<java.lang.Boolean>);
method public void invokeZoomPicker();
method public boolean isPrivateBrowsingEnabled();
method public void loadData(java.lang.String, java.lang.String, java.lang.String);
@@ -49261,11 +49580,15 @@
method public void setNetworkAvailable(boolean);
method public deprecated void setPictureListener(android.webkit.WebView.PictureListener);
method public void setRendererPriorityPolicy(int, boolean);
+ method public static void setSafeBrowsingWhitelist(java.util.List<java.lang.String>, android.webkit.ValueCallback<java.lang.Boolean>);
+ method public void setTextClassifier(android.view.textclassifier.TextClassifier);
method public deprecated void setVerticalScrollbarOverlay(boolean);
method public void setWebChromeClient(android.webkit.WebChromeClient);
method public static void setWebContentsDebuggingEnabled(boolean);
method public void setWebViewClient(android.webkit.WebViewClient);
+ method public deprecated boolean shouldDelayChildPressedState();
method public deprecated boolean showFindDialog(java.lang.String, boolean);
+ method public static void shutdownSafeBrowsing();
method public void stopLoading();
method public void zoomBy(float);
method public boolean zoomIn();
@@ -49328,6 +49651,7 @@
method public void onReceivedLoginRequest(android.webkit.WebView, java.lang.String, java.lang.String, java.lang.String);
method public void onReceivedSslError(android.webkit.WebView, android.webkit.SslErrorHandler, android.net.http.SslError);
method public boolean onRenderProcessGone(android.webkit.WebView, android.webkit.RenderProcessGoneDetail);
+ method public void onSafeBrowsingHit(android.webkit.WebView, android.webkit.WebResourceRequest, int, android.webkit.SafeBrowsingResponse);
method public void onScaleChanged(android.webkit.WebView, float, float);
method public deprecated void onTooManyRedirects(android.webkit.WebView, android.os.Message, android.os.Message);
method public void onUnhandledKeyEvent(android.webkit.WebView, android.view.KeyEvent);
@@ -49352,6 +49676,10 @@
field public static final int ERROR_UNSAFE_RESOURCE = -16; // 0xfffffff0
field public static final int ERROR_UNSUPPORTED_AUTH_SCHEME = -3; // 0xfffffffd
field public static final int ERROR_UNSUPPORTED_SCHEME = -10; // 0xfffffff6
+ field public static final int SAFE_BROWSING_THREAT_MALWARE = 1; // 0x1
+ field public static final int SAFE_BROWSING_THREAT_PHISHING = 2; // 0x2
+ field public static final int SAFE_BROWSING_THREAT_UNKNOWN = 0; // 0x0
+ field public static final int SAFE_BROWSING_THREAT_UNWANTED_SOFTWARE = 3; // 0x3
}
public abstract class WebViewDatabase {
@@ -49388,6 +49716,7 @@
method public void clearTextFilter();
method public void deferNotifyDataSetChanged();
method public void fling(int);
+ method public android.widget.AbsListView.LayoutParams generateLayoutParams(android.util.AttributeSet);
method public int getCacheColorHint();
method public int getCheckedItemCount();
method public long[] getCheckedItemIds();
@@ -49554,6 +49883,9 @@
ctor public ActionMenuView(android.content.Context);
ctor public ActionMenuView(android.content.Context, android.util.AttributeSet);
method public void dismissPopupMenus();
+ method protected android.widget.ActionMenuView.LayoutParams generateDefaultLayoutParams();
+ method public android.widget.ActionMenuView.LayoutParams generateLayoutParams(android.util.AttributeSet);
+ method protected android.widget.ActionMenuView.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
method public android.view.Menu getMenu();
method public android.graphics.drawable.Drawable getOverflowIcon();
method public int getPopupTheme();
@@ -49729,7 +50061,6 @@
method public void addAll(T...);
method public void clear();
method public static android.widget.ArrayAdapter<java.lang.CharSequence> createFromResource(android.content.Context, int, int);
- method public java.lang.CharSequence[] getAutofillOptions();
method public android.content.Context getContext();
method public int getCount();
method public android.content.res.Resources.Theme getDropDownViewTheme();
@@ -49819,6 +50150,7 @@
method public void notifyDataSetChanged();
method public void notifyDataSetInvalidated();
method public void registerDataSetObserver(android.database.DataSetObserver);
+ method public void setAutofillOptions(java.lang.CharSequence...);
method public void unregisterDataSetObserver(android.database.DataSetObserver);
}
@@ -50101,6 +50433,7 @@
ctor public EditText(android.content.Context, android.util.AttributeSet, int);
ctor public EditText(android.content.Context, android.util.AttributeSet, int, int);
method public void extendSelection(int);
+ method public android.text.Editable getText();
method public void selectAll();
method public void setSelection(int, int);
method public void setSelection(int);
@@ -50222,6 +50555,8 @@
ctor public FrameLayout(android.content.Context, android.util.AttributeSet);
ctor public FrameLayout(android.content.Context, android.util.AttributeSet, int);
ctor public FrameLayout(android.content.Context, android.util.AttributeSet, int, int);
+ method protected android.widget.FrameLayout.LayoutParams generateDefaultLayoutParams();
+ method public android.widget.FrameLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
method public deprecated boolean getConsiderGoneChildrenWhenMeasuring();
method public boolean getMeasureAllChildren();
method protected void onLayout(boolean, int, int, int, int);
@@ -50268,6 +50603,9 @@
ctor public GridLayout(android.content.Context, android.util.AttributeSet);
ctor public GridLayout(android.content.Context, android.util.AttributeSet, int);
ctor public GridLayout(android.content.Context, android.util.AttributeSet, int, int);
+ method protected android.widget.GridLayout.LayoutParams generateDefaultLayoutParams();
+ method public android.widget.GridLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
+ method protected android.widget.GridLayout.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
method public int getAlignmentMode();
method public int getColumnCount();
method public int getOrientation();
@@ -50480,6 +50818,9 @@
ctor public LinearLayout(android.content.Context, android.util.AttributeSet);
ctor public LinearLayout(android.content.Context, android.util.AttributeSet, int);
ctor public LinearLayout(android.content.Context, android.util.AttributeSet, int, int);
+ method protected android.widget.LinearLayout.LayoutParams generateDefaultLayoutParams();
+ method public android.widget.LinearLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
+ method protected android.widget.LinearLayout.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
method public int getBaselineAlignedChildIndex();
method public android.graphics.drawable.Drawable getDividerDrawable();
method public int getDividerPadding();
@@ -50868,6 +51209,8 @@
method public final synchronized void incrementSecondaryProgressBy(int);
method public boolean isAnimating();
method public synchronized boolean isIndeterminate();
+ method protected synchronized void onDraw(android.graphics.Canvas);
+ method protected synchronized void onMeasure(int, int);
method public void onRestoreInstanceState(android.os.Parcelable);
method public android.os.Parcelable onSaveInstanceState();
method public synchronized void setIndeterminate(boolean);
@@ -50923,6 +51266,7 @@
ctor public RadioGroup(android.content.Context, android.util.AttributeSet);
method public void check(int);
method public void clearCheck();
+ method public android.widget.RadioGroup.LayoutParams generateLayoutParams(android.util.AttributeSet);
method public int getCheckedRadioButtonId();
method public void setOnCheckedChangeListener(android.widget.RadioGroup.OnCheckedChangeListener);
}
@@ -50965,6 +51309,7 @@
ctor public RelativeLayout(android.content.Context, android.util.AttributeSet);
ctor public RelativeLayout(android.content.Context, android.util.AttributeSet, int);
ctor public RelativeLayout(android.content.Context, android.util.AttributeSet, int, int);
+ method public android.widget.RelativeLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
method public int getGravity();
method protected void onLayout(boolean, int, int, int, int);
method public void setGravity(int);
@@ -51509,6 +51854,7 @@
public class TableLayout extends android.widget.LinearLayout {
ctor public TableLayout(android.content.Context);
ctor public TableLayout(android.content.Context, android.util.AttributeSet);
+ method public android.widget.TableLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
method public boolean isColumnCollapsed(int);
method public boolean isColumnShrinkable(int);
method public boolean isColumnStretchable(int);
@@ -51533,6 +51879,7 @@
public class TableRow extends android.widget.LinearLayout {
ctor public TableRow(android.content.Context);
ctor public TableRow(android.content.Context, android.util.AttributeSet);
+ method public android.widget.TableRow.LayoutParams generateLayoutParams(android.util.AttributeSet);
method public android.view.View getVirtualChildAt(int);
method public int getVirtualChildCount();
}
@@ -51881,6 +52228,7 @@
ctor public ToggleButton(android.content.Context);
method public java.lang.CharSequence getTextOff();
method public java.lang.CharSequence getTextOn();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
method public void setTextOff(java.lang.CharSequence);
method public void setTextOn(java.lang.CharSequence);
}
@@ -51892,6 +52240,9 @@
ctor public Toolbar(android.content.Context, android.util.AttributeSet, int, int);
method public void collapseActionView();
method public void dismissPopupMenus();
+ method protected android.widget.Toolbar.LayoutParams generateDefaultLayoutParams();
+ method public android.widget.Toolbar.LayoutParams generateLayoutParams(android.util.AttributeSet);
+ method protected android.widget.Toolbar.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
method public int getContentInsetEnd();
method public int getContentInsetEndWithActions();
method public int getContentInsetLeft();
@@ -52414,6 +52765,13 @@
public class BaseDexClassLoader extends java.lang.ClassLoader {
ctor public BaseDexClassLoader(java.lang.String, java.io.File, java.lang.String, java.lang.ClassLoader);
method public java.lang.String findLibrary(java.lang.String);
+ method protected java.util.Enumeration<java.net.URL> findResources(java.lang.String);
+ method protected synchronized java.lang.Package getPackage(java.lang.String);
+ }
+
+ public final class DelegateLastClassLoader extends dalvik.system.PathClassLoader {
+ ctor public DelegateLastClassLoader(java.lang.String, java.lang.ClassLoader);
+ ctor public DelegateLastClassLoader(java.lang.String, java.lang.String, java.lang.ClassLoader);
}
public class DexClassLoader extends dalvik.system.BaseDexClassLoader {
@@ -52432,6 +52790,7 @@
}
public final class InMemoryDexClassLoader extends dalvik.system.BaseDexClassLoader {
+ ctor public InMemoryDexClassLoader(java.nio.ByteBuffer[], java.lang.ClassLoader);
ctor public InMemoryDexClassLoader(java.nio.ByteBuffer, java.lang.ClassLoader);
}
@@ -52635,6 +52994,10 @@
public class BufferedInputStream extends java.io.FilterInputStream {
ctor public BufferedInputStream(java.io.InputStream);
ctor public BufferedInputStream(java.io.InputStream, int);
+ method public synchronized int available() throws java.io.IOException;
+ method public synchronized int read() throws java.io.IOException;
+ method public synchronized int read(byte[], int, int) throws java.io.IOException;
+ method public synchronized long skip(long) throws java.io.IOException;
field protected volatile byte[] buf;
field protected int count;
field protected int marklimit;
@@ -52645,6 +53008,9 @@
public class BufferedOutputStream extends java.io.FilterOutputStream {
ctor public BufferedOutputStream(java.io.OutputStream);
ctor public BufferedOutputStream(java.io.OutputStream, int);
+ method public synchronized void flush() throws java.io.IOException;
+ method public synchronized void write(int) throws java.io.IOException;
+ method public synchronized void write(byte[], int, int) throws java.io.IOException;
field protected byte[] buf;
field protected int count;
}
@@ -52670,7 +53036,12 @@
public class ByteArrayInputStream extends java.io.InputStream {
ctor public ByteArrayInputStream(byte[]);
ctor public ByteArrayInputStream(byte[], int, int);
+ method public synchronized int available();
+ method public void mark(int);
method public synchronized int read();
+ method public synchronized int read(byte[], int, int);
+ method public synchronized void reset();
+ method public synchronized long skip(long);
field protected byte[] buf;
field protected int count;
field protected int mark;
@@ -52683,9 +53054,11 @@
method public synchronized void reset();
method public synchronized int size();
method public synchronized byte[] toByteArray();
+ method public synchronized java.lang.String toString();
method public synchronized java.lang.String toString(java.lang.String) throws java.io.UnsupportedEncodingException;
method public deprecated synchronized java.lang.String toString(int);
method public synchronized void write(int);
+ method public synchronized void write(byte[], int, int);
method public synchronized void writeTo(java.io.OutputStream) throws java.io.IOException;
field protected byte[] buf;
field protected int count;
@@ -52705,12 +53078,17 @@
public class CharArrayWriter extends java.io.Writer {
ctor public CharArrayWriter();
ctor public CharArrayWriter(int);
+ method public java.io.CharArrayWriter append(java.lang.CharSequence);
+ method public java.io.CharArrayWriter append(java.lang.CharSequence, int, int);
+ method public java.io.CharArrayWriter append(char);
method public void close();
method public void flush();
method public void reset();
method public int size();
method public char[] toCharArray();
+ method public void write(int);
method public void write(char[], int, int);
+ method public void write(java.lang.String, int, int);
method public void writeTo(java.io.Writer) throws java.io.IOException;
field protected char[] buf;
field protected int count;
@@ -52797,6 +53175,8 @@
public class DataOutputStream extends java.io.FilterOutputStream implements java.io.DataOutput {
ctor public DataOutputStream(java.io.OutputStream);
method public final int size();
+ method public synchronized void write(int) throws java.io.IOException;
+ method public synchronized void write(byte[], int, int) throws java.io.IOException;
method public final void writeBoolean(boolean) throws java.io.IOException;
method public final void writeByte(int) throws java.io.IOException;
method public final void writeBytes(java.lang.String) throws java.io.IOException;
@@ -52896,6 +53276,7 @@
ctor public FileInputStream(java.lang.String) throws java.io.FileNotFoundException;
ctor public FileInputStream(java.io.File) throws java.io.FileNotFoundException;
ctor public FileInputStream(java.io.FileDescriptor);
+ method protected void finalize() throws java.io.IOException;
method public java.nio.channels.FileChannel getChannel();
method public final java.io.FileDescriptor getFD() throws java.io.IOException;
method public int read() throws java.io.IOException;
@@ -52912,6 +53293,7 @@
ctor public FileOutputStream(java.io.File) throws java.io.FileNotFoundException;
ctor public FileOutputStream(java.io.File, boolean) throws java.io.FileNotFoundException;
ctor public FileOutputStream(java.io.FileDescriptor);
+ method protected void finalize() throws java.io.IOException;
method public java.nio.channels.FileChannel getChannel();
method public final java.io.FileDescriptor getFD() throws java.io.IOException;
method public void write(int) throws java.io.IOException;
@@ -53025,6 +53407,8 @@
public deprecated class LineNumberInputStream extends java.io.FilterInputStream {
ctor public LineNumberInputStream(java.io.InputStream);
method public int getLineNumber();
+ method public void mark(int);
+ method public void reset() throws java.io.IOException;
method public void setLineNumber(int);
}
@@ -53254,8 +53638,10 @@
ctor public PipedInputStream(java.io.PipedOutputStream, int) throws java.io.IOException;
ctor public PipedInputStream();
ctor public PipedInputStream(int);
+ method public synchronized int available() throws java.io.IOException;
method public void connect(java.io.PipedOutputStream) throws java.io.IOException;
method public synchronized int read() throws java.io.IOException;
+ method public synchronized int read(byte[], int, int) throws java.io.IOException;
method protected synchronized void receive(int) throws java.io.IOException;
field protected static final int PIPE_SIZE = 1024; // 0x400
field protected byte[] buffer;
@@ -53267,6 +53653,7 @@
ctor public PipedOutputStream(java.io.PipedInputStream) throws java.io.IOException;
ctor public PipedOutputStream();
method public synchronized void connect(java.io.PipedInputStream) throws java.io.IOException;
+ method public synchronized void flush() throws java.io.IOException;
method public void write(int) throws java.io.IOException;
}
@@ -53277,7 +53664,9 @@
ctor public PipedReader(int);
method public void close() throws java.io.IOException;
method public void connect(java.io.PipedWriter) throws java.io.IOException;
+ method public synchronized int read() throws java.io.IOException;
method public synchronized int read(char[], int, int) throws java.io.IOException;
+ method public synchronized boolean ready() throws java.io.IOException;
}
public class PipedWriter extends java.io.Writer {
@@ -53302,6 +53691,8 @@
method public java.io.PrintStream append(char);
method public boolean checkError();
method protected void clearError();
+ method public void close();
+ method public void flush();
method public java.io.PrintStream format(java.lang.String, java.lang.Object...);
method public java.io.PrintStream format(java.util.Locale, java.lang.String, java.lang.Object...);
method public void print(boolean);
@@ -53326,6 +53717,8 @@
method public void println(java.lang.String);
method public void println(java.lang.Object);
method protected void setError();
+ method public void write(int);
+ method public void write(byte[], int, int);
}
public class PrintWriter extends java.io.Writer {
@@ -53337,6 +53730,9 @@
ctor public PrintWriter(java.lang.String, java.lang.String) throws java.io.FileNotFoundException, java.io.UnsupportedEncodingException;
ctor public PrintWriter(java.io.File) throws java.io.FileNotFoundException;
ctor public PrintWriter(java.io.File, java.lang.String) throws java.io.FileNotFoundException, java.io.UnsupportedEncodingException;
+ method public java.io.PrintWriter append(java.lang.CharSequence);
+ method public java.io.PrintWriter append(java.lang.CharSequence, int, int);
+ method public java.io.PrintWriter append(char);
method public boolean checkError();
method protected void clearError();
method public void close();
@@ -53365,13 +53761,18 @@
method public void println(java.lang.String);
method public void println(java.lang.Object);
method protected void setError();
+ method public void write(int);
method public void write(char[], int, int);
+ method public void write(char[]);
+ method public void write(java.lang.String, int, int);
+ method public void write(java.lang.String);
field protected java.io.Writer out;
}
public class PushbackInputStream extends java.io.FilterInputStream {
ctor public PushbackInputStream(java.io.InputStream, int);
ctor public PushbackInputStream(java.io.InputStream);
+ method public synchronized void close() throws java.io.IOException;
method public void unread(int) throws java.io.IOException;
method public void unread(byte[], int, int) throws java.io.IOException;
method public void unread(byte[]) throws java.io.IOException;
@@ -53495,7 +53896,11 @@
public deprecated class StringBufferInputStream extends java.io.InputStream {
ctor public StringBufferInputStream(java.lang.String);
+ method public synchronized int available();
method public synchronized int read();
+ method public synchronized int read(byte[], int, int);
+ method public synchronized void reset();
+ method public synchronized long skip(long);
field protected java.lang.String buffer;
field protected int count;
field protected int pos;
@@ -53510,10 +53915,16 @@
public class StringWriter extends java.io.Writer {
ctor public StringWriter();
ctor public StringWriter(int);
+ method public java.io.StringWriter append(java.lang.CharSequence);
+ method public java.io.StringWriter append(java.lang.CharSequence, int, int);
+ method public java.io.StringWriter append(char);
method public void close() throws java.io.IOException;
method public void flush();
method public java.lang.StringBuffer getBuffer();
+ method public void write(int);
method public void write(char[], int, int);
+ method public void write(java.lang.String);
+ method public void write(java.lang.String, int, int);
}
public class SyncFailedException extends java.io.IOException {
@@ -53528,6 +53939,7 @@
public class UncheckedIOException extends java.lang.RuntimeException {
ctor public UncheckedIOException(java.lang.String, java.io.IOException);
ctor public UncheckedIOException(java.io.IOException);
+ method public java.io.IOException getCause();
}
public class UnsupportedEncodingException extends java.io.IOException {
@@ -53537,6 +53949,7 @@
public class WriteAbortedException extends java.io.ObjectStreamException {
ctor public WriteAbortedException(java.lang.String, java.lang.Exception);
+ method public java.lang.Throwable getCause();
field public java.lang.Exception detail;
}
@@ -54304,6 +54717,7 @@
ctor public ClassNotFoundException();
ctor public ClassNotFoundException(java.lang.String);
ctor public ClassNotFoundException(java.lang.String, java.lang.Throwable);
+ method public java.lang.Throwable getCause();
method public java.lang.Throwable getException();
}
@@ -54408,6 +54822,7 @@
ctor public ExceptionInInitializerError();
ctor public ExceptionInInitializerError(java.lang.Throwable);
ctor public ExceptionInInitializerError(java.lang.String);
+ method public java.lang.Throwable getCause();
method public java.lang.Throwable getException();
}
@@ -55195,8 +55610,16 @@
method public synchronized java.lang.StringBuffer append(float);
method public synchronized java.lang.StringBuffer append(double);
method public synchronized java.lang.StringBuffer appendCodePoint(int);
+ method public synchronized int capacity();
+ method public synchronized char charAt(int);
+ method public synchronized int codePointAt(int);
+ method public synchronized int codePointBefore(int);
+ method public synchronized int codePointCount(int, int);
method public synchronized java.lang.StringBuffer delete(int, int);
method public synchronized java.lang.StringBuffer deleteCharAt(int);
+ method public synchronized void ensureCapacity(int);
+ method public synchronized void getChars(int, int, char[], int);
+ method public synchronized int indexOf(java.lang.String, int);
method public synchronized java.lang.StringBuffer insert(int, char[], int, int);
method public synchronized java.lang.StringBuffer insert(int, java.lang.Object);
method public synchronized java.lang.StringBuffer insert(int, java.lang.String);
@@ -55209,9 +55632,18 @@
method public java.lang.StringBuffer insert(int, long);
method public java.lang.StringBuffer insert(int, float);
method public java.lang.StringBuffer insert(int, double);
+ method public synchronized int lastIndexOf(java.lang.String, int);
+ method public synchronized int length();
+ method public synchronized int offsetByCodePoints(int, int);
method public synchronized java.lang.StringBuffer replace(int, int, java.lang.String);
method public synchronized java.lang.StringBuffer reverse();
+ method public synchronized void setCharAt(int, char);
+ method public synchronized void setLength(int);
+ method public synchronized java.lang.CharSequence subSequence(int, int);
+ method public synchronized java.lang.String substring(int);
+ method public synchronized java.lang.String substring(int, int);
method public synchronized java.lang.String toString();
+ method public synchronized void trimToSize();
}
public final class StringBuilder extends java.lang.AbstractStringBuilder implements java.lang.CharSequence java.io.Serializable {
@@ -55866,6 +56298,7 @@
ctor protected InvocationTargetException();
ctor public InvocationTargetException(java.lang.Throwable);
ctor public InvocationTargetException(java.lang.Throwable, java.lang.String);
+ method public java.lang.Throwable getCause();
method public java.lang.Throwable getTargetException();
}
@@ -55981,6 +56414,7 @@
public class UndeclaredThrowableException extends java.lang.RuntimeException {
ctor public UndeclaredThrowableException(java.lang.Throwable);
ctor public UndeclaredThrowableException(java.lang.Throwable, java.lang.String);
+ method public java.lang.Throwable getCause();
method public java.lang.Throwable getUndeclaredThrowable();
}
@@ -56878,6 +57312,7 @@
method public java.lang.String getQuery();
method public java.lang.String getRef();
method public java.lang.String getUserInfo();
+ method public synchronized int hashCode();
method public java.net.URLConnection openConnection() throws java.io.IOException;
method public java.net.URLConnection openConnection(java.net.Proxy) throws java.io.IOException;
method public final java.io.InputStream openStream() throws java.io.IOException;
@@ -57107,7 +57542,6 @@
method public final int arrayOffset();
method public abstract java.nio.CharBuffer asReadOnlyBuffer();
method public final char charAt(int);
- method public java.util.stream.IntStream chars();
method public abstract java.nio.CharBuffer compact();
method public int compareTo(java.nio.CharBuffer);
method public abstract java.nio.CharBuffer duplicate();
@@ -57964,6 +58398,7 @@
public final class DirectoryIteratorException extends java.util.ConcurrentModificationException {
ctor public DirectoryIteratorException(java.io.IOException);
+ method public java.io.IOException getCause();
}
public class DirectoryNotEmptyException extends java.nio.file.FileSystemException {
@@ -58929,9 +59364,11 @@
public static class KeyStore.PasswordProtection implements javax.security.auth.Destroyable java.security.KeyStore.ProtectionParameter {
ctor public KeyStore.PasswordProtection(char[]);
ctor public KeyStore.PasswordProtection(char[], java.lang.String, java.security.spec.AlgorithmParameterSpec);
+ method public synchronized void destroy() throws javax.security.auth.DestroyFailedException;
method public synchronized char[] getPassword();
method public java.lang.String getProtectionAlgorithm();
method public java.security.spec.AlgorithmParameterSpec getProtectionParameters();
+ method public synchronized boolean isDestroyed();
}
public static final class KeyStore.PrivateKeyEntry implements java.security.KeyStore.Entry {
@@ -59111,6 +59548,7 @@
public class PrivilegedActionException extends java.lang.Exception {
ctor public PrivilegedActionException(java.lang.Exception);
+ method public java.lang.Throwable getCause();
method public java.lang.Exception getException();
}
@@ -59133,22 +59571,30 @@
method public synchronized java.lang.Object compute(java.lang.Object, java.util.function.BiFunction<? super java.lang.Object, ? super java.lang.Object, ? extends java.lang.Object>);
method public synchronized java.lang.Object computeIfAbsent(java.lang.Object, java.util.function.Function<? super java.lang.Object, ? extends java.lang.Object>);
method public synchronized java.lang.Object computeIfPresent(java.lang.Object, java.util.function.BiFunction<? super java.lang.Object, ? super java.lang.Object, ? extends java.lang.Object>);
+ method public java.util.Enumeration<java.lang.Object> elements();
+ method public synchronized java.util.Set<java.util.Map.Entry<java.lang.Object, java.lang.Object>> entrySet();
method public synchronized void forEach(java.util.function.BiConsumer<? super java.lang.Object, ? super java.lang.Object>);
+ method public java.lang.Object get(java.lang.Object);
method public java.lang.String getInfo();
method public java.lang.String getName();
method public synchronized java.lang.Object getOrDefault(java.lang.Object, java.lang.Object);
method public synchronized java.security.Provider.Service getService(java.lang.String, java.lang.String);
method public synchronized java.util.Set<java.security.Provider.Service> getServices();
method public double getVersion();
+ method public java.util.Set<java.lang.Object> keySet();
+ method public java.util.Enumeration<java.lang.Object> keys();
method public synchronized java.lang.Object merge(java.lang.Object, java.lang.Object, java.util.function.BiFunction<? super java.lang.Object, ? super java.lang.Object, ? extends java.lang.Object>);
method public synchronized java.lang.Object put(java.lang.Object, java.lang.Object);
method public synchronized void putAll(java.util.Map<?, ?>);
method public synchronized java.lang.Object putIfAbsent(java.lang.Object, java.lang.Object);
method protected synchronized void putService(java.security.Provider.Service);
+ method public synchronized java.lang.Object remove(java.lang.Object);
method protected synchronized void removeService(java.security.Provider.Service);
method public synchronized boolean replace(java.lang.Object, java.lang.Object, java.lang.Object);
method public synchronized java.lang.Object replace(java.lang.Object, java.lang.Object);
method public synchronized void replaceAll(java.util.function.BiFunction<? super java.lang.Object, ? super java.lang.Object, ? extends java.lang.Object>);
+ method public java.lang.String toString();
+ method public java.util.Collection<java.lang.Object> values();
}
public static class Provider.Service {
@@ -59194,7 +59640,9 @@
method public final java.security.Provider getProvider();
method public static byte[] getSeed(int);
method protected final int next(int);
+ method public synchronized void nextBytes(byte[]);
method public synchronized void setSeed(byte[]);
+ method public void setSeed(long);
}
public abstract class SecureRandomSpi implements java.io.Serializable {
@@ -59741,6 +60189,7 @@
public abstract class PKIXRevocationChecker extends java.security.cert.PKIXCertPathChecker {
ctor protected PKIXRevocationChecker();
+ method public java.security.cert.PKIXRevocationChecker clone();
method public java.util.List<java.security.cert.Extension> getOcspExtensions();
method public java.net.URI getOcspResponder();
method public java.security.cert.X509Certificate getOcspResponderCert();
@@ -61993,7 +62442,6 @@
public final class DayOfWeek extends java.lang.Enum implements java.time.temporal.TemporalAccessor java.time.temporal.TemporalAdjuster {
method public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
method public static java.time.DayOfWeek from(java.time.temporal.TemporalAccessor);
- method public int get(java.time.temporal.TemporalField);
method public java.lang.String getDisplayName(java.time.format.TextStyle, java.util.Locale);
method public long getLong(java.time.temporal.TemporalField);
method public int getValue();
@@ -62001,8 +62449,6 @@
method public java.time.DayOfWeek minus(long);
method public static java.time.DayOfWeek of(int);
method public java.time.DayOfWeek plus(long);
- method public <R> R query(java.time.temporal.TemporalQuery<R>);
- method public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
method public static java.time.DayOfWeek valueOf(java.lang.String);
method public static final java.time.DayOfWeek[] values();
enum_constant public static final java.time.DayOfWeek FRIDAY;
@@ -62078,6 +62524,8 @@
method public boolean isBefore(java.time.Instant);
method public boolean isSupported(java.time.temporal.TemporalField);
method public boolean isSupported(java.time.temporal.TemporalUnit);
+ method public java.time.Instant minus(java.time.temporal.TemporalAmount);
+ method public java.time.Instant minus(long, java.time.temporal.TemporalUnit);
method public java.time.Instant minusMillis(long);
method public java.time.Instant minusNanos(long);
method public java.time.Instant minusSeconds(long);
@@ -62087,6 +62535,7 @@
method public static java.time.Instant ofEpochSecond(long);
method public static java.time.Instant ofEpochSecond(long, long);
method public static java.time.Instant parse(java.lang.CharSequence);
+ method public java.time.Instant plus(java.time.temporal.TemporalAmount);
method public java.time.Instant plus(long, java.time.temporal.TemporalUnit);
method public java.time.Instant plusMillis(long);
method public java.time.Instant plusNanos(long);
@@ -62094,6 +62543,7 @@
method public long toEpochMilli();
method public java.time.Instant truncatedTo(java.time.temporal.TemporalUnit);
method public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
+ method public java.time.Instant with(java.time.temporal.TemporalAdjuster);
method public java.time.Instant with(java.time.temporal.TemporalField, long);
field public static final java.time.Instant EPOCH;
field public static final java.time.Instant MAX;
@@ -62103,6 +62553,7 @@
public final class LocalDate implements java.time.chrono.ChronoLocalDate java.io.Serializable java.time.temporal.Temporal java.time.temporal.TemporalAdjuster {
method public java.time.LocalDateTime atStartOfDay();
method public java.time.ZonedDateTime atStartOfDay(java.time.ZoneId);
+ method public java.time.LocalDateTime atTime(java.time.LocalTime);
method public java.time.LocalDateTime atTime(int, int);
method public java.time.LocalDateTime atTime(int, int, int);
method public java.time.LocalDateTime atTime(int, int, int, int);
@@ -62117,6 +62568,8 @@
method public int getMonthValue();
method public int getYear();
method public int lengthOfMonth();
+ method public java.time.LocalDate minus(java.time.temporal.TemporalAmount);
+ method public java.time.LocalDate minus(long, java.time.temporal.TemporalUnit);
method public java.time.LocalDate minusDays(long);
method public java.time.LocalDate minusMonths(long);
method public java.time.LocalDate minusWeeks(long);
@@ -62130,12 +62583,16 @@
method public static java.time.LocalDate ofYearDay(int, int);
method public static java.time.LocalDate parse(java.lang.CharSequence);
method public static java.time.LocalDate parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
+ method public java.time.LocalDate plus(java.time.temporal.TemporalAmount);
+ method public java.time.LocalDate plus(long, java.time.temporal.TemporalUnit);
method public java.time.LocalDate plusDays(long);
method public java.time.LocalDate plusMonths(long);
method public java.time.LocalDate plusWeeks(long);
method public java.time.LocalDate plusYears(long);
method public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
method public java.time.Period until(java.time.chrono.ChronoLocalDate);
+ method public java.time.LocalDate with(java.time.temporal.TemporalAdjuster);
+ method public java.time.LocalDate with(java.time.temporal.TemporalField, long);
method public java.time.LocalDate withDayOfMonth(int);
method public java.time.LocalDate withDayOfYear(int);
method public java.time.LocalDate withMonth(int);
@@ -62160,6 +62617,8 @@
method public int getSecond();
method public int getYear();
method public boolean isSupported(java.time.temporal.TemporalField);
+ method public java.time.LocalDateTime minus(java.time.temporal.TemporalAmount);
+ method public java.time.LocalDateTime minus(long, java.time.temporal.TemporalUnit);
method public java.time.LocalDateTime minusDays(long);
method public java.time.LocalDateTime minusHours(long);
method public java.time.LocalDateTime minusMinutes(long);
@@ -62182,6 +62641,7 @@
method public static java.time.LocalDateTime ofInstant(java.time.Instant, java.time.ZoneId);
method public static java.time.LocalDateTime parse(java.lang.CharSequence);
method public static java.time.LocalDateTime parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
+ method public java.time.LocalDateTime plus(java.time.temporal.TemporalAmount);
method public java.time.LocalDateTime plus(long, java.time.temporal.TemporalUnit);
method public java.time.LocalDateTime plusDays(long);
method public java.time.LocalDateTime plusHours(long);
@@ -62195,6 +62655,7 @@
method public java.time.LocalTime toLocalTime();
method public java.time.LocalDateTime truncatedTo(java.time.temporal.TemporalUnit);
method public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
+ method public java.time.LocalDateTime with(java.time.temporal.TemporalAdjuster);
method public java.time.LocalDateTime with(java.time.temporal.TemporalField, long);
method public java.time.LocalDateTime withDayOfMonth(int);
method public java.time.LocalDateTime withDayOfYear(int);
@@ -62224,6 +62685,8 @@
method public boolean isBefore(java.time.LocalTime);
method public boolean isSupported(java.time.temporal.TemporalField);
method public boolean isSupported(java.time.temporal.TemporalUnit);
+ method public java.time.LocalTime minus(java.time.temporal.TemporalAmount);
+ method public java.time.LocalTime minus(long, java.time.temporal.TemporalUnit);
method public java.time.LocalTime minusHours(long);
method public java.time.LocalTime minusMinutes(long);
method public java.time.LocalTime minusNanos(long);
@@ -62238,6 +62701,7 @@
method public static java.time.LocalTime ofSecondOfDay(long);
method public static java.time.LocalTime parse(java.lang.CharSequence);
method public static java.time.LocalTime parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
+ method public java.time.LocalTime plus(java.time.temporal.TemporalAmount);
method public java.time.LocalTime plus(long, java.time.temporal.TemporalUnit);
method public java.time.LocalTime plusHours(long);
method public java.time.LocalTime plusMinutes(long);
@@ -62247,6 +62711,7 @@
method public int toSecondOfDay();
method public java.time.LocalTime truncatedTo(java.time.temporal.TemporalUnit);
method public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
+ method public java.time.LocalTime with(java.time.temporal.TemporalAdjuster);
method public java.time.LocalTime with(java.time.temporal.TemporalField, long);
method public java.time.LocalTime withHour(int);
method public java.time.LocalTime withMinute(int);
@@ -62263,7 +62728,6 @@
method public int firstDayOfYear(boolean);
method public java.time.Month firstMonthOfQuarter();
method public static java.time.Month from(java.time.temporal.TemporalAccessor);
- method public int get(java.time.temporal.TemporalField);
method public java.lang.String getDisplayName(java.time.format.TextStyle, java.util.Locale);
method public long getLong(java.time.temporal.TemporalField);
method public int getValue();
@@ -62274,8 +62738,6 @@
method public java.time.Month minus(long);
method public static java.time.Month of(int);
method public java.time.Month plus(long);
- method public <R> R query(java.time.temporal.TemporalQuery<R>);
- method public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
method public static java.time.Month valueOf(java.lang.String);
method public static final java.time.Month[] values();
enum_constant public static final java.time.Month APRIL;
@@ -62342,6 +62804,8 @@
method public boolean isEqual(java.time.OffsetDateTime);
method public boolean isSupported(java.time.temporal.TemporalField);
method public boolean isSupported(java.time.temporal.TemporalUnit);
+ method public java.time.OffsetDateTime minus(java.time.temporal.TemporalAmount);
+ method public java.time.OffsetDateTime minus(long, java.time.temporal.TemporalUnit);
method public java.time.OffsetDateTime minusDays(long);
method public java.time.OffsetDateTime minusHours(long);
method public java.time.OffsetDateTime minusMinutes(long);
@@ -62359,6 +62823,7 @@
method public static java.time.OffsetDateTime ofInstant(java.time.Instant, java.time.ZoneId);
method public static java.time.OffsetDateTime parse(java.lang.CharSequence);
method public static java.time.OffsetDateTime parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
+ method public java.time.OffsetDateTime plus(java.time.temporal.TemporalAmount);
method public java.time.OffsetDateTime plus(long, java.time.temporal.TemporalUnit);
method public java.time.OffsetDateTime plusDays(long);
method public java.time.OffsetDateTime plusHours(long);
@@ -62378,6 +62843,7 @@
method public java.time.ZonedDateTime toZonedDateTime();
method public java.time.OffsetDateTime truncatedTo(java.time.temporal.TemporalUnit);
method public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
+ method public java.time.OffsetDateTime with(java.time.temporal.TemporalAdjuster);
method public java.time.OffsetDateTime with(java.time.temporal.TemporalField, long);
method public java.time.OffsetDateTime withDayOfMonth(int);
method public java.time.OffsetDateTime withDayOfYear(int);
@@ -62410,6 +62876,8 @@
method public boolean isEqual(java.time.OffsetTime);
method public boolean isSupported(java.time.temporal.TemporalField);
method public boolean isSupported(java.time.temporal.TemporalUnit);
+ method public java.time.OffsetTime minus(java.time.temporal.TemporalAmount);
+ method public java.time.OffsetTime minus(long, java.time.temporal.TemporalUnit);
method public java.time.OffsetTime minusHours(long);
method public java.time.OffsetTime minusMinutes(long);
method public java.time.OffsetTime minusNanos(long);
@@ -62422,6 +62890,7 @@
method public static java.time.OffsetTime ofInstant(java.time.Instant, java.time.ZoneId);
method public static java.time.OffsetTime parse(java.lang.CharSequence);
method public static java.time.OffsetTime parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
+ method public java.time.OffsetTime plus(java.time.temporal.TemporalAmount);
method public java.time.OffsetTime plus(long, java.time.temporal.TemporalUnit);
method public java.time.OffsetTime plusHours(long);
method public java.time.OffsetTime plusMinutes(long);
@@ -62430,6 +62899,7 @@
method public java.time.LocalTime toLocalTime();
method public java.time.OffsetTime truncatedTo(java.time.temporal.TemporalUnit);
method public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
+ method public java.time.OffsetTime with(java.time.temporal.TemporalAdjuster);
method public java.time.OffsetTime with(java.time.temporal.TemporalField, long);
method public java.time.OffsetTime withHour(int);
method public java.time.OffsetTime withMinute(int);
@@ -62456,6 +62926,7 @@
method public java.time.Period minusMonths(long);
method public java.time.Period minusYears(long);
method public java.time.Period multipliedBy(int);
+ method public java.time.Period negated();
method public java.time.Period normalized();
method public static java.time.Period of(int, int, int);
method public static java.time.Period ofDays(int);
@@ -62494,6 +62965,8 @@
method public boolean isSupported(java.time.temporal.TemporalUnit);
method public boolean isValidMonthDay(java.time.MonthDay);
method public int length();
+ method public java.time.Year minus(java.time.temporal.TemporalAmount);
+ method public java.time.Year minus(long, java.time.temporal.TemporalUnit);
method public java.time.Year minusYears(long);
method public static java.time.Year now();
method public static java.time.Year now(java.time.ZoneId);
@@ -62501,9 +62974,11 @@
method public static java.time.Year of(int);
method public static java.time.Year parse(java.lang.CharSequence);
method public static java.time.Year parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
+ method public java.time.Year plus(java.time.temporal.TemporalAmount);
method public java.time.Year plus(long, java.time.temporal.TemporalUnit);
method public java.time.Year plusYears(long);
method public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
+ method public java.time.Year with(java.time.temporal.TemporalAdjuster);
method public java.time.Year with(java.time.temporal.TemporalField, long);
field public static final int MAX_VALUE = 999999999; // 0x3b9ac9ff
field public static final int MIN_VALUE = -999999999; // 0xc4653601
@@ -62528,6 +63003,8 @@
method public boolean isValidDay(int);
method public int lengthOfMonth();
method public int lengthOfYear();
+ method public java.time.YearMonth minus(java.time.temporal.TemporalAmount);
+ method public java.time.YearMonth minus(long, java.time.temporal.TemporalUnit);
method public java.time.YearMonth minusMonths(long);
method public java.time.YearMonth minusYears(long);
method public static java.time.YearMonth now();
@@ -62537,10 +63014,12 @@
method public static java.time.YearMonth of(int, int);
method public static java.time.YearMonth parse(java.lang.CharSequence);
method public static java.time.YearMonth parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
+ method public java.time.YearMonth plus(java.time.temporal.TemporalAmount);
method public java.time.YearMonth plus(long, java.time.temporal.TemporalUnit);
method public java.time.YearMonth plusMonths(long);
method public java.time.YearMonth plusYears(long);
method public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
+ method public java.time.YearMonth with(java.time.temporal.TemporalAdjuster);
method public java.time.YearMonth with(java.time.temporal.TemporalField, long);
method public java.time.YearMonth withMonth(int);
method public java.time.YearMonth withYear(int);
@@ -62564,7 +63043,6 @@
method public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
method public int compareTo(java.time.ZoneOffset);
method public static java.time.ZoneOffset from(java.time.temporal.TemporalAccessor);
- method public int get(java.time.temporal.TemporalField);
method public java.lang.String getId();
method public long getLong(java.time.temporal.TemporalField);
method public java.time.zone.ZoneRules getRules();
@@ -62575,8 +63053,6 @@
method public static java.time.ZoneOffset ofHoursMinutes(int, int);
method public static java.time.ZoneOffset ofHoursMinutesSeconds(int, int, int);
method public static java.time.ZoneOffset ofTotalSeconds(int);
- method public <R> R query(java.time.temporal.TemporalQuery<R>);
- method public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
field public static final java.time.ZoneOffset MAX;
field public static final java.time.ZoneOffset MIN;
field public static final java.time.ZoneOffset UTC;
@@ -62597,6 +63073,8 @@
method public int getYear();
method public java.time.ZoneId getZone();
method public boolean isSupported(java.time.temporal.TemporalField);
+ method public java.time.ZonedDateTime minus(java.time.temporal.TemporalAmount);
+ method public java.time.ZonedDateTime minus(long, java.time.temporal.TemporalUnit);
method public java.time.ZonedDateTime minusDays(long);
method public java.time.ZonedDateTime minusHours(long);
method public java.time.ZonedDateTime minusMinutes(long);
@@ -62617,6 +63095,7 @@
method public static java.time.ZonedDateTime ofStrict(java.time.LocalDateTime, java.time.ZoneOffset, java.time.ZoneId);
method public static java.time.ZonedDateTime parse(java.lang.CharSequence);
method public static java.time.ZonedDateTime parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
+ method public java.time.ZonedDateTime plus(java.time.temporal.TemporalAmount);
method public java.time.ZonedDateTime plus(long, java.time.temporal.TemporalUnit);
method public java.time.ZonedDateTime plusDays(long);
method public java.time.ZonedDateTime plusHours(long);
@@ -62626,10 +63105,12 @@
method public java.time.ZonedDateTime plusSeconds(long);
method public java.time.ZonedDateTime plusWeeks(long);
method public java.time.ZonedDateTime plusYears(long);
+ method public java.time.LocalDate toLocalDate();
method public java.time.LocalDateTime toLocalDateTime();
method public java.time.OffsetDateTime toOffsetDateTime();
method public java.time.ZonedDateTime truncatedTo(java.time.temporal.TemporalUnit);
method public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
+ method public java.time.ZonedDateTime with(java.time.temporal.TemporalAdjuster);
method public java.time.ZonedDateTime with(java.time.temporal.TemporalField, long);
method public java.time.ZonedDateTime withDayOfMonth(int);
method public java.time.ZonedDateTime withDayOfYear(int);
@@ -62674,17 +63155,27 @@
method public default boolean isSupported(java.time.temporal.TemporalUnit);
method public abstract int lengthOfMonth();
method public default int lengthOfYear();
+ method public default java.time.chrono.ChronoLocalDate minus(java.time.temporal.TemporalAmount);
+ method public default java.time.chrono.ChronoLocalDate minus(long, java.time.temporal.TemporalUnit);
+ method public default java.time.chrono.ChronoLocalDate plus(java.time.temporal.TemporalAmount);
method public default java.time.chrono.ChronoLocalDate plus(long, java.time.temporal.TemporalUnit);
method public static java.util.Comparator<java.time.chrono.ChronoLocalDate> timeLineOrder();
method public default long toEpochDay();
method public abstract java.lang.String toString();
method public abstract long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
method public abstract java.time.chrono.ChronoPeriod until(java.time.chrono.ChronoLocalDate);
+ method public default java.time.chrono.ChronoLocalDate with(java.time.temporal.TemporalAdjuster);
method public default java.time.chrono.ChronoLocalDate with(java.time.temporal.TemporalField, long);
}
abstract class ChronoLocalDateImpl<D extends java.time.chrono.ChronoLocalDate> implements java.time.chrono.ChronoLocalDate java.io.Serializable java.time.temporal.Temporal java.time.temporal.TemporalAdjuster {
+ method public D minus(java.time.temporal.TemporalAmount);
+ method public D minus(long, java.time.temporal.TemporalUnit);
+ method public D plus(java.time.temporal.TemporalAmount);
+ method public D plus(long, java.time.temporal.TemporalUnit);
method public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
+ method public D with(java.time.temporal.TemporalAdjuster);
+ method public D with(java.time.temporal.TemporalField, long);
}
public abstract interface ChronoLocalDateTime<D extends java.time.chrono.ChronoLocalDate> implements java.lang.Comparable java.time.temporal.Temporal java.time.temporal.TemporalAdjuster {
@@ -62701,6 +63192,9 @@
method public default boolean isEqual(java.time.chrono.ChronoLocalDateTime<?>);
method public abstract boolean isSupported(java.time.temporal.TemporalField);
method public default boolean isSupported(java.time.temporal.TemporalUnit);
+ method public default java.time.chrono.ChronoLocalDateTime<D> minus(java.time.temporal.TemporalAmount);
+ method public default java.time.chrono.ChronoLocalDateTime<D> minus(long, java.time.temporal.TemporalUnit);
+ method public default java.time.chrono.ChronoLocalDateTime<D> plus(java.time.temporal.TemporalAmount);
method public abstract java.time.chrono.ChronoLocalDateTime<D> plus(long, java.time.temporal.TemporalUnit);
method public static java.util.Comparator<java.time.chrono.ChronoLocalDateTime<?>> timeLineOrder();
method public default long toEpochSecond(java.time.ZoneOffset);
@@ -62708,6 +63202,7 @@
method public abstract D toLocalDate();
method public abstract java.time.LocalTime toLocalTime();
method public abstract java.lang.String toString();
+ method public default java.time.chrono.ChronoLocalDateTime<D> with(java.time.temporal.TemporalAdjuster);
method public abstract java.time.chrono.ChronoLocalDateTime<D> with(java.time.temporal.TemporalField, long);
}
@@ -62745,6 +63240,9 @@
method public default boolean isEqual(java.time.chrono.ChronoZonedDateTime<?>);
method public abstract boolean isSupported(java.time.temporal.TemporalField);
method public default boolean isSupported(java.time.temporal.TemporalUnit);
+ method public default java.time.chrono.ChronoZonedDateTime<D> minus(java.time.temporal.TemporalAmount);
+ method public default java.time.chrono.ChronoZonedDateTime<D> minus(long, java.time.temporal.TemporalUnit);
+ method public default java.time.chrono.ChronoZonedDateTime<D> plus(java.time.temporal.TemporalAmount);
method public abstract java.time.chrono.ChronoZonedDateTime<D> plus(long, java.time.temporal.TemporalUnit);
method public static java.util.Comparator<java.time.chrono.ChronoZonedDateTime<?>> timeLineOrder();
method public default long toEpochSecond();
@@ -62753,6 +63251,7 @@
method public abstract java.time.chrono.ChronoLocalDateTime<D> toLocalDateTime();
method public default java.time.LocalTime toLocalTime();
method public abstract java.lang.String toString();
+ method public default java.time.chrono.ChronoZonedDateTime<D> with(java.time.temporal.TemporalAdjuster);
method public abstract java.time.chrono.ChronoZonedDateTime<D> with(java.time.temporal.TemporalField, long);
method public abstract java.time.chrono.ChronoZonedDateTime<D> withEarlierOffsetAtOverlap();
method public abstract java.time.chrono.ChronoZonedDateTime<D> withLaterOffsetAtOverlap();
@@ -62819,6 +63318,7 @@
method public java.time.chrono.ChronoLocalDateTime<java.time.chrono.HijrahDate> localDateTime(java.time.temporal.TemporalAccessor);
method public int prolepticYear(java.time.chrono.Era, int);
method public java.time.temporal.ValueRange range(java.time.temporal.ChronoField);
+ method public java.time.chrono.HijrahDate resolveDate(java.util.Map<java.time.temporal.TemporalField, java.lang.Long>, java.time.format.ResolverStyle);
method public java.time.chrono.ChronoZonedDateTime<java.time.chrono.HijrahDate> zonedDateTime(java.time.temporal.TemporalAccessor);
method public java.time.chrono.ChronoZonedDateTime<java.time.chrono.HijrahDate> zonedDateTime(java.time.Instant, java.time.ZoneId);
field public static final java.time.chrono.HijrahChronology INSTANCE;
@@ -62830,23 +63330,24 @@
method public java.time.chrono.HijrahChronology getChronology();
method public java.time.chrono.HijrahEra getEra();
method public long getLong(java.time.temporal.TemporalField);
- method public boolean isLeapYear();
method public int lengthOfMonth();
- method public int lengthOfYear();
+ method public java.time.chrono.HijrahDate minus(java.time.temporal.TemporalAmount);
+ method public java.time.chrono.HijrahDate minus(long, java.time.temporal.TemporalUnit);
method public static java.time.chrono.HijrahDate now();
method public static java.time.chrono.HijrahDate now(java.time.ZoneId);
method public static java.time.chrono.HijrahDate now(java.time.Clock);
method public static java.time.chrono.HijrahDate of(int, int, int);
- method public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
- method public long toEpochDay();
+ method public java.time.chrono.HijrahDate plus(java.time.temporal.TemporalAmount);
+ method public java.time.chrono.HijrahDate plus(long, java.time.temporal.TemporalUnit);
method public java.time.chrono.ChronoPeriod until(java.time.chrono.ChronoLocalDate);
+ method public java.time.chrono.HijrahDate with(java.time.temporal.TemporalField, long);
+ method public java.time.chrono.HijrahDate with(java.time.temporal.TemporalAdjuster);
method public java.time.chrono.HijrahDate withVariant(java.time.chrono.HijrahChronology);
}
public final class HijrahEra extends java.lang.Enum implements java.time.chrono.Era {
method public int getValue();
method public static java.time.chrono.HijrahEra of(int);
- method public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
method public static java.time.chrono.HijrahEra valueOf(java.lang.String);
method public static final java.time.chrono.HijrahEra[] values();
enum_constant public static final java.time.chrono.HijrahEra AH;
@@ -62871,6 +63372,7 @@
method public java.time.Period period(int, int, int);
method public int prolepticYear(java.time.chrono.Era, int);
method public java.time.temporal.ValueRange range(java.time.temporal.ChronoField);
+ method public java.time.LocalDate resolveDate(java.util.Map<java.time.temporal.TemporalField, java.lang.Long>, java.time.format.ResolverStyle);
method public java.time.ZonedDateTime zonedDateTime(java.time.temporal.TemporalAccessor);
method public java.time.ZonedDateTime zonedDateTime(java.time.Instant, java.time.ZoneId);
field public static final java.time.chrono.IsoChronology INSTANCE;
@@ -62903,6 +63405,7 @@
method public java.time.chrono.ChronoLocalDateTime<java.time.chrono.JapaneseDate> localDateTime(java.time.temporal.TemporalAccessor);
method public int prolepticYear(java.time.chrono.Era, int);
method public java.time.temporal.ValueRange range(java.time.temporal.ChronoField);
+ method public java.time.chrono.JapaneseDate resolveDate(java.util.Map<java.time.temporal.TemporalField, java.lang.Long>, java.time.format.ResolverStyle);
method public java.time.chrono.ChronoZonedDateTime<java.time.chrono.JapaneseDate> zonedDateTime(java.time.temporal.TemporalAccessor);
method public java.time.chrono.ChronoZonedDateTime<java.time.chrono.JapaneseDate> zonedDateTime(java.time.Instant, java.time.ZoneId);
field public static final java.time.chrono.JapaneseChronology INSTANCE;
@@ -62914,17 +63417,19 @@
method public java.time.chrono.JapaneseChronology getChronology();
method public java.time.chrono.JapaneseEra getEra();
method public long getLong(java.time.temporal.TemporalField);
- method public boolean isSupported(java.time.temporal.TemporalField);
method public int lengthOfMonth();
- method public int lengthOfYear();
+ method public java.time.chrono.JapaneseDate minus(java.time.temporal.TemporalAmount);
+ method public java.time.chrono.JapaneseDate minus(long, java.time.temporal.TemporalUnit);
method public static java.time.chrono.JapaneseDate now();
method public static java.time.chrono.JapaneseDate now(java.time.ZoneId);
method public static java.time.chrono.JapaneseDate now(java.time.Clock);
method public static java.time.chrono.JapaneseDate of(java.time.chrono.JapaneseEra, int, int, int);
method public static java.time.chrono.JapaneseDate of(int, int, int);
- method public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
- method public long toEpochDay();
+ method public java.time.chrono.JapaneseDate plus(java.time.temporal.TemporalAmount);
+ method public java.time.chrono.JapaneseDate plus(long, java.time.temporal.TemporalUnit);
method public java.time.chrono.ChronoPeriod until(java.time.chrono.ChronoLocalDate);
+ method public java.time.chrono.JapaneseDate with(java.time.temporal.TemporalField, long);
+ method public java.time.chrono.JapaneseDate with(java.time.temporal.TemporalAdjuster);
}
public final class JapaneseEra implements java.time.chrono.Era java.io.Serializable {
@@ -62956,6 +63461,7 @@
method public java.time.chrono.ChronoLocalDateTime<java.time.chrono.MinguoDate> localDateTime(java.time.temporal.TemporalAccessor);
method public int prolepticYear(java.time.chrono.Era, int);
method public java.time.temporal.ValueRange range(java.time.temporal.ChronoField);
+ method public java.time.chrono.MinguoDate resolveDate(java.util.Map<java.time.temporal.TemporalField, java.lang.Long>, java.time.format.ResolverStyle);
method public java.time.chrono.ChronoZonedDateTime<java.time.chrono.MinguoDate> zonedDateTime(java.time.temporal.TemporalAccessor);
method public java.time.chrono.ChronoZonedDateTime<java.time.chrono.MinguoDate> zonedDateTime(java.time.Instant, java.time.ZoneId);
field public static final java.time.chrono.MinguoChronology INSTANCE;
@@ -62968,13 +63474,17 @@
method public java.time.chrono.MinguoEra getEra();
method public long getLong(java.time.temporal.TemporalField);
method public int lengthOfMonth();
+ method public java.time.chrono.MinguoDate minus(java.time.temporal.TemporalAmount);
+ method public java.time.chrono.MinguoDate minus(long, java.time.temporal.TemporalUnit);
method public static java.time.chrono.MinguoDate now();
method public static java.time.chrono.MinguoDate now(java.time.ZoneId);
method public static java.time.chrono.MinguoDate now(java.time.Clock);
method public static java.time.chrono.MinguoDate of(int, int, int);
- method public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
- method public long toEpochDay();
+ method public java.time.chrono.MinguoDate plus(java.time.temporal.TemporalAmount);
+ method public java.time.chrono.MinguoDate plus(long, java.time.temporal.TemporalUnit);
method public java.time.chrono.ChronoPeriod until(java.time.chrono.ChronoLocalDate);
+ method public java.time.chrono.MinguoDate with(java.time.temporal.TemporalField, long);
+ method public java.time.chrono.MinguoDate with(java.time.temporal.TemporalAdjuster);
}
public final class MinguoEra extends java.lang.Enum implements java.time.chrono.Era {
@@ -63004,6 +63514,7 @@
method public java.time.chrono.ChronoLocalDateTime<java.time.chrono.ThaiBuddhistDate> localDateTime(java.time.temporal.TemporalAccessor);
method public int prolepticYear(java.time.chrono.Era, int);
method public java.time.temporal.ValueRange range(java.time.temporal.ChronoField);
+ method public java.time.chrono.ThaiBuddhistDate resolveDate(java.util.Map<java.time.temporal.TemporalField, java.lang.Long>, java.time.format.ResolverStyle);
method public java.time.chrono.ChronoZonedDateTime<java.time.chrono.ThaiBuddhistDate> zonedDateTime(java.time.temporal.TemporalAccessor);
method public java.time.chrono.ChronoZonedDateTime<java.time.chrono.ThaiBuddhistDate> zonedDateTime(java.time.Instant, java.time.ZoneId);
field public static final java.time.chrono.ThaiBuddhistChronology INSTANCE;
@@ -63016,13 +63527,17 @@
method public java.time.chrono.ThaiBuddhistEra getEra();
method public long getLong(java.time.temporal.TemporalField);
method public int lengthOfMonth();
+ method public java.time.chrono.ThaiBuddhistDate minus(java.time.temporal.TemporalAmount);
+ method public java.time.chrono.ThaiBuddhistDate minus(long, java.time.temporal.TemporalUnit);
method public static java.time.chrono.ThaiBuddhistDate now();
method public static java.time.chrono.ThaiBuddhistDate now(java.time.ZoneId);
method public static java.time.chrono.ThaiBuddhistDate now(java.time.Clock);
method public static java.time.chrono.ThaiBuddhistDate of(int, int, int);
- method public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
- method public long toEpochDay();
+ method public java.time.chrono.ThaiBuddhistDate plus(java.time.temporal.TemporalAmount);
+ method public java.time.chrono.ThaiBuddhistDate plus(long, java.time.temporal.TemporalUnit);
method public java.time.chrono.ChronoPeriod until(java.time.chrono.ChronoLocalDate);
+ method public java.time.chrono.ThaiBuddhistDate with(java.time.temporal.TemporalField, long);
+ method public java.time.chrono.ThaiBuddhistDate with(java.time.temporal.TemporalAdjuster);
}
public final class ThaiBuddhistEra extends java.lang.Enum implements java.time.chrono.Era {
@@ -63201,7 +63716,6 @@
method public int checkValidIntValue(long);
method public long checkValidValue(long);
method public java.time.temporal.TemporalUnit getBaseUnit();
- method public java.lang.String getDisplayName(java.util.Locale);
method public long getFrom(java.time.temporal.TemporalAccessor);
method public java.time.temporal.TemporalUnit getRangeUnit();
method public boolean isDateBased();
@@ -63249,7 +63763,6 @@
method public java.time.Duration getDuration();
method public boolean isDateBased();
method public boolean isDurationEstimated();
- method public boolean isSupportedBy(java.time.temporal.Temporal);
method public boolean isTimeBased();
method public static java.time.temporal.ChronoUnit valueOf(java.lang.String);
method public static final java.time.temporal.ChronoUnit[] values();
@@ -63589,7 +64102,6 @@
method public E removeLast();
method public boolean removeLastOccurrence(java.lang.Object);
method public int size();
- method public java.util.Spliterator<E> spliterator();
}
public class ArrayList<E> extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable {
@@ -63600,11 +64112,7 @@
method public void ensureCapacity(int);
method public void forEach(java.util.function.Consumer<? super E>);
method public E get(int);
- method public boolean removeIf(java.util.function.Predicate<? super E>);
- method public void replaceAll(java.util.function.UnaryOperator<E>);
method public int size();
- method public void sort(java.util.Comparator<? super E>);
- method public java.util.Spliterator<E> spliterator();
method public void trimToSize();
}
@@ -63975,6 +64483,7 @@
method public default boolean removeIf(java.util.function.Predicate<? super E>);
method public abstract boolean retainAll(java.util.Collection<?>);
method public abstract int size();
+ method public default java.util.Spliterator<E> spliterator();
method public default java.util.stream.Stream<E> stream();
method public abstract java.lang.Object[] toArray();
method public abstract <T> T[] toArray(T[]);
@@ -64315,18 +64824,7 @@
ctor public HashMap();
ctor public HashMap(java.util.Map<? extends K, ? extends V>);
method public java.lang.Object clone();
- method public V compute(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>);
- method public V computeIfAbsent(K, java.util.function.Function<? super K, ? extends V>);
- method public V computeIfPresent(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>);
method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
- method public void forEach(java.util.function.BiConsumer<? super K, ? super V>);
- method public V getOrDefault(java.lang.Object, V);
- method public V merge(K, V, java.util.function.BiFunction<? super V, ? super V, ? extends V>);
- method public V putIfAbsent(K, V);
- method public boolean remove(java.lang.Object, java.lang.Object);
- method public boolean replace(K, V, V);
- method public V replace(K, V);
- method public void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>);
}
public class HashSet<E> extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable java.util.Set {
@@ -64337,7 +64835,6 @@
method public java.lang.Object clone();
method public java.util.Iterator<E> iterator();
method public int size();
- method public java.util.Spliterator<E> spliterator();
}
public class Hashtable<K, V> extends java.util.Dictionary implements java.lang.Cloneable java.util.Map java.io.Serializable {
@@ -64355,9 +64852,11 @@
method public boolean containsValue(java.lang.Object);
method public synchronized java.util.Enumeration<V> elements();
method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
+ method public synchronized boolean equals(java.lang.Object);
method public synchronized void forEach(java.util.function.BiConsumer<? super K, ? super V>);
method public synchronized V get(java.lang.Object);
method public synchronized V getOrDefault(java.lang.Object, V);
+ method public synchronized int hashCode();
method public synchronized boolean isEmpty();
method public java.util.Set<K> keySet();
method public synchronized java.util.Enumeration<K> keys();
@@ -64372,6 +64871,7 @@
method public synchronized V replace(K, V);
method public synchronized void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>);
method public synchronized int size();
+ method public synchronized java.lang.String toString();
method public java.util.Collection<V> values();
}
@@ -64381,8 +64881,6 @@
ctor public IdentityHashMap(java.util.Map<? extends K, ? extends V>);
method public java.lang.Object clone();
method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
- method public void forEach(java.util.function.BiConsumer<? super K, ? super V>);
- method public void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>);
}
public class IllegalFormatCodePointException extends java.util.IllegalFormatException {
@@ -64493,7 +64991,6 @@
method public E removeLast();
method public boolean removeLastOccurrence(java.lang.Object);
method public int size();
- method public java.util.Spliterator<E> spliterator();
}
public abstract interface List<E> implements java.util.Collection {
@@ -65116,6 +65613,7 @@
ctor public SimpleTimeZone(int, java.lang.String, int, int, int, int, int, int, int, int, int, int, int);
method public int getOffset(int, int, int, int, int, int);
method public int getRawOffset();
+ method public synchronized int hashCode();
method public boolean inDaylightTime(java.util.Date);
method public void setDSTSavings(int);
method public void setEndRule(int, int, int, int);
@@ -65388,7 +65886,6 @@
method public K firstKey();
method public java.util.Map.Entry<K, V> floorEntry(K);
method public K floorKey(K);
- method public void forEach(java.util.function.BiConsumer<? super K, ? super V>);
method public java.util.NavigableMap<K, V> headMap(K, boolean);
method public java.util.SortedMap<K, V> headMap(K);
method public java.util.Map.Entry<K, V> higherEntry(K);
@@ -65400,9 +65897,6 @@
method public java.util.NavigableSet<K> navigableKeySet();
method public java.util.Map.Entry<K, V> pollFirstEntry();
method public java.util.Map.Entry<K, V> pollLastEntry();
- method public boolean replace(K, V, V);
- method public V replace(K, V);
- method public void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>);
method public java.util.NavigableMap<K, V> subMap(K, boolean, K, boolean);
method public java.util.SortedMap<K, V> subMap(K, K);
method public java.util.NavigableMap<K, V> tailMap(K, boolean);
@@ -65430,7 +65924,6 @@
method public E pollFirst();
method public E pollLast();
method public int size();
- method public java.util.Spliterator<E> spliterator();
method public java.util.NavigableSet<E> subSet(E, boolean, E, boolean);
method public java.util.SortedSet<E> subSet(E, E);
method public java.util.NavigableSet<E> tailSet(E, boolean);
@@ -65467,30 +65960,49 @@
ctor public Vector(int);
ctor public Vector();
ctor public Vector(java.util.Collection<? extends E>);
+ method public synchronized boolean add(E);
+ method public synchronized boolean addAll(java.util.Collection<? extends E>);
+ method public synchronized boolean addAll(int, java.util.Collection<? extends E>);
method public synchronized void addElement(E);
method public synchronized int capacity();
method public synchronized java.lang.Object clone();
+ method public synchronized boolean containsAll(java.util.Collection<?>);
method public synchronized void copyInto(java.lang.Object[]);
method public synchronized E elementAt(int);
method public java.util.Enumeration<E> elements();
method public synchronized void ensureCapacity(int);
+ method public synchronized boolean equals(java.lang.Object);
method public synchronized E firstElement();
method public synchronized void forEach(java.util.function.Consumer<? super E>);
method public synchronized E get(int);
+ method public synchronized int hashCode();
method public synchronized int indexOf(java.lang.Object, int);
method public synchronized void insertElementAt(E, int);
+ method public synchronized boolean isEmpty();
+ method public synchronized java.util.Iterator<E> iterator();
method public synchronized E lastElement();
+ method public synchronized int lastIndexOf(java.lang.Object);
method public synchronized int lastIndexOf(java.lang.Object, int);
+ method public synchronized java.util.ListIterator<E> listIterator(int);
+ method public synchronized java.util.ListIterator<E> listIterator();
+ method public synchronized E remove(int);
+ method public synchronized boolean removeAll(java.util.Collection<?>);
method public synchronized void removeAllElements();
method public synchronized boolean removeElement(java.lang.Object);
method public synchronized void removeElementAt(int);
method public synchronized boolean removeIf(java.util.function.Predicate<? super E>);
+ method protected synchronized void removeRange(int, int);
method public synchronized void replaceAll(java.util.function.UnaryOperator<E>);
+ method public synchronized boolean retainAll(java.util.Collection<?>);
+ method public synchronized E set(int, E);
method public synchronized void setElementAt(E, int);
method public synchronized void setSize(int);
method public synchronized int size();
method public synchronized void sort(java.util.Comparator<? super E>);
- method public java.util.Spliterator<E> spliterator();
+ method public synchronized java.util.List<E> subList(int, int);
+ method public synchronized java.lang.Object[] toArray();
+ method public synchronized <T> T[] toArray(T[]);
+ method public synchronized java.lang.String toString();
method public synchronized void trimToSize();
field protected int capacityIncrement;
field protected int elementCount;
@@ -65503,8 +66015,6 @@
ctor public WeakHashMap();
ctor public WeakHashMap(java.util.Map<? extends K, ? extends V>);
method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
- method public void forEach(java.util.function.BiConsumer<? super K, ? super V>);
- method public void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>);
}
}
@@ -65539,7 +66049,6 @@
method public void put(E) throws java.lang.InterruptedException;
method public int remainingCapacity();
method public int size();
- method public java.util.Spliterator<E> spliterator();
method public E take() throws java.lang.InterruptedException;
}
@@ -65730,13 +66239,9 @@
ctor public ConcurrentHashMap(java.util.Map<? extends K, ? extends V>);
ctor public ConcurrentHashMap(int, float);
ctor public ConcurrentHashMap(int, float, int);
- method public V compute(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>);
- method public V computeIfAbsent(K, java.util.function.Function<? super K, ? extends V>);
- method public V computeIfPresent(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>);
method public boolean contains(java.lang.Object);
method public java.util.Enumeration<V> elements();
method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
- method public void forEach(java.util.function.BiConsumer<? super K, ? super V>);
method public void forEach(long, java.util.function.BiConsumer<? super K, ? super V>);
method public <U> void forEach(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.Consumer<? super U>);
method public void forEachEntry(long, java.util.function.Consumer<? super java.util.Map.Entry<K, V>>);
@@ -65745,14 +66250,11 @@
method public <U> void forEachKey(long, java.util.function.Function<? super K, ? extends U>, java.util.function.Consumer<? super U>);
method public void forEachValue(long, java.util.function.Consumer<? super V>);
method public <U> void forEachValue(long, java.util.function.Function<? super V, ? extends U>, java.util.function.Consumer<? super U>);
- method public V getOrDefault(java.lang.Object, V);
method public java.util.concurrent.ConcurrentHashMap.KeySetView<K, V> keySet(V);
method public java.util.Enumeration<K> keys();
method public long mappingCount();
- method public V merge(K, V, java.util.function.BiFunction<? super V, ? super V, ? extends V>);
method public static <K> java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet();
method public static <K> java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet(int);
- method public V putIfAbsent(K, V);
method public <U> U reduce(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>);
method public java.util.Map.Entry<K, V> reduceEntries(long, java.util.function.BiFunction<java.util.Map.Entry<K, V>, java.util.Map.Entry<K, V>, ? extends java.util.Map.Entry<K, V>>);
method public <U> U reduceEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>);
@@ -65772,10 +66274,6 @@
method public double reduceValuesToDouble(long, java.util.function.ToDoubleFunction<? super V>, double, java.util.function.DoubleBinaryOperator);
method public int reduceValuesToInt(long, java.util.function.ToIntFunction<? super V>, int, java.util.function.IntBinaryOperator);
method public long reduceValuesToLong(long, java.util.function.ToLongFunction<? super V>, long, java.util.function.LongBinaryOperator);
- method public boolean remove(java.lang.Object, java.lang.Object);
- method public boolean replace(K, V, V);
- method public V replace(K, V);
- method public void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>);
method public <U> U search(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>);
method public <U> U searchEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>);
method public <U> U searchKeys(long, java.util.function.Function<? super K, ? extends U>);
@@ -65836,7 +66334,6 @@
method public E removeLast();
method public boolean removeLastOccurrence(java.lang.Object);
method public int size();
- method public java.util.Spliterator<E> spliterator();
}
public class ConcurrentLinkedQueue<E> extends java.util.AbstractQueue implements java.util.Queue java.io.Serializable {
@@ -65847,7 +66344,6 @@
method public E peek();
method public E poll();
method public int size();
- method public java.util.Spliterator<E> spliterator();
}
public abstract interface ConcurrentMap<K, V> implements java.util.Map {
@@ -65879,9 +66375,6 @@
method public K ceilingKey(K);
method public java.util.concurrent.ConcurrentSkipListMap<K, V> clone();
method public java.util.Comparator<? super K> comparator();
- method public V compute(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>);
- method public V computeIfAbsent(K, java.util.function.Function<? super K, ? extends V>);
- method public V computeIfPresent(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>);
method public java.util.NavigableSet<K> descendingKeySet();
method public java.util.concurrent.ConcurrentNavigableMap<K, V> descendingMap();
method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
@@ -65889,25 +66382,18 @@
method public K firstKey();
method public java.util.Map.Entry<K, V> floorEntry(K);
method public K floorKey(K);
- method public void forEach(java.util.function.BiConsumer<? super K, ? super V>);
- method public V getOrDefault(java.lang.Object, V);
method public java.util.concurrent.ConcurrentNavigableMap<K, V> headMap(K, boolean);
method public java.util.concurrent.ConcurrentNavigableMap<K, V> headMap(K);
method public java.util.Map.Entry<K, V> higherEntry(K);
method public K higherKey(K);
+ method public java.util.NavigableSet<K> keySet();
method public java.util.Map.Entry<K, V> lastEntry();
method public K lastKey();
method public java.util.Map.Entry<K, V> lowerEntry(K);
method public K lowerKey(K);
- method public V merge(K, V, java.util.function.BiFunction<? super V, ? super V, ? extends V>);
method public java.util.NavigableSet<K> navigableKeySet();
method public java.util.Map.Entry<K, V> pollFirstEntry();
method public java.util.Map.Entry<K, V> pollLastEntry();
- method public V putIfAbsent(K, V);
- method public boolean remove(java.lang.Object, java.lang.Object);
- method public boolean replace(K, V, V);
- method public V replace(K, V);
- method public void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>);
method public java.util.concurrent.ConcurrentNavigableMap<K, V> subMap(K, boolean, K, boolean);
method public java.util.concurrent.ConcurrentNavigableMap<K, V> subMap(K, K);
method public java.util.concurrent.ConcurrentNavigableMap<K, V> tailMap(K, boolean);
@@ -65935,7 +66421,6 @@
method public E pollFirst();
method public E pollLast();
method public int size();
- method public java.util.Spliterator<E> spliterator();
method public java.util.NavigableSet<E> subSet(E, boolean, E, boolean);
method public java.util.NavigableSet<E> subSet(E, E);
method public java.util.NavigableSet<E> tailSet(E, boolean);
@@ -65982,9 +66467,7 @@
ctor public CopyOnWriteArraySet(java.util.Collection<? extends E>);
method public void forEach(java.util.function.Consumer<? super E>);
method public java.util.Iterator<E> iterator();
- method public boolean removeIf(java.util.function.Predicate<? super E>);
method public int size();
- method public java.util.Spliterator<E> spliterator();
}
public class CountDownLatch {
@@ -66143,6 +66626,7 @@
method public java.lang.Thread.UncaughtExceptionHandler getUncaughtExceptionHandler();
method public boolean hasQueuedSubmissions();
method public <T> T invoke(java.util.concurrent.ForkJoinTask<T>);
+ method public <T> java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>);
method public boolean isQuiescent();
method public boolean isShutdown();
method public boolean isTerminated();
@@ -66152,6 +66636,9 @@
method public void shutdown();
method public java.util.List<java.lang.Runnable> shutdownNow();
method public <T> java.util.concurrent.ForkJoinTask<T> submit(java.util.concurrent.ForkJoinTask<T>);
+ method public <T> java.util.concurrent.ForkJoinTask<T> submit(java.util.concurrent.Callable<T>);
+ method public <T> java.util.concurrent.ForkJoinTask<T> submit(java.lang.Runnable, T);
+ method public java.util.concurrent.ForkJoinTask<?> submit(java.lang.Runnable);
field public static final java.util.concurrent.ForkJoinPool.ForkJoinWorkerThreadFactory defaultForkJoinWorkerThreadFactory;
}
@@ -66275,7 +66762,6 @@
method public E removeLast();
method public boolean removeLastOccurrence(java.lang.Object);
method public int size();
- method public java.util.Spliterator<E> spliterator();
method public E take() throws java.lang.InterruptedException;
method public E takeFirst() throws java.lang.InterruptedException;
method public E takeLast() throws java.lang.InterruptedException;
@@ -66296,7 +66782,6 @@
method public void put(E) throws java.lang.InterruptedException;
method public int remainingCapacity();
method public int size();
- method public java.util.Spliterator<E> spliterator();
method public E take() throws java.lang.InterruptedException;
}
@@ -66316,7 +66801,6 @@
method public void put(E);
method public int remainingCapacity();
method public int size();
- method public java.util.Spliterator<E> spliterator();
method public E take() throws java.lang.InterruptedException;
method public void transfer(E) throws java.lang.InterruptedException;
method public boolean tryTransfer(E);
@@ -66364,7 +66848,6 @@
method public void put(E);
method public int remainingCapacity();
method public int size();
- method public java.util.Spliterator<E> spliterator();
method public E take() throws java.lang.InterruptedException;
}
@@ -66468,7 +66951,6 @@
method public void put(E) throws java.lang.InterruptedException;
method public int remainingCapacity();
method public int size();
- method public java.util.Spliterator<E> spliterator();
method public E take() throws java.lang.InterruptedException;
}
@@ -66480,9 +66962,11 @@
method public static java.util.concurrent.ThreadLocalRandom current();
method public double nextDouble(double);
method public double nextDouble(double, double);
+ method public double nextGaussian();
method public int nextInt(int, int);
method public long nextLong(long);
method public long nextLong(long, long);
+ method public void setSeed(long);
}
public class ThreadPoolExecutor extends java.util.concurrent.AbstractExecutorService {
@@ -66496,6 +66980,7 @@
method public boolean awaitTermination(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
method protected void beforeExecute(java.lang.Thread, java.lang.Runnable);
method public void execute(java.lang.Runnable);
+ method protected void finalize();
method public int getActiveCount();
method public long getCompletedTaskCount();
method public int getCorePoolSize();
@@ -67366,8 +67851,11 @@
ctor public JarFile(java.io.File) throws java.io.IOException;
ctor public JarFile(java.io.File, boolean) throws java.io.IOException;
ctor public JarFile(java.io.File, boolean, int) throws java.io.IOException;
+ method public java.util.Enumeration<java.util.jar.JarEntry> entries();
+ method public synchronized java.io.InputStream getInputStream(java.util.zip.ZipEntry) throws java.io.IOException;
method public java.util.jar.JarEntry getJarEntry(java.lang.String);
method public java.util.jar.Manifest getManifest() throws java.io.IOException;
+ method public java.util.stream.Stream<java.util.jar.JarEntry> stream();
field public static final java.lang.String MANIFEST_NAME = "META-INF/MANIFEST.MF";
}
@@ -67447,6 +67935,8 @@
public class ConsoleHandler extends java.util.logging.StreamHandler {
ctor public ConsoleHandler();
+ method public void close();
+ method public void publish(java.util.logging.LogRecord);
}
public class ErrorManager {
@@ -68236,6 +68726,7 @@
method public int deflate(byte[]);
method public int deflate(byte[], int, int, int);
method public void end();
+ method protected void finalize();
method public void finish();
method public boolean finished();
method public int getAdler();
@@ -68268,6 +68759,8 @@
ctor public DeflaterInputStream(java.io.InputStream);
ctor public DeflaterInputStream(java.io.InputStream, java.util.zip.Deflater);
ctor public DeflaterInputStream(java.io.InputStream, java.util.zip.Deflater, int);
+ method public void mark(int);
+ method public void reset() throws java.io.IOException;
field protected final byte[] buf;
field protected final java.util.zip.Deflater def;
}
@@ -68298,6 +68791,7 @@
ctor public GZIPOutputStream(java.io.OutputStream, int, boolean) throws java.io.IOException;
ctor public GZIPOutputStream(java.io.OutputStream) throws java.io.IOException;
ctor public GZIPOutputStream(java.io.OutputStream, boolean) throws java.io.IOException;
+ method public synchronized void write(byte[], int, int) throws java.io.IOException;
field protected java.util.zip.CRC32 crc;
}
@@ -68305,6 +68799,7 @@
ctor public Inflater(boolean);
ctor public Inflater();
method public void end();
+ method protected void finalize();
method public boolean finished();
method public int getAdler();
method public long getBytesRead();
@@ -68431,6 +68926,7 @@
ctor public ZipFile(java.io.File, java.nio.charset.Charset) throws java.io.IOException;
method public void close() throws java.io.IOException;
method public java.util.Enumeration<? extends java.util.zip.ZipEntry> entries();
+ method protected void finalize() throws java.io.IOException;
method public java.lang.String getComment();
method public java.util.zip.ZipEntry getEntry(java.lang.String);
method public java.io.InputStream getInputStream(java.util.zip.ZipEntry) throws java.io.IOException;
@@ -68537,6 +69033,7 @@
method public void setComment(java.lang.String);
method public void setLevel(int);
method public void setMethod(int);
+ method public synchronized void write(byte[], int, int) throws java.io.IOException;
field public static final int CENATT = 36; // 0x24
field public static final int CENATX = 38; // 0x26
field public static final int CENCOM = 32; // 0x20
@@ -68693,6 +69190,7 @@
public class ExemptionMechanism {
ctor protected ExemptionMechanism(javax.crypto.ExemptionMechanismSpi, java.security.Provider, java.lang.String);
+ method protected void finalize();
method public final byte[] genExemptionBlob() throws javax.crypto.ExemptionMechanismException, java.lang.IllegalStateException;
method public final int genExemptionBlob(byte[]) throws javax.crypto.ExemptionMechanismException, java.lang.IllegalStateException, javax.crypto.ShortBufferException;
method public final int genExemptionBlob(byte[], int) throws javax.crypto.ExemptionMechanismException, java.lang.IllegalStateException, javax.crypto.ShortBufferException;
@@ -71081,6 +71579,7 @@
ctor public TransformerException(java.lang.String, java.lang.Throwable);
ctor public TransformerException(java.lang.String, javax.xml.transform.SourceLocator);
ctor public TransformerException(java.lang.String, javax.xml.transform.SourceLocator, java.lang.Throwable);
+ method public java.lang.Throwable getCause();
method public java.lang.Throwable getException();
method public java.lang.String getLocationAsString();
method public javax.xml.transform.SourceLocator getLocator();
@@ -71351,6 +71850,7 @@
public class XPathException extends java.lang.Exception {
ctor public XPathException(java.lang.String);
ctor public XPathException(java.lang.Throwable);
+ method public java.lang.Throwable getCause();
}
public abstract interface XPathExpression {
@@ -71779,6 +72279,8 @@
public class JSONException extends java.lang.Exception {
ctor public JSONException(java.lang.String);
+ ctor public JSONException(java.lang.String, java.lang.Throwable);
+ ctor public JSONException(java.lang.Throwable);
}
public class JSONObject {
diff --git a/api/test-removed.txt b/api/test-removed.txt
index 49b72e15..ca34142 100644
--- a/api/test-removed.txt
+++ b/api/test-removed.txt
@@ -15,6 +15,7 @@
public class Notification implements android.os.Parcelable {
method public deprecated java.lang.String getChannel();
+ method public static java.lang.Class<? extends android.app.Notification.Style> getNotificationStyleClass(java.lang.String);
method public deprecated long getTimeout();
method public deprecated void setLatestEventInfo(android.content.Context, java.lang.CharSequence, java.lang.CharSequence, android.app.PendingIntent);
}
@@ -266,6 +267,14 @@
}
+package android.net.wifi {
+
+ public class WifiManager {
+ method public deprecated boolean setWifiApEnabled(android.net.wifi.WifiConfiguration, boolean);
+ }
+
+}
+
package android.os {
public class BatteryManager {
@@ -301,18 +310,8 @@
package android.os.storage {
public class StorageManager {
- method public deprecated void allocateBytes(java.io.File, long, int) throws java.io.IOException;
- method public deprecated long getAllocatableBytes(java.io.File, int) throws java.io.IOException;
- method public deprecated long getCacheQuotaBytes(java.io.File) throws java.io.IOException;
- method public deprecated long getCacheQuotaBytes() throws java.io.IOException;
- method public deprecated long getCacheSizeBytes(java.io.File) throws java.io.IOException;
- method public deprecated long getCacheSizeBytes() throws java.io.IOException;
- method public deprecated long getExternalCacheQuotaBytes() throws java.io.IOException;
- method public deprecated long getExternalCacheSizeBytes() throws java.io.IOException;
method public android.os.storage.StorageVolume getPrimaryVolume();
method public android.os.storage.StorageVolume[] getVolumeList();
- method public deprecated boolean isCacheBehaviorAtomic(java.io.File) throws java.io.IOException;
- method public deprecated void setCacheBehaviorAtomic(java.io.File, boolean) throws java.io.IOException;
}
}
@@ -451,6 +450,26 @@
}
+package android.service.notification {
+
+ public abstract class NotificationListenerService extends android.app.Service {
+ method public android.service.notification.StatusBarNotification[] getActiveNotifications(int);
+ method public android.service.notification.StatusBarNotification[] getActiveNotifications(java.lang.String[], int);
+ method public void registerAsSystemService(android.content.Context, android.content.ComponentName, int) throws android.os.RemoteException;
+ method public final void setOnNotificationPostedTrim(int);
+ method public final void snoozeNotification(java.lang.String, java.lang.String);
+ method public void unregisterAsSystemService() throws android.os.RemoteException;
+ field public static final int TRIM_FULL = 0; // 0x0
+ field public static final int TRIM_LIGHT = 1; // 0x1
+ }
+
+ public static class NotificationListenerService.Ranking {
+ method public java.util.List<java.lang.String> getAdditionalPeople();
+ method public java.util.List<android.service.notification.SnoozeCriterion> getSnoozeCriteria();
+ }
+
+}
+
package android.speech.tts {
public abstract class UtteranceProgressListener {
diff --git a/cmds/am/src/com/android/commands/am/Am.java b/cmds/am/src/com/android/commands/am/Am.java
index f003061..ab075ee 100644
--- a/cmds/am/src/com/android/commands/am/Am.java
+++ b/cmds/am/src/com/android/commands/am/Am.java
@@ -16,70 +16,25 @@
package com.android.commands.am;
-import static android.app.ActivityManager.RESIZE_MODE_SYSTEM;
-import static android.app.ActivityManager.RESIZE_MODE_USER;
-import static android.app.ActivityManager.StackId.DOCKED_STACK_ID;
-import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
-
import android.app.ActivityManager;
-import android.app.ActivityManager.StackInfo;
-import android.app.IActivityContainer;
-import android.app.IActivityController;
import android.app.IActivityManager;
-import android.app.IInstrumentationWatcher;
-import android.app.Instrumentation;
-import android.app.IStopUserCallback;
-import android.app.ProfilerInfo;
-import android.app.UiAutomationConnection;
-import android.app.usage.ConfigurationStats;
-import android.app.usage.IUsageStatsManager;
-import android.app.usage.UsageStatsManager;
-import android.content.ComponentCallbacks2;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.IIntentReceiver;
-import android.content.Intent;
import android.content.pm.IPackageManager;
-import android.content.pm.InstrumentationInfo;
-import android.content.pm.ParceledListSlice;
-import android.content.pm.UserInfo;
-import android.content.res.Configuration;
-import android.graphics.Rect;
-import android.os.Binder;
-import android.os.Build;
-import android.os.Bundle;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.os.ResultReceiver;
import android.os.SELinux;
import android.os.ServiceManager;
import android.os.ShellCallback;
-import android.os.ShellCommand;
-import android.os.SystemProperties;
import android.os.UserHandle;
-import android.text.TextUtils;
import android.util.AndroidException;
-import android.util.ArrayMap;
-import android.util.Log;
-import android.view.IWindowManager;
import com.android.internal.os.BaseCommand;
-import com.android.internal.util.HexDump;
-import com.android.internal.util.Preconditions;
-import java.io.BufferedReader;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileNotFoundException;
import java.io.IOException;
-import java.io.InputStreamReader;
import java.io.PrintStream;
-import java.io.PrintWriter;
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
public class Am extends BaseCommand {
diff --git a/cmds/am/src/com/android/commands/am/Instrument.java b/cmds/am/src/com/android/commands/am/Instrument.java
index 4966b43..c6d83f5 100644
--- a/cmds/am/src/com/android/commands/am/Instrument.java
+++ b/cmds/am/src/com/android/commands/am/Instrument.java
@@ -25,7 +25,6 @@
import android.content.pm.InstrumentationInfo;
import android.os.Build;
import android.os.Bundle;
-import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserHandle;
import android.util.AndroidException;
@@ -34,6 +33,8 @@
import java.io.IOException;
import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
import java.util.List;
@@ -95,6 +96,12 @@
public void onError(String errorText, boolean commandError);
}
+ private static Collection<String> sorted(Collection<String> list) {
+ final ArrayList<String> copy = new ArrayList<>(list);
+ Collections.sort(copy);
+ return copy;
+ }
+
/**
* Printer for the 'classic' text based status reporting.
*/
@@ -124,7 +131,7 @@
System.out.print(pretty);
} else {
if (results != null) {
- for (String key : results.keySet()) {
+ for (String key : sorted(results.keySet())) {
System.out.println(
"INSTRUMENTATION_STATUS: " + key + "=" + results.get(key));
}
@@ -214,7 +221,7 @@
private void writeBundle(ProtoOutputStream proto, long fieldId, Bundle bundle) {
final long bundleToken = proto.startObject(fieldId);
- for (final String key: bundle.keySet()) {
+ for (final String key: sorted(bundle.keySet())) {
final long entryToken = proto.startRepeatedObject(
InstrumentationData.ResultsBundle.ENTRIES);
diff --git a/cmds/app_process/app_main.cpp b/cmds/app_process/app_main.cpp
index e56417b..1671337 100644
--- a/cmds/app_process/app_main.cpp
+++ b/cmds/app_process/app_main.cpp
@@ -235,6 +235,9 @@
for (i = 0; i < argc; i++) {
if (known_command == true) {
runtime.addOption(strdup(argv[i]));
+ // The static analyzer gets upset that we don't ever free the above
+ // string. Since the allocation is from main, leaking it doesn't seem
+ // problematic. NOLINTNEXTLINE
ALOGV("app_process main add known option '%s'", argv[i]);
known_command = false;
continue;
@@ -258,6 +261,9 @@
}
runtime.addOption(strdup(argv[i]));
+ // The static analyzer gets upset that we don't ever free the above
+ // string. Since the allocation is from main, leaking it doesn't seem
+ // problematic. NOLINTNEXTLINE
ALOGV("app_process main add option '%s'", argv[i]);
}
diff --git a/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java b/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java
index 1bcfb22..b61cdec 100644
--- a/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java
+++ b/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java
@@ -17,8 +17,8 @@
package com.android.commands.bmgr;
import android.app.backup.BackupManager;
-import android.app.backup.BackupManagerMonitor;
import android.app.backup.BackupProgress;
+import android.app.backup.BackupTransport;
import android.app.backup.IBackupManager;
import android.app.backup.IBackupObserver;
import android.app.backup.IRestoreObserver;
@@ -30,8 +30,11 @@
import android.content.pm.PackageInfo;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.os.SystemClock;
import android.os.UserHandle;
-import android.util.Log;
+import android.util.ArraySet;
+
+import com.android.internal.annotations.GuardedBy;
import java.util.ArrayList;
import java.util.HashSet;
@@ -97,6 +100,11 @@
return;
}
+ if ("init".equals(op)) {
+ doInit();
+ return;
+ }
+
if ("list".equals(op)) {
doList();
return;
@@ -204,7 +212,7 @@
System.out.println("Performing full transport backup");
String pkg;
- ArrayList<String> allPkgs = new ArrayList<String>();
+ ArraySet<String> allPkgs = new ArraySet<String>();
while ((pkg = nextArg()) != null) {
allPkgs.add(pkg);
}
@@ -218,11 +226,59 @@
}
}
- class BackupObserver extends IBackupObserver.Stub {
- boolean done = false;
+ // IBackupObserver generically usable for any backup/init operation
+ abstract class Observer extends IBackupObserver.Stub {
+ private final Object trigger = new Object();
+
+ @GuardedBy("trigger")
+ private volatile boolean done = false;
@Override
public void onUpdate(String currentPackage, BackupProgress backupProgress) {
+ }
+
+ @Override
+ public void onResult(String currentPackage, int status) {
+ }
+
+ @Override
+ public void backupFinished(int status) {
+ synchronized (trigger) {
+ done = true;
+ trigger.notify();
+ }
+ }
+
+ public boolean done() {
+ return this.done;
+ }
+
+ // Wait forever
+ public void waitForCompletion() {
+ waitForCompletion(0);
+ }
+
+ // Wait for a given time and then give up
+ public void waitForCompletion(long timeout) {
+ // The backupFinished() callback will throw the 'done' flag; we
+ // just sit and wait on that notification.
+ final long targetTime = SystemClock.elapsedRealtime() + timeout;
+ synchronized (trigger) {
+ // Wait until either we're done, or we've reached a stated positive timeout
+ while (!done && (timeout <= 0 || SystemClock.elapsedRealtime() < targetTime)) {
+ try {
+ trigger.wait(1000L);
+ } catch (InterruptedException ex) {
+ }
+ }
+ }
+ }
+ }
+
+ class BackupObserver extends Observer {
+ @Override
+ public void onUpdate(String currentPackage, BackupProgress backupProgress) {
+ super.onUpdate(currentPackage, backupProgress);
System.out.println(
"Package " + currentPackage + " with progress: " + backupProgress.bytesTransferred
+ "/" + backupProgress.bytesExpected);
@@ -230,33 +286,17 @@
@Override
public void onResult(String currentPackage, int status) {
+ super.onResult(currentPackage, status);
System.out.println("Package " + currentPackage + " with result: "
+ convertBackupStatusToString(status));
}
@Override
public void backupFinished(int status) {
+ super.backupFinished(status);
System.out.println("Backup finished with result: "
+ convertBackupStatusToString(status));
- synchronized (this) {
- done = true;
- this.notify();
- }
}
-
- public void waitForCompletion() {
- // The backupFinished() callback will throw the 'done' flag; we
- // just sit and wait on that notification.
- synchronized (this) {
- while (!this.done) {
- try {
- this.wait();
- } catch (InterruptedException ex) {
- }
- }
- }
- }
-
}
private static String convertBackupStatusToString(int errorCode) {
@@ -270,7 +310,8 @@
case BackupManager.ERROR_TRANSPORT_ABORTED:
return "Transport error";
case BackupManager.ERROR_TRANSPORT_PACKAGE_REJECTED:
- return "Transport rejected package";
+ return "Transport rejected package because it wasn't able to process it"
+ + " at the time";
case BackupManager.ERROR_AGENT_FAILURE:
return "Agent error";
case BackupManager.ERROR_TRANSPORT_QUOTA_EXCEEDED:
@@ -348,7 +389,9 @@
} else if (pkg.equals("--incremental")) {
nonIncrementalBackup = false;
} else {
- allPkgs.add(pkg);
+ if (!allPkgs.contains(pkg)) {
+ allPkgs.add(pkg);
+ }
}
}
if (backupAll) {
@@ -469,6 +512,39 @@
}
}
+ class InitObserver extends Observer {
+ public int result = BackupTransport.TRANSPORT_ERROR;
+
+ @Override
+ public void backupFinished(int status) {
+ super.backupFinished(status);
+ result = status;
+ }
+ }
+
+ private void doInit() {
+ ArraySet<String> transports = new ArraySet<>();
+ String transport;
+ while ((transport = nextArg()) != null) {
+ transports.add(transport);
+ }
+ if (transports.size() == 0) {
+ showUsage();
+ return;
+ }
+
+ InitObserver observer = new InitObserver();
+ try {
+ System.out.println("Initializing transports: " + transports);
+ mBmgr.initializeTransports(transports.toArray(new String[transports.size()]), observer);
+ observer.waitForCompletion(30*1000L);
+ System.out.println("Initialization result: " + observer.result);
+ } catch (RemoteException e) {
+ System.err.println(e.toString());
+ System.err.println(BMGR_NOT_RUNNING_ERR);
+ }
+ }
+
private void doList() {
String arg = nextArg(); // sets, transports, packages set#
if ("transports".equals(arg)) {
diff --git a/cmds/bootanimation/Android.mk b/cmds/bootanimation/Android.mk
index 7ab402a..73ec63f 100644
--- a/cmds/bootanimation/Android.mk
+++ b/cmds/bootanimation/Android.mk
@@ -8,10 +8,6 @@
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
-LOCAL_SRC_FILES:= \
- bootanimation_main.cpp \
- audioplay.cpp \
-
LOCAL_CFLAGS += ${bootanimation_CommonCFlags}
LOCAL_SHARED_LIBRARIES := \
@@ -24,6 +20,29 @@
liblog \
libutils \
+LOCAL_SRC_FILES:= \
+ BootAnimationUtil.cpp \
+
+ifeq ($(PRODUCT_IOT),true)
+LOCAL_SRC_FILES += \
+ iot/iotbootanimation_main.cpp \
+ iot/BootAction.cpp
+
+LOCAL_SHARED_LIBRARIES += \
+ libandroidthings \
+ libbase \
+ libbinder
+
+LOCAL_STATIC_LIBRARIES += cpufeatures
+
+else
+
+LOCAL_SRC_FILES += \
+ bootanimation_main.cpp \
+ audioplay.cpp \
+
+endif # PRODUCT_IOT
+
LOCAL_MODULE:= bootanimation
LOCAL_INIT_RC := bootanim.rc
@@ -45,6 +64,8 @@
LOCAL_SRC_FILES:= \
BootAnimation.cpp
+LOCAL_CFLAGS += ${bootanimation_CommonCFlags}
+
LOCAL_C_INCLUDES += \
external/tinyalsa/include \
frameworks/wilhelm/include
diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp
index 6b2de4b..6526123 100644
--- a/cmds/bootanimation/BootAnimation.cpp
+++ b/cmds/bootanimation/BootAnimation.cpp
@@ -96,11 +96,9 @@
// ---------------------------------------------------------------------------
-BootAnimation::BootAnimation(InitCallback initCallback,
- PlayPartCallback partCallback)
+BootAnimation::BootAnimation(sp<Callbacks> callbacks)
: Thread(false), mClockEnabled(true), mTimeIsAccurate(false),
- mTimeFormat12Hour(false), mTimeCheckThread(NULL),
- mInitCallback(initCallback), mPlayPartCallback(partCallback) {
+ mTimeFormat12Hour(false), mTimeCheckThread(NULL), mCallbacks(callbacks) {
mSession = new SurfaceComposerClient();
std::string powerCtl = android::base::GetProperty("sys.powerctl", "");
@@ -357,6 +355,8 @@
initTexture(&mAndroid[0], mAssets, "images/android-logo-mask.png");
initTexture(&mAndroid[1], mAssets, "images/android-logo-shine.png");
+ mCallbacks->init({});
+
// clear screen
glShadeModel(GL_FLAT);
glDisable(GL_DITHER);
@@ -424,6 +424,7 @@
int exitnow = atoi(value);
if (exitnow) {
requestExit();
+ mCallbacks->shutdown();
}
}
@@ -777,9 +778,7 @@
}
}
- if (mInitCallback != nullptr) {
- mInitCallback(animation.parts);
- }
+ mCallbacks->init(animation.parts);
zip->endIteration(cookie);
@@ -887,9 +886,7 @@
if(exitPending() && !part.playUntilComplete)
break;
- if (mPlayPartCallback != nullptr) {
- mPlayPartCallback(i, part, r);
- }
+ mCallbacks->playPart(i, part, r);
glClearColor(
part.backgroundColor[0],
diff --git a/cmds/bootanimation/BootAnimation.h b/cmds/bootanimation/BootAnimation.h
index 3ebe7d6..56e131523 100644
--- a/cmds/bootanimation/BootAnimation.h
+++ b/cmds/bootanimation/BootAnimation.h
@@ -93,22 +93,27 @@
Font clockFont;
};
- // Callback will be called during initialization after we have loaded
- // the animation and be provided with all parts in animation.
- typedef std::function<void(const Vector<Animation::Part>& parts)> InitCallback;
+ // All callbacks will be called from this class's internal thread.
+ class Callbacks : public RefBase {
+ public:
+ // Will be called during initialization after we have loaded
+ // the animation and be provided with all parts in animation.
+ virtual void init(const Vector<Animation::Part>& /*parts*/) {}
- // Callback will be called while animation is playing before each part is
- // played. It will be provided with the part and play count for it.
- // It will be provided with the partNumber for the part about to be played,
- // as well as a reference to the part itself. It will also be provided with
- // which play of that part is about to start, some parts are repeated
- // multiple times.
- typedef std::function<void(int partNumber, const Animation::Part& part, int playNumber)>
- PlayPartCallback;
+ // Will be called while animation is playing before each part is
+ // played. It will be provided with the part and play count for it.
+ // It will be provided with the partNumber for the part about to be played,
+ // as well as a reference to the part itself. It will also be provided with
+ // which play of that part is about to start, some parts are repeated
+ // multiple times.
+ virtual void playPart(int /*partNumber*/, const Animation::Part& /*part*/,
+ int /*playNumber*/) {}
- // Callbacks may be null and will be called from this class's internal
- // thread.
- BootAnimation(InitCallback initCallback, PlayPartCallback partCallback);
+ // Will be called when animation is done and thread is shutting down.
+ virtual void shutdown() {}
+ };
+
+ BootAnimation(sp<Callbacks> callbacks);
sp<SurfaceComposerClient> session() const;
@@ -170,8 +175,7 @@
String8 mZipFileName;
SortedVector<String8> mLoadedFiles;
sp<TimeCheckThread> mTimeCheckThread = nullptr;
- InitCallback mInitCallback = nullptr;
- PlayPartCallback mPlayPartCallback = nullptr;
+ sp<Callbacks> mCallbacks;
};
// ---------------------------------------------------------------------------
diff --git a/cmds/bootanimation/BootAnimationUtil.cpp b/cmds/bootanimation/BootAnimationUtil.cpp
new file mode 100644
index 0000000..7718daf
--- /dev/null
+++ b/cmds/bootanimation/BootAnimationUtil.cpp
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#include "BootAnimationUtil.h"
+
+#include <inttypes.h>
+
+#include <binder/IServiceManager.h>
+#include <cutils/properties.h>
+#include <utils/Log.h>
+#include <utils/SystemClock.h>
+
+namespace android {
+
+bool bootAnimationDisabled() {
+ char value[PROPERTY_VALUE_MAX];
+ property_get("debug.sf.nobootanimation", value, "0");
+ if (atoi(value) > 0) {
+ return true;
+ }
+
+ property_get("ro.boot.quiescent", value, "0");
+ return atoi(value) > 0;
+}
+
+void waitForSurfaceFlinger() {
+ // TODO: replace this with better waiting logic in future, b/35253872
+ int64_t waitStartTime = elapsedRealtime();
+ sp<IServiceManager> sm = defaultServiceManager();
+ const String16 name("SurfaceFlinger");
+ const int SERVICE_WAIT_SLEEP_MS = 100;
+ const int LOG_PER_RETRIES = 10;
+ int retry = 0;
+ while (sm->checkService(name) == nullptr) {
+ retry++;
+ if ((retry % LOG_PER_RETRIES) == 0) {
+ ALOGW("Waiting for SurfaceFlinger, waited for %" PRId64 " ms",
+ elapsedRealtime() - waitStartTime);
+ }
+ usleep(SERVICE_WAIT_SLEEP_MS * 1000);
+ };
+ int64_t totalWaited = elapsedRealtime() - waitStartTime;
+ if (totalWaited > SERVICE_WAIT_SLEEP_MS) {
+ ALOGI("Waiting for SurfaceFlinger took %" PRId64 " ms", totalWaited);
+ }
+}
+
+} // namespace android
diff --git a/cmds/bootanimation/BootAnimationUtil.h b/cmds/bootanimation/BootAnimationUtil.h
new file mode 100644
index 0000000..60987cd1
--- /dev/null
+++ b/cmds/bootanimation/BootAnimationUtil.h
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+namespace android {
+
+// Returns true if boot animation is disabled.
+bool bootAnimationDisabled();
+
+// Waits until the surface flinger is up.
+void waitForSurfaceFlinger();
+
+} // namespace android
diff --git a/cmds/bootanimation/bootanimation_main.cpp b/cmds/bootanimation/bootanimation_main.cpp
index c11d905..8501982 100644
--- a/cmds/bootanimation/bootanimation_main.cpp
+++ b/cmds/bootanimation/bootanimation_main.cpp
@@ -30,6 +30,7 @@
#include <android-base/properties.h>
#include "BootAnimation.h"
+#include "BootAnimationUtil.h"
#include "audioplay.h"
using namespace android;
@@ -95,6 +96,49 @@
return true;
}
+class AudioAnimationCallbacks : public android::BootAnimation::Callbacks {
+public:
+ void init(const Vector<Animation::Part>& parts) override {
+ const Animation::Part* partWithAudio = nullptr;
+ for (const Animation::Part& part : parts) {
+ if (part.audioData != nullptr) {
+ partWithAudio = ∂
+ }
+ }
+
+ if (partWithAudio == nullptr) {
+ return;
+ }
+
+ ALOGD("found audio.wav, creating playback engine");
+ initAudioThread = new InitAudioThread(partWithAudio->audioData,
+ partWithAudio->audioLength);
+ initAudioThread->run("BootAnimation::InitAudioThread", PRIORITY_NORMAL);
+ };
+
+ void playPart(int partNumber, const Animation::Part& part, int playNumber) override {
+ // only play audio file the first time we animate the part
+ if (playNumber == 0 && part.audioData && playSoundsAllowed()) {
+ ALOGD("playing clip for part%d, size=%d",
+ partNumber, part.audioLength);
+ // Block until the audio engine is finished initializing.
+ if (initAudioThread != nullptr) {
+ initAudioThread->join();
+ }
+ audioplay::playClip(part.audioData, part.audioLength);
+ }
+ };
+
+ void shutdown() override {
+ // we've finally played everything we're going to play
+ audioplay::setPlaying(false);
+ audioplay::destroy();
+ };
+
+private:
+ sp<InitAudioThread> initAudioThread = nullptr;
+};
+
} // namespace
@@ -102,83 +146,21 @@
{
setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_DISPLAY);
- char value[PROPERTY_VALUE_MAX];
- property_get("debug.sf.nobootanimation", value, "0");
- int noBootAnimation = atoi(value);
- if (!noBootAnimation) {
- property_get("ro.boot.quiescent", value, "0");
- noBootAnimation = atoi(value);
- }
+ bool noBootAnimation = bootAnimationDisabled();
ALOGI_IF(noBootAnimation, "boot animation disabled");
if (!noBootAnimation) {
sp<ProcessState> proc(ProcessState::self());
ProcessState::self()->startThreadPool();
- // TODO: replace this with better waiting logic in future, b/35253872
- int64_t waitStartTime = elapsedRealtime();
- sp<IServiceManager> sm = defaultServiceManager();
- const String16 name("SurfaceFlinger");
- const int SERVICE_WAIT_SLEEP_MS = 100;
- const int LOG_PER_RETRIES = 10;
- int retry = 0;
- while (sm->checkService(name) == nullptr) {
- retry++;
- if ((retry % LOG_PER_RETRIES) == 0) {
- ALOGW("Waiting for SurfaceFlinger, waited for %" PRId64 " ms",
- elapsedRealtime() - waitStartTime);
- }
- usleep(SERVICE_WAIT_SLEEP_MS * 1000);
- };
- int64_t totalWaited = elapsedRealtime() - waitStartTime;
- if (totalWaited > SERVICE_WAIT_SLEEP_MS) {
- ALOGI("Waiting for SurfaceFlinger took %" PRId64 " ms", totalWaited);
- }
-
- // TODO: Move audio code to a new class that just exports the callbacks.
- sp<InitAudioThread> initAudioThread = nullptr;
-
- auto initCallback = [&](const Vector<Animation::Part>& parts) {
- const Animation::Part* partWithAudio = nullptr;
- for (const Animation::Part& part : parts) {
- if (part.audioData != nullptr) {
- partWithAudio = ∂
- }
- }
-
- if (partWithAudio == nullptr) {
- return;
- }
-
- ALOGD("found audio.wav, creating playback engine");
- initAudioThread = new InitAudioThread(partWithAudio->audioData,
- partWithAudio->audioLength);
- initAudioThread->run("BootAnimation::InitAudioThread", PRIORITY_NORMAL);
-
- };
-
- auto partCallback = [&](int partNumber, const Animation::Part& part,
- int playNumber) {
- // only play audio file the first time we animate the part
- if (playNumber == 0 && part.audioData && playSoundsAllowed()) {
- ALOGD("playing clip for part%d, size=%d",
- partNumber, part.audioLength);
- // Block until the audio engine is finished initializing.
- if (initAudioThread != nullptr) {
- initAudioThread->join();
- }
- audioplay::playClip(part.audioData, part.audioLength);
- }
- };
+ waitForSurfaceFlinger();
// create the boot animation object
- sp<BootAnimation> boot = new BootAnimation(initCallback, partCallback);
+ sp<BootAnimation> boot = new BootAnimation(new AudioAnimationCallbacks());
+ ALOGV("Boot animation set up. Joining pool.");
IPCThreadState::self()->joinThreadPool();
-
- // we've finally played everything we're going to play
- audioplay::setPlaying(false);
- audioplay::destroy();
}
+ ALOGV("Boot animation exit");
return 0;
}
diff --git a/cmds/bootanimation/iot/BootAction.cpp b/cmds/bootanimation/iot/BootAction.cpp
new file mode 100644
index 0000000..8fda87e
--- /dev/null
+++ b/cmds/bootanimation/iot/BootAction.cpp
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#include "BootAction.h"
+
+#define LOG_TAG "BootAction"
+
+#include <android-base/strings.h>
+#include <cpu-features.h>
+#include <dlfcn.h>
+#include <pio/peripheral_manager_client.h>
+#include <utils/Log.h>
+
+using android::base::Split;
+using android::base::Join;
+using android::base::StartsWith;
+using android::base::EndsWith;
+
+namespace android {
+
+BootAction::~BootAction() {
+ if (mLibHandle != nullptr) {
+ dlclose(mLibHandle);
+ }
+}
+
+bool BootAction::init(const std::string& libraryPath, const std::string& config) {
+ APeripheralManagerClient* client = nullptr;
+ ALOGD("Connecting to peripheralmanager");
+ // Wait for peripheral manager to come up.
+ while (client == nullptr) {
+ client = APeripheralManagerClient_new();
+ if (client == nullptr) {
+ ALOGV("peripheralmanager is not up, sleeping before we check again.");
+ usleep(250000);
+ }
+ }
+ ALOGD("Peripheralmanager is up.");
+ APeripheralManagerClient_delete(client);
+
+ std::string path_to_lib = libraryPath;
+ if (!parseConfig(config, &path_to_lib)) {
+ return false;
+ }
+
+ ALOGI("Loading boot action %s", path_to_lib.c_str());
+ mLibHandle = dlopen(path_to_lib.c_str(), RTLD_NOW);
+ if (mLibHandle == nullptr) {
+ ALOGE("Unable to load library at %s :: %s",
+ path_to_lib.c_str(), dlerror());
+ return false;
+ }
+
+ void* loaded = nullptr;
+ if (!loadSymbol("boot_action_init", &loaded) || loaded == nullptr) {
+ return false;
+ }
+ mLibInit = reinterpret_cast<libInit>(loaded);
+
+ loaded = nullptr;
+ if (!loadSymbol("boot_action_shutdown", &loaded) || loaded == nullptr) {
+ return false;
+ }
+ mLibShutdown = reinterpret_cast<libShutdown>(loaded);
+
+ // StartPart is considered optional, if it isn't exported by the library
+ // we will still call init and shutdown.
+ loaded = nullptr;
+ if (!loadSymbol("boot_action_start_part", &loaded) || loaded == nullptr) {
+ ALOGI("No boot_action_start_part found, action will not be told when "
+ "Animation parts change.");
+ } else {
+ mLibStartPart = reinterpret_cast<libStartPart>(loaded);
+ }
+
+ ALOGD("Entering boot_action_init");
+ bool result = mLibInit();
+ ALOGD("Returned from boot_action_init");
+ return result;
+}
+
+void BootAction::startPart(int partNumber, int playNumber) {
+ if (mLibStartPart == nullptr) return;
+
+ ALOGD("Entering boot_action_start_part");
+ mLibStartPart(partNumber, playNumber);
+ ALOGD("Returned from boot_action_start_part");
+}
+
+void BootAction::shutdown() {
+ ALOGD("Entering boot_action_shutdown");
+ mLibShutdown();
+ ALOGD("Returned from boot_action_shutdown");
+}
+
+bool BootAction::loadSymbol(const char* symbol, void** loaded) {
+ *loaded = dlsym(mLibHandle, symbol);
+ if (loaded == nullptr) {
+ ALOGE("Unable to load symbol : %s :: %s", symbol, dlerror());
+ return false;
+ }
+ return true;
+}
+
+
+bool BootAction::parseConfig(const std::string& config, std::string* path) {
+ auto lines = Split(config, "\n");
+
+ if (lines.size() < 1) {
+ ALOGE("Config format invalid, expected one line, found %d",
+ lines.size());
+ return false;
+ }
+
+ size_t lineNumber = 0;
+ auto& line1 = lines.at(lineNumber);
+ while (StartsWith(line1, "#")) {
+ if (lines.size() < ++lineNumber) {
+ ALOGE("Config file contains no non-comment lines.");
+ return false;
+ }
+ line1 = lines.at(lineNumber);
+ }
+
+ const std::string libraryNameToken("LIBRARY_NAME=");
+ if (!StartsWith(line1, libraryNameToken.c_str())) {
+ ALOGE("Invalid config format, expected second line to start with %s "
+ "Instead found: %s", libraryNameToken.c_str(), line1.c_str());
+ return false;
+ }
+
+ std::string libraryName = line1.substr(libraryNameToken.length());
+
+ *path += "/";
+ *path += architectureDirectory();
+ *path += "/";
+ *path += libraryName;
+
+ return true;
+}
+
+const char* BootAction::architectureDirectory() {
+ switch(android_getCpuFamily()) {
+ case ANDROID_CPU_FAMILY_ARM:
+ return "arm";
+ case ANDROID_CPU_FAMILY_X86:
+ return "x86";
+ case ANDROID_CPU_FAMILY_MIPS:
+ return "mips";
+ case ANDROID_CPU_FAMILY_ARM64:
+ return "arm64";
+ case ANDROID_CPU_FAMILY_X86_64:
+ return "x86_64";
+ case ANDROID_CPU_FAMILY_MIPS64:
+ return "mips64";
+ default:
+ ALOGE("Unsupported cpu family: %d", android_getCpuFamily());
+ return "";
+ }
+}
+
+} // namespace android
diff --git a/cmds/bootanimation/iot/BootAction.h b/cmds/bootanimation/iot/BootAction.h
new file mode 100644
index 0000000..31d0d1f
--- /dev/null
+++ b/cmds/bootanimation/iot/BootAction.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#ifndef _BOOTANIMATION_BOOTACTION_H
+#define _BOOTANIMATION_BOOTACTION_H
+
+#include <string>
+
+#include <utils/RefBase.h>
+
+namespace android {
+
+class BootAction : public RefBase {
+public:
+ ~BootAction();
+ // Parse the contents of the config file. We expect one line:
+ // LIBRARY_NAME=
+ //
+ // LIBRARY_NAME is the name of the shared library that contains the boot action.
+ bool init(const std::string& libraryPath, const std::string& config);
+
+ // The animation is going to start playing partNumber for the playCount'th
+ // time, update the action as needed.
+ // This is run in the same thread as the boot animation,
+ // you must not block here.
+ void startPart(int partNumber, int playCount);
+
+ // Shutdown the boot action, this will be called shortly before the
+ // process is shut down to allow time for cleanup.
+ void shutdown();
+
+private:
+ typedef bool (*libInit)();
+ typedef void (*libStartPart)(int partNumber, int playNumber);
+ typedef void (*libShutdown)();
+
+ bool parseConfig(const std::string& config, std::string* path);
+ bool loadSymbol(const char* symbol, void** loaded);
+ const char* architectureDirectory();
+
+ void* mLibHandle = nullptr;
+ libInit mLibInit = nullptr;
+ libStartPart mLibStartPart = nullptr;
+ libShutdown mLibShutdown = nullptr;
+};
+
+} // namespace android
+
+
+#endif // _BOOTANIMATION_BOOTACTION_H
diff --git a/cmds/bootanimation/iot/iotbootanimation_main.cpp b/cmds/bootanimation/iot/iotbootanimation_main.cpp
new file mode 100644
index 0000000..d1ae786
--- /dev/null
+++ b/cmds/bootanimation/iot/iotbootanimation_main.cpp
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#define LOG_TAG "IotBootAnimation"
+
+#include <android-base/file.h>
+#include <binder/IPCThreadState.h>
+#include <binder/IServiceManager.h>
+#include <binder/ProcessState.h>
+#include <cutils/properties.h>
+#include <sys/resource.h>
+#include <utils/Log.h>
+#include <utils/threads.h>
+#include <BootAnimation.h>
+
+#include "BootAction.h"
+#include "BootAnimationUtil.h"
+
+using namespace android;
+using android::base::ReadFileToString;
+
+// Create a typedef for readability.
+typedef android::BootAnimation::Animation Animation;
+
+namespace {
+
+class BootActionAnimationCallbacks : public android::BootAnimation::Callbacks {public:
+ void init(const Vector<Animation::Part>&) override {
+ // Create and initialize BootActions if we have a boot_action.conf.
+ std::string bootActionConf;
+ if (ReadFileToString("/oem/app/etc/boot_action.conf", &bootActionConf)) {
+ mBootAction = new BootAction();
+ if (!mBootAction->init("/oem/app/lib", bootActionConf)) {
+ mBootAction = NULL;
+ }
+ } else {
+ ALOGI("No boot actions specified");
+ }
+
+ };
+
+ void playPart(int partNumber, const Animation::Part&, int playNumber) override {
+ if (mBootAction != nullptr) {
+ mBootAction->startPart(partNumber, playNumber);
+ }
+ };
+
+ void shutdown() override {
+ if (mBootAction != nullptr) {
+ mBootAction->shutdown();
+ // Give it two seconds to shut down.
+ sleep(2);
+ mBootAction = nullptr;
+ }
+ };
+
+private:
+ sp<BootAction> mBootAction = nullptr;
+};
+
+} // namespace
+
+int main() {
+ setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_DISPLAY);
+
+ if (bootAnimationDisabled()) {
+ ALOGI("boot animation disabled");
+ return 0;
+ }
+
+ waitForSurfaceFlinger();
+
+ sp<ProcessState> proc(ProcessState::self());
+ ProcessState::self()->startThreadPool();
+
+ sp<BootAnimation> boot = new BootAnimation(new BootActionAnimationCallbacks());
+
+ IPCThreadState::self()->joinThreadPool();
+ return 0;
+}
diff --git a/cmds/locksettings/src/com/android/commands/locksettings/LockSettingsCmd.java b/cmds/locksettings/src/com/android/commands/locksettings/LockSettingsCmd.java
index 1e426d6..b9fedd3 100644
--- a/cmds/locksettings/src/com/android/commands/locksettings/LockSettingsCmd.java
+++ b/cmds/locksettings/src/com/android/commands/locksettings/LockSettingsCmd.java
@@ -33,6 +33,10 @@
" locksettings set-pin [--old OLD_CREDENTIAL] NEW_PIN\n" +
" locksettings set-password [--old OLD_CREDENTIAL] NEW_PASSWORD\n" +
" locksettings clear [--old OLD_CREDENTIAL]\n" +
+ " locksettings verify [--old OLD_CREDENTIAL]\n" +
+ "\n" +
+ "flags: \n" +
+ " --user USER_ID: specify the user, default value is current user\n" +
"\n" +
"locksettings set-pattern: sets a pattern\n" +
" A pattern is specified by a non-separated list of numbers that index the cell\n" +
@@ -44,7 +48,9 @@
"\n" +
"locksettings set-password: sets a password\n" +
"\n" +
- "locksettings clear: clears the unlock credential\n";
+ "locksettings clear: clears the unlock credential\n" +
+ "\n" +
+ "locksettings verify: verifies the credential and unlocks the user\n";
public static void main(String[] args) {
(new LockSettingsCmd()).run(args);
diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java
index c4193f6..f0189c2 100644
--- a/cmds/pm/src/com/android/commands/pm/Pm.java
+++ b/cmds/pm/src/com/android/commands/pm/Pm.java
@@ -414,7 +414,7 @@
try {
ApkLite baseApk = PackageParser.parseApkLite(file, 0);
PackageLite pkgLite = new PackageLite(null, baseApk, null, null, null, null,
- null, null);
+ null, null, null);
params.sessionParams.setSize(
PackageHelper.calculateInstalledSize(pkgLite, false,
params.sessionParams.abiOverride));
@@ -1033,7 +1033,7 @@
if (info != null) {
System.out.println("Success: created user id " + info.id);
- return 1;
+ return 0;
} else {
System.err.println("Error: couldn't create User.");
return 1;
diff --git a/cmds/requestsync/src/com/android/commands/requestsync/RequestSync.java b/cmds/requestsync/src/com/android/commands/requestsync/RequestSync.java
index 50ee564..360b230 100644
--- a/cmds/requestsync/src/com/android/commands/requestsync/RequestSync.java
+++ b/cmds/requestsync/src/com/android/commands/requestsync/RequestSync.java
@@ -29,10 +29,41 @@
private int mNextArg;
private String mCurArgData;
+ enum Operation {
+ REQUEST_SYNC {
+ @Override
+ void invoke(RequestSync caller) {
+ ContentResolver.requestSync(caller.mAccount, caller.mAuthority, caller.mExtras);
+ }
+ },
+ ADD_PERIODIC_SYNC {
+ @Override
+ void invoke(RequestSync caller) {
+ ContentResolver.addPeriodicSync(caller.mAccount, caller.mAuthority, caller.mExtras,
+ caller.mPeriodicIntervalSeconds);
+ }
+ },
+ REMOVE_PERIODIC_SYNC {
+ @Override
+ void invoke(RequestSync caller) {
+ ContentResolver.removePeriodicSync(
+ caller.mAccount, caller.mAuthority, caller.mExtras);
+ }
+ };
+
+ abstract void invoke(RequestSync caller);
+ }
+
+ private Operation mOperation;
+
// account & authority
- private String mAccountName = null;
- private String mAccountType = null;
- private String mAuthority = null;
+ private String mAccountName;
+ private String mAccountType;
+ private String mAuthority;
+
+ private Account mAccount;
+
+ private int mPeriodicIntervalSeconds;
// extras
private Bundle mExtras = new Bundle();
@@ -80,11 +111,28 @@
}
}
- ContentResolver.requestSync(account, mAuthority, mExtras);
+ mAccount = account;
+
+ mOperation.invoke(this);
}
}
private boolean parseArgs() throws URISyntaxException {
+ mOperation = Operation.REQUEST_SYNC;
+ if (mArgs.length > 0) {
+ switch (mArgs[0]) {
+ case "add-periodic":
+ mNextArg++;
+ mOperation = Operation.ADD_PERIODIC_SYNC;
+ mPeriodicIntervalSeconds = Integer.parseInt(nextArgRequired());
+ break;
+ case "remove-periodic":
+ mNextArg++;
+ mOperation = Operation.REMOVE_PERIODIC_SYNC;
+ break;
+ }
+ }
+
String opt;
while ((opt=nextOption()) != null) {
if (opt.equals("-h") || opt.equals("--help")) {
@@ -114,6 +162,8 @@
mExtras.putBoolean(ContentResolver.SYNC_EXTRAS_OVERRIDE_TOO_MANY_DELETIONS, true);
} else if (opt.equals("-u") || opt.equals("--upload-only")) {
mExtras.putBoolean(ContentResolver.SYNC_EXTRAS_UPLOAD, true);
+ } else if (opt.equals("--rc") || opt.equals("--require-charging")) {
+ mExtras.putBoolean(ContentResolver.SYNC_EXTRAS_REQUIRE_CHARGING, true);
} else if (opt.equals("-e") || opt.equals("--es") || opt.equals("--extra-string")) {
final String key = nextArgRequired();
final String value = nextArgRequired();
@@ -207,31 +257,43 @@
private static void showUsage() {
System.err.println(
- "usage: requestsync [options]\n" +
- "With no options, a sync will be requested for all account and all sync\n" +
- "authorities with no extras. Options can be:\n" +
- " -h|--help: Display this message\n" +
- " -n|--account-name <ACCOUNT-NAME>\n" +
- " -t|--account-type <ACCOUNT-TYPE>\n" +
- " -a|--authority <AUTHORITY>\n" +
- " Add ContentResolver extras:\n" +
- " --is|--ignore-settings: Add SYNC_EXTRAS_IGNORE_SETTINGS\n" +
- " --ib|--ignore-backoff: Add SYNC_EXTRAS_IGNORE_BACKOFF\n" +
- " --dd|--discard-deletions: Add SYNC_EXTRAS_DISCARD_LOCAL_DELETIONS\n" +
- " --nr|--no-retry: Add SYNC_EXTRAS_DO_NOT_RETRY\n" +
- " --ex|--expedited: Add SYNC_EXTRAS_EXPEDITED\n" +
- " --i|--initialize: Add SYNC_EXTRAS_INITIALIZE\n" +
- " --m|--manual: Add SYNC_EXTRAS_MANUAL\n" +
- " --od|--override-deletions: Add SYNC_EXTRAS_OVERRIDE_TOO_MANY_DELETIONS\n" +
- " --u|--upload-only: Add SYNC_EXTRAS_UPLOAD\n" +
- " Add custom extras:\n" +
- " -e|--es|--extra-string <KEY> <VALUE>\n" +
- " --esn|--extra-string-null <KEY>\n" +
- " --ei|--extra-int <KEY> <VALUE>\n" +
- " --el|--extra-long <KEY> <VALUE>\n" +
- " --ef|--extra-float <KEY> <VALUE>\n" +
- " --ed|--extra-double <KEY> <VALUE>\n" +
- " --ez|--extra-bool <KEY> <VALUE>\n"
+ "Usage:\n" +
+ "\n" +
+ " requestsync [options]\n" +
+ " With no options, a sync will be requested for all account and all sync\n" +
+ " authorities with no extras.\n" +
+ " Basic options:\n" +
+ " -h|--help: Display this message\n" +
+ " -n|--account-name <ACCOUNT-NAME>\n" +
+ " -t|--account-type <ACCOUNT-TYPE>\n" +
+ " -a|--authority <AUTHORITY>\n" +
+ " ContentResolver extra options:\n" +
+ " --is|--ignore-settings: Add SYNC_EXTRAS_IGNORE_SETTINGS\n" +
+ " --ib|--ignore-backoff: Add SYNC_EXTRAS_IGNORE_BACKOFF\n" +
+ " --dd|--discard-deletions: Add SYNC_EXTRAS_DISCARD_LOCAL_DELETIONS\n" +
+ " --nr|--no-retry: Add SYNC_EXTRAS_DO_NOT_RETRY\n" +
+ " --ex|--expedited: Add SYNC_EXTRAS_EXPEDITED\n" +
+ " -i|--initialize: Add SYNC_EXTRAS_INITIALIZE\n" +
+ " --m|--manual: Add SYNC_EXTRAS_MANUAL\n" +
+ " --od|--override-deletions: Add SYNC_EXTRAS_OVERRIDE_TOO_MANY_DELETIONS\n" +
+ " -u|--upload-only: Add SYNC_EXTRAS_UPLOAD\n" +
+ " --rc|--require-charging: Add SYNC_EXTRAS_REQUIRE_CHARGING\n" +
+ " Custom extra options:\n" +
+ " -e|--es|--extra-string <KEY> <VALUE>\n" +
+ " --esn|--extra-string-null <KEY>\n" +
+ " --ei|--extra-int <KEY> <VALUE>\n" +
+ " --el|--extra-long <KEY> <VALUE>\n" +
+ " --ef|--extra-float <KEY> <VALUE>\n" +
+ " --ed|--extra-double <KEY> <VALUE>\n" +
+ " --ez|--extra-bool <KEY> <VALUE>\n" +
+ "\n" +
+ " requestsync add-periodic INTERVAL-SECOND [options]\n" +
+ " requestsync remove-periodic [options]\n" +
+ " Mandatory options:\n" +
+ " -n|--account-name <ACCOUNT-NAME>\n" +
+ " -t|--account-type <ACCOUNT-TYPE>\n" +
+ " -a|--authority <AUTHORITY>\n" +
+ " Also takes the above extra options.\n"
);
}
}
diff --git a/cmds/screencap/screencap.cpp b/cmds/screencap/screencap.cpp
index 2366878..35f8bbb 100644
--- a/cmds/screencap/screencap.cpp
+++ b/cmds/screencap/screencap.cpp
@@ -116,13 +116,6 @@
int main(int argc, char** argv)
{
- // setThreadPoolMaxThreadCount(0) actually tells the kernel it's
- // not allowed to spawn any additional threads, but we still spawn
- // a binder thread from userspace when we call startThreadPool().
- // See b/36066697 for rationale
- ProcessState::self()->setThreadPoolMaxThreadCount(0);
- ProcessState::self()->startThreadPool();
-
const char* pname = argv[0];
bool png = false;
int32_t displayId = DEFAULT_DISPLAY_ID;
@@ -182,11 +175,19 @@
ISurfaceComposer::eRotate90, // 3 == DISPLAY_ORIENTATION_270
};
+ // setThreadPoolMaxThreadCount(0) actually tells the kernel it's
+ // not allowed to spawn any additional threads, but we still spawn
+ // a binder thread from userspace when we call startThreadPool().
+ // See b/36066697 for rationale
+ ProcessState::self()->setThreadPoolMaxThreadCount(0);
+ ProcessState::self()->startThreadPool();
+
ScreenshotClient screenshot;
sp<IBinder> display = SurfaceComposerClient::getBuiltInDisplay(displayId);
if (display == NULL) {
fprintf(stderr, "Unable to get handle for display %d\n", displayId);
- return 1;
+ // b/36066697: Avoid running static destructors.
+ _exit(1);
}
Vector<DisplayInfo> configs;
@@ -195,7 +196,8 @@
if (static_cast<size_t>(activeConfig) >= configs.size()) {
fprintf(stderr, "Active config %d not inside configs (size %zu)\n",
activeConfig, configs.size());
- return 1;
+ // b/36066697: Avoid running static destructors.
+ _exit(1);
}
uint8_t displayOrientation = configs[activeConfig].orientation;
uint32_t captureOrientation = ORIENTATION_MAP[displayOrientation];
diff --git a/cmds/svc/src/com/android/commands/svc/BluetoothCommand.java b/cmds/svc/src/com/android/commands/svc/BluetoothCommand.java
new file mode 100644
index 0000000..b572ce2
--- /dev/null
+++ b/cmds/svc/src/com/android/commands/svc/BluetoothCommand.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.commands.svc;
+
+import android.bluetooth.BluetoothAdapter;
+import android.os.RemoteException;
+
+public class BluetoothCommand extends Svc.Command {
+
+ public BluetoothCommand() {
+ super("bluetooth");
+ }
+
+ @Override
+ public String shortHelp() {
+ return "Control Bluetooth service";
+ }
+
+ @Override
+ public String longHelp() {
+ return shortHelp() + "\n"
+ + "\n"
+ + "usage: svc bluetooth [enable|disable]\n"
+ + " Turn Bluetooth on or off.\n\n";
+ }
+
+ @Override
+ public void run(String[] args) {
+ BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
+
+ if (adapter == null) {
+ System.err.println("Got a null BluetoothAdapter, is the system running?");
+ return;
+ }
+
+ if (args.length == 2 && "enable".equals(args[1])) {
+ adapter.enable();
+ } else if (args.length == 2 && "disable".equals(args[1])) {
+ adapter.disable();
+ } else {
+ System.err.println(longHelp());
+ }
+ }
+}
diff --git a/cmds/svc/src/com/android/commands/svc/NfcCommand.java b/cmds/svc/src/com/android/commands/svc/NfcCommand.java
index 02a92b9..020ca33 100644
--- a/cmds/svc/src/com/android/commands/svc/NfcCommand.java
+++ b/cmds/svc/src/com/android/commands/svc/NfcCommand.java
@@ -17,8 +17,6 @@
package com.android.commands.svc;
import android.content.Context;
-import android.content.pm.IPackageManager;
-import android.content.pm.PackageManager;
import android.nfc.INfcAdapter;
import android.os.RemoteException;
import android.os.ServiceManager;
@@ -44,42 +42,27 @@
@Override
public void run(String[] args) {
- boolean validCommand = false;
- if (args.length >= 2) {
- boolean flag = false;
- if ("enable".equals(args[1])) {
- flag = true;
- validCommand = true;
- } else if ("disable".equals(args[1])) {
- flag = false;
- validCommand = true;
- }
- if (validCommand) {
- IPackageManager pm = IPackageManager.Stub.asInterface(
- ServiceManager.getService("package"));
- try {
- if (pm.hasSystemFeature(PackageManager.FEATURE_NFC, 0) ||
- pm.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION, 0)) {
- INfcAdapter nfc = INfcAdapter.Stub
- .asInterface(ServiceManager.getService(Context.NFC_SERVICE));
- try {
- if (flag) {
- nfc.enable();
- } else
- nfc.disable(true);
- } catch (RemoteException e) {
- System.err.println("NFC operation failed: " + e);
- }
- } else {
- System.err.println("NFC feature not supported.");
- }
- } catch (RemoteException e) {
- System.err.println("RemoteException while calling PackageManager, is the "
- + "system running?");
- }
+ INfcAdapter adapter = INfcAdapter.Stub.asInterface(
+ ServiceManager.getService(Context.NFC_SERVICE));
+
+ if (adapter == null) {
+ System.err.println("Got a null NfcAdapter, is the system running?");
+ return;
+ }
+
+ try {
+ if (args.length == 2 && "enable".equals(args[1])) {
+ adapter.enable();
+ return;
+ } else if (args.length == 2 && "disable".equals(args[1])) {
+ adapter.disable(true);
return;
}
+ } catch (RemoteException e) {
+ System.err.println("NFC operation failed: " + e);
+ return;
}
+
System.err.println(longHelp());
}
diff --git a/cmds/svc/src/com/android/commands/svc/Svc.java b/cmds/svc/src/com/android/commands/svc/Svc.java
index 2cccd1a..62225df 100644
--- a/cmds/svc/src/com/android/commands/svc/Svc.java
+++ b/cmds/svc/src/com/android/commands/svc/Svc.java
@@ -97,5 +97,6 @@
new WifiCommand(),
new UsbCommand(),
new NfcCommand(),
+ new BluetoothCommand(),
};
}
diff --git a/core/java/android/accounts/AbstractAccountAuthenticator.java b/core/java/android/accounts/AbstractAccountAuthenticator.java
index 87e512c..bf9bd79 100644
--- a/core/java/android/accounts/AbstractAccountAuthenticator.java
+++ b/core/java/android/accounts/AbstractAccountAuthenticator.java
@@ -547,7 +547,9 @@
* @param authTokenType the type of auth token to retrieve after adding the account, may be null
* @param requiredFeatures a String array of authenticator-specific features that the added
* account must support, may be null
- * @param options a Bundle of authenticator-specific options, may be null
+ * @param options a Bundle of authenticator-specific options. It always contains
+ * {@link AccountManager#KEY_CALLER_PID} and {@link AccountManager#KEY_CALLER_UID}
+ * fields which will let authenticator know the identity of the caller.
* @return a Bundle result or null if the result is to be returned via the response. The result
* will contain either:
* <ul>
@@ -603,21 +605,24 @@
* addition {@link AbstractAccountAuthenticator} implementations that declare themselves
* {@code android:customTokens=true} may also provide a non-negative {@link
* #KEY_CUSTOM_TOKEN_EXPIRY} long value containing the expiration timestamp of the expiration
- * time (in millis since the unix epoch).
+ * time (in millis since the unix epoch), tokens will be cached in memory based on
+ * application's packageName/signature for however long that was specified.
* <p>
* Implementers should assume that tokens will be cached on the basis of account and
* authTokenType. The system may ignore the contents of the supplied options Bundle when
* determining to re-use a cached token. Furthermore, implementers should assume a supplied
* expiration time will be treated as non-binding advice.
* <p>
- * Finally, note that for android:customTokens=false authenticators, tokens are cached
+ * Finally, note that for {@code android:customTokens=false} authenticators, tokens are cached
* indefinitely until some client calls {@link
* AccountManager#invalidateAuthToken(String,String)}.
*
* @param response to send the result back to the AccountManager, will never be null
* @param account the account whose credentials are to be retrieved, will never be null
* @param authTokenType the type of auth token to retrieve, will never be null
- * @param options a Bundle of authenticator-specific options, may be null
+ * @param options a Bundle of authenticator-specific options. It always contains
+ * {@link AccountManager#KEY_CALLER_PID} and {@link AccountManager#KEY_CALLER_UID}
+ * fields which will let authenticator know the identity of the caller.
* @return a Bundle result or null if the result is to be returned via the response.
* @throws NetworkErrorException if the authenticator could not honor the request due to a
* network error
diff --git a/core/java/android/accounts/AccountManager.java b/core/java/android/accounts/AccountManager.java
index a446296..a209d28 100644
--- a/core/java/android/accounts/AccountManager.java
+++ b/core/java/android/accounts/AccountManager.java
@@ -242,10 +242,13 @@
public static final String KEY_LAST_AUTHENTICATED_TIME = "lastAuthenticatedTime";
/**
- * Authenticators using 'customTokens' option will also get the UID of the
- * caller
+ * The UID of caller app.
*/
public static final String KEY_CALLER_UID = "callerUid";
+
+ /**
+ * The process id of caller app.
+ */
public static final String KEY_CALLER_PID = "callerPid";
/**
diff --git a/core/java/android/accounts/ChooseAccountActivity.java b/core/java/android/accounts/ChooseAccountActivity.java
index 9f2c39b..6a43686 100644
--- a/core/java/android/accounts/ChooseAccountActivity.java
+++ b/core/java/android/accounts/ChooseAccountActivity.java
@@ -16,12 +16,17 @@
package android.accounts;
import android.app.Activity;
+import android.app.ActivityManager;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
+import android.os.IBinder;
import android.os.Parcelable;
+import android.os.RemoteException;
+import android.os.Process;
+import android.os.UserHandle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
@@ -45,6 +50,8 @@
private Parcelable[] mAccounts = null;
private AccountManagerResponse mAccountManagerResponse = null;
private Bundle mResult;
+ private int mCallingUid;
+ private String mCallingPackage;
private HashMap<String, AuthenticatorDescription> mTypeToAuthDescription
= new HashMap<String, AuthenticatorDescription>();
@@ -52,9 +59,6 @@
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- // TODO This activity is only used by getAuthTokenByFeatures and can not see
- // VISIBILITY_USER_MANAGED_NOT_VISIBLE accounts. It should be moved to account managed
- // service.
mAccounts = getIntent().getParcelableArrayExtra(AccountManager.KEY_ACCOUNTS);
mAccountManagerResponse =
getIntent().getParcelableExtra(AccountManager.KEY_ACCOUNT_MANAGER_RESPONSE);
@@ -66,6 +70,28 @@
return;
}
+ try {
+ IBinder activityToken = getActivityToken();
+ mCallingUid = ActivityManager.getService().getLaunchedFromUid(activityToken);
+ mCallingPackage = ActivityManager.getService().getLaunchedFromPackage(
+ activityToken);
+ } catch (RemoteException re) {
+ // Couldn't figure out caller details
+ Log.w(getClass().getSimpleName(), "Unable to get caller identity \n" + re);
+ }
+
+ if (UserHandle.isSameApp(mCallingUid, Process.SYSTEM_UID) &&
+ getIntent().getStringExtra(AccountManager.KEY_ANDROID_PACKAGE_NAME) != null) {
+ mCallingPackage = getIntent().getStringExtra(
+ AccountManager.KEY_ANDROID_PACKAGE_NAME);
+ }
+
+ if (!UserHandle.isSameApp(mCallingUid, Process.SYSTEM_UID) &&
+ getIntent().getStringExtra(AccountManager.KEY_ANDROID_PACKAGE_NAME) != null) {
+ Log.w(getClass().getSimpleName(),
+ "Non-system Uid: " + mCallingUid + " tried to override packageName \n");
+ }
+
getAuthDescriptions();
AccountInfo[] mAccountInfos = new AccountInfo[mAccounts.length];
@@ -120,6 +146,14 @@
protected void onListItemClick(ListView l, View v, int position, long id) {
Account account = (Account) mAccounts[position];
+ // Mark account as visible since user chose it.
+ AccountManager am = AccountManager.get(this);
+ Integer oldVisibility = am.getAccountVisibility(account, mCallingPackage);
+ if (oldVisibility != null
+ && oldVisibility == AccountManager.VISIBILITY_USER_MANAGED_NOT_VISIBLE) {
+ am.setAccountVisibility(account, mCallingPackage,
+ AccountManager.VISIBILITY_USER_MANAGED_VISIBLE);
+ }
Log.d(TAG, "selected account " + account);
Bundle bundle = new Bundle();
bundle.putString(AccountManager.KEY_ACCOUNT_NAME, account.name);
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 0ff3215..adb3152 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -801,10 +801,6 @@
final Handler mHandler = new Handler();
final FragmentController mFragments = FragmentController.createController(new HostCallbacks());
- // Most recent call to requestVisibleBehind().
- @Deprecated
- boolean mVisibleBehind;
-
private static final class ManagedCursor {
ManagedCursor(Cursor cursor) {
mCursor = cursor;
@@ -6459,10 +6455,6 @@
@Deprecated
@SystemApi
public boolean isBackgroundVisibleBehind() {
- try {
- return ActivityManager.getService().isBackgroundVisibleBehind(mToken);
- } catch (RemoteException e) {
- }
return false;
}
@@ -7556,6 +7548,53 @@
}
}
+ /**
+ * Specifies whether an {@link Activity} should be shown on top of the the lock screen whenever
+ * the lockscreen is up and the activity is resumed. Normally an activity will be transitioned
+ * to the stopped state if it is started while the lockscreen is up, but with this flag set the
+ * activity will remain in the resumed state visible on-top of the lock screen. This value can
+ * be set as a manifest attribute using {@link android.R.attr#showWhenLocked}.
+ *
+ * @param showWhenLocked {@code true} to show the {@link Activity} on top of the lock screen;
+ * {@code false} otherwise.
+ * @see #setTurnScreenOn(boolean)
+ * @see android.R.attr#turnScreenOn
+ * @see android.R.attr#showWhenLocked
+ */
+ public void setShowWhenLocked(boolean showWhenLocked) {
+ try {
+ ActivityManager.getService().setShowWhenLocked(mToken, showWhenLocked);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to call setShowWhenLocked", e);
+ }
+ }
+
+ /**
+ * Specifies whether the screen should be turned on when the {@link Activity} is resumed.
+ * Normally an activity will be transitioned to the stopped state if it is started while the
+ * screen if off, but with this flag set the activity will cause the screen to turn on if the
+ * activity will be visible and resumed due to the screen coming on. The screen will not be
+ * turned on if the activity won't be visible after the screen is turned on. This flag is
+ * normally used in conjunction with the {@link android.R.attr#showWhenLocked} flag to make sure
+ * the activity is visible after the screen is turned on when the lockscreen is up. In addition,
+ * if this flag is set and the activity calls {@link
+ * KeyguardManager#requestDismissKeyguard(Activity, KeyguardManager.KeyguardDismissCallback)}
+ * the screen will turn on.
+ *
+ * @param turnScreenOn {@code true} to turn on the screen; {@code false} otherwise.
+ *
+ * @see #setShowWhenLocked(boolean)
+ * @see android.R.attr#turnScreenOn
+ * @see android.R.attr#showWhenLocked
+ */
+ public void setTurnScreenOn(boolean turnScreenOn) {
+ try {
+ ActivityManager.getService().setTurnScreenOn(mToken, turnScreenOn);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to call setTurnScreenOn", e);
+ }
+ }
+
class HostCallbacks extends FragmentHostCallback<Activity> {
public HostCallbacks() {
super(Activity.this /*activity*/);
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index 06dbe82..d432544 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -24,42 +24,35 @@
import android.annotation.SystemApi;
import android.annotation.SystemService;
import android.annotation.TestApi;
-import android.content.pm.ActivityInfo;
-import android.content.res.Configuration;
-import android.graphics.Canvas;
-import android.graphics.GraphicBuffer;
-import android.graphics.Matrix;
-import android.graphics.Point;
-import android.os.BatteryStats;
-import android.os.Build;
-import android.os.Build.VERSION_CODES;
-import android.os.IBinder;
-import android.os.ParcelFileDescriptor;
-
-import com.android.internal.app.procstats.ProcessStats;
-import com.android.internal.os.RoSystemProperties;
-import com.android.internal.os.TransferPipe;
-import com.android.internal.util.FastPrintWriter;
-import com.android.server.LocalServices;
-
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.UriPermission;
+import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.ConfigurationInfo;
import android.content.pm.IPackageDataObserver;
import android.content.pm.PackageManager;
import android.content.pm.ParceledListSlice;
import android.content.pm.UserInfo;
+import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Bitmap;
+import android.graphics.Canvas;
import android.graphics.Color;
+import android.graphics.GraphicBuffer;
+import android.graphics.Matrix;
+import android.graphics.Point;
import android.graphics.Rect;
+import android.os.BatteryStats;
+import android.os.Build;
+import android.os.Build.VERSION_CODES;
import android.os.Bundle;
import android.os.Debug;
import android.os.Handler;
+import android.os.IBinder;
import android.os.Parcel;
+import android.os.ParcelFileDescriptor;
import android.os.Parcelable;
import android.os.Process;
import android.os.RemoteException;
@@ -72,6 +65,12 @@
import android.util.Singleton;
import android.util.Size;
+import com.android.internal.app.procstats.ProcessStats;
+import com.android.internal.os.RoSystemProperties;
+import com.android.internal.os.TransferPipe;
+import com.android.internal.util.FastPrintWriter;
+import com.android.server.LocalServices;
+
import org.xmlpull.v1.XmlSerializer;
import java.io.FileDescriptor;
@@ -173,6 +172,9 @@
@Override
public void onUidIdle(int uid, boolean disabled) {
}
+
+ @Override public void onUidCachedChanged(int uid, boolean cached) {
+ }
}
final ArrayMap<OnUidImportanceListener, UidObserver> mImportanceListeners = new ArrayMap<>();
@@ -564,6 +566,9 @@
/** @hide Flag for registerUidObserver: report uid has become active. */
public static final int UID_OBSERVER_ACTIVE = 1<<3;
+ /** @hide Flag for registerUidObserver: report uid cached state has changed. */
+ public static final int UID_OBSERVER_CACHED = 1<<4;
+
/** @hide Mode for {@link IActivityManager#isAppStartModeDisabled}: normal free-to-run operation. */
public static final int APP_START_MODE_NORMAL = 0;
@@ -904,19 +909,6 @@
}
/**
- * Returns true if activities contained in this stack can request visible behind by
- * calling {@link Activity#requestVisibleBehind}.
- *
- * @deprecated This method's functionality is no longer supported as of
- * {@link android.os.Build.VERSION_CODES#O} and will be removed in a future release.
- */
- @Deprecated
- public static boolean activitiesCanRequestVisibleBehind(int stackId) {
- return stackId == FULLSCREEN_WORKSPACE_STACK_ID ||
- stackId == ASSISTANT_STACK_ID;
- }
-
- /**
* Returns true if this stack may be scaled without resizing, and windows within may need
* to be configured as such.
*/
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 35cb2f1..d03b347 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -100,6 +100,7 @@
import android.util.EventLog;
import android.util.Log;
import android.util.LogPrinter;
+import android.util.LogWriter;
import android.util.Pair;
import android.util.PrintWriterPrinter;
import android.util.Slog;
@@ -122,10 +123,10 @@
import com.android.internal.content.ReferrerIntent;
import com.android.internal.os.BinderInternal;
import com.android.internal.os.RuntimeInit;
-import com.android.internal.os.SamplingProfilerIntegration;
import com.android.internal.os.SomeArgs;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.FastPrintWriter;
+import com.android.internal.util.IndentingPrintWriter;
import com.android.org.conscrypt.OpenSSLSocketImpl;
import com.android.org.conscrypt.TrustedCertificateStore;
@@ -134,8 +135,6 @@
import dalvik.system.VMDebug;
import dalvik.system.VMRuntime;
-import com.google.android.collect.Lists;
-
import libcore.io.DropBox;
import libcore.io.EventLogger;
import libcore.io.IoUtils;
@@ -153,6 +152,7 @@
import java.net.InetAddress;
import java.text.DateFormat;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.Map;
@@ -446,7 +446,6 @@
sb.append(", startedActivity=").append(activity.mStartedActivity);
sb.append(", temporaryPause=").append(activity.mTemporaryPause);
sb.append(", changingConfigurations=").append(activity.mChangingConfigurations);
- sb.append(", visibleBehind=").append(activity.mVisibleBehind);
sb.append("}");
}
sb.append("}");
@@ -659,6 +658,9 @@
}
static final class DumpHeapData {
+ public boolean managed;
+ public boolean mallocInfo;
+ public boolean runGc;
String path;
ParcelFileDescriptor fd;
}
@@ -1024,11 +1026,16 @@
sendMessage(H.PROFILER_CONTROL, profilerInfo, start ? 1 : 0, profileType);
}
- public void dumpHeap(boolean managed, String path, ParcelFileDescriptor fd) {
+ @Override
+ public void dumpHeap(boolean managed, boolean mallocInfo, boolean runGc, String path,
+ ParcelFileDescriptor fd) {
DumpHeapData dhd = new DumpHeapData();
+ dhd.managed = managed;
+ dhd.mallocInfo = mallocInfo;
+ dhd.runGc = runGc;
dhd.path = path;
dhd.fd = fd;
- sendMessage(H.DUMP_HEAP, dhd, managed ? 1 : 0, 0, true /*async*/);
+ sendMessage(H.DUMP_HEAP, dhd, 0, 0, true /*async*/);
}
public void attachAgent(String agent) {
@@ -1385,16 +1392,6 @@
}
@Override
- public void scheduleCancelVisibleBehind(IBinder token) {
- sendMessage(H.CANCEL_VISIBLE_BEHIND, token);
- }
-
- @Override
- public void scheduleBackgroundVisibleBehindChanged(IBinder token, boolean visible) {
- sendMessage(H.BACKGROUND_VISIBLE_BEHIND_CHANGED, token, visible ? 1 : 0);
- }
-
- @Override
public void scheduleEnterAnimationComplete(IBinder token) {
sendMessage(H.ENTER_ANIMATION_COMPLETE, token);
}
@@ -1510,8 +1507,6 @@
public static final int TRANSLUCENT_CONVERSION_COMPLETE = 144;
public static final int INSTALL_PROVIDER = 145;
public static final int ON_NEW_ACTIVITY_OPTIONS = 146;
- public static final int CANCEL_VISIBLE_BEHIND = 147;
- public static final int BACKGROUND_VISIBLE_BEHIND_CHANGED = 148;
public static final int ENTER_ANIMATION_COMPLETE = 149;
public static final int START_BINDER_TRACKING = 150;
public static final int STOP_BINDER_TRACKING_AND_DUMP = 151;
@@ -1572,8 +1567,6 @@
case TRANSLUCENT_CONVERSION_COMPLETE: return "TRANSLUCENT_CONVERSION_COMPLETE";
case INSTALL_PROVIDER: return "INSTALL_PROVIDER";
case ON_NEW_ACTIVITY_OPTIONS: return "ON_NEW_ACTIVITY_OPTIONS";
- case CANCEL_VISIBLE_BEHIND: return "CANCEL_VISIBLE_BEHIND";
- case BACKGROUND_VISIBLE_BEHIND_CHANGED: return "BACKGROUND_VISIBLE_BEHIND_CHANGED";
case ENTER_ANIMATION_COMPLETE: return "ENTER_ANIMATION_COMPLETE";
case MULTI_WINDOW_MODE_CHANGED: return "MULTI_WINDOW_MODE_CHANGED";
case PICTURE_IN_PICTURE_MODE_CHANGED: return "PICTURE_IN_PICTURE_MODE_CHANGED";
@@ -1608,7 +1601,6 @@
handlePauseActivity((IBinder) args.arg1, false,
(args.argi1 & USER_LEAVING) != 0, args.argi2,
(args.argi1 & DONT_REPORT) != 0, args.argi3);
- maybeSnapshot();
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
} break;
case PAUSE_ACTIVITY_FINISHING: {
@@ -1678,7 +1670,6 @@
case RECEIVER:
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "broadcastReceiveComp");
handleReceiver((ReceiverData)msg.obj);
- maybeSnapshot();
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
break;
case CREATE_SERVICE:
@@ -1704,7 +1695,6 @@
case STOP_SERVICE:
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "serviceStop");
handleStopService((IBinder)msg.obj);
- maybeSnapshot();
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
break;
case CONFIGURATION_CHANGED:
@@ -1777,7 +1767,7 @@
case SCHEDULE_CRASH:
throw new RemoteServiceException((String)msg.obj);
case DUMP_HEAP:
- handleDumpHeap(msg.arg1 != 0, (DumpHeapData)msg.obj);
+ handleDumpHeap((DumpHeapData) msg.obj);
break;
case DUMP_ACTIVITY:
handleDumpActivity((DumpComponentInfo)msg.obj);
@@ -1819,12 +1809,6 @@
Pair<IBinder, ActivityOptions> pair = (Pair<IBinder, ActivityOptions>) msg.obj;
onNewActivityOptions(pair.first, pair.second);
break;
- case CANCEL_VISIBLE_BEHIND:
- handleCancelVisibleBehind((IBinder) msg.obj);
- break;
- case BACKGROUND_VISIBLE_BEHIND_CHANGED:
- handleOnBackgroundVisibleBehindChanged((IBinder) msg.obj, msg.arg1 > 0);
- break;
case ENTER_ANIMATION_COMPLETE:
handleEnterAnimationComplete((IBinder) msg.obj);
break;
@@ -1866,32 +1850,6 @@
}
if (DEBUG_MESSAGES) Slog.v(TAG, "<<< done: " + codeToString(msg.what));
}
-
- private void maybeSnapshot() {
- if (mBoundApplication != null && SamplingProfilerIntegration.isEnabled()) {
- // convert the *private* ActivityThread.PackageInfo to *public* known
- // android.content.pm.PackageInfo
- String packageName = mBoundApplication.info.mPackageName;
- android.content.pm.PackageInfo packageInfo = null;
- try {
- Context context = getSystemContext();
- if(context == null) {
- Log.e(TAG, "cannot get a valid context");
- return;
- }
- PackageManager pm = context.getPackageManager();
- if(pm == null) {
- Log.e(TAG, "cannot get a valid PackageManager");
- return;
- }
- packageInfo = pm.getPackageInfo(
- packageName, PackageManager.GET_ACTIVITIES);
- } catch (NameNotFoundException e) {
- Log.e(TAG, "cannot get package info for " + packageName, e);
- }
- SamplingProfilerIntegration.writeSnapshot(mBoundApplication.processName, packageInfo);
- }
- }
}
private class Idler implements MessageQueue.IdleHandler {
@@ -2992,6 +2950,7 @@
r.activity.mTemporaryPause = true;
mInstrumentation.callActivityOnPause(r.activity);
}
+ checkAndBlockForNetworkAccess();
deliverNewIntents(r, intents);
if (resumed) {
r.activity.performResume();
@@ -3099,40 +3058,10 @@
}
}
- public void handleCancelVisibleBehind(IBinder token) {
- ActivityClientRecord r = mActivities.get(token);
- if (r != null) {
- mSomeActivitiesChanged = true;
- final Activity activity = r.activity;
- if (activity.mVisibleBehind) {
- activity.mCalled = false;
- activity.onVisibleBehindCanceled();
- // Tick, tick, tick. The activity has 500 msec to return or it will be destroyed.
- if (!activity.mCalled) {
- throw new SuperNotCalledException("Activity " + activity.getLocalClassName() +
- " did not call through to super.onVisibleBehindCanceled()");
- }
- activity.mVisibleBehind = false;
- }
- }
- try {
- ActivityManager.getService().backgroundResourcesReleased(token);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- public void handleOnBackgroundVisibleBehindChanged(IBinder token, boolean visible) {
- ActivityClientRecord r = mActivities.get(token);
- if (r != null) {
- r.activity.onBackgroundVisibleBehindChanged(visible);
- }
- }
-
public void handleInstallProvider(ProviderInfo info) {
final StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskWrites();
try {
- installContentProviders(mInitialApplication, Lists.newArrayList(info));
+ installContentProviders(mInitialApplication, Arrays.asList(info));
} finally {
StrictMode.setThreadPolicy(oldPolicy);
}
@@ -3625,6 +3554,7 @@
try {
r.activity.onStateNotSaved();
r.activity.mFragments.noteStateNotSaved();
+ checkAndBlockForNetworkAccess();
if (r.pendingIntents != null) {
deliverNewIntents(r, r.pendingIntents);
r.pendingIntents = null;
@@ -4014,6 +3944,14 @@
ActivityManager.getService().activityStopped(
activity.token, state, persistentState, description);
} catch (RemoteException ex) {
+ // Dump statistics about bundle to help developers debug
+ final LogWriter writer = new LogWriter(Log.WARN, TAG);
+ final IndentingPrintWriter pw = new IndentingPrintWriter(writer, " ");
+ pw.println("Bundle stats:");
+ Bundle.dumpStats(pw, state);
+ pw.println("PersistableBundle stats:");
+ Bundle.dumpStats(pw, persistentState);
+
if (ex instanceof TransactionTooLargeException
&& activity.packageInfo.getTargetSdkVersion() < Build.VERSION_CODES.N) {
Log.e(TAG, "App sent too much data in instance state, so it was ignored", ex);
@@ -4380,6 +4318,7 @@
}
}
}
+ checkAndBlockForNetworkAccess();
deliverResults(r, res.results);
if (resumed) {
r.activity.performResume();
@@ -5216,11 +5155,7 @@
Slog.w(TAG, "Profiling failed on path " + profilerInfo.profileFile
+ " -- can the process access this path?");
} finally {
- try {
- profilerInfo.profileFd.close();
- } catch (IOException e) {
- Slog.w(TAG, "Failure closing profile fd", e);
- }
+ profilerInfo.closeFd();
}
} else {
switch (profileType) {
@@ -5243,8 +5178,13 @@
}
}
- static final void handleDumpHeap(boolean managed, DumpHeapData dhd) {
- if (managed) {
+ static void handleDumpHeap(DumpHeapData dhd) {
+ if (dhd.runGc) {
+ System.gc();
+ System.runFinalization();
+ System.gc();
+ }
+ if (dhd.managed) {
try {
Debug.dumpHprofData(dhd.path, dhd.fd.getFileDescriptor());
} catch (IOException e) {
@@ -5257,6 +5197,8 @@
Slog.w(TAG, "Failure closing profile fd", e);
}
}
+ } else if (dhd.mallocInfo) {
+ Debug.dumpNativeMallocInfo(dhd.fd.getFileDescriptor());
} else {
Debug.dumpNativeHeap(dhd.fd.getFileDescriptor());
}
@@ -5765,11 +5707,12 @@
// Allow disk access during application and provider setup. This could
// block processing ordered broadcasts, but later processing would
// probably end up doing the same disk access.
+ Application app;
final StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskWrites();
try {
// If the app is being launched for full backup or restore, bring it up in
// a restricted environment with the base application class.
- Application app = data.info.makeApplication(data.restrictedBackupMode, null);
+ app = data.info.makeApplication(data.restrictedBackupMode, null);
mInitialApplication = app;
// don't bring up providers in restricted mode; they may depend on the
@@ -5793,20 +5736,20 @@
"Exception thrown in onCreate() of "
+ data.instrumentationName + ": " + e.toString(), e);
}
-
- try {
- mInstrumentation.callApplicationOnCreate(app);
- } catch (Exception e) {
- if (!mInstrumentation.onException(app, e)) {
- throw new RuntimeException(
- "Unable to create application " + app.getClass().getName()
- + ": " + e.toString(), e);
- }
- }
} finally {
StrictMode.setThreadPolicy(savedPolicy);
}
+ try {
+ mInstrumentation.callApplicationOnCreate(app);
+ } catch (Exception e) {
+ if (!mInstrumentation.onException(app, e)) {
+ throw new RuntimeException(
+ "Unable to create application " + app.getClass().getName()
+ + ": " + e.toString(), e);
+ }
+ }
+
// Preload fonts resources
FontsContract.setApplicationContextForResources(appContext);
try {
@@ -6554,7 +6497,6 @@
public static void main(String[] args) {
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ActivityThreadMain");
- SamplingProfilerIntegration.start();
// CloseGuard defaults to true and can be quite spammy. We
// disable it here, but selectively enable it later (via
diff --git a/core/java/android/app/ActivityView.java b/core/java/android/app/ActivityView.java
index 29b83dc..5dd47ac 100644
--- a/core/java/android/app/ActivityView.java
+++ b/core/java/android/app/ActivityView.java
@@ -1,5 +1,5 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
+/**
+ * Copyright (c) 2017 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.
@@ -16,17 +16,12 @@
package android.app;
-import static android.app.ActivityManager.START_CANCELED;
-
+import android.annotation.NonNull;
import android.content.Context;
-import android.content.ContextWrapper;
-import android.content.IIntentSender;
import android.content.Intent;
-import android.content.IntentSender;
-import android.graphics.SurfaceTexture;
-import android.os.IBinder;
-import android.os.Message;
-import android.os.OperationCanceledException;
+import android.hardware.display.DisplayManager;
+import android.hardware.display.VirtualDisplay;
+import android.hardware.input.InputManager;
import android.os.RemoteException;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
@@ -35,163 +30,177 @@
import android.view.InputEvent;
import android.view.MotionEvent;
import android.view.Surface;
-import android.view.TextureView;
-import android.view.TextureView.SurfaceTextureListener;
-import android.view.View;
+import android.view.SurfaceHolder;
+import android.view.SurfaceView;
import android.view.ViewGroup;
import android.view.WindowManager;
+
import dalvik.system.CloseGuard;
-import java.lang.ref.WeakReference;
-import java.util.ArrayDeque;
-import java.util.concurrent.Executor;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import com.android.internal.annotations.GuardedBy;
-
-
-/** @hide */
+/**
+ * Activity container that allows launching activities into itself and does input forwarding.
+ * <p>Creation of this view is only allowed to callers who have
+ * {@link android.Manifest.permission#INJECT_EVENTS} permission.
+ * <p>Activity launching into this container is restricted by the same rules that apply to launching
+ * on VirtualDisplays.
+ * @hide
+ */
public class ActivityView extends ViewGroup {
+
+ private static final String DISPLAY_NAME = "ActivityViewVirtualDisplay";
private static final String TAG = "ActivityView";
- private static final boolean DEBUG = false;
- private static final int MSG_SET_SURFACE = 1;
-
- private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
- private static final int MINIMUM_POOL_SIZE = 1;
- private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
- private static final int KEEP_ALIVE = 1;
-
- private static final ThreadFactory sThreadFactory = new ThreadFactory() {
- private final AtomicInteger mCount = new AtomicInteger(1);
-
- public Thread newThread(Runnable r) {
- return new Thread(r, "ActivityView #" + mCount.getAndIncrement());
- }
- };
-
- private static final BlockingQueue<Runnable> sPoolWorkQueue =
- new LinkedBlockingQueue<Runnable>(128);
-
- /**
- * An {@link Executor} that can be used to execute tasks in parallel.
- */
- private static final Executor sExecutor = new ThreadPoolExecutor(MINIMUM_POOL_SIZE,
- MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory);
-
-
- private static class SerialExecutor implements Executor {
- private final ArrayDeque<Runnable> mTasks = new ArrayDeque<Runnable>();
- private Runnable mActive;
-
- public synchronized void execute(final Runnable r) {
- mTasks.offer(new Runnable() {
- public void run() {
- try {
- r.run();
- } finally {
- scheduleNext();
- }
- }
- });
- if (mActive == null) {
- scheduleNext();
- }
- }
-
- protected synchronized void scheduleNext() {
- if ((mActive = mTasks.poll()) != null) {
- sExecutor.execute(mActive);
- }
- }
- }
-
- private final SerialExecutor mExecutor = new SerialExecutor();
-
- private final int mDensityDpi;
- private final TextureView mTextureView;
-
- @GuardedBy("mActivityContainerLock")
- private ActivityContainerWrapper mActivityContainer;
- private Object mActivityContainerLock = new Object();
-
- private Activity mActivity;
- private int mWidth;
- private int mHeight;
+ private VirtualDisplay mVirtualDisplay;
+ private final SurfaceView mSurfaceView;
private Surface mSurface;
- private int mLastVisibility;
- private ActivityViewCallback mActivityViewCallback;
+ private final SurfaceCallback mSurfaceCallback;
+ private StateCallback mActivityViewCallback;
+
+ private IInputForwarder mInputForwarder;
+
+ private final CloseGuard mGuard = CloseGuard.get();
+ private boolean mOpened; // Protected by mGuard.
public ActivityView(Context context) {
- this(context, null);
+ this(context, null /* attrs */);
}
public ActivityView(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
+ this(context, attrs, 0 /* defStyle */);
}
public ActivityView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
- while (context instanceof ContextWrapper) {
- if (context instanceof Activity) {
- mActivity = (Activity)context;
- break;
- }
- context = ((ContextWrapper)context).getBaseContext();
- }
- if (mActivity == null) {
- throw new IllegalStateException("The ActivityView's Context is not an Activity.");
- }
+ mSurfaceView = new SurfaceView(context);
+ mSurfaceCallback = new SurfaceCallback();
+ mSurfaceView.getHolder().addCallback(mSurfaceCallback);
+ addView(mSurfaceView);
+ mOpened = true;
+ mGuard.open("release");
+ }
+
+ /** Callback that notifies when the container is ready or destroyed. */
+ public abstract static class StateCallback {
+ /**
+ * Called when the container is ready for launching activities. Calling
+ * {@link #startActivity(Intent)} prior to this callback will result in an
+ * {@link IllegalStateException}.
+ *
+ * @see #startActivity(Intent)
+ */
+ public abstract void onActivityViewReady(ActivityView view);
+ /**
+ * Called when the container can no longer launch activities. Calling
+ * {@link #startActivity(Intent)} after this callback will result in an
+ * {@link IllegalStateException}.
+ *
+ * @see #startActivity(Intent)
+ */
+ public abstract void onActivityViewDestroyed(ActivityView view);
+ }
+
+ /**
+ * Set the callback to be notified about state changes.
+ * <p>This class must finish initializing before {@link #startActivity(Intent)} can be called.
+ * <p>Note: If the instance was ready prior to this call being made, then
+ * {@link StateCallback#onActivityViewReady(ActivityView)} will be called from within
+ * this method call.
+ *
+ * @param callback The callback to report events to.
+ *
+ * @see StateCallback
+ * @see #startActivity(Intent)
+ */
+ public void setCallback(StateCallback callback) {
+ mActivityViewCallback = callback;
+
+ if (mVirtualDisplay != null && mActivityViewCallback != null) {
+ mActivityViewCallback.onActivityViewReady(this);
+ }
+ }
+
+ /**
+ * Launch a new activity into this container.
+ * <p>Activity resolved by the provided {@link Intent} must have
+ * {@link android.R.attr#resizeableActivity} attribute set to {@code true} in order to be
+ * launched here. Also, if activity is not owned by the owner of this container, it must allow
+ * embedding and the caller must have permission to embed.
+ * <p>Note: This class must finish initializing and
+ * {@link StateCallback#onActivityViewReady(ActivityView)} callback must be triggered before
+ * this method can be called.
+ *
+ * @param intent Intent used to launch an activity.
+ *
+ * @see StateCallback
+ * @see #startActivity(PendingIntent)
+ */
+ public void startActivity(@NonNull Intent intent) {
+ final ActivityOptions options = prepareActivityOptions();
+ getContext().startActivity(intent, options.toBundle());
+ }
+
+ /**
+ * Launch a new activity into this container.
+ * <p>Activity resolved by the provided {@link PendingIntent} must have
+ * {@link android.R.attr#resizeableActivity} attribute set to {@code true} in order to be
+ * launched here. Also, if activity is not owned by the owner of this container, it must allow
+ * embedding and the caller must have permission to embed.
+ * <p>Note: This class must finish initializing and
+ * {@link StateCallback#onActivityViewReady(ActivityView)} callback must be triggered before
+ * this method can be called.
+ *
+ * @param pendingIntent Intent used to launch an activity.
+ *
+ * @see StateCallback
+ * @see #startActivity(Intent)
+ */
+ public void startActivity(@NonNull PendingIntent pendingIntent) {
+ final ActivityOptions options = prepareActivityOptions();
try {
- mActivityContainer = new ActivityContainerWrapper(
- ActivityManager.getService().createVirtualActivityContainer(
- mActivity.getActivityToken(), new ActivityContainerCallback(this)));
- } catch (RemoteException e) {
- throw new RuntimeException("ActivityView: Unable to create ActivityContainer. "
- + e);
+ pendingIntent.send(null /* context */, 0 /* code */, null /* intent */,
+ null /* onFinished */, null /* handler */, null /* requiredPermission */,
+ options.toBundle());
+ } catch (PendingIntent.CanceledException e) {
+ throw new RuntimeException(e);
}
+ }
- mTextureView = new TextureView(context);
- mTextureView.setSurfaceTextureListener(new ActivityViewSurfaceTextureListener());
- addView(mTextureView);
+ /**
+ * Check if container is ready to launch and create {@link ActivityOptions} to target the
+ * virtual display.
+ */
+ private ActivityOptions prepareActivityOptions() {
+ if (mVirtualDisplay == null) {
+ throw new IllegalStateException(
+ "Trying to start activity before ActivityView is ready.");
+ }
+ final ActivityOptions options = ActivityOptions.makeBasic();
+ options.setLaunchDisplayId(mVirtualDisplay.getDisplay().getDisplayId());
+ return options;
+ }
- WindowManager wm = (WindowManager)mActivity.getSystemService(Context.WINDOW_SERVICE);
- DisplayMetrics metrics = new DisplayMetrics();
- wm.getDefaultDisplay().getMetrics(metrics);
- mDensityDpi = metrics.densityDpi;
-
- mLastVisibility = getVisibility();
-
- if (DEBUG) Log.v(TAG, "ctor()");
+ /**
+ * Release this container. Activity launching will no longer be permitted.
+ * <p>Note: Calling this method is allowed after
+ * {@link StateCallback#onActivityViewReady(ActivityView)} callback was triggered and before
+ * {@link StateCallback#onActivityViewDestroyed(ActivityView)}.
+ *
+ * @see StateCallback
+ */
+ public void release() {
+ if (mVirtualDisplay == null) {
+ throw new IllegalStateException(
+ "Trying to release container that is not initialized.");
+ }
+ performRelease();
}
@Override
- protected void onLayout(boolean changed, int l, int t, int r, int b) {
- mTextureView.layout(0, 0, r - l, b - t);
- }
-
- @Override
- protected void onVisibilityChanged(View changedView, final int visibility) {
- super.onVisibilityChanged(changedView, visibility);
-
- if (mSurface != null && (visibility == View.GONE || mLastVisibility == View.GONE)) {
- if (DEBUG) Log.v(TAG, "visibility changed; enqueing runnable");
- final Surface surface = (visibility == View.GONE) ? null : mSurface;
- setSurfaceAsync(surface, mWidth, mHeight, mDensityDpi, false);
- }
- mLastVisibility = visibility;
- }
-
- private boolean injectInputEvent(InputEvent event) {
- return mActivityContainer != null && mActivityContainer.injectEvent(event);
+ public void onLayout(boolean changed, int l, int t, int r, int b) {
+ mSurfaceView.layout(0 /* left */, 0 /* top */, r - l /* right */, b - t /* bottom */);
}
@Override
@@ -209,76 +218,86 @@
return super.onGenericMotionEvent(event);
}
- @Override
- public void onAttachedToWindow() {
- if (DEBUG) Log.v(TAG, "onAttachedToWindow(): mActivityContainer=" + mActivityContainer +
- " mSurface=" + mSurface);
- }
-
- @Override
- public void onDetachedFromWindow() {
- if (DEBUG) Log.v(TAG, "onDetachedFromWindow(): mActivityContainer=" + mActivityContainer +
- " mSurface=" + mSurface);
- }
-
- public boolean isAttachedToDisplay() {
- return mSurface != null;
- }
-
- public void startActivity(Intent intent) {
- if (mActivityContainer == null) {
- throw new IllegalStateException("Attempt to call startActivity after release");
+ private boolean injectInputEvent(InputEvent event) {
+ if (mInputForwarder != null) {
+ try {
+ return mInputForwarder.forwardEvent(event);
+ } catch (RemoteException e) {
+ e.rethrowAsRuntimeException();
+ }
}
- if (mSurface == null) {
- throw new IllegalStateException("Surface not yet created.");
+ return false;
+ }
+
+ private class SurfaceCallback implements SurfaceHolder.Callback {
+ @Override
+ public void surfaceCreated(SurfaceHolder surfaceHolder) {
+ if (mVirtualDisplay == null) {
+ mSurface = mSurfaceView.getHolder().getSurface();
+ initVirtualDisplay();
+ if (mVirtualDisplay != null && mActivityViewCallback != null) {
+ mActivityViewCallback.onActivityViewReady(ActivityView.this);
+ }
+ } else {
+ mVirtualDisplay.setSurface(surfaceHolder.getSurface());
+ }
}
- if (DEBUG) Log.v(TAG, "startActivity(): intent=" + intent + " " +
- (isAttachedToDisplay() ? "" : "not") + " attached");
- if (mActivityContainer.startActivity(intent) == START_CANCELED) {
- throw new OperationCanceledException();
+
+ @Override
+ public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) {
+ if (mVirtualDisplay != null) {
+ mVirtualDisplay.resize(width, height, getBaseDisplayDensity());
+ }
+ }
+
+ @Override
+ public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
+ mSurface.release();
+ mSurface = null;
+ if (mVirtualDisplay != null) {
+ mVirtualDisplay.setSurface(null);
+ }
}
}
- public void startActivity(IntentSender intentSender) {
- if (mActivityContainer == null) {
- throw new IllegalStateException("Attempt to call startActivity after release");
+ private void initVirtualDisplay() {
+ if (mVirtualDisplay != null) {
+ throw new IllegalStateException("Trying to initialize for the second time.");
}
- if (mSurface == null) {
- throw new IllegalStateException("Surface not yet created.");
- }
- if (DEBUG) Log.v(TAG, "startActivityIntentSender(): intentSender=" + intentSender + " " +
- (isAttachedToDisplay() ? "" : "not") + " attached");
- final IIntentSender iIntentSender = intentSender.getTarget();
- if (mActivityContainer.startActivityIntentSender(iIntentSender) == START_CANCELED) {
- throw new OperationCanceledException();
- }
- }
- public void startActivity(PendingIntent pendingIntent) {
- if (mActivityContainer == null) {
- throw new IllegalStateException("Attempt to call startActivity after release");
- }
- if (mSurface == null) {
- throw new IllegalStateException("Surface not yet created.");
- }
- if (DEBUG) Log.v(TAG, "startActivityPendingIntent(): PendingIntent=" + pendingIntent + " "
- + (isAttachedToDisplay() ? "" : "not") + " attached");
- final IIntentSender iIntentSender = pendingIntent.getTarget();
- if (mActivityContainer.startActivityIntentSender(iIntentSender) == START_CANCELED) {
- throw new OperationCanceledException();
- }
- }
-
- public void release() {
- if (DEBUG) Log.v(TAG, "release() mActivityContainer=" + mActivityContainer +
- " mSurface=" + mSurface);
- if (mActivityContainer == null) {
- Log.e(TAG, "Duplicate call to release");
+ final int width = mSurfaceView.getWidth();
+ final int height = mSurfaceView.getHeight();
+ final DisplayManager displayManager = mContext.getSystemService(DisplayManager.class);
+ mVirtualDisplay = displayManager.createVirtualDisplay(
+ DISPLAY_NAME + "@" + System.identityHashCode(this),
+ width, height, getBaseDisplayDensity(), mSurface, 0 /* flags */);
+ if (mVirtualDisplay == null) {
+ Log.e(TAG, "Failed to initialize ActivityView");
return;
}
- synchronized (mActivityContainerLock) {
- mActivityContainer.release();
- mActivityContainer = null;
+
+ mInputForwarder = InputManager.getInstance().createInputForwarder(
+ mVirtualDisplay.getDisplay().getDisplayId());
+ }
+
+ private void performRelease() {
+ if (!mOpened) {
+ return;
+ }
+
+ mSurfaceView.getHolder().removeCallback(mSurfaceCallback);
+
+ if (mInputForwarder != null) {
+ mInputForwarder = null;
+ }
+
+ final boolean displayReleased;
+ if (mVirtualDisplay != null) {
+ mVirtualDisplay.release();
+ mVirtualDisplay = null;
+ displayReleased = true;
+ } else {
+ displayReleased = false;
}
if (mSurface != null) {
@@ -286,232 +305,31 @@
mSurface = null;
}
- mTextureView.setSurfaceTextureListener(null);
+ if (displayReleased && mActivityViewCallback != null) {
+ mActivityViewCallback.onActivityViewDestroyed(this);
+ }
+
+ mGuard.close();
+ mOpened = false;
}
- private void setSurfaceAsync(final Surface surface, final int width, final int height,
- final int densityDpi, final boolean callback) {
- mExecutor.execute(new Runnable() {
- public void run() {
- try {
- synchronized (mActivityContainerLock) {
- if (mActivityContainer != null) {
- mActivityContainer.setSurface(surface, width, height, densityDpi);
- }
- }
- } catch (RemoteException e) {
- throw new RuntimeException(
- "ActivityView: Unable to set surface of ActivityContainer. ",
- e);
- }
- if (callback) {
- post(new Runnable() {
- @Override
- public void run() {
- if (mActivityViewCallback != null) {
- if (surface != null) {
- mActivityViewCallback.onSurfaceAvailable(ActivityView.this);
- } else {
- mActivityViewCallback.onSurfaceDestroyed(ActivityView.this);
- }
- }
- }
- });
- }
- }
- });
+ /** Get density of the hosting display. */
+ private int getBaseDisplayDensity() {
+ final WindowManager wm = mContext.getSystemService(WindowManager.class);
+ final DisplayMetrics metrics = new DisplayMetrics();
+ wm.getDefaultDisplay().getMetrics(metrics);
+ return metrics.densityDpi;
}
- /**
- * Set the callback to use to report certain state changes.
- *
- * Note: If the surface has been created prior to this call being made, then
- * ActivityViewCallback.onSurfaceAvailable will be called from within setCallback.
- *
- * @param callback The callback to report events to.
- *
- * @see ActivityViewCallback
- */
- public void setCallback(ActivityViewCallback callback) {
- mActivityViewCallback = callback;
-
- if (mSurface != null) {
- mActivityViewCallback.onSurfaceAvailable(this);
- }
- }
-
- public static abstract class ActivityViewCallback {
- /**
- * Called when all activities in the ActivityView have completed and been removed. Register
- * using {@link ActivityView#setCallback(ActivityViewCallback)}. Each ActivityView may
- * have at most one callback registered.
- */
- public abstract void onAllActivitiesComplete(ActivityView view);
- /**
- * Called when the surface is ready to be drawn to. Calling startActivity prior to this
- * callback will result in an IllegalStateException.
- */
- public abstract void onSurfaceAvailable(ActivityView view);
- /**
- * Called when the surface has been removed. Calling startActivity after this callback
- * will result in an IllegalStateException.
- */
- public abstract void onSurfaceDestroyed(ActivityView view);
- }
-
- private class ActivityViewSurfaceTextureListener implements SurfaceTextureListener {
- @Override
- public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width,
- int height) {
- if (mActivityContainer == null) {
- return;
+ @Override
+ protected void finalize() throws Throwable {
+ try {
+ if (mGuard != null) {
+ mGuard.warnIfOpen();
+ performRelease();
}
- if (DEBUG) Log.d(TAG, "onSurfaceTextureAvailable: width=" + width + " height="
- + height);
- mWidth = width;
- mHeight = height;
- mSurface = new Surface(surfaceTexture);
- setSurfaceAsync(mSurface, mWidth, mHeight, mDensityDpi, true);
+ } finally {
+ super.finalize();
}
-
- @Override
- public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int width,
- int height) {
- if (mActivityContainer == null) {
- return;
- }
- if (DEBUG) Log.d(TAG, "onSurfaceTextureSizeChanged: w=" + width + " h=" + height);
- }
-
- @Override
- public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
- if (mActivityContainer == null) {
- return true;
- }
- if (DEBUG) Log.d(TAG, "onSurfaceTextureDestroyed");
- mSurface.release();
- mSurface = null;
- setSurfaceAsync(null, mWidth, mHeight, mDensityDpi, true);
- return true;
- }
-
- @Override
- public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {
-// Log.d(TAG, "onSurfaceTextureUpdated");
- }
-
- }
-
- private static class ActivityContainerCallback extends IActivityContainerCallback.Stub {
- private final WeakReference<ActivityView> mActivityViewWeakReference;
-
- ActivityContainerCallback(ActivityView activityView) {
- mActivityViewWeakReference = new WeakReference<>(activityView);
- }
-
- @Override
- public void setVisible(IBinder container, boolean visible) {
- if (DEBUG) Log.v(TAG, "setVisible(): container=" + container + " visible=" + visible +
- " ActivityView=" + mActivityViewWeakReference.get());
- }
-
- @Override
- public void onAllActivitiesComplete(IBinder container) {
- final ActivityView activityView = mActivityViewWeakReference.get();
- if (activityView != null) {
- final ActivityViewCallback callback = activityView.mActivityViewCallback;
- if (callback != null) {
- final WeakReference<ActivityViewCallback> callbackRef =
- new WeakReference<>(callback);
- activityView.post(new Runnable() {
- @Override
- public void run() {
- ActivityViewCallback callback = callbackRef.get();
- if (callback != null) {
- callback.onAllActivitiesComplete(activityView);
- }
- }
- });
- }
- }
- }
- }
-
- private static class ActivityContainerWrapper {
- private final IActivityContainer mIActivityContainer;
- private final CloseGuard mGuard = CloseGuard.get();
- boolean mOpened; // Protected by mGuard.
-
- ActivityContainerWrapper(IActivityContainer container) {
- mIActivityContainer = container;
- mOpened = true;
- mGuard.open("release");
- }
-
- void setSurface(Surface surface, int width, int height, int density)
- throws RemoteException {
- mIActivityContainer.setSurface(surface, width, height, density);
- }
-
- int startActivity(Intent intent) {
- try {
- return mIActivityContainer.startActivity(intent);
- } catch (RemoteException e) {
- throw new RuntimeException("ActivityView: Unable to startActivity. " + e);
- }
- }
-
- int startActivityIntentSender(IIntentSender intentSender) {
- try {
- return mIActivityContainer.startActivityIntentSender(intentSender);
- } catch (RemoteException e) {
- throw new RuntimeException(
- "ActivityView: Unable to startActivity from IntentSender. " + e);
- }
- }
-
- int getDisplayId() {
- try {
- return mIActivityContainer.getDisplayId();
- } catch (RemoteException e) {
- return -1;
- }
- }
-
- boolean injectEvent(InputEvent event) {
- try {
- return mIActivityContainer.injectEvent(event);
- } catch (RemoteException e) {
- return false;
- }
- }
-
- void release() {
- synchronized (mGuard) {
- if (mOpened) {
- if (DEBUG) Log.v(TAG, "ActivityContainerWrapper: release called");
- try {
- mIActivityContainer.release();
- mGuard.close();
- } catch (RemoteException e) {
- }
- mOpened = false;
- }
- }
- }
-
- @Override
- protected void finalize() throws Throwable {
- if (DEBUG) Log.v(TAG, "ActivityContainerWrapper: finalize called");
- try {
- if (mGuard != null) {
- mGuard.warnIfOpen();
- release();
- }
- } finally {
- super.finalize();
- }
- }
-
}
}
diff --git a/core/java/android/app/Application.java b/core/java/android/app/Application.java
index 7fb5e2e..cc23ec9 100644
--- a/core/java/android/app/Application.java
+++ b/core/java/android/app/Application.java
@@ -300,7 +300,6 @@
* @param cl The default classloader to use for instantiation.
* @param className The class to be instantiated.
* @param intent Intent creating the class.
- * @hide
*/
public Activity instantiateActivity(ClassLoader cl, String className, Intent intent) {
return null;
@@ -313,7 +312,6 @@
* @param cl The default classloader to use for instantiation.
* @param className The class to be instantiated.
* @param intent Intent creating the class.
- * @hide
*/
public BroadcastReceiver instantiateReceiver(ClassLoader cl, String className, Intent intent) {
return null;
@@ -326,7 +324,6 @@
* @param cl The default classloader to use for instantiation.
* @param className The class to be instantiated.
* @param intent Intent creating the class.
- * @hide
*/
public Service instantiateService(ClassLoader cl, String className, Intent intent) {
return null;
@@ -338,7 +335,6 @@
* classes. Return null to use the default creation flow.
* @param cl The default classloader to use for instantiation.
* @param className The class to be instantiated.
- * @hide
*/
public ContentProvider instantiateProvider(ClassLoader cl, String className) {
return null;
@@ -350,7 +346,6 @@
* classes. Return null to use the default creation flow.
* @param cl The default classloader to use for instantiation.
* @param className The class to be instantiated.
- * @hide
*/
public BackupAgent instantiateBackupAgent(ClassLoader cl, String className) {
return null;
@@ -362,7 +357,6 @@
* classes. Return null to use the default creation flow.
* @param cl The default classloader to use for instantiation.
* @param className The class to be instantiated.
- * @hide
*/
public Instrumentation instantiateInstrumentation(ClassLoader cl, String className) {
return null;
diff --git a/core/java/android/app/ApplicationLoaders.java b/core/java/android/app/ApplicationLoaders.java
index 2062930..b7c1f4e 100644
--- a/core/java/android/app/ApplicationLoaders.java
+++ b/core/java/android/app/ApplicationLoaders.java
@@ -18,9 +18,8 @@
import android.os.Build;
import android.os.Trace;
-import android.text.TextUtils;
import android.util.ArrayMap;
-import com.android.internal.os.PathClassLoaderFactory;
+import com.android.internal.os.ClassLoaderFactory;
import dalvik.system.PathClassLoader;
/** @hide */
@@ -31,15 +30,16 @@
ClassLoader getClassLoader(String zip, int targetSdkVersion, boolean isBundled,
String librarySearchPath, String libraryPermittedPath,
- ClassLoader parent) {
+ ClassLoader parent, String classLoaderName) {
// For normal usage the cache key used is the same as the zip path.
return getClassLoader(zip, targetSdkVersion, isBundled, librarySearchPath,
- libraryPermittedPath, parent, zip);
+ libraryPermittedPath, parent, zip, classLoaderName);
}
private ClassLoader getClassLoader(String zip, int targetSdkVersion, boolean isBundled,
String librarySearchPath, String libraryPermittedPath,
- ClassLoader parent, String cacheKey) {
+ ClassLoader parent, String cacheKey,
+ String classLoaderName) {
/*
* This is the parent we use if they pass "null" in. In theory
* this should be the "system" class loader; in practice we
@@ -66,28 +66,25 @@
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, zip);
- PathClassLoader pathClassloader = PathClassLoaderFactory.createClassLoader(
- zip,
- librarySearchPath,
- libraryPermittedPath,
- parent,
- targetSdkVersion,
- isBundled);
+ ClassLoader classloader = ClassLoaderFactory.createClassLoader(
+ zip, librarySearchPath, libraryPermittedPath, parent,
+ targetSdkVersion, isBundled, classLoaderName);
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "setupVulkanLayerPath");
- setupVulkanLayerPath(pathClassloader, librarySearchPath);
+ setupVulkanLayerPath(classloader, librarySearchPath);
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
- mLoaders.put(cacheKey, pathClassloader);
- return pathClassloader;
+ mLoaders.put(cacheKey, classloader);
+ return classloader;
}
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, zip);
- PathClassLoader pathClassloader = new PathClassLoader(zip, parent);
+ ClassLoader loader = ClassLoaderFactory.createClassLoader(
+ zip, null, parent, classLoaderName);
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
- return pathClassloader;
+ return loader;
}
}
@@ -105,7 +102,7 @@
// The cache key is passed separately to enable the stub WebView to be cached under the
// stub's APK path, when the actual package path is the donor APK.
return getClassLoader(packagePath, Build.VERSION.SDK_INT, false, libsPath, null, null,
- cacheKey);
+ cacheKey, null /* classLoaderName */);
}
private static native void setupVulkanLayerPath(ClassLoader classLoader, String librarySearchPath);
@@ -122,7 +119,7 @@
baseDexClassLoader.addDexPath(dexPath);
}
- private final ArrayMap<String, ClassLoader> mLoaders = new ArrayMap<String, ClassLoader>();
+ private final ArrayMap<String, ClassLoader> mLoaders = new ArrayMap<>();
private static final ApplicationLoaders gApplicationLoaders = new ApplicationLoaders();
}
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index 318c7ac..c48be77 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -60,11 +60,10 @@
import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
-import android.os.SystemProperties;
import android.os.Trace;
import android.os.UserHandle;
+import android.os.UserManager;
import android.os.storage.IStorageManager;
-import android.os.storage.StorageManager;
import android.system.ErrnoException;
import android.system.Os;
import android.system.OsConstants;
@@ -370,13 +369,6 @@
return getSharedPreferences(file, mode);
}
- private boolean isBuggy() {
- // STOPSHIP: fix buggy apps
- if (SystemProperties.getBoolean("fw.ignore_buggy", false)) return false;
- if ("com.google.android.tts".equals(getApplicationInfo().packageName)) return true;
- return false;
- }
-
@Override
public SharedPreferences getSharedPreferences(File file, int mode) {
SharedPreferencesImpl sp;
@@ -387,9 +379,8 @@
checkMode(mode);
if (getApplicationInfo().targetSdkVersion >= android.os.Build.VERSION_CODES.O) {
if (isCredentialProtectedStorage()
- && !getSystemService(StorageManager.class).isUserKeyUnlocked(
- UserHandle.myUserId())
- && !isBuggy()) {
+ && !getSystemService(UserManager.class)
+ .isUserUnlockingOrUnlocked(UserHandle.myUserId())) {
throw new IllegalStateException("SharedPreferences in credential encrypted "
+ "storage are not available until after user is unlocked");
}
@@ -628,7 +619,8 @@
@Override
public File getExternalFilesDir(String type) {
// Operates on primary external storage
- return getExternalFilesDirs(type)[0];
+ final File[] dirs = getExternalFilesDirs(type);
+ return (dirs != null && dirs.length > 0) ? dirs[0] : null;
}
@Override
@@ -645,7 +637,8 @@
@Override
public File getObbDir() {
// Operates on primary external storage
- return getObbDirs()[0];
+ final File[] dirs = getObbDirs();
+ return (dirs != null && dirs.length > 0) ? dirs[0] : null;
}
@Override
@@ -679,7 +672,8 @@
@Override
public File getExternalCacheDir() {
// Operates on primary external storage
- return getExternalCacheDirs()[0];
+ final File[] dirs = getExternalCacheDirs();
+ return (dirs != null && dirs.length > 0) ? dirs[0] : null;
}
@Override
diff --git a/core/java/android/app/DownloadManager.java b/core/java/android/app/DownloadManager.java
index 5baaeb3..b444f17 100644
--- a/core/java/android/app/DownloadManager.java
+++ b/core/java/android/app/DownloadManager.java
@@ -18,9 +18,9 @@
import android.annotation.Nullable;
import android.annotation.SdkConstant;
+import android.annotation.SdkConstant.SdkConstantType;
import android.annotation.SystemApi;
import android.annotation.SystemService;
-import android.annotation.SdkConstant.SdkConstantType;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
@@ -36,8 +36,8 @@
import android.os.FileUtils;
import android.os.ParcelFileDescriptor;
import android.provider.Downloads;
-import android.provider.Settings;
import android.provider.MediaStore.Images;
+import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException;
import android.text.TextUtils;
import android.util.Pair;
@@ -393,7 +393,6 @@
private int mFlags = 0;
private boolean mIsVisibleInDownloadsUi = true;
private boolean mScannable = false;
- private boolean mUseSystemCache = false;
/** if a file is designated as a MediaScanner scannable file, the following value is
* stored in the database column {@link Downloads.Impl#COLUMN_MEDIA_SCANNED}.
*/
@@ -474,24 +473,6 @@
}
/**
- * Set the local destination for the downloaded file to the system cache dir (/cache).
- * This is only available to System apps with the permission
- * {@link android.Manifest.permission#ACCESS_CACHE_FILESYSTEM}.
- * <p>
- * The downloaded file is not scanned by MediaScanner.
- * But it can be made scannable by calling {@link #allowScanningByMediaScanner()}.
- * <p>
- * Files downloaded to /cache may be deleted by the system at any time to reclaim space.
- *
- * @return this object
- * @hide
- */
- public Request setDestinationToSystemCache() {
- mUseSystemCache = true;
- return this;
- }
-
- /**
* Set the local destination for the downloaded file to a path within
* the application's external files directory (as returned by
* {@link Context#getExternalFilesDir(String)}.
@@ -772,13 +753,13 @@
values.put(Downloads.Impl.COLUMN_NOTIFICATION_PACKAGE, packageName);
if (mDestinationUri != null) {
- values.put(Downloads.Impl.COLUMN_DESTINATION, Downloads.Impl.DESTINATION_FILE_URI);
- values.put(Downloads.Impl.COLUMN_FILE_NAME_HINT, mDestinationUri.toString());
+ values.put(Downloads.Impl.COLUMN_DESTINATION,
+ Downloads.Impl.DESTINATION_FILE_URI);
+ values.put(Downloads.Impl.COLUMN_FILE_NAME_HINT,
+ mDestinationUri.toString());
} else {
values.put(Downloads.Impl.COLUMN_DESTINATION,
- (this.mUseSystemCache) ?
- Downloads.Impl.DESTINATION_SYSTEMCACHE_PARTITION :
- Downloads.Impl.DESTINATION_CACHE_PARTITION_PURGEABLE);
+ Downloads.Impl.DESTINATION_CACHE_PARTITION_PURGEABLE);
}
// is the file supposed to be media-scannable?
values.put(Downloads.Impl.COLUMN_MEDIA_SCANNED, (mScannable) ? SCANNABLE_VALUE_YES :
diff --git a/core/java/android/app/Fragment.java b/core/java/android/app/Fragment.java
index 66dc6a1..9377345 100644
--- a/core/java/android/app/Fragment.java
+++ b/core/java/android/app/Fragment.java
@@ -42,7 +42,6 @@
import android.util.ArrayMap;
import android.util.AttributeSet;
import android.util.DebugUtils;
-import android.util.Log;
import android.util.SparseArray;
import android.util.SuperNotCalledException;
import android.view.ContextMenu;
@@ -406,6 +405,11 @@
// getLayoutInflater()
LayoutInflater mLayoutInflater;
+ // Keep track of whether or not this Fragment has run performCreate(). Retained instance
+ // fragments can have mRetaining set to true without going through creation, so we must
+ // track it separately.
+ boolean mIsCreated;
+
/**
* State information that has been retrieved from a fragment instance
* through {@link FragmentManager#saveFragmentInstanceState(Fragment)
@@ -2483,6 +2487,7 @@
mState = CREATED;
mCalled = false;
onCreate(savedInstanceState);
+ mIsCreated = true;
if (!mCalled) {
throw new SuperNotCalledException("Fragment " + this
+ " did not call through to super.onCreate()");
@@ -2759,6 +2764,7 @@
}
mState = INITIALIZING;
mCalled = false;
+ mIsCreated = false;
onDestroy();
if (!mCalled) {
throw new SuperNotCalledException("Fragment " + this
diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java
index 6cb987c..ba5ea21 100644
--- a/core/java/android/app/FragmentManager.java
+++ b/core/java/android/app/FragmentManager.java
@@ -679,7 +679,8 @@
ArrayList<Integer> mAvailBackStackIndices;
ArrayList<OnBackStackChangedListener> mBackStackChangeListeners;
- CopyOnWriteArrayList<Pair<FragmentLifecycleCallbacks, Boolean>> mLifecycleCallbacks;
+ final CopyOnWriteArrayList<Pair<FragmentLifecycleCallbacks, Boolean>>
+ mLifecycleCallbacks = new CopyOnWriteArrayList<>();
int mCurState = Fragment.INITIALIZING;
FragmentHostCallback<?> mHost;
@@ -1231,7 +1232,7 @@
}
dispatchOnFragmentAttached(f, mHost.getContext(), false);
- if (!f.mRetaining) {
+ if (!f.mIsCreated) {
dispatchOnFragmentPreCreated(f, f.mSavedFragmentState, false);
f.performCreate(f.mSavedFragmentState);
dispatchOnFragmentCreated(f, f.mSavedFragmentState, false);
@@ -3100,6 +3101,9 @@
}
public boolean dispatchCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+ if (mCurState < Fragment.CREATED) {
+ return false;
+ }
boolean show = false;
ArrayList<Fragment> newMenus = null;
for (int i = 0; i < mAdded.size(); i++) {
@@ -3130,6 +3134,9 @@
}
public boolean dispatchPrepareOptionsMenu(Menu menu) {
+ if (mCurState < Fragment.CREATED) {
+ return false;
+ }
boolean show = false;
for (int i = 0; i < mAdded.size(); i++) {
Fragment f = mAdded.get(i);
@@ -3143,6 +3150,9 @@
}
public boolean dispatchOptionsItemSelected(MenuItem item) {
+ if (mCurState < Fragment.CREATED) {
+ return false;
+ }
for (int i = 0; i < mAdded.size(); i++) {
Fragment f = mAdded.get(i);
if (f != null) {
@@ -3155,6 +3165,9 @@
}
public boolean dispatchContextItemSelected(MenuItem item) {
+ if (mCurState < Fragment.CREATED) {
+ return false;
+ }
for (int i = 0; i < mAdded.size(); i++) {
Fragment f = mAdded.get(i);
if (f != null) {
@@ -3167,6 +3180,9 @@
}
public void dispatchOptionsMenuClosed(Menu menu) {
+ if (mCurState < Fragment.CREATED) {
+ return;
+ }
for (int i = 0; i < mAdded.size(); i++) {
Fragment f = mAdded.get(i);
if (f != null) {
@@ -3191,17 +3207,10 @@
public void registerFragmentLifecycleCallbacks(FragmentLifecycleCallbacks cb,
boolean recursive) {
- if (mLifecycleCallbacks == null) {
- mLifecycleCallbacks = new CopyOnWriteArrayList<>();
- }
- mLifecycleCallbacks.add(new Pair(cb, recursive));
+ mLifecycleCallbacks.add(new Pair<>(cb, recursive));
}
public void unregisterFragmentLifecycleCallbacks(FragmentLifecycleCallbacks cb) {
- if (mLifecycleCallbacks == null) {
- return;
- }
-
synchronized (mLifecycleCallbacks) {
for (int i = 0, N = mLifecycleCallbacks.size(); i < N; i++) {
if (mLifecycleCallbacks.get(i).first == cb) {
@@ -3220,9 +3229,6 @@
.dispatchOnFragmentPreAttached(f, context, true);
}
}
- if (mLifecycleCallbacks == null) {
- return;
- }
for (Pair<FragmentLifecycleCallbacks, Boolean> p : mLifecycleCallbacks) {
if (!onlyRecursive || p.second) {
p.first.onFragmentPreAttached(this, f, context);
@@ -3238,9 +3244,6 @@
.dispatchOnFragmentAttached(f, context, true);
}
}
- if (mLifecycleCallbacks == null) {
- return;
- }
for (Pair<FragmentLifecycleCallbacks, Boolean> p : mLifecycleCallbacks) {
if (!onlyRecursive || p.second) {
p.first.onFragmentAttached(this, f, context);
@@ -3257,9 +3260,6 @@
.dispatchOnFragmentPreCreated(f, savedInstanceState, true);
}
}
- if (mLifecycleCallbacks == null) {
- return;
- }
for (Pair<FragmentLifecycleCallbacks, Boolean> p : mLifecycleCallbacks) {
if (!onlyRecursive || p.second) {
p.first.onFragmentPreCreated(this, f, savedInstanceState);
@@ -3275,9 +3275,6 @@
.dispatchOnFragmentCreated(f, savedInstanceState, true);
}
}
- if (mLifecycleCallbacks == null) {
- return;
- }
for (Pair<FragmentLifecycleCallbacks, Boolean> p : mLifecycleCallbacks) {
if (!onlyRecursive || p.second) {
p.first.onFragmentCreated(this, f, savedInstanceState);
@@ -3294,9 +3291,6 @@
.dispatchOnFragmentActivityCreated(f, savedInstanceState, true);
}
}
- if (mLifecycleCallbacks == null) {
- return;
- }
for (Pair<FragmentLifecycleCallbacks, Boolean> p : mLifecycleCallbacks) {
if (!onlyRecursive || p.second) {
p.first.onFragmentActivityCreated(this, f, savedInstanceState);
@@ -3313,9 +3307,6 @@
.dispatchOnFragmentViewCreated(f, v, savedInstanceState, true);
}
}
- if (mLifecycleCallbacks == null) {
- return;
- }
for (Pair<FragmentLifecycleCallbacks, Boolean> p : mLifecycleCallbacks) {
if (!onlyRecursive || p.second) {
p.first.onFragmentViewCreated(this, f, v, savedInstanceState);
@@ -3331,9 +3322,6 @@
.dispatchOnFragmentStarted(f, true);
}
}
- if (mLifecycleCallbacks == null) {
- return;
- }
for (Pair<FragmentLifecycleCallbacks, Boolean> p : mLifecycleCallbacks) {
if (!onlyRecursive || p.second) {
p.first.onFragmentStarted(this, f);
@@ -3349,9 +3337,6 @@
.dispatchOnFragmentResumed(f, true);
}
}
- if (mLifecycleCallbacks == null) {
- return;
- }
for (Pair<FragmentLifecycleCallbacks, Boolean> p : mLifecycleCallbacks) {
if (!onlyRecursive || p.second) {
p.first.onFragmentResumed(this, f);
@@ -3367,9 +3352,6 @@
.dispatchOnFragmentPaused(f, true);
}
}
- if (mLifecycleCallbacks == null) {
- return;
- }
for (Pair<FragmentLifecycleCallbacks, Boolean> p : mLifecycleCallbacks) {
if (!onlyRecursive || p.second) {
p.first.onFragmentPaused(this, f);
@@ -3385,9 +3367,6 @@
.dispatchOnFragmentStopped(f, true);
}
}
- if (mLifecycleCallbacks == null) {
- return;
- }
for (Pair<FragmentLifecycleCallbacks, Boolean> p : mLifecycleCallbacks) {
if (!onlyRecursive || p.second) {
p.first.onFragmentStopped(this, f);
@@ -3403,9 +3382,6 @@
.dispatchOnFragmentSaveInstanceState(f, outState, true);
}
}
- if (mLifecycleCallbacks == null) {
- return;
- }
for (Pair<FragmentLifecycleCallbacks, Boolean> p : mLifecycleCallbacks) {
if (!onlyRecursive || p.second) {
p.first.onFragmentSaveInstanceState(this, f, outState);
@@ -3421,9 +3397,6 @@
.dispatchOnFragmentViewDestroyed(f, true);
}
}
- if (mLifecycleCallbacks == null) {
- return;
- }
for (Pair<FragmentLifecycleCallbacks, Boolean> p : mLifecycleCallbacks) {
if (!onlyRecursive || p.second) {
p.first.onFragmentViewDestroyed(this, f);
@@ -3439,9 +3412,6 @@
.dispatchOnFragmentDestroyed(f, true);
}
}
- if (mLifecycleCallbacks == null) {
- return;
- }
for (Pair<FragmentLifecycleCallbacks, Boolean> p : mLifecycleCallbacks) {
if (!onlyRecursive || p.second) {
p.first.onFragmentDestroyed(this, f);
@@ -3457,9 +3427,6 @@
.dispatchOnFragmentDetached(f, true);
}
}
- if (mLifecycleCallbacks == null) {
- return;
- }
for (Pair<FragmentLifecycleCallbacks, Boolean> p : mLifecycleCallbacks) {
if (!onlyRecursive || p.second) {
p.first.onFragmentDetached(this, f);
diff --git a/core/java/android/app/IActivityContainer.aidl b/core/java/android/app/IActivityContainer.aidl
deleted file mode 100644
index 1ff3c87..0000000
--- a/core/java/android/app/IActivityContainer.aidl
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * Copyright (c) 2013, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.app;
-
-import android.app.IActivityContainerCallback;
-import android.content.Intent;
-import android.content.IIntentSender;
-import android.os.IBinder;
-import android.view.InputEvent;
-import android.view.Surface;
-
-/** @hide */
-interface IActivityContainer {
- void addToDisplay(int displayId);
- void setSurface(in Surface surface, int width, int height, int density);
- int startActivity(in Intent intent);
- int startActivityIntentSender(in IIntentSender intentSender);
- int getDisplayId();
- int getStackId();
- boolean injectEvent(in InputEvent event);
- void release();
-}
diff --git a/core/java/android/app/IActivityContainerCallback.aidl b/core/java/android/app/IActivityContainerCallback.aidl
deleted file mode 100644
index 99d0a6f..0000000
--- a/core/java/android/app/IActivityContainerCallback.aidl
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * Copyright (c) 2013, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.app;
-
-import android.os.IBinder;
-
-/** @hide */
-interface IActivityContainerCallback {
- oneway void setVisible(IBinder container, boolean visible);
- oneway void onAllActivitiesComplete(IBinder container);
-}
diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl
index 3ac026d..fa9d7ca 100644
--- a/core/java/android/app/IActivityManager.aidl
+++ b/core/java/android/app/IActivityManager.aidl
@@ -20,8 +20,6 @@
import android.app.ApplicationErrorReport;
import android.app.ContentProviderHolder;
import android.app.IApplicationThread;
-import android.app.IActivityContainer;
-import android.app.IActivityContainerCallback;
import android.app.IActivityController;
import android.app.IAppTask;
import android.app.IInstrumentationWatcher;
@@ -277,8 +275,8 @@
int checkGrantUriPermission(int callingUid, in String targetPkg, in Uri uri,
int modeFlags, int userId);
// Cause the specified process to dump the specified heap.
- boolean dumpHeap(in String process, int userId, boolean managed, in String path,
- in ParcelFileDescriptor fd);
+ boolean dumpHeap(in String process, int userId, boolean managed, boolean mallocInfo,
+ boolean runGc, in String path, in ParcelFileDescriptor fd);
int startActivities(in IApplicationThread caller, in String callingPackage,
in Intent[] intents, in String[] resolvedTypes, in IBinder resultTo,
in Bundle options, int userId);
@@ -355,8 +353,6 @@
void killUid(int appId, int userId, in String reason);
void setUserIsMonkey(boolean monkey);
void hang(in IBinder who, boolean allowRestart);
- IActivityContainer createVirtualActivityContainer(in IBinder parentActivityToken,
- in IActivityContainerCallback callback);
void moveTaskToStack(int taskId, int stackId, boolean toTop);
/**
* Resizes the input stack id to the given bounds.
@@ -412,9 +408,6 @@
void stopSystemLockTaskMode();
void finishVoiceTask(in IVoiceInteractionSession session);
boolean isTopOfTask(in IBinder token);
- boolean requestVisibleBehind(in IBinder token, boolean visible);
- boolean isBackgroundVisibleBehind(in IBinder token);
- void backgroundResourcesReleased(in IBinder token);
void notifyLaunchTaskBehindComplete(in IBinder token);
int startActivityFromRecents(int taskId, in Bundle options);
void notifyEnterAnimationComplete(in IBinder token);
@@ -439,7 +432,7 @@
// Start of M transactions
void notifyCleartextNetwork(int uid, in byte[] firstPacket);
- IActivityContainer createStackOnDisplay(int displayId);
+ int createStackOnDisplay(int displayId);
int getFocusedStackId();
void setTaskResizeable(int taskId, int resizeableMode);
boolean requestAssistContextExtras(int requestType, in IResultReceiver receiver,
@@ -636,4 +629,7 @@
// side. If so, make sure they are using the correct transaction ids and arguments.
// If a transaction which will also be used on the native side is being inserted, add it
// alongside with other transactions of this kind at the top of this file.
+
+ void setShowWhenLocked(in IBinder token, boolean showWhenLocked);
+ void setTurnScreenOn(in IBinder token, boolean turnScreenOn);
}
diff --git a/core/java/android/app/IApplicationThread.aidl b/core/java/android/app/IApplicationThread.aidl
index b3521c0..aeed7e1 100644
--- a/core/java/android/app/IApplicationThread.aidl
+++ b/core/java/android/app/IApplicationThread.aidl
@@ -117,7 +117,8 @@
void scheduleSuicide();
void dispatchPackageBroadcast(int cmd, in String[] packages);
void scheduleCrash(in String msg);
- void dumpHeap(boolean managed, in String path, in ParcelFileDescriptor fd);
+ void dumpHeap(boolean managed, boolean mallocInfo, boolean runGc, in String path,
+ in ParcelFileDescriptor fd);
void dumpActivity(in ParcelFileDescriptor fd, IBinder servicetoken, in String prefix,
in String[] args);
void clearDnsCache();
@@ -140,8 +141,6 @@
void setProcessState(int state);
void scheduleInstallProvider(in ProviderInfo provider);
void updateTimePrefs(int timeFormatPreference);
- void scheduleCancelVisibleBehind(IBinder token);
- void scheduleBackgroundVisibleBehindChanged(IBinder token, boolean enabled);
void scheduleEnterAnimationComplete(IBinder token);
void notifyCleartextNetwork(in byte[] firstPacket);
void startBinderTracking();
diff --git a/core/java/android/app/IInputForwarder.aidl b/core/java/android/app/IInputForwarder.aidl
new file mode 100644
index 0000000..d6be63e
--- /dev/null
+++ b/core/java/android/app/IInputForwarder.aidl
@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) 2017, 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.app;
+
+import android.view.InputEvent;
+
+/**
+ * Forwards input events into owned activity container, used in {@link android.app.ActivityView}.
+ * To forward input to other apps {@link android.Manifest.permission.INJECT_EVENTS} permission is
+ * required.
+ * @hide
+ */
+interface IInputForwarder {
+ boolean forwardEvent(in InputEvent event);
+}
\ No newline at end of file
diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl
index 1c1883b..08821be 100644
--- a/core/java/android/app/INotificationManager.aidl
+++ b/core/java/android/app/INotificationManager.aidl
@@ -116,6 +116,16 @@
boolean matchesCallFilter(in Bundle extras);
boolean isSystemConditionProviderEnabled(String path);
+ boolean isNotificationListenerAccessGranted(in ComponentName listener);
+ boolean isNotificationListenerAccessGrantedForUser(in ComponentName listener, int userId);
+ boolean isNotificationAssistantAccessGranted(in ComponentName assistant);
+ void setNotificationListenerAccessGranted(in ComponentName listener, boolean enabled);
+ void setNotificationAssistantAccessGranted(in ComponentName assistant, boolean enabled);
+ void setNotificationListenerAccessGrantedForUser(in ComponentName listener, int userId, boolean enabled);
+ void setNotificationAssistantAccessGrantedForUser(in ComponentName assistant, int userId, boolean enabled);
+ List<String> getEnabledNotificationListenerPackages();
+ List<ComponentName> getEnabledNotificationListeners(int userId);
+
int getZenMode();
ZenModeConfig getZenModeConfig();
oneway void setZenMode(int mode, in Uri conditionId, String reason);
@@ -123,7 +133,6 @@
boolean isNotificationPolicyAccessGranted(String pkg);
NotificationManager.Policy getNotificationPolicy(String pkg);
void setNotificationPolicy(String pkg, in NotificationManager.Policy policy);
- String[] getPackagesRequestingNotificationPolicyAccess();
boolean isNotificationPolicyAccessGrantedForPackage(String pkg);
void setNotificationPolicyAccessGranted(String pkg, boolean granted);
AutomaticZenRule getAutomaticZenRule(String id);
diff --git a/core/java/android/app/IUidObserver.aidl b/core/java/android/app/IUidObserver.aidl
index ae64875..01a9cbf 100644
--- a/core/java/android/app/IUidObserver.aidl
+++ b/core/java/android/app/IUidObserver.aidl
@@ -43,4 +43,14 @@
* a sufficient period of time, or all of its processes have gone away.
*/
void onUidIdle(int uid, boolean disabled);
+
+ /**
+ * Report when the cached state of a uid has changed.
+ * If true, a uid has become cached -- that is, it has some active processes that are
+ * all in the cached state. It should be doing as little as possible at this point.
+ * If false, that a uid is no longer cached. This will only be called after
+ * onUidCached() has been reported true. It will happen when either one of its actively
+ * running processes is no longer cached, or it no longer has any actively running processes.
+ */
+ void onUidCachedChanged(int uid, boolean cached);
}
diff --git a/core/java/android/app/IWallpaperManager.aidl b/core/java/android/app/IWallpaperManager.aidl
index 411d0e2..0e33934 100644
--- a/core/java/android/app/IWallpaperManager.aidl
+++ b/core/java/android/app/IWallpaperManager.aidl
@@ -60,7 +60,7 @@
/**
* Get the wallpaper for a given user.
*/
- ParcelFileDescriptor getWallpaper(IWallpaperManagerCallback cb, int which,
+ ParcelFileDescriptor getWallpaper(String callingPkg, IWallpaperManagerCallback cb, int which,
out Bundle outParams, int userId);
/**
diff --git a/core/java/android/app/KeyguardManager.java b/core/java/android/app/KeyguardManager.java
index 16b21f1..c0381d6 100644
--- a/core/java/android/app/KeyguardManager.java
+++ b/core/java/android/app/KeyguardManager.java
@@ -461,6 +461,9 @@
* <p>
* If the Keyguard is secure and the device is not in a trusted state, this will bring up the
* UI so the user can enter their credentials.
+ * <p>
+ * If the value set for the {@link Activity} attr {@link android.R.attr#turnScreenOn} is true,
+ * the screen will turn on when the keyguard is dismissed.
*
* @param activity The activity requesting the dismissal. The activity must be either visible
* by using {@link LayoutParams#FLAG_SHOW_WHEN_LOCKED} or must be in a state in
diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java
index 79e5407..b38be66 100644
--- a/core/java/android/app/LoadedApk.java
+++ b/core/java/android/app/LoadedApk.java
@@ -97,7 +97,6 @@
private String mAppDir;
private String mResDir;
private String[] mOverlayDirs;
- private String[] mSharedLibraries;
private String mDataDir;
private String mLibDir;
private File mDataDirFile;
@@ -116,6 +115,7 @@
private String[] mSplitNames;
private String[] mSplitAppDirs;
private String[] mSplitResDirs;
+ private String[] mSplitClassLoaderNames;
private final ArrayMap<Context, ArrayMap<BroadcastReceiver, ReceiverDispatcher>> mReceivers
= new ArrayMap<>();
@@ -126,8 +126,6 @@
private final ArrayMap<Context, ArrayMap<ServiceConnection, LoadedApk.ServiceDispatcher>> mUnboundServices
= new ArrayMap<>();
- int mClientCount = 0;
-
Application getApplication() {
return mApplication;
}
@@ -192,8 +190,8 @@
mResDir = null;
mSplitAppDirs = null;
mSplitResDirs = null;
+ mSplitClassLoaderNames = null;
mOverlayDirs = null;
- mSharedLibraries = null;
mDataDir = null;
mDataDirFile = null;
mDeviceProtectedDataDirFile = null;
@@ -324,7 +322,6 @@
mAppDir = aInfo.sourceDir;
mResDir = aInfo.uid == myUid ? aInfo.sourceDir : aInfo.publicSourceDir;
mOverlayDirs = aInfo.resourceDirs;
- mSharedLibraries = aInfo.sharedLibraryFiles;
mDataDir = aInfo.dataDir;
mLibDir = aInfo.nativeLibraryDir;
mDataDirFile = FileUtils.newFileOrNull(aInfo.dataDir);
@@ -334,6 +331,7 @@
mSplitNames = aInfo.splitNames;
mSplitAppDirs = aInfo.splitSourceDirs;
mSplitResDirs = aInfo.uid == myUid ? aInfo.splitSourceDirs : aInfo.splitPublicSourceDirs;
+ mSplitClassLoaderNames = aInfo.splitClassLoaderNames;
if (aInfo.requestsIsolatedSplitLoading() && !ArrayUtils.isEmpty(mSplitNames)) {
mSplitLoader = new SplitDependencyLoaderImpl(aInfo.splitDependencies);
@@ -530,7 +528,8 @@
// Since we handled the special base case above, parentSplitIdx is always valid.
final ClassLoader parent = mCachedClassLoaders[parentSplitIdx];
mCachedClassLoaders[splitIdx] = ApplicationLoaders.getDefault().getClassLoader(
- mSplitAppDirs[splitIdx - 1], getTargetSdkVersion(), false, null, null, parent);
+ mSplitAppDirs[splitIdx - 1], getTargetSdkVersion(), false, null, null, parent,
+ mSplitClassLoaderNames[splitIdx - 1]);
Collections.addAll(splitPaths, mCachedResourcePaths[parentSplitIdx]);
splitPaths.add(mSplitResDirs[splitIdx - 1]);
@@ -650,8 +649,9 @@
if (mClassLoader == null) {
StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads();
mClassLoader = ApplicationLoaders.getDefault().getClassLoader(
- "" /* codePath */, mApplicationInfo.targetSdkVersion, isBundledApp,
- librarySearchPath, libraryPermittedPath, mBaseClassLoader);
+ "" /* codePath */, mApplicationInfo.targetSdkVersion, isBundledApp,
+ librarySearchPath, libraryPermittedPath, mBaseClassLoader,
+ null /* classLoaderName */);
StrictMode.setThreadPolicy(oldPolicy);
}
@@ -678,7 +678,8 @@
mClassLoader = ApplicationLoaders.getDefault().getClassLoader(zip,
mApplicationInfo.targetSdkVersion, isBundledApp, librarySearchPath,
- libraryPermittedPath, mBaseClassLoader);
+ libraryPermittedPath, mBaseClassLoader,
+ mApplicationInfo.classLoaderName);
StrictMode.setThreadPolicy(oldPolicy);
// Setup the class loader paths for profiling.
diff --git a/core/java/android/app/MediaRouteButton.java b/core/java/android/app/MediaRouteButton.java
index d2d7b6d..a4a89fa 100644
--- a/core/java/android/app/MediaRouteButton.java
+++ b/core/java/android/app/MediaRouteButton.java
@@ -24,6 +24,7 @@
import android.content.ContextWrapper;
import android.content.res.TypedArray;
import android.graphics.Canvas;
+import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.Drawable;
import android.media.MediaRouter;
import android.media.MediaRouter.RouteGroup;
@@ -339,28 +340,42 @@
}
private void refreshRoute() {
+ final MediaRouter.RouteInfo route = mRouter.getSelectedRoute();
+ final boolean isRemote = !route.isDefault() && route.matchesTypes(mRouteTypes);
+ final boolean isConnecting = isRemote && route.isConnecting();
+ boolean needsRefresh = false;
+ if (mRemoteActive != isRemote) {
+ mRemoteActive = isRemote;
+ needsRefresh = true;
+ }
+ if (mIsConnecting != isConnecting) {
+ mIsConnecting = isConnecting;
+ needsRefresh = true;
+ }
+
+ if (needsRefresh) {
+ refreshDrawableState();
+ }
if (mAttachedToWindow) {
- final MediaRouter.RouteInfo route = mRouter.getSelectedRoute();
- final boolean isRemote = !route.isDefault() && route.matchesTypes(mRouteTypes);
- final boolean isConnecting = isRemote && route.isConnecting();
-
- boolean needsRefresh = false;
- if (mRemoteActive != isRemote) {
- mRemoteActive = isRemote;
- needsRefresh = true;
- }
- if (mIsConnecting != isConnecting) {
- mIsConnecting = isConnecting;
- needsRefresh = true;
- }
-
- if (needsRefresh) {
- refreshDrawableState();
- }
-
setEnabled(mRouter.isRouteAvailable(mRouteTypes,
MediaRouter.AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE));
}
+ if (mRemoteIndicator != null
+ && mRemoteIndicator.getCurrent() instanceof AnimationDrawable) {
+ AnimationDrawable curDrawable = (AnimationDrawable) mRemoteIndicator.getCurrent();
+ if (mAttachedToWindow) {
+ if ((needsRefresh || isConnecting) && !curDrawable.isRunning()) {
+ curDrawable.start();
+ }
+ } else if (isRemote && !isConnecting) {
+ // When the route is already connected before the view is attached, show the last
+ // frame of the connected animation immediately.
+ if (curDrawable.isRunning()) {
+ curDrawable.stop();
+ }
+ curDrawable.selectDrawable(curDrawable.getNumberOfFrames() - 1);
+ }
+ }
}
private final class MediaRouterCallback extends MediaRouter.SimpleCallback {
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 531afa4..a218274 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -33,6 +33,7 @@
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ShortcutInfo;
import android.content.res.ColorStateList;
+import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Canvas;
@@ -2779,6 +2780,9 @@
private ArrayList<Action> mOriginalActions;
private boolean mRebuildStyledRemoteViews;
+ private boolean mTintActionButtons;
+ private boolean mInNightMode;
+
/**
* Constructs a new Builder with the defaults:
*
@@ -2810,6 +2814,14 @@
*/
public Builder(Context context, Notification toAdopt) {
mContext = context;
+ Resources res = mContext.getResources();
+ mTintActionButtons = res.getBoolean(R.bool.config_tintNotificationActionButtons);
+
+ if (res.getBoolean(R.bool.config_enableNightMode)) {
+ Configuration currentConfig = res.getConfiguration();
+ mInNightMode = (currentConfig.uiMode & Configuration.UI_MODE_NIGHT_MASK)
+ == Configuration.UI_MODE_NIGHT_YES;
+ }
if (toAdopt == null) {
mN = new Notification();
@@ -4663,14 +4675,14 @@
// We need to set the text color as well since changing a text to uppercase
// clears its spans.
button.setTextColor(R.id.action0, outResultColor[0]);
- } else if (mN.color != COLOR_DEFAULT && !isColorized()) {
+ } else if (mN.color != COLOR_DEFAULT && !isColorized() && mTintActionButtons) {
button.setTextColor(R.id.action0,resolveContrastColor());
}
} else {
button.setTextViewText(R.id.action0, processLegacyText(action.title));
if (isColorized() && !ambient) {
setTextViewColorPrimary(button, R.id.action0);
- } else if (mN.color != COLOR_DEFAULT) {
+ } else if (mN.color != COLOR_DEFAULT && mTintActionButtons) {
button.setTextColor(R.id.action0,
ambient ? resolveAmbientColor() : resolveContrastColor());
}
@@ -4749,7 +4761,7 @@
int[] newColors = new int[colors.length];
for (int i = 0; i < newColors.length; i++) {
newColors[i] = NotificationColorUtil.ensureLargeTextContrast(
- colors[i], background);
+ colors[i], background, mInNightMode);
}
textColor = new ColorStateList(textColor.getStates().clone(),
newColors);
@@ -4768,7 +4780,7 @@
ForegroundColorSpan originalSpan = (ForegroundColorSpan) resultSpan;
int foregroundColor = originalSpan.getForegroundColor();
foregroundColor = NotificationColorUtil.ensureLargeTextContrast(
- foregroundColor, background);
+ foregroundColor, background, mInNightMode);
resultSpan = new ForegroundColorSpan(foregroundColor);
if (fullLength) {
outResultColor[0] = ColorStateList.valueOf(foregroundColor);
@@ -4863,7 +4875,7 @@
color = mSecondaryTextColor;
} else {
color = NotificationColorUtil.resolveContrastColor(mContext, mN.color,
- background);
+ background, mInNightMode);
}
if (Color.alpha(color) < 255) {
// alpha doesn't go well for color filters, so let's blend it manually
@@ -4958,7 +4970,6 @@
mStyle.purgeResources();
mStyle.buildStyled(mN);
}
-
mN.reduceImageSizes(mContext);
if (mContext.getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.N
@@ -5003,18 +5014,20 @@
/**
* Removes RemoteViews that were created for compatibility from {@param n}, if they did not
- * change.
+ * change. Also removes extenders on low ram devices, as
+ * {@link android.service.notification.NotificationListenerService} services are disabled.
*
* @return {@param n}, if no stripping is needed, otherwise a stripped clone of {@param n}.
*
* @hide
*/
- public static Notification maybeCloneStrippedForDelivery(Notification n) {
+ public static Notification maybeCloneStrippedForDelivery(Notification n, boolean isLowRam) {
String templateClass = n.extras.getString(EXTRA_TEMPLATE);
// Only strip views for known Styles because we won't know how to
// re-create them otherwise.
- if (!TextUtils.isEmpty(templateClass)
+ if (!isLowRam
+ && !TextUtils.isEmpty(templateClass)
&& getNotificationStyleClass(templateClass) == null) {
return n;
}
@@ -5031,7 +5044,8 @@
n.headsUpContentView.getSequenceNumber();
// Nothing to do here, no need to clone.
- if (!stripContentView && !stripBigContentView && !stripHeadsUpContentView) {
+ if (!isLowRam
+ && !stripContentView && !stripBigContentView && !stripHeadsUpContentView) {
return n;
}
@@ -5048,6 +5062,11 @@
clone.headsUpContentView = null;
clone.extras.remove(EXTRA_REBUILD_HEADS_UP_CONTENT_VIEW_ACTION_COUNT);
}
+ if (isLowRam) {
+ clone.extras.remove(Notification.TvExtender.EXTRA_TV_EXTENDER);
+ clone.extras.remove(WearableExtender.EXTRA_WEARABLE_EXTENSIONS);
+ clone.extras.remove(CarExtender.EXTRA_CAR_EXTENDER);
+ }
return clone;
}
@@ -5100,6 +5119,10 @@
return mN.isColorized();
}
+ private boolean shouldTintActionButtons() {
+ return mTintActionButtons;
+ }
+
private boolean textColorsNeedInversion() {
if (mStyle == null || !MediaStyle.class.equals(mStyle.getClass())) {
return false;
@@ -5301,7 +5324,7 @@
}
/**
- * @hide
+ * @removed
*/
@SystemApi
public static Class<? extends Style> getNotificationStyleClass(String templateClass) {
@@ -6187,6 +6210,8 @@
BidiFormatter bidi = BidiFormatter.getInstance();
SpannableStringBuilder sb = new SpannableStringBuilder();
boolean colorize = builder.isColorized();
+ TextAppearanceSpan colorSpan;
+ CharSequence messageName;
if (TextUtils.isEmpty(m.mSender)) {
CharSequence replyName = mUserDisplayName == null ? "" : mUserDisplayName;
sb.append(bidi.unicodeWrap(replyName),
@@ -6715,8 +6740,16 @@
RemoteViews button = new BuilderRemoteViews(mBuilder.mContext.getApplicationInfo(),
R.layout.notification_material_media_action);
button.setImageViewIcon(R.id.action0, action.getIcon());
- button.setDrawableParameters(R.id.action0, false, -1, color, PorterDuff.Mode.SRC_ATOP,
- -1);
+
+ // If the action buttons should not be tinted, then just use the default
+ // notification color. Otherwise, just use the passed-in color.
+ int tintColor = mBuilder.shouldTintActionButtons() || mBuilder.isColorized()
+ ? color
+ : NotificationColorUtil.resolveColor(mBuilder.mContext,
+ Notification.COLOR_DEFAULT);
+
+ button.setDrawableParameters(R.id.action0, false, -1, tintColor,
+ PorterDuff.Mode.SRC_ATOP, -1);
if (!tombstone) {
button.setOnClickPendingIntent(R.id.action0, action.actionIntent);
}
diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java
index 9d7e4a2..8858172 100644
--- a/core/java/android/app/NotificationManager.java
+++ b/core/java/android/app/NotificationManager.java
@@ -40,7 +40,6 @@
import android.provider.Settings.Global;
import android.service.notification.StatusBarNotification;
import android.service.notification.ZenModeConfig;
-import android.util.ArraySet;
import android.util.Log;
import java.lang.annotation.Retention;
@@ -309,7 +308,9 @@
}
if (localLOGV) Log.v(TAG, pkg + ": notify(" + id + ", " + notification + ")");
notification.reduceImageSizes(mContext);
- final Notification copy = Builder.maybeCloneStrippedForDelivery(notification);
+ ActivityManager am = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
+ boolean isLowRam = am.isLowRamDevice();
+ final Notification copy = Builder.maybeCloneStrippedForDelivery(notification, isLowRam);
try {
service.enqueueNotificationWithTag(pkg, mContext.getOpPackageName(), tag, id,
copy, user.getIdentifier());
@@ -415,12 +416,16 @@
* Creates a notification channel that notifications can be posted to.
*
* This can also be used to restore a deleted channel and to update an existing channel's
- * name and description.
+ * name, description, and/or importance.
*
* <p>The name and description should only be changed if the locale changes
* or in response to the user renaming this channel. For example, if a user has a channel
* named 'John Doe' that represents messages from a 'John Doe', and 'John Doe' changes his name
* to 'John Smith,' the channel can be renamed to match.
+ *
+ * <p>The importance of an existing channel will only be changed if the new importance is lower
+ * than the current value and the user has not altered any settings on this channel.
+ *
* All other fields are ignored for channels that already exist.
*
* @param channel the channel to create. Note that the created channel may differ from this
@@ -744,14 +749,14 @@
}
/**
- * Checks the ability to read/modify notification policy for the calling package.
+ * Checks the ability to read/modify notification do not disturb policy for the calling package.
*
* <p>
* Returns true if the calling package can read/modify notification policy.
*
* <p>
- * Request policy access by sending the user to the activity that matches the system intent
- * action {@link android.provider.Settings#ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS}.
+ * Apps can request policy access by sending the user to the activity that matches the system
+ * intent action {@link android.provider.Settings#ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS}.
*
* <p>
* Use {@link #ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED} to listen for
@@ -766,6 +771,39 @@
}
}
+ /**
+ * Checks whether the user has approved a given
+ * {@link android.service.notification.NotificationListenerService}.
+ *
+ * <p>
+ * The listener service must belong to the calling app.
+ *
+ * <p>
+ * Apps can request notification listener access by sending the user to the activity that
+ * matches the system intent action
+ * {@link android.provider.Settings#ACTION_NOTIFICATION_LISTENER_SETTINGS}.
+ */
+ public boolean isNotificationListenerAccessGranted(ComponentName listener) {
+ INotificationManager service = getService();
+ try {
+ return service.isNotificationListenerAccessGranted(listener);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * @hide
+ */
+ public boolean isNotificationAssistantAccessGranted(ComponentName assistant) {
+ INotificationManager service = getService();
+ try {
+ return service.isNotificationAssistantAccessGranted(assistant);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
/** @hide */
public boolean isNotificationPolicyAccessGrantedForPackage(String pkg) {
INotificationManager service = getService();
@@ -777,6 +815,18 @@
}
/**
+ * @hide
+ */
+ public List<String> getEnabledNotificationListenerPackages() {
+ INotificationManager service = getService();
+ try {
+ return service.getEnabledNotificationListenerPackages();
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Gets the current notification policy.
*
* <p>
@@ -822,21 +872,34 @@
}
/** @hide */
- public ArraySet<String> getPackagesRequestingNotificationPolicyAccess() {
+ public void setNotificationListenerAccessGranted(ComponentName listener, boolean granted) {
INotificationManager service = getService();
try {
- final String[] pkgs = service.getPackagesRequestingNotificationPolicyAccess();
- if (pkgs != null && pkgs.length > 0) {
- final ArraySet<String> rt = new ArraySet<>(pkgs.length);
- for (int i = 0; i < pkgs.length; i++) {
- rt.add(pkgs[i]);
- }
- return rt;
- }
+ service.setNotificationListenerAccessGranted(listener, granted);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
- return new ArraySet<>();
+ }
+
+ /** @hide */
+ public void setNotificationListenerAccessGrantedForUser(ComponentName listener, int userId,
+ boolean granted) {
+ INotificationManager service = getService();
+ try {
+ service.setNotificationListenerAccessGrantedForUser(listener, userId, granted);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /** @hide */
+ public List<ComponentName> getEnabledNotificationListeners(int userId) {
+ INotificationManager service = getService();
+ try {
+ return service.getEnabledNotificationListeners(userId);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
}
private Context mContext;
diff --git a/core/java/android/app/ProfilerInfo.java b/core/java/android/app/ProfilerInfo.java
index f3fe677..fad4798 100644
--- a/core/java/android/app/ProfilerInfo.java
+++ b/core/java/android/app/ProfilerInfo.java
@@ -17,8 +17,11 @@
package android.app;
import android.os.Parcel;
-import android.os.Parcelable;
import android.os.ParcelFileDescriptor;
+import android.os.Parcelable;
+import android.util.Slog;
+
+import java.io.IOException;
/**
* System private API for passing profiler settings.
@@ -27,6 +30,8 @@
*/
public class ProfilerInfo implements Parcelable {
+ private static final String TAG = "ProfilerInfo";
+
/* Name of profile output file. */
public final String profileFile;
@@ -39,18 +44,50 @@
/* Automatically stop the profiler when the app goes idle. */
public final boolean autoStopProfiler;
- /* Indicates whether to stream the profiling info to the out file continuously. */
+ /*
+ * Indicates whether to stream the profiling info to the out file continuously.
+ */
public final boolean streamingOutput;
+ /**
+ * Denotes an agent (and its parameters) to attach for profiling.
+ */
+ public final String agent;
+
public ProfilerInfo(String filename, ParcelFileDescriptor fd, int interval, boolean autoStop,
- boolean streaming) {
+ boolean streaming, String agent) {
profileFile = filename;
profileFd = fd;
samplingInterval = interval;
autoStopProfiler = autoStop;
streamingOutput = streaming;
+ this.agent = agent;
}
+ public ProfilerInfo(ProfilerInfo in) {
+ profileFile = in.profileFile;
+ profileFd = in.profileFd;
+ samplingInterval = in.samplingInterval;
+ autoStopProfiler = in.autoStopProfiler;
+ streamingOutput = in.streamingOutput;
+ agent = in.agent;
+ }
+
+ /**
+ * Close profileFd, if it is open. The field will be null after a call to this function.
+ */
+ public void closeFd() {
+ if (profileFd != null) {
+ try {
+ profileFd.close();
+ } catch (IOException e) {
+ Slog.w(TAG, "Failure closing profile fd", e);
+ }
+ profileFd = null;
+ }
+ }
+
+ @Override
public int describeContents() {
if (profileFd != null) {
return profileFd.describeContents();
@@ -59,6 +96,7 @@
}
}
+ @Override
public void writeToParcel(Parcel out, int flags) {
out.writeString(profileFile);
if (profileFd != null) {
@@ -70,18 +108,21 @@
out.writeInt(samplingInterval);
out.writeInt(autoStopProfiler ? 1 : 0);
out.writeInt(streamingOutput ? 1 : 0);
+ out.writeString(agent);
}
public static final Parcelable.Creator<ProfilerInfo> CREATOR =
new Parcelable.Creator<ProfilerInfo>() {
- public ProfilerInfo createFromParcel(Parcel in) {
- return new ProfilerInfo(in);
- }
+ @Override
+ public ProfilerInfo createFromParcel(Parcel in) {
+ return new ProfilerInfo(in);
+ }
- public ProfilerInfo[] newArray(int size) {
- return new ProfilerInfo[size];
- }
- };
+ @Override
+ public ProfilerInfo[] newArray(int size) {
+ return new ProfilerInfo[size];
+ }
+ };
private ProfilerInfo(Parcel in) {
profileFile = in.readString();
@@ -89,5 +130,6 @@
samplingInterval = in.readInt();
autoStopProfiler = in.readInt() != 0;
streamingOutput = in.readInt() != 0;
+ agent = in.readString();
}
}
diff --git a/core/java/android/app/SharedPreferencesImpl.java b/core/java/android/app/SharedPreferencesImpl.java
index 063ad24..6ea0825 100644
--- a/core/java/android/app/SharedPreferencesImpl.java
+++ b/core/java/android/app/SharedPreferencesImpl.java
@@ -23,16 +23,19 @@
import android.system.ErrnoException;
import android.system.Os;
import android.system.StructStat;
+import android.system.StructTimespec;
import android.util.Log;
-import com.google.android.collect.Maps;
-
import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.ExponentiallyBucketedHistogram;
import com.android.internal.util.XmlUtils;
import dalvik.system.BlockGuard;
+import libcore.io.IoUtils;
+
+import com.google.android.collect.Maps;
+
import org.xmlpull.v1.XmlPullParserException;
import java.io.BufferedInputStream;
@@ -50,8 +53,6 @@
import java.util.WeakHashMap;
import java.util.concurrent.CountDownLatch;
-import libcore.io.IoUtils;
-
final class SharedPreferencesImpl implements SharedPreferences {
private static final String TAG = "SharedPreferencesImpl";
private static final boolean DEBUG = false;
@@ -80,7 +81,7 @@
private boolean mLoaded = false;
@GuardedBy("mLock")
- private long mStatTimestamp;
+ private StructTimespec mStatTimestamp;
@GuardedBy("mLock")
private long mStatSize;
@@ -162,7 +163,7 @@
mLoaded = true;
if (map != null) {
mMap = map;
- mStatTimestamp = stat.st_mtime;
+ mStatTimestamp = stat.st_mtim;
mStatSize = stat.st_size;
} else {
mMap = new HashMap<>();
@@ -209,7 +210,7 @@
}
synchronized (mLock) {
- return mStatTimestamp != stat.st_mtime || mStatSize != stat.st_size;
+ return !stat.st_mtim.equals(mStatTimestamp) || mStatSize != stat.st_size;
}
}
@@ -744,7 +745,7 @@
try {
final StructStat stat = Os.stat(mFile.getPath());
synchronized (mLock) {
- mStatTimestamp = stat.st_mtime;
+ mStatTimestamp = stat.st_mtim;
mStatSize = stat.st_size;
}
} catch (ErrnoException e) {
@@ -778,7 +779,7 @@
}
long fsyncDuration = fsyncTime - writeTime;
- mSyncTimes.add(Long.valueOf(fsyncDuration).intValue());
+ mSyncTimes.add((int) fsyncDuration);
mNumSync++;
if (DEBUG || mNumSync % 1024 == 0 || fsyncDuration > MAX_FSYNC_DURATION_MILLIS) {
diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java
index 9a019b8..ab70f0e 100644
--- a/core/java/android/app/SystemServiceRegistry.java
+++ b/core/java/android/app/SystemServiceRegistry.java
@@ -39,6 +39,7 @@
import android.content.RestrictionsManager;
import android.content.pm.IShortcutService;
import android.content.pm.LauncherApps;
+import android.content.pm.PackageManager;
import android.content.pm.ShortcutManager;
import android.content.res.Resources;
import android.hardware.ConsumerIrManager;
@@ -82,6 +83,8 @@
import android.net.NetworkScoreManager;
import android.net.nsd.INsdManager;
import android.net.nsd.NsdManager;
+import android.net.lowpan.ILowpanManager;
+import android.net.lowpan.LowpanManager;
import android.net.wifi.IRttManager;
import android.net.wifi.IWifiManager;
import android.net.wifi.IWifiScanner;
@@ -539,6 +542,16 @@
ctx.mMainThread.getHandler());
}});
+ registerService(Context.LOWPAN_SERVICE, LowpanManager.class,
+ new CachedServiceFetcher<LowpanManager>() {
+ @Override
+ public LowpanManager createService(ContextImpl ctx) throws ServiceNotFoundException {
+ IBinder b = ServiceManager.getServiceOrThrow(Context.LOWPAN_SERVICE);
+ ILowpanManager service = ILowpanManager.Stub.asInterface(b);
+ return new LowpanManager(ctx.getOuterContext(), service,
+ ConnectivityThread.getInstanceLooper());
+ }});
+
registerService(Context.WIFI_SERVICE, WifiManager.class,
new CachedServiceFetcher<WifiManager>() {
@Override
@@ -651,25 +664,30 @@
new CachedServiceFetcher<PrintManager>() {
@Override
public PrintManager createService(ContextImpl ctx) throws ServiceNotFoundException {
- // Get the services without throwing as this is an optional feature
- IBinder iBinder = ServiceManager.getService(Context.PRINT_SERVICE);
- IPrintManager service = IPrintManager.Stub.asInterface(iBinder);
+ IPrintManager service = null;
+ // If the feature not present, don't try to look up every time
+ if (ctx.getPackageManager().hasSystemFeature(PackageManager.FEATURE_PRINTING)) {
+ service = IPrintManager.Stub.asInterface(ServiceManager
+ .getServiceOrThrow(Context.PRINT_SERVICE));
+ }
return new PrintManager(ctx.getOuterContext(), service, UserHandle.myUserId(),
UserHandle.getAppId(Process.myUid()));
}});
registerService(Context.COMPANION_DEVICE_SERVICE, CompanionDeviceManager.class,
new CachedServiceFetcher<CompanionDeviceManager>() {
- @Override
- public CompanionDeviceManager createService(ContextImpl ctx)
- throws ServiceNotFoundException {
- // Get the services without throwing as this is an optional feature
- IBinder iBinder =
- ServiceManager.getService(Context.COMPANION_DEVICE_SERVICE);
- ICompanionDeviceManager service =
- ICompanionDeviceManager.Stub.asInterface(iBinder);
- return new CompanionDeviceManager(service, ctx.getOuterContext());
- }});
+ @Override
+ public CompanionDeviceManager createService(ContextImpl ctx)
+ throws ServiceNotFoundException {
+ ICompanionDeviceManager service = null;
+ // If the feature not present, don't try to look up every time
+ if (ctx.getPackageManager().hasSystemFeature(
+ PackageManager.FEATURE_COMPANION_DEVICE_SETUP)) {
+ service = ICompanionDeviceManager.Stub.asInterface(
+ ServiceManager.getServiceOrThrow(Context.COMPANION_DEVICE_SERVICE));
+ }
+ return new CompanionDeviceManager(service, ctx.getOuterContext());
+ }});
registerService(Context.CONSUMER_IR_SERVICE, ConsumerIrManager.class,
new CachedServiceFetcher<ConsumerIrManager>() {
diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java
index 0b8b689..0398b47 100644
--- a/core/java/android/app/WallpaperManager.java
+++ b/core/java/android/app/WallpaperManager.java
@@ -48,6 +48,7 @@
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
+import android.os.Build;
import android.os.Bundle;
import android.os.DeadSystemException;
import android.os.Handler;
@@ -404,10 +405,18 @@
mCachedWallpaper = null;
mCachedWallpaperUserId = 0;
try {
- mCachedWallpaper = getCurrentWallpaperLocked(userId);
+ mCachedWallpaper = getCurrentWallpaperLocked(context, userId);
mCachedWallpaperUserId = userId;
} catch (OutOfMemoryError e) {
- Log.w(TAG, "No memory load current wallpaper", e);
+ Log.w(TAG, "Out of memory loading the current wallpaper: " + e);
+ } catch (SecurityException e) {
+ if (context.getApplicationInfo().targetSdkVersion <= Build.VERSION_CODES.O) {
+ Log.w(TAG, "No permission to access wallpaper, suppressing"
+ + " exception to avoid crashing legacy app.");
+ } else {
+ // Post-O apps really most sincerely need the permission.
+ throw e;
+ }
}
if (mCachedWallpaper != null) {
return mCachedWallpaper;
@@ -434,7 +443,7 @@
}
}
- private Bitmap getCurrentWallpaperLocked(int userId) {
+ private Bitmap getCurrentWallpaperLocked(Context context, int userId) {
if (mService == null) {
Log.w(TAG, "WallpaperService not running");
return null;
@@ -442,8 +451,8 @@
try {
Bundle params = new Bundle();
- ParcelFileDescriptor fd = mService.getWallpaper(this, FLAG_SYSTEM,
- params, userId);
+ ParcelFileDescriptor fd = mService.getWallpaper(context.getOpPackageName(),
+ this, FLAG_SYSTEM, params, userId);
if (fd != null) {
try {
BitmapFactory.Options options = new BitmapFactory.Options();
@@ -775,6 +784,7 @@
*
* @return Returns a Drawable object that will draw the wallpaper.
*/
+ @RequiresPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE)
public Drawable getFastDrawable() {
Bitmap bm = sGlobals.peekWallpaperBitmap(mContext, true, FLAG_SYSTEM);
if (bm != null) {
@@ -790,6 +800,7 @@
* @return Returns an optimized Drawable object that will draw the
* wallpaper or a null pointer if these is none.
*/
+ @RequiresPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE)
public Drawable peekFastDrawable() {
Bitmap bm = sGlobals.peekWallpaperBitmap(mContext, false, FLAG_SYSTEM);
if (bm != null) {
@@ -827,10 +838,14 @@
* @param which The wallpaper whose image file is to be retrieved. Must be a single
* defined kind of wallpaper, either {@link #FLAG_SYSTEM} or
* {@link #FLAG_LOCK}.
+ * @return An open, readable file desriptor to the requested wallpaper image file;
+ * or {@code null} if no such wallpaper is configured or if the calling app does
+ * not have permission to read the current wallpaper.
*
* @see #FLAG_LOCK
* @see #FLAG_SYSTEM
*/
+ @RequiresPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE)
public ParcelFileDescriptor getWallpaperFile(@SetWallpaperFlags int which) {
return getWallpaperFile(which, mContext.getUserId());
}
@@ -900,9 +915,18 @@
} else {
try {
Bundle outParams = new Bundle();
- return sGlobals.mService.getWallpaper(null, which, outParams, userId);
+ return sGlobals.mService.getWallpaper(mContext.getOpPackageName(), null, which,
+ outParams, userId);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
+ } catch (SecurityException e) {
+ if (mContext.getApplicationInfo().targetSdkVersion <= Build.VERSION_CODES.O) {
+ Log.w(TAG, "No permission to access wallpaper, suppressing"
+ + " exception to avoid crashing legacy app.");
+ return null;
+ } else {
+ throw e;
+ }
}
}
}
@@ -1042,6 +1066,7 @@
* @throws IOException If an error occurs reverting to the built-in
* wallpaper.
*/
+ @RequiresPermission(android.Manifest.permission.SET_WALLPAPER)
public void setResource(@RawRes int resid) throws IOException {
setResource(resid, FLAG_SYSTEM | FLAG_LOCK);
}
@@ -1060,6 +1085,7 @@
*
* @throws IOException
*/
+ @RequiresPermission(android.Manifest.permission.SET_WALLPAPER)
public int setResource(@RawRes int resid, @SetWallpaperFlags int which)
throws IOException {
if (sGlobals.mService == null) {
@@ -1115,6 +1141,7 @@
* @throws IOException If an error occurs when attempting to set the wallpaper
* to the provided image.
*/
+ @RequiresPermission(android.Manifest.permission.SET_WALLPAPER)
public void setBitmap(Bitmap bitmap) throws IOException {
setBitmap(bitmap, null, true);
}
@@ -1147,6 +1174,7 @@
* @throws IllegalArgumentException If the {@code visibleCropHint} rectangle is
* empty or invalid.
*/
+ @RequiresPermission(android.Manifest.permission.SET_WALLPAPER)
public int setBitmap(Bitmap fullImage, Rect visibleCropHint, boolean allowBackup)
throws IOException {
return setBitmap(fullImage, visibleCropHint, allowBackup, FLAG_SYSTEM | FLAG_LOCK);
@@ -1172,6 +1200,7 @@
*
* @throws IOException
*/
+ @RequiresPermission(android.Manifest.permission.SET_WALLPAPER)
public int setBitmap(Bitmap fullImage, Rect visibleCropHint,
boolean allowBackup, @SetWallpaperFlags int which)
throws IOException {
@@ -1243,6 +1272,7 @@
* @throws IOException If an error occurs when attempting to set the wallpaper
* based on the provided image data.
*/
+ @RequiresPermission(android.Manifest.permission.SET_WALLPAPER)
public void setStream(InputStream bitmapData) throws IOException {
setStream(bitmapData, null, true);
}
@@ -1285,6 +1315,7 @@
* @throws IllegalArgumentException If the {@code visibleCropHint} rectangle is
* empty or invalid.
*/
+ @RequiresPermission(android.Manifest.permission.SET_WALLPAPER)
public int setStream(InputStream bitmapData, Rect visibleCropHint, boolean allowBackup)
throws IOException {
return setStream(bitmapData, visibleCropHint, allowBackup, FLAG_SYSTEM | FLAG_LOCK);
@@ -1311,6 +1342,7 @@
*
* @throws IOException
*/
+ @RequiresPermission(android.Manifest.permission.SET_WALLPAPER)
public int setStream(InputStream bitmapData, Rect visibleCropHint,
boolean allowBackup, @SetWallpaperFlags int which)
throws IOException {
@@ -1572,6 +1604,7 @@
*
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.SET_WALLPAPER_COMPONENT)
public boolean setWallpaperComponent(ComponentName name, int userId) {
if (sGlobals.mService == null) {
Log.w(TAG, "WallpaperService not running");
@@ -1716,6 +1749,7 @@
* @throws IOException If an error occurs reverting to the built-in
* wallpaper.
*/
+ @RequiresPermission(android.Manifest.permission.SET_WALLPAPER)
public void clear() throws IOException {
setStream(openDefaultWallpaper(mContext, FLAG_SYSTEM), null, false);
}
@@ -1730,6 +1764,7 @@
* {@link #FLAG_LOCK}
* @throws IOException If an error occurs reverting to the built-in wallpaper.
*/
+ @RequiresPermission(android.Manifest.permission.SET_WALLPAPER)
public void clear(@SetWallpaperFlags int which) throws IOException {
if ((which & FLAG_SYSTEM) != 0) {
clear();
diff --git a/core/java/android/app/admin/ConnectEvent.java b/core/java/android/app/admin/ConnectEvent.java
index 423ee52..ffd38e2 100644
--- a/core/java/android/app/admin/ConnectEvent.java
+++ b/core/java/android/app/admin/ConnectEvent.java
@@ -23,7 +23,11 @@
import java.net.UnknownHostException;
/**
- * A class that represents a connect library call event.
+ * A class that represents a TCP connect event initiated through the standard network stack.
+ *
+ * <p>It contains information about the originating app as well as the remote TCP endpoint.
+ *
+ * <p>Support both IPv4 and IPv6 connections.
*/
public final class ConnectEvent extends NetworkEvent implements Parcelable {
diff --git a/core/java/android/app/admin/DeviceAdminReceiver.java b/core/java/android/app/admin/DeviceAdminReceiver.java
index d9b6eed..d0d98c9 100644
--- a/core/java/android/app/admin/DeviceAdminReceiver.java
+++ b/core/java/android/app/admin/DeviceAdminReceiver.java
@@ -238,8 +238,7 @@
* {@link android.app.admin.DevicePolicyManager#isProfileOwnerApp}. You will generally handle
* this in {@link DeviceAdminReceiver#onProfileProvisioningComplete}.
*
- * <p>Input: Nothing.</p>
- * <p>Output: Nothing</p>
+ * @see DevicePolicyManager#ACTION_PROVISIONING_SUCCESSFUL
*/
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
@BroadcastBehavior(explicitOnly = true)
@@ -660,15 +659,20 @@
* managed provisioning.
*
* <p>When provisioning of a managed profile is complete, the managed profile is hidden until
- * the profile owner calls {DevicePolicyManager#setProfileEnabled(ComponentName admin)}.
+ * the profile owner calls {@link DevicePolicyManager#setProfileEnabled(ComponentName admin)}.
* Typically a profile owner will enable the profile when it has finished any additional setup
- * such as adding an account by using the {@link AccountManager} and calling apis to bring the
+ * such as adding an account by using the {@link AccountManager} and calling APIs to bring the
* profile into the desired state.
*
* <p> Note that provisioning completes without waiting for any server interactions, so the
- * profile owner needs to wait for data to be available if required (e.g. android device ids or
+ * profile owner needs to wait for data to be available if required (e.g. Android device IDs or
* other data that is set as a result of server interactions).
*
+ * <p>From version {@link android.os.Build.VERSION_CODES#O}, when managed provisioning has
+ * completed, along with this callback the activity intent
+ * {@link DevicePolicyManager#ACTION_PROVISIONING_SUCCESSFUL} will also be sent to the same
+ * application.
+ *
* @param context The running context as per {@link #onReceive}.
* @param intent The received intent as per {@link #onReceive}.
*/
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index a749fe70..d8da8c5 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -169,8 +169,7 @@
*
* <p>From version {@link android.os.Build.VERSION_CODES#O}, when managed provisioning has
* completed, along with the above broadcast, activity intent
- * {@link #ACTION_PROVISIONING_SUCCESSFUL} will also be sent to the application specified in
- * the provisioning intent.
+ * {@link #ACTION_PROVISIONING_SUCCESSFUL} will also be sent to the profile owner.
*
* <p>If provisioning fails, the managedProfile is removed so the device returns to its
* previous state.
@@ -278,6 +277,7 @@
* @hide
*/
@SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+ @SystemApi
public static final String ACTION_STATE_USER_SETUP_COMPLETE =
"android.app.action.STATE_USER_SETUP_COMPLETE";
@@ -856,8 +856,7 @@
* {@link DeviceAdminReceiver#ACTION_PROFILE_PROVISIONING_COMPLETE} broadcast but this will be
* delivered faster as it's an activity intent.
*
- * <p>The intent is only sent to the application on the profile that requested provisioning. In
- * the device owner case the profile is the primary user.
+ * <p>The intent is only sent to the new device or profile owner.
*
* @see #ACTION_PROVISION_MANAGED_PROFILE
* @see #ACTION_PROVISION_MANAGED_DEVICE
@@ -3930,26 +3929,18 @@
/**
* Called by a device or profile owner to configure an always-on VPN connection through a
- * specific application for the current user.
- *
- * @deprecated this version only exists for compability with previous developer preview builds.
- * TODO: delete once there are no longer any live references.
- * @hide
- */
- @Deprecated
- public void setAlwaysOnVpnPackage(@NonNull ComponentName admin, @Nullable String vpnPackage)
- throws NameNotFoundException, UnsupportedOperationException {
- setAlwaysOnVpnPackage(admin, vpnPackage, /* lockdownEnabled */ true);
- }
-
- /**
- * Called by a device or profile owner to configure an always-on VPN connection through a
* specific application for the current user. This connection is automatically granted and
* persisted after a reboot.
* <p>
- * The designated package should declare a {@link android.net.VpnService} in its manifest
- * guarded by {@link android.Manifest.permission#BIND_VPN_SERVICE}, otherwise the call will
- * fail.
+ * To support the always-on feature, an app must
+ * <ul>
+ * <li>declare a {@link android.net.VpnService} in its manifest, guarded by
+ * {@link android.Manifest.permission#BIND_VPN_SERVICE};</li>
+ * <li>target {@link android.os.Build.VERSION_CODES#N API 24} or above; and</li>
+ * <li><i>not</i> explicitly opt out of the feature through
+ * {@link android.net.VpnService#METADATA_SUPPORTS_ALWAYS_ON}.</li>
+ * </ul>
+ * The call will fail if called with the package name of an unsupported VPN app.
*
* @param vpnPackage The package name for an installed VPN app on the device, or {@code null} to
* remove an existing always-on VPN configuration.
@@ -6430,34 +6421,35 @@
}
/**
- * Called by device owners to update {@link Settings.Global} settings. Validation that the value
- * of the setting is in the correct form for the setting type should be performed by the caller.
+ * Called by device owners to update {@link android.provider.Settings.Global} settings.
+ * Validation that the value of the setting is in the correct form for the setting type should
+ * be performed by the caller.
* <p>
* The settings that can be updated with this method are:
* <ul>
- * <li>{@link Settings.Global#ADB_ENABLED}</li>
- * <li>{@link Settings.Global#AUTO_TIME}</li>
- * <li>{@link Settings.Global#AUTO_TIME_ZONE}</li>
- * <li>{@link Settings.Global#DATA_ROAMING}</li>
- * <li>{@link Settings.Global#USB_MASS_STORAGE_ENABLED}</li>
- * <li>{@link Settings.Global#WIFI_SLEEP_POLICY}</li>
- * <li>{@link Settings.Global#STAY_ON_WHILE_PLUGGED_IN} This setting is only available from
- * {@link android.os.Build.VERSION_CODES#M} onwards and can only be set if
+ * <li>{@link android.provider.Settings.Global#ADB_ENABLED}</li>
+ * <li>{@link android.provider.Settings.Global#AUTO_TIME}</li>
+ * <li>{@link android.provider.Settings.Global#AUTO_TIME_ZONE}</li>
+ * <li>{@link android.provider.Settings.Global#DATA_ROAMING}</li>
+ * <li>{@link android.provider.Settings.Global#USB_MASS_STORAGE_ENABLED}</li>
+ * <li>{@link android.provider.Settings.Global#WIFI_SLEEP_POLICY}</li>
+ * <li>{@link android.provider.Settings.Global#STAY_ON_WHILE_PLUGGED_IN} This setting is only
+ * available from {@link android.os.Build.VERSION_CODES#M} onwards and can only be set if
* {@link #setMaximumTimeToLock} is not used to set a timeout.</li>
- * <li>{@link Settings.Global#WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN}</li> This setting is only
- * available from {@link android.os.Build.VERSION_CODES#M} onwards.</li>
+ * <li>{@link android.provider.Settings.Global#WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN}</li> This
+ * setting is only available from {@link android.os.Build.VERSION_CODES#M} onwards.</li>
* </ul>
* <p>
* Changing the following settings has no effect as of {@link android.os.Build.VERSION_CODES#M}:
* <ul>
- * <li>{@link Settings.Global#BLUETOOTH_ON}. Use
+ * <li>{@link android.provider.Settings.Global#BLUETOOTH_ON}. Use
* {@link android.bluetooth.BluetoothAdapter#enable()} and
* {@link android.bluetooth.BluetoothAdapter#disable()} instead.</li>
- * <li>{@link Settings.Global#DEVELOPMENT_SETTINGS_ENABLED}</li>
- * <li>{@link Settings.Global#MODE_RINGER}. Use
+ * <li>{@link android.provider.Settings.Global#DEVELOPMENT_SETTINGS_ENABLED}</li>
+ * <li>{@link android.provider.Settings.Global#MODE_RINGER}. Use
* {@link android.media.AudioManager#setRingerMode(int)} instead.</li>
- * <li>{@link Settings.Global#NETWORK_PREFERENCE}</li>
- * <li>{@link Settings.Global#WIFI_ON}. Use
+ * <li>{@link android.provider.Settings.Global#NETWORK_PREFERENCE}</li>
+ * <li>{@link android.provider.Settings.Global#WIFI_ON}. Use
* {@link android.net.wifi.WifiManager#setWifiEnabled(boolean)} instead.</li>
* </ul>
*
@@ -6478,19 +6470,19 @@
}
/**
- * Called by profile or device owners to update {@link Settings.Secure} settings. Validation
- * that the value of the setting is in the correct form for the setting type should be performed
- * by the caller.
+ * Called by profile or device owners to update {@link android.provider.Settings.Secure}
+ * settings. Validation that the value of the setting is in the correct form for the setting
+ * type should be performed by the caller.
* <p>
* The settings that can be updated by a profile or device owner with this method are:
* <ul>
- * <li>{@link Settings.Secure#DEFAULT_INPUT_METHOD}</li>
- * <li>{@link Settings.Secure#SKIP_FIRST_USE_HINTS}</li>
+ * <li>{@link android.provider.Settings.Secure#DEFAULT_INPUT_METHOD}</li>
+ * <li>{@link android.provider.Settings.Secure#SKIP_FIRST_USE_HINTS}</li>
* </ul>
* <p>
* A device owner can additionally update the following settings:
* <ul>
- * <li>{@link Settings.Secure#LOCATION_MODE}</li>
+ * <li>{@link android.provider.Settings.Secure#LOCATION_MODE}</li>
* </ul>
*
* <strong>Note: Starting from Android O, apps should no longer call this method with the
diff --git a/core/java/android/app/admin/DnsEvent.java b/core/java/android/app/admin/DnsEvent.java
index c21725f..f84c5b0 100644
--- a/core/java/android/app/admin/DnsEvent.java
+++ b/core/java/android/app/admin/DnsEvent.java
@@ -26,7 +26,10 @@
import java.util.List;
/**
- * A class that represents a DNS lookup event.
+ * A class that represents a DNS lookup event initiated through the standard network stack.
+ *
+ * <p>It contains information about the originating app as well as the DNS hostname and resolved
+ * IP addresses.
*/
public final class DnsEvent extends NetworkEvent implements Parcelable {
diff --git a/core/java/android/app/assist/AssistStructure.java b/core/java/android/app/assist/AssistStructure.java
index 4e8277c..55c22de 100644
--- a/core/java/android/app/assist/AssistStructure.java
+++ b/core/java/android/app/assist/AssistStructure.java
@@ -1905,6 +1905,10 @@
activity.getActivityToken());
for (int i=0; i<views.size(); i++) {
ViewRootImpl root = views.get(i);
+ if (root.getView() == null) {
+ Log.w(TAG, "Skipping window with dettached view: " + root.getTitle());
+ continue;
+ }
mWindowNodes.add(new WindowNode(this, root, forAutoFill, flags));
}
}
diff --git a/core/java/android/app/backup/IBackupManager.aidl b/core/java/android/app/backup/IBackupManager.aidl
index 9c3b110..f1dc6d2 100644
--- a/core/java/android/app/backup/IBackupManager.aidl
+++ b/core/java/android/app/backup/IBackupManager.aidl
@@ -57,6 +57,15 @@
void clearBackupData(String transportName, String packageName);
/**
+ * Run an initialize operation on the given transports. This will wipe all data from
+ * the backing data store and establish a clean starting point for all backup
+ * operations.
+ *
+ * <p>Callers must hold the android.permission.BACKUP permission to use this method.
+ */
+ void initializeTransports(in String[] transportNames, IBackupObserver observer);
+
+ /**
* Notifies the Backup Manager Service that an agent has become available. This
* method is only invoked by the Activity Manager.
*/
diff --git a/core/java/android/app/backup/IBackupObserver.aidl b/core/java/android/app/backup/IBackupObserver.aidl
index 821a589..07a6634 100644
--- a/core/java/android/app/backup/IBackupObserver.aidl
+++ b/core/java/android/app/backup/IBackupObserver.aidl
@@ -29,20 +29,22 @@
* This method could be called several times for packages with full data backup.
* It will tell how much of backup data is already saved and how much is expected.
*
- * @param currentBackupPackage The name of the package that now being backuped.
+ * @param currentBackupPackage The name of the package that now being backed up.
* @param backupProgress Current progress of backup for the package.
*/
void onUpdate(String currentPackage, in BackupProgress backupProgress);
/**
- * The backup of single package has completed. This method will be called at most one time
- * for each package and could be not called if backup is failed before and
- * backupFinished() is called.
+ * Backup of one package or initialization of one transport has completed. This
+ * method will be called at most one time for each package or transport, and might not
+ * be not called if the operation fails before backupFinished(); for example, if the
+ * requested package/transport does not exist.
*
- * @param currentBackupPackage The name of the package that was backuped.
+ * @param target The name of the package that was backed up, or of the transport
+ * that was initialized
* @param status Zero on success; a nonzero error code if the backup operation failed.
*/
- void onResult(String currentPackage, int status);
+ void onResult(String target, int status);
/**
* The backup process has completed. This method will always be called,
diff --git a/core/java/android/app/backup/RestoreDescription.java b/core/java/android/app/backup/RestoreDescription.java
index 611ff07..0250326 100644
--- a/core/java/android/app/backup/RestoreDescription.java
+++ b/core/java/android/app/backup/RestoreDescription.java
@@ -34,7 +34,7 @@
private final String mPackageName;
private final int mDataType;
- private static final String NO_MORE_PACKAGES_SENTINEL = "";
+ private static final String NO_MORE_PACKAGES_SENTINEL = "NO_MORE_PACKAGES";
/**
* Return this constant RestoreDescription from BackupTransport.nextRestorePackage()
diff --git a/core/java/android/app/job/JobParameters.java b/core/java/android/app/job/JobParameters.java
index 98bdde8..a6f6be2 100644
--- a/core/java/android/app/job/JobParameters.java
+++ b/core/java/android/app/job/JobParameters.java
@@ -45,6 +45,18 @@
/** @hide */
public static final int REASON_DEVICE_IDLE = 4;
+ /** @hide */
+ public static String getReasonName(int reason) {
+ switch (reason) {
+ case REASON_CANCELED: return "canceled";
+ case REASON_CONSTRAINTS_NOT_SATISFIED: return "constraints";
+ case REASON_PREEMPT: return "preempt";
+ case REASON_TIMEOUT: return "timeout";
+ case REASON_DEVICE_IDLE: return "device_idle";
+ default: return "unknown:" + reason;
+ }
+ }
+
private final int jobId;
private final PersistableBundle extras;
private final Bundle transientExtras;
diff --git a/core/java/android/app/timezone/Callback.java b/core/java/android/app/timezone/Callback.java
index b51e5ba..aea8038 100644
--- a/core/java/android/app/timezone/Callback.java
+++ b/core/java/android/app/timezone/Callback.java
@@ -27,7 +27,6 @@
*
* @hide
*/
-// TODO(nfuller): Expose necessary APIs for OEMs with @SystemApi. http://b/31008728
public abstract class Callback {
@Retention(RetentionPolicy.SOURCE)
diff --git a/core/java/android/app/timezone/DistroFormatVersion.java b/core/java/android/app/timezone/DistroFormatVersion.java
index e879e8f..be732e4 100644
--- a/core/java/android/app/timezone/DistroFormatVersion.java
+++ b/core/java/android/app/timezone/DistroFormatVersion.java
@@ -35,7 +35,6 @@
*
* @hide
*/
-// TODO(nfuller): Expose necessary APIs for OEMs with @SystemApi. http://b/31008728
public final class DistroFormatVersion implements Parcelable {
private final int mMajorVersion;
diff --git a/core/java/android/app/timezone/DistroRulesVersion.java b/core/java/android/app/timezone/DistroRulesVersion.java
index 5503ce1..a680594 100644
--- a/core/java/android/app/timezone/DistroRulesVersion.java
+++ b/core/java/android/app/timezone/DistroRulesVersion.java
@@ -36,7 +36,6 @@
*
* @hide
*/
-// TODO(nfuller): Expose necessary APIs for OEMs with @SystemApi. http://b/31008728
public final class DistroRulesVersion implements Parcelable {
private final String mRulesVersion;
@@ -125,4 +124,8 @@
+ ", mRevision='" + mRevision + '\''
+ '}';
}
+
+ public String toDumpString() {
+ return mRulesVersion + "," + mRevision;
+ }
}
diff --git a/core/java/android/app/timezone/RulesManager.java b/core/java/android/app/timezone/RulesManager.java
index 649d894..ad9b698 100644
--- a/core/java/android/app/timezone/RulesManager.java
+++ b/core/java/android/app/timezone/RulesManager.java
@@ -64,7 +64,6 @@
* {@link Context#TIME_ZONE_RULES_MANAGER_SERVICE}.
* @hide
*/
-// TODO(nfuller): Expose necessary APIs for OEMs with @SystemApi. http://b/31008728
public final class RulesManager {
private static final String TAG = "timezone.RulesManager";
private static final boolean DEBUG = false;
diff --git a/core/java/android/app/timezone/RulesState.java b/core/java/android/app/timezone/RulesState.java
index 33f4e80..ec247eb 100644
--- a/core/java/android/app/timezone/RulesState.java
+++ b/core/java/android/app/timezone/RulesState.java
@@ -60,7 +60,6 @@
*
* @hide
*/
-// TODO(nfuller): Expose necessary APIs for OEMs with @SystemApi. http://b/31008728
public final class RulesState implements Parcelable {
@Retention(RetentionPolicy.SOURCE)
@@ -174,29 +173,14 @@
}
/**
- * Returns true if the distro IANA rules version supplied is newer or the same as the version in
- * the system image data files.
+ * Returns true if the system image data files contain IANA rules data that are newer than the
+ * distro IANA rules version supplied, i.e. true when the version specified would be "worse"
+ * than the one that is in the system image. Returns false if the system image version is the
+ * same or older, i.e. false when the version specified would be "better" than the one that is
+ * in the system image.
*/
- public boolean isSystemVersionOlderThan(DistroRulesVersion distroRulesVersion) {
- return mSystemRulesVersion.compareTo(distroRulesVersion.getRulesVersion()) < 0;
- }
-
- public boolean isDistroInstalled() {
- return mDistroStatus == DISTRO_STATUS_INSTALLED;
- }
-
- /**
- * Returns true if the rules version supplied is newer than the one currently installed. If
- * there is no installed distro this method throws IllegalStateException.
- */
- public boolean isInstalledDistroOlderThan(DistroRulesVersion distroRulesVersion) {
- if (mOperationInProgress) {
- throw new IllegalStateException("Distro state not known: operation in progress.");
- }
- if (!isDistroInstalled()) {
- throw new IllegalStateException("No distro installed.");
- }
- return mInstalledDistroRulesVersion.isOlderThan(distroRulesVersion);
+ public boolean isSystemVersionNewerThan(DistroRulesVersion distroRulesVersion) {
+ return mSystemRulesVersion.compareTo(distroRulesVersion.getRulesVersion()) > 0;
}
public static final Parcelable.Creator<RulesState> CREATOR =
diff --git a/core/java/android/app/timezone/RulesUpdaterContract.java b/core/java/android/app/timezone/RulesUpdaterContract.java
index 4e77818..9c62f46 100644
--- a/core/java/android/app/timezone/RulesUpdaterContract.java
+++ b/core/java/android/app/timezone/RulesUpdaterContract.java
@@ -19,6 +19,7 @@
import android.content.Context;
import android.content.Intent;
import android.os.ParcelFileDescriptor;
+import android.os.UserHandle;
/**
* Constants related to the contract between the Android system and the privileged time zone updater
@@ -26,7 +27,6 @@
*
* @hide
*/
-// TODO(nfuller): Expose necessary APIs for OEMs with @SystemApi. http://b/31008728
public final class RulesUpdaterContract {
/**
@@ -82,6 +82,9 @@
byte[] checkTokenBytes) {
Intent intent = createUpdaterIntent(updaterAppPackageName);
intent.putExtra(EXTRA_CHECK_TOKEN, checkTokenBytes);
- context.sendBroadcast(intent, RulesUpdaterContract.UPDATE_TIME_ZONE_RULES_PERMISSION);
+ context.sendBroadcastAsUser(
+ intent,
+ UserHandle.of(UserHandle.myUserId()),
+ RulesUpdaterContract.UPDATE_TIME_ZONE_RULES_PERMISSION);
}
}
diff --git a/core/java/android/app/usage/ExternalStorageStats.java b/core/java/android/app/usage/ExternalStorageStats.java
index d7e570f..f00e5c2 100644
--- a/core/java/android/app/usage/ExternalStorageStats.java
+++ b/core/java/android/app/usage/ExternalStorageStats.java
@@ -33,6 +33,7 @@
/** {@hide} */ public long videoBytes;
/** {@hide} */ public long imageBytes;
/** {@hide} */ public long appBytes;
+ /** {@hide} */ public long obbBytes;
/**
* Return the total bytes used by all files in the shared/external storage
@@ -97,6 +98,11 @@
}
/** {@hide} */
+ public @BytesLong long getObbBytes() {
+ return obbBytes;
+ }
+
+ /** {@hide} */
public ExternalStorageStats() {
}
@@ -107,6 +113,7 @@
this.videoBytes = in.readLong();
this.imageBytes = in.readLong();
this.appBytes = in.readLong();
+ this.obbBytes = in.readLong();
}
@Override
@@ -121,6 +128,7 @@
dest.writeLong(videoBytes);
dest.writeLong(imageBytes);
dest.writeLong(appBytes);
+ dest.writeLong(obbBytes);
}
public static final Creator<ExternalStorageStats> CREATOR = new Creator<ExternalStorageStats>() {
diff --git a/core/java/android/appwidget/AppWidgetHost.java b/core/java/android/appwidget/AppWidgetHost.java
index c1ff580..37360ba 100644
--- a/core/java/android/appwidget/AppWidgetHost.java
+++ b/core/java/android/appwidget/AppWidgetHost.java
@@ -16,15 +16,13 @@
package android.appwidget;
-import java.lang.ref.WeakReference;
-import java.util.List;
-
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.IntentSender;
+import android.content.pm.PackageManager;
import android.os.Binder;
import android.os.Bundle;
import android.os.Handler;
@@ -42,6 +40,9 @@
import com.android.internal.appwidget.IAppWidgetHost;
import com.android.internal.appwidget.IAppWidgetService;
+import java.lang.ref.WeakReference;
+import java.util.List;
+
/**
* AppWidgetHost provides the interaction with the AppWidget service for apps,
* like the home screen, that want to embed AppWidgets in their UI.
@@ -55,6 +56,7 @@
final static Object sServiceLock = new Object();
static IAppWidgetService sService;
+ static boolean sServiceInitialized = false;
private DisplayMetrics mDisplayMetrics;
private String mContextOpPackageName;
@@ -160,15 +162,21 @@
mHandler = new UpdateHandler(looper);
mCallbacks = new Callbacks(mHandler);
mDisplayMetrics = context.getResources().getDisplayMetrics();
- bindService();
+ bindService(context);
}
- private static void bindService() {
+ private static void bindService(Context context) {
synchronized (sServiceLock) {
- if (sService == null) {
- IBinder b = ServiceManager.getService(Context.APPWIDGET_SERVICE);
- sService = IAppWidgetService.Stub.asInterface(b);
+ if (sServiceInitialized) {
+ return;
}
+ sServiceInitialized = true;
+ if (!context.getPackageManager().hasSystemFeature(
+ PackageManager.FEATURE_APP_WIDGETS)) {
+ return;
+ }
+ IBinder b = ServiceManager.getService(Context.APPWIDGET_SERVICE);
+ sService = IAppWidgetService.Stub.asInterface(b);
}
}
@@ -177,6 +185,9 @@
* becomes visible, i.e. from onStart() in your Activity.
*/
public void startListening() {
+ if (sService == null) {
+ return;
+ }
final int[] idsToUpdate;
synchronized (mViews) {
int N = mViews.size();
@@ -215,6 +226,9 @@
* no longer visible, i.e. from onStop() in your Activity.
*/
public void stopListening() {
+ if (sService == null) {
+ return;
+ }
try {
sService.stopListening(mContextOpPackageName, mHostId);
}
@@ -229,6 +243,9 @@
* @return a appWidgetId
*/
public int allocateAppWidgetId() {
+ if (sService == null) {
+ return -1;
+ }
try {
return sService.allocateAppWidgetId(mContextOpPackageName, mHostId);
}
@@ -258,6 +275,9 @@
*/
public final void startAppWidgetConfigureActivityForResult(@NonNull Activity activity,
int appWidgetId, int intentFlags, int requestCode, @Nullable Bundle options) {
+ if (sService == null) {
+ return;
+ }
try {
IntentSender intentSender = sService.createAppWidgetConfigIntentSender(
mContextOpPackageName, appWidgetId, intentFlags);
@@ -278,10 +298,10 @@
* Gets a list of all the appWidgetIds that are bound to the current host
*/
public int[] getAppWidgetIds() {
+ if (sService == null) {
+ return new int[0];
+ }
try {
- if (sService == null) {
- bindService();
- }
return sService.getAppWidgetIdsForHost(mContextOpPackageName, mHostId);
} catch (RemoteException e) {
throw new RuntimeException("system server dead?", e);
@@ -292,6 +312,9 @@
* Stop listening to changes for this AppWidget.
*/
public void deleteAppWidgetId(int appWidgetId) {
+ if (sService == null) {
+ return;
+ }
synchronized (mViews) {
mViews.remove(appWidgetId);
try {
@@ -312,6 +335,9 @@
* </ul>
*/
public void deleteHost() {
+ if (sService == null) {
+ return;
+ }
try {
sService.deleteHost(mContextOpPackageName, mHostId);
}
@@ -329,6 +355,9 @@
* </ul>
*/
public static void deleteAllHosts() {
+ if (sService == null) {
+ return;
+ }
try {
sService.deleteAllHosts();
}
@@ -343,6 +372,9 @@
*/
public final AppWidgetHostView createView(Context context, int appWidgetId,
AppWidgetProviderInfo appWidget) {
+ if (sService == null) {
+ return null;
+ }
AppWidgetHostView view = onCreateView(context, appWidgetId, appWidget);
view.setOnClickHandler(mOnClickHandler);
view.setAppWidget(appWidgetId, appWidget);
diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java
index 64c0f31..fc3a724 100644
--- a/core/java/android/bluetooth/BluetoothAdapter.java
+++ b/core/java/android/bluetooth/BluetoothAdapter.java
@@ -70,9 +70,10 @@
* devices, and start a scan for Bluetooth LE devices.
*
* <p>To get a {@link BluetoothAdapter} representing the local Bluetooth
- * adapter, when running on JELLY_BEAN_MR1 and below, call the
- * static {@link #getDefaultAdapter} method; when running on JELLY_BEAN_MR2 and
- * higher, call {@link BluetoothManager#getAdapter}.
+ * adapter, call the {@link BluetoothManager#getAdapter} function on {@link BluetoothManager}.
+ * On JELLY_BEAN_MR1 and below you will need to use the static {@link #getDefaultAdapter}
+ * method instead.
+ * </p><p>
* Fundamentally, this is your starting point for all
* Bluetooth actions. Once you have the local adapter, you can get a set of
* {@link BluetoothDevice} objects representing all paired devices with
@@ -81,14 +82,13 @@
* listen for incoming connection requests with
* {@link #listenUsingRfcommWithServiceRecord(String,UUID)}; or start a scan for
* Bluetooth LE devices with {@link #startLeScan(LeScanCallback callback)}.
- *
- * <p>This class is thread safe.
- *
+ * </p>
+ * <p>This class is thread safe.</p>
* <p class="note"><strong>Note:</strong>
* Most methods require the {@link android.Manifest.permission#BLUETOOTH}
* permission and some also require the
* {@link android.Manifest.permission#BLUETOOTH_ADMIN} permission.
- *
+ * </p>
* <div class="special reference">
* <h3>Developer Guides</h3>
* <p>
@@ -565,6 +565,7 @@
* <p>Currently Android only supports one Bluetooth adapter, but the API
* could be extended to support more. This will always return the default
* adapter.
+ * </p>
* @return the default local adapter, or null if Bluetooth is not supported
* on this hardware platform
*/
diff --git a/core/java/android/bluetooth/BluetoothManager.java b/core/java/android/bluetooth/BluetoothManager.java
index e2fa38a..bacce80 100644
--- a/core/java/android/bluetooth/BluetoothManager.java
+++ b/core/java/android/bluetooth/BluetoothManager.java
@@ -33,10 +33,7 @@
* Use {@link android.content.Context#getSystemService(java.lang.String)}
* with {@link Context#BLUETOOTH_SERVICE} to create an {@link BluetoothManager},
* then call {@link #getAdapter} to obtain the {@link BluetoothAdapter}.
- * <p>
- * Alternately, you can just call the static helper
- * {@link BluetoothAdapter#getDefaultAdapter()}.
- *
+ * </p>
* <div class="special reference">
* <h3>Developer Guides</h3>
* <p>
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 7d2f8d1..2d8249a 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -2934,6 +2934,7 @@
WIFI_AWARE_SERVICE,
WIFI_P2P_SERVICE,
WIFI_SCANNING_SERVICE,
+ //@hide: LOWPAN_SERVICE,
//@hide: WIFI_RTT_SERVICE,
//@hide: ETHERNET_SERVICE,
WIFI_RTT_SERVICE,
@@ -2989,7 +2990,8 @@
SHORTCUT_SERVICE,
//@hide: CONTEXTHUB_SERVICE,
SYSTEM_HEALTH_SERVICE,
- //@hide: INCIDENT_SERVICE
+ //@hide: INCIDENT_SERVICE,
+ COMPANION_DEVICE_SERVICE
})
@Retention(RetentionPolicy.SOURCE)
public @interface ServiceName {}
@@ -3462,6 +3464,18 @@
/**
* Use with {@link #getSystemService} to retrieve a {@link
+ * android.net.lowpan.LowpanManager} for handling management of
+ * LoWPAN access.
+ *
+ * @see #getSystemService
+ * @see android.net.lowpan.LowpanManager
+ *
+ * @hide
+ */
+ public static final String LOWPAN_SERVICE = "lowpan";
+
+ /**
+ * Use with {@link #getSystemService} to retrieve a {@link
* android.net.EthernetManager} for handling management of
* Ethernet access.
*
@@ -3947,7 +3961,7 @@
* @see #getSystemService
* @hide
*/
- public static final String RADIO_SERVICE = "radio";
+ public static final String RADIO_SERVICE = "broadcastradio";
/**
* Use with {@link #getSystemService} to retrieve a
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index f70215b..daeb987 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -5587,6 +5587,16 @@
// ---------------------------------------------------------------------
+ private static final int COPY_MODE_ALL = 0;
+ private static final int COPY_MODE_FILTER = 1;
+ private static final int COPY_MODE_HISTORY = 2;
+
+ /** @hide */
+ @IntDef(value = {COPY_MODE_ALL, COPY_MODE_FILTER, COPY_MODE_HISTORY})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface CopyMode {}
+
+
/**
* Create an empty intent.
*/
@@ -5597,28 +5607,46 @@
* Copy constructor.
*/
public Intent(Intent o) {
+ this(o, COPY_MODE_ALL);
+ }
+
+ private Intent(Intent o, @CopyMode int copyMode) {
this.mAction = o.mAction;
this.mData = o.mData;
this.mType = o.mType;
this.mPackage = o.mPackage;
this.mComponent = o.mComponent;
- this.mFlags = o.mFlags;
- this.mContentUserHint = o.mContentUserHint;
- this.mLaunchToken = o.mLaunchToken;
+
if (o.mCategories != null) {
- this.mCategories = new ArraySet<String>(o.mCategories);
+ this.mCategories = new ArraySet<>(o.mCategories);
}
- if (o.mExtras != null) {
- this.mExtras = new Bundle(o.mExtras);
- }
- if (o.mSourceBounds != null) {
- this.mSourceBounds = new Rect(o.mSourceBounds);
- }
- if (o.mSelector != null) {
- this.mSelector = new Intent(o.mSelector);
- }
- if (o.mClipData != null) {
- this.mClipData = new ClipData(o.mClipData);
+
+ if (copyMode != COPY_MODE_FILTER) {
+ this.mFlags = o.mFlags;
+ this.mContentUserHint = o.mContentUserHint;
+ this.mLaunchToken = o.mLaunchToken;
+ if (o.mSourceBounds != null) {
+ this.mSourceBounds = new Rect(o.mSourceBounds);
+ }
+ if (o.mSelector != null) {
+ this.mSelector = new Intent(o.mSelector);
+ }
+
+ if (copyMode != COPY_MODE_HISTORY) {
+ if (o.mExtras != null) {
+ this.mExtras = new Bundle(o.mExtras);
+ }
+ if (o.mClipData != null) {
+ this.mClipData = new ClipData(o.mClipData);
+ }
+ } else {
+ if (o.mExtras != null && !o.mExtras.maybeIsEmpty()) {
+ this.mExtras = Bundle.STRIPPED;
+ }
+
+ // Also set "stripped" clip data when we ever log mClipData in the (broadcast)
+ // history.
+ }
}
}
@@ -5627,23 +5655,12 @@
return new Intent(this);
}
- private Intent(Intent o, boolean all) {
- this.mAction = o.mAction;
- this.mData = o.mData;
- this.mType = o.mType;
- this.mPackage = o.mPackage;
- this.mComponent = o.mComponent;
- if (o.mCategories != null) {
- this.mCategories = new ArraySet<String>(o.mCategories);
- }
- }
-
/**
* Make a clone of only the parts of the Intent that are relevant for
* filter matching: the action, data, type, component, and categories.
*/
public @NonNull Intent cloneFilter() {
- return new Intent(this, false);
+ return new Intent(this, COPY_MODE_FILTER);
}
/**
@@ -7395,6 +7412,29 @@
}
/**
+ * @return Whether {@link #maybeStripForHistory} will return an lightened intent or
+ * return itself as-is.
+ * @hide
+ */
+ public boolean canStripForHistory() {
+ return ((mExtras != null) && mExtras.isParcelled()) || (mClipData != null);
+ }
+
+ /**
+ * Call it when the system needs to keep an intent for logging purposes to remove fields
+ * that are not needed for logging.
+ * @hide
+ */
+ public Intent maybeStripForHistory() {
+ // TODO Scan and remove possibly heavy instances like Bitmaps from unparcelled extras?
+
+ if (!canStripForHistory()) {
+ return this;
+ }
+ return new Intent(this, COPY_MODE_HISTORY);
+ }
+
+ /**
* Retrieve any special flags associated with this intent. You will
* normally just set them with {@link #setFlags} and let the system
* take the appropriate action with them.
diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java
index 16c834d..fec2847 100644
--- a/core/java/android/content/pm/ActivityInfo.java
+++ b/core/java/android/content/pm/ActivityInfo.java
@@ -439,6 +439,22 @@
* @hide
*/
public static final int FLAG_SUPPORTS_PICTURE_IN_PICTURE = 0x400000;
+
+ /**
+ * Bit in {@link #flags} indicating if the activity should be shown when locked.
+ * See {@link android.R.attr#showWhenLocked}
+ * @hide
+ */
+ public static final int FLAG_SHOW_WHEN_LOCKED = 0x800000;
+
+ /**
+ * Bit in {@link #flags} indicating if the screen should turn on when starting the activity.
+ * See {@link android.R.attr#turnScreenOn}
+ * @hide
+ */
+ public static final int FLAG_TURN_SCREEN_ON = 0x1000000;
+
+
/**
* @hide Bit in {@link #flags}: If set, this component will only be seen
* by the system user. Only works with broadcast receivers. Set from the
@@ -460,6 +476,7 @@
* thrown. Set from the {@link android.R.attr#allowEmbedded} attribute.
*/
public static final int FLAG_ALLOW_EMBEDDED = 0x80000000;
+
/**
* Options that have been set in the activity declaration in the
* manifest.
diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java
index 06f7916..0bfe567 100644
--- a/core/java/android/content/pm/ApplicationInfo.java
+++ b/core/java/android/content/pm/ApplicationInfo.java
@@ -1005,6 +1005,12 @@
}
}
+ /** @hide */
+ public String classLoaderName;
+
+ /** @hide */
+ public String[] splitClassLoaderNames;
+
public void dump(Printer pw, String prefix) {
dump(pw, prefix, DUMP_FLAG_ALL);
}
@@ -1056,6 +1062,13 @@
pw.println(prefix + "sharedLibraryFiles=" + Arrays.toString(sharedLibraryFiles));
}
}
+ if (classLoaderName != null) {
+ pw.println(prefix + "classLoaderName=" + classLoaderName);
+ }
+ if (!ArrayUtils.isEmpty(splitClassLoaderNames)) {
+ pw.println(prefix + "splitClassLoaderNames=" + Arrays.toString(splitClassLoaderNames));
+ }
+
pw.println(prefix + "enabled=" + enabled
+ " minSdkVersion=" + minSdkVersion
+ " targetSdkVersion=" + targetSdkVersion
@@ -1178,6 +1191,8 @@
networkSecurityConfigRes = orig.networkSecurityConfigRes;
category = orig.category;
targetSandboxVersion = orig.targetSandboxVersion;
+ classLoaderName = orig.classLoaderName;
+ splitClassLoaderNames = orig.splitClassLoaderNames;
}
public String toString() {
@@ -1246,6 +1261,8 @@
dest.writeInt(networkSecurityConfigRes);
dest.writeInt(category);
dest.writeInt(targetSandboxVersion);
+ dest.writeString(classLoaderName);
+ dest.writeStringArray(splitClassLoaderNames);
}
public static final Parcelable.Creator<ApplicationInfo> CREATOR
@@ -1311,6 +1328,8 @@
networkSecurityConfigRes = source.readInt();
category = source.readInt();
targetSandboxVersion = source.readInt();
+ classLoaderName = source.readString();
+ splitClassLoaderNames = source.readStringArray();
}
/**
diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl
index 4b44a17..64d687e 100644
--- a/core/java/android/content/pm/IPackageManager.aidl
+++ b/core/java/android/content/pm/IPackageManager.aidl
@@ -508,21 +508,13 @@
in boolean isSharedModule, IDexModuleRegisterCallback callback);
/**
- * Ask the package manager to perform a dex-opt for the given reason. The package
- * manager will map the reason to a compiler filter according to the current system
- * configuration.
- */
- boolean performDexOpt(String packageName, boolean checkProfiles,
- int compileReason, boolean force, boolean bootComplete);
-
- /**
* Ask the package manager to perform a dex-opt with the given compiler filter.
*
* Note: exposed only for the shell command to allow moving packages explicitly to a
* definite state.
*/
boolean performDexOptMode(String packageName, boolean checkProfiles,
- String targetCompilerFilter, boolean force, boolean bootComplete);
+ String targetCompilerFilter, boolean force, boolean bootComplete, String splitName);
/**
* Ask the package manager to perform a dex-opt with the given compiler filter on the
diff --git a/core/java/android/content/pm/PackageBackwardCompatibility.java b/core/java/android/content/pm/PackageBackwardCompatibility.java
new file mode 100644
index 0000000..4de160b
--- /dev/null
+++ b/core/java/android/content/pm/PackageBackwardCompatibility.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.content.pm;
+
+import android.annotation.Nullable;
+import android.content.pm.PackageParser.Package;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.ArrayUtils;
+
+import java.util.ArrayList;
+
+/**
+ * Modifies {@link Package} in order to maintain backwards compatibility.
+ *
+ * @hide
+ */
+@VisibleForTesting
+public class PackageBackwardCompatibility {
+
+ private static final String ANDROID_TEST_MOCK = "android.test.mock";
+
+ private static final String ANDROID_TEST_RUNNER = "android.test.runner";
+
+ /**
+ * Modify the shared libraries in the supplied {@link Package} to maintain backwards
+ * compatibility.
+ *
+ * @param pkg the {@link Package} to modify.
+ */
+ @VisibleForTesting
+ public static void modifySharedLibraries(Package pkg) {
+ ArrayList<String> usesLibraries = pkg.usesLibraries;
+ ArrayList<String> usesOptionalLibraries = pkg.usesOptionalLibraries;
+
+ usesLibraries = orgApacheHttpLegacy(usesLibraries);
+ usesOptionalLibraries = orgApacheHttpLegacy(usesOptionalLibraries);
+
+ // android.test.runner has a dependency on android.test.mock so if android.test.runner
+ // is present but android.test.mock is not then add android.test.mock.
+ boolean androidTestMockPresent = ArrayUtils.contains(usesLibraries, ANDROID_TEST_MOCK)
+ || ArrayUtils.contains(usesOptionalLibraries, ANDROID_TEST_MOCK);
+ if (ArrayUtils.contains(usesLibraries, ANDROID_TEST_RUNNER) && !androidTestMockPresent) {
+ usesLibraries.add(ANDROID_TEST_MOCK);
+ }
+ if (ArrayUtils.contains(usesOptionalLibraries, ANDROID_TEST_RUNNER)
+ && !androidTestMockPresent) {
+ usesOptionalLibraries.add(ANDROID_TEST_MOCK);
+ }
+
+ pkg.usesLibraries = usesLibraries;
+ pkg.usesOptionalLibraries = usesOptionalLibraries;
+ }
+
+ private static ArrayList<String> orgApacheHttpLegacy(@Nullable ArrayList<String> libraries) {
+ // "org.apache.http.legacy" is now a part of the boot classpath so it doesn't need
+ // to be an explicit dependency.
+ //
+ // A future change will remove this library from the boot classpath, at which point
+ // all apps that target SDK 21 and earlier will have it automatically added to their
+ // dependency lists.
+ return ArrayUtils.remove(libraries, "org.apache.http.legacy");
+ }
+}
diff --git a/core/java/android/content/pm/PackageInfo.java b/core/java/android/content/pm/PackageInfo.java
index 7f11985..cf0edca 100644
--- a/core/java/android/content/pm/PackageInfo.java
+++ b/core/java/android/content/pm/PackageInfo.java
@@ -252,6 +252,9 @@
public int installLocation = INSTALL_LOCATION_INTERNAL_ONLY;
/** @hide */
+ public boolean isStub;
+
+ /** @hide */
public boolean coreApp;
/** @hide */
@@ -324,6 +327,7 @@
dest.writeTypedArray(reqFeatures, parcelableFlags);
dest.writeTypedArray(featureGroups, parcelableFlags);
dest.writeInt(installLocation);
+ dest.writeInt(isStub ? 1 : 0);
dest.writeInt(coreApp ? 1 : 0);
dest.writeInt(requiredForAllUsers ? 1 : 0);
dest.writeString(restrictedAccountType);
@@ -375,6 +379,7 @@
reqFeatures = source.createTypedArray(FeatureInfo.CREATOR);
featureGroups = source.createTypedArray(FeatureGroupInfo.CREATOR);
installLocation = source.readInt();
+ isStub = source.readInt() != 0;
coreApp = source.readInt() != 0;
requiredForAllUsers = source.readInt() != 0;
restrictedAccountType = source.readString();
diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java
index 5eca57b..ea675fb 100644
--- a/core/java/android/content/pm/PackageInstaller.java
+++ b/core/java/android/content/pm/PackageInstaller.java
@@ -27,6 +27,7 @@
import android.app.AppGlobals;
import android.content.Intent;
import android.content.IntentSender;
+import android.content.pm.PackageManager.DeleteFlags;
import android.content.pm.PackageManager.InstallReason;
import android.graphics.Bitmap;
import android.net.Uri;
@@ -443,8 +444,24 @@
* @param statusReceiver Where to deliver the result.
*/
public void uninstall(@NonNull String packageName, @NonNull IntentSender statusReceiver) {
- uninstall(new VersionedPackage(packageName, PackageManager.VERSION_CODE_HIGHEST),
- statusReceiver);
+ uninstall(packageName, 0 /*flags*/, statusReceiver);
+ }
+
+ /**
+ * Uninstall the given package, removing it completely from the device. This
+ * method is only available to the current "installer of record" for the
+ * package.
+ *
+ * @param packageName The package to uninstall.
+ * @param flags Flags for uninstall.
+ * @param statusReceiver Where to deliver the result.
+ *
+ * @hide
+ */
+ public void uninstall(@NonNull String packageName, @DeleteFlags int flags,
+ @NonNull IntentSender statusReceiver) {
+ uninstall(new VersionedPackage(packageName, PackageManager.VERSION_CODE_HIGHEST),
+ flags, statusReceiver);
}
/**
@@ -458,15 +475,34 @@
* @param versionedPackage The versioned package to uninstall.
* @param statusReceiver Where to deliver the result.
*/
+ public void uninstall(@NonNull VersionedPackage versionedPackage,
+ @NonNull IntentSender statusReceiver) {
+ uninstall(versionedPackage, 0 /*flags*/, statusReceiver);
+ }
+
+ /**
+ * Uninstall the given package with a specific version code, removing it
+ * completely from the device. This method is only available to the current
+ * "installer of record" for the package. If the version code of the package
+ * does not match the one passed in the versioned package argument this
+ * method is a no-op. Use {@link PackageManager#VERSION_CODE_HIGHEST} to
+ * uninstall the latest version of the package.
+ *
+ * @param versionedPackage The versioned package to uninstall.
+ * @param flags Flags for uninstall.
+ * @param statusReceiver Where to deliver the result.
+ *
+ * @hide
+ */
@RequiresPermission(anyOf = {
Manifest.permission.DELETE_PACKAGES,
Manifest.permission.REQUEST_DELETE_PACKAGES})
- public void uninstall(@NonNull VersionedPackage versionedPackage,
+ public void uninstall(@NonNull VersionedPackage versionedPackage, @DeleteFlags int flags,
@NonNull IntentSender statusReceiver) {
Preconditions.checkNotNull(versionedPackage, "versionedPackage cannot be null");
try {
mInstaller.uninstall(versionedPackage, mInstallerPackageName,
- 0, statusReceiver, mUserId);
+ flags, statusReceiver, mUserId);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -1150,6 +1186,16 @@
}
/**
+ * Sets the install as a virtual preload. Will only have effect when called
+ * by the verifier.
+ * {@hide}
+ */
+ @SystemApi
+ public void setInstallAsVirtualPreload() {
+ installFlags |= PackageManager.INSTALL_VIRTUAL_PRELOAD;
+ }
+
+ /**
* Set the reason for installing this package.
*/
public void setInstallReason(@InstallReason int installReason) {
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 06dbc0b..175293d 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -54,7 +54,6 @@
import android.os.UserManager;
import android.os.storage.StorageManager;
import android.os.storage.VolumeInfo;
-import android.provider.Settings;
import android.util.AndroidException;
import android.util.Log;
@@ -810,6 +809,14 @@
*/
public static final int INSTALL_ALLOCATE_AGGRESSIVE = 0x00008000;
+ /**
+ * Flag parameter for {@link #installPackage} to indicate that this package
+ * is a virtual preload.
+ *
+ * @hide
+ */
+ public static final int INSTALL_VIRTUAL_PRELOAD = 0x00010000;
+
/** @hide */
@IntDef(flag = true, prefix = { "DONT_KILL_APP" }, value = {
DONT_KILL_APP
@@ -1490,6 +1497,9 @@
*/
public static final int MOVE_FAILED_3RD_PARTY_NOT_ALLOWED_ON_INTERNAL = -9;
+ /** @hide */
+ public static final int MOVE_FAILED_LOCKED_USER = -10;
+
/**
* Flag parameter for {@link #movePackage} to indicate that
* the package should be moved to internal storage if its
@@ -1898,12 +1908,13 @@
public static final String FEATURE_VULKAN_HARDWARE_VERSION = "android.hardware.vulkan.version";
/**
- * The device includes broadcast radio tuner.
- *
- * @hide FutureFeature
+ * Feature for {@link #getSystemAvailableFeatures} and
+ * {@link #hasSystemFeature}: The device includes broadcast radio tuner.
+ * @hide
*/
+ @SystemApi
@SdkConstant(SdkConstantType.FEATURE)
- public static final String FEATURE_RADIO = "android.hardware.radio";
+ public static final String FEATURE_BROADCAST_RADIO = "android.hardware.broadcastradio";
/**
* Feature for {@link #getSystemAvailableFeatures} and
@@ -2285,13 +2296,20 @@
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device supports Wi-Fi Passpoint.
- * @hide
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_WIFI_PASSPOINT = "android.hardware.wifi.passpoint";
/**
* Feature for {@link #getSystemAvailableFeatures} and
+ * {@link #hasSystemFeature}: The device supports LoWPAN networking.
+ * @hide
+ */
+ @SdkConstant(SdkConstantType.FEATURE)
+ public static final String FEATURE_LOWPAN = "android.hardware.lowpan";
+
+ /**
+ * Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: This is a device dedicated to showing UI
* on a vehicle headunit. A headunit here is defined to be inside a
* vehicle that may or may not be moving. A headunit uses either a
@@ -2343,7 +2361,6 @@
* computers, laptops and variants such as convertibles or detachables.
* Due to the larger screen, the device will most likely use the
* {@link #FEATURE_FREEFORM_WINDOW_MANAGEMENT} feature as well.
- * @hide
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_PC = "android.hardware.type.pc";
@@ -3304,6 +3321,7 @@
*
* @hide
*/
+ @TestApi
public abstract String getPermissionControllerPackageName();
/**
@@ -4003,6 +4021,7 @@
* @hide
*/
@SystemApi
+ @RequiresPermission(Manifest.permission.INTERACT_ACROSS_USERS)
public List<ResolveInfo> queryBroadcastReceiversAsUser(Intent intent,
@ResolveInfoFlags int flags, UserHandle userHandle) {
return queryBroadcastReceiversAsUser(intent, flags, userHandle.getIdentifier());
@@ -4791,6 +4810,7 @@
* @hide
*/
@SystemApi
+ @RequiresPermission(Manifest.permission.INTERACT_ACROSS_USERS_FULL)
public abstract int getIntentVerificationStatusAsUser(String packageName, @UserIdInt int userId);
/**
@@ -4860,6 +4880,7 @@
*/
@TestApi
@SystemApi
+ @RequiresPermission(Manifest.permission.INTERACT_ACROSS_USERS_FULL)
public abstract String getDefaultBrowserPackageNameAsUser(@UserIdInt int userId);
/**
@@ -4875,7 +4896,9 @@
* @hide
*/
@SystemApi
- @RequiresPermission(android.Manifest.permission.SET_PREFERRED_APPLICATIONS)
+ @RequiresPermission(allOf = {
+ Manifest.permission.SET_PREFERRED_APPLICATIONS,
+ Manifest.permission.INTERACT_ACROSS_USERS_FULL})
public abstract boolean setDefaultBrowserPackageNameAsUser(String packageName,
@UserIdInt int userId);
@@ -5775,6 +5798,7 @@
*
* @hide
*/
+ @SystemApi
public static abstract class DexModuleRegisterCallback {
public abstract void onDexModuleRegistered(String dexModulePath, boolean success,
String message);
@@ -5808,6 +5832,7 @@
*
* @hide
*/
+ @SystemApi
public abstract void registerDexModule(String dexModulePath,
@Nullable DexModuleRegisterCallback callback);
}
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index bcba938e..69e3369 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -27,9 +27,9 @@
import static android.content.pm.ActivityInfo.RESIZE_MODE_UNRESIZEABLE;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
import static android.content.pm.ApplicationInfo.FLAG_SUSPENDED;
-import static android.content.pm.ApplicationInfo.PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_UNRESIZEABLE;
import static android.content.pm.ApplicationInfo.PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE;
import static android.content.pm.ApplicationInfo.PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION;
+import static android.content.pm.ApplicationInfo.PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_UNRESIZEABLE;
import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_BAD_MANIFEST;
import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME;
import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING;
@@ -50,9 +50,9 @@
import android.content.ComponentName;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.pm.split.DefaultSplitAssetLoader;
import android.content.pm.split.SplitAssetDependencyLoader;
import android.content.pm.split.SplitAssetLoader;
-import android.content.pm.split.DefaultSplitAssetLoader;
import android.content.res.AssetManager;
import android.content.res.Configuration;
import android.content.res.Resources;
@@ -88,6 +88,7 @@
import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.os.ClassLoaderFactory;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.XmlUtils;
@@ -148,8 +149,9 @@
private static final String PROPERTY_CHILD_PACKAGES_ENABLED =
"persist.sys.child_packages_enabled";
+ // TODO: Decide the correct default before O-MR1.
private static final boolean MULTI_PACKAGE_APK_ENABLED = Build.IS_DEBUGGABLE &&
- SystemProperties.getBoolean(PROPERTY_CHILD_PACKAGES_ENABLED, false);
+ SystemProperties.getBoolean(PROPERTY_CHILD_PACKAGES_ENABLED, true);
private static final int MAX_PACKAGES_PER_APK = 5;
@@ -416,9 +418,12 @@
public final boolean extractNativeLibs;
public final boolean isolatedSplits;
+ public final String classLoaderName;
+ public final String[] splitClassLoaderNames;
+
public PackageLite(String codePath, ApkLite baseApk, String[] splitNames,
boolean[] isFeatureSplits, String[] usesSplitNames, String[] configForSplit,
- String[] splitCodePaths, int[] splitRevisionCodes) {
+ String[] splitCodePaths, int[] splitRevisionCodes, String[] splitClassLoaderNames) {
this.packageName = baseApk.packageName;
this.versionCode = baseApk.versionCode;
this.installLocation = baseApk.installLocation;
@@ -438,6 +443,9 @@
this.use32bitAbi = baseApk.use32bitAbi;
this.extractNativeLibs = baseApk.extractNativeLibs;
this.isolatedSplits = baseApk.isolatedSplits;
+
+ this.classLoaderName = baseApk.classLoaderName;
+ this.splitClassLoaderNames = splitClassLoaderNames;
}
public List<String> getAllCodePaths() {
@@ -472,13 +480,14 @@
public final boolean use32bitAbi;
public final boolean extractNativeLibs;
public final boolean isolatedSplits;
+ public final String classLoaderName;
public ApkLite(String codePath, String packageName, String splitName, boolean isFeatureSplit,
String configForSplit, String usesSplitName, int versionCode, int revisionCode,
int installLocation, List<VerifierInfo> verifiers, Signature[] signatures,
Certificate[][] certificates, boolean coreApp, boolean debuggable,
boolean multiArch, boolean use32bitAbi, boolean extractNativeLibs,
- boolean isolatedSplits) {
+ boolean isolatedSplits, String classLoaderName) {
this.codePath = codePath;
this.packageName = packageName;
this.splitName = splitName;
@@ -497,14 +506,29 @@
this.use32bitAbi = use32bitAbi;
this.extractNativeLibs = extractNativeLibs;
this.isolatedSplits = isolatedSplits;
+ this.classLoaderName = classLoaderName;
}
}
+ /**
+ * Cached parse state for new components.
+ *
+ * Allows reuse of the same parse argument records to avoid GC pressure. Lifetime is carefully
+ * scoped to the parsing of a single application element.
+ */
+ private static class CachedComponentArgs {
+ ParseComponentArgs mActivityArgs;
+ ParseComponentArgs mActivityAliasArgs;
+ ParseComponentArgs mServiceArgs;
+ ParseComponentArgs mProviderArgs;
+ }
+
+ /**
+ * Cached state for parsing instrumentation to avoid GC pressure.
+ *
+ * Must be manually reset to null for each new manifest.
+ */
private ParsePackageItemArgs mParseInstrumentationArgs;
- private ParseComponentArgs mParseActivityArgs;
- private ParseComponentArgs mParseActivityAliasArgs;
- private ParseComponentArgs mParseServiceArgs;
- private ParseComponentArgs mParseProviderArgs;
/** If set to true, we will only allow package files that exactly match
* the DTD. Otherwise, we try to get as much from the package as we
@@ -641,6 +665,7 @@
pi.sharedUserLabel = p.mSharedUserLabel;
pi.applicationInfo = generateApplicationInfo(p, flags, state, userId);
pi.installLocation = p.installLocation;
+ pi.isStub = p.isStub;
pi.coreApp = p.coreApp;
if ((pi.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) != 0
|| (pi.applicationInfo.flags&ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
@@ -850,7 +875,7 @@
final ApkLite baseApk = parseApkLite(packageFile, flags);
final String packagePath = packageFile.getAbsolutePath();
Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
- return new PackageLite(packagePath, baseApk, null, null, null, null, null, null);
+ return new PackageLite(packagePath, baseApk, null, null, null, null, null, null, null);
}
static PackageLite parseClusterPackageLite(File packageDir, int flags)
@@ -913,6 +938,7 @@
String[] configForSplits = null;
String[] splitCodePaths = null;
int[] splitRevisionCodes = null;
+ String[] splitClassLoaderNames = null;
if (size > 0) {
splitNames = new String[size];
isFeatureSplits = new boolean[size];
@@ -920,6 +946,7 @@
configForSplits = new String[size];
splitCodePaths = new String[size];
splitRevisionCodes = new int[size];
+ splitClassLoaderNames = new String[size];
splitNames = apks.keySet().toArray(splitNames);
Arrays.sort(splitNames, sSplitNameComparator);
@@ -931,12 +958,13 @@
configForSplits[i] = apk.configForSplit;
splitCodePaths[i] = apk.codePath;
splitRevisionCodes[i] = apk.revisionCode;
+ splitClassLoaderNames[i] = apk.classLoaderName;
}
}
final String codePath = packageDir.getAbsolutePath();
return new PackageLite(codePath, baseApk, splitNames, isFeatureSplits, usesSplitNames,
- configForSplits, splitCodePaths, splitRevisionCodes);
+ configForSplits, splitCodePaths, splitRevisionCodes, splitClassLoaderNames);
}
/**
@@ -1174,6 +1202,8 @@
pkg.splitPrivateFlags = new int[num];
pkg.applicationInfo.splitNames = pkg.splitNames;
pkg.applicationInfo.splitDependencies = splitDependencies;
+ pkg.applicationInfo.classLoaderName = lite.classLoaderName;
+ pkg.applicationInfo.splitClassLoaderNames = lite.splitClassLoaderNames;
for (int i = 0; i < num; i++) {
final AssetManager splitAssets = assetLoader.getSplitAssetManager(i);
@@ -1337,9 +1367,6 @@
parsePackageSplitNames(parser, attrs);
mParseInstrumentationArgs = null;
- mParseActivityArgs = null;
- mParseServiceArgs = null;
- mParseProviderArgs = null;
int type;
@@ -1687,7 +1714,7 @@
}
final AttributeSet attrs = parser;
- return parseApkLite(apkPath, parser, attrs, flags, signatures, certificates);
+ return parseApkLite(apkPath, parser, attrs, signatures, certificates);
} catch (XmlPullParserException | IOException | RuntimeException e) {
Slog.w(TAG, "Failed to parse " + apkPath, e);
@@ -1774,7 +1801,7 @@
}
private static ApkLite parseApkLite(String codePath, XmlPullParser parser, AttributeSet attrs,
- int flags, Signature[] signatures, Certificate[][] certificates)
+ Signature[] signatures, Certificate[][] certificates)
throws IOException, XmlPullParserException, PackageParserException {
final Pair<String, String> packageSplit = parsePackageSplitNames(parser, attrs);
@@ -1790,6 +1817,7 @@
boolean isFeatureSplit = false;
String configForSplit = null;
String usesSplitName = null;
+ String classLoaderName = null;
for (int i = 0; i < attrs.getAttributeCount(); i++) {
final String attr = attrs.getAttributeName(i);
@@ -1846,6 +1874,14 @@
if ("extractNativeLibs".equals(attr)) {
extractNativeLibs = attrs.getAttributeBooleanValue(i, true);
}
+ if ("classLoader".equals(attr)) {
+ classLoaderName = attrs.getAttributeValue(i);
+ if (!ClassLoaderFactory.isValidClassLoaderName(classLoaderName)) {
+ throw new PackageParserException(
+ PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED,
+ "Invalid class loader name: " + classLoaderName);
+ }
+ }
}
} else if (TAG_USES_SPLIT.equals(parser.getName())) {
if (usesSplitName != null) {
@@ -1865,19 +1901,7 @@
return new ApkLite(codePath, packageSplit.first, packageSplit.second, isFeatureSplit,
configForSplit, usesSplitName, versionCode, revisionCode, installLocation,
verifiers, signatures, certificates, coreApp, debuggable, multiArch, use32bitAbi,
- extractNativeLibs, isolatedSplits);
- }
-
- /**
- * Temporary.
- */
- static public Signature stringToSignature(String str) {
- final int N = str.length();
- byte[] sig = new byte[N];
- for (int i=0; i<N; i++) {
- sig[i] = (byte)str.charAt(i);
- }
- return new Signature(sig);
+ extractNativeLibs, isolatedSplits, classLoaderName);
}
/**
@@ -2046,9 +2070,6 @@
XmlResourceParser parser, int flags, String[] outError) throws XmlPullParserException,
IOException {
mParseInstrumentationArgs = null;
- mParseActivityArgs = null;
- mParseServiceArgs = null;
- mParseProviderArgs = null;
int type;
boolean foundApp = false;
@@ -3640,6 +3661,9 @@
}
final int innerDepth = parser.getDepth();
+ // IMPORTANT: These must only be cached for a single <application> to avoid components
+ // getting added to the wrong package.
+ final CachedComponentArgs cachedArgs = new CachedComponentArgs();
int type;
while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
@@ -3650,7 +3674,7 @@
String tagName = parser.getName();
if (tagName.equals("activity")) {
- Activity a = parseActivity(owner, res, parser, flags, outError, false,
+ Activity a = parseActivity(owner, res, parser, flags, outError, cachedArgs, false,
owner.baseHardwareAccelerated);
if (a == null) {
mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
@@ -3660,7 +3684,8 @@
owner.activities.add(a);
} else if (tagName.equals("receiver")) {
- Activity a = parseActivity(owner, res, parser, flags, outError, true, false);
+ Activity a = parseActivity(owner, res, parser, flags, outError, cachedArgs,
+ true, false);
if (a == null) {
mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
return false;
@@ -3669,7 +3694,7 @@
owner.receivers.add(a);
} else if (tagName.equals("service")) {
- Service s = parseService(owner, res, parser, flags, outError);
+ Service s = parseService(owner, res, parser, flags, outError, cachedArgs);
if (s == null) {
mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
return false;
@@ -3678,7 +3703,7 @@
owner.services.add(s);
} else if (tagName.equals("provider")) {
- Provider p = parseProvider(owner, res, parser, flags, outError);
+ Provider p = parseProvider(owner, res, parser, flags, outError, cachedArgs);
if (p == null) {
mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
return false;
@@ -3687,7 +3712,7 @@
owner.providers.add(p);
} else if (tagName.equals("activity-alias")) {
- Activity a = parseActivityAlias(owner, res, parser, flags, outError);
+ Activity a = parseActivityAlias(owner, res, parser, flags, outError, cachedArgs);
if (a == null) {
mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
return false;
@@ -3822,7 +3847,7 @@
// every activity info has had a chance to set it from its attributes.
setMaxAspectRatio(owner);
- modifySharedLibrariesForBackwardCompatibility(owner);
+ PackageBackwardCompatibility.modifySharedLibraries(owner);
if (hasDomainURLs(owner)) {
owner.applicationInfo.privateFlags |= ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS;
@@ -3833,18 +3858,6 @@
return true;
}
- private static void modifySharedLibrariesForBackwardCompatibility(Package owner) {
- // "org.apache.http.legacy" is now a part of the boot classpath so it doesn't need
- // to be an explicit dependency.
- //
- // A future change will remove this library from the boot classpath, at which point
- // all apps that target SDK 21 and earlier will have it automatically added to their
- // dependency lists.
- owner.usesLibraries = ArrayUtils.remove(owner.usesLibraries, "org.apache.http.legacy");
- owner.usesOptionalLibraries = ArrayUtils.remove(owner.usesOptionalLibraries,
- "org.apache.http.legacy");
- }
-
/**
* Check if one of the IntentFilter as both actions DEFAULT / VIEW and a HTTP/HTTPS data URI
*/
@@ -3899,9 +3912,12 @@
ComponentInfo parsedComponent = null;
+ // IMPORTANT: These must only be cached for a single <application> to avoid components
+ // getting added to the wrong package.
+ final CachedComponentArgs cachedArgs = new CachedComponentArgs();
String tagName = parser.getName();
if (tagName.equals("activity")) {
- Activity a = parseActivity(owner, res, parser, flags, outError, false,
+ Activity a = parseActivity(owner, res, parser, flags, outError, cachedArgs, false,
owner.baseHardwareAccelerated);
if (a == null) {
mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
@@ -3912,7 +3928,8 @@
parsedComponent = a.info;
} else if (tagName.equals("receiver")) {
- Activity a = parseActivity(owner, res, parser, flags, outError, true, false);
+ Activity a = parseActivity(owner, res, parser, flags, outError, cachedArgs,
+ true, false);
if (a == null) {
mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
return false;
@@ -3922,7 +3939,7 @@
parsedComponent = a.info;
} else if (tagName.equals("service")) {
- Service s = parseService(owner, res, parser, flags, outError);
+ Service s = parseService(owner, res, parser, flags, outError, cachedArgs);
if (s == null) {
mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
return false;
@@ -3932,7 +3949,7 @@
parsedComponent = s.info;
} else if (tagName.equals("provider")) {
- Provider p = parseProvider(owner, res, parser, flags, outError);
+ Provider p = parseProvider(owner, res, parser, flags, outError, cachedArgs);
if (p == null) {
mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
return false;
@@ -3942,7 +3959,7 @@
parsedComponent = p.info;
} else if (tagName.equals("activity-alias")) {
- Activity a = parseActivityAlias(owner, res, parser, flags, outError);
+ Activity a = parseActivityAlias(owner, res, parser, flags, outError, cachedArgs);
if (a == null) {
mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
return false;
@@ -4088,13 +4105,13 @@
}
private Activity parseActivity(Package owner, Resources res,
- XmlResourceParser parser, int flags, String[] outError,
+ XmlResourceParser parser, int flags, String[] outError, CachedComponentArgs cachedArgs,
boolean receiver, boolean hardwareAccelerated)
throws XmlPullParserException, IOException {
TypedArray sa = res.obtainAttributes(parser, R.styleable.AndroidManifestActivity);
- if (mParseActivityArgs == null) {
- mParseActivityArgs = new ParseComponentArgs(owner, outError,
+ if (cachedArgs.mActivityArgs == null) {
+ cachedArgs.mActivityArgs = new ParseComponentArgs(owner, outError,
R.styleable.AndroidManifestActivity_name,
R.styleable.AndroidManifestActivity_label,
R.styleable.AndroidManifestActivity_icon,
@@ -4107,11 +4124,11 @@
R.styleable.AndroidManifestActivity_enabled);
}
- mParseActivityArgs.tag = receiver ? "<receiver>" : "<activity>";
- mParseActivityArgs.sa = sa;
- mParseActivityArgs.flags = flags;
+ cachedArgs.mActivityArgs.tag = receiver ? "<receiver>" : "<activity>";
+ cachedArgs.mActivityArgs.sa = sa;
+ cachedArgs.mActivityArgs.flags = flags;
- Activity a = new Activity(mParseActivityArgs, new ActivityInfo());
+ Activity a = new Activity(cachedArgs.mActivityArgs, new ActivityInfo());
if (outError[0] != null) {
sa.recycle();
return null;
@@ -4287,6 +4304,15 @@
a.info.colorMode = sa.getInt(R.styleable.AndroidManifestActivity_colorMode,
ActivityInfo.COLOR_MODE_DEFAULT);
+
+ if (sa.getBoolean(R.styleable.AndroidManifestActivity_showWhenLocked, false)) {
+ a.info.flags |= ActivityInfo.FLAG_SHOW_WHEN_LOCKED;
+ }
+
+ if (sa.getBoolean(R.styleable.AndroidManifestActivity_turnScreenOn, false)) {
+ a.info.flags |= ActivityInfo.FLAG_TURN_SCREEN_ON;
+ }
+
} else {
a.info.launchMode = ActivityInfo.LAUNCH_MULTIPLE;
a.info.configChanges = 0;
@@ -4600,7 +4626,8 @@
}
private Activity parseActivityAlias(Package owner, Resources res,
- XmlResourceParser parser, int flags, String[] outError)
+ XmlResourceParser parser, int flags, String[] outError,
+ CachedComponentArgs cachedArgs)
throws XmlPullParserException, IOException {
TypedArray sa = res.obtainAttributes(parser,
com.android.internal.R.styleable.AndroidManifestActivityAlias);
@@ -4621,8 +4648,8 @@
return null;
}
- if (mParseActivityAliasArgs == null) {
- mParseActivityAliasArgs = new ParseComponentArgs(owner, outError,
+ if (cachedArgs.mActivityAliasArgs == null) {
+ cachedArgs.mActivityAliasArgs = new ParseComponentArgs(owner, outError,
com.android.internal.R.styleable.AndroidManifestActivityAlias_name,
com.android.internal.R.styleable.AndroidManifestActivityAlias_label,
com.android.internal.R.styleable.AndroidManifestActivityAlias_icon,
@@ -4633,11 +4660,11 @@
0,
com.android.internal.R.styleable.AndroidManifestActivityAlias_description,
com.android.internal.R.styleable.AndroidManifestActivityAlias_enabled);
- mParseActivityAliasArgs.tag = "<activity-alias>";
+ cachedArgs.mActivityAliasArgs.tag = "<activity-alias>";
}
- mParseActivityAliasArgs.sa = sa;
- mParseActivityAliasArgs.flags = flags;
+ cachedArgs.mActivityAliasArgs.sa = sa;
+ cachedArgs.mActivityAliasArgs.flags = flags;
Activity target = null;
@@ -4685,7 +4712,7 @@
info.encryptionAware = info.directBootAware = target.info.directBootAware;
- Activity a = new Activity(mParseActivityAliasArgs, info);
+ Activity a = new Activity(cachedArgs.mActivityAliasArgs, info);
if (outError[0] != null) {
sa.recycle();
return null;
@@ -4791,13 +4818,14 @@
}
private Provider parseProvider(Package owner, Resources res,
- XmlResourceParser parser, int flags, String[] outError)
+ XmlResourceParser parser, int flags, String[] outError,
+ CachedComponentArgs cachedArgs)
throws XmlPullParserException, IOException {
TypedArray sa = res.obtainAttributes(parser,
com.android.internal.R.styleable.AndroidManifestProvider);
- if (mParseProviderArgs == null) {
- mParseProviderArgs = new ParseComponentArgs(owner, outError,
+ if (cachedArgs.mProviderArgs == null) {
+ cachedArgs.mProviderArgs = new ParseComponentArgs(owner, outError,
com.android.internal.R.styleable.AndroidManifestProvider_name,
com.android.internal.R.styleable.AndroidManifestProvider_label,
com.android.internal.R.styleable.AndroidManifestProvider_icon,
@@ -4808,13 +4836,13 @@
com.android.internal.R.styleable.AndroidManifestProvider_process,
com.android.internal.R.styleable.AndroidManifestProvider_description,
com.android.internal.R.styleable.AndroidManifestProvider_enabled);
- mParseProviderArgs.tag = "<provider>";
+ cachedArgs.mProviderArgs.tag = "<provider>";
}
- mParseProviderArgs.sa = sa;
- mParseProviderArgs.flags = flags;
+ cachedArgs.mProviderArgs.sa = sa;
+ cachedArgs.mProviderArgs.flags = flags;
- Provider p = new Provider(mParseProviderArgs, new ProviderInfo());
+ Provider p = new Provider(cachedArgs.mProviderArgs, new ProviderInfo());
if (outError[0] != null) {
sa.recycle();
return null;
@@ -5145,13 +5173,14 @@
}
private Service parseService(Package owner, Resources res,
- XmlResourceParser parser, int flags, String[] outError)
+ XmlResourceParser parser, int flags, String[] outError,
+ CachedComponentArgs cachedArgs)
throws XmlPullParserException, IOException {
TypedArray sa = res.obtainAttributes(parser,
com.android.internal.R.styleable.AndroidManifestService);
- if (mParseServiceArgs == null) {
- mParseServiceArgs = new ParseComponentArgs(owner, outError,
+ if (cachedArgs.mServiceArgs == null) {
+ cachedArgs.mServiceArgs = new ParseComponentArgs(owner, outError,
com.android.internal.R.styleable.AndroidManifestService_name,
com.android.internal.R.styleable.AndroidManifestService_label,
com.android.internal.R.styleable.AndroidManifestService_icon,
@@ -5162,13 +5191,13 @@
com.android.internal.R.styleable.AndroidManifestService_process,
com.android.internal.R.styleable.AndroidManifestService_description,
com.android.internal.R.styleable.AndroidManifestService_enabled);
- mParseServiceArgs.tag = "<service>";
+ cachedArgs.mServiceArgs.tag = "<service>";
}
- mParseServiceArgs.sa = sa;
- mParseServiceArgs.flags = flags;
+ cachedArgs.mServiceArgs.sa = sa;
+ cachedArgs.mServiceArgs.flags = flags;
- Service s = new Service(mParseServiceArgs, new ServiceInfo());
+ Service s = new Service(cachedArgs.mServiceArgs, new ServiceInfo());
if (outError[0] != null) {
sa.recycle();
return null;
@@ -5851,10 +5880,10 @@
public byte[] restrictUpdateHash;
- /**
- * Set if the app or any of its components are visible to Instant Apps.
- */
+ /** Set if the app or any of its components are visible to instant applications. */
public boolean visibleToInstantApps;
+ /** Whether or not the package is a stub and must be replaced by the full version. */
+ public boolean isStub;
public Package(String packageName) {
this.packageName = packageName;
diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java
index 60226d5..e173653c 100644
--- a/core/java/android/content/res/Resources.java
+++ b/core/java/android/content/res/Resources.java
@@ -19,6 +19,7 @@
import android.animation.Animator;
import android.animation.StateListAnimator;
import android.annotation.AnimRes;
+import android.annotation.AnimatorRes;
import android.annotation.AnyRes;
import android.annotation.ArrayRes;
import android.annotation.AttrRes;
@@ -1162,7 +1163,7 @@
*
* @see #getXml
*/
- public XmlResourceParser getAnimation(@AnimRes int id) throws NotFoundException {
+ public XmlResourceParser getAnimation(@AnimatorRes @AnimRes int id) throws NotFoundException {
return loadXmlResourceParser(id, "anim");
}
diff --git a/core/java/android/content/res/ResourcesImpl.java b/core/java/android/content/res/ResourcesImpl.java
index 23591c7..a8b8c4b 100644
--- a/core/java/android/content/res/ResourcesImpl.java
+++ b/core/java/android/content/res/ResourcesImpl.java
@@ -15,9 +15,6 @@
*/
package android.content.res;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
import android.animation.Animator;
import android.animation.StateListAnimator;
import android.annotation.AnyRes;
@@ -32,7 +29,7 @@
import android.content.pm.ActivityInfo.Config;
import android.content.res.Configuration.NativeConfig;
import android.content.res.Resources.NotFoundException;
-import android.graphics.FontFamily;
+import android.graphics.Bitmap;
import android.graphics.Typeface;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
@@ -40,8 +37,9 @@
import android.icu.text.PluralRules;
import android.os.Build;
import android.os.LocaleList;
+import android.os.SystemClock;
+import android.os.SystemProperties;
import android.os.Trace;
-import android.text.FontConfig;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
@@ -51,10 +49,12 @@
import android.util.Xml;
import android.view.DisplayAdjustments;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
-import java.util.List;
import java.util.Locale;
/**
@@ -72,9 +72,20 @@
private static final boolean DEBUG_LOAD = false;
private static final boolean DEBUG_CONFIG = false;
- private static final boolean TRACE_FOR_PRELOAD = false;
- private static final boolean TRACE_FOR_MISS_PRELOAD = false;
+ static final String TAG_PRELOAD = TAG + ".preload";
+
+ private static final boolean TRACE_FOR_PRELOAD = false; // Do we still need it?
+ private static final boolean TRACE_FOR_MISS_PRELOAD = false; // Do we still need it?
+
+ public static final boolean TRACE_FOR_DETAILED_PRELOAD =
+ SystemProperties.getBoolean("debug.trace_resource_preload", false);
+
+ /** Used only when TRACE_FOR_DETAILED_PRELOAD is true. */
+ private static int sPreloadTracingNumLoadedDrawables;
+ private long mPreloadTracingPreloadStartTime;
+ private long mPreloadTracingStartBitmapSize;
+ private long mPreloadTracingStartBitmapCount;
private static final int ID_OTHER = 0x01000004;
@@ -593,6 +604,16 @@
Drawable dr;
boolean needsNewDrawableAfterCache = false;
if (cs != null) {
+ if (TRACE_FOR_DETAILED_PRELOAD) {
+ // Log only framework resources
+ if (((id >>> 24) == 0x1) && (android.os.Process.myUid() != 0)) {
+ final String name = getResourceName(id);
+ if (name != null) {
+ Log.d(TAG_PRELOAD, "Hit preloaded FW drawable #"
+ + Integer.toHexString(id) + " " + name);
+ }
+ }
+ }
dr = cs.newDrawable(wrapper);
} else if (isColorDrawable) {
dr = new ColorDrawable(value.data);
@@ -744,6 +765,18 @@
}
}
+ // For prelaod tracing.
+ long startTime = 0;
+ int startBitmapCount = 0;
+ long startBitmapSize = 0;
+ int startDrwableCount = 0;
+ if (TRACE_FOR_DETAILED_PRELOAD) {
+ startTime = System.nanoTime();
+ startBitmapCount = Bitmap.sPreloadTracingNumInstantiatedBitmaps;
+ startBitmapSize = Bitmap.sPreloadTracingTotalBitmapsSize;
+ startDrwableCount = sPreloadTracingNumLoadedDrawables;
+ }
+
if (DEBUG_LOAD) {
Log.v(TAG, "Loading drawable for cookie " + value.assetCookie + ": " + file);
}
@@ -772,6 +805,37 @@
}
Trace.traceEnd(Trace.TRACE_TAG_RESOURCES);
+ if (TRACE_FOR_DETAILED_PRELOAD) {
+ if (((id >>> 24) == 0x1)) {
+ final String name = getResourceName(id);
+ if (name != null) {
+ final long time = System.nanoTime() - startTime;
+ final int loadedBitmapCount =
+ Bitmap.sPreloadTracingNumInstantiatedBitmaps - startBitmapCount;
+ final long loadedBitmapSize =
+ Bitmap.sPreloadTracingTotalBitmapsSize - startBitmapSize;
+ final int loadedDrawables =
+ sPreloadTracingNumLoadedDrawables - startDrwableCount;
+
+ sPreloadTracingNumLoadedDrawables++;
+
+ final boolean isRoot = (android.os.Process.myUid() == 0);
+
+ Log.d(TAG_PRELOAD,
+ (isRoot ? "Preloaded FW drawable #"
+ : "Loaded non-preloaded FW drawable #")
+ + Integer.toHexString(id)
+ + " " + name
+ + " " + file
+ + " " + dr.getClass().getCanonicalName()
+ + " #nested_drawables= " + loadedDrawables
+ + " #bitmaps= " + loadedBitmapCount
+ + " total_bitmap_size= " + loadedBitmapSize
+ + " in[us] " + (time / 1000));
+ }
+ }
+ }
+
return dr;
}
@@ -1102,6 +1166,13 @@
mPreloading = true;
mConfiguration.densityDpi = DisplayMetrics.DENSITY_DEVICE;
updateConfiguration(null, null, null);
+
+ if (TRACE_FOR_DETAILED_PRELOAD) {
+ mPreloadTracingPreloadStartTime = SystemClock.uptimeMillis();
+ mPreloadTracingStartBitmapSize = Bitmap.sPreloadTracingTotalBitmapsSize;
+ mPreloadTracingStartBitmapCount = Bitmap.sPreloadTracingNumInstantiatedBitmaps;
+ Log.d(TAG_PRELOAD, "Preload starting");
+ }
}
}
@@ -1111,6 +1182,16 @@
*/
void finishPreloading() {
if (mPreloading) {
+ if (TRACE_FOR_DETAILED_PRELOAD) {
+ final long time = SystemClock.uptimeMillis() - mPreloadTracingPreloadStartTime;
+ final long size =
+ Bitmap.sPreloadTracingTotalBitmapsSize - mPreloadTracingStartBitmapSize;
+ final long count = Bitmap.sPreloadTracingNumInstantiatedBitmaps
+ - mPreloadTracingStartBitmapCount;
+ Log.d(TAG_PRELOAD, "Preload finished, "
+ + count + " bitmaps of " + size + " bytes in " + time + " ms");
+ }
+
mPreloading = false;
flushLayoutCache();
}
diff --git a/core/java/android/database/sqlite/SQLiteConnection.java b/core/java/android/database/sqlite/SQLiteConnection.java
index 34a9523..f894f05 100644
--- a/core/java/android/database/sqlite/SQLiteConnection.java
+++ b/core/java/android/database/sqlite/SQLiteConnection.java
@@ -16,9 +16,6 @@
package android.database.sqlite;
-import dalvik.system.BlockGuard;
-import dalvik.system.CloseGuard;
-
import android.database.Cursor;
import android.database.CursorWindow;
import android.database.DatabaseUtils;
@@ -32,11 +29,14 @@
import android.util.LruCache;
import android.util.Printer;
+import dalvik.system.BlockGuard;
+import dalvik.system.CloseGuard;
+
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Map;
-import java.util.regex.Pattern;
+
/**
* Represents a SQLite database connection.
@@ -118,7 +118,8 @@
private int mCancellationSignalAttachCount;
private static native long nativeOpen(String path, int openFlags, String label,
- boolean enableTrace, boolean enableProfile);
+ boolean enableTrace, boolean enableProfile, int lookasideSlotSize,
+ int lookasideSlotCount);
private static native void nativeClose(long connectionPtr);
private static native void nativeRegisterCustomFunction(long connectionPtr,
SQLiteCustomFunction function);
@@ -208,8 +209,8 @@
private void open() {
mConnectionPtr = nativeOpen(mConfiguration.path, mConfiguration.openFlags,
mConfiguration.label,
- SQLiteDebug.DEBUG_SQL_STATEMENTS, SQLiteDebug.DEBUG_SQL_TIME);
-
+ SQLiteDebug.DEBUG_SQL_STATEMENTS, SQLiteDebug.DEBUG_SQL_TIME,
+ mConfiguration.lookasideSlotSize, mConfiguration.lookasideSlotCount);
setPageSize();
setForeignKeyModeFromConfiguration();
setWalModeFromConfiguration();
diff --git a/core/java/android/database/sqlite/SQLiteConnectionPool.java b/core/java/android/database/sqlite/SQLiteConnectionPool.java
index 3a1714c..6ce8787 100644
--- a/core/java/android/database/sqlite/SQLiteConnectionPool.java
+++ b/core/java/android/database/sqlite/SQLiteConnectionPool.java
@@ -16,16 +16,24 @@
package android.database.sqlite;
-import dalvik.system.CloseGuard;
-
+import android.app.ActivityManager;
import android.database.sqlite.SQLiteDebug.DbStats;
import android.os.CancellationSignal;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
import android.os.OperationCanceledException;
import android.os.SystemClock;
+import android.os.SystemProperties;
import android.util.Log;
import android.util.PrefixPrinter;
import android.util.Printer;
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
+
+import dalvik.system.CloseGuard;
+
import java.io.Closeable;
import java.util.ArrayList;
import java.util.Map;
@@ -76,6 +84,15 @@
// and logging a message about the connection pool being busy.
private static final long CONNECTION_POOL_BUSY_MILLIS = 30 * 1000; // 30 seconds
+ // TODO b/63398887 Move to SQLiteGlobal
+ private static final long IDLE_CONNECTION_CLOSE_DELAY_MILLIS = SystemProperties
+ .getInt("persist.debug.sqlite.idle_connection_close_delay", 30000);
+
+ // TODO b/63398887 STOPSHIP.
+ // Temporarily enabled for testing across a broader set of dogfood devices.
+ private static final boolean CLOSE_IDLE_CONNECTIONS = SystemProperties
+ .getBoolean("persist.debug.sqlite.close_idle_connections", true);
+
private final CloseGuard mCloseGuard = CloseGuard.get();
private final Object mLock = new Object();
@@ -93,6 +110,9 @@
new ArrayList<SQLiteConnection>();
private SQLiteConnection mAvailablePrimaryConnection;
+ @GuardedBy("mLock")
+ private IdleConnectionHandler mIdleConnectionHandler;
+
// Describes what should happen to an acquired connection when it is returned to the pool.
enum AcquiredConnectionStatus {
// The connection should be returned to the pool as usual.
@@ -147,7 +167,17 @@
private SQLiteConnectionPool(SQLiteDatabaseConfiguration configuration) {
mConfiguration = new SQLiteDatabaseConfiguration(configuration);
+ // Disable lookaside allocator on low-RAM devices
+ if (ActivityManager.isLowRamDeviceStatic()) {
+ mConfiguration.lookasideSlotCount = 0;
+ mConfiguration.lookasideSlotSize = 0;
+ }
setMaxConnectionPoolSizeLocked();
+
+ // Do not close idle connections for in-memory databases
+ if (CLOSE_IDLE_CONNECTIONS && !configuration.isInMemoryDb()) {
+ setupIdleConnectionHandler(Looper.getMainLooper(), IDLE_CONNECTION_CLOSE_DELAY_MILLIS);
+ }
}
@Override
@@ -345,7 +375,13 @@
*/
public SQLiteConnection acquireConnection(String sql, int connectionFlags,
CancellationSignal cancellationSignal) {
- return waitForConnection(sql, connectionFlags, cancellationSignal);
+ SQLiteConnection con = waitForConnection(sql, connectionFlags, cancellationSignal);
+ synchronized (mLock) {
+ if (mIdleConnectionHandler != null) {
+ mIdleConnectionHandler.connectionAcquired(con);
+ }
+ }
+ return con;
}
/**
@@ -362,6 +398,9 @@
*/
public void releaseConnection(SQLiteConnection connection) {
synchronized (mLock) {
+ if (mIdleConnectionHandler != null) {
+ mIdleConnectionHandler.connectionReleased(connection);
+ }
AcquiredConnectionStatus status = mAcquiredConnections.remove(connection);
if (status == null) {
throw new IllegalStateException("Cannot perform this operation "
@@ -504,6 +543,27 @@
}
// Can't throw.
+ private boolean closeAvailableConnectionLocked(int connectionId) {
+ final int count = mAvailableNonPrimaryConnections.size();
+ for (int i = count - 1; i >= 0; i--) {
+ SQLiteConnection c = mAvailableNonPrimaryConnections.get(i);
+ if (c.getConnectionId() == connectionId) {
+ closeConnectionAndLogExceptionsLocked(c);
+ mAvailableNonPrimaryConnections.remove(i);
+ return true;
+ }
+ }
+
+ if (mAvailablePrimaryConnection != null
+ && mAvailablePrimaryConnection.getConnectionId() == connectionId) {
+ closeConnectionAndLogExceptionsLocked(mAvailablePrimaryConnection);
+ mAvailablePrimaryConnection = null;
+ return true;
+ }
+ return false;
+ }
+
+ // Can't throw.
private void closeAvailableNonPrimaryConnectionsAndLogExceptionsLocked() {
final int count = mAvailableNonPrimaryConnections.size();
for (int i = 0; i < count; i++) {
@@ -526,6 +586,9 @@
private void closeConnectionAndLogExceptionsLocked(SQLiteConnection connection) {
try {
connection.close(); // might throw
+ if (mIdleConnectionHandler != null) {
+ mIdleConnectionHandler.connectionClosed(connection);
+ }
} catch (RuntimeException ex) {
Log.e(TAG, "Failed to close connection, its fate is now in the hands "
+ "of the merciful GC: " + connection, ex);
@@ -946,17 +1009,35 @@
}
private void setMaxConnectionPoolSizeLocked() {
- if ((mConfiguration.openFlags & SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING) != 0) {
+ if (!mConfiguration.isInMemoryDb()
+ && (mConfiguration.openFlags & SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING) != 0) {
mMaxConnectionPoolSize = SQLiteGlobal.getWALConnectionPoolSize();
} else {
- // TODO: We don't actually need to restrict the connection pool size to 1
+ // We don't actually need to always restrict the connection pool size to 1
// for non-WAL databases. There might be reasons to use connection pooling
- // with other journal modes. For now, enabling connection pooling and
- // using WAL are the same thing in the API.
+ // with other journal modes. However, we should always keep pool size of 1 for in-memory
+ // databases since every :memory: db is separate from another.
+ // For now, enabling connection pooling and using WAL are the same thing in the API.
mMaxConnectionPoolSize = 1;
}
}
+ /**
+ * Set up the handler based on the provided looper and delay.
+ */
+ @VisibleForTesting
+ public void setupIdleConnectionHandler(Looper looper, long delayMs) {
+ synchronized (mLock) {
+ mIdleConnectionHandler = new IdleConnectionHandler(looper, delayMs);
+ }
+ }
+
+ void disableIdleConnectionHandler() {
+ synchronized (mLock) {
+ mIdleConnectionHandler = null;
+ }
+ }
+
private void throwIfClosedLocked() {
if (!mIsOpen) {
throw new IllegalStateException("Cannot perform this operation "
@@ -1004,7 +1085,10 @@
printer.println("Connection pool for " + mConfiguration.path + ":");
printer.println(" Open: " + mIsOpen);
printer.println(" Max connections: " + mMaxConnectionPoolSize);
-
+ if (mConfiguration.isLookasideConfigSet()) {
+ printer.println(" Lookaside config: sz=" + mConfiguration.lookasideSlotSize
+ + " cnt=" + mConfiguration.lookasideSlotCount);
+ }
printer.println(" Available primary connection:");
if (mAvailablePrimaryConnection != null) {
mAvailablePrimaryConnection.dump(indentedPrinter, verbose);
@@ -1069,4 +1153,42 @@
public RuntimeException mException;
public int mNonce;
}
+
+ private class IdleConnectionHandler extends Handler {
+ private final long mDelay;
+
+ IdleConnectionHandler(Looper looper, long delay) {
+ super(looper);
+ mDelay = delay;
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ // Skip the (obsolete) message if the handler has changed
+ synchronized (mLock) {
+ if (this != mIdleConnectionHandler) {
+ return;
+ }
+ if (closeAvailableConnectionLocked(msg.what)) {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Closed idle connection " + mConfiguration.label + " " + msg.what
+ + " after " + mDelay);
+ }
+ }
+ }
+ }
+
+ void connectionReleased(SQLiteConnection con) {
+ sendEmptyMessageDelayed(con.getConnectionId(), mDelay);
+ }
+
+ void connectionAcquired(SQLiteConnection con) {
+ // Remove any pending close operations
+ removeMessages(con.getConnectionId());
+ }
+
+ void connectionClosed(SQLiteConnection con) {
+ removeMessages(con.getConnectionId());
+ }
+ }
}
diff --git a/core/java/android/database/sqlite/SQLiteDatabase.java b/core/java/android/database/sqlite/SQLiteDatabase.java
index fe849b8..af6df155 100644
--- a/core/java/android/database/sqlite/SQLiteDatabase.java
+++ b/core/java/android/database/sqlite/SQLiteDatabase.java
@@ -16,6 +16,8 @@
package android.database.sqlite;
+import android.annotation.IntDef;
+import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.ContentValues;
@@ -34,10 +36,14 @@
import android.util.Pair;
import android.util.Printer;
+import com.android.internal.util.Preconditions;
+
import dalvik.system.CloseGuard;
import java.io.File;
import java.io.FileFilter;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -253,11 +259,14 @@
*/
public static final int MAX_SQL_CACHE_SIZE = 100;
- private SQLiteDatabase(String path, int openFlags, CursorFactory cursorFactory,
- DatabaseErrorHandler errorHandler) {
+ private SQLiteDatabase(final String path, final int openFlags,
+ CursorFactory cursorFactory, DatabaseErrorHandler errorHandler,
+ int lookasideSlotSize, int lookasideSlotCount) {
mCursorFactory = cursorFactory;
mErrorHandler = errorHandler != null ? errorHandler : new DefaultDatabaseErrorHandler();
mConfigurationLocked = new SQLiteDatabaseConfiguration(path, openFlags);
+ mConfigurationLocked.lookasideSlotSize = lookasideSlotSize;
+ mConfigurationLocked.lookasideSlotCount = lookasideSlotCount;
}
@Override
@@ -667,11 +676,30 @@
* @return the newly opened database
* @throws SQLiteException if the database cannot be opened
*/
- public static SQLiteDatabase openDatabase(String path, CursorFactory factory, int flags) {
+ public static SQLiteDatabase openDatabase(@NonNull String path, @Nullable CursorFactory factory,
+ @DatabaseOpenFlags int flags) {
return openDatabase(path, factory, flags, null);
}
/**
+ * Open the database according to the specified {@link OpenParams parameters}
+ *
+ * @param path to database file to open and/or create
+ * @param openParams configuration parameters that are used for opening {@link SQLiteDatabase}
+ * @return the newly opened database
+ * @throws SQLiteException if the database cannot be opened
+ */
+ public static SQLiteDatabase openDatabase(@NonNull String path,
+ @NonNull OpenParams openParams) {
+ Preconditions.checkArgument(openParams != null, "OpenParams cannot be null");
+ SQLiteDatabase db = new SQLiteDatabase(path, openParams.mOpenFlags,
+ openParams.mCursorFactory, openParams.mErrorHandler,
+ openParams.mLookasideSlotSize, openParams.mLookasideSlotCount);
+ db.open();
+ return db;
+ }
+
+ /**
* Open the database according to the flags {@link #OPEN_READWRITE}
* {@link #OPEN_READONLY} {@link #CREATE_IF_NECESSARY} and/or {@link #NO_LOCALIZED_COLLATORS}.
*
@@ -690,9 +718,9 @@
* @return the newly opened database
* @throws SQLiteException if the database cannot be opened
*/
- public static SQLiteDatabase openDatabase(String path, CursorFactory factory, int flags,
- DatabaseErrorHandler errorHandler) {
- SQLiteDatabase db = new SQLiteDatabase(path, flags, factory, errorHandler);
+ public static SQLiteDatabase openDatabase(@NonNull String path, @Nullable CursorFactory factory,
+ @DatabaseOpenFlags int flags, @Nullable DatabaseErrorHandler errorHandler) {
+ SQLiteDatabase db = new SQLiteDatabase(path, flags, factory, errorHandler, -1, -1);
db.open();
return db;
}
@@ -700,22 +728,24 @@
/**
* Equivalent to openDatabase(file.getPath(), factory, CREATE_IF_NECESSARY).
*/
- public static SQLiteDatabase openOrCreateDatabase(File file, CursorFactory factory) {
+ public static SQLiteDatabase openOrCreateDatabase(@NonNull File file,
+ @Nullable CursorFactory factory) {
return openOrCreateDatabase(file.getPath(), factory);
}
/**
* Equivalent to openDatabase(path, factory, CREATE_IF_NECESSARY).
*/
- public static SQLiteDatabase openOrCreateDatabase(String path, CursorFactory factory) {
+ public static SQLiteDatabase openOrCreateDatabase(@NonNull String path,
+ @Nullable CursorFactory factory) {
return openDatabase(path, factory, CREATE_IF_NECESSARY, null);
}
/**
* Equivalent to openDatabase(path, factory, CREATE_IF_NECESSARY, errorHandler).
*/
- public static SQLiteDatabase openOrCreateDatabase(String path, CursorFactory factory,
- DatabaseErrorHandler errorHandler) {
+ public static SQLiteDatabase openOrCreateDatabase(@NonNull String path,
+ @Nullable CursorFactory factory, @Nullable DatabaseErrorHandler errorHandler) {
return openDatabase(path, factory, CREATE_IF_NECESSARY, errorHandler);
}
@@ -726,7 +756,7 @@
* @param file The database file path.
* @return True if the database was successfully deleted.
*/
- public static boolean deleteDatabase(File file) {
+ public static boolean deleteDatabase(@NonNull File file) {
if (file == null) {
throw new IllegalArgumentException("file must not be null");
}
@@ -825,13 +855,29 @@
* cursor when query is called
* @return a SQLiteDatabase object, or null if the database can't be created
*/
- public static SQLiteDatabase create(CursorFactory factory) {
+ @NonNull
+ public static SQLiteDatabase create(@Nullable CursorFactory factory) {
// This is a magic string with special meaning for SQLite.
return openDatabase(SQLiteDatabaseConfiguration.MEMORY_DB_PATH,
factory, CREATE_IF_NECESSARY);
}
/**
+ * Create a memory backed SQLite database. Its contents will be destroyed
+ * when the database is closed.
+ *
+ * <p>Sets the locale of the database to the the system's current locale.
+ * Call {@link #setLocale} if you would like something else.</p>
+ * @param openParams configuration parameters that are used for opening SQLiteDatabase
+ * @return a SQLiteDatabase object, or null if the database can't be created
+ */
+ @NonNull
+ public static SQLiteDatabase createInMemory(@NonNull OpenParams openParams) {
+ return openDatabase(SQLiteDatabaseConfiguration.MEMORY_DB_PATH,
+ openParams.toBuilder().addOpenFlags(CREATE_IF_NECESSARY).build());
+ }
+
+ /**
* Registers a CustomFunction callback as a function that can be called from
* SQLite database triggers.
*
@@ -1667,6 +1713,7 @@
if (!mHasAttachedDbsLocked) {
mHasAttachedDbsLocked = true;
disableWal = true;
+ mConnectionPoolLocked.disableIdleConnectionHandler();
}
}
if (disableWal) {
@@ -2210,4 +2257,242 @@
public interface CustomFunction {
public void callback(String[] args);
}
+
+ /**
+ * Wrapper for configuration parameters that are used for opening {@link SQLiteDatabase}
+ */
+ public static final class OpenParams {
+ private final int mOpenFlags;
+ private final CursorFactory mCursorFactory;
+ private final DatabaseErrorHandler mErrorHandler;
+ private final int mLookasideSlotSize;
+ private final int mLookasideSlotCount;
+
+ private OpenParams(int openFlags, CursorFactory cursorFactory,
+ DatabaseErrorHandler errorHandler, int lookasideSlotSize, int lookasideSlotCount) {
+ mOpenFlags = openFlags;
+ mCursorFactory = cursorFactory;
+ mErrorHandler = errorHandler;
+ mLookasideSlotSize = lookasideSlotSize;
+ mLookasideSlotCount = lookasideSlotCount;
+ }
+
+ /**
+ * Returns size in bytes of each lookaside slot or -1 if not set.
+ *
+ * @see Builder#setLookasideConfig(int, int)
+ */
+ @IntRange(from = -1)
+ public int getLookasideSlotSize() {
+ return mLookasideSlotSize;
+ }
+
+ /**
+ * Returns total number of lookaside memory slots per database connection or -1 if not
+ * set.
+ *
+ * @see Builder#setLookasideConfig(int, int)
+ */
+ @IntRange(from = -1)
+ public int getLookasideSlotCount() {
+ return mLookasideSlotCount;
+ }
+
+ /**
+ * Returns flags to control database access mode
+ *
+ * @see Builder#setOpenFlags(int)
+ */
+ @DatabaseOpenFlags
+ public int getOpenFlags() {
+ return mOpenFlags;
+ }
+
+ /**
+ * Returns an optional factory class that is called to instantiate a cursor when query
+ * is called
+ *
+ * @see Builder#setCursorFactory(CursorFactory)
+ */
+ @Nullable
+ public CursorFactory getCursorFactory() {
+ return mCursorFactory;
+ }
+
+ /**
+ * Returns handler for database corruption errors
+ *
+ * @see Builder#setErrorHandler(DatabaseErrorHandler)
+ */
+ @Nullable
+ public DatabaseErrorHandler getErrorHandler() {
+ return mErrorHandler;
+ }
+
+ /**
+ * Creates a new instance of builder {@link Builder#Builder(OpenParams) initialized} with
+ * {@code this} parameters.
+ * @hide
+ */
+ @NonNull
+ public Builder toBuilder() {
+ return new Builder(this);
+ }
+
+ /**
+ * Builder for {@link OpenParams}.
+ */
+ public static final class Builder {
+ private int mLookasideSlotSize = -1;
+ private int mLookasideSlotCount = -1;
+ private int mOpenFlags;
+ private CursorFactory mCursorFactory;
+ private DatabaseErrorHandler mErrorHandler;
+
+ public Builder() {
+ }
+
+ public Builder(OpenParams params) {
+ mLookasideSlotSize = params.mLookasideSlotSize;
+ mLookasideSlotCount = params.mLookasideSlotCount;
+ mOpenFlags = params.mOpenFlags;
+ mCursorFactory = params.mCursorFactory;
+ mErrorHandler = params.mErrorHandler;
+ }
+
+ /**
+ * Configures
+ * <a href="https://sqlite.org/malloc.html#lookaside">lookaside memory allocator</a>
+ *
+ * <p>SQLite default settings will be used, if this method isn't called.
+ * Use {@code setLookasideConfig(0,0)} to disable lookaside
+ *
+ * <p><strong>Note:</strong> Provided slotSize/slotCount configuration is just a
+ * recommendation. The system may choose different values depending on a device, e.g.
+ * lookaside allocations can be disabled on low-RAM devices
+ *
+ * @param slotSize The size in bytes of each lookaside slot.
+ * @param slotCount The total number of lookaside memory slots per database connection.
+ */
+ public Builder setLookasideConfig(@IntRange(from = 0) final int slotSize,
+ @IntRange(from = 0) final int slotCount) {
+ Preconditions.checkArgument(slotSize >= 0,
+ "lookasideSlotCount cannot be negative");
+ Preconditions.checkArgument(slotCount >= 0,
+ "lookasideSlotSize cannot be negative");
+ Preconditions.checkArgument(
+ (slotSize > 0 && slotCount > 0) || (slotCount == 0 && slotSize == 0),
+ "Invalid configuration: " + slotSize + ", " + slotCount);
+
+ mLookasideSlotSize = slotSize;
+ mLookasideSlotCount = slotCount;
+ return this;
+ }
+
+ /**
+ * Returns true if {@link #ENABLE_WRITE_AHEAD_LOGGING} flag is set
+ * @hide
+ */
+ public boolean isWriteAheadLoggingEnabled() {
+ return (mOpenFlags & ENABLE_WRITE_AHEAD_LOGGING) != 0;
+ }
+
+ /**
+ * Sets flags to control database access mode
+ * @param openFlags The new flags to set
+ * @see #OPEN_READWRITE
+ * @see #OPEN_READONLY
+ * @see #CREATE_IF_NECESSARY
+ * @see #NO_LOCALIZED_COLLATORS
+ * @see #ENABLE_WRITE_AHEAD_LOGGING
+ * @return same builder instance for chaining multiple calls into a single statement
+ */
+ @NonNull
+ public Builder setOpenFlags(@DatabaseOpenFlags int openFlags) {
+ mOpenFlags = openFlags;
+ return this;
+ }
+
+ /**
+ * Adds flags to control database access mode
+ *
+ * @param openFlags The new flags to add
+ * @return same builder instance for chaining multiple calls into a single statement
+ */
+ @NonNull
+ public Builder addOpenFlags(@DatabaseOpenFlags int openFlags) {
+ mOpenFlags |= openFlags;
+ return this;
+ }
+
+ /**
+ * Removes database access mode flags
+ *
+ * @param openFlags Flags to remove
+ * @return same builder instance for chaining multiple calls into a single statement
+ */
+ @NonNull
+ public Builder removeOpenFlags(@DatabaseOpenFlags int openFlags) {
+ mOpenFlags &= ~openFlags;
+ return this;
+ }
+
+ /**
+ * Sets {@link #ENABLE_WRITE_AHEAD_LOGGING} flag if {@code enabled} is {@code true},
+ * unsets otherwise
+ * @hide
+ */
+ public void setWriteAheadLoggingEnabled(boolean enabled) {
+ if (enabled) {
+ addOpenFlags(ENABLE_WRITE_AHEAD_LOGGING);
+ } else {
+ removeOpenFlags(ENABLE_WRITE_AHEAD_LOGGING);
+ }
+ }
+
+ /**
+ * Set an optional factory class that is called to instantiate a cursor when query
+ * is called.
+ *
+ * @param cursorFactory instance
+ * @return same builder instance for chaining multiple calls into a single statement
+ */
+ @NonNull
+ public Builder setCursorFactory(@Nullable CursorFactory cursorFactory) {
+ mCursorFactory = cursorFactory;
+ return this;
+ }
+
+
+ /**
+ * Sets {@link DatabaseErrorHandler} object to handle db corruption errors
+ */
+ @NonNull
+ public Builder setErrorHandler(@Nullable DatabaseErrorHandler errorHandler) {
+ mErrorHandler = errorHandler;
+ return this;
+ }
+
+ /**
+ * Creates an instance of {@link OpenParams} with the options that were previously set
+ * on this builder
+ */
+ @NonNull
+ public OpenParams build() {
+ return new OpenParams(mOpenFlags, mCursorFactory, mErrorHandler, mLookasideSlotSize,
+ mLookasideSlotCount);
+ }
+ }
+ }
+
+ /** @hide */
+ @IntDef(flag = true, prefix = {"OPEN_", "CREATE_", "NO_", "ENABLE_"}, value = {
+ OPEN_READWRITE,
+ OPEN_READONLY,
+ CREATE_IF_NECESSARY,
+ NO_LOCALIZED_COLLATORS,
+ ENABLE_WRITE_AHEAD_LOGGING
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface DatabaseOpenFlags {}
}
diff --git a/core/java/android/database/sqlite/SQLiteDatabaseConfiguration.java b/core/java/android/database/sqlite/SQLiteDatabaseConfiguration.java
index 549ab90..7f09b73 100644
--- a/core/java/android/database/sqlite/SQLiteDatabaseConfiguration.java
+++ b/core/java/android/database/sqlite/SQLiteDatabaseConfiguration.java
@@ -90,6 +90,20 @@
new ArrayList<SQLiteCustomFunction>();
/**
+ * The size in bytes of each lookaside slot
+ *
+ * <p>If negative, the default lookaside configuration will be used
+ */
+ public int lookasideSlotSize;
+
+ /**
+ * The total number of lookaside memory slots per database connection
+ *
+ * <p>If negative, the default lookaside configuration will be used
+ */
+ public int lookasideSlotCount;
+
+ /**
* Creates a database configuration with the required parameters for opening a
* database and default values for all other parameters.
*
@@ -108,6 +122,8 @@
// Set default values for optional parameters.
maxSqlCacheSize = 25;
locale = Locale.getDefault();
+ lookasideSlotSize = -1;
+ lookasideSlotCount = -1;
}
/**
@@ -146,6 +162,8 @@
foreignKeyConstraintsEnabled = other.foreignKeyConstraintsEnabled;
customFunctions.clear();
customFunctions.addAll(other.customFunctions);
+ lookasideSlotSize = other.lookasideSlotSize;
+ lookasideSlotCount = other.lookasideSlotCount;
}
/**
@@ -162,4 +180,8 @@
}
return EMAIL_IN_DB_PATTERN.matcher(path).replaceAll("XX@YY");
}
+
+ boolean isLookasideConfigSet() {
+ return lookasideSlotCount >= 0 && lookasideSlotSize >= 0;
+ }
}
diff --git a/core/java/android/database/sqlite/SQLiteDebug.java b/core/java/android/database/sqlite/SQLiteDebug.java
index 1197331..a921aa3 100644
--- a/core/java/android/database/sqlite/SQLiteDebug.java
+++ b/core/java/android/database/sqlite/SQLiteDebug.java
@@ -16,13 +16,14 @@
package android.database.sqlite;
-import java.util.ArrayList;
-
+import android.annotation.TestApi;
import android.os.Build;
import android.os.SystemProperties;
import android.util.Log;
import android.util.Printer;
+import java.util.ArrayList;
+
/**
* Provides debugging info about all SQLite databases running in the current process.
*
@@ -117,6 +118,7 @@
/**
* contains statistics about a database
*/
+ @TestApi
public static class DbStats {
/** name of the database */
public String dbName;
@@ -127,7 +129,8 @@
/** the database size */
public long dbSize;
- /** documented here http://www.sqlite.org/c3ref/c_dbstatus_lookaside_used.html */
+ /**
+ * Number of lookaside slots: http://www.sqlite.org/c3ref/c_dbstatus_lookaside_used.html */
public int lookaside;
/** statement cache stats: hits/misses/cachesize */
@@ -147,6 +150,7 @@
* return all pager and database stats for the current process.
* @return {@link PagerStats}
*/
+ @TestApi
public static PagerStats getDatabaseInfo() {
PagerStats stats = new PagerStats();
nativeGetPagerStats(stats);
diff --git a/core/java/android/database/sqlite/SQLiteOpenHelper.java b/core/java/android/database/sqlite/SQLiteOpenHelper.java
index bb8d9ff..c19db82 100644
--- a/core/java/android/database/sqlite/SQLiteOpenHelper.java
+++ b/core/java/android/database/sqlite/SQLiteOpenHelper.java
@@ -16,10 +16,14 @@
package android.database.sqlite;
+import android.annotation.IntRange;
import android.content.Context;
import android.database.DatabaseErrorHandler;
+import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
+import android.os.FileUtils;
import android.util.Log;
+
import java.io.File;
/**
@@ -43,24 +47,14 @@
public abstract class SQLiteOpenHelper {
private static final String TAG = SQLiteOpenHelper.class.getSimpleName();
- // When true, getReadableDatabase returns a read-only database if it is just being opened.
- // The database handle is reopened in read/write mode when getWritableDatabase is called.
- // We leave this behavior disabled in production because it is inefficient and breaks
- // many applications. For debugging purposes it can be useful to turn on strict
- // read-only semantics to catch applications that call getReadableDatabase when they really
- // wanted getWritableDatabase.
- private static final boolean DEBUG_STRICT_READONLY = false;
-
private final Context mContext;
private final String mName;
- private final CursorFactory mFactory;
private final int mNewVersion;
private final int mMinimumSupportedVersion;
private SQLiteDatabase mDatabase;
private boolean mIsInitializing;
- private boolean mEnableWriteAheadLogging;
- private final DatabaseErrorHandler mErrorHandler;
+ private final SQLiteDatabase.OpenParams.Builder mOpenParamsBuilder;
/**
* Create a helper object to create, open, and/or manage a database.
@@ -130,10 +124,12 @@
mContext = context;
mName = name;
- mFactory = factory;
mNewVersion = version;
- mErrorHandler = errorHandler;
mMinimumSupportedVersion = Math.max(0, minimumSupportedVersion);
+ mOpenParamsBuilder = new SQLiteDatabase.OpenParams.Builder();
+ mOpenParamsBuilder.setCursorFactory(factory);
+ mOpenParamsBuilder.setErrorHandler(errorHandler);
+ mOpenParamsBuilder.addOpenFlags(SQLiteDatabase.CREATE_IF_NECESSARY);
}
/**
@@ -157,7 +153,7 @@
*/
public void setWriteAheadLoggingEnabled(boolean enabled) {
synchronized (this) {
- if (mEnableWriteAheadLogging != enabled) {
+ if (mOpenParamsBuilder.isWriteAheadLoggingEnabled() != enabled) {
if (mDatabase != null && mDatabase.isOpen() && !mDatabase.isReadOnly()) {
if (enabled) {
mDatabase.enableWriteAheadLogging();
@@ -165,12 +161,40 @@
mDatabase.disableWriteAheadLogging();
}
}
- mEnableWriteAheadLogging = enabled;
+ mOpenParamsBuilder.setWriteAheadLoggingEnabled(enabled);
}
}
}
/**
+ * Configures <a href="https://sqlite.org/malloc.html#lookaside">lookaside memory allocator</a>
+ *
+ * <p>This method should be called from the constructor of the subclass,
+ * before opening the database, since lookaside memory configuration can only be changed
+ * when no connection is using it
+ *
+ * <p>SQLite default settings will be used, if this method isn't called.
+ * Use {@code setLookasideConfig(0,0)} to disable lookaside
+ *
+ * <p><strong>Note:</strong> Provided slotSize/slotCount configuration is just a recommendation.
+ * The system may choose different values depending on a device, e.g. lookaside allocations
+ * can be disabled on low-RAM devices
+ *
+ * @param slotSize The size in bytes of each lookaside slot.
+ * @param slotCount The total number of lookaside memory slots per database connection.
+ */
+ public void setLookasideConfig(@IntRange(from = 0) final int slotSize,
+ @IntRange(from = 0) final int slotCount) {
+ synchronized (this) {
+ if (mDatabase != null && mDatabase.isOpen()) {
+ throw new IllegalStateException(
+ "Lookaside memory config cannot be changed after opening the database");
+ }
+ mOpenParamsBuilder.setLookasideConfig(slotSize, slotCount);
+ }
+ }
+
+ /**
* Create and/or open a database that will be used for reading and writing.
* The first time this is called, the database will be opened and
* {@link #onCreate}, {@link #onUpgrade} and/or {@link #onOpen} will be
@@ -243,27 +267,22 @@
db.reopenReadWrite();
}
} else if (mName == null) {
- db = SQLiteDatabase.create(null);
+ db = SQLiteDatabase.createInMemory(mOpenParamsBuilder.build());
} else {
+ final String path = mContext.getDatabasePath(mName).getPath();
+ SQLiteDatabase.OpenParams params = mOpenParamsBuilder.build();
try {
- if (DEBUG_STRICT_READONLY && !writable) {
- final String path = mContext.getDatabasePath(mName).getPath();
- db = SQLiteDatabase.openDatabase(path, mFactory,
- SQLiteDatabase.OPEN_READONLY, mErrorHandler);
- } else {
- db = mContext.openOrCreateDatabase(mName, mEnableWriteAheadLogging ?
- Context.MODE_ENABLE_WRITE_AHEAD_LOGGING : 0,
- mFactory, mErrorHandler);
- }
- } catch (SQLiteException ex) {
+ db = SQLiteDatabase.openDatabase(path, params);
+ // Keep pre-O-MR1 behavior by resetting file permissions to 660
+ setFilePermissionsForDb(path);
+ } catch (SQLException ex) {
if (writable) {
throw ex;
}
Log.e(TAG, "Couldn't open " + mName
+ " for writing (will try read-only):", ex);
- final String path = mContext.getDatabasePath(mName).getPath();
- db = SQLiteDatabase.openDatabase(path, mFactory,
- SQLiteDatabase.OPEN_READONLY, mErrorHandler);
+ params = params.toBuilder().addOpenFlags(SQLiteDatabase.OPEN_READONLY).build();
+ db = SQLiteDatabase.openDatabase(path, params);
}
}
@@ -323,6 +342,11 @@
}
}
+ private static void setFilePermissionsForDb(String dbPath) {
+ int perms = FileUtils.S_IRUSR | FileUtils.S_IWUSR | FileUtils.S_IRGRP | FileUtils.S_IWGRP;
+ FileUtils.setPermissions(dbPath, perms, -1, -1);
+ }
+
/**
* Close any open database object.
*/
diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java
index b51a791..a5bf639 100644
--- a/core/java/android/hardware/fingerprint/FingerprintManager.java
+++ b/core/java/android/hardware/fingerprint/FingerprintManager.java
@@ -99,8 +99,6 @@
/**
* The {@link FingerprintManager#remove} call failed. Typically this will happen when the
* provided fingerprint id was incorrect.
- *
- * @hide
*/
public static final int FINGERPRINT_ERROR_UNABLE_TO_REMOVE = 6;
@@ -112,7 +110,10 @@
/**
* Hardware vendors may extend this list if there are conditions that do not fall under one of
* the above categories. Vendors are responsible for providing error strings for these errors.
- * @hide
+ * These messages are typically reserved for internal operations such as enrollment, but may be
+ * used to express vendor errors not covered by the ones in fingerprint.h. Applications are
+ * expected to show the error message string if they happen, but are advised not to rely on the
+ * message id since they will be device and vendor-specific
*/
public static final int FINGERPRINT_ERROR_VENDOR = 8;
@@ -120,7 +121,6 @@
* The operation was canceled because FINGERPRINT_ERROR_LOCKOUT occurred too many times.
* Fingerprint authentication is disabled until the user unlocks with strong authentication
* (PIN/Pattern/Password)
- * @hide
*/
public static final int FINGERPRINT_ERROR_LOCKOUT_PERMANENT = 9;
diff --git a/core/java/android/hardware/input/IInputManager.aidl b/core/java/android/hardware/input/IInputManager.aidl
index 4586316..9e0c680 100644
--- a/core/java/android/hardware/input/IInputManager.aidl
+++ b/core/java/android/hardware/input/IInputManager.aidl
@@ -16,6 +16,7 @@
package android.hardware.input;
+import android.app.IInputForwarder;
import android.hardware.input.InputDeviceIdentifier;
import android.hardware.input.KeyboardLayout;
import android.hardware.input.IInputDevicesChangedListener;
@@ -88,4 +89,7 @@
void setCustomPointerIcon(in PointerIcon icon);
void requestPointerCapture(IBinder windowToken, boolean enabled);
+
+ /** Create input forwarder to deliver touch events to owned display. */
+ IInputForwarder createInputForwarder(int displayId);
}
diff --git a/core/java/android/hardware/input/InputManager.java b/core/java/android/hardware/input/InputManager.java
index 4898c1a..c531a89 100644
--- a/core/java/android/hardware/input/InputManager.java
+++ b/core/java/android/hardware/input/InputManager.java
@@ -19,8 +19,9 @@
import android.annotation.IntDef;
import android.annotation.Nullable;
import android.annotation.SdkConstant;
-import android.annotation.SystemService;
import android.annotation.SdkConstant.SdkConstantType;
+import android.annotation.SystemService;
+import android.app.IInputForwarder;
import android.content.Context;
import android.media.AudioAttributes;
import android.os.Binder;
@@ -971,6 +972,25 @@
}
}
+
+ /**
+ * Create an {@link IInputForwarder} targeted to provided display.
+ * {@link android.Manifest.permission.INJECT_EVENTS} permission is required to call this method.
+ *
+ * @param displayId Id of the target display where input events should be forwarded.
+ * Display must exist and must be owned by the caller.
+ * @return The forwarder instance.
+ *
+ * @hide
+ */
+ public IInputForwarder createInputForwarder(int displayId) {
+ try {
+ return mIm.createInputForwarder(displayId);
+ } catch (RemoteException ex) {
+ throw ex.rethrowFromSystemServer();
+ }
+ }
+
private void populateInputDevicesLocked() {
if (mInputDevicesChangedListener == null) {
final InputDevicesChangedListener listener = new InputDevicesChangedListener();
diff --git a/core/java/android/hardware/location/NanoApp.java b/core/java/android/hardware/location/NanoApp.java
index d5d428e..0465def 100644
--- a/core/java/android/hardware/location/NanoApp.java
+++ b/core/java/android/hardware/location/NanoApp.java
@@ -56,10 +56,10 @@
* {@link #setAppBinary(byte[])} and {@link #setAppId(long)} must be called
* prior to passing this object to any managers.
*
- * @see #NanoApp(int, byte[])
+ * @see #NanoApp(long, byte[])
*/
public NanoApp() {
- this(0, null);
+ this(0L, null);
mAppIdSet = false;
}
diff --git a/core/java/android/hardware/radio/IRadioService.aidl b/core/java/android/hardware/radio/IRadioService.aidl
index 9a157d1..c43fd26 100644
--- a/core/java/android/hardware/radio/IRadioService.aidl
+++ b/core/java/android/hardware/radio/IRadioService.aidl
@@ -26,6 +26,8 @@
* {@hide}
*/
interface IRadioService {
+ List<RadioManager.ModuleProperties> listModules();
+
ITuner openTuner(int moduleId, in RadioManager.BandConfig bandConfig, boolean withAudio,
in ITunerCallback callback);
}
diff --git a/core/java/android/hardware/radio/ITuner.aidl b/core/java/android/hardware/radio/ITuner.aidl
index 1fc71e0..7f470ef 100644
--- a/core/java/android/hardware/radio/ITuner.aidl
+++ b/core/java/android/hardware/radio/ITuner.aidl
@@ -16,12 +16,16 @@
package android.hardware.radio;
+import android.graphics.Bitmap;
+import android.hardware.radio.ProgramSelector;
import android.hardware.radio.RadioManager;
/** {@hide} */
interface ITuner {
void close();
+ boolean isClosed();
+
/**
* @throws IllegalArgumentException if config is not valid or null
*/
@@ -50,15 +54,19 @@
* @throws IllegalArgumentException if invalid arguments are passed
* @throws IllegalStateException if called out of sequence
*/
- void tune(int channel, int subChannel);
+ void tune(in ProgramSelector selector);
/**
* @throws IllegalStateException if called out of sequence
*/
void cancel();
+ void cancelAnnouncement();
+
RadioManager.ProgramInfo getProgramInformation();
+ Bitmap getImage(int id);
+
/**
* @returns {@code true} if the scan was properly scheduled,
* {@code false} if the scan feature is unavailable
diff --git a/core/java/android/hardware/radio/ITunerCallback.aidl b/core/java/android/hardware/radio/ITunerCallback.aidl
index b32c683..c3bbaec 100644
--- a/core/java/android/hardware/radio/ITunerCallback.aidl
+++ b/core/java/android/hardware/radio/ITunerCallback.aidl
@@ -17,10 +17,17 @@
package android.hardware.radio;
import android.hardware.radio.RadioManager;
+import android.hardware.radio.RadioMetadata;
/** {@hide} */
oneway interface ITunerCallback {
void onError(int status);
void onConfigurationChanged(in RadioManager.BandConfig config);
- void onProgramInfoChanged(in RadioManager.ProgramInfo info);
+ void onProgramInfoChanged();
+ void onTrafficAnnouncement(boolean active);
+ void onEmergencyAnnouncement(boolean active);
+ void onAntennaState(boolean connected);
+ void onBackgroundScanAvailabilityChange(boolean isAvailable);
+ void onBackgroundScanComplete();
+ void onProgramListChanged();
}
diff --git a/core/java/android/hardware/radio/ProgramSelector.aidl b/core/java/android/hardware/radio/ProgramSelector.aidl
new file mode 100644
index 0000000..545269a
--- /dev/null
+++ b/core/java/android/hardware/radio/ProgramSelector.aidl
@@ -0,0 +1,20 @@
+/**
+ * Copyright (C) 2017 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.hardware.radio;
+
+/** @hide */
+parcelable ProgramSelector;
diff --git a/core/java/android/hardware/radio/ProgramSelector.java b/core/java/android/hardware/radio/ProgramSelector.java
new file mode 100644
index 0000000..d9e306f
--- /dev/null
+++ b/core/java/android/hardware/radio/ProgramSelector.java
@@ -0,0 +1,509 @@
+/**
+ * Copyright (C) 2017 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.hardware.radio;
+
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SystemApi;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Stream;
+
+/**
+ * A set of identifiers necessary to tune to a given station.
+ *
+ * This can hold various identifiers, like
+ * - AM/FM frequency
+ * - HD Radio subchannel
+ * - DAB channel info
+ *
+ * The primary ID uniquely identifies a station and can be used for equality
+ * check. The secondary IDs are supplementary and can speed up tuning process,
+ * but the primary ID is sufficient (ie. after a full band scan).
+ *
+ * Two selectors with different secondary IDs, but the same primary ID are
+ * considered equal. In particular, secondary IDs vector may get updated for
+ * an entry on the program list (ie. when a better frequency for a given
+ * station is found).
+ *
+ * The primaryId of a given programType MUST be of a specific type:
+ * - AM, FM: RDS_PI if the station broadcasts RDS, AMFM_FREQUENCY otherwise;
+ * - AM_HD, FM_HD: HD_STATION_ID_EXT;
+ * - DAB: DAB_SIDECC;
+ * - DRMO: DRMO_SERVICE_ID;
+ * - SXM: SXM_SERVICE_ID;
+ * - VENDOR: VENDOR_PRIMARY.
+ * @hide
+ */
+@SystemApi
+public final class ProgramSelector implements Parcelable {
+ /** Analogue AM radio (with or without RDS). */
+ public static final int PROGRAM_TYPE_AM = 1;
+ /** analogue FM radio (with or without RDS). */
+ public static final int PROGRAM_TYPE_FM = 2;
+ /** AM HD Radio. */
+ public static final int PROGRAM_TYPE_AM_HD = 3;
+ /** FM HD Radio. */
+ public static final int PROGRAM_TYPE_FM_HD = 4;
+ /** Digital audio broadcasting. */
+ public static final int PROGRAM_TYPE_DAB = 5;
+ /** Digital Radio Mondiale. */
+ public static final int PROGRAM_TYPE_DRMO = 6;
+ /** SiriusXM Satellite Radio. */
+ public static final int PROGRAM_TYPE_SXM = 7;
+ /** Vendor-specific, not synced across devices. */
+ public static final int PROGRAM_TYPE_VENDOR1 = 8;
+ public static final int PROGRAM_TYPE_VENDOR2 = 9;
+ public static final int PROGRAM_TYPE_VENDOR3 = 10;
+ public static final int PROGRAM_TYPE_VENDOR4 = 11;
+ @IntDef(prefix = { "PROGRAM_TYPE_" }, value = {
+ PROGRAM_TYPE_AM,
+ PROGRAM_TYPE_FM,
+ PROGRAM_TYPE_AM_HD,
+ PROGRAM_TYPE_FM_HD,
+ PROGRAM_TYPE_DAB,
+ PROGRAM_TYPE_DRMO,
+ PROGRAM_TYPE_SXM,
+ PROGRAM_TYPE_VENDOR1,
+ PROGRAM_TYPE_VENDOR2,
+ PROGRAM_TYPE_VENDOR3,
+ PROGRAM_TYPE_VENDOR4,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface ProgramType {}
+
+ /** kHz */
+ public static final int IDENTIFIER_TYPE_AMFM_FREQUENCY = 1;
+ /** 16bit */
+ public static final int IDENTIFIER_TYPE_RDS_PI = 2;
+ /**
+ * 64bit compound primary identifier for HD Radio.
+ *
+ * Consists of (from the LSB):
+ * - 32bit: Station ID number;
+ * - 4bit: HD_SUBCHANNEL;
+ * - 18bit: AMFM_FREQUENCY.
+ * The remaining bits should be set to zeros when writing on the chip side
+ * and ignored when read.
+ */
+ public static final int IDENTIFIER_TYPE_HD_STATION_ID_EXT = 3;
+ /**
+ * HD Radio subchannel - a value of range 0-7.
+ *
+ * The subchannel index is 0-based (where 0 is MPS and 1..7 are SPS),
+ * as opposed to HD Radio standard (where it's 1-based).
+ */
+ public static final int IDENTIFIER_TYPE_HD_SUBCHANNEL = 4;
+ /**
+ * 24bit compound primary identifier for DAB.
+ *
+ * Consists of (from the LSB):
+ * - 16bit: SId;
+ * - 8bit: ECC code.
+ * The remaining bits should be set to zeros when writing on the chip side
+ * and ignored when read.
+ */
+ public static final int IDENTIFIER_TYPE_DAB_SIDECC = 5;
+ /** 16bit */
+ public static final int IDENTIFIER_TYPE_DAB_ENSEMBLE = 6;
+ /** 12bit */
+ public static final int IDENTIFIER_TYPE_DAB_SCID = 7;
+ /** kHz */
+ public static final int IDENTIFIER_TYPE_DAB_FREQUENCY = 8;
+ /** 24bit */
+ public static final int IDENTIFIER_TYPE_DRMO_SERVICE_ID = 9;
+ /** kHz */
+ public static final int IDENTIFIER_TYPE_DRMO_FREQUENCY = 10;
+ /** 1: AM, 2:FM */
+ public static final int IDENTIFIER_TYPE_DRMO_MODULATION = 11;
+ /** 32bit */
+ public static final int IDENTIFIER_TYPE_SXM_SERVICE_ID = 12;
+ /** 0-999 range */
+ public static final int IDENTIFIER_TYPE_SXM_CHANNEL = 13;
+ /**
+ * Primary identifier for vendor-specific radio technology.
+ * The value format is determined by a vendor.
+ *
+ * It must not be used in any other programType than VENDORx.
+ */
+ public static final int IDENTIFIER_TYPE_VENDOR1_PRIMARY = 14;
+ public static final int IDENTIFIER_TYPE_VENDOR2_PRIMARY = 15;
+ public static final int IDENTIFIER_TYPE_VENDOR3_PRIMARY = 16;
+ public static final int IDENTIFIER_TYPE_VENDOR4_PRIMARY = 17;
+ @IntDef(prefix = { "IDENTIFIER_TYPE_" }, value = {
+ IDENTIFIER_TYPE_AMFM_FREQUENCY,
+ IDENTIFIER_TYPE_RDS_PI,
+ IDENTIFIER_TYPE_HD_STATION_ID_EXT,
+ IDENTIFIER_TYPE_HD_SUBCHANNEL,
+ IDENTIFIER_TYPE_DAB_SIDECC,
+ IDENTIFIER_TYPE_DAB_ENSEMBLE,
+ IDENTIFIER_TYPE_DAB_SCID,
+ IDENTIFIER_TYPE_DAB_FREQUENCY,
+ IDENTIFIER_TYPE_DRMO_SERVICE_ID,
+ IDENTIFIER_TYPE_DRMO_FREQUENCY,
+ IDENTIFIER_TYPE_DRMO_MODULATION,
+ IDENTIFIER_TYPE_SXM_SERVICE_ID,
+ IDENTIFIER_TYPE_SXM_CHANNEL,
+ IDENTIFIER_TYPE_VENDOR1_PRIMARY,
+ IDENTIFIER_TYPE_VENDOR2_PRIMARY,
+ IDENTIFIER_TYPE_VENDOR3_PRIMARY,
+ IDENTIFIER_TYPE_VENDOR4_PRIMARY,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface IdentifierType {}
+
+ private final @ProgramType int mProgramType;
+ private final @NonNull Identifier mPrimaryId;
+ private final @NonNull Identifier[] mSecondaryIds;
+ private final @NonNull long[] mVendorIds;
+
+ /**
+ * Constructor for ProgramSelector.
+ *
+ * It's not desired to modify selector objects, so all its fields are initialized at creation.
+ *
+ * Identifier lists must not contain any nulls, but can itself be null to be interpreted
+ * as empty list at object creation.
+ *
+ * @param programType type of a radio technology.
+ * @param primaryId primary program identifier.
+ * @param secondaryIds list of secondary program identifiers.
+ * @param vendorIds list of vendor-specific program identifiers.
+ */
+ public ProgramSelector(@ProgramType int programType, @NonNull Identifier primaryId,
+ @Nullable Identifier[] secondaryIds, @Nullable long[] vendorIds) {
+ if (secondaryIds == null) secondaryIds = new Identifier[0];
+ if (vendorIds == null) vendorIds = new long[0];
+ if (Stream.of(secondaryIds).anyMatch(id -> id == null)) {
+ throw new IllegalArgumentException("secondaryIds list must not contain nulls");
+ }
+ mProgramType = programType;
+ mPrimaryId = Objects.requireNonNull(primaryId);
+ mSecondaryIds = secondaryIds;
+ mVendorIds = vendorIds;
+ }
+
+ /**
+ * Type of a radio technology.
+ *
+ * @returns program type.
+ */
+ public @ProgramType int getProgramType() {
+ return mProgramType;
+ }
+
+ /**
+ * Primary program identifier uniquely identifies a station and is used to
+ * determine equality between two ProgramSelectors.
+ *
+ * @returns primary identifier.
+ */
+ public @NonNull Identifier getPrimaryId() {
+ return mPrimaryId;
+ }
+
+ /**
+ * Secondary program identifier is not required for tuning, but may make it
+ * faster or more reliable.
+ *
+ * @returns secondary identifier list, must not be modified.
+ */
+ public @NonNull Identifier[] getSecondaryIds() {
+ return mSecondaryIds;
+ }
+
+ /**
+ * Looks up an identifier of a given type (either primary or secondary).
+ *
+ * If there are multiple identifiers if a given type, then first in order (where primary id is
+ * before any secondary) is selected.
+ *
+ * @param type type of identifier.
+ * @return identifier value, if found.
+ * @throws IllegalArgumentException, if not found.
+ */
+ public long getFirstId(@IdentifierType int type) {
+ if (mPrimaryId.getType() == type) return mPrimaryId.getValue();
+ for (Identifier id : mSecondaryIds) {
+ if (id.getType() == type) return id.getValue();
+ }
+ throw new IllegalArgumentException("Identifier " + type + " not found");
+ }
+
+ /**
+ * Looks up all identifier of a given type (either primary or secondary).
+ *
+ * Some identifiers may be provided multiple times, for example
+ * IDENTIFIER_TYPE_AMFM_FREQUENCY for FM Alternate Frequencies.
+ *
+ * @param type type of identifier.
+ * @return a list of identifiers, generated on each call. May be modified.
+ */
+ public @NonNull Identifier[] getAllIds(@IdentifierType int type) {
+ List<Identifier> out = new ArrayList<>();
+
+ if (mPrimaryId.getType() == type) out.add(mPrimaryId);
+ for (Identifier id : mSecondaryIds) {
+ if (id.getType() == type) out.add(id);
+ }
+
+ return out.toArray(new Identifier[out.size()]);
+ }
+
+ /**
+ * Vendor identifiers are passed as-is to the HAL implementation,
+ * preserving elements order.
+ *
+ * @return a array of vendor identifiers, must not be modified.
+ */
+ public @NonNull long[] getVendorIds() {
+ return mVendorIds;
+ }
+
+ /**
+ * Builds new ProgramSelector for AM/FM frequency.
+ *
+ * @param band the band.
+ * @param frequencyKhz the frequency in kHz.
+ * @return new ProgramSelector object representing given frequency.
+ * @throws IllegalArgumentException if provided frequency is out of bounds.
+ */
+ public static @NonNull ProgramSelector createAmFmSelector(
+ @RadioManager.Band int band, int frequencyKhz) {
+ return createAmFmSelector(band, frequencyKhz, 0);
+ }
+
+ /**
+ * Checks, if a given AM/FM frequency is roughly valid and in correct unit.
+ *
+ * It does not check the range precisely. In particular, it may be way off for certain regions.
+ * The main purpose is to avoid passing inproper units, ie. MHz instead of kHz.
+ *
+ * @param isAm true, if AM, false if FM.
+ * @param frequencyKhz the frequency in kHz.
+ * @return true, if the frequency is rougly valid.
+ */
+ private static boolean isValidAmFmFrequency(boolean isAm, int frequencyKhz) {
+ if (isAm) {
+ return frequencyKhz > 150 && frequencyKhz < 30000;
+ } else {
+ return frequencyKhz > 60000 && frequencyKhz < 110000;
+ }
+ }
+
+ /**
+ * Builds new ProgramSelector for AM/FM frequency.
+ *
+ * This method variant supports HD Radio subchannels, but it's undesirable to
+ * select them manually. Instead, the value should be retrieved from program list.
+ *
+ * @param band the band.
+ * @param frequencyKhz the frequency in kHz.
+ * @param subChannel 1-based HD Radio subchannel.
+ * @return new ProgramSelector object representing given frequency.
+ * @throws IllegalArgumentException if provided frequency is out of bounds,
+ * or tried setting a subchannel for analog AM/FM.
+ */
+ public static @NonNull ProgramSelector createAmFmSelector(
+ @RadioManager.Band int band, int frequencyKhz, int subChannel) {
+ boolean isAm = (band == RadioManager.BAND_AM || band == RadioManager.BAND_AM_HD);
+ boolean isDigital = (band == RadioManager.BAND_AM_HD || band == RadioManager.BAND_FM_HD);
+ if (!isAm && !isDigital && band != RadioManager.BAND_FM) {
+ throw new IllegalArgumentException("Unknown band: " + band);
+ }
+ if (subChannel < 0 || subChannel > 8) {
+ throw new IllegalArgumentException("Invalid subchannel: " + subChannel);
+ }
+ if (subChannel > 0 && !isDigital) {
+ throw new IllegalArgumentException("Subchannels are not supported for non-HD radio");
+ }
+ if (!isValidAmFmFrequency(isAm, frequencyKhz)) {
+ throw new IllegalArgumentException("Provided value is not a valid AM/FM frequency");
+ }
+
+ // We can't use AM_HD or FM_HD, because we don't know HD station ID.
+ @ProgramType int programType = isAm ? PROGRAM_TYPE_AM : PROGRAM_TYPE_FM;
+ Identifier primary = new Identifier(IDENTIFIER_TYPE_AMFM_FREQUENCY, frequencyKhz);
+
+ Identifier[] secondary = null;
+ if (subChannel > 0) {
+ /* Stating sub channel for non-HD AM/FM does not give any guarantees,
+ * but we can't do much more without HD station ID.
+ *
+ * The legacy APIs had 1-based subChannels, while ProgramSelector is 0-based.
+ */
+ secondary = new Identifier[]{
+ new Identifier(IDENTIFIER_TYPE_HD_SUBCHANNEL, subChannel - 1)};
+ }
+
+ return new ProgramSelector(programType, primary, secondary, null);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder("ProgramSelector(type=").append(mProgramType)
+ .append(", primary=").append(mPrimaryId);
+ if (mSecondaryIds.length > 0) sb.append(", secondary=").append(mSecondaryIds);
+ if (mVendorIds.length > 0) sb.append(", vendor=").append(mVendorIds);
+ sb.append(")");
+ return sb.toString();
+ }
+
+ @Override
+ public int hashCode() {
+ // secondaryIds and vendorIds are ignored for equality/hashing
+ return Objects.hash(mProgramType, mPrimaryId);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) return true;
+ if (!(obj instanceof ProgramSelector)) return false;
+ ProgramSelector other = (ProgramSelector) obj;
+ // secondaryIds and vendorIds are ignored for equality/hashing
+ return other.getProgramType() == mProgramType && mPrimaryId.equals(other.getPrimaryId());
+ }
+
+ private ProgramSelector(Parcel in) {
+ mProgramType = in.readInt();
+ mPrimaryId = in.readTypedObject(Identifier.CREATOR);
+ mSecondaryIds = in.createTypedArray(Identifier.CREATOR);
+ if (Stream.of(mSecondaryIds).anyMatch(id -> id == null)) {
+ throw new IllegalArgumentException("secondaryIds list must not contain nulls");
+ }
+ mVendorIds = in.createLongArray();
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeInt(mProgramType);
+ dest.writeTypedObject(mPrimaryId, 0);
+ dest.writeTypedArray(mSecondaryIds, 0);
+ dest.writeLongArray(mVendorIds);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ public static final Parcelable.Creator<ProgramSelector> CREATOR =
+ new Parcelable.Creator<ProgramSelector>() {
+ public ProgramSelector createFromParcel(Parcel in) {
+ return new ProgramSelector(in);
+ }
+
+ public ProgramSelector[] newArray(int size) {
+ return new ProgramSelector[size];
+ }
+ };
+
+ /**
+ * A single program identifier component, eg. frequency or channel ID.
+ *
+ * The long value field holds the value in format described in comments for
+ * IdentifierType constants.
+ */
+ public static final class Identifier implements Parcelable {
+ private final @IdentifierType int mType;
+ private final long mValue;
+
+ public Identifier(@IdentifierType int type, long value) {
+ mType = type;
+ mValue = value;
+ }
+
+ /**
+ * Type of an identifier.
+ *
+ * @return type of an identifier.
+ */
+ public @IdentifierType int getType() {
+ return mType;
+ }
+
+ /**
+ * Value of an identifier.
+ *
+ * Its meaning depends on identifier type, ie. for IDENTIFIER_TYPE_AMFM_FREQUENCY type,
+ * the value is a frequency in kHz.
+ *
+ * The range of a value depends on its type; it does not always require the whole long
+ * range. Casting to necessary type (ie. int) without range checking is correct in front-end
+ * code - any range violations are either errors in the framework or in the
+ * HAL implementation. For example, IDENTIFIER_TYPE_AMFM_FREQUENCY always fits in int,
+ * as Integer.MAX_VALUE would mean 2.1THz.
+ *
+ * @return value of an identifier.
+ */
+ public long getValue() {
+ return mValue;
+ }
+
+ @Override
+ public String toString() {
+ return "Identifier(" + mType + ", " + mValue + ")";
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mType, mValue);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) return true;
+ if (!(obj instanceof Identifier)) return false;
+ Identifier other = (Identifier) obj;
+ return other.getType() == mType && other.getValue() == mValue;
+ }
+
+ private Identifier(Parcel in) {
+ mType = in.readInt();
+ mValue = in.readLong();
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeInt(mType);
+ dest.writeLong(mValue);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ public static final Parcelable.Creator<Identifier> CREATOR =
+ new Parcelable.Creator<Identifier>() {
+ public Identifier createFromParcel(Parcel in) {
+ return new Identifier(in);
+ }
+
+ public Identifier[] newArray(int size) {
+ return new Identifier[size];
+ }
+ };
+ }
+}
diff --git a/core/java/android/hardware/radio/RadioManager.aidl b/core/java/android/hardware/radio/RadioManager.aidl
index 0f0ec84..8a39388 100644
--- a/core/java/android/hardware/radio/RadioManager.aidl
+++ b/core/java/android/hardware/radio/RadioManager.aidl
@@ -17,7 +17,10 @@
package android.hardware.radio;
/** @hide */
-parcelable RadioManager.ProgramInfo;
+parcelable RadioManager.BandConfig;
/** @hide */
-parcelable RadioManager.BandConfig;
+parcelable RadioManager.ModuleProperties;
+
+/** @hide */
+parcelable RadioManager.ProgramInfo;
diff --git a/core/java/android/hardware/radio/RadioManager.java b/core/java/android/hardware/radio/RadioManager.java
index 20292f7..d5b72aa 100644
--- a/core/java/android/hardware/radio/RadioManager.java
+++ b/core/java/android/hardware/radio/RadioManager.java
@@ -16,8 +16,8 @@
package android.hardware.radio;
+import android.annotation.IntDef;
import android.annotation.NonNull;
-import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.annotation.SystemService;
import android.content.Context;
@@ -27,12 +27,15 @@
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.ServiceManager.ServiceNotFoundException;
-import android.os.SystemProperties;
import android.text.TextUtils;
import android.util.Log;
-import java.util.List;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
/**
* The RadioManager class allows to control a broadcast radio tuner present on the device.
@@ -44,7 +47,7 @@
@SystemApi
@SystemService(Context.RADIO_SERVICE)
public class RadioManager {
- private static final String TAG = "RadioManager";
+ private static final String TAG = "BroadcastRadio.manager";
/** Method return status: successful operation */
public static final int STATUS_OK = 0;
@@ -72,7 +75,7 @@
/** Radio module class supporting Digital terrestrial radio */
public static final int CLASS_DT = 2;
- // keep in sync with radio_band_t in /system/core/incluse/system/radio.h
+ public static final int BAND_INVALID = -1;
/** AM radio band (LW/MW/SW).
* @see BandDescriptor */
public static final int BAND_AM = 0;
@@ -85,6 +88,15 @@
/** AM HD radio or DRM band.
* @see BandDescriptor */
public static final int BAND_AM_HD = 3;
+ @IntDef(prefix = { "BAND_" }, value = {
+ BAND_INVALID,
+ BAND_AM,
+ BAND_FM,
+ BAND_AM_HD,
+ BAND_FM_HD,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface Band {}
// keep in sync with radio_region_t in /system/core/incluse/system/radio.h
/** Africa, Europe.
@@ -111,6 +123,7 @@
public static class ModuleProperties implements Parcelable {
private final int mId;
+ @NonNull private final String mServiceName;
private final int mClassId;
private final String mImplementor;
private final String mProduct;
@@ -121,12 +134,18 @@
private final boolean mIsCaptureSupported;
private final BandDescriptor[] mBands;
private final boolean mIsBgScanSupported;
- private final String mVendorExension;
+ private final Set<Integer> mSupportedProgramTypes;
+ private final Set<Integer> mSupportedIdentifierTypes;
+ private final String mVendorInfo;
- ModuleProperties(int id, int classId, String implementor, String product, String version,
- String serial, int numTuners, int numAudioSources, boolean isCaptureSupported,
- BandDescriptor[] bands, boolean isBgScanSupported, String vendorExension) {
+ ModuleProperties(int id, String serviceName, int classId, String implementor,
+ String product, String version, String serial, int numTuners, int numAudioSources,
+ boolean isCaptureSupported, BandDescriptor[] bands, boolean isBgScanSupported,
+ @ProgramSelector.ProgramType int[] supportedProgramTypes,
+ @ProgramSelector.IdentifierType int[] supportedIdentifierTypes,
+ String vendorInfo) {
mId = id;
+ mServiceName = TextUtils.isEmpty(serviceName) ? "default" : serviceName;
mClassId = classId;
mImplementor = implementor;
mProduct = product;
@@ -137,9 +156,18 @@
mIsCaptureSupported = isCaptureSupported;
mBands = bands;
mIsBgScanSupported = isBgScanSupported;
- mVendorExension = vendorExension;
+ mSupportedProgramTypes = arrayToSet(supportedProgramTypes);
+ mSupportedIdentifierTypes = arrayToSet(supportedIdentifierTypes);
+ mVendorInfo = vendorInfo;
}
+ private static Set<Integer> arrayToSet(int[] arr) {
+ return Arrays.stream(arr).boxed().collect(Collectors.toSet());
+ }
+
+ private static int[] setToArray(Set<Integer> set) {
+ return set.stream().mapToInt(Integer::intValue).toArray();
+ }
/** Unique module identifier provided by the native service.
* For use with {@link #openTuner(int, BandConfig, boolean, Callback, Handler)}.
@@ -149,6 +177,14 @@
return mId;
}
+ /**
+ * Module service (driver) name as registered with HIDL.
+ * @return the module service name.
+ */
+ public @NonNull String getServiceName() {
+ return mServiceName;
+ }
+
/** Module class identifier: {@link #CLASS_AM_FM}, {@link #CLASS_SAT}, {@link #CLASS_DT}
* @return the radio module class identifier.
*/
@@ -218,14 +254,37 @@
*
* @return {@code true} if background scanning is supported (not necessary available
* at a given time), {@code false} otherwise.
- *
- * @hide FutureFeature
*/
public boolean isBackgroundScanningSupported() {
return mIsBgScanSupported;
}
/**
+ * Checks, if a given program type is supported by this tuner.
+ *
+ * If a program type is supported by radio module, it means it can tune
+ * to ProgramSelector of a given type.
+ *
+ * @return {@code true} if a given program type is supported.
+ */
+ public boolean isProgramTypeSupported(@ProgramSelector.ProgramType int type) {
+ return mSupportedProgramTypes.contains(type);
+ }
+
+ /**
+ * Checks, if a given program identifier is supported by this tuner.
+ *
+ * If an identifier is supported by radio module, it means it can use it for
+ * tuning to ProgramSelector with either primary or secondary Identifier of
+ * a given type.
+ *
+ * @return {@code true} if a given program type is supported.
+ */
+ public boolean isProgramIdentifierSupported(@ProgramSelector.IdentifierType int type) {
+ return mSupportedIdentifierTypes.contains(type);
+ }
+
+ /**
* Opaque vendor-specific string, passed from HAL without changes.
* Format of this string can vary across vendors.
*
@@ -234,11 +293,9 @@
*
* Client application MUST verify vendor/product name from the
* ModuleProperties class before doing any interpretation of this value.
- *
- * @hide FutureFeature
*/
- public @NonNull String getVendorExension() {
- return mVendorExension == null ? "" : mVendorExension;
+ public @NonNull String getVendorInfo() {
+ return mVendorInfo == null ? "" : mVendorInfo;
}
/** List of descriptors for all bands supported by this module.
@@ -250,6 +307,8 @@
private ModuleProperties(Parcel in) {
mId = in.readInt();
+ String serviceName = in.readString();
+ mServiceName = TextUtils.isEmpty(serviceName) ? "default" : serviceName;
mClassId = in.readInt();
mImplementor = in.readString();
mProduct = in.readString();
@@ -264,7 +323,9 @@
mBands[i] = (BandDescriptor) tmp[i];
}
mIsBgScanSupported = in.readInt() == 1;
- mVendorExension = in.readString();
+ mSupportedProgramTypes = arrayToSet(in.createIntArray());
+ mSupportedIdentifierTypes = arrayToSet(in.createIntArray());
+ mVendorInfo = in.readString();
}
public static final Parcelable.Creator<ModuleProperties> CREATOR
@@ -281,6 +342,7 @@
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(mId);
+ dest.writeString(mServiceName);
dest.writeInt(mClassId);
dest.writeString(mImplementor);
dest.writeString(mProduct);
@@ -291,7 +353,9 @@
dest.writeInt(mIsCaptureSupported ? 1 : 0);
dest.writeParcelableArray(mBands, flags);
dest.writeInt(mIsBgScanSupported ? 1 : 0);
- dest.writeString(mVendorExension);
+ dest.writeIntArray(setToArray(mSupportedProgramTypes));
+ dest.writeIntArray(setToArray(mSupportedIdentifierTypes));
+ dest.writeString(mVendorInfo);
}
@Override
@@ -301,7 +365,8 @@
@Override
public String toString() {
- return "ModuleProperties [mId=" + mId + ", mClassId=" + mClassId
+ return "ModuleProperties [mId=" + mId
+ + ", mServiceName=" + mServiceName + ", mClassId=" + mClassId
+ ", mImplementor=" + mImplementor + ", mProduct=" + mProduct
+ ", mVersion=" + mVersion + ", mSerial=" + mSerial
+ ", mNumTuners=" + mNumTuners
@@ -316,6 +381,7 @@
final int prime = 31;
int result = 1;
result = prime * result + mId;
+ result = prime * result + mServiceName.hashCode();
result = prime * result + mClassId;
result = prime * result + ((mImplementor == null) ? 0 : mImplementor.hashCode());
result = prime * result + ((mProduct == null) ? 0 : mProduct.hashCode());
@@ -326,7 +392,7 @@
result = prime * result + (mIsCaptureSupported ? 1 : 0);
result = prime * result + Arrays.hashCode(mBands);
result = prime * result + (mIsBgScanSupported ? 1 : 0);
- result = prime * result + ((mVendorExension == null) ? 0 : mVendorExension.hashCode());
+ result = prime * result + ((mVendorInfo == null) ? 0 : mVendorInfo.hashCode());
return result;
}
@@ -339,6 +405,7 @@
ModuleProperties other = (ModuleProperties) obj;
if (mId != other.getId())
return false;
+ if (!TextUtils.equals(mServiceName, other.mServiceName)) return false;
if (mClassId != other.getClassId())
return false;
if (mImplementor == null) {
@@ -371,8 +438,7 @@
return false;
if (mIsBgScanSupported != other.isBackgroundScanningSupported())
return false;
- if (!TextUtils.equals(mVendorExension, other.mVendorExension))
- return false;
+ if (!TextUtils.equals(mVendorInfo, other.mVendorInfo)) return false;
return true;
}
}
@@ -414,6 +480,25 @@
public int getType() {
return mType;
}
+
+ /**
+ * Checks if the band is either AM or AM_HD.
+ *
+ * @return {@code true}, if band is AM or AM_HD.
+ */
+ public boolean isAmBand() {
+ return mType == BAND_AM || mType == BAND_AM_HD;
+ }
+
+ /**
+ * Checks if the band is either FM or FM_HD.
+ *
+ * @return {@code true}, if band is FM or FM_HD.
+ */
+ public boolean isFmBand() {
+ return mType == BAND_FM || mType == BAND_FM_HD;
+ }
+
/** Lower band limit expressed in units according to band type.
* Currently all defined band types express channels as frequency in kHz
* @return the lower band limit.
@@ -1225,46 +1310,72 @@
public static class ProgramInfo implements Parcelable {
// sourced from hardware/interfaces/broadcastradio/1.1/types.hal
- private final static int FLAG_LIVE = 1 << 0;
- private final static int FLAG_MUTED = 1 << 1;
+ private static final int FLAG_LIVE = 1 << 0;
+ private static final int FLAG_MUTED = 1 << 1;
+ private static final int FLAG_TRAFFIC_PROGRAM = 1 << 2;
+ private static final int FLAG_TRAFFIC_ANNOUNCEMENT = 1 << 3;
- private final int mChannel;
- private final int mSubChannel;
+ @NonNull private final ProgramSelector mSelector;
private final boolean mTuned;
private final boolean mStereo;
private final boolean mDigital;
private final int mFlags;
private final int mSignalStrength;
private final RadioMetadata mMetadata;
- private final String mVendorExension;
+ private final String mVendorInfo;
- ProgramInfo(int channel, int subChannel, boolean tuned, boolean stereo,
+ ProgramInfo(@NonNull ProgramSelector selector, boolean tuned, boolean stereo,
boolean digital, int signalStrength, RadioMetadata metadata, int flags,
- String vendorExension) {
- mChannel = channel;
- mSubChannel = subChannel;
+ String vendorInfo) {
+ mSelector = selector;
mTuned = tuned;
mStereo = stereo;
mDigital = digital;
mFlags = flags;
mSignalStrength = signalStrength;
mMetadata = metadata;
- mVendorExension = vendorExension;
+ mVendorInfo = vendorInfo;
+ }
+
+ /**
+ * Program selector, necessary for tuning to a program.
+ *
+ * @return the program selector.
+ */
+ public @NonNull ProgramSelector getSelector() {
+ return mSelector;
}
/** Main channel expressed in units according to band type.
* Currently all defined band types express channels as frequency in kHz
* @return the program channel
+ * @deprecated Use {@link getSelector()} instead.
*/
+ @Deprecated
public int getChannel() {
- return mChannel;
+ try {
+ return (int) mSelector.getFirstId(ProgramSelector.IDENTIFIER_TYPE_AMFM_FREQUENCY);
+ } catch (IllegalArgumentException ex) {
+ Log.w(TAG, "Not an AM/FM program");
+ return 0;
+ }
}
+
/** Sub channel ID. E.g 1 for HD radio HD1
* @return the program sub channel
+ * @deprecated Use {@link getSelector()} instead.
*/
+ @Deprecated
public int getSubChannel() {
- return mSubChannel;
+ try {
+ return (int) mSelector.getFirstId(
+ ProgramSelector.IDENTIFIER_TYPE_HD_SUBCHANNEL) + 1;
+ } catch (IllegalArgumentException ex) {
+ // this is a normal behavior for analog AM/FM selector
+ return 0;
+ }
}
+
/** {@code true} if the tuner is currently tuned on a valid station
* @return {@code true} if currently tuned, {@code false} otherwise.
*/
@@ -1288,8 +1399,6 @@
* {@code true} if the program is currently playing live stream.
* This may result in a slightly altered reception parameters,
* usually targetted at reduced latency.
- *
- * @hide FutureFeature
*/
public boolean isLive() {
return (mFlags & FLAG_LIVE) != 0;
@@ -1300,13 +1409,27 @@
* conditions or buffering. In this state volume knob MAY be disabled to
* prevent user increasing volume too much.
* It does NOT mean the user has muted audio.
- *
- * @hide FutureFeature
*/
public boolean isMuted() {
return (mFlags & FLAG_MUTED) != 0;
}
+ /**
+ * {@code true} if radio station transmits traffic information
+ * regularily.
+ */
+ public boolean isTrafficProgram() {
+ return (mFlags & FLAG_TRAFFIC_PROGRAM) != 0;
+ }
+
+ /**
+ * {@code true} if radio station transmits traffic information
+ * at the very moment.
+ */
+ public boolean isTrafficAnnouncementActive() {
+ return (mFlags & FLAG_TRAFFIC_ANNOUNCEMENT) != 0;
+ }
+
/** Signal strength indicator from 0 (no signal) to 100 (excellent)
* @return the signal strength indication.
*/
@@ -1330,16 +1453,13 @@
*
* Client application MUST verify vendor/product name from the
* ModuleProperties class before doing any interpretation of this value.
- *
- * @hide FutureFeature
*/
- public @NonNull String getVendorExension() {
- return mVendorExension == null ? "" : mVendorExension;
+ public @NonNull String getVendorInfo() {
+ return mVendorInfo == null ? "" : mVendorInfo;
}
private ProgramInfo(Parcel in) {
- mChannel = in.readInt();
- mSubChannel = in.readInt();
+ mSelector = in.readParcelable(null);
mTuned = in.readByte() == 1;
mStereo = in.readByte() == 1;
mDigital = in.readByte() == 1;
@@ -1350,7 +1470,7 @@
mMetadata = null;
}
mFlags = in.readInt();
- mVendorExension = in.readString();
+ mVendorInfo = in.readString();
}
public static final Parcelable.Creator<ProgramInfo> CREATOR
@@ -1366,8 +1486,7 @@
@Override
public void writeToParcel(Parcel dest, int flags) {
- dest.writeInt(mChannel);
- dest.writeInt(mSubChannel);
+ dest.writeParcelable(mSelector, 0);
dest.writeByte((byte)(mTuned ? 1 : 0));
dest.writeByte((byte)(mStereo ? 1 : 0));
dest.writeByte((byte)(mDigital ? 1 : 0));
@@ -1379,7 +1498,7 @@
mMetadata.writeToParcel(dest, flags);
}
dest.writeInt(mFlags);
- dest.writeString(mVendorExension);
+ dest.writeString(mVendorInfo);
}
@Override
@@ -1389,7 +1508,7 @@
@Override
public String toString() {
- return "ProgramInfo [mChannel=" + mChannel + ", mSubChannel=" + mSubChannel
+ return "ProgramInfo [mSelector=" + mSelector
+ ", mTuned=" + mTuned + ", mStereo=" + mStereo + ", mDigital=" + mDigital
+ ", mFlags=" + mFlags + ", mSignalStrength=" + mSignalStrength
+ ((mMetadata == null) ? "" : (", mMetadata=" + mMetadata.toString()))
@@ -1400,15 +1519,14 @@
public int hashCode() {
final int prime = 31;
int result = 1;
- result = prime * result + mChannel;
- result = prime * result + mSubChannel;
+ result = prime * result + mSelector.hashCode();
result = prime * result + (mTuned ? 1 : 0);
result = prime * result + (mStereo ? 1 : 0);
result = prime * result + (mDigital ? 1 : 0);
result = prime * result + mFlags;
result = prime * result + mSignalStrength;
result = prime * result + ((mMetadata == null) ? 0 : mMetadata.hashCode());
- result = prime * result + ((mVendorExension == null) ? 0 : mVendorExension.hashCode());
+ result = prime * result + ((mVendorInfo == null) ? 0 : mVendorInfo.hashCode());
return result;
}
@@ -1419,10 +1537,7 @@
if (!(obj instanceof ProgramInfo))
return false;
ProgramInfo other = (ProgramInfo) obj;
- if (mChannel != other.getChannel())
- return false;
- if (mSubChannel != other.getSubChannel())
- return false;
+ if (!mSelector.equals(other.getSelector())) return false;
if (mTuned != other.isTuned())
return false;
if (mStereo != other.isStereo())
@@ -1438,8 +1553,7 @@
return false;
} else if (!mMetadata.equals(other.getMetadata()))
return false;
- if (!TextUtils.equals(mVendorExension, other.mVendorExension))
- return false;
+ if (!TextUtils.equals(mVendorInfo, other.mVendorInfo)) return false;
return true;
}
}
@@ -1457,7 +1571,31 @@
* <li>{@link #STATUS_DEAD_OBJECT} if the binder transaction to the native service fails, </li>
* </ul>
*/
- public native int listModules(List <ModuleProperties> modules);
+ public int listModules(List<ModuleProperties> modules) {
+ if (modules == null) {
+ Log.e(TAG, "the output list must not be empty");
+ return STATUS_BAD_VALUE;
+ }
+
+ Log.d(TAG, "Listing available tuners...");
+ List<ModuleProperties> returnedList;
+ try {
+ returnedList = mService.listModules();
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed listing available tuners", e);
+ return STATUS_DEAD_OBJECT;
+ }
+
+ if (returnedList == null) {
+ Log.e(TAG, "Returned list was a null");
+ return STATUS_ERROR;
+ }
+
+ modules.addAll(returnedList);
+ return STATUS_OK;
+ }
+
+ private native int nativeListModules(List<ModuleProperties> modules);
/**
* Open an interface to control a tuner on a given broadcast radio module.
@@ -1479,44 +1617,33 @@
throw new IllegalArgumentException("callback must not be empty");
}
- if (mService != null) {
- Log.d(TAG, "Opening tuner...");
+ Log.d(TAG, "Opening tuner " + moduleId + "...");
- ITuner tuner;
- ITunerCallback halCallback = new TunerCallbackAdapter(callback, handler);
- try {
- tuner = mService.openTuner(moduleId, config, withAudio, halCallback);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- if (tuner == null) {
- Log.e(TAG, "Failed to open tuner");
- return null;
- }
- return new TunerAdapter(tuner);
+ ITuner tuner;
+ TunerCallbackAdapter halCallback = new TunerCallbackAdapter(callback, handler);
+ try {
+ tuner = mService.openTuner(moduleId, config, withAudio, halCallback);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to open tuner", e);
+ return null;
}
-
- RadioModule module = new RadioModule(moduleId, config, withAudio, callback, handler);
- if (!module.initCheck()) {
+ if (tuner == null) {
Log.e(TAG, "Failed to open tuner");
- module = null;
+ return null;
}
-
- return (RadioTuner)module;
+ halCallback.attachTuner(tuner);
+ return new TunerAdapter(tuner, config != null ? config.getType() : BAND_INVALID);
}
@NonNull private final Context mContext;
- // TODO(b/36863239): NonNull when transitioned from native service
- @Nullable private final IRadioService mService;
+ @NonNull private final IRadioService mService;
/**
* @hide
*/
public RadioManager(@NonNull Context context) throws ServiceNotFoundException {
mContext = context;
-
- boolean isServiceJava = SystemProperties.getBoolean("config.enable_java_radio", false);
- mService = isServiceJava ? IRadioService.Stub.asInterface(
- ServiceManager.getServiceOrThrow(Context.RADIO_SERVICE)) : null;
+ mService = IRadioService.Stub.asInterface(
+ ServiceManager.getServiceOrThrow(Context.RADIO_SERVICE));
}
}
diff --git a/core/java/android/hardware/radio/RadioMetadata.aidl b/core/java/android/hardware/radio/RadioMetadata.aidl
new file mode 100644
index 0000000..cbf4713
--- /dev/null
+++ b/core/java/android/hardware/radio/RadioMetadata.aidl
@@ -0,0 +1,20 @@
+/**
+ * Copyright (C) 2017 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.hardware.radio;
+
+/** @hide */
+parcelable RadioMetadata;
diff --git a/core/java/android/hardware/radio/RadioMetadata.java b/core/java/android/hardware/radio/RadioMetadata.java
index d07b407..3cc4b56 100644
--- a/core/java/android/hardware/radio/RadioMetadata.java
+++ b/core/java/android/hardware/radio/RadioMetadata.java
@@ -17,19 +17,15 @@
import android.annotation.NonNull;
import android.annotation.SystemApi;
-import android.content.ContentResolver;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
-import android.net.Uri;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
-import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.Log;
import android.util.SparseArray;
-import java.util.ArrayList;
import java.util.Set;
/**
@@ -38,7 +34,7 @@
*/
@SystemApi
public final class RadioMetadata implements Parcelable {
- private static final String TAG = "RadioMetadata";
+ private static final String TAG = "BroadcastRadio.metadata";
/**
* The RDS Program Information.
@@ -111,7 +107,7 @@
static {
METADATA_KEYS_TYPE = new ArrayMap<String, Integer>();
- METADATA_KEYS_TYPE.put(METADATA_KEY_RDS_PI, METADATA_TYPE_TEXT);
+ METADATA_KEYS_TYPE.put(METADATA_KEY_RDS_PI, METADATA_TYPE_INT);
METADATA_KEYS_TYPE.put(METADATA_KEY_RDS_PS, METADATA_TYPE_TEXT);
METADATA_KEYS_TYPE.put(METADATA_KEY_RDS_PTY, METADATA_TYPE_INT);
METADATA_KEYS_TYPE.put(METADATA_KEY_RBDS_PTY, METADATA_TYPE_INT);
@@ -245,6 +241,14 @@
return mBundle.getString(key);
}
+ private static void putInt(Bundle bundle, String key, int value) {
+ int type = METADATA_KEYS_TYPE.getOrDefault(key, METADATA_TYPE_INVALID);
+ if (type != METADATA_TYPE_INT && type != METADATA_TYPE_BITMAP) {
+ throw new IllegalArgumentException("The " + key + " key cannot be used to put an int");
+ }
+ bundle.putInt(key, value);
+ }
+
/**
* Returns the value associated with the given key,
* or 0 if the key is not found in the meta data.
@@ -261,7 +265,9 @@
*
* @param key The key the value is stored under
* @return a {@link Bitmap} or null
+ * @deprecated Use getBitmapId(String) instead
*/
+ @Deprecated
public Bitmap getBitmap(String key) {
Bitmap bmp = null;
try {
@@ -273,6 +279,30 @@
return bmp;
}
+ /**
+ * Retrieves an identifier for a bitmap.
+ *
+ * The format of an identifier is opaque to the application,
+ * with a special case of value 0 being invalid.
+ * An identifier for a given image-tuner pair is unique, so an application
+ * may cache images and determine if there is a necessity to fetch them
+ * again - if identifier changes, it means the image has changed.
+ *
+ * Only bitmap keys may be used with this method:
+ * <ul>
+ * <li>{@link #METADATA_KEY_ICON}</li>
+ * <li>{@link #METADATA_KEY_ART}</li>
+ * </ul>
+ *
+ * @param key The key the value is stored under.
+ * @return a bitmap identifier or 0 if it's missing.
+ * @hide This API is not thoroughly elaborated yet
+ */
+ public int getBitmapId(@NonNull String key) {
+ if (!METADATA_KEY_ICON.equals(key) && !METADATA_KEY_ART.equals(key)) return 0;
+ return getInt(key);
+ }
+
public Clock getClock(String key) {
Clock clock = null;
try {
@@ -390,7 +420,6 @@
* the METADATA_KEYs defined in this class are used they may only be one
* of the following:
* <ul>
- * <li>{@link #METADATA_KEY_RDS_PI}</li>
* <li>{@link #METADATA_KEY_RDS_PS}</li>
* <li>{@link #METADATA_KEY_RDS_RT}</li>
* <li>{@link #METADATA_KEY_TITLE}</li>
@@ -418,21 +447,18 @@
* the METADATA_KEYs defined in this class are used they may only be one
* of the following:
* <ul>
+ * <li>{@link #METADATA_KEY_RDS_PI}</li>
* <li>{@link #METADATA_KEY_RDS_PTY}</li>
* <li>{@link #METADATA_KEY_RBDS_PTY}</li>
* </ul>
+ * or any bitmap represented by its identifier.
*
* @param key The key for referencing this value
* @param value The int value to store
* @return the same Builder instance
*/
public Builder putInt(String key, int value) {
- if (!METADATA_KEYS_TYPE.containsKey(key) ||
- METADATA_KEYS_TYPE.get(key) != METADATA_TYPE_INT) {
- throw new IllegalArgumentException("The " + key
- + " key cannot be used to put a long");
- }
- mBundle.putInt(key, value);
+ RadioMetadata.putInt(mBundle, key, value);
return this;
}
@@ -503,12 +529,12 @@
int putIntFromNative(int nativeKey, int value) {
String key = getKeyFromNativeKey(nativeKey);
- if (!METADATA_KEYS_TYPE.containsKey(key) ||
- METADATA_KEYS_TYPE.get(key) != METADATA_TYPE_INT) {
+ try {
+ putInt(mBundle, key, value);
+ return 0;
+ } catch (IllegalArgumentException ex) {
return -1;
}
- mBundle.putInt(key, value);
- return 0;
}
int putStringFromNative(int nativeKey, String value) {
@@ -540,7 +566,6 @@
}
int putClockFromNative(int nativeKey, long utcEpochSeconds, int timezoneOffsetInMinutes) {
- Log.d(TAG, "putClockFromNative()");
String key = getKeyFromNativeKey(nativeKey);
if (!METADATA_KEYS_TYPE.containsKey(key) ||
METADATA_KEYS_TYPE.get(key) != METADATA_TYPE_CLOCK) {
diff --git a/core/java/android/hardware/radio/RadioModule.java b/core/java/android/hardware/radio/RadioModule.java
deleted file mode 100644
index c0df0f3..0000000
--- a/core/java/android/hardware/radio/RadioModule.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * Copyright (C) 2015 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.hardware.radio;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.SystemApi;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import java.lang.ref.WeakReference;
-import java.util.List;
-import java.util.UUID;
-
-/**
- * A RadioModule implements the RadioTuner interface for a broadcast radio tuner physically
- * present on the device and exposed by the radio HAL.
- *
- * @hide
- */
-public class RadioModule extends RadioTuner {
- private long mNativeContext = 0;
- private int mId;
- private NativeEventHandlerDelegate mEventHandlerDelegate;
-
- RadioModule(int moduleId, RadioManager.BandConfig config, boolean withAudio,
- RadioTuner.Callback callback, Handler handler) {
- mId = moduleId;
- mEventHandlerDelegate = new NativeEventHandlerDelegate(callback, handler);
- native_setup(new WeakReference<RadioModule>(this), config, withAudio);
- }
- private native void native_setup(Object module_this,
- RadioManager.BandConfig config, boolean withAudio);
-
- @Override
- protected void finalize() {
- native_finalize();
- }
- private native void native_finalize();
-
- boolean initCheck() {
- return mNativeContext != 0;
- }
-
- // RadioTuner implementation
- public native void close();
-
- public native int setConfiguration(RadioManager.BandConfig config);
-
- public native int getConfiguration(RadioManager.BandConfig[] config);
-
- public native int setMute(boolean mute);
-
- public native boolean getMute();
-
- public native int step(int direction, boolean skipSubChannel);
-
- public native int scan(int direction, boolean skipSubChannel);
-
- public native int tune(int channel, int subChannel);
-
- public native int cancel();
-
- public native int getProgramInformation(RadioManager.ProgramInfo[] info);
-
- public native boolean startBackgroundScan();
-
- public native @NonNull List<RadioManager.ProgramInfo> getProgramList(@Nullable String filter);
-
- public native boolean isAnalogForced();
-
- public native void setAnalogForced(boolean isForced);
-
- public native boolean isAntennaConnected();
-
- public native boolean hasControl();
-
-
- /* keep in sync with radio_event_type_t in system/core/include/system/radio.h */
- static final int EVENT_HW_FAILURE = 0;
- static final int EVENT_CONFIG = 1;
- static final int EVENT_ANTENNA = 2;
- static final int EVENT_TUNED = 3;
- static final int EVENT_METADATA = 4;
- static final int EVENT_TA = 5;
- static final int EVENT_AF_SWITCH = 6;
- static final int EVENT_EA = 7;
- static final int EVENT_CONTROL = 100;
- static final int EVENT_SERVER_DIED = 101;
-
- private class NativeEventHandlerDelegate {
- private final Handler mHandler;
-
- NativeEventHandlerDelegate(final RadioTuner.Callback callback,
- Handler handler) {
- // find the looper for our new event handler
- Looper looper;
- if (handler != null) {
- looper = handler.getLooper();
- } else {
- looper = Looper.getMainLooper();
- }
-
- // construct the event handler with this looper
- if (looper != null) {
- // implement the event handler delegate
- mHandler = new Handler(looper) {
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case EVENT_HW_FAILURE:
- if (callback != null) {
- callback.onError(RadioTuner.ERROR_HARDWARE_FAILURE);
- }
- break;
- case EVENT_CONFIG: {
- RadioManager.BandConfig config = (RadioManager.BandConfig)msg.obj;
- switch(msg.arg1) {
- case RadioManager.STATUS_OK:
- if (callback != null) {
- callback.onConfigurationChanged(config);
- }
- break;
- default:
- if (callback != null) {
- callback.onError(RadioTuner.ERROR_CONFIG);
- }
- break;
- }
- } break;
- case EVENT_ANTENNA:
- if (callback != null) {
- callback.onAntennaState(msg.arg2 == 1);
- }
- break;
- case EVENT_AF_SWITCH:
- case EVENT_TUNED: {
- RadioManager.ProgramInfo info = (RadioManager.ProgramInfo)msg.obj;
- switch (msg.arg1) {
- case RadioManager.STATUS_OK:
- if (callback != null) {
- callback.onProgramInfoChanged(info);
- }
- break;
- case RadioManager.STATUS_TIMED_OUT:
- if (callback != null) {
- callback.onError(RadioTuner.ERROR_SCAN_TIMEOUT);
- }
- break;
- case RadioManager.STATUS_INVALID_OPERATION:
- default:
- if (callback != null) {
- callback.onError(RadioTuner.ERROR_CANCELLED);
- }
- break;
- }
- } break;
- case EVENT_METADATA: {
- RadioMetadata metadata = (RadioMetadata)msg.obj;
- if (callback != null) {
- callback.onMetadataChanged(metadata);
- }
- } break;
- case EVENT_TA:
- if (callback != null) {
- callback.onTrafficAnnouncement(msg.arg2 == 1);
- }
- break;
- case EVENT_EA:
- if (callback != null) {
- callback.onEmergencyAnnouncement(msg.arg2 == 1);
- }
- case EVENT_CONTROL:
- if (callback != null) {
- callback.onControlChanged(msg.arg2 == 1);
- }
- break;
- case EVENT_SERVER_DIED:
- if (callback != null) {
- callback.onError(RadioTuner.ERROR_SERVER_DIED);
- }
- break;
- default:
- // Should not happen
- break;
- }
- }
- };
- } else {
- mHandler = null;
- }
- }
-
- Handler handler() {
- return mHandler;
- }
- }
-
-
- @SuppressWarnings("unused")
- private static void postEventFromNative(Object module_ref,
- int what, int arg1, int arg2, Object obj) {
- RadioModule module = (RadioModule)((WeakReference)module_ref).get();
- if (module == null) {
- return;
- }
-
- NativeEventHandlerDelegate delegate = module.mEventHandlerDelegate;
- if (delegate != null) {
- Handler handler = delegate.handler();
- if (handler != null) {
- Message m = handler.obtainMessage(what, arg1, arg2, obj);
- handler.sendMessage(m);
- }
- }
- }
-}
-
diff --git a/core/java/android/hardware/radio/RadioTuner.java b/core/java/android/hardware/radio/RadioTuner.java
index 6e1232d..be37cd0 100644
--- a/core/java/android/hardware/radio/RadioTuner.java
+++ b/core/java/android/hardware/radio/RadioTuner.java
@@ -19,14 +19,10 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
-import android.content.Context;
-import android.content.Intent;
+import android.graphics.Bitmap;
import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import java.lang.ref.WeakReference;
+
import java.util.List;
-import java.util.UUID;
/**
* RadioTuner interface provides methods to control a radio tuner on the device: selecting and
@@ -175,10 +171,22 @@
* <li>{@link RadioManager#STATUS_DEAD_OBJECT} if the binder transaction to the native
* service fails, </li>
* </ul>
+ * @deprecated Use {@link tune(ProgramSelector)} instead.
*/
+ @Deprecated
public abstract int tune(int channel, int subChannel);
/**
+ * Tune to a program.
+ *
+ * The operation is asynchronous and {@link Callback} onProgramInfoChanged() will be called
+ * when tune completes or onError() when cancelled or on timeout.
+ *
+ * @thows IllegalArgumentException if the provided selector is invalid
+ */
+ public abstract void tune(@NonNull ProgramSelector selector);
+
+ /**
* Cancel a pending scan or tune operation.
* If an operation is pending, {@link Callback} onError() will be called with
* {@link #ERROR_CANCELLED}.
@@ -196,6 +204,17 @@
public abstract int cancel();
/**
+ * Cancels traffic or emergency announcement.
+ *
+ * If there was no announcement to cancel, no action is taken.
+ *
+ * There is a race condition between calling cancelAnnouncement and the actual announcement
+ * being finished, so onTrafficAnnouncement / onEmergencyAnnouncement callback should be
+ * tracked with proper locking.
+ */
+ public abstract void cancelAnnouncement();
+
+ /**
* Get current station information.
* @param info a ProgramInfo array of lengh 1 where the information is returned.
* @return
@@ -212,6 +231,27 @@
public abstract int getProgramInformation(RadioManager.ProgramInfo[] info);
/**
+ * Retrieves a {@link Bitmap} for the given image ID or null,
+ * if the image was missing from the tuner.
+ *
+ * This involves doing a call to the tuner, so the bitmap should be cached
+ * on the application side.
+ *
+ * If the method returns null for non-zero ID, it means the image was
+ * updated on the tuner side. There is a race conditon between fetching
+ * image for an old ID and tuner updating the image (and cleaning up the
+ * old image). In such case, a new ProgramInfo with updated image id will
+ * be sent with a {@link onProgramInfoChanged} callback.
+ *
+ * @param id The image identifier, retrieved with
+ * {@link RadioMetadata#getBitmapId(String)}.
+ * @return A {@link Bitmap} or null.
+ * @throws IllegalArgumentException if id==0
+ * @hide This API is not thoroughly elaborated yet
+ */
+ public abstract @Nullable Bitmap getMetadataImage(int id);
+
+ /**
* Initiates a background scan to update internally cached program list.
*
* It may not be necessary to initiate the scan explicitly - the scan MAY be performed on boot.
@@ -224,7 +264,6 @@
* is unavailable; ie. temporarily due to ongoing foreground playback in single-tuner device
* or permanently if the feature is not supported
* (see ModuleProperties#isBackgroundScanningSupported()).
- * @hide FutureFeature
*/
public abstract boolean startBackgroundScan();
@@ -239,7 +278,6 @@
* @throws IllegalStateException if the scan is in progress or has not been started,
* startBackgroundScan() call may fix it.
* @throws IllegalArgumentException if the filter argument is not valid.
- * @hide FutureFeature
*/
public abstract @NonNull List<RadioManager.ProgramInfo> getProgramList(@Nullable String filter);
@@ -249,7 +287,6 @@
* @throws IllegalStateException if the switch is not supported at current
* configuration.
* @return {@code true} if analog is forced, {@code false} otherwise.
- * @hide FutureFeature
*/
public abstract boolean isAnalogForced();
@@ -265,7 +302,6 @@
* @param isForced {@code true} to force analog, {@code false} for a default behaviour.
* @throws IllegalStateException if the switch is not supported at current
* configuration.
- * @hide FutureFeature
*/
public abstract void setAnalogForced(boolean isForced);
@@ -303,6 +339,10 @@
public static final int ERROR_SCAN_TIMEOUT = 3;
/** The requested configuration could not be applied */
public static final int ERROR_CONFIG = 4;
+ /** Background scan was interrupted due to hardware becoming temporarily unavailable. */
+ public static final int ERROR_BACKGROUND_SCAN_UNAVAILABLE = 5;
+ /** Background scan failed due to other error, ie. HW failure. */
+ public static final int ERROR_BACKGROUND_SCAN_FAILED = 6;
/**
* Callback provided by the client application when opening a {@link RadioTuner}
@@ -323,20 +363,24 @@
* or {@link RadioTuner#setConfiguration(RadioManager.BandConfig)}
*/
public void onConfigurationChanged(RadioManager.BandConfig config) {}
+
/**
- * onProgramInfoChanged() is called upon successful completion of
- * {@link RadioTuner#step(int, boolean)}, {@link RadioTuner#scan(int, boolean)},
- * {@link RadioTuner#tune(int, int)} or when a switching to alternate frequency occurs.
- * Note that if metadata only are updated, {@link #onMetadataChanged(RadioMetadata)} will
- * be called.
+ * Called when program info (including metadata) for the current program has changed.
+ *
+ * It happens either upon successful completion of {@link RadioTuner#step(int, boolean)},
+ * {@link RadioTuner#scan(int, boolean)}, {@link RadioTuner#tune(int, int)}; when
+ * a switching to alternate frequency occurs; or when metadata is updated.
*/
public void onProgramInfoChanged(RadioManager.ProgramInfo info) {}
+
/**
- * onMetadataChanged() is called when new meta data are received on current program.
- * Meta data are also received in {@link RadioManager.ProgramInfo} when
- * {@link #onProgramInfoChanged(RadioManager.ProgramInfo)} is called.
+ * Called when metadata is updated for the current program.
+ *
+ * @deprecated Use {@link #onProgramInfoChanged(RadioManager.ProgramInfo)} instead.
*/
+ @Deprecated
public void onMetadataChanged(RadioMetadata metadata) {}
+
/**
* onTrafficAnnouncement() is called when a traffic announcement starts and stops.
*/
@@ -368,23 +412,18 @@
*
* @param isAvailable true, if the tuner turned temporarily background-
* capable, false in the other case.
- * @hide FutureFeature
*/
public void onBackgroundScanAvailabilityChange(boolean isAvailable) {}
/**
* Called when a background scan completes successfully.
- *
- * @hide FutureFeature
*/
public void onBackgroundScanComplete() {}
/**
* Called when available program list changed.
*
- * Use getProgramList() to get the actual list.
- *
- * @hide FutureFeature
+ * Use {@link RadioTuner#getProgramList(String)} to get an actual list.
*/
public void onProgramListChanged() {}
}
diff --git a/core/java/android/hardware/radio/TunerAdapter.java b/core/java/android/hardware/radio/TunerAdapter.java
index a457494..c687537 100644
--- a/core/java/android/hardware/radio/TunerAdapter.java
+++ b/core/java/android/hardware/radio/TunerAdapter.java
@@ -18,6 +18,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.graphics.Bitmap;
import android.os.RemoteException;
import android.util.Log;
@@ -27,23 +28,26 @@
* Implements the RadioTuner interface by forwarding calls to radio service.
*/
class TunerAdapter extends RadioTuner {
- private static final String TAG = "radio.TunerAdapter";
+ private static final String TAG = "BroadcastRadio.TunerAdapter";
@NonNull private final ITuner mTuner;
private boolean mIsClosed = false;
- TunerAdapter(ITuner tuner) {
+ private @RadioManager.Band int mBand;
+
+ TunerAdapter(ITuner tuner, @RadioManager.Band int band) {
if (tuner == null) {
throw new NullPointerException();
}
mTuner = tuner;
+ mBand = band;
}
@Override
public void close() {
synchronized (mTuner) {
if (mIsClosed) {
- Log.d(TAG, "Tuner is already closed");
+ Log.v(TAG, "Tuner is already closed");
return;
}
mIsClosed = true;
@@ -59,6 +63,7 @@
public int setConfiguration(RadioManager.BandConfig config) {
try {
mTuner.setConfiguration(config);
+ mBand = config.getType();
return RadioManager.STATUS_OK;
} catch (IllegalArgumentException e) {
Log.e(TAG, "Can't set configuration", e);
@@ -138,7 +143,7 @@
@Override
public int tune(int channel, int subChannel) {
try {
- mTuner.tune(channel, subChannel);
+ mTuner.tune(ProgramSelector.createAmFmSelector(mBand, channel, subChannel));
} catch (IllegalStateException e) {
Log.e(TAG, "Can't tune", e);
return RadioManager.STATUS_INVALID_OPERATION;
@@ -153,6 +158,15 @@
}
@Override
+ public void tune(@NonNull ProgramSelector selector) {
+ try {
+ mTuner.tune(selector);
+ } catch (RemoteException e) {
+ throw new RuntimeException("service died", e);
+ }
+ }
+
+ @Override
public int cancel() {
try {
mTuner.cancel();
@@ -167,6 +181,15 @@
}
@Override
+ public void cancelAnnouncement() {
+ try {
+ mTuner.cancelAnnouncement();
+ } catch (RemoteException e) {
+ throw new RuntimeException("service died", e);
+ }
+ }
+
+ @Override
public int getProgramInformation(RadioManager.ProgramInfo[] info) {
if (info == null || info.length != 1) {
throw new IllegalArgumentException("The argument must be an array of length 1");
@@ -181,6 +204,15 @@
}
@Override
+ public @Nullable Bitmap getMetadataImage(int id) {
+ try {
+ return mTuner.getImage(id);
+ } catch (RemoteException e) {
+ throw new RuntimeException("service died", e);
+ }
+ }
+
+ @Override
public boolean startBackgroundScan() {
try {
return mTuner.startBackgroundScan();
@@ -227,7 +259,11 @@
@Override
public boolean hasControl() {
- // TODO(b/36863239): forward to mTuner
- throw new RuntimeException("Not implemented");
+ try {
+ // don't rely on mIsClosed, as tuner might get closed internally
+ return !mTuner.isClosed();
+ } catch (RemoteException e) {
+ return false;
+ }
}
}
diff --git a/core/java/android/hardware/radio/TunerCallbackAdapter.java b/core/java/android/hardware/radio/TunerCallbackAdapter.java
index ba85017..00a36c8 100644
--- a/core/java/android/hardware/radio/TunerCallbackAdapter.java
+++ b/core/java/android/hardware/radio/TunerCallbackAdapter.java
@@ -20,13 +20,21 @@
import android.annotation.Nullable;
import android.os.Handler;
import android.os.Looper;
+import android.os.RemoteException;
+import android.util.Log;
/**
* Implements the ITunerCallback interface by forwarding calls to RadioTuner.Callback.
*/
class TunerCallbackAdapter extends ITunerCallback.Stub {
+ private static final String TAG = "BroadcastRadio.TunerCallbackAdapter";
+
@NonNull private final RadioTuner.Callback mCallback;
@NonNull private final Handler mHandler;
+ private final Object mLock = new Object();
+
+ @Nullable private ITuner mTuner;
+ boolean mPendingProgramInfoChanged = false;
TunerCallbackAdapter(@NonNull RadioTuner.Callback callback, @Nullable Handler handler) {
mCallback = callback;
@@ -37,6 +45,14 @@
}
}
+ public void attachTuner(@NonNull ITuner tuner) {
+ synchronized (mLock) {
+ if (mTuner != null) throw new IllegalStateException();
+ mTuner = tuner;
+ if (mPendingProgramInfoChanged) onProgramInfoChanged();
+ }
+ }
+
@Override
public void onError(int status) {
mHandler.post(() -> mCallback.onError(status));
@@ -48,7 +64,57 @@
}
@Override
- public void onProgramInfoChanged(RadioManager.ProgramInfo info) {
- mHandler.post(() -> mCallback.onProgramInfoChanged(info));
+ public void onProgramInfoChanged() {
+ synchronized (mLock) {
+ if (mTuner == null) {
+ mPendingProgramInfoChanged = true;
+ return;
+ }
+ }
+
+ RadioManager.ProgramInfo info;
+ try {
+ info = mTuner.getProgramInformation();
+ } catch (RemoteException e) {
+ Log.e(TAG, "service died", e);
+ return;
+ }
+
+ mHandler.post(() -> {
+ mCallback.onProgramInfoChanged(info);
+
+ RadioMetadata metadata = info.getMetadata();
+ if (metadata != null) mCallback.onMetadataChanged(metadata);
+ });
+ }
+
+ @Override
+ public void onTrafficAnnouncement(boolean active) {
+ mHandler.post(() -> mCallback.onTrafficAnnouncement(active));
+ }
+
+ @Override
+ public void onEmergencyAnnouncement(boolean active) {
+ mHandler.post(() -> mCallback.onEmergencyAnnouncement(active));
+ }
+
+ @Override
+ public void onAntennaState(boolean connected) {
+ mHandler.post(() -> mCallback.onAntennaState(connected));
+ }
+
+ @Override
+ public void onBackgroundScanAvailabilityChange(boolean isAvailable) {
+ mHandler.post(() -> mCallback.onBackgroundScanAvailabilityChange(isAvailable));
+ }
+
+ @Override
+ public void onBackgroundScanComplete() {
+ mHandler.post(() -> mCallback.onBackgroundScanComplete());
+ }
+
+ @Override
+ public void onProgramListChanged() {
+ mHandler.post(() -> mCallback.onProgramListChanged());
}
}
diff --git a/core/java/android/hardware/usb/UsbDeviceConnection.java b/core/java/android/hardware/usb/UsbDeviceConnection.java
index 9b5d0d3..5b15c0d 100644
--- a/core/java/android/hardware/usb/UsbDeviceConnection.java
+++ b/core/java/android/hardware/usb/UsbDeviceConnection.java
@@ -18,6 +18,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.SuppressLint;
import android.annotation.SystemApi;
import android.content.Context;
import android.os.Build;
@@ -257,6 +258,7 @@
* @hide
*/
@SystemApi
+ @SuppressLint("Doclava125")
public boolean resetDevice() {
return native_reset_device();
}
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java
index f478071..48123fe 100644
--- a/core/java/android/net/ConnectivityManager.java
+++ b/core/java/android/net/ConnectivityManager.java
@@ -582,6 +582,8 @@
/** {@hide} */
public static final int MAX_NETWORK_TYPE = TYPE_VPN;
+ private static final int MIN_NETWORK_TYPE = TYPE_MOBILE;
+
/**
* If you want to set the default network preference,you can directly
* change the networkAttributes array in framework's config.xml.
@@ -599,7 +601,7 @@
/**
* @hide
*/
- public final static int REQUEST_ID_UNSET = 0;
+ public static final int REQUEST_ID_UNSET = 0;
/**
* Static unique request used as a tombstone for NetworkCallbacks that have been unregistered.
@@ -607,7 +609,7 @@
* registered and those that were already unregistered.
* @hide
*/
- private final static NetworkRequest ALREADY_UNREGISTERED =
+ private static final NetworkRequest ALREADY_UNREGISTERED =
new NetworkRequest.Builder().clearCapabilities().build();
/**
@@ -640,7 +642,7 @@
*/
@Deprecated
public static boolean isNetworkTypeValid(int networkType) {
- return networkType >= 0 && networkType <= MAX_NETWORK_TYPE;
+ return MIN_NETWORK_TYPE <= networkType && networkType <= MAX_NETWORK_TYPE;
}
/**
@@ -653,6 +655,8 @@
*/
public static String getNetworkTypeName(int type) {
switch (type) {
+ case TYPE_NONE:
+ return "NONE";
case TYPE_MOBILE:
return "MOBILE";
case TYPE_WIFI:
@@ -831,6 +835,29 @@
}
/**
+ * Checks if a VPN app supports always-on mode.
+ *
+ * In order to support the always-on feature, an app has to
+ * <ul>
+ * <li>target {@link VERSION_CODES#N API 24} or above, and
+ * <li>not opt out through the {@link VpnService#METADATA_SUPPORTS_ALWAYS_ON} meta-data
+ * field.
+ * </ul>
+ *
+ * @param userId The identifier of the user for whom the VPN app is installed.
+ * @param vpnPackage The canonical package name of the VPN app.
+ * @return {@code true} if and only if the VPN app exists and supports always-on mode.
+ * @hide
+ */
+ public boolean isAlwaysOnVpnPackageSupportedForUser(int userId, @Nullable String vpnPackage) {
+ try {
+ return mService.isAlwaysOnVpnPackageSupported(userId, vpnPackage);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Configures an always-on VPN connection through a specific application.
* This connection is automatically granted and persisted after a reboot.
*
@@ -1098,6 +1125,7 @@
* @hide
*/
@SystemApi
+ @RequiresPermission(android.Manifest.permission.LOCAL_MAC_ADDRESS)
public String getCaptivePortalServerUrl() {
try {
return mService.getCaptivePortalServerUrl();
@@ -1715,14 +1743,8 @@
// ignored
}
- /**
- * Return quota status for the current active network, or {@code null} if no
- * network is active. Quota status can change rapidly, so these values
- * shouldn't be cached.
- *
- * @hide
- */
- @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
+ /** {@hide} */
+ @Deprecated
public NetworkQuotaInfo getActiveNetworkQuotaInfo() {
try {
return mService.getActiveNetworkQuotaInfo();
@@ -2061,10 +2083,11 @@
* {@hide}
*/
@SystemApi
- @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
+ @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED)
public boolean isTetheringSupported() {
try {
- return mService.isTetheringSupported();
+ String pkgName = mContext.getOpPackageName();
+ return mService.isTetheringSupported(pkgName);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -2094,6 +2117,7 @@
* @hide
*/
@SystemApi
+ @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED)
public void startTethering(int type, boolean showProvisioningUi,
final OnStartTetheringCallback callback) {
startTethering(type, showProvisioningUi, callback, null);
diff --git a/core/java/android/net/IConnectivityManager.aidl b/core/java/android/net/IConnectivityManager.aidl
index 27729dc..a6fe738 100644
--- a/core/java/android/net/IConnectivityManager.aidl
+++ b/core/java/android/net/IConnectivityManager.aidl
@@ -75,7 +75,7 @@
int getLastTetherError(String iface);
- boolean isTetheringSupported();
+ boolean isTetheringSupported(String callerPkg);
void startTethering(int type, in ResultReceiver receiver, boolean showProvisioningUi,
String callerPkg);
@@ -123,6 +123,7 @@
VpnInfo[] getAllVpnInfo();
boolean updateLockdownVpn();
+ boolean isAlwaysOnVpnPackageSupported(int userId, String packageName);
boolean setAlwaysOnVpnPackage(int userId, String packageName, boolean lockdown);
String getAlwaysOnVpnPackage(int userId);
diff --git a/core/java/android/net/INetworkPolicyManager.aidl b/core/java/android/net/INetworkPolicyManager.aidl
index 63bbd96..181e4a2 100644
--- a/core/java/android/net/INetworkPolicyManager.aidl
+++ b/core/java/android/net/INetworkPolicyManager.aidl
@@ -21,6 +21,7 @@
import android.net.NetworkQuotaInfo;
import android.net.NetworkState;
import android.net.NetworkTemplate;
+import android.telephony.SubscriptionPlan;
/**
* Interface that creates and modifies network policy rules.
@@ -63,9 +64,12 @@
int getRestrictBackgroundByCaller();
void setDeviceIdleMode(boolean enabled);
+ void setWifiMeteredOverride(String networkId, int meteredOverride);
NetworkQuotaInfo getNetworkQuotaInfo(in NetworkState state);
- boolean isNetworkMetered(in NetworkState state);
+
+ SubscriptionPlan[] getSubscriptionPlans(int subId, String callingPackage);
+ void setSubscriptionPlans(int subId, in SubscriptionPlan[] plans, String callingPackage);
void factoryReset(String subscriber);
}
diff --git a/core/java/android/net/LinkAddress.java b/core/java/android/net/LinkAddress.java
index 6e74f14..62de991 100644
--- a/core/java/android/net/LinkAddress.java
+++ b/core/java/android/net/LinkAddress.java
@@ -16,6 +16,15 @@
package android.net;
+import static android.system.OsConstants.IFA_F_DADFAILED;
+import static android.system.OsConstants.IFA_F_DEPRECATED;
+import static android.system.OsConstants.IFA_F_OPTIMISTIC;
+import static android.system.OsConstants.IFA_F_TENTATIVE;
+import static android.system.OsConstants.RT_SCOPE_HOST;
+import static android.system.OsConstants.RT_SCOPE_LINK;
+import static android.system.OsConstants.RT_SCOPE_SITE;
+import static android.system.OsConstants.RT_SCOPE_UNIVERSE;
+
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Pair;
@@ -26,15 +35,6 @@
import java.net.InterfaceAddress;
import java.net.UnknownHostException;
-import static android.system.OsConstants.IFA_F_DADFAILED;
-import static android.system.OsConstants.IFA_F_DEPRECATED;
-import static android.system.OsConstants.IFA_F_OPTIMISTIC;
-import static android.system.OsConstants.IFA_F_TENTATIVE;
-import static android.system.OsConstants.RT_SCOPE_HOST;
-import static android.system.OsConstants.RT_SCOPE_LINK;
-import static android.system.OsConstants.RT_SCOPE_SITE;
-import static android.system.OsConstants.RT_SCOPE_UNIVERSE;
-
/**
* Identifies an IP address on a network link.
*
@@ -101,7 +101,7 @@
* Per RFC 4193 section 8, fc00::/7 identifies these addresses.
*/
private boolean isIPv6ULA() {
- if (address != null && address instanceof Inet6Address) {
+ if (address instanceof Inet6Address) {
byte[] bytes = address.getAddress();
return ((bytes[0] & (byte)0xfe) == (byte)0xfc);
}
diff --git a/core/java/android/net/NetworkCapabilities.java b/core/java/android/net/NetworkCapabilities.java
index 2dd7f75..305cf76 100644
--- a/core/java/android/net/NetworkCapabilities.java
+++ b/core/java/android/net/NetworkCapabilities.java
@@ -21,6 +21,7 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.BitUtils;
+import com.android.internal.util.Preconditions;
import java.util.Objects;
@@ -420,7 +421,6 @@
/**
* Indicates this network uses a LoWPAN transport.
- * @hide
*/
public static final int TRANSPORT_LOWPAN = 6;
@@ -429,6 +429,11 @@
/** @hide */
public static final int MAX_TRANSPORT = TRANSPORT_LOWPAN;
+ /** @hide */
+ public static boolean isValidTransport(int transportType) {
+ return (MIN_TRANSPORT <= transportType) && (transportType <= MAX_TRANSPORT);
+ }
+
private static final String[] TRANSPORT_NAMES = {
"CELLULAR",
"WIFI",
@@ -453,9 +458,7 @@
* @hide
*/
public NetworkCapabilities addTransportType(int transportType) {
- if (transportType < MIN_TRANSPORT || transportType > MAX_TRANSPORT) {
- throw new IllegalArgumentException("TransportType out of range");
- }
+ checkValidTransportType(transportType);
mTransportTypes |= 1 << transportType;
setNetworkSpecifier(mNetworkSpecifier); // used for exception checking
return this;
@@ -469,9 +472,7 @@
* @hide
*/
public NetworkCapabilities removeTransportType(int transportType) {
- if (transportType < MIN_TRANSPORT || transportType > MAX_TRANSPORT) {
- throw new IllegalArgumentException("TransportType out of range");
- }
+ checkValidTransportType(transportType);
mTransportTypes &= ~(1 << transportType);
setNetworkSpecifier(mNetworkSpecifier); // used for exception checking
return this;
@@ -495,10 +496,7 @@
* @return {@code true} if set on this instance.
*/
public boolean hasTransport(int transportType) {
- if (transportType < MIN_TRANSPORT || transportType > MAX_TRANSPORT) {
- return false;
- }
- return ((mTransportTypes & (1 << transportType)) != 0);
+ return isValidTransport(transportType) && ((mTransportTypes & (1 << transportType)) != 0);
}
private void combineTransportTypes(NetworkCapabilities nc) {
@@ -906,9 +904,14 @@
* @hide
*/
public static String transportNameOf(int transport) {
- if (transport < 0 || TRANSPORT_NAMES.length <= transport) {
+ if (!isValidTransport(transport)) {
return "UNKNOWN";
}
return TRANSPORT_NAMES[transport];
}
+
+ private static void checkValidTransportType(int transport) {
+ Preconditions.checkArgument(
+ isValidTransport(transport), "Invalid TransportType " + transport);
+ }
}
diff --git a/core/java/android/net/NetworkIdentity.java b/core/java/android/net/NetworkIdentity.java
index 0775bda..acd7b560 100644
--- a/core/java/android/net/NetworkIdentity.java
+++ b/core/java/android/net/NetworkIdentity.java
@@ -157,7 +157,7 @@
* Scrub given IMSI on production builds.
*/
public static String scrubSubscriberId(String subscriberId) {
- if ("eng".equals(Build.TYPE)) {
+ if (Build.IS_ENG) {
return subscriberId;
} else if (subscriberId != null) {
// TODO: parse this as MCC+MNC instead of hard-coding
diff --git a/core/java/android/net/NetworkInfo.java b/core/java/android/net/NetworkInfo.java
index 42f5feb..818aa21 100644
--- a/core/java/android/net/NetworkInfo.java
+++ b/core/java/android/net/NetworkInfo.java
@@ -16,8 +16,8 @@
package android.net;
-import android.os.Parcelable;
import android.os.Parcel;
+import android.os.Parcelable;
import com.android.internal.annotations.VisibleForTesting;
@@ -121,13 +121,13 @@
private boolean mIsFailover;
private boolean mIsAvailable;
private boolean mIsRoaming;
- private boolean mIsMetered;
/**
* @hide
*/
public NetworkInfo(int type, int subtype, String typeName, String subtypeName) {
- if (!ConnectivityManager.isNetworkTypeValid(type)) {
+ if (!ConnectivityManager.isNetworkTypeValid(type)
+ && type != ConnectivityManager.TYPE_NONE) {
throw new IllegalArgumentException("Invalid network type: " + type);
}
mNetworkType = type;
@@ -153,7 +153,6 @@
mIsFailover = source.mIsFailover;
mIsAvailable = source.mIsAvailable;
mIsRoaming = source.mIsRoaming;
- mIsMetered = source.mIsMetered;
}
}
}
@@ -326,31 +325,6 @@
}
/**
- * Returns if this network is metered. A network is classified as metered
- * when the user is sensitive to heavy data usage on that connection due to
- * monetary costs, data limitations or battery/performance issues. You
- * should check this before doing large data transfers, and warn the user or
- * delay the operation until another network is available.
- *
- * @return {@code true} if large transfers should be avoided, otherwise
- * {@code false}.
- * @hide
- */
- public boolean isMetered() {
- synchronized (this) {
- return mIsMetered;
- }
- }
-
- /** {@hide} */
- @VisibleForTesting
- public void setMetered(boolean isMetered) {
- synchronized (this) {
- mIsMetered = isMetered;
- }
- }
-
- /**
* Reports the current coarse-grained state of the network.
* @return the coarse-grained state
*/
@@ -433,7 +407,6 @@
append(", failover: ").append(mIsFailover).
append(", available: ").append(mIsAvailable).
append(", roaming: ").append(mIsRoaming).
- append(", metered: ").append(mIsMetered).
append("]");
return builder.toString();
}
@@ -456,7 +429,6 @@
dest.writeInt(mIsFailover ? 1 : 0);
dest.writeInt(mIsAvailable ? 1 : 0);
dest.writeInt(mIsRoaming ? 1 : 0);
- dest.writeInt(mIsMetered ? 1 : 0);
dest.writeString(mReason);
dest.writeString(mExtraInfo);
}
@@ -475,7 +447,6 @@
netInfo.mIsFailover = in.readInt() != 0;
netInfo.mIsAvailable = in.readInt() != 0;
netInfo.mIsRoaming = in.readInt() != 0;
- netInfo.mIsMetered = in.readInt() != 0;
netInfo.mReason = in.readString();
netInfo.mExtraInfo = in.readString();
return netInfo;
diff --git a/core/java/android/net/NetworkPolicy.java b/core/java/android/net/NetworkPolicy.java
index 9870e7b..5df742c 100644
--- a/core/java/android/net/NetworkPolicy.java
+++ b/core/java/android/net/NetworkPolicy.java
@@ -16,16 +16,21 @@
package android.net;
-import static com.android.internal.util.Preconditions.checkNotNull;
-
import android.os.Parcel;
import android.os.Parcelable;
import android.util.BackupUtils;
+import android.util.Pair;
+import android.util.RecurrenceRule;
+
+import com.android.internal.util.Preconditions;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.util.Iterator;
import java.util.Objects;
/**
@@ -35,10 +40,8 @@
* @hide
*/
public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> {
- /**
- * Current Version of the Backup Serializer.
- */
- private static final int BACKUP_VERSION = 1;
+ private static final int VERSION_INIT = 1;
+ private static final int VERSION_RULE = 2;
public static final int CYCLE_NONE = -1;
public static final long WARNING_DISABLED = -1;
@@ -46,17 +49,24 @@
public static final long SNOOZE_NEVER = -1;
public NetworkTemplate template;
- public int cycleDay;
- public String cycleTimezone;
- public long warningBytes;
- public long limitBytes;
- public long lastWarningSnooze;
- public long lastLimitSnooze;
- public boolean metered;
- public boolean inferred;
+ public RecurrenceRule cycleRule;
+ public long warningBytes = WARNING_DISABLED;
+ public long limitBytes = LIMIT_DISABLED;
+ public long lastWarningSnooze = SNOOZE_NEVER;
+ public long lastLimitSnooze = SNOOZE_NEVER;
+ @Deprecated public boolean metered = true;
+ public boolean inferred = false;
private static final long DEFAULT_MTU = 1500;
+ public static RecurrenceRule buildRule(int cycleDay, ZoneId cycleTimezone) {
+ if (cycleDay != NetworkPolicy.CYCLE_NONE) {
+ return RecurrenceRule.buildRecurringMonthly(cycleDay, cycleTimezone);
+ } else {
+ return RecurrenceRule.buildNever();
+ }
+ }
+
@Deprecated
public NetworkPolicy(NetworkTemplate template, int cycleDay, String cycleTimezone,
long warningBytes, long limitBytes, boolean metered) {
@@ -64,12 +74,19 @@
SNOOZE_NEVER, metered, false);
}
+ @Deprecated
public NetworkPolicy(NetworkTemplate template, int cycleDay, String cycleTimezone,
long warningBytes, long limitBytes, long lastWarningSnooze, long lastLimitSnooze,
boolean metered, boolean inferred) {
- this.template = checkNotNull(template, "missing NetworkTemplate");
- this.cycleDay = cycleDay;
- this.cycleTimezone = checkNotNull(cycleTimezone, "missing cycleTimezone");
+ this(template, buildRule(cycleDay, ZoneId.of(cycleTimezone)), warningBytes,
+ limitBytes, lastWarningSnooze, lastLimitSnooze, metered, inferred);
+ }
+
+ public NetworkPolicy(NetworkTemplate template, RecurrenceRule cycleRule, long warningBytes,
+ long limitBytes, long lastWarningSnooze, long lastLimitSnooze, boolean metered,
+ boolean inferred) {
+ this.template = Preconditions.checkNotNull(template, "missing NetworkTemplate");
+ this.cycleRule = Preconditions.checkNotNull(cycleRule, "missing RecurrenceRule");
this.warningBytes = warningBytes;
this.limitBytes = limitBytes;
this.lastWarningSnooze = lastWarningSnooze;
@@ -78,23 +95,21 @@
this.inferred = inferred;
}
- public NetworkPolicy(Parcel in) {
- template = in.readParcelable(null);
- cycleDay = in.readInt();
- cycleTimezone = in.readString();
- warningBytes = in.readLong();
- limitBytes = in.readLong();
- lastWarningSnooze = in.readLong();
- lastLimitSnooze = in.readLong();
- metered = in.readInt() != 0;
- inferred = in.readInt() != 0;
+ private NetworkPolicy(Parcel source) {
+ template = source.readParcelable(null);
+ cycleRule = source.readParcelable(null);
+ warningBytes = source.readLong();
+ limitBytes = source.readLong();
+ lastWarningSnooze = source.readLong();
+ lastLimitSnooze = source.readLong();
+ metered = source.readInt() != 0;
+ inferred = source.readInt() != 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeParcelable(template, flags);
- dest.writeInt(cycleDay);
- dest.writeString(cycleTimezone);
+ dest.writeParcelable(cycleRule, flags);
dest.writeLong(warningBytes);
dest.writeLong(limitBytes);
dest.writeLong(lastWarningSnooze);
@@ -108,6 +123,10 @@
return 0;
}
+ public Iterator<Pair<ZonedDateTime, ZonedDateTime>> cycleIterator() {
+ return cycleRule.cycleIterator();
+ }
+
/**
* Test if given measurement is over {@link #warningBytes}.
*/
@@ -138,7 +157,7 @@
* Test if this policy has a cycle defined, after which usage should reset.
*/
public boolean hasCycle() {
- return cycleDay != CYCLE_NONE;
+ return cycleRule.cycleIterator().hasNext();
}
@Override
@@ -156,7 +175,7 @@
@Override
public int hashCode() {
- return Objects.hash(template, cycleDay, cycleTimezone, warningBytes, limitBytes,
+ return Objects.hash(template, cycleRule, warningBytes, limitBytes,
lastWarningSnooze, lastLimitSnooze, metered, inferred);
}
@@ -164,30 +183,29 @@
public boolean equals(Object obj) {
if (obj instanceof NetworkPolicy) {
final NetworkPolicy other = (NetworkPolicy) obj;
- return cycleDay == other.cycleDay && warningBytes == other.warningBytes
+ return warningBytes == other.warningBytes
&& limitBytes == other.limitBytes
&& lastWarningSnooze == other.lastWarningSnooze
&& lastLimitSnooze == other.lastLimitSnooze && metered == other.metered
&& inferred == other.inferred
- && Objects.equals(cycleTimezone, other.cycleTimezone)
- && Objects.equals(template, other.template);
+ && Objects.equals(template, other.template)
+ && Objects.equals(cycleRule, other.cycleRule);
}
return false;
}
@Override
public String toString() {
- final StringBuilder builder = new StringBuilder("NetworkPolicy");
- builder.append("[").append(template).append("]:");
- builder.append(" cycleDay=").append(cycleDay);
- builder.append(", cycleTimezone=").append(cycleTimezone);
- builder.append(", warningBytes=").append(warningBytes);
- builder.append(", limitBytes=").append(limitBytes);
- builder.append(", lastWarningSnooze=").append(lastWarningSnooze);
- builder.append(", lastLimitSnooze=").append(lastLimitSnooze);
- builder.append(", metered=").append(metered);
- builder.append(", inferred=").append(inferred);
- return builder.toString();
+ return new StringBuilder("NetworkPolicy{")
+ .append("template=").append(template)
+ .append(" cycleRule=").append(cycleRule)
+ .append(" warningBytes=").append(warningBytes)
+ .append(" limitBytes=").append(limitBytes)
+ .append(" lastWarningSnooze=").append(lastWarningSnooze)
+ .append(" lastLimitSnooze=").append(lastLimitSnooze)
+ .append(" metered=").append(metered)
+ .append(" inferred=").append(inferred)
+ .append("}").toString();
}
public static final Creator<NetworkPolicy> CREATOR = new Creator<NetworkPolicy>() {
@@ -206,10 +224,9 @@
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream out = new DataOutputStream(baos);
- out.writeInt(BACKUP_VERSION);
+ out.writeInt(VERSION_RULE);
out.write(template.getBytesForBackup());
- out.writeInt(cycleDay);
- BackupUtils.writeString(out, cycleTimezone);
+ cycleRule.writeToStream(out);
out.writeLong(warningBytes);
out.writeLong(limitBytes);
out.writeLong(lastWarningSnooze);
@@ -221,21 +238,36 @@
public static NetworkPolicy getNetworkPolicyFromBackup(DataInputStream in) throws IOException,
BackupUtils.BadVersionException {
- int version = in.readInt();
- if (version < 1 || version > BACKUP_VERSION) {
- throw new BackupUtils.BadVersionException("Unknown Backup Serialization Version");
+ final int version = in.readInt();
+ switch (version) {
+ case VERSION_INIT: {
+ NetworkTemplate template = NetworkTemplate.getNetworkTemplateFromBackup(in);
+ int cycleDay = in.readInt();
+ String cycleTimeZone = BackupUtils.readString(in);
+ long warningBytes = in.readLong();
+ long limitBytes = in.readLong();
+ long lastWarningSnooze = in.readLong();
+ long lastLimitSnooze = in.readLong();
+ boolean metered = in.readInt() == 1;
+ boolean inferred = in.readInt() == 1;
+ return new NetworkPolicy(template, cycleDay, cycleTimeZone, warningBytes,
+ limitBytes, lastWarningSnooze, lastLimitSnooze, metered, inferred);
+ }
+ case VERSION_RULE: {
+ NetworkTemplate template = NetworkTemplate.getNetworkTemplateFromBackup(in);
+ RecurrenceRule cycleRule = new RecurrenceRule(in);
+ long warningBytes = in.readLong();
+ long limitBytes = in.readLong();
+ long lastWarningSnooze = in.readLong();
+ long lastLimitSnooze = in.readLong();
+ boolean metered = in.readInt() == 1;
+ boolean inferred = in.readInt() == 1;
+ return new NetworkPolicy(template, cycleRule, warningBytes,
+ limitBytes, lastWarningSnooze, lastLimitSnooze, metered, inferred);
+ }
+ default: {
+ throw new BackupUtils.BadVersionException("Unknown backup version: " + version);
+ }
}
-
- NetworkTemplate template = NetworkTemplate.getNetworkTemplateFromBackup(in);
- int cycleDay = in.readInt();
- String cycleTimeZone = BackupUtils.readString(in);
- long warningBytes = in.readLong();
- long limitBytes = in.readLong();
- long lastWarningSnooze = in.readLong();
- long lastLimitSnooze = in.readLong();
- boolean metered = in.readInt() == 1;
- boolean inferred = in.readInt() == 1;
- return new NetworkPolicy(template, cycleDay, cycleTimeZone, warningBytes, limitBytes,
- lastWarningSnooze, lastLimitSnooze, metered, inferred);
}
}
diff --git a/core/java/android/net/NetworkPolicyManager.java b/core/java/android/net/NetworkPolicyManager.java
index 4d94a55..81c49a3 100644
--- a/core/java/android/net/NetworkPolicyManager.java
+++ b/core/java/android/net/NetworkPolicyManager.java
@@ -17,7 +17,6 @@
package android.net;
import static android.content.pm.PackageManager.GET_SIGNATURES;
-import static android.net.NetworkPolicy.CYCLE_NONE;
import android.annotation.SystemService;
import android.app.ActivityManager;
@@ -26,15 +25,19 @@
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.Signature;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiInfo;
import android.os.RemoteException;
import android.os.UserHandle;
+import android.telephony.SubscriptionPlan;
import android.util.DebugUtils;
+import android.util.Pair;
import com.google.android.collect.Sets;
-import java.util.Calendar;
+import java.time.ZonedDateTime;
import java.util.HashSet;
-import java.util.TimeZone;
+import java.util.Iterator;
/**
* Manager for creating and modifying network policy rules.
@@ -249,73 +252,9 @@
}
}
- /**
- * Compute the last cycle boundary for the given {@link NetworkPolicy}. For
- * example, if cycle day is 20th, and today is June 15th, it will return May
- * 20th. When cycle day doesn't exist in current month, it snaps to the 1st
- * of following month.
- *
- * @hide
- */
- public static long computeLastCycleBoundary(long currentTime, NetworkPolicy policy) {
- if (policy.cycleDay == CYCLE_NONE) {
- throw new IllegalArgumentException("Unable to compute boundary without cycleDay");
- }
-
- final Calendar cal = Calendar.getInstance(TimeZone.getTimeZone(policy.cycleTimezone));
- cal.setTimeInMillis(currentTime);
- snapToCycleDay(cal, policy.cycleDay);
-
- if (cal.getTimeInMillis() >= currentTime) {
- // Cycle boundary is beyond now, use last cycle boundary
- cal.set(Calendar.DAY_OF_MONTH, 1);
- cal.add(Calendar.MONTH, -1);
- snapToCycleDay(cal, policy.cycleDay);
- }
-
- return cal.getTimeInMillis();
- }
-
/** {@hide} */
- public static long computeNextCycleBoundary(long currentTime, NetworkPolicy policy) {
- if (policy.cycleDay == CYCLE_NONE) {
- throw new IllegalArgumentException("Unable to compute boundary without cycleDay");
- }
-
- final Calendar cal = Calendar.getInstance(TimeZone.getTimeZone(policy.cycleTimezone));
- cal.setTimeInMillis(currentTime);
- snapToCycleDay(cal, policy.cycleDay);
-
- if (cal.getTimeInMillis() <= currentTime) {
- // Cycle boundary is before now, use next cycle boundary
- cal.set(Calendar.DAY_OF_MONTH, 1);
- cal.add(Calendar.MONTH, 1);
- snapToCycleDay(cal, policy.cycleDay);
- }
-
- return cal.getTimeInMillis();
- }
-
- /**
- * Snap to the cycle day for the current month given; when cycle day doesn't
- * exist, it snaps to last second of current month.
- *
- * @hide
- */
- public static void snapToCycleDay(Calendar cal, int cycleDay) {
- cal.set(Calendar.HOUR_OF_DAY, 0);
- cal.set(Calendar.MINUTE, 0);
- cal.set(Calendar.SECOND, 0);
- if (cycleDay > cal.getActualMaximum(Calendar.DAY_OF_MONTH)) {
- cal.add(Calendar.MONTH, 1);
- cal.set(Calendar.DAY_OF_MONTH, 1);
- cal.set(Calendar.HOUR_OF_DAY, 0);
- cal.set(Calendar.MINUTE, 0);
- cal.set(Calendar.SECOND, 0);
- cal.add(Calendar.SECOND, -1);
- } else {
- cal.set(Calendar.DAY_OF_MONTH, cycleDay);
- }
+ public static Iterator<Pair<ZonedDateTime, ZonedDateTime>> cycleIterator(NetworkPolicy policy) {
+ return policy.cycleIterator();
}
/**
@@ -400,4 +339,13 @@
public static boolean isProcStateAllowedWhileOnRestrictBackground(int procState) {
return procState <= ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE;
}
+
+ public static String resolveNetworkId(WifiConfiguration config) {
+ return WifiInfo.removeDoubleQuotes(config.isPasspoint()
+ ? config.providerFriendlyName : config.SSID);
+ }
+
+ public static String resolveNetworkId(String ssid) {
+ return WifiInfo.removeDoubleQuotes(ssid);
+ }
}
diff --git a/core/java/android/net/NetworkQuotaInfo.java b/core/java/android/net/NetworkQuotaInfo.java
index 1725ed7..b95f1d9 100644
--- a/core/java/android/net/NetworkQuotaInfo.java
+++ b/core/java/android/net/NetworkQuotaInfo.java
@@ -20,41 +20,32 @@
import android.os.Parcelable;
/**
- * Information about quota status on a specific network.
- *
+ * @deprecated nobody should be using this, but keep it around returning stub
+ * values to prevent app crashes.
* @hide
*/
+@Deprecated
public class NetworkQuotaInfo implements Parcelable {
- private final long mEstimatedBytes;
- private final long mSoftLimitBytes;
- private final long mHardLimitBytes;
-
public static final long NO_LIMIT = -1;
/** {@hide} */
- public NetworkQuotaInfo(long estimatedBytes, long softLimitBytes, long hardLimitBytes) {
- mEstimatedBytes = estimatedBytes;
- mSoftLimitBytes = softLimitBytes;
- mHardLimitBytes = hardLimitBytes;
+ public NetworkQuotaInfo() {
}
/** {@hide} */
public NetworkQuotaInfo(Parcel in) {
- mEstimatedBytes = in.readLong();
- mSoftLimitBytes = in.readLong();
- mHardLimitBytes = in.readLong();
}
public long getEstimatedBytes() {
- return mEstimatedBytes;
+ return 0;
}
public long getSoftLimitBytes() {
- return mSoftLimitBytes;
+ return NO_LIMIT;
}
public long getHardLimitBytes() {
- return mHardLimitBytes;
+ return NO_LIMIT;
}
@Override
@@ -64,9 +55,6 @@
@Override
public void writeToParcel(Parcel out, int flags) {
- out.writeLong(mEstimatedBytes);
- out.writeLong(mSoftLimitBytes);
- out.writeLong(mHardLimitBytes);
}
public static final Creator<NetworkQuotaInfo> CREATOR = new Creator<NetworkQuotaInfo>() {
diff --git a/core/java/android/net/OWNERS b/core/java/android/net/OWNERS
new file mode 100644
index 0000000..0f1e259
--- /dev/null
+++ b/core/java/android/net/OWNERS
@@ -0,0 +1,6 @@
+ek@google.com
+hugobenichi@google.com
+jsharkey@google.com
+lorenzo@google.com
+satk@google.com
+silberst@google.com
diff --git a/core/java/android/net/SSLCertificateSocketFactory.java b/core/java/android/net/SSLCertificateSocketFactory.java
index b56437e..0b1569c 100644
--- a/core/java/android/net/SSLCertificateSocketFactory.java
+++ b/core/java/android/net/SSLCertificateSocketFactory.java
@@ -20,6 +20,7 @@
import android.util.Log;
import com.android.internal.os.RoSystemProperties;
+import com.android.org.conscrypt.Conscrypt;
import com.android.org.conscrypt.OpenSSLContextImpl;
import com.android.org.conscrypt.OpenSSLSocketImpl;
import com.android.org.conscrypt.SSLClientSessionCache;
@@ -212,7 +213,7 @@
private SSLSocketFactory makeSocketFactory(
KeyManager[] keyManagers, TrustManager[] trustManagers) {
try {
- OpenSSLContextImpl sslContext = OpenSSLContextImpl.getPreferred();
+ OpenSSLContextImpl sslContext = (OpenSSLContextImpl) Conscrypt.newPreferredSSLContextSpi();
sslContext.engineInit(keyManagers, trustManagers, null);
sslContext.engineGetClientSessionContext().setPersistentCache(mSessionCache);
return sslContext.engineGetSocketFactory();
diff --git a/core/java/android/net/TrafficStats.java b/core/java/android/net/TrafficStats.java
index f934616..1985707 100644
--- a/core/java/android/net/TrafficStats.java
+++ b/core/java/android/net/TrafficStats.java
@@ -109,25 +109,26 @@
*/
public static final int TAG_SYSTEM_RESTORE = 0xFFFFFF04;
- /** @hide */
- public static final int TAG_SYSTEM_DHCP = 0xFFFFFF05;
- /** @hide */
- public static final int TAG_SYSTEM_NTP = 0xFFFFFF06;
- /** @hide */
- public static final int TAG_SYSTEM_PROBE = 0xFFFFFF07;
- /** @hide */
- public static final int TAG_SYSTEM_NEIGHBOR = 0xFFFFFF08;
- /** @hide */
- public static final int TAG_SYSTEM_GPS = 0xFFFFFF09;
- /** @hide */
- public static final int TAG_SYSTEM_PAC = 0xFFFFFF0A;
-
/**
- * Sockets that are strictly local on device; never hits network.
+ * Default tag value for code or resources downloaded by an app store on
+ * behalf of the app, such as app updates.
*
* @hide
*/
- public static final int TAG_SYSTEM_LOCAL = 0xFFFFFFAA;
+ public static final int TAG_SYSTEM_CODE = 0xFFFFFF05;
+
+ /** @hide */
+ public static final int TAG_SYSTEM_DHCP = 0xFFFFFF40;
+ /** @hide */
+ public static final int TAG_SYSTEM_NTP = 0xFFFFFF41;
+ /** @hide */
+ public static final int TAG_SYSTEM_PROBE = 0xFFFFFF42;
+ /** @hide */
+ public static final int TAG_SYSTEM_NEIGHBOR = 0xFFFFFF43;
+ /** @hide */
+ public static final int TAG_SYSTEM_GPS = 0xFFFFFF44;
+ /** @hide */
+ public static final int TAG_SYSTEM_PAC = 0xFFFFFF45;
private static INetworkStatsService sStatsService;
@@ -210,6 +211,19 @@
}
/**
+ * Set active tag to use when accounting {@link Socket} traffic originating
+ * from the current thread. The tag used internally is well-defined to
+ * distinguish all code-related traffic, such as updates performed by an app
+ * store.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static void setThreadStatsTagCode() {
+ setThreadStatsTag(TAG_SYSTEM_CODE);
+ }
+
+ /**
* Get the active tag used when accounting {@link Socket} traffic originating
* from the current thread. Only one active tag per thread is supported.
* {@link #tagSocket(Socket)}.
diff --git a/core/java/android/net/VpnService.java b/core/java/android/net/VpnService.java
index 4b79cbb..7fb0c47 100644
--- a/core/java/android/net/VpnService.java
+++ b/core/java/android/net/VpnService.java
@@ -28,8 +28,6 @@
import android.content.Intent;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
-import android.net.Network;
-import android.net.NetworkUtils;
import android.os.Binder;
import android.os.IBinder;
import android.os.Parcel;
@@ -131,6 +129,35 @@
public static final String SERVICE_INTERFACE = VpnConfig.SERVICE_INTERFACE;
/**
+ * Key for boolean meta-data field indicating whether this VpnService supports always-on mode.
+ *
+ * <p>For a VPN app targeting {@link android.os.Build.VERSION_CODES#N API 24} or above, Android
+ * provides users with the ability to set it as always-on, so that VPN connection is
+ * persisted after device reboot and app upgrade. Always-on VPN can also be enabled by device
+ * owner and profile owner apps through
+ * {@link android.app.admin.DevicePolicyManager#setAlwaysOnVpnPackage}.
+ *
+ * <p>VPN apps not supporting this feature should opt out by adding this meta-data field to the
+ * {@code VpnService} component of {@code AndroidManifest.xml}. In case there is more than one
+ * {@code VpnService} component defined in {@code AndroidManifest.xml}, opting out any one of
+ * them will opt out the entire app. For example,
+ * <pre> {@code
+ * <service android:name=".ExampleVpnService"
+ * android:permission="android.permission.BIND_VPN_SERVICE">
+ * <intent-filter>
+ * <action android:name="android.net.VpnService"/>
+ * </intent-filter>
+ * <meta-data android:name="android.net.VpnService.SUPPORTS_ALWAYS_ON"
+ * android:value=false/>
+ * </service>
+ * } </pre>
+ *
+ * <p>This meta-data field defaults to {@code true} if absent.
+ */
+ public static final String METADATA_SUPPORTS_ALWAYS_ON =
+ "android.net.VpnService.SUPPORTS_ALWAYS_ON";
+
+ /**
* Use IConnectivityManager since those methods are hidden and not
* available in ConnectivityManager.
*/
diff --git a/core/java/android/net/metrics/IpManagerEvent.java b/core/java/android/net/metrics/IpManagerEvent.java
index f5aea73..a94b928 100644
--- a/core/java/android/net/metrics/IpManagerEvent.java
+++ b/core/java/android/net/metrics/IpManagerEvent.java
@@ -39,10 +39,12 @@
public static final int ERROR_STARTING_IPV4 = 4;
public static final int ERROR_STARTING_IPV6 = 5;
public static final int ERROR_STARTING_IPREACHABILITYMONITOR = 6;
+ public static final int ERROR_INVALID_PROVISIONING = 7;
@IntDef(value = {
PROVISIONING_OK, PROVISIONING_FAIL, COMPLETE_LIFECYCLE,
ERROR_STARTING_IPV4, ERROR_STARTING_IPV6, ERROR_STARTING_IPREACHABILITYMONITOR,
+ ERROR_INVALID_PROVISIONING,
})
@Retention(RetentionPolicy.SOURCE)
public @interface EventType {}
diff --git a/core/java/android/os/BaseBundle.java b/core/java/android/os/BaseBundle.java
index 8d85880..a5763ef 100644
--- a/core/java/android/os/BaseBundle.java
+++ b/core/java/android/os/BaseBundle.java
@@ -21,6 +21,9 @@
import android.util.Log;
import android.util.MathUtils;
import android.util.Slog;
+import android.util.SparseArray;
+
+import com.android.internal.util.IndentingPrintWriter;
import java.io.Serializable;
import java.util.ArrayList;
@@ -1555,4 +1558,49 @@
mParcelledData = p;
}
+
+ /** {@hide} */
+ public static void dumpStats(IndentingPrintWriter pw, String key, Object value) {
+ final Parcel tmp = Parcel.obtain();
+ tmp.writeValue(value);
+ final int size = tmp.dataPosition();
+ tmp.recycle();
+
+ // We only really care about logging large values
+ if (size > 1024) {
+ pw.println(key + " [size=" + size + "]");
+ if (value instanceof BaseBundle) {
+ dumpStats(pw, (BaseBundle) value);
+ } else if (value instanceof SparseArray) {
+ dumpStats(pw, (SparseArray) value);
+ }
+ }
+ }
+
+ /** {@hide} */
+ public static void dumpStats(IndentingPrintWriter pw, SparseArray array) {
+ pw.increaseIndent();
+ if (array == null) {
+ pw.println("[null]");
+ return;
+ }
+ for (int i = 0; i < array.size(); i++) {
+ dumpStats(pw, "0x" + Integer.toHexString(array.keyAt(i)), array.valueAt(i));
+ }
+ pw.decreaseIndent();
+ }
+
+ /** {@hide} */
+ public static void dumpStats(IndentingPrintWriter pw, BaseBundle bundle) {
+ pw.increaseIndent();
+ if (bundle == null) {
+ pw.println("[null]");
+ return;
+ }
+ final ArrayMap<String, Object> map = bundle.getMap();
+ for (int i = 0; i < map.size(); i++) {
+ dumpStats(pw, map.keyAt(i), map.valueAt(i));
+ }
+ pw.decreaseIndent();
+ }
}
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index 4160ed7..54d5860 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -16,15 +16,7 @@
package android.os;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Formatter;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
+import android.app.job.JobParameters;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.telephony.SignalStrength;
@@ -42,6 +34,15 @@
import com.android.internal.os.BatterySipper;
import com.android.internal.os.BatteryStatsHelper;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Formatter;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
/**
* A class providing access to battery usage statistics, including information on
* wakelocks, processes, packages, and services. All times are represented in microseconds
@@ -167,6 +168,11 @@
public static final int BLUETOOTH_UNOPTIMIZED_SCAN_ON = 21;
/**
+ * A constant indicating a foreground service timer
+ */
+ public static final int FOREGROUND_SERVICE = 22;
+
+ /**
* Include all of the data in the stats, including previously saved data.
*/
public static final int STATS_SINCE_CHARGED = 0;
@@ -222,7 +228,11 @@
private static final String CPU_TIMES_AT_FREQ_DATA = "ctf";
private static final String SENSOR_DATA = "sr";
private static final String VIBRATOR_DATA = "vib";
- private static final String FOREGROUND_DATA = "fg";
+ private static final String FOREGROUND_ACTIVITY_DATA = "fg";
+ // fgs line is:
+ // BATTERY_STATS_CHECKIN_VERSION, uid, category, "fgs",
+ // foreground service time, count
+ private static final String FOREGROUND_SERVICE_DATA = "fgs";
private static final String STATE_TIME_DATA = "st";
// wl line is:
// BATTERY_STATS_CHECKIN_VERSION, uid, which, "wl", name,
@@ -238,6 +248,7 @@
private static final String AGGREGATED_WAKELOCK_DATA = "awl";
private static final String SYNC_DATA = "sy";
private static final String JOB_DATA = "jb";
+ private static final String JOB_COMPLETION_DATA = "jbc";
private static final String KERNEL_WAKELOCK_DATA = "kwl";
private static final String WAKEUP_REASON_DATA = "wr";
private static final String NETWORK_DATA = "nt";
@@ -498,6 +509,13 @@
public abstract ArrayMap<String, ? extends Timer> getJobStats();
/**
+ * Returns statistics about how jobs have completed.
+ *
+ * @return A Map of String job names to completion type -> count mapping.
+ */
+ public abstract ArrayMap<String, SparseIntArray> getJobCompletionStats();
+
+ /**
* The statistics associated with a particular wake lock.
*/
public static abstract class Wakelock {
@@ -573,6 +591,11 @@
public abstract Timer getFlashlightTurnedOnTimer();
public abstract Timer getCameraTurnedOnTimer();
public abstract Timer getForegroundActivityTimer();
+
+ /**
+ * Returns the timer keeping track of Foreground Service time
+ */
+ public abstract Timer getForegroundServiceTimer();
public abstract Timer getBluetoothScanTimer();
public abstract Timer getBluetoothScanBackgroundTimer();
public abstract Timer getBluetoothUnoptimizedScanTimer();
@@ -3557,6 +3580,20 @@
}
}
+ final ArrayMap<String, SparseIntArray> completions = u.getJobCompletionStats();
+ for (int ic=completions.size()-1; ic>=0; ic--) {
+ SparseIntArray types = completions.valueAt(ic);
+ if (types != null) {
+ dumpLine(pw, uid, category, JOB_COMPLETION_DATA,
+ "\"" + completions.keyAt(ic) + "\"",
+ types.get(JobParameters.REASON_CANCELED, 0),
+ types.get(JobParameters.REASON_CONSTRAINTS_NOT_SATISFIED, 0),
+ types.get(JobParameters.REASON_PREEMPT, 0),
+ types.get(JobParameters.REASON_TIMEOUT, 0),
+ types.get(JobParameters.REASON_DEVICE_IDLE, 0));
+ }
+ }
+
dumpTimer(pw, uid, category, FLASHLIGHT_DATA, u.getFlashlightTurnedOnTimer(),
rawRealtime, which);
dumpTimer(pw, uid, category, CAMERA_DATA, u.getCameraTurnedOnTimer(),
@@ -3593,7 +3630,10 @@
dumpTimer(pw, uid, category, VIBRATOR_DATA, u.getVibratorOnTimer(),
rawRealtime, which);
- dumpTimer(pw, uid, category, FOREGROUND_DATA, u.getForegroundActivityTimer(),
+ dumpTimer(pw, uid, category, FOREGROUND_ACTIVITY_DATA, u.getForegroundActivityTimer(),
+ rawRealtime, which);
+
+ dumpTimer(pw, uid, category, FOREGROUND_SERVICE_DATA, u.getForegroundServiceTimer(),
rawRealtime, which);
final Object[] stateTimes = new Object[Uid.NUM_PROCESS_STATE];
@@ -4979,6 +5019,25 @@
uidActivity = true;
}
+ final ArrayMap<String, SparseIntArray> completions = u.getJobCompletionStats();
+ for (int ic=completions.size()-1; ic>=0; ic--) {
+ SparseIntArray types = completions.valueAt(ic);
+ if (types != null) {
+ pw.print(prefix);
+ pw.print(" Job Completions ");
+ pw.print(completions.keyAt(ic));
+ pw.print(":");
+ for (int it=0; it<types.size(); it++) {
+ pw.print(" ");
+ pw.print(JobParameters.getReasonName(types.keyAt(it)));
+ pw.print("(");
+ pw.print(types.valueAt(it));
+ pw.print("x)");
+ }
+ pw.println();
+ }
+ }
+
uidActivity |= printTimer(pw, sb, u.getFlashlightTurnedOnTimer(), rawRealtime, which,
prefix, "Flashlight");
uidActivity |= printTimer(pw, sb, u.getCameraTurnedOnTimer(), rawRealtime, which,
@@ -5051,6 +5110,8 @@
"Vibrator");
uidActivity |= printTimer(pw, sb, u.getForegroundActivityTimer(), rawRealtime, which,
prefix, "Foreground activities");
+ uidActivity |= printTimer(pw, sb, u.getForegroundServiceTimer(), rawRealtime, which,
+ prefix, "Foreground services");
long totalStateTime = 0;
for (int ips=0; ips<Uid.NUM_PROCESS_STATE; ips++) {
@@ -5160,9 +5221,7 @@
Uid.Proc.ExcessivePower ew = ps.getExcessivePower(e);
if (ew != null) {
pw.print(prefix); pw.print(" * Killed for ");
- if (ew.type == Uid.Proc.ExcessivePower.TYPE_WAKE) {
- pw.print("wake lock");
- } else if (ew.type == Uid.Proc.ExcessivePower.TYPE_CPU) {
+ if (ew.type == Uid.Proc.ExcessivePower.TYPE_CPU) {
pw.print("cpu");
} else {
pw.print("unknown");
diff --git a/core/java/android/os/Binder.java b/core/java/android/os/Binder.java
index ff0bc69..5331304 100644
--- a/core/java/android/os/Binder.java
+++ b/core/java/android/os/Binder.java
@@ -623,7 +623,7 @@
protected void finalize() throws Throwable {
try {
- destroy();
+ destroyBinder();
} finally {
super.finalize();
}
@@ -653,7 +653,7 @@
}
private native final void init();
- private native final void destroy();
+ private native final void destroyBinder();
// Entry point from android_util_Binder.cpp's onTransact
private boolean execTransact(int code, long dataObj, long replyObj,
@@ -687,13 +687,6 @@
reply.writeException(e);
}
res = true;
- } catch (OutOfMemoryError e) {
- // Unconditionally log this, since this is generally unrecoverable.
- Log.e(TAG, "Caught an OutOfMemoryError from the binder stub implementation.", e);
- RuntimeException re = new RuntimeException("Out of memory", e);
- reply.setDataPosition(0);
- reply.writeException(re);
- res = true;
} finally {
if (tracingEnabled) {
Trace.traceEnd(Trace.TRACE_TAG_ALWAYS);
diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java
index a2fb9db..0541a53 100644
--- a/core/java/android/os/Build.java
+++ b/core/java/android/os/Build.java
@@ -759,6 +759,11 @@
* O.
*/
public static final int O = 26;
+
+ /**
+ * O MR1.
+ */
+ public static final int O_MR1 = CUR_DEVELOPMENT; // STOPSHIP Replace with the real version.
}
/** The type of build, like "user" or "eng". */
diff --git a/core/java/android/os/Bundle.java b/core/java/android/os/Bundle.java
index ec01364..51f96ee 100644
--- a/core/java/android/os/Bundle.java
+++ b/core/java/android/os/Bundle.java
@@ -38,9 +38,18 @@
public static final Bundle EMPTY;
+ /**
+ * Special extras used to denote extras have been stripped off.
+ * @hide
+ */
+ public static final Bundle STRIPPED;
+
static {
EMPTY = new Bundle();
EMPTY.mMap = ArrayMap.EMPTY;
+
+ STRIPPED = new Bundle();
+ STRIPPED.putInt("STRIPPED", 1);
}
/**
diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java
index f243f37..b46c6b1 100644
--- a/core/java/android/os/Debug.java
+++ b/core/java/android/os/Debug.java
@@ -223,28 +223,69 @@
/** @hide */
public static final int OTHER_OTHER_MEMTRACK = 16;
+ // Needs to be declared here for the DVK_STAT ranges below.
+ /** @hide */
+ public static final int NUM_OTHER_STATS = 17;
+
+ // Dalvik subsections.
/** @hide */
public static final int OTHER_DALVIK_NORMAL = 17;
/** @hide */
public static final int OTHER_DALVIK_LARGE = 18;
/** @hide */
- public static final int OTHER_DALVIK_LINEARALLOC = 19;
+ public static final int OTHER_DALVIK_ZYGOTE = 19;
/** @hide */
- public static final int OTHER_DALVIK_ACCOUNTING = 20;
+ public static final int OTHER_DALVIK_NON_MOVING = 20;
+ // Section begins and ends for dumpsys, relative to the DALVIK categories.
/** @hide */
- public static final int OTHER_DALVIK_CODE_CACHE = 21;
+ public static final int OTHER_DVK_STAT_DALVIK_START =
+ OTHER_DALVIK_NORMAL - NUM_OTHER_STATS;
/** @hide */
- public static final int OTHER_DALVIK_ZYGOTE = 22;
+ public static final int OTHER_DVK_STAT_DALVIK_END =
+ OTHER_DALVIK_NON_MOVING - NUM_OTHER_STATS;
+
+ // Dalvik Other subsections.
/** @hide */
- public static final int OTHER_DALVIK_NON_MOVING = 23;
+ public static final int OTHER_DALVIK_OTHER_LINEARALLOC = 21;
/** @hide */
- public static final int OTHER_DALVIK_INDIRECT_REFERENCE_TABLE = 24;
+ public static final int OTHER_DALVIK_OTHER_ACCOUNTING = 22;
+ /** @hide */
+ public static final int OTHER_DALVIK_OTHER_CODE_CACHE = 23;
+ /** @hide */
+ public static final int OTHER_DALVIK_OTHER_COMPILER_METADATA = 24;
+ /** @hide */
+ public static final int OTHER_DALVIK_OTHER_INDIRECT_REFERENCE_TABLE = 25;
+ /** @hide */
+ public static final int OTHER_DVK_STAT_DALVIK_OTHER_START =
+ OTHER_DALVIK_OTHER_LINEARALLOC - NUM_OTHER_STATS;
+ /** @hide */
+ public static final int OTHER_DVK_STAT_DALVIK_OTHER_END =
+ OTHER_DALVIK_OTHER_INDIRECT_REFERENCE_TABLE - NUM_OTHER_STATS;
+
+ // Dex subsections (Boot vdex, App dex, and App vdex).
+ /** @hide */
+ public static final int OTHER_DEX_BOOT_VDEX = 26;
+ /** @hide */
+ public static final int OTHER_DEX_APP_DEX = 27;
+ /** @hide */
+ public static final int OTHER_DEX_APP_VDEX = 28;
+ /** @hide */
+ public static final int OTHER_DVK_STAT_DEX_START = OTHER_DEX_BOOT_VDEX - NUM_OTHER_STATS;
+ /** @hide */
+ public static final int OTHER_DVK_STAT_DEX_END = OTHER_DEX_APP_VDEX - NUM_OTHER_STATS;
+
+ // Art subsections (App image, boot image).
+ /** @hide */
+ public static final int OTHER_ART_APP = 29;
+ /** @hide */
+ public static final int OTHER_ART_BOOT = 30;
+ /** @hide */
+ public static final int OTHER_DVK_STAT_ART_START = OTHER_ART_APP - NUM_OTHER_STATS;
+ /** @hide */
+ public static final int OTHER_DVK_STAT_ART_END = OTHER_ART_BOOT - NUM_OTHER_STATS;
/** @hide */
- public static final int NUM_OTHER_STATS = 17;
-
- /** @hide */
- public static final int NUM_DVK_STATS = 8;
+ public static final int NUM_DVK_STATS = 14;
/** @hide */
public static final int NUM_CATEGORIES = 8;
@@ -408,12 +449,18 @@
case OTHER_OTHER_MEMTRACK: return "Other mtrack";
case OTHER_DALVIK_NORMAL: return ".Heap";
case OTHER_DALVIK_LARGE: return ".LOS";
- case OTHER_DALVIK_LINEARALLOC: return ".LinearAlloc";
- case OTHER_DALVIK_ACCOUNTING: return ".GC";
- case OTHER_DALVIK_CODE_CACHE: return ".JITCache";
case OTHER_DALVIK_ZYGOTE: return ".Zygote";
case OTHER_DALVIK_NON_MOVING: return ".NonMoving";
- case OTHER_DALVIK_INDIRECT_REFERENCE_TABLE: return ".IndirectRef";
+ case OTHER_DALVIK_OTHER_LINEARALLOC: return ".LinearAlloc";
+ case OTHER_DALVIK_OTHER_ACCOUNTING: return ".GC";
+ case OTHER_DALVIK_OTHER_CODE_CACHE: return ".JITCache";
+ case OTHER_DALVIK_OTHER_COMPILER_METADATA: return ".CompilerMetadata";
+ case OTHER_DALVIK_OTHER_INDIRECT_REFERENCE_TABLE: return ".IndirectRef";
+ case OTHER_DEX_BOOT_VDEX: return ".Boot vdex";
+ case OTHER_DEX_APP_DEX: return ".App dex";
+ case OTHER_DEX_APP_VDEX: return ".App vdex";
+ case OTHER_ART_APP: return ".App art";
+ case OTHER_ART_BOOT: return ".Boot art";
default: return "????";
}
}
@@ -1814,6 +1861,13 @@
public static native void dumpNativeHeap(FileDescriptor fd);
/**
+ * Writes malloc info data to the specified file descriptor.
+ *
+ * @hide
+ */
+ public static native void dumpNativeMallocInfo(FileDescriptor fd);
+
+ /**
* Returns a count of the extant instances of a class.
*
* @hide
diff --git a/core/java/android/os/Handler.java b/core/java/android/os/Handler.java
index b69a23a..3ca1005 100644
--- a/core/java/android/os/Handler.java
+++ b/core/java/android/os/Handler.java
@@ -76,11 +76,12 @@
/**
* Callback interface you can use when instantiating a Handler to avoid
* having to implement your own subclass of Handler.
- *
- * @param msg A {@link android.os.Message Message} object
- * @return True if no further handling is desired
*/
public interface Callback {
+ /**
+ * @param msg A {@link android.os.Message Message} object
+ * @return True if no further handling is desired
+ */
public boolean handleMessage(Message msg);
}
diff --git a/core/java/android/os/HwBinder.java b/core/java/android/os/HwBinder.java
index b09c51c..866e20c 100644
--- a/core/java/android/os/HwBinder.java
+++ b/core/java/android/os/HwBinder.java
@@ -51,6 +51,11 @@
String serviceName)
throws RemoteException, NoSuchElementException;
+ public static native final void configureRpcThreadpool(
+ long maxThreads, boolean callerWillJoin);
+
+ public static native final void joinRpcThreadpool();
+
// Returns address of the "freeFunction".
private static native final long native_init();
diff --git a/core/java/android/os/IPowerManager.aidl b/core/java/android/os/IPowerManager.aidl
index 037cccf..75f7c1f 100644
--- a/core/java/android/os/IPowerManager.aidl
+++ b/core/java/android/os/IPowerManager.aidl
@@ -59,6 +59,8 @@
void setStayOnSetting(int val);
void boostScreenBrightness(long time);
+
+ // --- deprecated ---
boolean isScreenBrightnessBoosted();
// temporarily overrides the screen brightness settings to allow the user to
diff --git a/core/java/android/os/MemoryFile.java b/core/java/android/os/MemoryFile.java
index 6cec55a..9294c44 100644
--- a/core/java/android/os/MemoryFile.java
+++ b/core/java/android/os/MemoryFile.java
@@ -16,68 +16,50 @@
package android.os;
-import android.util.Log;
+import android.system.ErrnoException;
import java.io.FileDescriptor;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.nio.ByteBuffer;
/**
- * MemoryFile is a wrapper for the Linux ashmem driver.
- * MemoryFiles are backed by shared memory, which can be optionally
- * set to be purgeable.
+ * MemoryFile is a wrapper for {@link SharedMemory} which can optionally be set to purgeable.
+ *
+ * Applications should generally prefer to use {@link SharedMemory} which offers more flexible
+ * access & control over the shared memory region than MemoryFile does.
+ *
* Purgeable files may have their contents reclaimed by the kernel
* in low memory conditions (only if allowPurging is set to true).
* After a file is purged, attempts to read or write the file will
* cause an IOException to be thrown.
*/
-public class MemoryFile
-{
+public class MemoryFile {
private static String TAG = "MemoryFile";
- // mmap(2) protection flags from <sys/mman.h>
- private static final int PROT_READ = 0x1;
- private static final int PROT_WRITE = 0x2;
-
- private static native FileDescriptor native_open(String name, int length) throws IOException;
- // returns memory address for ashmem region
- private static native long native_mmap(FileDescriptor fd, int length, int mode)
- throws IOException;
- private static native void native_munmap(long addr, int length) throws IOException;
- private static native void native_close(FileDescriptor fd);
- private static native int native_read(FileDescriptor fd, long address, byte[] buffer,
- int srcOffset, int destOffset, int count, boolean isUnpinned) throws IOException;
- private static native void native_write(FileDescriptor fd, long address, byte[] buffer,
- int srcOffset, int destOffset, int count, boolean isUnpinned) throws IOException;
- private static native void native_pin(FileDescriptor fd, boolean pin) throws IOException;
+ // Returns 'true' if purged, 'false' otherwise
+ private static native boolean native_pin(FileDescriptor fd, boolean pin) throws IOException;
private static native int native_get_size(FileDescriptor fd) throws IOException;
- private FileDescriptor mFD; // ashmem file descriptor
- private long mAddress; // address of ashmem memory
- private int mLength; // total length of our ashmem region
+ private SharedMemory mSharedMemory;
+ private ByteBuffer mMapping;
private boolean mAllowPurging = false; // true if our ashmem region is unpinned
/**
* Allocates a new ashmem region. The region is initially not purgable.
*
* @param name optional name for the file (can be null).
- * @param length of the memory file in bytes, must be non-negative.
+ * @param length of the memory file in bytes, must be positive.
* @throws IOException if the memory file could not be created.
*/
public MemoryFile(String name, int length) throws IOException {
- mLength = length;
- if (length >= 0) {
- mFD = native_open(name, length);
- } else {
- throw new IOException("Invalid length: " + length);
- }
-
- if (length > 0) {
- mAddress = native_mmap(mFD, length, PROT_READ | PROT_WRITE);
- } else {
- mAddress = 0;
+ try {
+ mSharedMemory = SharedMemory.create(name, length);
+ mMapping = mSharedMemory.mapReadWrite();
+ } catch (ErrnoException ex) {
+ ex.rethrowAsIOException();
}
}
@@ -87,9 +69,7 @@
*/
public void close() {
deactivate();
- if (!isClosed()) {
- native_close(mFD);
- }
+ mSharedMemory.close();
}
/**
@@ -100,35 +80,30 @@
* @hide
*/
void deactivate() {
- if (!isDeactivated()) {
- try {
- native_munmap(mAddress, mLength);
- mAddress = 0;
- } catch (IOException ex) {
- Log.e(TAG, ex.toString());
+ if (mMapping != null) {
+ SharedMemory.unmap(mMapping);
+ mMapping = null;
+ }
+ }
+
+ private void checkActive() throws IOException {
+ if (mMapping == null) {
+ throw new IOException("MemoryFile has been deactivated");
+ }
+ }
+
+ private void beginAccess() throws IOException {
+ checkActive();
+ if (mAllowPurging) {
+ if (native_pin(mSharedMemory.getFileDescriptor(), true)) {
+ throw new IOException("MemoryFile has been purged");
}
}
}
- /**
- * Checks whether the memory file has been deactivated.
- */
- private boolean isDeactivated() {
- return mAddress == 0;
- }
-
- /**
- * Checks whether the memory file has been closed.
- */
- private boolean isClosed() {
- return !mFD.valid();
- }
-
- @Override
- protected void finalize() {
- if (!isClosed()) {
- Log.e(TAG, "MemoryFile.finalize() called while ashmem still open");
- close();
+ private void endAccess() throws IOException {
+ if (mAllowPurging) {
+ native_pin(mSharedMemory.getFileDescriptor(), false);
}
}
@@ -138,14 +113,19 @@
* @return file length.
*/
public int length() {
- return mLength;
+ return mSharedMemory.getSize();
}
/**
* Is memory file purging enabled?
*
* @return true if the file may be purged.
+ *
+ * @deprecated Purgable is considered generally fragile and hard to use safely. Applications
+ * are recommend to instead use {@link android.content.ComponentCallbacks2#onTrimMemory(int)}
+ * to react to memory events and release shared memory regions as appropriate.
*/
+ @Deprecated
public boolean isPurgingAllowed() {
return mAllowPurging;
}
@@ -156,11 +136,16 @@
* @param allowPurging true if the operating system can purge the contents
* of the file in low memory situations
* @return previous value of allowPurging
+ *
+ * @deprecated Purgable is considered generally fragile and hard to use safely. Applications
+ * are recommend to instead use {@link android.content.ComponentCallbacks2#onTrimMemory(int)}
+ * to react to memory events and release shared memory regions as appropriate.
*/
+ @Deprecated
synchronized public boolean allowPurging(boolean allowPurging) throws IOException {
boolean oldValue = mAllowPurging;
if (oldValue != allowPurging) {
- native_pin(mFD, !allowPurging);
+ native_pin(mSharedMemory.getFileDescriptor(), !allowPurging);
mAllowPurging = allowPurging;
}
return oldValue;
@@ -197,16 +182,14 @@
*/
public int readBytes(byte[] buffer, int srcOffset, int destOffset, int count)
throws IOException {
- if (isDeactivated()) {
- throw new IOException("Can't read from deactivated memory file.");
+ beginAccess();
+ try {
+ mMapping.position(srcOffset);
+ mMapping.get(buffer, destOffset, count);
+ } finally {
+ endAccess();
}
- if (destOffset < 0 || destOffset > buffer.length || count < 0
- || count > buffer.length - destOffset
- || srcOffset < 0 || srcOffset > mLength
- || count > mLength - srcOffset) {
- throw new IndexOutOfBoundsException();
- }
- return native_read(mFD, mAddress, buffer, srcOffset, destOffset, count, mAllowPurging);
+ return count;
}
/**
@@ -221,16 +204,13 @@
*/
public void writeBytes(byte[] buffer, int srcOffset, int destOffset, int count)
throws IOException {
- if (isDeactivated()) {
- throw new IOException("Can't write to deactivated memory file.");
+ beginAccess();
+ try {
+ mMapping.position(destOffset);
+ mMapping.put(buffer, srcOffset, count);
+ } finally {
+ endAccess();
}
- if (srcOffset < 0 || srcOffset > buffer.length || count < 0
- || count > buffer.length - srcOffset
- || destOffset < 0 || destOffset > mLength
- || count > mLength - destOffset) {
- throw new IndexOutOfBoundsException();
- }
- native_write(mFD, mAddress, buffer, srcOffset, destOffset, count, mAllowPurging);
}
/**
@@ -239,11 +219,9 @@
* The returned file descriptor is not duplicated.
*
* @throws IOException If the memory file has been closed.
- *
- * @hide
*/
public FileDescriptor getFileDescriptor() throws IOException {
- return mFD;
+ return mSharedMemory.getFileDescriptor();
}
/**
@@ -266,10 +244,10 @@
@Override
public int available() throws IOException {
- if (mOffset >= mLength) {
+ if (mOffset >= mSharedMemory.getSize()) {
return 0;
}
- return mLength - mOffset;
+ return mSharedMemory.getSize() - mOffset;
}
@Override
@@ -319,8 +297,8 @@
@Override
public long skip(long n) throws IOException {
- if (mOffset + n > mLength) {
- n = mLength - mOffset;
+ if (mOffset + n > mSharedMemory.getSize()) {
+ n = mSharedMemory.getSize() - mOffset;
}
mOffset += n;
return n;
diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java
index 68a81ca..10331b9 100644
--- a/core/java/android/os/Parcel.java
+++ b/core/java/android/os/Parcel.java
@@ -27,6 +27,7 @@
import android.util.SparseBooleanArray;
import android.util.SparseIntArray;
+import dalvik.annotation.optimization.CriticalNative;
import dalvik.annotation.optimization.FastNative;
import dalvik.system.VMRuntime;
@@ -131,7 +132,7 @@
* caller of the read function must know what type to expect and pass in the
* appropriate {@link Parcelable.Creator Parcelable.Creator} instead to
* properly construct the new object and read its data. (To more efficient
- * write and read a single Parceable object that is not null, you can directly
+ * write and read a single Parcelable object that is not null, you can directly
* call {@link Parcelable#writeToParcel Parcelable.writeToParcel} and
* {@link Parcelable.Creator#createFromParcel Parcelable.Creator.createFromParcel}
* yourself.)</p>
@@ -260,24 +261,24 @@
// see libbinder's binder/Status.h
private static final int EX_TRANSACTION_FAILED = -129;
- @FastNative
+ @CriticalNative
private static native int nativeDataSize(long nativePtr);
- @FastNative
+ @CriticalNative
private static native int nativeDataAvail(long nativePtr);
- @FastNative
+ @CriticalNative
private static native int nativeDataPosition(long nativePtr);
- @FastNative
+ @CriticalNative
private static native int nativeDataCapacity(long nativePtr);
@FastNative
private static native long nativeSetDataSize(long nativePtr, int size);
- @FastNative
+ @CriticalNative
private static native void nativeSetDataPosition(long nativePtr, int pos);
@FastNative
private static native void nativeSetDataCapacity(long nativePtr, int size);
- @FastNative
+ @CriticalNative
private static native boolean nativePushAllowFds(long nativePtr, boolean allowFds);
- @FastNative
+ @CriticalNative
private static native void nativeRestoreAllowFds(long nativePtr, boolean lastValue);
private static native void nativeWriteByteArray(long nativePtr, byte[] b, int offset, int len);
@@ -297,13 +298,13 @@
private static native byte[] nativeCreateByteArray(long nativePtr);
private static native boolean nativeReadByteArray(long nativePtr, byte[] dest, int destLen);
private static native byte[] nativeReadBlob(long nativePtr);
- @FastNative
+ @CriticalNative
private static native int nativeReadInt(long nativePtr);
- @FastNative
+ @CriticalNative
private static native long nativeReadLong(long nativePtr);
- @FastNative
+ @CriticalNative
private static native float nativeReadFloat(long nativePtr);
- @FastNative
+ @CriticalNative
private static native double nativeReadDouble(long nativePtr);
private static native String nativeReadString(long nativePtr);
private static native IBinder nativeReadStrongBinder(long nativePtr);
@@ -319,11 +320,12 @@
private static native int nativeCompareData(long thisNativePtr, long otherNativePtr);
private static native long nativeAppendFrom(
long thisNativePtr, long otherNativePtr, int offset, int length);
- @FastNative
+ @CriticalNative
private static native boolean nativeHasFileDescriptors(long nativePtr);
private static native void nativeWriteInterfaceToken(long nativePtr, String interfaceName);
private static native void nativeEnforceInterface(long nativePtr, String interfaceName);
+ @CriticalNative
private static native long nativeGetBlobAshmemSize(long nativePtr);
public final static Parcelable.Creator<String> STRING_CREATOR
diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java
index a85ed9c..3f5b611 100644
--- a/core/java/android/os/PowerManager.java
+++ b/core/java/android/os/PowerManager.java
@@ -23,6 +23,7 @@
import android.annotation.SystemService;
import android.content.Context;
import android.util.Log;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -265,7 +266,13 @@
* {@link #PROXIMITY_SCREEN_OFF_WAKE_LOCK} wake lock until the proximity sensor
* indicates that an object is not in close proximity.
*/
- public static final int RELEASE_FLAG_WAIT_FOR_NO_PROXIMITY = 1;
+ public static final int RELEASE_FLAG_WAIT_FOR_NO_PROXIMITY = 1 << 0;
+
+ /**
+ * Flag for {@link WakeLock#release(int)} when called due to timeout.
+ * @hide
+ */
+ public static final int RELEASE_FLAG_TIMEOUT = 1 << 16;
/**
* Brightness value for fully on.
@@ -848,15 +855,12 @@
* to {@link #boostScreenBrightness(long)}.
* @return {@code True} if the screen brightness is currently boosted. {@code False} otherwise.
*
+ * @deprecated This call is rarely used and will be phased out soon.
* @hide
*/
- @SystemApi
+ @SystemApi @Deprecated
public boolean isScreenBrightnessBoosted() {
- try {
- return mService.isScreenBrightnessBoosted();
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
+ return false;
}
/**
@@ -1216,9 +1220,10 @@
* Intent that is broadcast when the state of {@link #isScreenBrightnessBoosted()} has changed.
* This broadcast is only sent to registered receivers.
*
+ * @deprecated This intent is rarely used and will be phased out soon.
* @hide
**/
- @SystemApi
+ @SystemApi @Deprecated
public static final String ACTION_SCREEN_BRIGHTNESS_BOOST_CHANGED
= "android.os.action.SCREEN_BRIGHTNESS_BOOST_CHANGED";
@@ -1243,7 +1248,8 @@
private String mTag;
private final String mPackageName;
private final IBinder mToken;
- private int mCount;
+ private int mInternalCount;
+ private int mExternalCount;
private boolean mRefCounted = true;
private boolean mHeld;
private WorkSource mWorkSource;
@@ -1252,7 +1258,7 @@
private final Runnable mReleaser = new Runnable() {
public void run() {
- release();
+ release(RELEASE_FLAG_TIMEOUT);
}
};
@@ -1329,7 +1335,9 @@
}
private void acquireLocked() {
- if (!mRefCounted || mCount++ == 0) {
+ mInternalCount++;
+ mExternalCount++;
+ if (!mRefCounted || mInternalCount == 1) {
// Do this even if the wake lock is already thought to be held (mHeld == true)
// because non-reference counted wake locks are not always properly released.
// For example, the keyguard's wake lock might be forcibly released by the
@@ -1374,7 +1382,11 @@
*/
public void release(int flags) {
synchronized (mToken) {
- if (!mRefCounted || --mCount == 0) {
+ mInternalCount--;
+ if ((flags & RELEASE_FLAG_TIMEOUT) == 0) {
+ mExternalCount--;
+ }
+ if (!mRefCounted || mInternalCount == 0) {
mHandler.removeCallbacks(mReleaser);
if (mHeld) {
Trace.asyncTraceEnd(Trace.TRACE_TAG_POWER, mTraceName, 0);
@@ -1386,7 +1398,7 @@
mHeld = false;
}
}
- if (mCount < 0) {
+ if (mRefCounted && mExternalCount < 0) {
throw new RuntimeException("WakeLock under-locked " + mTag);
}
}
@@ -1470,7 +1482,7 @@
synchronized (mToken) {
return "WakeLock{"
+ Integer.toHexString(System.identityHashCode(this))
- + " held=" + mHeld + ", refCount=" + mCount + "}";
+ + " held=" + mHeld + ", refCount=" + mInternalCount + "}";
}
}
diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java
index 3074942..9351661 100644
--- a/core/java/android/os/Process.java
+++ b/core/java/android/os/Process.java
@@ -773,7 +773,8 @@
/**
* Return the current priority of a thread, based on Linux priorities.
*
- * @param tid The identifier of the thread/process to change.
+ * @param tid The identifier of the thread/process. If tid equals zero, the priority of the
+ * calling process/thread will be returned.
*
* @return Returns the current priority, as a Linux priority level,
* from -20 for highest scheduling priority to 19 for lowest scheduling
diff --git a/core/java/android/os/SharedMemory.aidl b/core/java/android/os/SharedMemory.aidl
new file mode 100644
index 0000000..b7c695e
--- /dev/null
+++ b/core/java/android/os/SharedMemory.aidl
@@ -0,0 +1,20 @@
+/* //device/java/android/android/os/SharedMemory.aidl
+**
+** Copyright 2017, 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.os;
+
+parcelable SharedMemory;
\ No newline at end of file
diff --git a/core/java/android/os/SharedMemory.java b/core/java/android/os/SharedMemory.java
new file mode 100644
index 0000000..712bbaa
--- /dev/null
+++ b/core/java/android/os/SharedMemory.java
@@ -0,0 +1,351 @@
+/*
+ * Copyright (C) 2017 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.os;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.system.ErrnoException;
+import android.system.Os;
+import android.system.OsConstants;
+
+import dalvik.system.VMRuntime;
+
+import java.io.Closeable;
+import java.io.FileDescriptor;
+import java.nio.ByteBuffer;
+import java.nio.DirectByteBuffer;
+
+import sun.misc.Cleaner;
+
+/**
+ * SharedMemory enables the creation, mapping, and protection control over anonymous shared memory.
+ */
+public final class SharedMemory implements Parcelable, Closeable {
+
+ private final FileDescriptor mFileDescriptor;
+ private final int mSize;
+ private final MemoryRegistration mMemoryRegistration;
+ private Cleaner mCleaner;
+
+ private SharedMemory(FileDescriptor fd) {
+ // This constructor is only used internally so it should be impossible to hit any of the
+ // exceptions unless something goes horribly wrong.
+ if (fd == null) {
+ throw new IllegalArgumentException(
+ "Unable to create SharedMemory from a null FileDescriptor");
+ }
+ if (!fd.valid()) {
+ throw new IllegalArgumentException(
+ "Unable to create SharedMemory from closed FileDescriptor");
+ }
+ mFileDescriptor = fd;
+ mSize = nGetSize(mFileDescriptor);
+ if (mSize <= 0) {
+ throw new IllegalArgumentException("FileDescriptor is not a valid ashmem fd");
+ }
+
+ mMemoryRegistration = new MemoryRegistration(mSize);
+ mCleaner = Cleaner.create(this, new Closer(mFileDescriptor, mMemoryRegistration));
+ }
+
+ /**
+ * Creates an anonymous SharedMemory instance with the provided debug name and size. The name
+ * is only used for debugging purposes and can help identify what the shared memory is used
+ * for when inspecting memory maps for the processes that have mapped this SharedMemory
+ * instance.
+ *
+ * @param name The debug name to use for this SharedMemory instance. This can be null, however
+ * a debug name is recommended to help identify memory usage when using tools
+ * such as lsof or examining /proc/[pid]/maps
+ * @param size The size of the shared memory to create. Must be greater than 0.
+ * @return A SharedMemory instance of the requested size
+ * @throws ErrnoException if the requested allocation fails.
+ */
+ public static @NonNull SharedMemory create(@Nullable String name, int size)
+ throws ErrnoException {
+ if (size <= 0) {
+ throw new IllegalArgumentException("Size must be greater than zero");
+ }
+ return new SharedMemory(nCreate(name, size));
+ }
+
+ private void checkOpen() {
+ if (!mFileDescriptor.valid()) {
+ throw new IllegalStateException("SharedMemory is closed");
+ }
+ }
+
+ private static final int PROT_MASK = OsConstants.PROT_READ | OsConstants.PROT_WRITE
+ | OsConstants.PROT_EXEC | OsConstants.PROT_NONE;
+
+ private static void validateProt(int prot) {
+ if ((prot & ~PROT_MASK) != 0) {
+ throw new IllegalArgumentException("Invalid prot value");
+ }
+ }
+
+ /**
+ * Sets the protection on the shared memory to the combination specified in prot, which
+ * is either a bitwise-or'd combination of {@link android.system.OsConstants#PROT_READ},
+ * {@link android.system.OsConstants#PROT_WRITE}, {@link android.system.OsConstants#PROT_EXEC}
+ * from {@link android.system.OsConstants}, or {@link android.system.OsConstants#PROT_NONE},
+ * to remove all further access.
+ *
+ * Note that protection can only ever be removed, not added. By default shared memory
+ * is created with protection set to PROT_READ | PROT_WRITE | PROT_EXEC. The protection
+ * passed here also only applies to any mappings created after calling this method. Existing
+ * mmaps of the shared memory retain whatever protection they had when they were created.
+ *
+ * A common usage of this is to share a read-only copy of the data with something else. To do
+ * that first create the read/write mapping with PROT_READ | PROT_WRITE,
+ * then call setProtect(PROT_READ) to remove write capability, then send the SharedMemory
+ * to another process. That process will only be able to mmap with PROT_READ.
+ *
+ * @param prot Any bitwise-or'ed combination of
+ * {@link android.system.OsConstants#PROT_READ},
+ * {@link android.system.OsConstants#PROT_WRITE}, and
+ * {@link android.system.OsConstants#PROT_EXEC}; or
+ * {@link android.system.OsConstants#PROT_NONE}
+ * @return Whether or not the requested protection was applied. Returns true on success,
+ * false if the requested protection was broader than the existing protection.
+ */
+ public boolean setProtect(int prot) {
+ checkOpen();
+ validateProt(prot);
+ int errno = nSetProt(mFileDescriptor, prot);
+ return errno == 0;
+ }
+
+ /**
+ * Returns the backing {@link FileDescriptor} for this SharedMemory object. The SharedMemory
+ * instance retains ownership of the FileDescriptor.
+ *
+ * This FileDescriptor is interoperable with the ASharedMemory NDK APIs.
+ *
+ * @return Returns the FileDescriptor associated with this object.
+ */
+ public @NonNull FileDescriptor getFileDescriptor() {
+ return mFileDescriptor;
+ }
+
+ /**
+ * Returns the backing native fd int for this SharedMemory object. The SharedMemory
+ * instance retains ownership of the fd.
+ *
+ * This fd is interoperable with the ASharedMemory NDK APIs.
+ *
+ * @return Returns the native fd associated with this object, or -1 if it is already closed.
+ */
+ public int getFd() {
+ return mFileDescriptor.getInt$();
+ }
+
+ /**
+ * @return The size of the SharedMemory region.
+ */
+ public int getSize() {
+ checkOpen();
+ return mSize;
+ }
+
+ /**
+ * Creates a read/write mapping of the entire shared memory region. This requires the the
+ * protection level of the shared memory is at least PROT_READ|PROT_WRITE or the map will fail.
+ *
+ * Use {@link #map(int, int, int)} to have more control over the mapping if desired.
+ * This is equivalent to map(OsConstants.PROT_READ | OsConstants.PROT_WRITE, 0, getSize())
+ *
+ * @return A ByteBuffer mapping
+ * @throws ErrnoException if the mmap call failed.
+ */
+ public @NonNull ByteBuffer mapReadWrite() throws ErrnoException {
+ return map(OsConstants.PROT_READ | OsConstants.PROT_WRITE, 0, mSize);
+ }
+
+ /**
+ * Creates a read-only mapping of the entire shared memory region. This requires the the
+ * protection level of the shared memory is at least PROT_READ or the map will fail.
+ *
+ * Use {@link #map(int, int, int)} to have more control over the mapping if desired.
+ * This is equivalent to map(OsConstants.PROT_READ, 0, getSize())
+ *
+ * @return A ByteBuffer mapping
+ * @throws ErrnoException if the mmap call failed.
+ */
+ public @NonNull ByteBuffer mapReadOnly() throws ErrnoException {
+ return map(OsConstants.PROT_READ, 0, mSize);
+ }
+
+ /**
+ * Creates an mmap of the SharedMemory with the specified prot, offset, and length.
+ *
+ * @param prot A bitwise-or'd combination of PROT_READ, PROT_WRITE, PROT_EXEC, or PROT_NONE.
+ * @param offset The offset into the shared memory to begin mapping
+ * @param length The length of the region to map
+ * @return A ByteBuffer mapping.
+ * @throws ErrnoException if the mmap call failed.
+ */
+ public @NonNull ByteBuffer map(int prot, int offset, int length) throws ErrnoException {
+ checkOpen();
+ validateProt(prot);
+ if (offset < 0) {
+ throw new IllegalArgumentException("Offset must be > 0");
+ }
+ if (length <= 0) {
+ throw new IllegalArgumentException("Length must be > 0");
+ }
+ if (offset + length > mSize) {
+ throw new IllegalArgumentException("offset + length must not exceed getSize()");
+ }
+ long address = Os.mmap(0, length, prot, OsConstants.MAP_SHARED, mFileDescriptor, offset);
+ boolean readOnly = (prot & OsConstants.PROT_WRITE) == 0;
+ Runnable unmapper = new Unmapper(address, length, mMemoryRegistration.acquire());
+ return new DirectByteBuffer(length, address, mFileDescriptor, unmapper, readOnly);
+ }
+
+ /**
+ * Unmaps a buffer previously returned by {@link #map(int, int, int)}
+ * @param buffer The buffer to unmap
+ */
+ public static void unmap(@NonNull ByteBuffer buffer) {
+ if (buffer instanceof DirectByteBuffer) {
+ Cleaner cleaner = ((DirectByteBuffer) buffer).cleaner();
+ if (cleaner != null) {
+ cleaner.clean();
+ }
+ } else {
+ throw new IllegalArgumentException(
+ "ByteBuffer wasn't created by #map(int, int, int); can't unmap");
+ }
+ }
+
+ /**
+ * Close the backing {@link FileDescriptor} of this SharedMemory instance. Note that all
+ * open mappings of the shared memory will remain valid and may continue to be used. The
+ * shared memory will not be freed until all file descriptor handles are closed and all
+ * memory mappings are unmapped.
+ */
+ @Override
+ public void close() {
+ if (mCleaner != null) {
+ mCleaner.clean();
+ mCleaner = null;
+ }
+ }
+
+ @Override
+ public int describeContents() {
+ return CONTENTS_FILE_DESCRIPTOR;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ checkOpen();
+ dest.writeFileDescriptor(mFileDescriptor);
+ }
+
+ public static final Parcelable.Creator<SharedMemory> CREATOR =
+ new Parcelable.Creator<SharedMemory>() {
+ @Override
+ public SharedMemory createFromParcel(Parcel source) {
+ FileDescriptor descriptor = source.readRawFileDescriptor();
+ return new SharedMemory(descriptor);
+ }
+
+ @Override
+ public SharedMemory[] newArray(int size) {
+ return new SharedMemory[size];
+ }
+ };
+
+ /**
+ * Cleaner that closes the FD
+ */
+ private static final class Closer implements Runnable {
+ private FileDescriptor mFd;
+ private MemoryRegistration mMemoryReference;
+
+ private Closer(FileDescriptor fd, MemoryRegistration memoryReference) {
+ mFd = fd;
+ mMemoryReference = memoryReference;
+ }
+
+ @Override
+ public void run() {
+ try {
+ Os.close(mFd);
+ } catch (ErrnoException e) { /* swallow error */ }
+ mMemoryReference.release();
+ mMemoryReference = null;
+ }
+ }
+
+ /**
+ * Cleaner that munmap regions
+ */
+ private static final class Unmapper implements Runnable {
+ private long mAddress;
+ private int mSize;
+ private MemoryRegistration mMemoryReference;
+
+ private Unmapper(long address, int size, MemoryRegistration memoryReference) {
+ mAddress = address;
+ mSize = size;
+ mMemoryReference = memoryReference;
+ }
+
+ @Override
+ public void run() {
+ try {
+ Os.munmap(mAddress, mSize);
+ } catch (ErrnoException e) { /* swallow exception */ }
+ mMemoryReference.release();
+ mMemoryReference = null;
+ }
+ }
+
+ /**
+ * Helper class that ensures that the native allocation pressure against the VM heap stays
+ * active until the FD is closed as well as all mappings from that FD are closed.
+ */
+ private static final class MemoryRegistration {
+ private int mSize;
+ private int mReferenceCount;
+
+ private MemoryRegistration(int size) {
+ mSize = size;
+ mReferenceCount = 1;
+ VMRuntime.getRuntime().registerNativeAllocation(mSize);
+ }
+
+ public synchronized MemoryRegistration acquire() {
+ mReferenceCount++;
+ return this;
+ }
+
+ public synchronized void release() {
+ mReferenceCount--;
+ if (mReferenceCount == 0) {
+ VMRuntime.getRuntime().registerNativeFree(mSize);
+ }
+ }
+ }
+
+ private static native FileDescriptor nCreate(String name, int size) throws ErrnoException;
+ private static native int nGetSize(FileDescriptor fd);
+ private static native int nSetProt(FileDescriptor fd, int prot);
+}
diff --git a/core/java/android/os/StrictMode.java b/core/java/android/os/StrictMode.java
index 2b82c77..3e07143 100644
--- a/core/java/android/os/StrictMode.java
+++ b/core/java/android/os/StrictMode.java
@@ -16,6 +16,7 @@
package android.os;
import android.animation.ValueAnimator;
+import android.annotation.TestApi;
import android.app.ActivityManager;
import android.app.ActivityThread;
import android.app.ApplicationErrorReport;
@@ -124,9 +125,6 @@
private static final String TAG = "StrictMode";
private static final boolean LOG_V = Log.isLoggable(TAG, Log.VERBOSE);
- private static final boolean IS_USER_BUILD = "user".equals(Build.TYPE);
- private static final boolean IS_ENG_BUILD = "eng".equals(Build.TYPE);
-
/**
* Boolean system property to disable strict mode checks outright.
* Set this to 'true' to force disable; 'false' has no effect on other
@@ -343,6 +341,7 @@
private static volatile VmPolicy sVmPolicy = VmPolicy.LAX;
/** {@hide} */
+ @TestApi
public interface ViolationListener {
public void onViolation(String message);
}
@@ -350,6 +349,7 @@
private static volatile ViolationListener sListener;
/** {@hide} */
+ @TestApi
public static void setViolationListener(ViolationListener listener) {
sListener = listener;
}
@@ -1188,7 +1188,7 @@
// For debug builds, log event loop stalls to dropbox for analysis.
// Similar logic also appears in ActivityThread.java for system apps.
- if (!doFlashes && (IS_USER_BUILD || suppress)) {
+ if (!doFlashes && (Build.IS_USER || suppress)) {
setCloseGuardEnabled(false);
return false;
}
@@ -1196,7 +1196,7 @@
// Eng builds have flashes on all the time. The suppression property
// overrides this, so we force the behavior only after the short-circuit
// check above.
- if (IS_ENG_BUILD) {
+ if (Build.IS_ENG) {
doFlashes = true;
}
@@ -1205,7 +1205,7 @@
StrictMode.DETECT_DISK_READ |
StrictMode.DETECT_NETWORK;
- if (!IS_USER_BUILD) {
+ if (!Build.IS_USER) {
threadPolicyMask |= StrictMode.PENALTY_DROPBOX;
}
if (doFlashes) {
@@ -1216,23 +1216,25 @@
// VM Policy controls CloseGuard, detection of Activity leaks,
// and instance counting.
- if (IS_USER_BUILD) {
+ if (Build.IS_USER) {
setCloseGuardEnabled(false);
} else {
VmPolicy.Builder policyBuilder = new VmPolicy.Builder().detectAll();
- if (!IS_ENG_BUILD) {
+ if (!Build.IS_ENG) {
// Activity leak detection causes too much slowdown for userdebug because of the
// GCs.
policyBuilder = policyBuilder.disable(DETECT_VM_ACTIVITY_LEAKS);
}
policyBuilder = policyBuilder.penaltyDropBox();
- if (IS_ENG_BUILD) {
+ if (Build.IS_ENG) {
policyBuilder.penaltyLog();
}
// All core system components need to tag their sockets to aid
// system health investigations
if (android.os.Process.myUid() < android.os.Process.FIRST_APPLICATION_UID) {
- policyBuilder.detectUntaggedSockets();
+ policyBuilder.enable(DETECT_VM_UNTAGGED_SOCKET);
+ } else {
+ policyBuilder.disable(DETECT_VM_UNTAGGED_SOCKET);
}
setVmPolicy(policyBuilder.build());
setCloseGuardEnabled(vmClosableObjectLeaksEnabled());
@@ -2291,7 +2293,7 @@
* @hide
*/
public static Span enterCriticalSpan(String name) {
- if (IS_USER_BUILD) {
+ if (Build.IS_USER) {
return NO_OP_SPAN;
}
if (name == null || name.isEmpty()) {
diff --git a/core/java/android/os/SynchronousResultReceiver.java b/core/java/android/os/SynchronousResultReceiver.java
index d1b6288..6e1d4b3 100644
--- a/core/java/android/os/SynchronousResultReceiver.java
+++ b/core/java/android/os/SynchronousResultReceiver.java
@@ -43,9 +43,19 @@
}
private final CompletableFuture<Result> mFuture = new CompletableFuture<>();
+ private final String mName;
public SynchronousResultReceiver() {
super((Handler) null);
+ mName = null;
+ }
+
+ /**
+ * @param name Name for logging purposes
+ */
+ public SynchronousResultReceiver(String name) {
+ super((Handler) null);
+ mName = name;
}
@Override
@@ -54,6 +64,10 @@
mFuture.complete(new Result(resultCode, resultData));
}
+ public String getName() {
+ return mName;
+ }
+
/**
* Blocks waiting for the result from the remote client.
*
diff --git a/core/java/android/os/UpdateEngine.java b/core/java/android/os/UpdateEngine.java
index 8549cff..ee0b623 100644
--- a/core/java/android/os/UpdateEngine.java
+++ b/core/java/android/os/UpdateEngine.java
@@ -21,8 +21,6 @@
import android.os.IUpdateEngineCallback;
import android.os.RemoteException;
-import android.util.Log;
-
/**
* UpdateEngine handles calls to the update engine which takes care of A/B OTA
* updates. It wraps up the update engine Binder APIs and exposes them as
@@ -90,6 +88,8 @@
}
private IUpdateEngine mUpdateEngine;
+ private IUpdateEngineCallback mUpdateEngineCallback = null;
+ private final Object mUpdateEngineCallbackLock = new Object();
/**
* Creates a new instance.
@@ -107,40 +107,42 @@
*/
@SystemApi
public boolean bind(final UpdateEngineCallback callback, final Handler handler) {
- IUpdateEngineCallback updateEngineCallback = new IUpdateEngineCallback.Stub() {
- @Override
- public void onStatusUpdate(final int status, final float percent) {
- if (handler != null) {
- handler.post(new Runnable() {
- @Override
- public void run() {
- callback.onStatusUpdate(status, percent);
- }
- });
- } else {
- callback.onStatusUpdate(status, percent);
+ synchronized (mUpdateEngineCallbackLock) {
+ mUpdateEngineCallback = new IUpdateEngineCallback.Stub() {
+ @Override
+ public void onStatusUpdate(final int status, final float percent) {
+ if (handler != null) {
+ handler.post(new Runnable() {
+ @Override
+ public void run() {
+ callback.onStatusUpdate(status, percent);
+ }
+ });
+ } else {
+ callback.onStatusUpdate(status, percent);
+ }
}
- }
- @Override
- public void onPayloadApplicationComplete(final int errorCode) {
- if (handler != null) {
- handler.post(new Runnable() {
- @Override
- public void run() {
- callback.onPayloadApplicationComplete(errorCode);
- }
- });
- } else {
- callback.onPayloadApplicationComplete(errorCode);
+ @Override
+ public void onPayloadApplicationComplete(final int errorCode) {
+ if (handler != null) {
+ handler.post(new Runnable() {
+ @Override
+ public void run() {
+ callback.onPayloadApplicationComplete(errorCode);
+ }
+ });
+ } else {
+ callback.onPayloadApplicationComplete(errorCode);
+ }
}
- }
- };
+ };
- try {
- return mUpdateEngine.bind(updateEngineCallback);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
+ try {
+ return mUpdateEngine.bind(mUpdateEngineCallback);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
}
}
@@ -249,4 +251,23 @@
throw e.rethrowFromSystemServer();
}
}
+
+ /**
+ * Unbinds the last bound callback function.
+ */
+ @SystemApi
+ public boolean unbind() {
+ synchronized (mUpdateEngineCallbackLock) {
+ if (mUpdateEngineCallback == null) {
+ return true;
+ }
+ try {
+ boolean result = mUpdateEngine.unbind(mUpdateEngineCallback);
+ mUpdateEngineCallback = null;
+ return result;
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ }
}
diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java
index f2aa113..6372113 100644
--- a/core/java/android/os/storage/StorageManager.java
+++ b/core/java/android/os/storage/StorageManager.java
@@ -118,6 +118,8 @@
public static final String PROP_SDCARDFS = "persist.sys.sdcardfs";
/** {@hide} */
public static final String PROP_VIRTUAL_DISK = "persist.sys.virtual_disk";
+ /** {@hide} */
+ public static final String PROP_ADOPTABLE_FBE = "persist.sys.adoptable_fbe";
/** {@hide} */
public static final String UUID_PRIVATE_INTERNAL = null;
@@ -737,7 +739,7 @@
* {@link Environment#getDataDirectory()}, the returned value will be
* {@link #UUID_DEFAULT}.
*
- * @throws IOException when the storage device at the given path isn't
+ * @throws IOException when the storage device hosting the given path isn't
* present, or when it doesn't have a valid UUID.
*/
public @NonNull UUID getUuidForPath(@NonNull File path) throws IOException {
@@ -769,6 +771,19 @@
throw new FileNotFoundException("Failed to find a storage device for " + volumeUuid);
}
+ /**
+ * Test if the given file descriptor supports allocation of disk space using
+ * {@link #allocateBytes(FileDescriptor, long)}.
+ */
+ public boolean isAllocationSupported(@NonNull FileDescriptor fd) {
+ try {
+ getUuidForPath(ParcelFileDescriptor.getFile(fd));
+ return true;
+ } catch (IOException e) {
+ return false;
+ }
+ }
+
/** {@hide} */
public @NonNull List<VolumeInfo> getVolumes() {
try {
@@ -1560,12 +1575,6 @@
}
}
- /** @removed */
- @Deprecated
- public long getCacheQuotaBytes(@NonNull File path) throws IOException {
- return getCacheQuotaBytes(getUuidForPath(path));
- }
-
/**
* Return total size in bytes of all cached data belonging to the calling
* app on the given storage volume.
@@ -1601,36 +1610,6 @@
}
}
- /** @removed */
- @Deprecated
- public long getCacheSizeBytes(@NonNull File path) throws IOException {
- return getCacheSizeBytes(getUuidForPath(path));
- }
-
- /** @removed */
- @Deprecated
- public long getCacheQuotaBytes() throws IOException {
- return getCacheQuotaBytes(mContext.getCacheDir());
- }
-
- /** @removed */
- @Deprecated
- public long getCacheSizeBytes() throws IOException {
- return getCacheSizeBytes(mContext.getCacheDir());
- }
-
- /** @removed */
- @Deprecated
- public long getExternalCacheQuotaBytes() throws IOException {
- return getCacheQuotaBytes(mContext.getExternalCacheDir());
- }
-
- /** @removed */
- @Deprecated
- public long getExternalCacheSizeBytes() throws IOException {
- return getCacheSizeBytes(mContext.getExternalCacheDir());
- }
-
/**
* Flag indicating that a disk space allocation request should operate in an
* aggressive mode. This flag should only be rarely used in situations that
@@ -1739,15 +1718,6 @@
}
}
- /** @removed */
- @Deprecated
- @WorkerThread
- @SuppressLint("Doclava125")
- public long getAllocatableBytes(@NonNull File path,
- @RequiresPermission @AllocateFlags int flags) throws IOException {
- return getAllocatableBytes(getUuidForPath(path), flags);
- }
-
/**
* Allocate the requested number of bytes for your application to use on the
* given storage volume. This will cause the system to delete any cached
@@ -1796,15 +1766,6 @@
}
}
- /** @removed */
- @Deprecated
- @WorkerThread
- @SuppressLint("Doclava125")
- public void allocateBytes(@NonNull File path, @BytesLong long bytes,
- @RequiresPermission @AllocateFlags int flags) throws IOException {
- allocateBytes(getUuidForPath(path), bytes, flags);
- }
-
/**
* Allocate the requested number of bytes for your application to use in the
* given open file. This will cause the system to delete any cached files
@@ -1832,6 +1793,7 @@
* doesn't support allocating space, or if the device had
* trouble allocating the requested space.
* @see #getAllocatableBytes(UUID, int)
+ * @see #isAllocationSupported(FileDescriptor)
* @see Environment#isExternalStorageEmulated(File)
*/
@WorkerThread
@@ -1846,17 +1808,28 @@
public void allocateBytes(FileDescriptor fd, @BytesLong long bytes,
@RequiresPermission @AllocateFlags int flags) throws IOException {
final File file = ParcelFileDescriptor.getFile(fd);
+ final UUID uuid = getUuidForPath(file);
for (int i = 0; i < 3; i++) {
try {
final long haveBytes = Os.fstat(fd).st_blocks * 512;
final long needBytes = bytes - haveBytes;
if (needBytes > 0) {
- allocateBytes(file, needBytes, flags);
+ allocateBytes(uuid, needBytes, flags);
}
- Os.posix_fallocate(fd, 0, bytes);
- return;
+ try {
+ Os.posix_fallocate(fd, 0, bytes);
+ return;
+ } catch (ErrnoException e) {
+ if (e.errno == OsConstants.ENOSYS || e.errno == OsConstants.ENOTSUP) {
+ Log.w(TAG, "fallocate() not supported; falling back to ftruncate()");
+ Os.ftruncate(fd, bytes);
+ return;
+ } else {
+ throw e;
+ }
+ }
} catch (ErrnoException e) {
if (e.errno == OsConstants.ENOSPC) {
Log.w(TAG, "Odd, not enough space; let's try again?");
@@ -1939,18 +1912,6 @@
return isCacheBehavior(path, XATTR_CACHE_GROUP);
}
- /** @removed */
- @Deprecated
- public void setCacheBehaviorAtomic(File path, boolean atomic) throws IOException {
- setCacheBehaviorGroup(path, atomic);
- }
-
- /** @removed */
- @Deprecated
- public boolean isCacheBehaviorAtomic(File path) throws IOException {
- return isCacheBehaviorGroup(path);
- }
-
/**
* Enable or disable special cache behavior that leaves deleted cache files
* intact as tombstones.
diff --git a/core/java/android/print/PrintDocumentAdapter.java b/core/java/android/print/PrintDocumentAdapter.java
index 1f59bef..2bb7c2e 100644
--- a/core/java/android/print/PrintDocumentAdapter.java
+++ b/core/java/android/print/PrintDocumentAdapter.java
@@ -268,7 +268,9 @@
* Notifies that all the data was written.
*
* @param pages The pages that were written. Cannot be <code>null</code>
- * or empty.
+ * or empty. <br />
+ * Returning {@link PageRange#ALL_PAGES} indicates that all pages that were
+ * requested as the {@code pages} parameter in {@link #onWrite} were written.
*/
public void onWriteFinished(PageRange[] pages) {
/* do nothing - stub */
diff --git a/core/java/android/print/PrintManager.java b/core/java/android/print/PrintManager.java
index 52dccb4..51b7798 100644
--- a/core/java/android/print/PrintManager.java
+++ b/core/java/android/print/PrintManager.java
@@ -18,9 +18,9 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.annotation.SystemService;
-import android.annotation.TestApi;
import android.app.Activity;
import android.app.Application.ActivityLifecycleCallbacks;
import android.content.ComponentName;
@@ -142,7 +142,6 @@
* @see #getPrintServices
* @hide
*/
- @TestApi
public static final int ALL_SERVICES = ENABLED_SERVICES | DISABLED_SERVICES;
/**
@@ -554,6 +553,7 @@
* @hide
*/
@SystemApi
+ @RequiresPermission(android.Manifest.permission.READ_PRINT_SERVICES)
public void addPrintServicesChangeListener(@NonNull PrintServicesChangeListener listener,
@Nullable Handler handler) {
Preconditions.checkNotNull(listener);
@@ -589,6 +589,7 @@
* @hide
*/
@SystemApi
+ @RequiresPermission(android.Manifest.permission.READ_PRINT_SERVICES)
public void removePrintServicesChangeListener(@NonNull PrintServicesChangeListener listener) {
Preconditions.checkNotNull(listener);
@@ -629,8 +630,8 @@
*
* @hide
*/
- @TestApi
@SystemApi
+ @RequiresPermission(android.Manifest.permission.READ_PRINT_SERVICES)
public @NonNull List<PrintServiceInfo> getPrintServices(int selectionFlags) {
Preconditions.checkFlagsArgument(selectionFlags, ALL_SERVICES);
@@ -656,6 +657,7 @@
* @hide
*/
@SystemApi
+ @RequiresPermission(android.Manifest.permission.READ_PRINT_SERVICE_RECOMMENDATIONS)
public void addPrintServiceRecommendationsChangeListener(
@NonNull PrintServiceRecommendationsChangeListener listener,
@Nullable Handler handler) {
@@ -692,6 +694,7 @@
* @hide
*/
@SystemApi
+ @RequiresPermission(android.Manifest.permission.READ_PRINT_SERVICE_RECOMMENDATIONS)
public void removePrintServiceRecommendationsChangeListener(
@NonNull PrintServiceRecommendationsChangeListener listener) {
Preconditions.checkNotNull(listener);
@@ -731,6 +734,7 @@
* @hide
*/
@SystemApi
+ @RequiresPermission(android.Manifest.permission.READ_PRINT_SERVICE_RECOMMENDATIONS)
public @NonNull List<RecommendationInfo> getPrintServiceRecommendations() {
try {
List<RecommendationInfo> recommendations =
diff --git a/core/java/android/printservice/PrintServiceInfo.java b/core/java/android/printservice/PrintServiceInfo.java
index 5ef9319..57f1229 100644
--- a/core/java/android/printservice/PrintServiceInfo.java
+++ b/core/java/android/printservice/PrintServiceInfo.java
@@ -18,7 +18,6 @@
import android.annotation.NonNull;
import android.annotation.SystemApi;
-import android.annotation.TestApi;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
@@ -49,7 +48,6 @@
*
* @hide
*/
-@TestApi
@SystemApi
public final class PrintServiceInfo implements Parcelable {
diff --git a/core/java/android/provider/DocumentsContract.java b/core/java/android/provider/DocumentsContract.java
index fa90384..f2e2598 100644
--- a/core/java/android/provider/DocumentsContract.java
+++ b/core/java/android/provider/DocumentsContract.java
@@ -18,6 +18,7 @@
import static android.net.TrafficStats.KB_IN_BYTES;
import static android.system.OsConstants.SEEK_SET;
+
import static com.android.internal.util.Preconditions.checkArgument;
import static com.android.internal.util.Preconditions.checkCollectionElementsNotNull;
import static com.android.internal.util.Preconditions.checkCollectionNotEmpty;
@@ -28,7 +29,6 @@
import android.content.Context;
import android.content.Intent;
import android.content.IntentSender;
-import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.res.AssetFileDescriptor;
import android.database.Cursor;
@@ -44,7 +44,6 @@
import android.os.OperationCanceledException;
import android.os.Parcel;
import android.os.ParcelFileDescriptor;
-import android.os.ParcelFileDescriptor.OnCloseListener;
import android.os.Parcelable;
import android.os.ParcelableException;
import android.os.RemoteException;
@@ -182,6 +181,15 @@
/** {@hide} */
public static final String PACKAGE_DOCUMENTS_UI = "com.android.documentsui";
+ /** {@hide} */
+ public static final String METADATA_TYPES = "android:documentMetadataType";
+
+ /** {@hide} */
+ public static final String METADATA_EXIF = "android:documentExif";
+
+ /** {@hide} */
+ public static final String EXTRA_METADATA_TAGS = "android:documentMetadataTags";
+
/**
* Constants related to a document, including {@link Cursor} column names
* and flags.
@@ -442,6 +450,13 @@
* @hide
*/
public static final int FLAG_PARTIAL = 1 << 16;
+
+ /**
+ * Flag indicating that a document has available metadata that can be read
+ * using DocumentsContract#getDocumentMetadata
+ * @hide
+ */
+ public static final int FLAG_SUPPORTS_METADATA = 1 << 17;
}
/**
@@ -706,6 +721,8 @@
public static final String METHOD_FIND_DOCUMENT_PATH = "android:findDocumentPath";
/** {@hide} */
public static final String METHOD_CREATE_WEB_LINK_INTENT = "android:createWebLinkIntent";
+ /** {@hide} */
+ public static final String METHOD_GET_DOCUMENT_METADATA = "android:getDocumentMetadata";
/** {@hide} */
public static final String EXTRA_PARENT_URI = "parentUri";
@@ -1378,6 +1395,89 @@
}
/**
+ * Returns metadata associated with the document. The type of metadata returned
+ * is specific to the document type. For example image files will largely return EXIF
+ * metadata.
+ *
+ * <p>The returned {@link Bundle} will contain zero or more entries.
+ * <p>Each entry represents a specific type of metadata.
+ *
+ * <p>if tags == null, then a list of default tags will be used.
+ *
+ * @param documentUri a Document URI
+ * @param tags an array of keys to choose which data are added to the Bundle. If the Document
+ * is a JPG or ExifInterface compatible, send keys from {@link ExifInterface}.
+ * If tags are null, a set of default tags will be used. If the tags don't
+ * match with any relevant data, they will not be added to the Bundle.
+ * @return a Bundle of Bundles. If metadata exists within the Bundle, there will also
+ * be a String under DocumentsContract.METADATA_TYPES that will return a String[] of the
+ * types of metadata gathered.
+ *
+ * <pre><code>
+ * Bundle metadata = DocumentsContract.getDocumentMetadata(resolver, imageDocUri, tags);
+ * int imageLength = metadata.getInt(ExifInterface.TAG_IMAGE_LENGTH);
+ * </code></pre>
+ *
+ * {@hide}
+ */
+ public static Bundle getDocumentMetadata(ContentResolver resolver, Uri documentUri,
+ @Nullable String[] tags)
+ throws FileNotFoundException {
+ final ContentProviderClient client = resolver.acquireUnstableContentProviderClient(
+ documentUri.getAuthority());
+
+ try {
+ return getDocumentMetadata(client, documentUri, tags);
+ } catch (Exception e) {
+ Log.w(TAG, "Failed to get document metadata");
+ rethrowIfNecessary(resolver, e);
+ return null;
+ } finally {
+ ContentProviderClient.releaseQuietly(client);
+ }
+ }
+
+ /**
+ * Returns metadata associated with the document. The type of metadata returned
+ * is specific to the document type. For example image files will largely return EXIF
+ * metadata.
+ *
+ * <p>The returned {@link Bundle} will contain zero or more entries.
+ * <p>Each entry represents a specific type of metadata.
+ *
+ * <p>if tags == null, then a list of default tags will be used.
+ *
+ * @param documentUri a Document URI
+ * @param tags an array of keys to choose which data are added to the Bundle. If the Document
+ * is a JPG or ExifInterface compatible, send keys from {@link ExifInterface}.
+ * If tags are null, a set of default tags will be used. If the tags don't
+ * match with any relevant data, they will not be added to the Bundle.
+ * @return a Bundle of Bundles. If metadata exists within the Bundle, there will also
+ * be a String under DocumentsContract.METADATA_TYPES that will return a String[] of the
+ * types of metadata gathered.
+ *
+ * <pre><code>
+ * Bundle metadata = DocumentsContract.getDocumentMetadata(client, imageDocUri, tags);
+ * int imageLength = metadata.getInt(ExifInterface.TAG_IMAGE_LENGTH);
+ * </code></pre>
+ *
+ * {@hide}
+ */
+ public static Bundle getDocumentMetadata(ContentProviderClient client,
+ Uri documentUri, @Nullable String[] tags) throws RemoteException {
+ final Bundle in = new Bundle();
+ in.putParcelable(EXTRA_URI, documentUri);
+ in.putStringArray(EXTRA_METADATA_TAGS, tags);
+
+ final Bundle out = client.call(METHOD_GET_DOCUMENT_METADATA, null, in);
+
+ if (out == null) {
+ throw new RemoteException("Failed to get a response from getDocumentMetadata");
+ }
+ return out;
+ }
+
+ /**
* Finds the canonical path from the top of the document tree.
*
* The {@link Path#getPath()} of the return value contains the document ID
diff --git a/core/java/android/provider/DocumentsProvider.java b/core/java/android/provider/DocumentsProvider.java
index 3eef31a..4bdcdb0 100644
--- a/core/java/android/provider/DocumentsProvider.java
+++ b/core/java/android/provider/DocumentsProvider.java
@@ -22,6 +22,7 @@
import static android.provider.DocumentsContract.METHOD_DELETE_DOCUMENT;
import static android.provider.DocumentsContract.METHOD_EJECT_ROOT;
import static android.provider.DocumentsContract.METHOD_FIND_DOCUMENT_PATH;
+import static android.provider.DocumentsContract.METHOD_GET_DOCUMENT_METADATA;
import static android.provider.DocumentsContract.METHOD_IS_CHILD_DOCUMENT;
import static android.provider.DocumentsContract.METHOD_MOVE_DOCUMENT;
import static android.provider.DocumentsContract.METHOD_REMOVE_DOCUMENT;
@@ -55,9 +56,7 @@
import android.net.Uri;
import android.os.Bundle;
import android.os.CancellationSignal;
-import android.os.OperationCanceledException;
import android.os.ParcelFileDescriptor;
-import android.os.ParcelFileDescriptor.OnCloseListener;
import android.os.ParcelableException;
import android.provider.DocumentsContract.Document;
import android.provider.DocumentsContract.Path;
@@ -627,6 +626,12 @@
throw new UnsupportedOperationException("Eject not supported");
}
+ /** {@hide} */
+ public @Nullable Bundle getDocumentMetadata(String documentId, @Nullable String[] tags)
+ throws FileNotFoundException {
+ throw new UnsupportedOperationException("Metadata not supported");
+ }
+
/**
* Return concrete MIME type of the requested document. Must match the value
* of {@link Document#COLUMN_MIME_TYPE} for this document. The default
@@ -1136,6 +1141,9 @@
}
out.putParcelable(DocumentsContract.EXTRA_RESULT, path);
+ } else if (METHOD_GET_DOCUMENT_METADATA.equals(method)) {
+ return getDocumentMetadata(
+ documentId, extras.getStringArray(DocumentsContract.EXTRA_METADATA_TAGS));
} else {
throw new UnsupportedOperationException("Method not supported " + method);
}
diff --git a/core/java/android/provider/Downloads.java b/core/java/android/provider/Downloads.java
index 9d83bd7..a2c5a92 100644
--- a/core/java/android/provider/Downloads.java
+++ b/core/java/android/provider/Downloads.java
@@ -485,6 +485,7 @@
* partition. This option is only used by system apps and so it requires
* android.permission.ACCESS_CACHE_FILESYSTEM permission.
*/
+ @Deprecated
public static final int DESTINATION_SYSTEMCACHE_PARTITION = 5;
/**
diff --git a/core/java/android/provider/MetadataReader.java b/core/java/android/provider/MetadataReader.java
new file mode 100644
index 0000000..2d1fca0
--- /dev/null
+++ b/core/java/android/provider/MetadataReader.java
@@ -0,0 +1,285 @@
+/*
+ * Copyright (C) 2017 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;
+
+import android.annotation.Nullable;
+import android.media.ExifInterface;
+import android.os.Bundle;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Class providing support for extracting metadata from a file as a
+ * {@link Bundle} suitable for use with {@link DocumentsContract#getDocumentMetadata}.
+ * <p>Currently only EXIF data is supported.
+ * <p>TODO: Add support for common video and audio types, as well as PDF files.
+ * {@hide}
+ */
+public final class MetadataReader {
+
+ private MetadataReader() {
+ }
+
+ private static final String[] DEFAULT_EXIF_TAGS = {
+ ExifInterface.TAG_IMAGE_WIDTH,
+ ExifInterface.TAG_IMAGE_LENGTH,
+ ExifInterface.TAG_DATETIME,
+ ExifInterface.TAG_GPS_LATITUDE,
+ ExifInterface.TAG_GPS_LONGITUDE,
+ ExifInterface.TAG_MAKE,
+ ExifInterface.TAG_MODEL,
+ ExifInterface.TAG_APERTURE,
+ ExifInterface.TAG_SHUTTER_SPEED_VALUE
+ };
+
+ private static final Map<String, Integer> TYPE_MAPPING = new HashMap<>();
+ private static final String[] ALL_KNOWN_EXIF_KEYS;
+ private static final int TYPE_INT = 0;
+ private static final int TYPE_DOUBLE = 1;
+ private static final int TYPE_STRING = 2;
+
+ static {
+ // TODO: Move this over to ExifInterface.java
+ // Since each ExifInterface item has a type, and there's currently no way to get the type
+ // from the tag, here we identify the tag to the type so that we can call the correct
+ // ExifInterface method
+ TYPE_MAPPING.put(ExifInterface.TAG_ARTIST, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_BITS_PER_SAMPLE, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_COMPRESSION, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_COPYRIGHT, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_DATETIME, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_IMAGE_DESCRIPTION, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_IMAGE_LENGTH, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_IMAGE_WIDTH, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_JPEG_INTERCHANGE_FORMAT, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_JPEG_INTERCHANGE_FORMAT_LENGTH, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_MAKE, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_MODEL, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_ORIENTATION, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_PHOTOMETRIC_INTERPRETATION, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_PLANAR_CONFIGURATION, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_PRIMARY_CHROMATICITIES, TYPE_DOUBLE);
+ TYPE_MAPPING.put(ExifInterface.TAG_REFERENCE_BLACK_WHITE, TYPE_DOUBLE);
+ TYPE_MAPPING.put(ExifInterface.TAG_RESOLUTION_UNIT, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_ROWS_PER_STRIP, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_SAMPLES_PER_PIXEL, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_SOFTWARE, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_STRIP_BYTE_COUNTS, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_STRIP_OFFSETS, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_TRANSFER_FUNCTION, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_WHITE_POINT, TYPE_DOUBLE);
+ TYPE_MAPPING.put(ExifInterface.TAG_X_RESOLUTION, TYPE_DOUBLE);
+ TYPE_MAPPING.put(ExifInterface.TAG_Y_CB_CR_COEFFICIENTS, TYPE_DOUBLE);
+ TYPE_MAPPING.put(ExifInterface.TAG_Y_CB_CR_POSITIONING, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_Y_CB_CR_SUB_SAMPLING, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_Y_RESOLUTION, TYPE_DOUBLE);
+ TYPE_MAPPING.put(ExifInterface.TAG_APERTURE_VALUE, TYPE_DOUBLE);
+ TYPE_MAPPING.put(ExifInterface.TAG_BRIGHTNESS_VALUE, TYPE_DOUBLE);
+ TYPE_MAPPING.put(ExifInterface.TAG_CFA_PATTERN, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_COLOR_SPACE, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_COMPONENTS_CONFIGURATION, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_COMPRESSED_BITS_PER_PIXEL, TYPE_DOUBLE);
+ TYPE_MAPPING.put(ExifInterface.TAG_CONTRAST, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_CUSTOM_RENDERED, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_DATETIME_DIGITIZED, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_DATETIME_ORIGINAL, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_DEVICE_SETTING_DESCRIPTION, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_DIGITAL_ZOOM_RATIO, TYPE_DOUBLE);
+ TYPE_MAPPING.put(ExifInterface.TAG_EXIF_VERSION, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_EXPOSURE_BIAS_VALUE, TYPE_DOUBLE);
+ TYPE_MAPPING.put(ExifInterface.TAG_EXPOSURE_INDEX, TYPE_DOUBLE);
+ TYPE_MAPPING.put(ExifInterface.TAG_EXPOSURE_MODE, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_EXPOSURE_PROGRAM, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_EXPOSURE_TIME, TYPE_DOUBLE);
+ TYPE_MAPPING.put(ExifInterface.TAG_F_NUMBER, TYPE_DOUBLE);
+ TYPE_MAPPING.put(ExifInterface.TAG_FILE_SOURCE, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_FLASH, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_FLASH_ENERGY, TYPE_DOUBLE);
+ TYPE_MAPPING.put(ExifInterface.TAG_FLASHPIX_VERSION, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_FOCAL_LENGTH, TYPE_DOUBLE);
+ TYPE_MAPPING.put(ExifInterface.TAG_FOCAL_LENGTH_IN_35MM_FILM, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_FOCAL_PLANE_RESOLUTION_UNIT, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_FOCAL_PLANE_X_RESOLUTION, TYPE_DOUBLE);
+ TYPE_MAPPING.put(ExifInterface.TAG_FOCAL_PLANE_Y_RESOLUTION, TYPE_DOUBLE);
+ TYPE_MAPPING.put(ExifInterface.TAG_GAIN_CONTROL, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_ISO_SPEED_RATINGS, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_IMAGE_UNIQUE_ID, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_LIGHT_SOURCE, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_MAKER_NOTE, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_MAX_APERTURE_VALUE, TYPE_DOUBLE);
+ TYPE_MAPPING.put(ExifInterface.TAG_METERING_MODE, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_NEW_SUBFILE_TYPE, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_OECF, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_PIXEL_X_DIMENSION, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_PIXEL_Y_DIMENSION, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_RELATED_SOUND_FILE, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_SATURATION, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_SCENE_CAPTURE_TYPE, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_SCENE_TYPE, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_SENSING_METHOD, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_SHARPNESS, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_SHUTTER_SPEED_VALUE, TYPE_DOUBLE);
+ TYPE_MAPPING.put(ExifInterface.TAG_SPATIAL_FREQUENCY_RESPONSE, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_SPECTRAL_SENSITIVITY, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_SUBFILE_TYPE, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_SUBSEC_TIME, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_SUBSEC_TIME_DIGITIZED, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_SUBSEC_TIME_ORIGINAL, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_SUBJECT_AREA, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_SUBJECT_DISTANCE, TYPE_DOUBLE);
+ TYPE_MAPPING.put(ExifInterface.TAG_SUBJECT_DISTANCE_RANGE, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_SUBJECT_LOCATION, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_USER_COMMENT, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_WHITE_BALANCE, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_GPS_ALTITUDE, TYPE_DOUBLE);
+ TYPE_MAPPING.put(ExifInterface.TAG_GPS_ALTITUDE_REF, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_GPS_AREA_INFORMATION, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_GPS_DOP, TYPE_DOUBLE);
+ TYPE_MAPPING.put(ExifInterface.TAG_GPS_DATESTAMP, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_GPS_DEST_BEARING, TYPE_DOUBLE);
+ TYPE_MAPPING.put(ExifInterface.TAG_GPS_DEST_BEARING_REF, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_GPS_DEST_DISTANCE, TYPE_DOUBLE);
+ TYPE_MAPPING.put(ExifInterface.TAG_GPS_DEST_DISTANCE_REF, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_GPS_DEST_LATITUDE, TYPE_DOUBLE);
+ TYPE_MAPPING.put(ExifInterface.TAG_GPS_DEST_LATITUDE_REF, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_GPS_DEST_LONGITUDE, TYPE_DOUBLE);
+ TYPE_MAPPING.put(ExifInterface.TAG_GPS_DEST_LONGITUDE_REF, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_GPS_DIFFERENTIAL, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_GPS_IMG_DIRECTION, TYPE_DOUBLE);
+ TYPE_MAPPING.put(ExifInterface.TAG_GPS_IMG_DIRECTION_REF, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_GPS_LATITUDE, TYPE_DOUBLE);
+ TYPE_MAPPING.put(ExifInterface.TAG_GPS_LATITUDE_REF, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_GPS_LONGITUDE, TYPE_DOUBLE);
+ TYPE_MAPPING.put(ExifInterface.TAG_GPS_LONGITUDE_REF, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_GPS_MAP_DATUM, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_GPS_MEASURE_MODE, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_GPS_PROCESSING_METHOD, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_GPS_SATELLITES, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_GPS_SPEED, TYPE_DOUBLE);
+ TYPE_MAPPING.put(ExifInterface.TAG_GPS_SPEED_REF, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_GPS_STATUS, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_GPS_TIMESTAMP, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_GPS_TRACK, TYPE_DOUBLE);
+ TYPE_MAPPING.put(ExifInterface.TAG_GPS_TRACK_REF, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_GPS_VERSION_ID, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_INTEROPERABILITY_INDEX, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_THUMBNAIL_IMAGE_LENGTH, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_THUMBNAIL_IMAGE_WIDTH, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_DNG_VERSION, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_DEFAULT_CROP_SIZE, TYPE_INT);
+ //I don't know how to represent this. Type is unknown
+ //TYPE_MAPPING.put(ExifInterface.TAG_ORF_THUMBNAIL_IMAGE, TYPE_STRING);
+ TYPE_MAPPING.put(ExifInterface.TAG_ORF_PREVIEW_IMAGE_START, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_ORF_PREVIEW_IMAGE_LENGTH, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_ORF_ASPECT_FRAME, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_RW2_SENSOR_BOTTOM_BORDER, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_RW2_SENSOR_LEFT_BORDER, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_RW2_SENSOR_RIGHT_BORDER, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_RW2_SENSOR_TOP_BORDER, TYPE_INT);
+ TYPE_MAPPING.put(ExifInterface.TAG_RW2_ISO, TYPE_INT);
+ ALL_KNOWN_EXIF_KEYS = TYPE_MAPPING.keySet().toArray(new String[TYPE_MAPPING.size()]);
+ }
+ private static final String JPG_MIME_TYPE = "image/jpg";
+ private static final String JPEG_MIME_TYPE = "image/jpeg";
+
+ /**
+ * Generic metadata retrieval method that can retrieve any available metadata from a given doc
+ * Currently only functions for exifdata
+ *
+ * @param metadata the bundle to which we add any relevant metadata
+ * @param stream InputStream containing a file
+ * @param mimeType type of the given file
+ * @param tags a variable amount of keys to differentiate which tags the user wants
+ * if null, returns a default set of data from the following keys:
+ * Exif data:
+ * ExifInterface.TAG_IMAGE_WIDTH,
+ * ExifInterface.TAG_IMAGE_LENGTH,
+ * ExifInterface.TAG_DATETIME,
+ * ExifInterface.TAG_GPS_LATITUDE,
+ * ExifInterface.TAG_GPS_LONGITUDE,
+ * ExifInterface.TAG_MAKE,
+ * ExifInterface.TAG_MODEL,
+ * ExifInterface.TAG_APERTURE,
+ * ExifInterface.TAG_SHUTTER_SPEED_VALUE
+ * @throws IOException when the file doesn't exist
+ */
+ public static void getMetadata(Bundle metadata, InputStream stream, String mimeType,
+ @Nullable String[] tags) throws IOException {
+ List<String> metadataTypes = new ArrayList();
+ if (mimeType.equals(JPG_MIME_TYPE) || mimeType.equals(JPEG_MIME_TYPE)) {
+ ExifInterface exifInterface = new ExifInterface(stream);
+ Bundle exifData = getExifData(exifInterface, tags);
+ if (exifData.size() > 0) {
+ metadata.putBundle(DocumentsContract.METADATA_EXIF, exifData);
+ metadataTypes.add(DocumentsContract.METADATA_EXIF);
+ }
+ }
+ metadata.putStringArray(DocumentsContract.METADATA_TYPES,
+ metadataTypes.toArray(new String[metadataTypes.size()]));
+ // TODO: Add support for PDF and Video metadata
+ // TODO: Broaden image support to all images
+ }
+
+ /**
+ * Helper method that is called if getMetadata is called for an image mimeType.
+ *
+ * @param exif the bundle to which we add exif data.
+ * @param exifInterface an ExifInterface for an image
+ * @param tags a list of ExifInterface tags that are used to retrieve data.
+ * if null, returns a default set of data from the following keys:
+ * ExifInterface.TAG_IMAGE_WIDTH,
+ * ExifInterface.TAG_IMAGE_LENGTH,
+ * ExifInterface.TAG_DATETIME,
+ * ExifInterface.TAG_GPS_LATITUDE,
+ * ExifInterface.TAG_GPS_LONGITUDE,
+ * ExifInterface.TAG_MAKE,
+ * ExifInterface.TAG_MODEL,
+ * ExifInterface.TAG_APERTURE,
+ * ExifInterface.TAG_SHUTTER_SPEED_VALUE
+ */
+ private static Bundle getExifData(ExifInterface exifInterface, @Nullable String[] tags)
+ throws IOException {
+ if (tags == null) {
+ tags = DEFAULT_EXIF_TAGS;
+ }
+ Bundle exif = new Bundle();
+ for (int i = 0; i < tags.length; i++) {
+ if (TYPE_MAPPING.get(tags[i]).equals(TYPE_INT)) {
+ int data = exifInterface.getAttributeInt(tags[i], Integer.MIN_VALUE);
+ if (data != Integer.MIN_VALUE) {
+ exif.putInt(tags[i], data);
+ }
+ } else if (TYPE_MAPPING.get(tags[i]).equals(TYPE_DOUBLE)) {
+ double data = exifInterface.getAttributeDouble(tags[i], Double.MIN_VALUE);
+ if (data != Double.MIN_VALUE) {
+ exif.putDouble(tags[i], data);
+ }
+ } else if (TYPE_MAPPING.get(tags[i]).equals(TYPE_STRING)) {
+ String data = exifInterface.getAttribute(tags[i]);
+ if (data != null) {
+ exif.putString(tags[i], data);
+ }
+ }
+ }
+ return exif;
+ }
+}
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 2d8ed7a..53c82e6 100755
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -31,6 +31,7 @@
import android.app.AppOpsManager;
import android.app.Application;
import android.app.NotificationChannel;
+import android.app.NotificationManager;
import android.app.SearchManager;
import android.app.WallpaperManager;
import android.content.ComponentName;
@@ -194,6 +195,24 @@
"android.settings.AIRPLANE_MODE_SETTINGS";
/**
+ * Activity Action: Show mobile data usage list.
+ * <p>
+ * Input: {@link EXTRA_NETWORK_TEMPLATE} and {@link EXTRA_SUB_ID} should be included to specify
+ * how and what mobile data statistics should be collected.
+ * <p>
+ * Output: Nothing
+ * @hide
+ */
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+ public static final String ACTION_MOBILE_DATA_USAGE =
+ "android.settings.MOBILE_DATA_USAGE";
+
+ /** @hide */
+ public static final String EXTRA_NETWORK_TEMPLATE = "network_template";
+ /** @hide */
+ public static final String EXTRA_SUB_ID = "sub_id";
+
+ /**
* Activity Action: Modify Airplane mode settings using a voice command.
* <p>
* In some cases, a matching Activity may not exist, so ensure you safeguard against this.
@@ -291,10 +310,7 @@
/**
* Activity Action: Show settings to allow configuration of trusted external sources
- * <p>
- * In some cases, a matching Activity may not exist, so ensure you
- * safeguard against this.
- * <p>
+ *
* Input: Optionally, the Intent's data URI can specify the application package name to
* directly invoke the management GUI specific to the package name. For example
* "package:com.my.app".
@@ -3988,6 +4004,15 @@
};
/**
+ * Keys we no longer back up under the current schema, but want to continue to
+ * process when restoring historical backup datasets.
+ *
+ * @hide
+ */
+ public static final String[] LEGACY_RESTORE_SETTINGS = {
+ };
+
+ /**
* These are all public system settings
*
* @hide
@@ -5228,6 +5253,7 @@
* Whether the current user has been set up via setup wizard (0 = false, 1 = true)
* @hide
*/
+ @TestApi
public static final String USER_SETUP_COMPLETE = "user_setup_complete";
/**
@@ -6630,28 +6656,36 @@
public static final String ASSIST_DISCLOSURE_ENABLED = "assist_disclosure_enabled";
/**
- * Name of the service components that the current user has explicitly allowed to
+ * Read only list of the service components that the current user has explicitly allowed to
* see and assist with all of the user's notifications.
*
+ * @deprecated Use
+ * {@link NotificationManager#isNotificationListenerAccessGranted(ComponentName)}.
* @hide
*/
+ @Deprecated
public static final String ENABLED_NOTIFICATION_ASSISTANT =
"enabled_notification_assistant";
/**
- * Names of the service components that the current user has explicitly allowed to
+ * Read only list of the service components that the current user has explicitly allowed to
* see all of the user's notifications, separated by ':'.
*
* @hide
+ * @deprecated Use
+ * {@link NotificationManager#isNotificationAssistantAccessGranted(ComponentName)}.
*/
+ @Deprecated
public static final String ENABLED_NOTIFICATION_LISTENERS = "enabled_notification_listeners";
/**
- * Names of the packages that the current user has explicitly allowed to
- * manage notification policy configuration, separated by ':'.
+ * Read only list of the packages that the current user has explicitly allowed to
+ * manage do not disturb, separated by ':'.
*
+ * @deprecated Use {@link NotificationManager#isNotificationPolicyAccessGranted()}.
* @hide
*/
+ @Deprecated
@TestApi
public static final String ENABLED_NOTIFICATION_POLICY_ACCESS_PACKAGES =
"enabled_notification_policy_access_packages";
@@ -7088,7 +7122,6 @@
AUTOFILL_SERVICE,
ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE,
ENABLED_ACCESSIBILITY_SERVICES,
- ENABLED_NOTIFICATION_LISTENERS,
ENABLED_VR_LISTENERS,
ENABLED_INPUT_METHODS,
TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES,
@@ -7170,6 +7203,13 @@
SCREENSAVER_ACTIVATE_ON_SLEEP,
};
+ /** @hide */
+ public static final String[] LEGACY_RESTORE_SETTINGS = {
+ ENABLED_NOTIFICATION_LISTENERS,
+ ENABLED_NOTIFICATION_ASSISTANT,
+ ENABLED_NOTIFICATION_POLICY_ACCESS_PACKAGES
+ };
+
/**
* These entries are considered common between the personal and the managed profile,
* since the managed profile doesn't get to change them.
@@ -7704,6 +7744,16 @@
*/
public static final String CDMA_SUBSCRIPTION_MODE = "subscription_mode";
+ /**
+ * The default value for whether background data is enabled or not.
+ *
+ * Used by {@code NetworkPolicyManagerService}.
+ *
+ * @hide
+ */
+ public static final String DEFAULT_RESTRICT_BACKGROUND_DATA =
+ "default_restrict_background_data";
+
/** Inactivity timeout to track mobile data activity.
*
* If set to a positive integer, it indicates the inactivity timeout value in seconds to
@@ -9190,9 +9240,11 @@
* gc_min_interval (long)
* full_pss_min_interval (long)
* full_pss_lowered_interval (long)
- * power_check_delay (long)
- * wake_lock_min_check_duration (long)
- * cpu_min_check_duration (long)
+ * power_check_interval (long)
+ * power_check_max_cpu_1 (int)
+ * power_check_max_cpu_2 (int)
+ * power_check_max_cpu_3 (int)
+ * power_check_max_cpu_4 (int)
* service_usage_interaction_time (long)
* usage_stats_interaction_interval (long)
* service_restart_duration (long)
@@ -10179,6 +10231,10 @@
BLUETOOTH_ON
};
+ /** @hide */
+ public static final String[] LEGACY_RESTORE_SETTINGS = {
+ };
+
private static final ContentProviderHolder sProviderHolder =
new ContentProviderHolder(CONTENT_URI);
diff --git a/core/java/android/provider/TimeZoneRulesDataContract.java b/core/java/android/provider/TimeZoneRulesDataContract.java
index 19e914b..33d2588 100644
--- a/core/java/android/provider/TimeZoneRulesDataContract.java
+++ b/core/java/android/provider/TimeZoneRulesDataContract.java
@@ -16,6 +16,7 @@
package android.provider;
+import android.annotation.SystemApi;
import android.net.Uri;
/**
@@ -24,7 +25,7 @@
*
* @hide
*/
-// TODO(nfuller): Expose necessary APIs for OEMs with @SystemApi. http://b/31008728
+@SystemApi
public final class TimeZoneRulesDataContract {
private TimeZoneRulesDataContract() {}
@@ -40,75 +41,80 @@
private static final Uri AUTHORITY_URI = Uri.parse("content://" + AUTHORITY);
/**
- * The content:// style URI for determining what type of update is available.
- *
- * <p>The URI can be queried using
- * {@link android.content.ContentProvider#query(Uri, String[], String, String[], String)};
- * the result will be a cursor with a single row. If the {@link #COLUMN_OPERATION}
- * column is {@link #OPERATION_INSTALL} then see {@link #DATA_URI} for how to obtain the
- * binary data.
+ * Defines fields exposed through the {@link Operation#CONTENT_URI} for describing a time zone
+ * distro operation.
*/
- public static final Uri OPERATION_URI = Uri.withAppendedPath(AUTHORITY_URI, "operation");
+ public static final class Operation {
- /**
- * The {@code String} column of the {@link #OPERATION_URI} that provides an int specifying the
- * type of operation to perform. See {@link #OPERATION_NO_OP}, {@link #OPERATION_UNINSTALL} and
- * {@link #OPERATION_INSTALL}.
- */
- public static final String COLUMN_OPERATION = "operation";
+ /** Not instantiable. */
+ private Operation() {
+ }
- /**
- * An operation type used when the time zone rules on device should be left as they are.
- * This is not expected to be used in normal operation but a safe result in the event of an
- * error that cannot be recovered from.
- */
- public static final String OPERATION_NO_OP = "NOOP";
+ /**
+ * The content:// style URI for determining what type of update is available.
+ *
+ * <p>The URI can be queried using
+ * {@link android.content.ContentProvider#query(Uri, String[], String, String[], String)};
+ * the result will be a cursor with a single row. If the {@link Operation#COLUMN_TYPE}
+ * column is {@link Operation#TYPE_INSTALL} then
+ * {@link android.content.ContentProvider#openFile(Uri, String)} can be used with "r" mode
+ * to obtain the binary data.
+ */
+ public static final Uri CONTENT_URI = Uri.withAppendedPath(AUTHORITY_URI, "operation");
- /**
- * An operation type used when the current time zone rules on device should be uninstalled,
- * returning to the values held in the system partition.
- */
- public static final String OPERATION_UNINSTALL = "UNINSTALL";
+ /**
+ * The {@code String} column of the {@link #CONTENT_URI} that provides an int specifying
+ * the type of operation to perform. See {@link #TYPE_NO_OP},
+ * {@link #TYPE_UNINSTALL} and {@link #TYPE_INSTALL}.
+ */
+ public static final String COLUMN_TYPE = "type";
- /**
- * An operation type used when the current time zone rules on device should be replaced by
- * a new set obtained via the {@link android.content.ContentProvider#openFile(Uri, String)}
- * method.
- */
- public static final String OPERATION_INSTALL = "INSTALL";
+ /**
+ * An operation type used when the current time zone rules on device should be replaced by
+ * a new set obtained via the {@link android.content.ContentProvider#openFile(Uri, String)}
+ * method.
+ */
+ public static final String TYPE_INSTALL = "INSTALL";
- /**
- * The {@code nullable int} column of the {@link #OPERATION_URI} that describes the major
- * version of the distro to be installed.
- * Only non-null if {@link #COLUMN_OPERATION} contains {@link #OPERATION_INSTALL}.
- */
- public static final String COLUMN_DISTRO_MAJOR_VERSION = "distro_major_version";
+ /**
+ * An operation type used when the current time zone rules on device should be uninstalled,
+ * returning to the values held in the system partition.
+ */
+ public static final String TYPE_UNINSTALL = "UNINSTALL";
- /**
- * The {@code nullable int} column of the {@link #OPERATION_URI} that describes the minor
- * version of the distro to be installed.
- * Only non-null if {@link #COLUMN_OPERATION} contains {@link #OPERATION_INSTALL}.
- */
- public static final String COLUMN_DISTRO_MINOR_VERSION = "distro_minor_version";
+ /**
+ * An operation type used when the time zone rules on device should be left as they are.
+ * This is not expected to be used in normal operation but a safe result in the event of an
+ * error that cannot be recovered from.
+ */
+ public static final String TYPE_NO_OP = "NOOP";
- /**
- * The {@code nullable String} column of the {@link #OPERATION_URI} that describes the IANA
- * rules version of the distro to be installed.
- * Only non-null if {@link #COLUMN_OPERATION} contains {@link #OPERATION_INSTALL}.
- */
- public static final String COLUMN_RULES_VERSION = "rules_version";
+ /**
+ * The {@code nullable int} column of the {@link #CONTENT_URI} that describes the major
+ * version of the distro to be installed.
+ * Only non-null if {@link #COLUMN_TYPE} contains {@link #TYPE_INSTALL}.
+ */
+ public static final String COLUMN_DISTRO_MAJOR_VERSION = "distro_major_version";
- /**
- * The {@code nullable int} column of the {@link #OPERATION_URI} that describes the revision
- * number of the distro to be installed.
- * Only non-null if {@link #COLUMN_OPERATION} contains {@link #OPERATION_INSTALL}.
- */
- public static final String COLUMN_REVISION = "revision";
+ /**
+ * The {@code nullable int} column of the {@link #CONTENT_URI} that describes the minor
+ * version of the distro to be installed.
+ * Only non-null if {@link #COLUMN_TYPE} contains {@link #TYPE_INSTALL}.
+ */
+ public static final String COLUMN_DISTRO_MINOR_VERSION = "distro_minor_version";
- /**
- * The content:// style URI for obtaining time zone bundle data.
- *
- * <p>Use {@link android.content.ContentProvider#openFile(Uri, String)} with "r" mode.
- */
- public static final Uri DATA_URI = Uri.withAppendedPath(AUTHORITY_URI, "data");
+ /**
+ * The {@code nullable String} column of the {@link #CONTENT_URI} that describes the IANA
+ * rules version of the distro to be installed.
+ * Only non-null if {@link #COLUMN_TYPE} contains {@link #TYPE_INSTALL}.
+ */
+ public static final String COLUMN_RULES_VERSION = "rules_version";
+
+ /**
+ * The {@code nullable int} column of the {@link #CONTENT_URI} that describes the revision
+ * number of the distro to be installed.
+ * Only non-null if {@link #COLUMN_TYPE} contains {@link #TYPE_INSTALL}.
+ */
+ public static final String COLUMN_REVISION = "revision";
+ }
}
diff --git a/core/java/android/service/autofill/CharSequenceTransformation.java b/core/java/android/service/autofill/CharSequenceTransformation.java
new file mode 100644
index 0000000..dfb30b9
--- /dev/null
+++ b/core/java/android/service/autofill/CharSequenceTransformation.java
@@ -0,0 +1,219 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.service.autofill;
+
+import static android.view.autofill.Helper.sDebug;
+
+import android.annotation.NonNull;
+import android.annotation.TestApi;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.util.ArrayMap;
+import android.util.Log;
+import android.util.Pair;
+import android.view.autofill.AutofillId;
+import android.widget.RemoteViews;
+import android.widget.TextView;
+
+import com.android.internal.util.Preconditions;
+
+import java.util.regex.Pattern;
+
+/**
+ * Replaces a {@link TextView} child of a {@link CustomDescription} with the contents of one or
+ * more regular expressions (regexs).
+ *
+ * <p>When it contains more than one field, the fields that match their regex are added to the
+ * overall transformation result.
+ *
+ * <p>For example, a transformation to mask a credit card number contained in just one field would
+ * be:
+ *
+ * <pre class="prettyprint">
+ * new CharSequenceTransformation
+ * .Builder(ccNumberId, Pattern.compile("^.*(\\d\\d\\d\\d)$"), "...$1")
+ * .build();
+ * </pre>
+ *
+ * <p>But a transformation that generates a {@code Exp: MM / YYYY} credit expiration date from two
+ * fields (month and year) would be:
+ *
+ * <pre class="prettyprint">
+ * new CharSequenceTransformation.Builder(ccExpMonthId, Pattern.compile("^(\\d\\d)$"), "Exp: $1")
+ * .addField(ccExpYearId, Pattern.compile("^(\\d\\d\\d\\d)$"), " / $1");
+ * </pre>
+ */
+public final class CharSequenceTransformation extends InternalTransformation implements
+ Transformation, Parcelable {
+ private static final String TAG = "CharSequenceTransformation";
+ @NonNull private final ArrayMap<AutofillId, Pair<Pattern, String>> mFields;
+
+ private CharSequenceTransformation(Builder builder) {
+ mFields = builder.mFields;
+ }
+
+ /** @hide */
+ @Override
+ @TestApi
+ public void apply(@NonNull ValueFinder finder, @NonNull RemoteViews parentTemplate,
+ int childViewId) throws Exception {
+ final StringBuilder converted = new StringBuilder();
+ final int size = mFields.size();
+ if (sDebug) Log.d(TAG, size + " multiple fields on id " + childViewId);
+ for (int i = 0; i < size; i++) {
+ final AutofillId id = mFields.keyAt(i);
+ final Pair<Pattern, String> field = mFields.valueAt(i);
+ final String value = finder.findByAutofillId(id);
+ if (value == null) {
+ Log.w(TAG, "No value for id " + id);
+ return;
+ }
+ try {
+ // replaceAll throws an exception if the subst is invalid
+ final String convertedValue = field.first.matcher(value).replaceAll(field.second);
+ converted.append(convertedValue);
+ } catch (Exception e) {
+ // Do not log full exception to avoid PII leaking
+ Log.w(TAG, "Cannot apply " + field.first.pattern() + "->" + field.second + " to "
+ + "field with autofill id" + id + ": " + e.getClass());
+ throw e;
+ }
+ }
+ parentTemplate.setCharSequence(childViewId, "setText", converted);
+ }
+
+ /**
+ * Builder for {@link CharSequenceTransformation} objects.
+ */
+ public static class Builder {
+ @NonNull private final ArrayMap<AutofillId, Pair<Pattern, String>> mFields =
+ new ArrayMap<>();
+ private boolean mDestroyed;
+
+ /**
+ * Creates a new builder and adds the first transformed contents of a field to the overall
+ * result of this transformation.
+ *
+ * @param id id of the screen field.
+ * @param regex regular expression with groups (delimited by {@code (} and {@code (}) that
+ * are used to substitute parts of the value.
+ * @param subst the string that substitutes the matched regex, using {@code $} for
+ * group substitution ({@code $1} for 1st group match, {@code $2} for 2nd, etc).
+ */
+ public Builder(@NonNull AutofillId id, @NonNull Pattern regex, @NonNull String subst) {
+ addField(id, regex, subst);
+ }
+
+ /**
+ * Adds the transformed contents of a field to the overall result of this transformation.
+ *
+ * @param id id of the screen field.
+ * @param regex regular expression with groups (delimited by {@code (} and {@code (}) that
+ * are used to substitute parts of the value.
+ * @param subst the string that substitutes the matched regex, using {@code $} for
+ * group substitution ({@code $1} for 1st group match, {@code $2} for 2nd, etc).
+ *
+ * @return this builder.
+ */
+ public Builder addField(@NonNull AutofillId id, @NonNull Pattern regex,
+ @NonNull String subst) {
+ throwIfDestroyed();
+ Preconditions.checkNotNull(id);
+ Preconditions.checkNotNull(regex);
+ Preconditions.checkNotNull(subst);
+
+ mFields.put(id, new Pair<>(regex, subst));
+ return this;
+ }
+
+ /**
+ * Creates a new {@link CharSequenceTransformation} instance.
+ */
+ public CharSequenceTransformation build() {
+ throwIfDestroyed();
+ mDestroyed = true;
+ return new CharSequenceTransformation(this);
+ }
+
+ private void throwIfDestroyed() {
+ Preconditions.checkState(!mDestroyed, "Already called build()");
+ }
+ }
+
+ /////////////////////////////////////
+ // Object "contract" methods. //
+ /////////////////////////////////////
+ @Override
+ public String toString() {
+ if (!sDebug) return super.toString();
+
+ return "MultipleViewsCharSequenceTransformation: [fields=" + mFields + "]";
+ }
+
+ /////////////////////////////////////
+ // Parcelable "contract" methods. //
+ /////////////////////////////////////
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel parcel, int flags) {
+ final int size = mFields.size();
+ final AutofillId[] ids = new AutofillId[size];
+ final Pattern[] regexs = new Pattern[size];
+ final String[] substs = new String[size];
+ Pair<Pattern, String> pair;
+ for (int i = 0; i < size; i++) {
+ ids[i] = mFields.keyAt(i);
+ pair = mFields.valueAt(i);
+ regexs[i] = pair.first;
+ substs[i] = pair.second;
+ }
+ parcel.writeParcelableArray(ids, flags);
+ parcel.writeSerializable(regexs);
+ parcel.writeStringArray(substs);
+ }
+
+ public static final Parcelable.Creator<CharSequenceTransformation> CREATOR =
+ new Parcelable.Creator<CharSequenceTransformation>() {
+ @Override
+ public CharSequenceTransformation createFromParcel(Parcel parcel) {
+ final AutofillId[] ids = parcel.readParcelableArray(null, AutofillId.class);
+ final Pattern[] regexs = (Pattern[]) parcel.readSerializable();
+ final String[] substs = parcel.createStringArray();
+
+ // Always go through the builder to ensure the data ingested by
+ // the system obeys the contract of the builder to avoid attacks
+ // using specially crafted parcels.
+ final CharSequenceTransformation.Builder builder =
+ new CharSequenceTransformation.Builder(ids[0], regexs[0], substs[0]);
+
+ final int size = ids.length;
+ for (int i = 1; i < size; i++) {
+ builder.addField(ids[i], regexs[i], substs[i]);
+ }
+ return builder.build();
+ }
+
+ @Override
+ public CharSequenceTransformation[] newArray(int size) {
+ return new CharSequenceTransformation[size];
+ }
+ };
+}
diff --git a/core/java/android/service/autofill/CustomDescription.java b/core/java/android/service/autofill/CustomDescription.java
new file mode 100644
index 0000000..0edb154
--- /dev/null
+++ b/core/java/android/service/autofill/CustomDescription.java
@@ -0,0 +1,224 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.service.autofill;
+
+import static android.view.autofill.Helper.sDebug;
+
+import android.annotation.NonNull;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.util.Log;
+import android.util.SparseArray;
+import android.widget.RemoteViews;
+
+import com.android.internal.util.Preconditions;
+
+/**
+ * Defines a custom description for the Save UI affordance.
+ *
+ * <p>This is useful when the autofill service needs to show a detailed view of what would be saved;
+ * for example, when the screen contains a credit card, it could display a logo of the credit card
+ * bank, the last for digits of the credit card number, and its expiration number.
+ *
+ * <p>A custom description is made of 2 parts:
+ * <ul>
+ * <li>A {@link RemoteViews presentation template} containing children views.
+ * <li>{@link Transformation Transformations} to populate the children views.
+ * </ul>
+ *
+ * <p>For the credit card example mentioned above, the (simplified) template would be:
+ *
+ * <pre class="prettyprint">
+ * <LinearLayout>
+ * <ImageView android:id="@+id/templateccLogo"/>
+ * <TextView android:id="@+id/templateCcNumber"/>
+ * <TextView android:id="@+id/templateExpDate"/>
+ * </LinearLayout>
+ * </pre>
+ *
+ * <p>Which in code translates to:
+ *
+ * <pre class="prettyprint">
+ * CustomDescription.Builder buider = new Builder(new RemoteViews(pgkName, R.layout.cc_template);
+ * </pre>
+ *
+ * <p>Then the value of each of the 3 children would be changed at runtime based on the the value of
+ * the screen fields and the {@link Transformation Transformations}:
+ *
+ * <pre class="prettyprint">
+ * // Image child - different logo for each bank, based on credit card prefix
+ * builder.addChild(R.id.templateccLogo,
+ * new ImageTransformation.Builder(ccNumberId)
+ * .addOption("^4815.*$", R.drawable.ic_credit_card_logo1)
+ * .addOption("^1623.*$", R.drawable.ic_credit_card_logo2)
+ * .addOption("^42.*$", R.drawable.ic_credit_card_logo3);
+ * // Masked credit card number (as .....LAST_4_DIGITS)
+ * builder.addChild(R.id.templateCcNumber, new CharSequenceTransformation.Builder()
+ * .addField(ccNumberId, "^.*(\\d\\d\\d\\d)$", "...$1")
+ * // Expiration date as MM / YYYY:
+ * builder.addChild(R.id.templateExpDate, new CharSequenceTransformation.Builder()
+ * .addField(ccExpMonthId, "^(\\d\\d)$", "Exp: $1")
+ * .addField(ccExpYearId, "^(\\d\\d)$", "/$1");
+ * </pre>
+ *
+ * <p>See {@link ImageTransformation}, {@link CharSequenceTransformation} for more info about these
+ * transformations.
+ */
+public final class CustomDescription implements Parcelable {
+
+ private static final String TAG = "CustomDescription";
+
+ private final RemoteViews mPresentation;
+ private final SparseArray<InternalTransformation> mTransformations;
+
+ private CustomDescription(Builder builder) {
+ mPresentation = builder.mPresentation;
+ mTransformations = builder.mTransformations;
+ }
+
+ /** @hide */
+ public RemoteViews getPresentation(ValueFinder finder) {
+ if (mTransformations != null) {
+ final int size = mTransformations.size();
+ if (sDebug) Log.d(TAG, "getPresentation(): applying " + size + " transformations");
+ for (int i = 0; i < size; i++) {
+ final int id = mTransformations.keyAt(i);
+ final InternalTransformation transformation = mTransformations.valueAt(i);
+ if (sDebug) Log.d(TAG, "#" + i + ": " + transformation);
+
+ try {
+ transformation.apply(finder, mPresentation, id);
+ } catch (Exception e) {
+ // Do not log full exception to avoid PII leaking
+ Log.e(TAG, "Could not apply transformation " + transformation + ": "
+ + e.getClass());
+ return null;
+ }
+ }
+ }
+ return mPresentation;
+ }
+
+ /**
+ * Builder for {@link CustomDescription} objects.
+ */
+ public static class Builder {
+ private final RemoteViews mPresentation;
+
+ private SparseArray<InternalTransformation> mTransformations;
+
+ /**
+ * Default constructor.
+ *
+ * @param parentPresentation template presentation with (optional) children views.
+ */
+ public Builder(RemoteViews parentPresentation) {
+ mPresentation = parentPresentation;
+ }
+
+ /**
+ * Adds a transformation to replace the value of a child view with the fields in the
+ * screen.
+ *
+ * @param id view id of the children view.
+ * @param transformation an implementation provided by the Android System.
+ * @return this builder.
+ * @throws IllegalArgumentException if {@code transformation} is not a class provided
+ * by the Android System.
+ */
+ public Builder addChild(int id, @NonNull Transformation transformation) {
+ Preconditions.checkArgument((transformation instanceof InternalTransformation),
+ "not provided by Android System: " + transformation);
+ if (mTransformations == null) {
+ mTransformations = new SparseArray<>();
+ }
+ mTransformations.put(id, (InternalTransformation) transformation);
+ return this;
+ }
+
+ /**
+ * Creates a new {@link CustomDescription} instance.
+ */
+ public CustomDescription build() {
+ return new CustomDescription(this);
+ }
+ }
+
+ /////////////////////////////////////
+ // Object "contract" methods. //
+ /////////////////////////////////////
+ @Override
+ public String toString() {
+ if (!sDebug) return super.toString();
+
+ return new StringBuilder("CustomDescription: [presentation=")
+ .append(mPresentation)
+ .append(", transformations=").append(mTransformations)
+ .append("]").toString();
+ }
+
+ /////////////////////////////////////
+ // Parcelable "contract" methods. //
+ /////////////////////////////////////
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeParcelable(mPresentation, flags);
+ if (mTransformations == null) {
+ dest.writeIntArray(null);
+ } else {
+ final int size = mTransformations.size();
+ final int[] ids = new int[size];
+ final InternalTransformation[] values = new InternalTransformation[size];
+ for (int i = 0; i < size; i++) {
+ ids[i] = mTransformations.keyAt(i);
+ values[i] = mTransformations.valueAt(i);
+ }
+ dest.writeIntArray(ids);
+ dest.writeParcelableArray(values, flags);
+ }
+ }
+ public static final Parcelable.Creator<CustomDescription> CREATOR =
+ new Parcelable.Creator<CustomDescription>() {
+ @Override
+ public CustomDescription createFromParcel(Parcel parcel) {
+ // Always go through the builder to ensure the data ingested by
+ // the system obeys the contract of the builder to avoid attacks
+ // using specially crafted parcels.
+ final Builder builder = new Builder(parcel.readParcelable(null));
+ final int[] ids = parcel.createIntArray();
+ if (ids != null) {
+ final InternalTransformation[] values =
+ parcel.readParcelableArray(null, InternalTransformation.class);
+ final int size = ids.length;
+ for (int i = 0; i < size; i++) {
+ builder.addChild(ids[i], values[i]);
+ }
+ }
+ return builder.build();
+ }
+
+ @Override
+ public CustomDescription[] newArray(int size) {
+ return new CustomDescription[size];
+ }
+ };
+}
diff --git a/core/java/android/service/autofill/Dataset.java b/core/java/android/service/autofill/Dataset.java
index a2ec099..65b0efc 100644
--- a/core/java/android/service/autofill/Dataset.java
+++ b/core/java/android/service/autofill/Dataset.java
@@ -26,6 +26,7 @@
import android.view.autofill.AutofillId;
import android.view.autofill.AutofillValue;
import android.widget.RemoteViews;
+
import com.android.internal.util.Preconditions;
import java.util.ArrayList;
diff --git a/core/java/android/service/autofill/FillResponse.java b/core/java/android/service/autofill/FillResponse.java
index e13fdf6..95e8c88 100644
--- a/core/java/android/service/autofill/FillResponse.java
+++ b/core/java/android/service/autofill/FillResponse.java
@@ -23,15 +23,16 @@
import android.annotation.Nullable;
import android.app.Activity;
import android.content.IntentSender;
+import android.content.pm.ParceledListSlice;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.view.autofill.AutofillId;
-import android.view.autofill.AutofillManager;
import android.widget.RemoteViews;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.List;
/**
* Response for a {@link
@@ -41,7 +42,7 @@
*/
public final class FillResponse implements Parcelable {
- private final @Nullable ArrayList<Dataset> mDatasets;
+ private final @Nullable ParceledListSlice<Dataset> mDatasets;
private final @Nullable SaveInfo mSaveInfo;
private final @Nullable Bundle mClientState;
private final @Nullable RemoteViews mPresentation;
@@ -51,7 +52,7 @@
private int mRequestId;
private FillResponse(@NonNull Builder builder) {
- mDatasets = builder.mDatasets;
+ mDatasets = (builder.mDatasets != null) ? new ParceledListSlice<>(builder.mDatasets) : null;
mSaveInfo = builder.mSaveInfo;
mClientState = builder.mCLientState;
mPresentation = builder.mPresentation;
@@ -67,8 +68,8 @@
}
/** @hide */
- public @Nullable ArrayList<Dataset> getDatasets() {
- return mDatasets;
+ public @Nullable List<Dataset> getDatasets() {
+ return (mDatasets != null) ? mDatasets.getList() : null;
}
/** @hide */
@@ -143,12 +144,13 @@
* for the user to trigger your authentication flow.
*
* <p>When a user triggers autofill, the system launches the provided intent
- * whose extras will have the {@link AutofillManager#EXTRA_ASSIST_STRUCTURE screen
+ * whose extras will have the
+ * {@link android.view.autofill.AutofillManager#EXTRA_ASSIST_STRUCTURE screen
* content} and your {@link android.view.autofill.AutofillManager#EXTRA_CLIENT_STATE
* client state}. Once you complete your authentication flow you should set the
* {@link Activity} result to {@link android.app.Activity#RESULT_OK} and provide the fully
- * populated {@link FillResponse response} by setting it to the {@link
- * AutofillManager#EXTRA_AUTHENTICATION_RESULT} extra.
+ * populated {@link FillResponse response} by setting it to the
+ * {@link android.view.autofill.AutofillManager#EXTRA_AUTHENTICATION_RESULT} extra.
* For example, if you provided an empty {@link FillResponse resppnse} because the
* user's data was locked and marked that the response needs an authentication then
* in the response returned if authentication succeeds you need to provide all
@@ -205,6 +207,15 @@
/**
* Adds a new {@link Dataset} to this response.
*
+ * <p><b>Note: </b> on Android {@link android.os.Build.VERSION_CODES#O}, the total number of
+ * datasets is limited by the Binder transaction size, so it's recommended to keep it
+ * small (in the range of 10-20 at most) and use pagination by adding a fake
+ * {@link Dataset.Builder#setAuthentication(IntentSender) authenticated} at the end with
+ * a presentation string like "Next 10" that would return a new {@link FillResponse} with
+ * the next 10 datasets, and so on. This limitation was lifted on
+ * Android {@link android.os.Build.VERSION_CODES#O_MR1}, although the Binder transaction
+ * size can still be reached if each dataset itself is too big.
+ *
* @return This builder.
*/
public @NonNull Builder addDataset(@Nullable Dataset dataset) {
@@ -313,7 +324,7 @@
@Override
public void writeToParcel(Parcel parcel, int flags) {
- parcel.writeTypedArrayList(mDatasets, flags);
+ parcel.writeParcelable(mDatasets, flags);
parcel.writeParcelable(mSaveInfo, flags);
parcel.writeParcelable(mClientState, flags);
parcel.writeParcelableArray(mAuthenticationIds, flags);
@@ -331,7 +342,8 @@
// the system obeys the contract of the builder to avoid attacks
// using specially crafted parcels.
final Builder builder = new Builder();
- final ArrayList<Dataset> datasets = parcel.readTypedArrayList(null);
+ final ParceledListSlice<Dataset> datasetSlice = parcel.readParcelable(null);
+ final List<Dataset> datasets = (datasetSlice != null) ? datasetSlice.getList() : null;
final int datasetCount = (datasets != null) ? datasets.size() : 0;
for (int i = 0; i < datasetCount; i++) {
builder.addDataset(datasets.get(i));
diff --git a/core/java/android/service/autofill/ImageTransformation.java b/core/java/android/service/autofill/ImageTransformation.java
new file mode 100644
index 0000000..3627189
--- /dev/null
+++ b/core/java/android/service/autofill/ImageTransformation.java
@@ -0,0 +1,220 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.service.autofill;
+
+import static android.view.autofill.Helper.sDebug;
+
+import android.annotation.DrawableRes;
+import android.annotation.NonNull;
+import android.annotation.TestApi;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.util.Log;
+import android.util.Pair;
+import android.view.autofill.AutofillId;
+import android.widget.ImageView;
+import android.widget.RemoteViews;
+
+import com.android.internal.util.Preconditions;
+
+import java.util.ArrayList;
+import java.util.regex.Pattern;
+
+/**
+ * Replaces the content of a child {@link ImageView} of a
+ * {@link RemoteViews presentation template} with the first image that matches a regular expression
+ * (regex).
+ *
+ * <p>Typically used to display credit card logos. Example:
+ *
+ * <pre class="prettyprint">
+ * new ImageTransformation.Builder(ccNumberId, Pattern.compile("^4815.*$"),
+ * R.drawable.ic_credit_card_logo1)
+ * .addOption(Pattern.compile("^1623.*$"), R.drawable.ic_credit_card_logo2)
+ * .addOption(Pattern.compile("^42.*$"), R.drawable.ic_credit_card_logo3)
+ * .build();
+ * </pre>
+ *
+ * <p>There is no imposed limit in the number of options, but keep in mind that regexs are
+ * expensive to evaluate, so use the minimum number of regexs and add the most common first
+ * (for example, if this is a tranformation for a credit card logo and the most common credit card
+ * issuers are banks X and Y, add the regexes that resolves these 2 banks first).
+ */
+public final class ImageTransformation extends InternalTransformation implements Transformation,
+ Parcelable {
+ private static final String TAG = "ImageTransformation";
+
+ private final AutofillId mId;
+ private final ArrayList<Pair<Pattern, Integer>> mOptions;
+
+ private ImageTransformation(Builder builder) {
+ mId = builder.mId;
+ mOptions = builder.mOptions;
+ }
+
+ /** @hide */
+ @TestApi
+ @Override
+ public void apply(@NonNull ValueFinder finder, @NonNull RemoteViews parentTemplate,
+ int childViewId) throws Exception {
+ final String value = finder.findByAutofillId(mId);
+ if (value == null) {
+ Log.w(TAG, "No view for id " + mId);
+ return;
+ }
+ final int size = mOptions.size();
+ if (sDebug) {
+ Log.d(TAG, size + " multiple options on id " + childViewId + " to compare against "
+ + value);
+ }
+
+ for (int i = 0; i < size; i++) {
+ final Pair<Pattern, Integer> option = mOptions.get(i);
+ try {
+ if (option.first.matcher(value).matches()) {
+ Log.d(TAG, "Found match at " + i + ": " + option);
+ parentTemplate.setImageViewResource(childViewId, option.second);
+ return;
+ }
+ } catch (Exception e) {
+ // Do not log full exception to avoid PII leaking
+ Log.w(TAG, "Error matching regex #" + i + "(" + option.first.pattern() + ") on id "
+ + option.second + ": " + e.getClass());
+ throw e;
+
+ }
+ }
+ if (sDebug) Log.d(TAG, "No match for " + value);
+ }
+
+ /**
+ * Builder for {@link ImageTransformation} objects.
+ */
+ public static class Builder {
+ private final AutofillId mId;
+ private final ArrayList<Pair<Pattern, Integer>> mOptions = new ArrayList<>();
+ private boolean mDestroyed;
+
+ /**
+ * Create a new builder for a autofill id and add a first option.
+ *
+ * @param id id of the screen field that will be used to evaluate whether the image should
+ * be used.
+ * @param regex regular expression defining what should be matched to use this image.
+ * @param resId resource id of the image (in the autofill service's package). The
+ * {@link RemoteViews presentation} must contain a {@link ImageView} child with that id.
+ */
+ public Builder(@NonNull AutofillId id, @NonNull Pattern regex, @DrawableRes int resId) {
+ mId = Preconditions.checkNotNull(id);
+
+ addOption(regex, resId);
+ }
+
+ /**
+ * Adds an option to replace the child view with a different image when the regex matches.
+ *
+ * @param regex regular expression defining what should be matched to use this image.
+ * @param resId resource id of the image (in the autofill service's package). The
+ * {@link RemoteViews presentation} must contain a {@link ImageView} child with that id.
+ *
+ * @return this build
+ */
+ public Builder addOption(@NonNull Pattern regex, @DrawableRes int resId) {
+ throwIfDestroyed();
+
+ Preconditions.checkNotNull(regex);
+ Preconditions.checkArgument(resId != 0);
+
+ mOptions.add(new Pair<>(regex, resId));
+ return this;
+ }
+
+ /**
+ * Creates a new {@link ImageTransformation} instance.
+ */
+ public ImageTransformation build() {
+ throwIfDestroyed();
+ mDestroyed = true;
+ return new ImageTransformation(this);
+ }
+
+ private void throwIfDestroyed() {
+ Preconditions.checkState(!mDestroyed, "Already called build()");
+ }
+ }
+
+ /////////////////////////////////////
+ // Object "contract" methods. //
+ /////////////////////////////////////
+ @Override
+ public String toString() {
+ if (!sDebug) return super.toString();
+
+ return "ImageTransformation: [id=" + mId + ", options=" + mOptions + "]";
+ }
+
+ /////////////////////////////////////
+ // Parcelable "contract" methods. //
+ /////////////////////////////////////
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+ @Override
+ public void writeToParcel(Parcel parcel, int flags) {
+ parcel.writeParcelable(mId, flags);
+
+ final int size = mOptions.size();
+ final Pattern[] regexs = new Pattern[size];
+ final int[] resIds = new int[size];
+ for (int i = 0; i < size; i++) {
+ Pair<Pattern, Integer> regex = mOptions.get(i);
+ regexs[i] = regex.first;
+ resIds[i] = regex.second;
+ }
+ parcel.writeSerializable(regexs);
+ parcel.writeIntArray(resIds);
+ }
+
+ public static final Parcelable.Creator<ImageTransformation> CREATOR =
+ new Parcelable.Creator<ImageTransformation>() {
+ @Override
+ public ImageTransformation createFromParcel(Parcel parcel) {
+ final AutofillId id = parcel.readParcelable(null);
+
+ final Pattern[] regexs = (Pattern[]) parcel.readSerializable();
+ final int[] resIds = parcel.createIntArray();
+
+ // Always go through the builder to ensure the data ingested by the system obeys the
+ // contract of the builder to avoid attacks using specially crafted parcels.
+ final ImageTransformation.Builder builder = new ImageTransformation.Builder(id,
+ regexs[0], resIds[0]);
+
+ final int size = regexs.length;
+ for (int i = 1; i < size; i++) {
+ builder.addOption(regexs[i], resIds[i]);
+ }
+
+ return builder.build();
+ }
+
+ @Override
+ public ImageTransformation[] newArray(int size) {
+ return new ImageTransformation[size];
+ }
+ };
+}
diff --git a/core/java/android/service/autofill/InternalTransformation.java b/core/java/android/service/autofill/InternalTransformation.java
new file mode 100644
index 0000000..974397b
--- /dev/null
+++ b/core/java/android/service/autofill/InternalTransformation.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.service.autofill;
+
+import android.annotation.NonNull;
+import android.os.Parcelable;
+import android.widget.RemoteViews;
+
+/**
+ * Superclass of all transformation the system understands. As this is not public all
+ * subclasses have to implement {@link Transformation} again.
+ *
+ * @hide
+ */
+abstract class InternalTransformation implements Transformation, Parcelable {
+
+ /**
+ * Applies this transformation to a child view of a {@link android.widget.RemoteViews
+ * presentation template}.
+ *
+ * @param finder object used to find the value of a field in the screen.
+ * @param template the {@link RemoteViews presentation template}.
+ * @param childViewId resource id of the child view inside the template.
+ *
+ * @hide
+ */
+ abstract void apply(@NonNull ValueFinder finder, @NonNull RemoteViews template,
+ int childViewId) throws Exception;
+}
diff --git a/core/java/android/service/autofill/InternalValidator.java b/core/java/android/service/autofill/InternalValidator.java
new file mode 100644
index 0000000..e11cf6a
--- /dev/null
+++ b/core/java/android/service/autofill/InternalValidator.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.service.autofill;
+
+import android.annotation.NonNull;
+import android.os.Parcelable;
+
+/**
+ * Superclass of all validators the system understands. As this is not public all public subclasses
+ * have to implement {@link Validator} again.
+ *
+ * @hide
+ */
+public abstract class InternalValidator implements Validator, Parcelable {
+
+ /**
+ * Decides whether the contents of the screen are valid.
+ *
+ * @param finder object used to find the value of a field in the screen.
+ * @return {@code true} if the contents are valid, {@code false} otherwise.
+ *
+ * @hide
+ */
+ public abstract boolean isValid(@NonNull ValueFinder finder);
+}
diff --git a/core/java/android/service/autofill/LuhnChecksumValidator.java b/core/java/android/service/autofill/LuhnChecksumValidator.java
new file mode 100644
index 0000000..0b5930d
--- /dev/null
+++ b/core/java/android/service/autofill/LuhnChecksumValidator.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.service.autofill;
+
+import static android.view.autofill.Helper.sDebug;
+
+import android.annotation.NonNull;
+import android.annotation.TestApi;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.util.Log;
+import android.view.autofill.AutofillId;
+
+import com.android.internal.util.Preconditions;
+
+/**
+ * Validator that returns {@code true} if the number created by concatenating all given fields
+ * pass a Luhn algorithm checksum. All non-digits are ignored.
+ *
+ * <p>See {@link SaveInfo.Builder#setValidator(Validator)} for examples.
+ */
+public final class LuhnChecksumValidator extends InternalValidator implements Validator,
+ Parcelable {
+ private static final String TAG = "LuhnChecksumValidator";
+
+ private final AutofillId[] mIds;
+
+ /**
+ * Default constructor.
+ *
+ * @param ids id of fields that comprises the number to be checked.
+ */
+ public LuhnChecksumValidator(@NonNull AutofillId... ids) {
+ mIds = Preconditions.checkArrayElementsNotNull(ids, "ids");
+ }
+
+ /**
+ * Checks if the Luhn checksum is valid.
+ *
+ * @param number The number including the checksum
+ */
+ private static boolean isLuhnChecksumValid(@NonNull String number) {
+ int sum = 0;
+ boolean isDoubled = false;
+
+ for (int i = number.length() - 1; i >= 0; i--) {
+ final int digit = number.charAt(i) - '0';
+ if (digit < 0 || digit > 9) {
+ // Ignore non-digits
+ continue;
+ }
+
+ int addend;
+ if (isDoubled) {
+ addend = digit * 2;
+ if (addend > 9) {
+ addend -= 9;
+ }
+ } else {
+ addend = digit;
+ }
+ sum += addend;
+ isDoubled = !isDoubled;
+ }
+
+ return sum % 10 == 0;
+ }
+
+ /** @hide */
+ @Override
+ @TestApi
+ public boolean isValid(@NonNull ValueFinder finder) {
+ if (mIds == null || mIds.length == 0) return false;
+
+ final StringBuilder number = new StringBuilder();
+ for (AutofillId id : mIds) {
+ final String partialNumber = finder.findByAutofillId(id);
+ if (partialNumber == null) {
+ if (sDebug) Log.d(TAG, "No partial number for id " + id);
+ return false;
+ }
+ number.append(partialNumber);
+ }
+
+ return isLuhnChecksumValid(number.toString());
+ }
+
+ /////////////////////////////////////
+ // Parcelable "contract" methods. //
+ /////////////////////////////////////
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel parcel, int flags) {
+ parcel.writeParcelableArray(mIds, flags);
+ }
+
+ public static final Parcelable.Creator<LuhnChecksumValidator> CREATOR =
+ new Parcelable.Creator<LuhnChecksumValidator>() {
+ @Override
+ public LuhnChecksumValidator createFromParcel(Parcel parcel) {
+ return new LuhnChecksumValidator(parcel.readParcelableArray(null, AutofillId.class));
+ }
+
+ @Override
+ public LuhnChecksumValidator[] newArray(int size) {
+ return new LuhnChecksumValidator[size];
+ }
+ };
+}
diff --git a/core/java/android/service/autofill/OptionalValidators.java b/core/java/android/service/autofill/OptionalValidators.java
new file mode 100644
index 0000000..f7edd6e
--- /dev/null
+++ b/core/java/android/service/autofill/OptionalValidators.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.service.autofill;
+
+import static android.view.autofill.Helper.sDebug;
+
+import android.annotation.NonNull;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.android.internal.util.Preconditions;
+
+/**
+ * Compound validator that returns {@code true} on {@link #isValid(ValueFinder)} if any
+ * of its subvalidators returns {@code true} as well.
+ *
+ * <p>Used to implement an {@code OR} logical operation.
+ *
+ * @hide
+ */
+final class OptionalValidators extends InternalValidator {
+
+ @NonNull private final InternalValidator[] mValidators;
+
+ OptionalValidators(@NonNull InternalValidator[] validators) {
+ mValidators = Preconditions.checkArrayElementsNotNull(validators, "validators");
+ }
+
+ @Override
+ public boolean isValid(@NonNull ValueFinder finder) {
+ for (InternalValidator validator : mValidators) {
+ final boolean valid = validator.isValid(finder);
+ if (valid) return true;
+ }
+
+ return false;
+ }
+
+ /////////////////////////////////////
+ // Object "contract" methods. //
+ /////////////////////////////////////
+ @Override
+ public String toString() {
+ if (!sDebug) return super.toString();
+
+ return new StringBuilder("OptionalValidators: [validators=").append(mValidators)
+ .append("]")
+ .toString();
+ }
+
+ /////////////////////////////////////
+ // Parcelable "contract" methods. //
+ /////////////////////////////////////
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeParcelableArray(mValidators, flags);
+ }
+
+ public static final Parcelable.Creator<OptionalValidators> CREATOR =
+ new Parcelable.Creator<OptionalValidators>() {
+ @Override
+ public OptionalValidators createFromParcel(Parcel parcel) {
+ return new OptionalValidators(parcel
+ .readParcelableArray(null, InternalValidator.class));
+ }
+
+ @Override
+ public OptionalValidators[] newArray(int size) {
+ return new OptionalValidators[size];
+ }
+ };
+}
diff --git a/core/java/android/service/autofill/RequiredValidators.java b/core/java/android/service/autofill/RequiredValidators.java
new file mode 100644
index 0000000..ac85c28
--- /dev/null
+++ b/core/java/android/service/autofill/RequiredValidators.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.service.autofill;
+
+import static android.view.autofill.Helper.sDebug;
+
+import android.annotation.NonNull;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.android.internal.util.Preconditions;
+
+/**
+ * Compound validator that only returns {@code true} on {@link #isValid(ValueFinder)} if all
+ * of its subvalidators return {@code true} as well.
+ *
+ * <p>Used to implement an {@code AND} logical operation.
+ *
+ * @hide
+ */
+final class RequiredValidators extends InternalValidator {
+
+ @NonNull private final InternalValidator[] mValidators;
+
+ RequiredValidators(@NonNull InternalValidator[] validators) {
+ mValidators = Preconditions.checkArrayElementsNotNull(validators, "validators");
+ }
+
+ @Override
+ public boolean isValid(@NonNull ValueFinder finder) {
+ for (InternalValidator validator : mValidators) {
+ final boolean valid = validator.isValid(finder);
+ if (!valid) return false;
+ }
+ return true;
+ }
+
+ /////////////////////////////////////
+ // Object "contract" methods. //
+ /////////////////////////////////////
+ @Override
+ public String toString() {
+ if (!sDebug) return super.toString();
+
+ return new StringBuilder("RequiredValidators: [validators=").append(mValidators)
+ .append("]")
+ .toString();
+ }
+
+ /////////////////////////////////////
+ // Parcelable "contract" methods. //
+ /////////////////////////////////////
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeParcelableArray(mValidators, flags);
+ }
+
+ public static final Parcelable.Creator<RequiredValidators> CREATOR =
+ new Parcelable.Creator<RequiredValidators>() {
+ @Override
+ public RequiredValidators createFromParcel(Parcel parcel) {
+ return new RequiredValidators(parcel
+ .readParcelableArray(null, InternalValidator.class));
+ }
+
+ @Override
+ public RequiredValidators[] newArray(int size) {
+ return new RequiredValidators[size];
+ }
+ };
+}
diff --git a/core/java/android/service/autofill/SaveInfo.java b/core/java/android/service/autofill/SaveInfo.java
index 95d393b..f8a94d6 100644
--- a/core/java/android/service/autofill/SaveInfo.java
+++ b/core/java/android/service/autofill/SaveInfo.java
@@ -30,6 +30,7 @@
import android.view.autofill.AutofillManager;
import android.view.autofill.AutofillValue;
+import com.android.internal.util.ArrayUtils;
import com.android.internal.util.Preconditions;
import java.lang.annotation.Retention;
@@ -117,14 +118,21 @@
* <li>The {@link AutofillValue} of at least one view (be it required or optional) has changed
* (i.e., it's neither the same value passed in a {@link Dataset}, nor the initial value
* presented in the view).
+ * <li>There is no {@link Dataset} in the last {@link FillResponse} that completely matches the
+ * screen state (i.e., all required and optional fields in the dataset have the same value as
+ * the fields in the screen).
* <li>The user explicitly tapped the UI affordance asking to save data for autofill.
* </ul>
*
* <p>The service can also customize some aspects of the save UI affordance:
* <ul>
- * <li>Add a subtitle by calling {@link Builder#setDescription(CharSequence)}.
+ * <li>Add a simple subtitle by calling {@link Builder#setDescription(CharSequence)}.
+ * <li>Add a customized subtitle by calling
+ * {@link Builder#setCustomDescription(CustomDescription)}.
* <li>Customize the button used to reject the save request by calling
* {@link Builder#setNegativeAction(int, IntentSender)}.
+ * <li>Decide whether the UI should be shown based on the user input validation by calling
+ * {@link Builder#setValidator(Validator)}.
* </ul>
*/
public final class SaveInfo implements Parcelable {
@@ -222,6 +230,8 @@
private final AutofillId[] mOptionalIds;
private final CharSequence mDescription;
private final int mFlags;
+ private final CustomDescription mCustomDescription;
+ private final InternalValidator mValidator;
private SaveInfo(Builder builder) {
mType = builder.mType;
@@ -231,6 +241,8 @@
mOptionalIds = builder.mOptionalIds;
mDescription = builder.mDescription;
mFlags = builder.mFlags;
+ mCustomDescription = builder.mCustomDescription;
+ mValidator = builder.mValidator;
}
/** @hide */
@@ -244,7 +256,7 @@
}
/** @hide */
- public AutofillId[] getRequiredIds() {
+ public @Nullable AutofillId[] getRequiredIds() {
return mRequiredIds;
}
@@ -268,6 +280,18 @@
return mDescription;
}
+ /** @hide */
+ @Nullable
+ public CustomDescription getCustomDescription() {
+ return mCustomDescription;
+ }
+
+ /** @hide */
+ @Nullable
+ public InternalValidator getValidator() {
+ return mValidator;
+ }
+
/**
* A builder for {@link SaveInfo} objects.
*/
@@ -281,12 +305,14 @@
private CharSequence mDescription;
private boolean mDestroyed;
private int mFlags;
+ private CustomDescription mCustomDescription;
+ private InternalValidator mValidator;
/**
* Creates a new builder.
*
- * @param type the type of information the associated {@link FillResponse} represents, can
- * be any combination of {@link SaveInfo#SAVE_DATA_TYPE_GENERIC},
+ * @param type the type of information the associated {@link FillResponse} represents. It
+ * can be any combination of {@link SaveInfo#SAVE_DATA_TYPE_GENERIC},
* {@link SaveInfo#SAVE_DATA_TYPE_PASSWORD},
* {@link SaveInfo#SAVE_DATA_TYPE_ADDRESS}, {@link SaveInfo#SAVE_DATA_TYPE_CREDIT_CARD},
* {@link SaveInfo#SAVE_DATA_TYPE_USERNAME}, or
@@ -299,11 +325,30 @@
* it contains any {@code null} entry.
*/
public Builder(@SaveDataType int type, @NonNull AutofillId[] requiredIds) {
- // TODO: add CTS unit tests (not integration) to assert the null cases
mType = type;
mRequiredIds = assertValid(requiredIds);
}
+ /**
+ * Creates a new builder when no id is required.
+ *
+ * <p>When using this builder, caller must call {@link #setOptionalIds(AutofillId[])} before
+ * calling {@link #build()}.
+ *
+ * @param type the type of information the associated {@link FillResponse} represents. It
+ * can be any combination of {@link SaveInfo#SAVE_DATA_TYPE_GENERIC},
+ * {@link SaveInfo#SAVE_DATA_TYPE_PASSWORD},
+ * {@link SaveInfo#SAVE_DATA_TYPE_ADDRESS}, {@link SaveInfo#SAVE_DATA_TYPE_CREDIT_CARD},
+ * {@link SaveInfo#SAVE_DATA_TYPE_USERNAME}, or
+ * {@link SaveInfo#SAVE_DATA_TYPE_EMAIL_ADDRESS}.
+ *
+ * <p>See {@link SaveInfo} for more info.
+ */
+ public Builder(@SaveDataType int type) {
+ mType = type;
+ mRequiredIds = null;
+ }
+
private AutofillId[] assertValid(AutofillId[] ids) {
Preconditions.checkArgument(ids != null && ids.length > 0,
"must have at least one id: " + Arrays.toString(ids));
@@ -340,7 +385,6 @@
* it contains any {@code null} entry.
*/
public @NonNull Builder setOptionalIds(@NonNull AutofillId[] ids) {
- // TODO: add CTS unit tests (not integration) to assert the null cases
throwIfDestroyed();
mOptionalIds = assertValid(ids);
return this;
@@ -354,21 +398,46 @@
*
* @param description a succint description.
* @return This Builder.
+ *
+ * @throws IllegalStateException if this call was made after calling
+ * {@link #setCustomDescription(CustomDescription)}.
*/
public @NonNull Builder setDescription(@Nullable CharSequence description) {
throwIfDestroyed();
+ Preconditions.checkState(mCustomDescription == null,
+ "Can call setDescription() or setCustomDescription(), but not both");
mDescription = description;
return this;
}
/**
+ * Sets a custom description to be shown in the UI when the user is asked to save.
+ *
+ * <p>Typically used when the service must show more info about the object being saved,
+ * like a credit card logo, masked number, and expiration date.
+ *
+ * @param customDescription the custom description.
+ * @return This Builder.
+ *
+ * @throws IllegalStateException if this call was made after calling
+ * {@link #setDescription(CharSequence)}.
+ */
+ public @NonNull Builder setCustomDescription(@NonNull CustomDescription customDescription) {
+ throwIfDestroyed();
+ Preconditions.checkState(mDescription == null,
+ "Can call setDescription() or setCustomDescription(), but not both");
+ mCustomDescription = customDescription;
+ return this;
+ }
+
+ /**
* Sets the style and listener for the negative save action.
*
- * <p>This allows a fill-provider to customize the style and be
+ * <p>This allows an autofill service to customize the style and be
* notified when the user selects the negative action in the save
* UI. Note that selecting the negative action regardless of its style
* and listener being customized would dismiss the save UI and if a
- * custom listener intent is provided then this intent will be
+ * custom listener intent is provided then this intent is
* started. The default style is {@link #NEGATIVE_BUTTON_STYLE_CANCEL}</p>
*
* @param style The action style.
@@ -393,10 +462,85 @@
}
/**
+ * Sets an object used to validate the user input - if the input is not valid, the Save UI
+ * affordance is not shown.
+ *
+ * <p>Typically used to validate credit card numbers. Examples:
+ *
+ * <p>Validator for a credit number that must have exactly 16 digits:
+ *
+ * <pre class="prettyprint">
+ * Validator validator = new SimpleRegexValidator(ccNumberId, "^\\d{16}$")
+ * </pre>
+ *
+ * <p>Validator for a credit number that must pass a Luhn checksum and either have
+ * 16 digits, or 15 digits starting with 108:
+ *
+ * <pre class="prettyprint">
+ * import android.service.autofill.Validators;
+ *
+ * Validator validator =
+ * and(
+ * new LuhnChecksumValidator(ccNumberId),
+ * or(
+ * new SimpleRegexValidator(ccNumberId, "^\\d{16}$"),
+ * new SimpleRegexValidator(ccNumberId, "^108\\d{12}$")
+ * )
+ * );
+ * </pre>
+ *
+ * <p><b>NOTE: </b>the example above is just for illustrative purposes; the same validator
+ * could be created using a single regex for the {@code OR} part:
+ *
+ * <pre class="prettyprint">
+ * Validator validator =
+ * and(
+ * new LuhnChecksumValidator(ccNumberId),
+ * new SimpleRegexValidator(ccNumberId, "^(\\d{16}|108\\d{12})$")
+ * );
+ * </pre>
+ *
+ * <p>Validator for a credit number contained in just 4 fields and that must have exactly
+ * 4 digits on each field:
+ *
+ * <pre class="prettyprint">
+ * import android.service.autofill.Validators;
+ *
+ * Validator validator =
+ * and(
+ * new SimpleRegexValidator(ccNumberId1, "^\\d{4}$"),
+ * new SimpleRegexValidator(ccNumberId2, "^\\d{4}$"),
+ * new SimpleRegexValidator(ccNumberId3, "^\\d{4}$"),
+ * new SimpleRegexValidator(ccNumberId4, "^\\d{4}$")
+ * );
+ * </pre>
+ *
+ * @param validator an implementation provided by the Android System.
+ * @return this builder.
+ *
+ * @throws IllegalArgumentException if {@code validator} is not a class provided
+ * by the Android System.
+ */
+ public @NonNull Builder setValidator(@NonNull Validator validator) {
+ throwIfDestroyed();
+ Preconditions.checkArgument((validator instanceof InternalValidator),
+ "not provided by Android System: " + validator);
+ mValidator = (InternalValidator) validator;
+ return this;
+ }
+
+ /**
* Builds a new {@link SaveInfo} instance.
+ *
+ * @throws IllegalStateException if no
+ * {@link #SaveInfo.Builder(int, AutofillId[]) required ids}
+ * or {@link #setOptionalIds(AutofillId[]) optional ids} were set
*/
public SaveInfo build() {
throwIfDestroyed();
+ Preconditions.checkState(
+ !ArrayUtils.isEmpty(mRequiredIds) || !ArrayUtils.isEmpty(mOptionalIds),
+ "must have at least one required or optional id");
mDestroyed = true;
return new SaveInfo(this);
}
@@ -406,7 +550,6 @@
throw new IllegalStateException("Already called #build()");
}
}
-
}
/////////////////////////////////////
@@ -424,6 +567,8 @@
.append(DebugUtils.flagsToString(SaveInfo.class, "NEGATIVE_BUTTON_STYLE_",
mNegativeButtonStyle))
.append(", mFlags=").append(mFlags)
+ .append(", mCustomDescription=").append(mCustomDescription)
+ .append(", validation=").append(mValidator)
.append("]").toString();
}
@@ -440,27 +585,42 @@
public void writeToParcel(Parcel parcel, int flags) {
parcel.writeInt(mType);
parcel.writeParcelableArray(mRequiredIds, flags);
+ parcel.writeParcelableArray(mOptionalIds, flags);
parcel.writeInt(mNegativeButtonStyle);
parcel.writeParcelable(mNegativeActionListener, flags);
- parcel.writeParcelableArray(mOptionalIds, flags);
parcel.writeCharSequence(mDescription);
+ parcel.writeParcelable(mCustomDescription, flags);
+ parcel.writeParcelable(mValidator, flags);
parcel.writeInt(mFlags);
}
public static final Parcelable.Creator<SaveInfo> CREATOR = new Parcelable.Creator<SaveInfo>() {
@Override
public SaveInfo createFromParcel(Parcel parcel) {
+
// Always go through the builder to ensure the data ingested by
// the system obeys the contract of the builder to avoid attacks
// using specially crafted parcels.
- final Builder builder = new Builder(parcel.readInt(),
- parcel.readParcelableArray(null, AutofillId.class));
- builder.setNegativeAction(parcel.readInt(), parcel.readParcelable(null));
+ final int type = parcel.readInt();
+ final AutofillId[] requiredIds = parcel.readParcelableArray(null, AutofillId.class);
+ final Builder builder = requiredIds != null
+ ? new Builder(type, requiredIds)
+ : new Builder(type);
final AutofillId[] optionalIds = parcel.readParcelableArray(null, AutofillId.class);
if (optionalIds != null) {
builder.setOptionalIds(optionalIds);
}
+
+ builder.setNegativeAction(parcel.readInt(), parcel.readParcelable(null));
builder.setDescription(parcel.readCharSequence());
+ final CustomDescription customDescripton = parcel.readParcelable(null);
+ if (customDescripton != null) {
+ builder.setCustomDescription(customDescripton);
+ }
+ final InternalValidator validator = parcel.readParcelable(null);
+ if (validator != null) {
+ builder.setValidator(validator);
+ }
builder.setFlags(parcel.readInt());
return builder.build();
}
diff --git a/core/java/android/service/autofill/SimpleRegexValidator.java b/core/java/android/service/autofill/SimpleRegexValidator.java
new file mode 100644
index 0000000..ef8c52c9
--- /dev/null
+++ b/core/java/android/service/autofill/SimpleRegexValidator.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.service.autofill;
+
+import static android.view.autofill.Helper.sDebug;
+
+import android.annotation.NonNull;
+import android.annotation.TestApi;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.util.Log;
+import android.view.autofill.AutofillId;
+
+import com.android.internal.util.Preconditions;
+
+import java.util.regex.Pattern;
+
+/**
+ * Defines if a field is valid based on a regular expression (regex).
+ *
+ * <p>See {@link SaveInfo.Builder#setValidator(Validator)} for examples.
+ */
+public final class SimpleRegexValidator extends InternalValidator implements Validator, Parcelable {
+
+ private static final String TAG = "SimpleRegexValidator";
+
+ private final AutofillId mId;
+ private final Pattern mRegex;
+
+ /**
+ * Default constructor.
+ *
+ * @param id id of the field whose regex is applied to.
+ * @param regex regular expression that defines the result of the validator: if the regex
+ * matches the contents of the field identified by {@code id}, it returns {@code true};
+ * otherwise, it returns {@code false}.
+ */
+ public SimpleRegexValidator(@NonNull AutofillId id, @NonNull Pattern regex) {
+ mId = Preconditions.checkNotNull(id);
+ mRegex = Preconditions.checkNotNull(regex);
+ }
+
+ /** @hide */
+ @Override
+ @TestApi
+ public boolean isValid(@NonNull ValueFinder finder) {
+ final String value = finder.findByAutofillId(mId);
+ if (value == null) {
+ Log.w(TAG, "No view for id " + mId);
+ return false;
+ }
+
+ final boolean valid = mRegex.matcher(value).matches();
+ if (sDebug) Log.d(TAG, "isValid(): " + valid);
+ return valid;
+ }
+
+ /////////////////////////////////////
+ // Object "contract" methods. //
+ /////////////////////////////////////
+ @Override
+ public String toString() {
+ if (!sDebug) return super.toString();
+
+ return "SimpleRegexValidator: [id=" + mId + ", regex=" + mRegex + "]";
+ }
+
+ /////////////////////////////////////
+ // Parcelable "contract" methods. //
+ /////////////////////////////////////
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel parcel, int flags) {
+ parcel.writeParcelable(mId, flags);
+ parcel.writeSerializable(mRegex);
+ }
+
+ public static final Parcelable.Creator<SimpleRegexValidator> CREATOR =
+ new Parcelable.Creator<SimpleRegexValidator>() {
+ @Override
+ public SimpleRegexValidator createFromParcel(Parcel parcel) {
+ return new SimpleRegexValidator(parcel.readParcelable(null),
+ (Pattern) parcel.readSerializable());
+ }
+
+ @Override
+ public SimpleRegexValidator[] newArray(int size) {
+ return new SimpleRegexValidator[size];
+ }
+ };
+}
diff --git a/core/java/android/service/autofill/Transformation.java b/core/java/android/service/autofill/Transformation.java
new file mode 100644
index 0000000..4cef261
--- /dev/null
+++ b/core/java/android/service/autofill/Transformation.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.service.autofill;
+
+/**
+ * Helper class used to change a child view of a {@link android.widget.RemoteViews presentation
+ * template} at runtime, using the values of fields contained in the screen.
+ *
+ * <p>Typically used by {@link CustomDescription} to provide a customized Save UI affordance.
+ */
+public interface Transformation {
+}
diff --git a/core/java/android/service/autofill/Validator.java b/core/java/android/service/autofill/Validator.java
new file mode 100644
index 0000000..854aa1e
--- /dev/null
+++ b/core/java/android/service/autofill/Validator.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.service.autofill;
+
+/**
+ * Helper class used to define whether the contents of a screen are valid.
+ *
+ * <p>Typically used to avoid displaying the Save UI affordance when the user input is invalid.
+ */
+public interface Validator {
+}
diff --git a/core/java/android/service/autofill/Validators.java b/core/java/android/service/autofill/Validators.java
new file mode 100644
index 0000000..51b503c
--- /dev/null
+++ b/core/java/android/service/autofill/Validators.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.service.autofill;
+
+import android.annotation.NonNull;
+
+import com.android.internal.util.Preconditions;
+
+/**
+ * Factory for {@link Validator} operations.
+ *
+ * <p>See {@link SaveInfo.Builder#setValidator(Validator)} for examples.
+ */
+public final class Validators {
+
+ private Validators() {
+ throw new UnsupportedOperationException("contains static methods only");
+ }
+
+ /**
+ * Creates a validator that is only valid if all {@code validators} are valid.
+ *
+ * @throws IllegalArgumentException if any element of {@code validators} is an instance of a
+ * class that is not provided by the Android System.
+ */
+ @NonNull
+ public static Validator and(@NonNull Validator...validators) {
+ return new RequiredValidators(getInternalValidators(validators));
+ }
+
+ /**
+ * Creates a validator that is valid if any of the {@code validators} is valid.
+ *
+ * @throws IllegalArgumentException if any element of {@code validators} is an instance of a
+ * class that is not provided by the Android System.
+ */
+ @NonNull
+ public static Validator or(@NonNull Validator...validators) {
+ return new OptionalValidators(getInternalValidators(validators));
+ }
+
+ private static InternalValidator[] getInternalValidators(Validator[] validators) {
+ Preconditions.checkArrayElementsNotNull(validators, "validators");
+
+ final InternalValidator[] internals = new InternalValidator[validators.length];
+
+ for (int i = 0; i < validators.length; i++) {
+ Preconditions.checkArgument((validators[i] instanceof InternalValidator),
+ "element " + i + " not provided by Android System: " + validators[i]);
+ internals[i] = (InternalValidator) validators[i];
+ }
+ return internals;
+ }
+}
diff --git a/core/java/android/service/autofill/ValueFinder.java b/core/java/android/service/autofill/ValueFinder.java
new file mode 100644
index 0000000..1705b7d
--- /dev/null
+++ b/core/java/android/service/autofill/ValueFinder.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.service.autofill;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.TestApi;
+import android.view.autofill.AutofillId;
+
+/**
+ * Helper object used to obtain the value of a field in the screen being autofilled.
+ *
+ * @hide
+ */
+@TestApi
+public interface ValueFinder {
+
+ /**
+ * Gets the value of a field, or {@code null} when not found.
+ */
+ @Nullable String findByAutofillId(@NonNull AutofillId id);
+}
diff --git a/core/java/android/service/notification/Adjustment.java b/core/java/android/service/notification/Adjustment.java
index 137cf57..ce678fc 100644
--- a/core/java/android/service/notification/Adjustment.java
+++ b/core/java/android/service/notification/Adjustment.java
@@ -17,7 +17,7 @@
import android.annotation.SystemApi;
import android.annotation.TestApi;
-import android.app.NotificationChannel;
+import android.app.Notification;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
@@ -48,6 +48,12 @@
* {@link NotificationAssistantService#onNotificationSnoozedUntilContext}.
*/
public static final String KEY_SNOOZE_CRITERIA = "key_snooze_criteria";
+ /**
+ * Data type: String. Used to change what {@link Notification#getGroup() group} a notification
+ * belongs to.
+ * @hide
+ */
+ public static final String KEY_GROUP_KEY = "key_group_key";
/**
* Create a notification adjustment.
@@ -146,4 +152,11 @@
dest.writeBundle(mSignals);
dest.writeInt(mUser);
}
+
+ @Override
+ public String toString() {
+ return "Adjustment{"
+ + "mSignals=" + mSignals
+ + '}';
+ }
}
diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java
index 76c96bd..855c87b 100644
--- a/core/java/android/service/notification/NotificationListenerService.java
+++ b/core/java/android/service/notification/NotificationListenerService.java
@@ -16,35 +16,31 @@
package android.service.notification;
-import android.Manifest;
import android.annotation.IntDef;
import android.annotation.NonNull;
-import android.annotation.TestApi;
-import android.app.NotificationChannel;
-import android.app.NotificationChannelGroup;
-import android.companion.CompanionDeviceManager;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-
-import android.annotation.SystemApi;
import android.annotation.SdkConstant;
+import android.annotation.SystemApi;
import android.app.INotificationManager;
import android.app.Notification;
import android.app.Notification.Builder;
+import android.app.NotificationChannel;
+import android.app.NotificationChannelGroup;
import android.app.NotificationManager;
import android.app.Service;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ParceledListSlice;
+import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
-import android.graphics.Bitmap;
import android.os.Build;
import android.os.Bundle;
+import android.os.Handler;
import android.os.IBinder;
+import android.os.Looper;
+import android.os.Message;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.RemoteException;
@@ -54,6 +50,7 @@
import android.util.ArraySet;
import android.util.Log;
import android.widget.RemoteViews;
+
import com.android.internal.annotations.GuardedBy;
import com.android.internal.os.SomeArgs;
@@ -199,6 +196,7 @@
* The full trim of the StatusBarNotification including all its features.
*
* @hide
+ * @removed
*/
@SystemApi
public static final int TRIM_FULL = 0;
@@ -219,6 +217,7 @@
* </ol>
*
* @hide
+ * @removed
*/
@SystemApi
public static final int TRIM_LIGHT = 1;
@@ -605,9 +604,9 @@
* @param snoozeCriterionId The{@link SnoozeCriterion#getId()} of a context to snooze the
* notification until.
* @hide
+ * @removed
*/
@SystemApi
- @TestApi
public final void snoozeNotification(String key, String snoozeCriterionId) {
if (!isBound()) return;
try {
@@ -749,6 +748,7 @@
* before performing this operation.
*
* @hide
+ * @removed
*
* @param trim trim of the notifications to be passed via {@link #onNotificationPosted}.
* See <code>TRIM_*</code> constants.
@@ -801,6 +801,7 @@
* current user). Useful when you don't know what's already been posted.
*
* @hide
+ * @removed
*
* @param trim trim of the notifications to be returned. See <code>TRIM_*</code> constants.
* @return An array of active notifications, sorted in natural order.
@@ -832,6 +833,7 @@
* more data out of those notifications.
*
* @hide
+ * @removed
*
* @param keys the keys of the notifications to request
* @param trim trim of the notifications to be returned. See <code>TRIM_*</code> constants.
@@ -1046,6 +1048,7 @@
* @param componentName the component that will consume the notification information
* @param currentUser the user to use as the stream filter
* @hide
+ * @removed
*/
@SystemApi
public void registerAsSystemService(Context context, ComponentName componentName,
@@ -1066,6 +1069,7 @@
* <p>This method will fail for listeners that were not registered
* with (@link registerAsService).
* @hide
+ * @removed
*/
@SystemApi
public void unregisterAsSystemService() throws RemoteException {
@@ -1434,9 +1438,9 @@
* If the {@link NotificationAssistantService} has added people to this notification, then
* this will be non-null.
* @hide
+ * @removed
*/
@SystemApi
- @TestApi
public List<String> getAdditionalPeople() {
return mOverridePeople;
}
@@ -1446,9 +1450,9 @@
* user interface displays options for snoozing notifications these criteria should be
* displayed as well.
* @hide
+ * @removed
*/
@SystemApi
- @TestApi
public List<SnoozeCriterion> getSnoozeCriteria() {
return mSnoozeCriteria;
}
diff --git a/core/java/android/service/notification/ZenModeConfig.java b/core/java/android/service/notification/ZenModeConfig.java
index b225018..7bec898 100644
--- a/core/java/android/service/notification/ZenModeConfig.java
+++ b/core/java/android/service/notification/ZenModeConfig.java
@@ -85,7 +85,7 @@
private static final boolean DEFAULT_ALLOW_SCREEN_ON = true;
private static final int XML_VERSION = 2;
- private static final String ZEN_TAG = "zen";
+ public static final String ZEN_TAG = "zen";
private static final String ZEN_ATT_VERSION = "version";
private static final String ZEN_ATT_USER = "user";
private static final String ALLOW_TAG = "allow";
@@ -712,7 +712,8 @@
int userHandle, boolean shortVersion) {
final int num;
String summary, line1, line2;
- final CharSequence formattedTime = getFormattedTime(context, time, userHandle);
+ final CharSequence formattedTime =
+ getFormattedTime(context, time, isToday(time), userHandle);
final Resources res = context.getResources();
if (minutes < 60) {
// display as minutes
@@ -738,33 +739,43 @@
// display as day/time
summary = line1 = line2 = res.getString(R.string.zen_mode_until, formattedTime);
}
- final Uri id = toCountdownConditionId(time);
+ final Uri id = toCountdownConditionId(time, false);
return new Condition(id, summary, line1, line2, 0, Condition.STATE_TRUE,
Condition.FLAG_RELEVANT_NOW);
}
- public static Condition toNextAlarmCondition(Context context, long now, long alarm,
+ /**
+ * Converts countdown to alarm parameters into a condition with user facing summary
+ */
+ public static Condition toNextAlarmCondition(Context context, long alarm,
int userHandle) {
- final CharSequence formattedTime = getFormattedTime(context, alarm, userHandle);
+ boolean isSameDay = isToday(alarm);
+ final CharSequence formattedTime = getFormattedTime(context, alarm, isSameDay, userHandle);
final Resources res = context.getResources();
- final String line1 = res.getString(R.string.zen_mode_alarm, formattedTime);
- final Uri id = toCountdownConditionId(alarm);
+ final String line1 = res.getString(R.string.zen_mode_until, formattedTime);
+ final Uri id = toCountdownConditionId(alarm, true);
return new Condition(id, "", line1, "", 0, Condition.STATE_TRUE,
Condition.FLAG_RELEVANT_NOW);
}
- private static CharSequence getFormattedTime(Context context, long time, int userHandle) {
- String skeleton = "EEE " + (DateFormat.is24HourFormat(context, userHandle) ? "Hm" : "hma");
+ private static CharSequence getFormattedTime(Context context, long time, boolean isSameDay,
+ int userHandle) {
+ String skeleton = (!isSameDay ? "EEE " : "")
+ + (DateFormat.is24HourFormat(context, userHandle) ? "Hm" : "hma");
+ final String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), skeleton);
+ return DateFormat.format(pattern, time);
+ }
+
+ private static boolean isToday(long time) {
GregorianCalendar now = new GregorianCalendar();
GregorianCalendar endTime = new GregorianCalendar();
endTime.setTimeInMillis(time);
if (now.get(Calendar.YEAR) == endTime.get(Calendar.YEAR)
&& now.get(Calendar.MONTH) == endTime.get(Calendar.MONTH)
&& now.get(Calendar.DATE) == endTime.get(Calendar.DATE)) {
- skeleton = DateFormat.is24HourFormat(context, userHandle) ? "Hm" : "hma";
+ return true;
}
- final String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), skeleton);
- return DateFormat.format(pattern, time);
+ return false;
}
// ==== Built-in system conditions ====
@@ -775,17 +786,24 @@
public static final String COUNTDOWN_PATH = "countdown";
- public static Uri toCountdownConditionId(long time) {
+ public static final String IS_ALARM_PATH = "alarm";
+
+ /**
+ * Converts countdown condition parameters into a condition id.
+ */
+ public static Uri toCountdownConditionId(long time, boolean alarm) {
return new Uri.Builder().scheme(Condition.SCHEME)
.authority(SYSTEM_AUTHORITY)
.appendPath(COUNTDOWN_PATH)
.appendPath(Long.toString(time))
+ .appendPath(IS_ALARM_PATH)
+ .appendPath(Boolean.toString(alarm))
.build();
}
public static long tryParseCountdownConditionId(Uri conditionId) {
if (!Condition.isValidId(conditionId, SYSTEM_AUTHORITY)) return 0;
- if (conditionId.getPathSegments().size() != 2
+ if (conditionId.getPathSegments().size() < 2
|| !COUNTDOWN_PATH.equals(conditionId.getPathSegments().get(0))) return 0;
try {
return Long.parseLong(conditionId.getPathSegments().get(1));
@@ -795,10 +813,32 @@
}
}
+ /**
+ * Returns whether this condition is a countdown condition.
+ */
public static boolean isValidCountdownConditionId(Uri conditionId) {
return tryParseCountdownConditionId(conditionId) != 0;
}
+ /**
+ * Returns whether this condition is a countdown to an alarm.
+ */
+ public static boolean isValidCountdownToAlarmConditionId(Uri conditionId) {
+ if (tryParseCountdownConditionId(conditionId) != 0) {
+ if (conditionId.getPathSegments().size() < 4
+ || !IS_ALARM_PATH.equals(conditionId.getPathSegments().get(2))) {
+ return false;
+ }
+ try {
+ return Boolean.parseBoolean(conditionId.getPathSegments().get(3));
+ } catch (RuntimeException e) {
+ Slog.w(TAG, "Error parsing countdown alarm condition: " + conditionId, e);
+ return false;
+ }
+ }
+ return false;
+ }
+
// ==== Built-in system condition: schedule ====
public static final String SCHEDULE_PATH = "schedule";
diff --git a/core/java/android/service/persistentdata/PersistentDataBlockManager.java b/core/java/android/service/persistentdata/PersistentDataBlockManager.java
index fa75ad3..9332a5b 100644
--- a/core/java/android/service/persistentdata/PersistentDataBlockManager.java
+++ b/core/java/android/service/persistentdata/PersistentDataBlockManager.java
@@ -130,6 +130,7 @@
*
* Returns -1 on error.
*/
+ @SuppressLint("Doclava125")
public long getMaximumDataBlockSize() {
try {
return sService.getMaximumDataBlockSize();
diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java
index e4d3142..424967f 100644
--- a/core/java/android/service/wallpaper/WallpaperService.java
+++ b/core/java/android/service/wallpaper/WallpaperService.java
@@ -547,12 +547,11 @@
/**
* Notifies the engine that wallpaper colors changed significantly.
- * This will trigger a {@link #onComputeWallpaperColors()} call.
- * @hide
+ * This will trigger a {@link #onComputeColors()} call.
*/
- public void invalidateColors() {
+ public void notifyColorsChanged() {
try {
- mConnection.onWallpaperColorsChanged(onComputeWallpaperColors());
+ mConnection.onWallpaperColorsChanged(onComputeColors());
} catch (RemoteException e) {
Log.w(TAG, "Can't invalidate wallpaper colors because " +
"wallpaper connection was lost", e);
@@ -560,19 +559,18 @@
}
/**
- * Notifies the system about what colors the wallpaper is using.
+ * Called by the system when it needs to know what colors the wallpaper is using.
* You might return null if no color information is available at the moment. In that case
- * you might want to call {@link #invalidateColors()} in a near future.
+ * you might want to call {@link #notifyColorsChanged()} in a near future.
* <p>
- * The simplest way of creating A {@link android.app.WallpaperColors} object is by using
+ * The simplest way of creating a {@link android.app.WallpaperColors} object is by using
* {@link android.app.WallpaperColors#fromBitmap(Bitmap)} or
* {@link android.app.WallpaperColors#fromDrawable(Drawable)}, but you can also specify
- * your main colors and dark text support explicitly using one of the constructors.
+ * your main colors by constructing a {@link android.app.WallpaperColors} object manually.
*
* @return Wallpaper colors.
- * @hide
*/
- public @Nullable WallpaperColors onComputeWallpaperColors() {
+ public @Nullable WallpaperColors onComputeColors() {
return null;
}
@@ -1212,7 +1210,7 @@
mEngine = engine;
mActiveEngines.add(engine);
engine.attach(this);
- engine.invalidateColors();
+ engine.notifyColorsChanged();
return;
}
case DO_DETACH: {
diff --git a/core/java/android/text/FontConfig.java b/core/java/android/text/FontConfig.java
index ed58390..029f66e 100644
--- a/core/java/android/text/FontConfig.java
+++ b/core/java/android/text/FontConfig.java
@@ -64,17 +64,19 @@
private final int mWeight;
private final boolean mIsItalic;
private Uri mUri;
+ private final String mFallbackFor;
/**
* @hide
*/
public Font(@NonNull String fontName, int ttcIndex, @NonNull FontVariationAxis[] axes,
- int weight, boolean isItalic) {
+ int weight, boolean isItalic, String fallbackFor) {
mFontName = fontName;
mTtcIndex = ttcIndex;
mAxes = axes;
mWeight = weight;
mIsItalic = isItalic;
+ mFallbackFor = fallbackFor;
}
/**
@@ -125,6 +127,10 @@
public void setUri(@NonNull Uri uri) {
mUri = uri;
}
+
+ public String getFallbackFor() {
+ return mFallbackFor;
+ }
}
/**
diff --git a/core/java/android/text/InputFilter.java b/core/java/android/text/InputFilter.java
index bff09a2..d773158 100644
--- a/core/java/android/text/InputFilter.java
+++ b/core/java/android/text/InputFilter.java
@@ -16,6 +16,10 @@
package android.text;
+import android.annotation.Nullable;
+
+import java.util.Locale;
+
/**
* InputFilters can be attached to {@link Editable}s to constrain the
* changes that can be made to them.
@@ -33,40 +37,122 @@
* as this is what happens when you delete text. Also beware that
* you should not attempt to make any changes to <code>dest</code>
* from this method; you may only examine it for context.
- *
+ *
* Note: If <var>source</var> is an instance of {@link Spanned} or
- * {@link Spannable}, the span objects in the <var>source</var> should be
- * copied into the filtered result (i.e. the non-null return value).
- * {@link TextUtils#copySpansFrom} can be used for convenience.
+ * {@link Spannable}, the span objects in the <var>source</var> should be
+ * copied into the filtered result (i.e. the non-null return value).
+ * {@link TextUtils#copySpansFrom} can be used for convenience if the
+ * span boundary indices would be remaining identical relative to the source.
*/
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend);
/**
- * This filter will capitalize all the lower case letters that are added
- * through edits.
+ * This filter will capitalize all the lowercase and titlecase letters that are added
+ * through edits. (Note that if there are no lowercase or titlecase letters in the input, the
+ * text would not be transformed, even if the result of capitalization of the string is
+ * different from the string.)
*/
public static class AllCaps implements InputFilter {
+ private final Locale mLocale;
+
+ public AllCaps() {
+ mLocale = null;
+ }
+
+ /**
+ * Constructs a locale-specific AllCaps filter, to make sure capitalization rules of that
+ * locale are used for transforming the sequence.
+ */
+ public AllCaps(@Nullable Locale locale) {
+ mLocale = locale;
+ }
+
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
- for (int i = start; i < end; i++) {
- if (Character.isLowerCase(source.charAt(i))) {
- char[] v = new char[end - start];
- TextUtils.getChars(source, start, end, v, 0);
- String s = new String(v).toUpperCase();
+ final CharSequence wrapper = new CharSequenceWrapper(source, start, end);
- if (source instanceof Spanned) {
- SpannableString sp = new SpannableString(s);
- TextUtils.copySpansFrom((Spanned) source,
- start, end, null, sp, 0);
- return sp;
- } else {
- return s;
- }
+ boolean lowerOrTitleFound = false;
+ final int length = end - start;
+ for (int i = 0, cp; i < length; i += Character.charCount(cp)) {
+ // We access 'wrapper' instead of 'source' to make sure no code unit beyond 'end' is
+ // ever accessed.
+ cp = Character.codePointAt(wrapper, i);
+ if (Character.isLowerCase(cp) || Character.isTitleCase(cp)) {
+ lowerOrTitleFound = true;
+ break;
}
}
+ if (!lowerOrTitleFound) {
+ return null; // keep original
+ }
- return null; // keep original
+ final boolean copySpans = source instanceof Spanned;
+ final CharSequence upper = TextUtils.toUpperCase(mLocale, wrapper, copySpans);
+ if (upper == wrapper) {
+ // Nothing was changed in the uppercasing operation. This is weird, since
+ // we had found at least one lowercase or titlecase character. But we can't
+ // do anything better than keeping the original in this case.
+ return null; // keep original
+ }
+ // Return a SpannableString or String for backward compatibility.
+ return copySpans ? new SpannableString(upper) : upper.toString();
+ }
+
+ private static class CharSequenceWrapper implements CharSequence, Spanned {
+ private final CharSequence mSource;
+ private final int mStart, mEnd;
+ private final int mLength;
+
+ CharSequenceWrapper(CharSequence source, int start, int end) {
+ mSource = source;
+ mStart = start;
+ mEnd = end;
+ mLength = end - start;
+ }
+
+ public int length() {
+ return mLength;
+ }
+
+ public char charAt(int index) {
+ if (index < 0 || index >= mLength) {
+ throw new IndexOutOfBoundsException();
+ }
+ return mSource.charAt(mStart + index);
+ }
+
+ public CharSequence subSequence(int start, int end) {
+ if (start < 0 || end < 0 || end > mLength || start > end) {
+ throw new IndexOutOfBoundsException();
+ }
+ return new CharSequenceWrapper(mSource, mStart + start, mStart + end);
+ }
+
+ public String toString() {
+ return mSource.subSequence(mStart, mEnd).toString();
+ }
+
+ public <T> T[] getSpans(int start, int end, Class<T> type) {
+ return ((Spanned) mSource).getSpans(mStart + start, mStart + end, type);
+ }
+
+ public int getSpanStart(Object tag) {
+ return ((Spanned) mSource).getSpanStart(tag) - mStart;
+ }
+
+ public int getSpanEnd(Object tag) {
+ return ((Spanned) mSource).getSpanEnd(tag) - mStart;
+ }
+
+ public int getSpanFlags(Object tag) {
+ return ((Spanned) mSource).getSpanFlags(tag);
+ }
+
+ public int nextSpanTransition(int start, int limit, Class type) {
+ return ((Spanned) mSource).nextSpanTransition(mStart + start, mStart + limit, type)
+ - mStart;
+ }
}
}
diff --git a/core/java/android/text/StaticLayout.java b/core/java/android/text/StaticLayout.java
index 74ff6dc..a8c6aa6 100644
--- a/core/java/android/text/StaticLayout.java
+++ b/core/java/android/text/StaticLayout.java
@@ -18,6 +18,7 @@
import android.annotation.Nullable;
import android.graphics.Paint;
+import android.os.LocaleList;
import android.text.style.LeadingMarginSpan;
import android.text.style.LeadingMarginSpan.LeadingMarginSpan2;
import android.text.style.LineHeightSpan;
@@ -333,6 +334,16 @@
return this;
}
+ private long[] getHyphenators(LocaleList locales) {
+ final int length = locales.size();
+ final long[] result = new long[length];
+ for (int i = 0; i < length; i++) {
+ final Locale locale = locales.get(i);
+ result[i] = Hyphenator.get(locale).getNativePtr();
+ }
+ return result;
+ }
+
/**
* Measurement and break iteration is done in native code. The protocol for using
* the native code is as follows.
@@ -342,7 +353,7 @@
* future).
*
* Then, for each run within the paragraph:
- * - setLocale (this must be done at least for the first run, optional afterwards)
+ * - setLocales (this must be done at least for the first run, optional afterwards)
* - one of the following, depending on the type of run:
* + addStyleRun (a text run, to be measured in native code)
* + addMeasuredRun (a run already measured in Java, passed into native code)
@@ -354,15 +365,15 @@
* After all paragraphs, call finish() to release expensive buffers.
*/
- private void setLocale(Locale locale) {
- if (!locale.equals(mLocale)) {
- nSetLocale(mNativePtr, locale.toLanguageTag(),
- Hyphenator.get(locale).getNativePtr());
- mLocale = locale;
+ private void setLocales(LocaleList locales) {
+ if (!locales.equals(mLocales)) {
+ nSetLocales(mNativePtr, locales.toLanguageTags(), getHyphenators(locales));
+ mLocales = locales;
}
}
/* package */ float addStyleRun(TextPaint paint, int start, int end, boolean isRtl) {
+ setLocales(paint.getTextLocales());
return nAddStyleRun(mNativePtr, paint.getNativeInstance(), paint.mNativeTypeface,
start, end, isRtl);
}
@@ -425,7 +436,7 @@
// This will go away and be subsumed by native builder code
MeasuredText mMeasuredText;
- Locale mLocale;
+ LocaleList mLocales;
private static final SynchronizedPool<Builder> sPool = new SynchronizedPool<Builder>(3);
}
@@ -594,7 +605,7 @@
// store fontMetrics per span range
// must be a multiple of 4 (and > 0) (store top, bottom, ascent, and descent per range)
int[] fmCache = new int[4 * 4];
- b.setLocale(paint.getTextLocale()); // TODO: also respect LocaleSpan within the text
+ b.setLocales(paint.getTextLocales());
mLineCount = 0;
@@ -1308,7 +1319,8 @@
/* package */ static native long nLoadHyphenator(ByteBuffer buf, int offset,
int minPrefix, int minSuffix);
- private static native void nSetLocale(long nativePtr, String locale, long nativeHyphenator);
+ private static native void nSetLocales(long nativePtr, String locales,
+ long[] nativeHyphenators);
private static native void nSetIndents(long nativePtr, int[] indents);
diff --git a/core/java/android/text/TextLine.java b/core/java/android/text/TextLine.java
index e4ed62a..2dbff10 100644
--- a/core/java/android/text/TextLine.java
+++ b/core/java/android/text/TextLine.java
@@ -72,8 +72,8 @@
private final SpanSet<ReplacementSpan> mReplacementSpanSpanSet =
new SpanSet<ReplacementSpan>(ReplacementSpan.class);
- private final UnderlineInfo mUnderlineInfo = new UnderlineInfo();
- private final ArrayList<UnderlineInfo> mUnderlines = new ArrayList();
+ private final DecorationInfo mDecorationInfo = new DecorationInfo();
+ private final ArrayList<DecorationInfo> mDecorations = new ArrayList();
private static final TextLine[] sCached = new TextLine[3];
@@ -704,9 +704,9 @@
fmi.leading = Math.max(fmi.leading, previousLeading);
}
- private static void drawUnderline(TextPaint wp, Canvas c, int color, float thickness,
- float xleft, float xright, float baseline) {
- final float underlineTop = baseline + wp.baselineShift + wp.getUnderlinePosition();
+ private static void drawStroke(TextPaint wp, Canvas c, int color, float position,
+ float thickness, float xleft, float xright, float baseline) {
+ final float strokeTop = baseline + wp.baselineShift + position;
final int previousColor = wp.getColor();
final Paint.Style previousStyle = wp.getStyle();
@@ -716,7 +716,7 @@
wp.setAntiAlias(true);
wp.setColor(color);
- c.drawRect(xleft, underlineTop, xright, underlineTop + thickness, wp);
+ c.drawRect(xleft, strokeTop, xright, strokeTop + thickness, wp);
wp.setStyle(previousStyle);
wp.setColor(previousColor);
@@ -750,7 +750,7 @@
* @param fmi receives metrics information, can be null
* @param needWidth true if the width of the run is needed
* @param offset the offset for the purpose of measuring
- * @param underlines the list of locations and paremeters for drawing underlines
+ * @param decorations the list of locations and paremeters for drawing decorations
* @return the signed width of the run based on the run direction; only
* valid if needWidth is true
*/
@@ -758,7 +758,7 @@
int contextStart, int contextEnd, boolean runIsRtl,
Canvas c, float x, int top, int y, int bottom,
FontMetricsInt fmi, boolean needWidth, int offset,
- @Nullable ArrayList<UnderlineInfo> underlines) {
+ @Nullable ArrayList<DecorationInfo> decorations) {
wp.setWordSpacing(mAddedWidth);
// Get metrics first (even for empty strings or "0" width runs)
@@ -773,8 +773,8 @@
float totalWidth = 0;
- final int numUnderlines = underlines == null ? 0 : underlines.size();
- if (needWidth || (c != null && (wp.bgColor != 0 || numUnderlines != 0 || runIsRtl))) {
+ final int numDecorations = decorations == null ? 0 : decorations.size();
+ if (needWidth || (c != null && (wp.bgColor != 0 || numDecorations != 0 || runIsRtl))) {
totalWidth = getRunAdvance(wp, start, end, contextStart, contextEnd, runIsRtl, offset);
}
@@ -800,35 +800,44 @@
wp.setColor(previousColor);
}
- if (numUnderlines != 0) {
- for (int i = 0; i < numUnderlines; i++) {
- final UnderlineInfo info = underlines.get(i);
+ if (numDecorations != 0) {
+ for (int i = 0; i < numDecorations; i++) {
+ final DecorationInfo info = decorations.get(i);
- final int underlineStart = Math.max(info.start, start);
- final int underlineEnd = Math.min(info.end, offset);
- float underlineStartAdvance = getRunAdvance(
- wp, start, end, contextStart, contextEnd, runIsRtl, underlineStart);
- float underlineEndAdvance = getRunAdvance(
- wp, start, end, contextStart, contextEnd, runIsRtl, underlineEnd);
- final float underlineXLeft, underlineXRight;
+ final int decorationStart = Math.max(info.start, start);
+ final int decorationEnd = Math.min(info.end, offset);
+ float decorationStartAdvance = getRunAdvance(
+ wp, start, end, contextStart, contextEnd, runIsRtl, decorationStart);
+ float decorationEndAdvance = getRunAdvance(
+ wp, start, end, contextStart, contextEnd, runIsRtl, decorationEnd);
+ final float decorationXLeft, decorationXRight;
if (runIsRtl) {
- underlineXLeft = rightX - underlineEndAdvance;
- underlineXRight = rightX - underlineStartAdvance;
+ decorationXLeft = rightX - decorationEndAdvance;
+ decorationXRight = rightX - decorationStartAdvance;
} else {
- underlineXLeft = leftX + underlineStartAdvance;
- underlineXRight = leftX + underlineEndAdvance;
+ decorationXLeft = leftX + decorationStartAdvance;
+ decorationXRight = leftX + decorationEndAdvance;
}
// Theoretically, there could be cases where both Paint's and TextPaint's
// setUnderLineText() are called. For backward compatibility, we need to draw
// both underlines, the one with custom color first.
if (info.underlineColor != 0) {
- drawUnderline(wp, c, info.underlineColor, info.underlineThickness,
- underlineXLeft, underlineXRight, y);
+ drawStroke(wp, c, info.underlineColor, wp.getUnderlinePosition(),
+ info.underlineThickness, decorationXLeft, decorationXRight, y);
}
if (info.isUnderlineText) {
- drawUnderline(wp, c, wp.getColor(), ((Paint) wp).getUnderlineThickness(),
- underlineXLeft, underlineXRight, y);
+ final float thickness =
+ Math.max(((Paint) wp).getUnderlineThickness(), 1.0f);
+ drawStroke(wp, c, wp.getColor(), wp.getUnderlinePosition(), thickness,
+ decorationXLeft, decorationXRight, y);
+ }
+
+ if (info.isStrikeThruText) {
+ final float thickness =
+ Math.max(((Paint) wp).getStrikeThruThickness(), 1.0f);
+ drawStroke(wp, c, wp.getColor(), wp.getStrikeThruPosition(), thickness,
+ decorationXLeft, decorationXRight, y);
}
}
}
@@ -917,20 +926,22 @@
return result;
}
- private static final class UnderlineInfo {
+ private static final class DecorationInfo {
+ public boolean isStrikeThruText;
public boolean isUnderlineText;
public int underlineColor;
public float underlineThickness;
public int start = -1;
public int end = -1;
- public boolean hasUnderline() {
- return isUnderlineText || underlineColor != 0;
+ public boolean hasDecoration() {
+ return isStrikeThruText || isUnderlineText || underlineColor != 0;
}
// Copies the info, but not the start and end range.
- public UnderlineInfo copyInfo() {
- final UnderlineInfo copy = new UnderlineInfo();
+ public DecorationInfo copyInfo() {
+ final DecorationInfo copy = new DecorationInfo();
+ copy.isStrikeThruText = isStrikeThruText;
copy.isUnderlineText = isUnderlineText;
copy.underlineColor = underlineColor;
copy.underlineThickness = underlineThickness;
@@ -938,7 +949,11 @@
}
}
- private void extractUnderlineInfo(@NonNull TextPaint paint, @NonNull UnderlineInfo info) {
+ private void extractDecorationInfo(@NonNull TextPaint paint, @NonNull DecorationInfo info) {
+ info.isStrikeThruText = paint.isStrikeThruText();
+ if (info.isStrikeThruText) {
+ paint.setStrikeThruText(false);
+ }
info.isUnderlineText = paint.isUnderlineText();
if (info.isUnderlineText) {
paint.setUnderlineText(false);
@@ -986,7 +1001,17 @@
return 0f;
}
+ final boolean needsSpanMeasurement;
if (mSpanned == null) {
+ needsSpanMeasurement = false;
+ } else {
+ mMetricAffectingSpanSpanSet.init(mSpanned, mStart + start, mStart + limit);
+ mCharacterStyleSpanSet.init(mSpanned, mStart + start, mStart + limit);
+ needsSpanMeasurement = mMetricAffectingSpanSpanSet.numberOfSpans != 0
+ || mCharacterStyleSpanSet.numberOfSpans != 0;
+ }
+
+ if (!needsSpanMeasurement) {
final TextPaint wp = mWorkPaint;
wp.set(mPaint);
wp.setHyphenEdit(adjustHyphenEdit(start, limit, wp.getHyphenEdit()));
@@ -994,9 +1019,6 @@
y, bottom, fmi, needWidth, measureLimit, null);
}
- mMetricAffectingSpanSpanSet.init(mSpanned, mStart + start, mStart + limit);
- mCharacterStyleSpanSet.init(mSpanned, mStart + start, mStart + limit);
-
// Shaping needs to take into account context up to metric boundaries,
// but rendering needs to take into account character style boundaries.
// So we iterate through metric runs to get metric bounds,
@@ -1038,8 +1060,8 @@
activePaint.set(mPaint);
int activeStart = i;
int activeEnd = mlimit;
- final UnderlineInfo underlineInfo = mUnderlineInfo;
- mUnderlines.clear();
+ final DecorationInfo decorationInfo = mDecorationInfo;
+ mDecorations.clear();
for (int j = i, jnext; j < mlimit; j = jnext) {
jnext = mCharacterStyleSpanSet.getNextTransition(mStart + j, mStart + inext) -
mStart;
@@ -1055,7 +1077,7 @@
span.updateDrawState(wp);
}
- extractUnderlineInfo(wp, underlineInfo);
+ extractDecorationInfo(wp, decorationInfo);
if (j == i) {
// First chunk of text. We can't handle it yet, since we may need to merge it
@@ -1070,24 +1092,24 @@
activeStart, activeEnd, mPaint.getHyphenEdit()));
x += handleText(activePaint, activeStart, activeEnd, i, inext, runIsRtl, c, x,
top, y, bottom, fmi, needWidth || activeEnd < measureLimit,
- Math.min(activeEnd, mlimit), mUnderlines);
+ Math.min(activeEnd, mlimit), mDecorations);
activeStart = j;
activePaint.set(wp);
- mUnderlines.clear();
+ mDecorations.clear();
} else {
// The present TextPaint is substantially equal to the last TextPaint except
- // perhaps for underlines. We just need to expand the active piece of text to
+ // perhaps for decorations. We just need to expand the active piece of text to
// include the present chunk, which we always do anyway. We don't need to save
// wp to activePaint, since they are already equal.
}
activeEnd = jnext;
- if (underlineInfo.hasUnderline()) {
- final UnderlineInfo copy = underlineInfo.copyInfo();
+ if (decorationInfo.hasDecoration()) {
+ final DecorationInfo copy = decorationInfo.copyInfo();
copy.start = j;
copy.end = jnext;
- mUnderlines.add(copy);
+ mDecorations.add(copy);
}
}
// Handle the final piece of text.
@@ -1095,7 +1117,7 @@
activeStart, activeEnd, mPaint.getHyphenEdit()));
x += handleText(activePaint, activeStart, activeEnd, i, inext, runIsRtl, c, x,
top, y, bottom, fmi, needWidth || activeEnd < measureLimit,
- Math.min(activeEnd, mlimit), mUnderlines);
+ Math.min(activeEnd, mlimit), mDecorations);
}
return x - originalX;
diff --git a/core/java/android/text/TextUtils.java b/core/java/android/text/TextUtils.java
index 3baadd4..440c88e 100644
--- a/core/java/android/text/TextUtils.java
+++ b/core/java/android/text/TextUtils.java
@@ -23,6 +23,8 @@
import android.content.Context;
import android.content.res.Resources;
import android.icu.lang.UCharacter;
+import android.icu.text.CaseMap;
+import android.icu.text.Edits;
import android.icu.util.ULocale;
import android.os.Parcel;
import android.os.Parcelable;
@@ -1072,6 +1074,75 @@
}
}
+ /**
+ * Transforms a CharSequences to uppercase, copying the sources spans and keeping them spans as
+ * much as possible close to their relative original places. In the case the the uppercase
+ * string is identical to the sources, the source itself is returned instead of being copied.
+ *
+ * If copySpans is set, source must be an instance of Spanned.
+ *
+ * {@hide}
+ */
+ @NonNull
+ public static CharSequence toUpperCase(@Nullable Locale locale, @NonNull CharSequence source,
+ boolean copySpans) {
+ final Edits edits = new Edits();
+ if (!copySpans) { // No spans. Just uppercase the characters.
+ final StringBuilder result = CaseMap.toUpper().apply(
+ locale, source, new StringBuilder(), edits);
+ return edits.hasChanges() ? result : source;
+ }
+
+ final SpannableStringBuilder result = CaseMap.toUpper().apply(
+ locale, source, new SpannableStringBuilder(), edits);
+ if (!edits.hasChanges()) {
+ // No changes happened while capitalizing. We can return the source as it was.
+ return source;
+ }
+
+ final Edits.Iterator iterator = edits.getFineIterator();
+ final int sourceLength = source.length();
+ final Spanned spanned = (Spanned) source;
+ final Object[] spans = spanned.getSpans(0, sourceLength, Object.class);
+ for (Object span : spans) {
+ final int sourceStart = spanned.getSpanStart(span);
+ final int sourceEnd = spanned.getSpanEnd(span);
+ final int flags = spanned.getSpanFlags(span);
+ // Make sure the indices are not at the end of the string, since in that case
+ // iterator.findSourceIndex() would fail.
+ final int destStart = sourceStart == sourceLength ? result.length() :
+ toUpperMapToDest(iterator, sourceStart);
+ final int destEnd = sourceEnd == sourceLength ? result.length() :
+ toUpperMapToDest(iterator, sourceEnd);
+ result.setSpan(span, destStart, destEnd, flags);
+ }
+ return result;
+ }
+
+ // helper method for toUpperCase()
+ private static int toUpperMapToDest(Edits.Iterator iterator, int sourceIndex) {
+ // Guaranteed to succeed if sourceIndex < source.length().
+ iterator.findSourceIndex(sourceIndex);
+ if (sourceIndex == iterator.sourceIndex()) {
+ return iterator.destinationIndex();
+ }
+ // We handle the situation differently depending on if we are in the changed slice or an
+ // unchanged one: In an unchanged slice, we can find the exact location the span
+ // boundary was before and map there.
+ //
+ // But in a changed slice, we need to treat the whole destination slice as an atomic unit.
+ // We adjust the span boundary to the end of that slice to reduce of the chance of adjacent
+ // spans in the source overlapping in the result. (The choice for the end vs the beginning
+ // is somewhat arbitrary, but was taken because we except to see slightly more spans only
+ // affecting a base character compared to spans only affecting a combining character.)
+ if (iterator.hasChange()) {
+ return iterator.destinationIndex() + iterator.newLength();
+ } else {
+ // Move the index 1:1 along with this unchanged piece of text.
+ return iterator.destinationIndex() + (sourceIndex - iterator.sourceIndex());
+ }
+ }
+
public enum TruncateAt {
START,
MIDDLE,
diff --git a/core/java/android/text/format/Formatter.java b/core/java/android/text/format/Formatter.java
index b67ac98..fc56455 100644
--- a/core/java/android/text/format/Formatter.java
+++ b/core/java/android/text/format/Formatter.java
@@ -20,11 +20,19 @@
import android.annotation.Nullable;
import android.content.Context;
import android.content.res.Resources;
+import android.icu.text.DecimalFormat;
+import android.icu.text.MeasureFormat;
+import android.icu.text.NumberFormat;
+import android.icu.text.UnicodeSet;
+import android.icu.text.UnicodeSetSpanner;
+import android.icu.util.Measure;
+import android.icu.util.MeasureUnit;
import android.net.NetworkUtils;
import android.text.BidiFormatter;
import android.text.TextUtils;
import android.view.View;
+import java.math.BigDecimal;
import java.util.Locale;
/**
@@ -34,6 +42,8 @@
public final class Formatter {
/** {@hide} */
+ public static final int FLAG_DEFAULT = 0;
+ /** {@hide} */
public static final int FLAG_SHORTER = 1 << 0;
/** {@hide} */
public static final int FLAG_CALCULATE_ROUNDED = 1 << 1;
@@ -51,9 +61,15 @@
}
}
- /* Wraps the source string in bidi formatting characters in RTL locales */
+ private static Locale localeFromContext(@NonNull Context context) {
+ return context.getResources().getConfiguration().getLocales().get(0);
+ }
+
+ /**
+ * Wraps the source string in bidi formatting characters in RTL locales.
+ */
private static String bidiWrap(@NonNull Context context, String source) {
- final Locale locale = context.getResources().getConfiguration().locale;
+ final Locale locale = localeFromContext(context);
if (TextUtils.getLayoutDirectionFromLocale(locale) == View.LAYOUT_DIRECTION_RTL) {
return BidiFormatter.getInstance(true /* RTL*/).unicodeWrap(source);
} else {
@@ -80,12 +96,7 @@
* @return formatted string with the number
*/
public static String formatFileSize(@Nullable Context context, long sizeBytes) {
- if (context == null) {
- return "";
- }
- final BytesResult res = formatBytes(context.getResources(), sizeBytes, 0);
- return bidiWrap(context, context.getString(com.android.internal.R.string.fileSizeSuffix,
- res.value, res.units));
+ return formatFileSize(context, sizeBytes, FLAG_DEFAULT);
}
/**
@@ -93,88 +104,191 @@
* (showing fewer digits of precision).
*/
public static String formatShortFileSize(@Nullable Context context, long sizeBytes) {
+ return formatFileSize(context, sizeBytes, FLAG_SHORTER);
+ }
+
+ private static String formatFileSize(@Nullable Context context, long sizeBytes, int flags) {
if (context == null) {
return "";
}
- final BytesResult res = formatBytes(context.getResources(), sizeBytes, FLAG_SHORTER);
- return bidiWrap(context, context.getString(com.android.internal.R.string.fileSizeSuffix,
- res.value, res.units));
+ final RoundedBytesResult res = RoundedBytesResult.roundBytes(sizeBytes, flags);
+ return bidiWrap(context, formatRoundedBytesResult(context, res));
+ }
+
+ private static String getSuffixOverride(@NonNull Resources res, MeasureUnit unit) {
+ if (unit == MeasureUnit.BYTE) {
+ return res.getString(com.android.internal.R.string.byteShort);
+ } else { // unit == PETABYTE
+ return res.getString(com.android.internal.R.string.petabyteShort);
+ }
+ }
+
+ private static NumberFormat getNumberFormatter(Locale locale, int fractionDigits) {
+ final NumberFormat numberFormatter = NumberFormat.getInstance(locale);
+ numberFormatter.setMinimumFractionDigits(fractionDigits);
+ numberFormatter.setMaximumFractionDigits(fractionDigits);
+ numberFormatter.setGroupingUsed(false);
+ if (numberFormatter instanceof DecimalFormat) {
+ // We do this only for DecimalFormat, since in the general NumberFormat case, calling
+ // setRoundingMode may throw an exception.
+ numberFormatter.setRoundingMode(BigDecimal.ROUND_HALF_UP);
+ }
+ return numberFormatter;
+ }
+
+ private static String deleteFirstFromString(String source, String toDelete) {
+ final int location = source.indexOf(toDelete);
+ if (location == -1) {
+ return source;
+ } else {
+ return source.substring(0, location)
+ + source.substring(location + toDelete.length(), source.length());
+ }
+ }
+
+ private static String formatMeasureShort(Locale locale, NumberFormat numberFormatter,
+ float value, MeasureUnit units) {
+ final MeasureFormat measureFormatter = MeasureFormat.getInstance(
+ locale, MeasureFormat.FormatWidth.SHORT, numberFormatter);
+ return measureFormatter.format(new Measure(value, units));
+ }
+
+ private static final UnicodeSetSpanner SPACES_AND_CONTROLS =
+ new UnicodeSetSpanner(new UnicodeSet("[[:Zs:][:Cf:]]").freeze());
+
+ private static String formatRoundedBytesResult(
+ @NonNull Context context, @NonNull RoundedBytesResult input) {
+ final Locale locale = localeFromContext(context);
+ final NumberFormat numberFormatter = getNumberFormatter(locale, input.fractionDigits);
+ if (input.units == MeasureUnit.BYTE || input.units == PETABYTE) {
+ // ICU spells out "byte" instead of "B", and can't format petabytes yet.
+ final String formattedNumber = numberFormatter.format(input.value);
+ return context.getString(com.android.internal.R.string.fileSizeSuffix,
+ formattedNumber, getSuffixOverride(context.getResources(), input.units));
+ } else {
+ return formatMeasureShort(locale, numberFormatter, input.value, input.units);
+ }
}
/** {@hide} */
public static BytesResult formatBytes(Resources res, long sizeBytes, int flags) {
- final boolean isNegative = (sizeBytes < 0);
- float result = isNegative ? -sizeBytes : sizeBytes;
- int suffix = com.android.internal.R.string.byteShort;
- long mult = 1;
- if (result > 900) {
- suffix = com.android.internal.R.string.kilobyteShort;
- mult = 1000;
- result = result / 1000;
+ final RoundedBytesResult rounded = RoundedBytesResult.roundBytes(sizeBytes, flags);
+ final Locale locale = res.getConfiguration().getLocales().get(0);
+ final NumberFormat numberFormatter = getNumberFormatter(locale, rounded.fractionDigits);
+ final String formattedNumber = numberFormatter.format(rounded.value);
+ final String units;
+ if (rounded.units == MeasureUnit.BYTE || rounded.units == PETABYTE) {
+ // ICU spells out "byte" instead of "B", and can't format petabytes yet.
+ units = getSuffixOverride(res, rounded.units);
+ } else {
+ // Since ICU does not give us access to the pattern, we need to extract the unit string
+ // from ICU, which we do by taking out the formatted number out of the formatted string
+ // and trimming the result of spaces and controls.
+ final String formattedMeasure = formatMeasureShort(
+ locale, numberFormatter, rounded.value, rounded.units);
+ final String numberRemoved = deleteFirstFromString(formattedMeasure, formattedNumber);
+ units = SPACES_AND_CONTROLS.trim(numberRemoved).toString();
}
- if (result > 900) {
- suffix = com.android.internal.R.string.megabyteShort;
- mult *= 1000;
- result = result / 1000;
+ return new BytesResult(formattedNumber, units, rounded.roundedBytes);
+ }
+
+ /**
+ * ICU doesn't support PETABYTE yet. Fake it so that we can treat all units the same way.
+ * {@hide}
+ */
+ public static final MeasureUnit PETABYTE = MeasureUnit.internalGetInstance(
+ "digital", "petabyte");
+
+ /** {@hide} */
+ public static class RoundedBytesResult {
+ public final float value;
+ public final MeasureUnit units;
+ public final int fractionDigits;
+ public final long roundedBytes;
+
+ private RoundedBytesResult(
+ float value, MeasureUnit units, int fractionDigits, long roundedBytes) {
+ this.value = value;
+ this.units = units;
+ this.fractionDigits = fractionDigits;
+ this.roundedBytes = roundedBytes;
}
- if (result > 900) {
- suffix = com.android.internal.R.string.gigabyteShort;
- mult *= 1000;
- result = result / 1000;
- }
- if (result > 900) {
- suffix = com.android.internal.R.string.terabyteShort;
- mult *= 1000;
- result = result / 1000;
- }
- if (result > 900) {
- suffix = com.android.internal.R.string.petabyteShort;
- mult *= 1000;
- result = result / 1000;
- }
- // Note we calculate the rounded long by ourselves, but still let String.format()
- // compute the rounded value. String.format("%f", 0.1) might not return "0.1" due to
- // floating point errors.
- final int roundFactor;
- final String roundFormat;
- if (mult == 1 || result >= 100) {
- roundFactor = 1;
- roundFormat = "%.0f";
- } else if (result < 1) {
- roundFactor = 100;
- roundFormat = "%.2f";
- } else if (result < 10) {
- if ((flags & FLAG_SHORTER) != 0) {
- roundFactor = 10;
- roundFormat = "%.1f";
- } else {
- roundFactor = 100;
- roundFormat = "%.2f";
+
+ /**
+ * Returns a RoundedBytesResult object based on the input size in bytes and the rounding
+ * flags. The result can be used for formatting.
+ */
+ public static RoundedBytesResult roundBytes(long sizeBytes, int flags) {
+ final boolean isNegative = (sizeBytes < 0);
+ float result = isNegative ? -sizeBytes : sizeBytes;
+ MeasureUnit units = MeasureUnit.BYTE;
+ long mult = 1;
+ if (result > 900) {
+ units = MeasureUnit.KILOBYTE;
+ mult = 1000;
+ result = result / 1000;
}
- } else { // 10 <= result < 100
- if ((flags & FLAG_SHORTER) != 0) {
+ if (result > 900) {
+ units = MeasureUnit.MEGABYTE;
+ mult *= 1000;
+ result = result / 1000;
+ }
+ if (result > 900) {
+ units = MeasureUnit.GIGABYTE;
+ mult *= 1000;
+ result = result / 1000;
+ }
+ if (result > 900) {
+ units = MeasureUnit.TERABYTE;
+ mult *= 1000;
+ result = result / 1000;
+ }
+ if (result > 900) {
+ units = PETABYTE;
+ mult *= 1000;
+ result = result / 1000;
+ }
+ // Note we calculate the rounded long by ourselves, but still let NumberFormat compute
+ // the rounded value. NumberFormat.format(0.1) might not return "0.1" due to floating
+ // point errors.
+ final int roundFactor;
+ final int roundDigits;
+ if (mult == 1 || result >= 100) {
roundFactor = 1;
- roundFormat = "%.0f";
- } else {
+ roundDigits = 0;
+ } else if (result < 1) {
roundFactor = 100;
- roundFormat = "%.2f";
+ roundDigits = 2;
+ } else if (result < 10) {
+ if ((flags & FLAG_SHORTER) != 0) {
+ roundFactor = 10;
+ roundDigits = 1;
+ } else {
+ roundFactor = 100;
+ roundDigits = 2;
+ }
+ } else { // 10 <= result < 100
+ if ((flags & FLAG_SHORTER) != 0) {
+ roundFactor = 1;
+ roundDigits = 0;
+ } else {
+ roundFactor = 100;
+ roundDigits = 2;
+ }
}
+
+ if (isNegative) {
+ result = -result;
+ }
+
+ // Note this might overflow if abs(result) >= Long.MAX_VALUE / 100, but that's like
+ // 80PB so it's okay (for now)...
+ final long roundedBytes =
+ (flags & FLAG_CALCULATE_ROUNDED) == 0 ? 0
+ : (((long) Math.round(result * roundFactor)) * mult / roundFactor);
+
+ return new RoundedBytesResult(result, units, roundDigits, roundedBytes);
}
-
- if (isNegative) {
- result = -result;
- }
- final String roundedString = String.format(roundFormat, result);
-
- // Note this might overflow if abs(result) >= Long.MAX_VALUE / 100, but that's like 80PB so
- // it's okay (for now)...
- final long roundedBytes =
- (flags & FLAG_CALCULATE_ROUNDED) == 0 ? 0
- : (((long) Math.round(result * roundFactor)) * mult / roundFactor);
-
- final String units = res.getString(suffix);
-
- return new BytesResult(roundedString, units, roundedBytes);
}
/**
@@ -197,7 +311,7 @@
/**
* Returns elapsed time for the given millis, in the following format:
- * 1 day 5 hrs; will include at most two units, can go down to seconds precision.
+ * 1 day, 5 hr; will include at most two units, can go down to seconds precision.
* @param context the application context
* @param millis the elapsed time in milli seconds
* @return the formatted elapsed time
@@ -221,44 +335,38 @@
}
int seconds = (int)secondsLong;
+ final Locale locale = localeFromContext(context);
+ final MeasureFormat measureFormat = MeasureFormat.getInstance(
+ locale, MeasureFormat.FormatWidth.SHORT);
if (days >= 2) {
days += (hours+12)/24;
- return context.getString(com.android.internal.R.string.durationDays, days);
+ return measureFormat.format(new Measure(days, MeasureUnit.DAY));
} else if (days > 0) {
- if (hours == 1) {
- return context.getString(com.android.internal.R.string.durationDayHour, days, hours);
- }
- return context.getString(com.android.internal.R.string.durationDayHours, days, hours);
+ return measureFormat.formatMeasures(
+ new Measure(days, MeasureUnit.DAY),
+ new Measure(hours, MeasureUnit.HOUR));
} else if (hours >= 2) {
hours += (minutes+30)/60;
- return context.getString(com.android.internal.R.string.durationHours, hours);
+ return measureFormat.format(new Measure(hours, MeasureUnit.HOUR));
} else if (hours > 0) {
- if (minutes == 1) {
- return context.getString(com.android.internal.R.string.durationHourMinute, hours,
- minutes);
- }
- return context.getString(com.android.internal.R.string.durationHourMinutes, hours,
- minutes);
+ return measureFormat.formatMeasures(
+ new Measure(hours, MeasureUnit.HOUR),
+ new Measure(minutes, MeasureUnit.MINUTE));
} else if (minutes >= 2) {
minutes += (seconds+30)/60;
- return context.getString(com.android.internal.R.string.durationMinutes, minutes);
+ return measureFormat.format(new Measure(minutes, MeasureUnit.MINUTE));
} else if (minutes > 0) {
- if (seconds == 1) {
- return context.getString(com.android.internal.R.string.durationMinuteSecond, minutes,
- seconds);
- }
- return context.getString(com.android.internal.R.string.durationMinuteSeconds, minutes,
- seconds);
- } else if (seconds == 1) {
- return context.getString(com.android.internal.R.string.durationSecond, seconds);
+ return measureFormat.formatMeasures(
+ new Measure(minutes, MeasureUnit.MINUTE),
+ new Measure(seconds, MeasureUnit.SECOND));
} else {
- return context.getString(com.android.internal.R.string.durationSeconds, seconds);
+ return measureFormat.format(new Measure(seconds, MeasureUnit.SECOND));
}
}
/**
* Returns elapsed time for the given millis, in the following format:
- * 1 day 5 hrs; will include at most two units, can go down to minutes precision.
+ * 1 day, 5 hr; will include at most two units, can go down to minutes precision.
* @param context the application context
* @param millis the elapsed time in milli seconds
* @return the formatted elapsed time
@@ -267,10 +375,11 @@
public static String formatShortElapsedTimeRoundingUpToMinutes(Context context, long millis) {
long minutesRoundedUp = (millis + MILLIS_PER_MINUTE - 1) / MILLIS_PER_MINUTE;
- if (minutesRoundedUp == 0) {
- return context.getString(com.android.internal.R.string.durationMinutes, 0);
- } else if (minutesRoundedUp == 1) {
- return context.getString(com.android.internal.R.string.durationMinute, 1);
+ if (minutesRoundedUp == 0 || minutesRoundedUp == 1) {
+ final Locale locale = localeFromContext(context);
+ final MeasureFormat measureFormat = MeasureFormat.getInstance(
+ locale, MeasureFormat.FormatWidth.SHORT);
+ return measureFormat.format(new Measure(minutesRoundedUp, MeasureUnit.MINUTE));
}
return formatShortElapsedTime(context, minutesRoundedUp * MILLIS_PER_MINUTE);
diff --git a/core/java/android/text/method/AllCapsTransformationMethod.java b/core/java/android/text/method/AllCapsTransformationMethod.java
index 15f40d5..c807e7d 100644
--- a/core/java/android/text/method/AllCapsTransformationMethod.java
+++ b/core/java/android/text/method/AllCapsTransformationMethod.java
@@ -15,12 +15,12 @@
*/
package android.text.method;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.content.Context;
import android.graphics.Rect;
-import android.icu.text.CaseMap;
-import android.icu.text.Edits;
-import android.text.SpannableStringBuilder;
import android.text.Spanned;
+import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
@@ -38,12 +38,12 @@
private boolean mEnabled;
private Locale mLocale;
- public AllCapsTransformationMethod(Context context) {
+ public AllCapsTransformationMethod(@NonNull Context context) {
mLocale = context.getResources().getConfiguration().getLocales().get(0);
}
@Override
- public CharSequence getTransformation(CharSequence source, View view) {
+ public CharSequence getTransformation(@Nullable CharSequence source, View view) {
if (!mEnabled) {
Log.w(TAG, "Caller did not enable length changes; not transforming text");
return source;
@@ -60,61 +60,8 @@
if (locale == null) {
locale = mLocale;
}
-
- if (!(source instanceof Spanned)) { // No spans
- return CaseMap.toUpper().apply(
- locale, source, new StringBuilder(),
- null /* we don't need the edits */);
- }
-
- final Edits edits = new Edits();
- final SpannableStringBuilder result = CaseMap.toUpper().apply(
- locale, source, new SpannableStringBuilder(), edits);
- if (!edits.hasChanges()) {
- // No changes happened while capitalizing. We can return the source as it was.
- return source;
- }
-
- final Edits.Iterator iterator = edits.getFineIterator();
- final Spanned spanned = (Spanned) source;
- final int sourceLength = source.length();
- final Object[] spans = spanned.getSpans(0, sourceLength, Object.class);
- for (Object span : spans) {
- final int sourceStart = spanned.getSpanStart(span);
- final int sourceEnd = spanned.getSpanEnd(span);
- final int flags = spanned.getSpanFlags(span);
- // Make sure the indexes are not at the end of the string, since in that case
- // iterator.findSourceIndex() would fail.
- final int destStart = sourceStart == sourceLength ? result.length() :
- mapToDest(iterator, sourceStart);
- final int destEnd = sourceEnd == sourceLength ? result.length() :
- mapToDest(iterator, sourceEnd);
- result.setSpan(span, destStart, destEnd, flags);
- }
- return result;
- }
-
- private static int mapToDest(Edits.Iterator iterator, int sourceIndex) {
- // Guaranteed to succeed if sourceIndex < source.length().
- iterator.findSourceIndex(sourceIndex);
- if (sourceIndex == iterator.sourceIndex()) {
- return iterator.destinationIndex();
- }
- // We handle the situation differently depending on if we are in the changed slice or an
- // unchanged one: In an unchanged slice, we can find the exact location the span
- // boundary was before and map there.
- //
- // But in a changed slice, we need to treat the whole destination slice as an atomic unit.
- // We adjust the span boundary to the end of that slice to reduce of the chance of adjacent
- // spans in the source overlapping in the result. (The choice for the end vs the beginning
- // is somewhat arbitrary, but was taken because we except to see slightly more spans only
- // affecting a base character compared to spans only affecting a combining character.)
- if (iterator.hasChange()) {
- return iterator.destinationIndex() + iterator.newLength();
- } else {
- // Move the index 1:1 along with this unchanged piece of text.
- return iterator.destinationIndex() + (sourceIndex - iterator.sourceIndex());
- }
+ final boolean copySpans = source instanceof Spanned;
+ return TextUtils.toUpperCase(locale, source, copySpans);
}
@Override
diff --git a/core/java/android/text/style/TextAppearanceSpan.java b/core/java/android/text/style/TextAppearanceSpan.java
index abbd793..3a3646b 100644
--- a/core/java/android/text/style/TextAppearanceSpan.java
+++ b/core/java/android/text/style/TextAppearanceSpan.java
@@ -19,6 +19,7 @@
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.TypedArray;
+import android.graphics.LeakyTypefaceStorage;
import android.graphics.Typeface;
import android.os.Parcel;
import android.text.ParcelableSpan;
@@ -30,11 +31,12 @@
* resource.
*/
public class TextAppearanceSpan extends MetricAffectingSpan implements ParcelableSpan {
- private final String mTypeface;
+ private final String mFamilyName;
private final int mStyle;
private final int mTextSize;
private final ColorStateList mTextColor;
private final ColorStateList mTextColorLink;
+ private final Typeface mTypeface;
/**
* Uses the specified TextAppearance resource to determine the
@@ -55,7 +57,7 @@
*/
public TextAppearanceSpan(Context context, int appearance, int colorList) {
ColorStateList textColor;
-
+
TypedArray a =
context.obtainStyledAttributes(appearance,
com.android.internal.R.styleable.TextAppearance);
@@ -68,28 +70,33 @@
TextAppearance_textSize, -1);
mStyle = a.getInt(com.android.internal.R.styleable.TextAppearance_textStyle, 0);
- String family = a.getString(com.android.internal.R.styleable.TextAppearance_fontFamily);
- if (family != null) {
- mTypeface = family;
+ mTypeface = a.getFont(com.android.internal.R.styleable.TextAppearance_fontFamily);
+ if (mTypeface != null) {
+ mFamilyName = null;
} else {
- int tf = a.getInt(com.android.internal.R.styleable.TextAppearance_typeface, 0);
+ String family = a.getString(com.android.internal.R.styleable.TextAppearance_fontFamily);
+ if (family != null) {
+ mFamilyName = family;
+ } else {
+ int tf = a.getInt(com.android.internal.R.styleable.TextAppearance_typeface, 0);
- switch (tf) {
- case 1:
- mTypeface = "sans";
- break;
+ switch (tf) {
+ case 1:
+ mFamilyName = "sans";
+ break;
- case 2:
- mTypeface = "serif";
- break;
+ case 2:
+ mFamilyName = "serif";
+ break;
- case 3:
- mTypeface = "monospace";
- break;
+ case 3:
+ mFamilyName = "monospace";
+ break;
- default:
- mTypeface = null;
- break;
+ default:
+ mFamilyName = null;
+ break;
+ }
}
}
@@ -102,7 +109,7 @@
textColor = a.getColorStateList(colorList);
a.recycle();
}
-
+
mTextColor = textColor;
}
@@ -112,15 +119,16 @@
*/
public TextAppearanceSpan(String family, int style, int size,
ColorStateList color, ColorStateList linkColor) {
- mTypeface = family;
+ mFamilyName = family;
mStyle = style;
mTextSize = size;
mTextColor = color;
mTextColorLink = linkColor;
+ mTypeface = null;
}
public TextAppearanceSpan(Parcel src) {
- mTypeface = src.readString();
+ mFamilyName = src.readString();
mStyle = src.readInt();
mTextSize = src.readInt();
if (src.readInt() != 0) {
@@ -133,8 +141,9 @@
} else {
mTextColorLink = null;
}
+ mTypeface = LeakyTypefaceStorage.readTypefaceFromParcel(src);
}
-
+
public int getSpanTypeId() {
return getSpanTypeIdInternal();
}
@@ -143,7 +152,7 @@
public int getSpanTypeIdInternal() {
return TextUtils.TEXT_APPEARANCE_SPAN;
}
-
+
public int describeContents() {
return 0;
}
@@ -154,7 +163,7 @@
/** @hide */
public void writeToParcelInternal(Parcel dest, int flags) {
- dest.writeString(mTypeface);
+ dest.writeString(mFamilyName);
dest.writeInt(mStyle);
dest.writeInt(mTextSize);
if (mTextColor != null) {
@@ -169,6 +178,7 @@
} else {
dest.writeInt(0);
}
+ LeakyTypefaceStorage.writeTypefaceToParcel(mTypeface, dest);
}
/**
@@ -176,7 +186,7 @@
* if it does not specify one.
*/
public String getFamily() {
- return mTypeface;
+ return mFamilyName;
}
/**
@@ -226,9 +236,14 @@
@Override
public void updateMeasureState(TextPaint ds) {
- if (mTypeface != null || mStyle != 0) {
+ final Typeface styledTypeface;
+ int style = 0;
+
+ if (mTypeface != null) {
+ style = mStyle;
+ styledTypeface = Typeface.create(mTypeface, style);
+ } else if (mFamilyName != null || mStyle != 0) {
Typeface tf = ds.getTypeface();
- int style = 0;
if (tf != null) {
style = tf.getStyle();
@@ -236,15 +251,19 @@
style |= mStyle;
- if (mTypeface != null) {
- tf = Typeface.create(mTypeface, style);
+ if (mFamilyName != null) {
+ styledTypeface = Typeface.create(mFamilyName, style);
} else if (tf == null) {
- tf = Typeface.defaultFromStyle(style);
+ styledTypeface = Typeface.defaultFromStyle(style);
} else {
- tf = Typeface.create(tf, style);
+ styledTypeface = Typeface.create(tf, style);
}
+ } else {
+ styledTypeface = null;
+ }
- int fake = style & ~tf.getStyle();
+ if (styledTypeface != null) {
+ int fake = style & ~styledTypeface.getStyle();
if ((fake & Typeface.BOLD) != 0) {
ds.setFakeBoldText(true);
@@ -254,7 +273,7 @@
ds.setTextSkewX(-0.25f);
}
- ds.setTypeface(tf);
+ ds.setTypeface(styledTypeface);
}
if (mTextSize > 0) {
diff --git a/core/java/android/text/util/Linkify.java b/core/java/android/text/util/Linkify.java
index 7e6eb49..768aee9 100644
--- a/core/java/android/text/util/Linkify.java
+++ b/core/java/android/text/util/Linkify.java
@@ -19,7 +19,9 @@
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.content.Context;
import android.telephony.PhoneNumberUtils;
+import android.telephony.TelephonyManager;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.Spanned;
@@ -221,6 +223,11 @@
* @return True if at least one link is found and applied.
*/
public static final boolean addLinks(@NonNull Spannable text, @LinkifyMask int mask) {
+ return addLinks(text, mask, null);
+ }
+
+ private static boolean addLinks(@NonNull Spannable text, @LinkifyMask int mask,
+ @Nullable Context context) {
if (mask == 0) {
return false;
}
@@ -246,7 +253,7 @@
}
if ((mask & PHONE_NUMBERS) != 0) {
- gatherTelLinks(links, text);
+ gatherTelLinks(links, text, context);
}
if ((mask & MAP_ADDRESSES) != 0) {
@@ -282,10 +289,10 @@
return false;
}
- CharSequence t = text.getText();
-
+ final Context context = text.getContext();
+ final CharSequence t = text.getText();
if (t instanceof Spannable) {
- if (addLinks((Spannable) t, mask)) {
+ if (addLinks((Spannable) t, mask, context)) {
addLinkMovementMethod(text);
return true;
}
@@ -294,7 +301,7 @@
} else {
SpannableString s = SpannableString.valueOf(t);
- if (addLinks(s, mask)) {
+ if (addLinks(s, mask, context)) {
addLinkMovementMethod(text);
text.setText(s);
@@ -528,10 +535,15 @@
}
}
- private static final void gatherTelLinks(ArrayList<LinkSpec> links, Spannable s) {
+ private static void gatherTelLinks(ArrayList<LinkSpec> links, Spannable s,
+ @Nullable Context context) {
PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
+ final TelephonyManager tm = (context == null)
+ ? TelephonyManager.getDefault()
+ : TelephonyManager.from(context);
Iterable<PhoneNumberMatch> matches = phoneUtil.findNumbers(s.toString(),
- Locale.getDefault().getCountry(), Leniency.POSSIBLE, Long.MAX_VALUE);
+ tm.getSimCountryIso().toUpperCase(Locale.US),
+ Leniency.POSSIBLE, Long.MAX_VALUE);
for (PhoneNumberMatch match : matches) {
LinkSpec spec = new LinkSpec();
spec.url = "tel:" + PhoneNumberUtils.normalizeNumber(match.rawString());
diff --git a/core/java/android/util/BootTimingsTraceLog.java b/core/java/android/util/BootTimingsTraceLog.java
index 2e4319c..7a702a9 100644
--- a/core/java/android/util/BootTimingsTraceLog.java
+++ b/core/java/android/util/BootTimingsTraceLog.java
@@ -29,7 +29,7 @@
*/
public class BootTimingsTraceLog {
// Debug boot time for every step if it's non-user build.
- private static final boolean DEBUG_BOOT_TIME = !"user".equals(Build.TYPE);
+ private static final boolean DEBUG_BOOT_TIME = !Build.IS_USER;
private final Deque<Pair<String, Long>> mStartTimes
= DEBUG_BOOT_TIME ? new ArrayDeque<>() : null;
private final String mTag;
diff --git a/core/java/android/util/LocalLog.java b/core/java/android/util/LocalLog.java
index 665c583..eb84479f 100644
--- a/core/java/android/util/LocalLog.java
+++ b/core/java/android/util/LocalLog.java
@@ -18,10 +18,10 @@
import java.io.FileDescriptor;
import java.io.PrintWriter;
-import java.util.Calendar;
-import java.util.Iterator;
-import java.util.Deque;
+import java.time.LocalDateTime;
import java.util.ArrayDeque;
+import java.util.Deque;
+import java.util.Iterator;
/**
* @hide
@@ -40,9 +40,7 @@
if (mMaxLines <= 0) {
return;
}
- Calendar c = Calendar.getInstance();
- c.setTimeInMillis(System.currentTimeMillis());
- append(String.format("%tm-%td %tH:%tM:%tS.%tL - %s", c, c, c, c, c, c, msg));
+ append(String.format("%s - %s", LocalDateTime.now(), msg));
}
private synchronized void append(String logLine) {
diff --git a/core/java/android/util/RecurrenceRule.java b/core/java/android/util/RecurrenceRule.java
new file mode 100644
index 0000000..1fe638d
--- /dev/null
+++ b/core/java/android/util/RecurrenceRule.java
@@ -0,0 +1,257 @@
+/*
+ * Copyright (C) 2017 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.util;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.net.ProtocolException;
+import java.time.Clock;
+import java.time.LocalTime;
+import java.time.Period;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.util.Iterator;
+import java.util.Objects;
+
+/**
+ * Description of an event that should recur over time at a specific interval
+ * between two anchor points in time.
+ *
+ * @hide
+ */
+public class RecurrenceRule implements Parcelable {
+ private static final String TAG = "RecurrenceRule";
+ private static final boolean DEBUG = true;
+
+ private static final int VERSION_INIT = 0;
+
+ /** {@hide} */
+ @VisibleForTesting
+ public static Clock sClock = Clock.systemDefaultZone();
+
+ public final ZonedDateTime start;
+ public final ZonedDateTime end;
+ public final Period period;
+
+ public RecurrenceRule(ZonedDateTime start, ZonedDateTime end, Period period) {
+ this.start = start;
+ this.end = end;
+ this.period = period;
+ }
+
+ @Deprecated
+ public static RecurrenceRule buildNever() {
+ return new RecurrenceRule(null, null, null);
+ }
+
+ @Deprecated
+ public static RecurrenceRule buildRecurringMonthly(int dayOfMonth, ZoneId zone) {
+ // Assume we started last January, since it has all possible days
+ final ZonedDateTime now = ZonedDateTime.now(sClock).withZoneSameInstant(zone);
+ final ZonedDateTime start = ZonedDateTime.of(
+ now.toLocalDate().minusYears(1).withMonth(1).withDayOfMonth(dayOfMonth),
+ LocalTime.MIDNIGHT, zone);
+ return new RecurrenceRule(start, null, Period.ofMonths(1));
+ }
+
+ private RecurrenceRule(Parcel source) {
+ start = convertZonedDateTime(source.readString());
+ end = convertZonedDateTime(source.readString());
+ period = convertPeriod(source.readString());
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(convertZonedDateTime(start));
+ dest.writeString(convertZonedDateTime(end));
+ dest.writeString(convertPeriod(period));
+ }
+
+ public RecurrenceRule(DataInputStream in) throws IOException {
+ final int version = in.readInt();
+ switch (version) {
+ case VERSION_INIT:
+ start = convertZonedDateTime(BackupUtils.readString(in));
+ end = convertZonedDateTime(BackupUtils.readString(in));
+ period = convertPeriod(BackupUtils.readString(in));
+ default:
+ throw new ProtocolException("Unknown version " + version);
+ }
+ }
+
+ public void writeToStream(DataOutputStream out) throws IOException {
+ out.writeInt(VERSION_INIT);
+ BackupUtils.writeString(out, convertZonedDateTime(start));
+ BackupUtils.writeString(out, convertZonedDateTime(end));
+ BackupUtils.writeString(out, convertPeriod(period));
+ }
+
+ @Override
+ public String toString() {
+ return new StringBuilder("RecurrenceRule{")
+ .append("start=").append(start)
+ .append(" end=").append(end)
+ .append(" period=").append(period)
+ .append("}").toString();
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(start, end, period);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof RecurrenceRule) {
+ final RecurrenceRule other = (RecurrenceRule) obj;
+ return Objects.equals(start, other.start)
+ && Objects.equals(end, other.end)
+ && Objects.equals(period, other.period);
+ }
+ return false;
+ }
+
+ public static final Parcelable.Creator<RecurrenceRule> CREATOR = new Parcelable.Creator<RecurrenceRule>() {
+ @Override
+ public RecurrenceRule createFromParcel(Parcel source) {
+ return new RecurrenceRule(source);
+ }
+
+ @Override
+ public RecurrenceRule[] newArray(int size) {
+ return new RecurrenceRule[size];
+ }
+ };
+
+ @Deprecated
+ public boolean isMonthly() {
+ return start != null
+ && period != null
+ && period.getYears() == 0
+ && period.getMonths() == 1
+ && period.getDays() == 0;
+ }
+
+ public Iterator<Pair<ZonedDateTime, ZonedDateTime>> cycleIterator() {
+ if (period != null) {
+ return new RecurringIterator();
+ } else {
+ return new NonrecurringIterator();
+ }
+ }
+
+ private class NonrecurringIterator implements Iterator<Pair<ZonedDateTime, ZonedDateTime>> {
+ boolean hasNext;
+
+ public NonrecurringIterator() {
+ hasNext = (start != null) && (end != null);
+ }
+
+ @Override
+ public boolean hasNext() {
+ return hasNext;
+ }
+
+ @Override
+ public Pair<ZonedDateTime, ZonedDateTime> next() {
+ hasNext = false;
+ return new Pair<>(start, end);
+ }
+ }
+
+ private class RecurringIterator implements Iterator<Pair<ZonedDateTime, ZonedDateTime>> {
+ int i;
+ ZonedDateTime cycleStart;
+ ZonedDateTime cycleEnd;
+
+ public RecurringIterator() {
+ final ZonedDateTime anchor = (end != null) ? end
+ : ZonedDateTime.now(sClock).withZoneSameInstant(start.getZone());
+ if (DEBUG) Log.d(TAG, "Resolving using anchor " + anchor);
+
+ updateCycle();
+
+ // Walk forwards until we find first cycle after now
+ while (anchor.toEpochSecond() > cycleEnd.toEpochSecond()) {
+ i++;
+ updateCycle();
+ }
+
+ // Walk backwards until we find first cycle before now
+ while (anchor.toEpochSecond() <= cycleStart.toEpochSecond()) {
+ i--;
+ updateCycle();
+ }
+ }
+
+ private void updateCycle() {
+ cycleStart = roundBoundaryTime(start.plus(period.multipliedBy(i)));
+ cycleEnd = roundBoundaryTime(start.plus(period.multipliedBy(i + 1)));
+ }
+
+ private ZonedDateTime roundBoundaryTime(ZonedDateTime boundary) {
+ if (isMonthly() && (boundary.getDayOfMonth() < start.getDayOfMonth())) {
+ // When forced to end a monthly cycle early, we want to count
+ // that entire day against the boundary.
+ return ZonedDateTime.of(boundary.toLocalDate(), LocalTime.MAX, start.getZone());
+ } else {
+ return boundary;
+ }
+ }
+
+ @Override
+ public boolean hasNext() {
+ return cycleStart.toEpochSecond() >= start.toEpochSecond();
+ }
+
+ @Override
+ public Pair<ZonedDateTime, ZonedDateTime> next() {
+ if (DEBUG) Log.d(TAG, "Cycle " + i + " from " + cycleStart + " to " + cycleEnd);
+ Pair<ZonedDateTime, ZonedDateTime> p = new Pair<>(cycleStart, cycleEnd);
+ i--;
+ updateCycle();
+ return p;
+ }
+ }
+
+ public static String convertZonedDateTime(ZonedDateTime time) {
+ return time != null ? time.toString() : null;
+ }
+
+ public static ZonedDateTime convertZonedDateTime(String time) {
+ return time != null ? ZonedDateTime.parse(time) : null;
+ }
+
+ public static String convertPeriod(Period period) {
+ return period != null ? period.toString() : null;
+ }
+
+ public static Period convertPeriod(String period) {
+ return period != null ? Period.parse(period) : null;
+ }
+}
diff --git a/core/java/android/util/SparseLongArray.java b/core/java/android/util/SparseLongArray.java
index 0166c4a..81db2b7 100644
--- a/core/java/android/util/SparseLongArray.java
+++ b/core/java/android/util/SparseLongArray.java
@@ -119,6 +119,23 @@
}
/**
+ * @hide
+ * Remove a range of mappings as a batch.
+ *
+ * @param index Index to begin at
+ * @param size Number of mappings to remove
+ *
+ * <p>For indices outside of the range <code>0...size()-1</code>,
+ * the behavior is undefined.</p>
+ */
+ public void removeAtRange(int index, int size) {
+ size = Math.min(size, mSize - index);
+ System.arraycopy(mKeys, index + size, mKeys, index, mSize - (index + size));
+ System.arraycopy(mValues, index + size, mValues, index, mSize - (index + size));
+ mSize -= size;
+ }
+
+ /**
* Removes the mapping at the given index.
*/
public void removeAt(int index) {
diff --git a/core/java/android/view/ActionMode.java b/core/java/android/view/ActionMode.java
index ea979c8..05d9167 100644
--- a/core/java/android/view/ActionMode.java
+++ b/core/java/android/view/ActionMode.java
@@ -18,6 +18,7 @@
import android.annotation.StringRes;
+import android.annotation.TestApi;
import android.graphics.Rect;
/**
@@ -278,6 +279,7 @@
* @return true if the UI used to show this action mode can take focus
* @hide Internal use only
*/
+ @TestApi
public boolean isUiFocusable() {
return true;
}
diff --git a/core/java/android/view/InputDevice.java b/core/java/android/view/InputDevice.java
index 15be2b0..8405d9e 100644
--- a/core/java/android/view/InputDevice.java
+++ b/core/java/android/view/InputDevice.java
@@ -772,7 +772,6 @@
/**
* Returns true if input device is enabled.
* @return Whether the input device is enabled.
- * @hide
*/
public boolean isEnabled() {
return InputManager.getInstance().isInputDeviceEnabled(mId);
diff --git a/core/java/android/view/InputEventConsistencyVerifier.java b/core/java/android/view/InputEventConsistencyVerifier.java
index 46ef379..7e8ec04 100644
--- a/core/java/android/view/InputEventConsistencyVerifier.java
+++ b/core/java/android/view/InputEventConsistencyVerifier.java
@@ -30,7 +30,7 @@
* @hide
*/
public final class InputEventConsistencyVerifier {
- private static final boolean IS_ENG_BUILD = "eng".equals(Build.TYPE);
+ private static final boolean IS_ENG_BUILD = Build.IS_ENG;
private static final String EVENT_TYPE_KEY = "KeyEvent";
private static final String EVENT_TYPE_TRACKBALL = "TrackballEvent";
diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java
index 1b70232..ecfc0b6 100644
--- a/core/java/android/view/Surface.java
+++ b/core/java/android/view/Surface.java
@@ -73,10 +73,12 @@
private static native long nativeGetNextFrameNumber(long nativeObject);
private static native int nativeSetScalingMode(long nativeObject, int scalingMode);
- private static native void nativeSetBuffersTransform(long nativeObject, long transform);
private static native int nativeForceScopedDisconnect(long nativeObject);
private static native int nativeAttachAndQueueBuffer(long nativeObject, GraphicBuffer buffer);
+ private static native int nativeSetSharedBufferModeEnabled(long nativeObject, boolean enabled);
+ private static native int nativeSetAutoRefreshEnabled(long nativeObject, boolean enabled);
+
public static final Parcelable.Creator<Surface> CREATOR =
new Parcelable.Creator<Surface>() {
@Override
@@ -114,6 +116,8 @@
private HwuiContext mHwuiContext;
private boolean mIsSingleBuffered;
+ private boolean mIsSharedBufferModeEnabled;
+ private boolean mIsAutoRefreshEnabled;
/** @hide */
@Retention(RetentionPolicy.SOURCE)
@@ -630,6 +634,97 @@
}
/**
+ * <p>The shared buffer mode allows both the application and the surface compositor
+ * (SurfaceFlinger) to concurrently access this surface's buffer. While the
+ * application is still required to issue a present request
+ * (see {@link #unlockCanvasAndPost(Canvas)}) to the compositor when an update is required,
+ * the compositor may trigger an update at any time. Since the surface's buffer is shared
+ * between the application and the compositor, updates triggered by the compositor may
+ * cause visible tearing.</p>
+ *
+ * <p>The shared buffer mode can be used with
+ * {@link #setAutoRefreshEnabled(boolean) auto-refresh} to avoid the overhead of
+ * issuing present requests.</p>
+ *
+ * <p>If the application uses the shared buffer mode to reduce latency, it is
+ * recommended to use software rendering (see {@link #lockCanvas(Rect)} to ensure
+ * the graphics workloads are not affected by other applications and/or the system
+ * using the GPU. When using software rendering, the application should update the
+ * smallest possible region of the surface required.</p>
+ *
+ * <p class="note">The shared buffer mode might not be supported by the underlying
+ * hardware. Enabling shared buffer mode on hardware that does not support it will
+ * not yield an error but the application will not benefit from lower latency (and
+ * tearing will not be visible).</p>
+ *
+ * <p class="note">Depending on how many and what kind of surfaces are visible, the
+ * surface compositor may need to copy the shared buffer before it is displayed. When
+ * this happens, the latency benefits of shared buffer mode will be reduced.</p>
+ *
+ * @param enabled True to enable the shared buffer mode on this surface, false otherwise
+ *
+ * @see #isSharedBufferModeEnabled()
+ * @see #setAutoRefreshEnabled(boolean)
+ */
+ public void setSharedBufferModeEnabled(boolean enabled) {
+ if (mIsSharedBufferModeEnabled != enabled) {
+ int error = nativeSetSharedBufferModeEnabled(mNativeObject, enabled);
+ if (error != 0) {
+ throw new RuntimeException(
+ "Failed to set shared buffer mode on Surface (bad object?)");
+ } else {
+ mIsSharedBufferModeEnabled = enabled;
+ }
+ }
+ }
+
+ /**
+ * @return True if shared buffer mode is enabled on this surface, false otherwise
+ *
+ * @see #setSharedBufferModeEnabled(boolean)
+ */
+ public boolean isSharedBufferModeEnabled() {
+ return mIsSharedBufferModeEnabled;
+ }
+
+ /**
+ * <p>When auto-refresh is enabled, the surface compositor (SurfaceFlinger)
+ * automatically updates the display on a regular refresh cycle. The application
+ * can continue to issue present requests but it is not required. Enabling
+ * auto-refresh may result in visible tearing.</p>
+ *
+ * <p>Auto-refresh has no effect if the {@link #setSharedBufferModeEnabled(boolean)
+ * shared buffer mode} is not enabled.</p>
+ *
+ * <p>Because auto-refresh will trigger continuous updates of the display, it is
+ * recommended to turn it on only when necessary. For example, in a drawing/painting
+ * application auto-refresh should be enabled on finger/pen down and disabled on
+ * finger/pen up.</p>
+ *
+ * @param enabled True to enable auto-refresh on this surface, false otherwise
+ *
+ * @see #isAutoRefreshEnabled()
+ * @see #setSharedBufferModeEnabled(boolean)
+ */
+ public void setAutoRefreshEnabled(boolean enabled) {
+ if (mIsAutoRefreshEnabled != enabled) {
+ int error = nativeSetAutoRefreshEnabled(mNativeObject, enabled);
+ if (error != 0) {
+ throw new RuntimeException("Failed to set auto refresh on Surface (bad object?)");
+ } else {
+ mIsAutoRefreshEnabled = enabled;
+ }
+ }
+ }
+
+ /**
+ * @return True if auto-refresh is enabled on this surface, false otherwise
+ */
+ public boolean isAutoRefreshEnabled() {
+ return mIsAutoRefreshEnabled;
+ }
+
+ /**
* Exception thrown when a Canvas couldn't be locked with {@link Surface#lockCanvas}, or
* when a SurfaceTexture could not successfully be allocated.
*/
@@ -656,13 +751,13 @@
return "ROTATION_0";
}
case Surface.ROTATION_90: {
- return "ROATATION_90";
+ return "ROTATION_90";
}
case Surface.ROTATION_180: {
- return "ROATATION_180";
+ return "ROTATION_180";
}
case Surface.ROTATION_270: {
- return "ROATATION_270";
+ return "ROTATION_270";
}
default: {
throw new IllegalArgumentException("Invalid rotation: " + rotation);
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 2646d1c..6af01f66 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -10180,6 +10180,7 @@
*
* @hide
*/
+ @TestApi
public final void setFocusedInCluster() {
setFocusedInCluster(findKeyboardNavigationCluster());
}
@@ -12157,7 +12158,7 @@
// If the view is in the background but still part of the hierarchy this is called
// with isVisible=false. Hence visibility==false requires further checks
if (isVisible) {
- afm.notifyViewVisibilityChange(this, true);
+ afm.notifyViewVisibilityChanged(this, true);
} else {
if (mVisibilityChangeForAutofillHandler == null) {
mVisibilityChangeForAutofillHandler =
@@ -17684,6 +17685,11 @@
setAutofilled(baseState.mIsAutofilled);
}
if ((baseState.mSavedData & BaseSavedState.AUTOFILL_ID) != 0) {
+ // It can happen that views have the same view id and the restoration path will not
+ // be able to distinguish between them. The autofill id needs to be unique though.
+ // Hence prevent the same autofill view id from being restored multiple times.
+ ((BaseSavedState) state).mSavedData &= ~BaseSavedState.AUTOFILL_ID;
+
mAutofillViewId = baseState.mAutofillViewId;
}
}
@@ -25012,7 +25018,7 @@
@Override
public void handleMessage(Message msg) {
- mAfm.notifyViewVisibilityChange(mView, mView.isShown());
+ mAfm.notifyViewVisibilityChanged(mView, mView.isShown());
}
}
diff --git a/core/java/android/view/ViewConfiguration.java b/core/java/android/view/ViewConfiguration.java
index 4def0d0..574137b 100644
--- a/core/java/android/view/ViewConfiguration.java
+++ b/core/java/android/view/ViewConfiguration.java
@@ -35,7 +35,7 @@
* Defines the width of the horizontal scrollbar and the height of the vertical scrollbar in
* dips
*/
- private static final int SCROLL_BAR_SIZE = 10;
+ private static final int SCROLL_BAR_SIZE = 4;
/**
* Duration of the fade when scrollbars fade away in milliseconds
@@ -354,7 +354,8 @@
mEdgeSlop = (int) (sizeAndDensity * EDGE_SLOP + 0.5f);
mFadingEdgeLength = (int) (sizeAndDensity * FADING_EDGE_LENGTH + 0.5f);
- mScrollbarSize = (int) (density * SCROLL_BAR_SIZE + 0.5f);
+ mScrollbarSize = res.getDimensionPixelSize(
+ com.android.internal.R.dimen.config_scrollbarSize);
mDoubleTapSlop = (int) (sizeAndDensity * DOUBLE_TAP_SLOP + 0.5f);
mWindowTouchSlop = (int) (sizeAndDensity * WINDOW_TOUCH_SLOP + 0.5f);
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index e38a55f..05f9da5 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -28,7 +28,6 @@
import android.Manifest;
import android.animation.LayoutTransition;
import android.annotation.NonNull;
-import android.annotation.TestApi;
import android.app.ActivityManager;
import android.app.ActivityThread;
import android.app.ResourcesManager;
@@ -214,11 +213,8 @@
/**
* Always assign focus if a focusable View is available.
- *
- * @hide
*/
- @TestApi
- public static boolean sAlwaysAssignFocus;
+ private static boolean sAlwaysAssignFocus;
/**
* This list must only be modified by the main thread, so a lock is only needed when changing
diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java
index 0d5c075..3d6af41 100644
--- a/core/java/android/view/Window.java
+++ b/core/java/android/view/Window.java
@@ -1139,11 +1139,18 @@
}
/**
- * <p>Set the color mode of the window. Setting the color mode might
+ * <p>Sets the requested color mode of the window. The requested the color mode might
* override the window's pixel {@link WindowManager.LayoutParams#format format}.</p>
*
- * <p>The color mode must be one of {@link ActivityInfo#COLOR_MODE_DEFAULT},
+ * <p>The requested color mode must be one of {@link ActivityInfo#COLOR_MODE_DEFAULT},
* {@link ActivityInfo#COLOR_MODE_WIDE_COLOR_GAMUT} or {@link ActivityInfo#COLOR_MODE_HDR}.</p>
+ *
+ * <p>The requested color mode is not guaranteed to be honored. Please refer to
+ * {@link #getColorMode()} for more information.</p>
+ *
+ * @see #getColorMode()
+ * @see Display#isWideColorGamut()
+ * @see Configuration#isScreenWideColorGamut()
*/
public void setColorMode(@ActivityInfo.ColorMode int colorMode) {
final WindowManager.LayoutParams attrs = getAttributes();
@@ -1152,8 +1159,16 @@
}
/**
- * Returns the color mode of the window, one of {@link ActivityInfo#COLOR_MODE_DEFAULT},
- * {@link ActivityInfo#COLOR_MODE_WIDE_COLOR_GAMUT} or {@link ActivityInfo#COLOR_MODE_HDR}.
+ * Returns the requested color mode of the window, one of
+ * {@link ActivityInfo#COLOR_MODE_DEFAULT}, {@link ActivityInfo#COLOR_MODE_WIDE_COLOR_GAMUT}
+ * or {@link ActivityInfo#COLOR_MODE_HDR}. If {@link ActivityInfo#COLOR_MODE_WIDE_COLOR_GAMUT}
+ * was requested it is possible the window will not be put in wide color gamut mode depending
+ * on device and display support for that mode. Use {@link #isWideColorGamut} to determine
+ * if the window is currently in wide color gamut mode.
+ *
+ * @see #setColorMode(int)
+ * @see Display#isWideColorGamut()
+ * @see Configuration#isScreenWideColorGamut()
*/
@ActivityInfo.ColorMode
public int getColorMode() {
@@ -1161,6 +1176,18 @@
}
/**
+ * Returns true if this window's color mode is {@link ActivityInfo#COLOR_MODE_WIDE_COLOR_GAMUT},
+ * the display has a wide color gamut and this device supports wide color gamut rendering.
+ *
+ * @see Display#isWideColorGamut()
+ * @see Configuration#isScreenWideColorGamut()
+ */
+ public boolean isWideColorGamut() {
+ return getColorMode() == ActivityInfo.COLOR_MODE_WIDE_COLOR_GAMUT
+ && getContext().getResources().getConfiguration().isScreenWideColorGamut();
+ }
+
+ /**
* Set the amount of dim behind the window when using
* {@link WindowManager.LayoutParams#FLAG_DIM_BEHIND}. This overrides
* the default dim amount of that is selected by the Window based on
@@ -1242,8 +1269,10 @@
/** @hide */
public boolean shouldCloseOnTouch(Context context, MotionEvent event) {
- if (mCloseOnTouchOutside && event.getAction() == MotionEvent.ACTION_DOWN
- && isOutOfBounds(context, event) && peekDecorView() != null) {
+ final boolean isOutside =
+ event.getAction() == MotionEvent.ACTION_DOWN && isOutOfBounds(context, event)
+ || event.getAction() == MotionEvent.ACTION_OUTSIDE;
+ if (mCloseOnTouchOutside && peekDecorView() != null && isOutside) {
return true;
}
return false;
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index faf3e125..4041bcf 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -955,7 +955,11 @@
* {@link #FLAG_DISMISS_KEYGUARD} to automatically fully dismisss
* non-secure keyguards. This flag only applies to the top-most
* full-screen window.
+ * @deprecated Use {@link android.R.attr#showWhenLocked} or
+ * {@link android.app.Activity#setShowWhenLocked(boolean)} instead to prevent an
+ * unintentional double life-cycle event.
*/
+ @Deprecated
public static final int FLAG_SHOW_WHEN_LOCKED = 0x00080000;
/** Window flag: ask that the system wallpaper be shown behind
@@ -980,7 +984,12 @@
/** Window flag: when set as a window is being added or made
* visible, once the window has been shown then the system will
* poke the power manager's user activity (as if the user had woken
- * up the device) to turn the screen on. */
+ * up the device) to turn the screen on.
+ * @deprecated Use {@link android.R.attr#turnScreenOn} or
+ * {@link android.app.Activity#setTurnScreenOn(boolean)} instead to prevent an
+ * unintentional double life-cycle event.
+ */
+ @Deprecated
public static final int FLAG_TURN_SCREEN_ON = 0x00200000;
/** Window flag: when set the window will cause the keyguard to
@@ -1394,15 +1403,14 @@
public static final int PRIVATE_FLAG_SUSTAINED_PERFORMANCE_MODE = 0x00040000;
/**
- * Flag to indicate that this window is used as a task snapshot window. A task snapshot
- * window is a starting window that gets shown with a screenshot from the previous state
- * that is active until the app has drawn its first frame.
- *
- * <p>If this flag is set, SystemUI flags are ignored such that the real window behind can
- * set the SystemUI flags.
+ * Flag to indicate that any window added by an application process that is of type
+ * {@link #TYPE_TOAST} or that requires
+ * {@link android.app.AppOpsManager#OP_SYSTEM_ALERT_WINDOW} permission should be hidden when
+ * this window is visible.
* @hide
*/
- public static final int PRIVATE_FLAG_TASK_SNAPSHOT = 0x00080000;
+ @RequiresPermission(android.Manifest.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS)
+ public static final int PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS = 0x00080000;
/**
* Flag to indicate that this window should be ignored when determining what parts of the
diff --git a/core/java/android/view/accessibility/AccessibilityCache.java b/core/java/android/view/accessibility/AccessibilityCache.java
index 604e985..0f21c5c 100644
--- a/core/java/android/view/accessibility/AccessibilityCache.java
+++ b/core/java/android/view/accessibility/AccessibilityCache.java
@@ -40,7 +40,7 @@
private static final boolean DEBUG = false;
- private static final boolean CHECK_INTEGRITY = "eng".equals(Build.TYPE);
+ private static final boolean CHECK_INTEGRITY = Build.IS_ENG;
/**
* {@link AccessibilityEvent} types that are critical for the cache to stay up to date
diff --git a/core/java/android/view/accessibility/AccessibilityEvent.java b/core/java/android/view/accessibility/AccessibilityEvent.java
index 9dd0fb0..eaa4b4b 100644
--- a/core/java/android/view/accessibility/AccessibilityEvent.java
+++ b/core/java/android/view/accessibility/AccessibilityEvent.java
@@ -620,7 +620,8 @@
public static final int TYPE_WINDOW_CONTENT_CHANGED = 0x00000800;
/**
- * Represents the event of scrolling a view.
+ * Represents the event of scrolling a view. This event type is generally not sent directly.
+ * @see View#onScrollChanged(int, int, int, int)
*/
public static final int TYPE_VIEW_SCROLLED = 0x00001000;
diff --git a/core/java/android/view/accessibility/AccessibilityManager.java b/core/java/android/view/accessibility/AccessibilityManager.java
index 69892d9..d9128d8 100644
--- a/core/java/android/view/accessibility/AccessibilityManager.java
+++ b/core/java/android/view/accessibility/AccessibilityManager.java
@@ -25,7 +25,6 @@
import android.annotation.SdkConstant;
import android.annotation.SystemApi;
import android.annotation.SystemService;
-import android.annotation.TestApi;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
@@ -705,9 +704,7 @@
/**
* Registers a {@link AccessibilityRequestPreparer}.
- * @hide
*/
- @TestApi
public void addAccessibilityRequestPreparer(AccessibilityRequestPreparer preparer) {
if (mRequestPreparerLists == null) {
mRequestPreparerLists = new SparseArray<>(1);
@@ -723,9 +720,7 @@
/**
* Unregisters a {@link AccessibilityRequestPreparer}.
- * @hide
*/
- @TestApi
public void removeAccessibilityRequestPreparer(AccessibilityRequestPreparer preparer) {
if (mRequestPreparerLists == null) {
return;
diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfo.java b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
index 82a6de7..53efe18 100644
--- a/core/java/android/view/accessibility/AccessibilityNodeInfo.java
+++ b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
@@ -335,7 +335,8 @@
*/
public static final int ACTION_SET_TEXT = 0x00200000;
- private static final int LAST_LEGACY_STANDARD_ACTION = ACTION_SET_TEXT;
+ /** @hide */
+ public static final int LAST_LEGACY_STANDARD_ACTION = ACTION_SET_TEXT;
/**
* Mask to see if the value is larger than the largest ACTION_ constant
@@ -1180,7 +1181,7 @@
"actions: " + action);
}
- addLegacyStandardActions(action);
+ addStandardActions(action);
}
/**
@@ -3193,22 +3194,22 @@
if (mActions != null && !mActions.isEmpty()) {
final int actionCount = mActions.size();
- int nonLegacyActionCount = 0;
- int defaultLegacyStandardActions = 0;
+ int nonStandardActionCount = 0;
+ int defaultStandardActions = 0;
for (int i = 0; i < actionCount; i++) {
AccessibilityAction action = mActions.get(i);
- if (isDefaultLegacyStandardAction(action)) {
- defaultLegacyStandardActions |= action.getId();
+ if (isDefaultStandardAction(action)) {
+ defaultStandardActions |= action.mSerializationFlag;
} else {
- nonLegacyActionCount++;
+ nonStandardActionCount++;
}
}
- parcel.writeInt(defaultLegacyStandardActions);
- parcel.writeInt(nonLegacyActionCount);
+ parcel.writeInt(defaultStandardActions);
+ parcel.writeInt(nonStandardActionCount);
for (int i = 0; i < actionCount; i++) {
AccessibilityAction action = mActions.get(i);
- if (!isDefaultLegacyStandardAction(action)) {
+ if (!isDefaultStandardAction(action)) {
parcel.writeInt(action.getId());
parcel.writeCharSequence(action.getLabel());
}
@@ -3400,10 +3401,10 @@
}
if (isBitSet(nonDefaultFields, fieldIndex++)) {
- final int legacyStandardActions = parcel.readInt();
- addLegacyStandardActions(legacyStandardActions);
- final int nonLegacyActionCount = parcel.readInt();
- for (int i = 0; i < nonLegacyActionCount; i++) {
+ final int standardActions = parcel.readInt();
+ addStandardActions(standardActions);
+ final int nonStandardActionCount = parcel.readInt();
+ for (int i = 0; i < nonStandardActionCount; i++) {
final AccessibilityAction action = new AccessibilityAction(
parcel.readInt(), parcel.readCharSequence());
addActionUnchecked(action);
@@ -3478,9 +3479,8 @@
init(DEFAULT);
}
- private static boolean isDefaultLegacyStandardAction(AccessibilityAction action) {
- return (action.getId() <= LAST_LEGACY_STANDARD_ACTION
- && TextUtils.isEmpty(action.getLabel()));
+ private static boolean isDefaultStandardAction(AccessibilityAction action) {
+ return action.mSerializationFlag != -1 && TextUtils.isEmpty(action.getLabel());
}
private static AccessibilityAction getActionSingleton(int actionId) {
@@ -3495,12 +3495,24 @@
return null;
}
- private void addLegacyStandardActions(int actionMask) {
- int remainingIds = actionMask;
+ private static AccessibilityAction getActionSingletonBySerializationFlag(int flag) {
+ final int actions = AccessibilityAction.sStandardActions.size();
+ for (int i = 0; i < actions; i++) {
+ AccessibilityAction currentAction = AccessibilityAction.sStandardActions.valueAt(i);
+ if (flag == currentAction.mSerializationFlag) {
+ return currentAction;
+ }
+ }
+
+ return null;
+ }
+
+ private void addStandardActions(int serializationIdMask) {
+ int remainingIds = serializationIdMask;
while (remainingIds > 0) {
final int id = 1 << Integer.numberOfTrailingZeros(remainingIds);
remainingIds &= ~id;
- AccessibilityAction action = getActionSingleton(id);
+ AccessibilityAction action = getActionSingletonBySerializationFlag(id);
addAction(action);
}
}
@@ -3749,61 +3761,56 @@
*/
public static final class AccessibilityAction {
+ /** @hide */
+ public static final ArraySet<AccessibilityAction> sStandardActions = new ArraySet<>();
+
/**
* Action that gives input focus to the node.
*/
public static final AccessibilityAction ACTION_FOCUS =
- new AccessibilityAction(
- AccessibilityNodeInfo.ACTION_FOCUS, null);
+ new AccessibilityAction(AccessibilityNodeInfo.ACTION_FOCUS);
/**
* Action that clears input focus of the node.
*/
public static final AccessibilityAction ACTION_CLEAR_FOCUS =
- new AccessibilityAction(
- AccessibilityNodeInfo.ACTION_CLEAR_FOCUS, null);
+ new AccessibilityAction(AccessibilityNodeInfo.ACTION_CLEAR_FOCUS);
/**
* Action that selects the node.
*/
public static final AccessibilityAction ACTION_SELECT =
- new AccessibilityAction(
- AccessibilityNodeInfo.ACTION_SELECT, null);
+ new AccessibilityAction(AccessibilityNodeInfo.ACTION_SELECT);
/**
* Action that deselects the node.
*/
public static final AccessibilityAction ACTION_CLEAR_SELECTION =
- new AccessibilityAction(
- AccessibilityNodeInfo.ACTION_CLEAR_SELECTION, null);
+ new AccessibilityAction(AccessibilityNodeInfo.ACTION_CLEAR_SELECTION);
/**
* Action that clicks on the node info.
*/
public static final AccessibilityAction ACTION_CLICK =
- new AccessibilityAction(
- AccessibilityNodeInfo.ACTION_CLICK, null);
+ new AccessibilityAction(AccessibilityNodeInfo.ACTION_CLICK);
/**
* Action that long clicks on the node.
*/
public static final AccessibilityAction ACTION_LONG_CLICK =
- new AccessibilityAction(
- AccessibilityNodeInfo.ACTION_LONG_CLICK, null);
+ new AccessibilityAction(AccessibilityNodeInfo.ACTION_LONG_CLICK);
/**
* Action that gives accessibility focus to the node.
*/
public static final AccessibilityAction ACTION_ACCESSIBILITY_FOCUS =
- new AccessibilityAction(
- AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS, null);
+ new AccessibilityAction(AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS);
/**
* Action that clears accessibility focus of the node.
*/
public static final AccessibilityAction ACTION_CLEAR_ACCESSIBILITY_FOCUS =
- new AccessibilityAction(
- AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS, null);
+ new AccessibilityAction(AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS);
/**
* Action that requests to go to the next entity in this node's text
@@ -3849,8 +3856,7 @@
* AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PAGE
*/
public static final AccessibilityAction ACTION_NEXT_AT_MOVEMENT_GRANULARITY =
- new AccessibilityAction(
- AccessibilityNodeInfo.ACTION_NEXT_AT_MOVEMENT_GRANULARITY, null);
+ new AccessibilityAction(AccessibilityNodeInfo.ACTION_NEXT_AT_MOVEMENT_GRANULARITY);
/**
* Action that requests to go to the previous entity in this node's text
@@ -3897,7 +3903,7 @@
*/
public static final AccessibilityAction ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY =
new AccessibilityAction(
- AccessibilityNodeInfo.ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY, null);
+ AccessibilityNodeInfo.ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY);
/**
* Action to move to the next HTML element of a given type. For example, move
@@ -3915,8 +3921,7 @@
* </p>
*/
public static final AccessibilityAction ACTION_NEXT_HTML_ELEMENT =
- new AccessibilityAction(
- AccessibilityNodeInfo.ACTION_NEXT_HTML_ELEMENT, null);
+ new AccessibilityAction(AccessibilityNodeInfo.ACTION_NEXT_HTML_ELEMENT);
/**
* Action to move to the previous HTML element of a given type. For example, move
@@ -3934,43 +3939,37 @@
* </p>
*/
public static final AccessibilityAction ACTION_PREVIOUS_HTML_ELEMENT =
- new AccessibilityAction(
- AccessibilityNodeInfo.ACTION_PREVIOUS_HTML_ELEMENT, null);
+ new AccessibilityAction(AccessibilityNodeInfo.ACTION_PREVIOUS_HTML_ELEMENT);
/**
* Action to scroll the node content forward.
*/
public static final AccessibilityAction ACTION_SCROLL_FORWARD =
- new AccessibilityAction(
- AccessibilityNodeInfo.ACTION_SCROLL_FORWARD, null);
+ new AccessibilityAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);
/**
* Action to scroll the node content backward.
*/
public static final AccessibilityAction ACTION_SCROLL_BACKWARD =
- new AccessibilityAction(
- AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD, null);
+ new AccessibilityAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD);
/**
* Action to copy the current selection to the clipboard.
*/
public static final AccessibilityAction ACTION_COPY =
- new AccessibilityAction(
- AccessibilityNodeInfo.ACTION_COPY, null);
+ new AccessibilityAction(AccessibilityNodeInfo.ACTION_COPY);
/**
* Action to paste the current clipboard content.
*/
public static final AccessibilityAction ACTION_PASTE =
- new AccessibilityAction(
- AccessibilityNodeInfo.ACTION_PASTE, null);
+ new AccessibilityAction(AccessibilityNodeInfo.ACTION_PASTE);
/**
* Action to cut the current selection and place it to the clipboard.
*/
public static final AccessibilityAction ACTION_CUT =
- new AccessibilityAction(
- AccessibilityNodeInfo.ACTION_CUT, null);
+ new AccessibilityAction(AccessibilityNodeInfo.ACTION_CUT);
/**
* Action to set the selection. Performing this action with no arguments
@@ -3996,29 +3995,25 @@
* AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT
*/
public static final AccessibilityAction ACTION_SET_SELECTION =
- new AccessibilityAction(
- AccessibilityNodeInfo.ACTION_SET_SELECTION, null);
+ new AccessibilityAction(AccessibilityNodeInfo.ACTION_SET_SELECTION);
/**
* Action to expand an expandable node.
*/
public static final AccessibilityAction ACTION_EXPAND =
- new AccessibilityAction(
- AccessibilityNodeInfo.ACTION_EXPAND, null);
+ new AccessibilityAction(AccessibilityNodeInfo.ACTION_EXPAND);
/**
* Action to collapse an expandable node.
*/
public static final AccessibilityAction ACTION_COLLAPSE =
- new AccessibilityAction(
- AccessibilityNodeInfo.ACTION_COLLAPSE, null);
+ new AccessibilityAction(AccessibilityNodeInfo.ACTION_COLLAPSE);
/**
* Action to dismiss a dismissable node.
*/
public static final AccessibilityAction ACTION_DISMISS =
- new AccessibilityAction(
- AccessibilityNodeInfo.ACTION_DISMISS, null);
+ new AccessibilityAction(AccessibilityNodeInfo.ACTION_DISMISS);
/**
* Action that sets the text of the node. Performing the action without argument,
@@ -4037,8 +4032,7 @@
* </code></pre></p>
*/
public static final AccessibilityAction ACTION_SET_TEXT =
- new AccessibilityAction(
- AccessibilityNodeInfo.ACTION_SET_TEXT, null);
+ new AccessibilityAction(AccessibilityNodeInfo.ACTION_SET_TEXT);
/**
* Action that requests the node make its bounding rectangle visible
@@ -4047,7 +4041,7 @@
* @see View#requestRectangleOnScreen(Rect)
*/
public static final AccessibilityAction ACTION_SHOW_ON_SCREEN =
- new AccessibilityAction(R.id.accessibilityActionShowOnScreen, null);
+ new AccessibilityAction(R.id.accessibilityActionShowOnScreen);
/**
* Action that scrolls the node to make the specified collection
@@ -4062,37 +4056,37 @@
* @see AccessibilityNodeInfo#getCollectionInfo()
*/
public static final AccessibilityAction ACTION_SCROLL_TO_POSITION =
- new AccessibilityAction(R.id.accessibilityActionScrollToPosition, null);
+ new AccessibilityAction(R.id.accessibilityActionScrollToPosition);
/**
* Action to scroll the node content up.
*/
public static final AccessibilityAction ACTION_SCROLL_UP =
- new AccessibilityAction(R.id.accessibilityActionScrollUp, null);
+ new AccessibilityAction(R.id.accessibilityActionScrollUp);
/**
* Action to scroll the node content left.
*/
public static final AccessibilityAction ACTION_SCROLL_LEFT =
- new AccessibilityAction(R.id.accessibilityActionScrollLeft, null);
+ new AccessibilityAction(R.id.accessibilityActionScrollLeft);
/**
* Action to scroll the node content down.
*/
public static final AccessibilityAction ACTION_SCROLL_DOWN =
- new AccessibilityAction(R.id.accessibilityActionScrollDown, null);
+ new AccessibilityAction(R.id.accessibilityActionScrollDown);
/**
* Action to scroll the node content right.
*/
public static final AccessibilityAction ACTION_SCROLL_RIGHT =
- new AccessibilityAction(R.id.accessibilityActionScrollRight, null);
+ new AccessibilityAction(R.id.accessibilityActionScrollRight);
/**
* Action that context clicks the node.
*/
public static final AccessibilityAction ACTION_CONTEXT_CLICK =
- new AccessibilityAction(R.id.accessibilityActionContextClick, null);
+ new AccessibilityAction(R.id.accessibilityActionContextClick);
/**
* Action that sets progress between {@link RangeInfo#getMin() RangeInfo.getMin()} and
@@ -4105,7 +4099,7 @@
* @see RangeInfo
*/
public static final AccessibilityAction ACTION_SET_PROGRESS =
- new AccessibilityAction(R.id.accessibilityActionSetProgress, null);
+ new AccessibilityAction(R.id.accessibilityActionSetProgress);
/**
* Action to move a window to a new location.
@@ -4115,45 +4109,14 @@
* {@link AccessibilityNodeInfo#ACTION_ARGUMENT_MOVE_WINDOW_Y}
*/
public static final AccessibilityAction ACTION_MOVE_WINDOW =
- new AccessibilityAction(R.id.accessibilityActionMoveWindow, null);
-
- private static final ArraySet<AccessibilityAction> sStandardActions = new ArraySet<>();
- static {
- sStandardActions.add(ACTION_FOCUS);
- sStandardActions.add(ACTION_CLEAR_FOCUS);
- sStandardActions.add(ACTION_SELECT);
- sStandardActions.add(ACTION_CLEAR_SELECTION);
- sStandardActions.add(ACTION_CLICK);
- sStandardActions.add(ACTION_LONG_CLICK);
- sStandardActions.add(ACTION_ACCESSIBILITY_FOCUS);
- sStandardActions.add(ACTION_CLEAR_ACCESSIBILITY_FOCUS);
- sStandardActions.add(ACTION_NEXT_AT_MOVEMENT_GRANULARITY);
- sStandardActions.add(ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY);
- sStandardActions.add(ACTION_NEXT_HTML_ELEMENT);
- sStandardActions.add(ACTION_PREVIOUS_HTML_ELEMENT);
- sStandardActions.add(ACTION_SCROLL_FORWARD);
- sStandardActions.add(ACTION_SCROLL_BACKWARD);
- sStandardActions.add(ACTION_COPY);
- sStandardActions.add(ACTION_PASTE);
- sStandardActions.add(ACTION_CUT);
- sStandardActions.add(ACTION_SET_SELECTION);
- sStandardActions.add(ACTION_EXPAND);
- sStandardActions.add(ACTION_COLLAPSE);
- sStandardActions.add(ACTION_DISMISS);
- sStandardActions.add(ACTION_SET_TEXT);
- sStandardActions.add(ACTION_SHOW_ON_SCREEN);
- sStandardActions.add(ACTION_SCROLL_TO_POSITION);
- sStandardActions.add(ACTION_SCROLL_UP);
- sStandardActions.add(ACTION_SCROLL_LEFT);
- sStandardActions.add(ACTION_SCROLL_DOWN);
- sStandardActions.add(ACTION_SCROLL_RIGHT);
- sStandardActions.add(ACTION_SET_PROGRESS);
- sStandardActions.add(ACTION_CONTEXT_CLICK);
- }
+ new AccessibilityAction(R.id.accessibilityActionMoveWindow);
private final int mActionId;
private final CharSequence mLabel;
+ /** @hide */
+ public int mSerializationFlag = -1;
+
/**
* Creates a new AccessibilityAction. For adding a standard action without a specific label,
* use the static constants.
@@ -4181,6 +4144,16 @@
}
/**
+ * Constructor for a {@link #sStandardActions standard} action
+ */
+ private AccessibilityAction(int standardActionId) {
+ this(standardActionId, null);
+
+ mSerializationFlag = (int) bitAt(sStandardActions.size());
+ sStandardActions.add(this);
+ }
+
+ /**
* Gets the id for this action.
*
* @return The action id.
diff --git a/core/java/android/view/accessibility/AccessibilityRequestPreparer.java b/core/java/android/view/accessibility/AccessibilityRequestPreparer.java
index c032390..889feb9 100644
--- a/core/java/android/view/accessibility/AccessibilityRequestPreparer.java
+++ b/core/java/android/view/accessibility/AccessibilityRequestPreparer.java
@@ -18,7 +18,6 @@
import android.annotation.IntDef;
import android.annotation.Nullable;
-import android.annotation.TestApi;
import android.content.Context;
import android.os.Bundle;
import android.os.Message;
@@ -40,9 +39,7 @@
* <p>
* <strong>Note:</strong> This class should only be needed in exceptional situations where a
* {@link View} cannot otherwise synchronously meet the request for accessibility data.
- * @hide
*/
-@TestApi
public abstract class AccessibilityRequestPreparer {
public static final int REQUEST_TYPE_EXTRA_DATA = 0x00000001;
diff --git a/core/java/android/view/autofill/AutofillId.java b/core/java/android/view/autofill/AutofillId.java
index 1cee529..5ce2421 100644
--- a/core/java/android/view/autofill/AutofillId.java
+++ b/core/java/android/view/autofill/AutofillId.java
@@ -15,6 +15,7 @@
*/
package android.view.autofill;
+import android.annotation.TestApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.view.View;
@@ -29,6 +30,7 @@
private final int mVirtualId;
/** @hide */
+ @TestApi
public AutofillId(int id) {
mVirtual = false;
mViewId = id;
diff --git a/core/java/android/view/autofill/AutofillManager.java b/core/java/android/view/autofill/AutofillManager.java
index e1e8317..e2ad1e0 100644
--- a/core/java/android/view/autofill/AutofillManager.java
+++ b/core/java/android/view/autofill/AutofillManager.java
@@ -496,25 +496,48 @@
}
/**
- * Called when a {@link View view's} visibility changes.
+ * Called when a {@link View view's} visibility changed.
*
* @param view {@link View} that was exited.
* @param isVisible visible if the view is visible in the view hierarchy.
- *
- * @hide
*/
- public void notifyViewVisibilityChange(@NonNull View view, boolean isVisible) {
+ public void notifyViewVisibilityChanged(@NonNull View view, boolean isVisible) {
+ notifyViewVisibilityChangedInternal(view, 0, isVisible, false);
+ }
+
+ /**
+ * Called when a virtual view's visibility changed.
+ *
+ * @param view {@link View} that was exited.
+ * @param virtualId id identifying the virtual child inside the parent view.
+ * @param isVisible visible if the view is visible in the view hierarchy.
+ */
+ public void notifyViewVisibilityChanged(@NonNull View view, int virtualId, boolean isVisible) {
+ notifyViewVisibilityChangedInternal(view, virtualId, isVisible, true);
+ }
+
+ /**
+ * Called when a view/virtual view's visibility changed.
+ *
+ * @param view {@link View} that was exited.
+ * @param virtualId id identifying the virtual child inside the parent view.
+ * @param isVisible visible if the view is visible in the view hierarchy.
+ * @param virtual Whether the view is virtual.
+ */
+ private void notifyViewVisibilityChangedInternal(@NonNull View view, int virtualId,
+ boolean isVisible, boolean virtual) {
synchronized (mLock) {
if (mEnabled && mSessionId != NO_SESSION) {
+ final AutofillId id = virtual ? getAutofillId(view, virtualId)
+ : view.getAutofillId();
if (!isVisible && mFillableIds != null) {
- final AutofillId id = view.getAutofillId();
if (mFillableIds.contains(id)) {
if (sDebug) Log.d(TAG, "Hidding UI when view " + id + " became invisible");
requestHideFillUi(id, view);
}
}
if (mTrackedViews != null) {
- mTrackedViews.notifyViewVisibilityChange(view, isVisible);
+ mTrackedViews.notifyViewVisibilityChanged(id, isVisible);
}
}
}
@@ -671,8 +694,13 @@
/**
* Called to indicate the current autofill context should be commited.
*
- * <p>For example, when a virtual view is rendering an {@code HTML} page with a form, it should
- * call this method after the form is submitted and another page is rendered.
+ * <p>This method is typically called by {@link View Views} that manage virtual views; for
+ * example, when the view is rendering an {@code HTML} page with a form and virtual views
+ * that represent the HTML elements, it should call this method after the form is submitted and
+ * another page is rendered.
+ *
+ * <p><b>Note:</b> This method does not need to be called on regular application lifecycle
+ * methods such as {@link android.app.Activity#finish()}.
*/
public void commit() {
if (!hasAutofillFeature()) {
@@ -690,8 +718,13 @@
/**
* Called to indicate the current autofill context should be cancelled.
*
- * <p>For example, when a virtual view is rendering an {@code HTML} page with a form, it should
- * call this method if the user does not post the form but moves to another form in this page.
+ * <p>This method is typically called by {@link View Views} that manage virtual views; for
+ * example, when the view is rendering an {@code HTML} page with a form and virtual views
+ * that represent the HTML elements, it should call this method if the user does not post the
+ * form but moves to another form in this page.
+ *
+ * <p><b>Note:</b> This method does not need to be called on regular application lifecycle
+ * methods such as {@link android.app.Activity#finish()}.
*/
public void cancel() {
if (!hasAutofillFeature()) {
@@ -1362,15 +1395,14 @@
/**
* Called when a {@link View view's} visibility changes.
*
- * @param view {@link View} that was exited.
+ * @param id the id of the view/virtual view whose visibility changed.
* @param isVisible visible if the view is visible in the view hierarchy.
*/
- void notifyViewVisibilityChange(@NonNull View view, boolean isVisible) {
- AutofillId id = getAutofillId(view);
+ void notifyViewVisibilityChanged(@NonNull AutofillId id, boolean isVisible) {
AutofillClient client = getClientLocked();
if (sDebug) {
- Log.d(TAG, "notifyViewVisibilityChange(): id=" + id + " isVisible="
+ Log.d(TAG, "notifyViewVisibilityChanged(): id=" + id + " isVisible="
+ isVisible);
}
diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java
index e2f7979..92d1de8 100644
--- a/core/java/android/view/inputmethod/InputMethodManager.java
+++ b/core/java/android/view/inputmethod/InputMethodManager.java
@@ -97,7 +97,7 @@
* that manages the interaction across all processes.
* <li> An <strong>input method (IME)</strong> implements a particular
* interaction model allowing the user to generate text. The system binds
- * to the current input method that is use, causing it to be created and run,
+ * to the current input method that is in use, causing it to be created and run,
* and tells it when to hide and show its UI. Only one IME is running at a time.
* <li> Multiple <strong>client applications</strong> arbitrate with the input
* method manager for input focus and control over the state of the IME. Only
diff --git a/core/java/android/view/textclassifier/TextClassification.java b/core/java/android/view/textclassifier/TextClassification.java
index b6dd0b9..d1e0ae5 100644
--- a/core/java/android/view/textclassifier/TextClassification.java
+++ b/core/java/android/view/textclassifier/TextClassification.java
@@ -50,11 +50,11 @@
private int mLogType;
private TextClassification(
- @NonNull String text,
- Drawable icon,
- String label,
- Intent intent,
- OnClickListener onClickListener,
+ @Nullable String text,
+ @Nullable Drawable icon,
+ @Nullable String label,
+ @Nullable Intent intent,
+ @Nullable OnClickListener onClickListener,
@NonNull EntityConfidence<String> entityConfidence,
int logType) {
mText = text;
@@ -70,7 +70,7 @@
/**
* Gets the classified text.
*/
- @NonNull
+ @Nullable
public String getText() {
return mText;
}
@@ -183,8 +183,8 @@
/**
* Sets the classified text.
*/
- public Builder setText(@NonNull String text) {
- mText = Preconditions.checkNotNull(text);
+ public Builder setText(@Nullable String text) {
+ mText = text;
return this;
}
@@ -197,7 +197,7 @@
*/
public Builder setEntityType(
@NonNull @EntityType String type,
- @FloatRange(from = 0.0, to = 1.0)float confidenceScore) {
+ @FloatRange(from = 0.0, to = 1.0) float confidenceScore) {
mEntityConfidence.setEntityType(type, confidenceScore);
return this;
}
diff --git a/core/java/android/view/textservice/TextServicesManager.java b/core/java/android/view/textservice/TextServicesManager.java
index d9bfade..f368c74 100644
--- a/core/java/android/view/textservice/TextServicesManager.java
+++ b/core/java/android/view/textservice/TextServicesManager.java
@@ -213,20 +213,6 @@
/**
* @hide
*/
- public void setCurrentSpellChecker(SpellCheckerInfo sci) {
- try {
- if (sci == null) {
- throw new NullPointerException("SpellCheckerInfo is null.");
- }
- mService.setCurrentSpellChecker(null, sci.getId());
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- /**
- * @hide
- */
public SpellCheckerSubtype getCurrentSpellCheckerSubtype(
boolean allowImplicitlySelectedSubtype) {
try {
@@ -240,34 +226,6 @@
/**
* @hide
*/
- public void setSpellCheckerSubtype(SpellCheckerSubtype subtype) {
- try {
- final int hashCode;
- if (subtype == null) {
- hashCode = 0;
- } else {
- hashCode = subtype.hashCode();
- }
- mService.setCurrentSpellCheckerSubtype(null, hashCode);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- /**
- * @hide
- */
- public void setSpellCheckerEnabled(boolean enabled) {
- try {
- mService.setSpellCheckerEnabled(enabled);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- /**
- * @hide
- */
public boolean isSpellCheckerEnabled() {
try {
return mService.isSpellCheckerEnabled();
diff --git a/core/java/android/webkit/SafeBrowsingResponse.java b/core/java/android/webkit/SafeBrowsingResponse.java
new file mode 100644
index 0000000..3540f80
--- /dev/null
+++ b/core/java/android/webkit/SafeBrowsingResponse.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2017 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.webkit;
+
+/**
+ * Used to indicate an action to take when hitting a malicious URL. Instances of this class are
+ * created by the WebView and passed to {@link WebViewClient#onSafebrowsingHit}. The host
+ * application must call {@link #showInterstitial}, {@link #proceed}, or {@link #backToSafety} to
+ * set the WebView's response to the Safe Browsing hit.
+ */
+public abstract class SafeBrowsingResponse {
+
+ /**
+ * Display the default interstitial.
+ *
+ * @param allowReporting True if the interstitial should show a reporting checkbox.
+ */
+ public abstract void showInterstitial(boolean allowReporting);
+
+ /**
+ * Act as if the user clicked "visit this unsafe site."
+ *
+ * @param report True to enable Safe Browsing reporting.
+ */
+ public abstract void proceed(boolean report);
+
+ /**
+ * Act as if the user clicked "back to safety."
+ *
+ * @param report True to enable Safe Browsing reporting.
+ */
+ public abstract void backToSafety(boolean report);
+}
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index 2753ff6..da76731 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -67,6 +67,7 @@
import java.io.File;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import java.util.List;
import java.util.Map;
/**
@@ -1621,11 +1622,11 @@
}
/**
- * Starts Safe Browsing initialization. This should only be called once.
- * @param context is the activity context the WebView will be used in.
+ * Starts Safe Browsing initialization. This should only be called once. This does not require
+ * an Activity Context, and will always use the application Context to do its work.
+ * @param context Application Context.
* @param callback will be called with the value true if initialization is
* successful. The callback will be run on the UI thread.
- * @hide
*/
public static void initSafeBrowsing(Context context, ValueCallback<Boolean> callback) {
getFactory().getStatics().initSafeBrowsing(context, callback);
@@ -1633,13 +1634,27 @@
/**
* Shuts down Safe Browsing. This should only be called once.
- * @hide
*/
public static void shutdownSafeBrowsing() {
getFactory().getStatics().shutdownSafeBrowsing();
}
/**
+ * Sets the list of domains that are exempt from SafeBrowsing checks. The list is
+ * global for all the WebViews.
+ * TODO: Add documentation for the format of the urls.
+ *
+ * @param urls the list of URLs
+ * @param callback will be called with true if URLs are successfully added to the whitelist. It
+ * will be called with false if any URLs are malformed. The callback will be run on the UI
+ * thread.
+ */
+ public static void setSafeBrowsingWhitelist(@NonNull List<String> urls,
+ @Nullable ValueCallback<Boolean> callback) {
+ getFactory().getStatics().setSafeBrowsingWhitelist(urls, callback);
+ }
+
+ /**
* Gets the WebBackForwardList for this WebView. This contains the
* back/forward list for use in querying each item in the history stack.
* This is a copy of the private WebBackForwardList so it contains only a
@@ -2274,7 +2289,6 @@
/**
* Sets the {@link TextClassifier} for this WebView.
- * @hide
*/
public void setTextClassifier(@Nullable TextClassifier textClassifier) {
mProvider.setTextClassifier(textClassifier);
@@ -2283,7 +2297,6 @@
/**
* Returns the {@link TextClassifier} used by this WebView.
* If no TextClassifier has been set, this WebView uses the default set by the system.
- * @hide
*/
@NonNull
public TextClassifier getTextClassifier() {
diff --git a/core/java/android/webkit/WebViewClient.java b/core/java/android/webkit/WebViewClient.java
index 788908a..e7e539c 100644
--- a/core/java/android/webkit/WebViewClient.java
+++ b/core/java/android/webkit/WebViewClient.java
@@ -16,6 +16,7 @@
package android.webkit;
+import android.annotation.IntDef;
import android.graphics.Bitmap;
import android.net.http.SslError;
import android.os.Message;
@@ -23,6 +24,9 @@
import android.view.KeyEvent;
import android.view.ViewRootImpl;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
public class WebViewClient {
/**
@@ -237,6 +241,25 @@
/** Resource load was cancelled by Safe Browsing */
public static final int ERROR_UNSAFE_RESOURCE = -16;
+ /** @hide */
+ @IntDef({
+ SAFE_BROWSING_THREAT_UNKNOWN,
+ SAFE_BROWSING_THREAT_MALWARE,
+ SAFE_BROWSING_THREAT_PHISHING,
+ SAFE_BROWSING_THREAT_UNWANTED_SOFTWARE
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface SafeBrowsingThreat {}
+
+ /** The resource was blocked for an unknown reason */
+ public static final int SAFE_BROWSING_THREAT_UNKNOWN = 0;
+ /** The resource was blocked because it contains malware */
+ public static final int SAFE_BROWSING_THREAT_MALWARE = 1;
+ /** The resource was blocked because it contains deceptive content */
+ public static final int SAFE_BROWSING_THREAT_PHISHING = 2;
+ /** The resource was blocked because it contains unwanted software */
+ public static final int SAFE_BROWSING_THREAT_UNWANTED_SOFTWARE = 3;
+
/**
* Report an error to the host application. These errors are unrecoverable
* (i.e. the main resource is unavailable). The errorCode parameter
@@ -496,4 +519,24 @@
public boolean onRenderProcessGone(WebView view, RenderProcessGoneDetail detail) {
return false;
}
+
+ /**
+ * Notify the host application that a loading URL has been flagged by Safe Browsing.
+ *
+ * The application must invoke the callback to indicate the preferred response. The default
+ * behavior is to show an interstitial to the user, with the reporting checkbox visible.
+ *
+ * If the application needs to show its own custom interstitial UI, the callback can be invoked
+ * asynchronously with backToSafety() or proceed(), depending on user response.
+ *
+ * @param view The WebView that hit the malicious resource.
+ * @param request Object containing the details of the request.
+ * @param threatType The reason the resource was caught by Safe Browsing, corresponding to a
+ * SAFE_BROWSING_THREAT_* value.
+ * @param callback Applications must invoke one of the callback methods.
+ */
+ public void onSafeBrowsingHit(WebView view, WebResourceRequest request,
+ @SafeBrowsingThreat int threatType, SafeBrowsingResponse callback) {
+ callback.showInterstitial(/* allowReporting */ true);
+ }
}
diff --git a/core/java/android/webkit/WebViewFactory.java b/core/java/android/webkit/WebViewFactory.java
index 1b6b392..6a48242 100644
--- a/core/java/android/webkit/WebViewFactory.java
+++ b/core/java/android/webkit/WebViewFactory.java
@@ -18,7 +18,6 @@
import android.annotation.SystemApi;
import android.app.ActivityManager;
-import android.app.ActivityManagerInternal;
import android.app.AppGlobals;
import android.app.Application;
import android.content.Context;
@@ -27,27 +26,15 @@
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.os.Build;
-import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.StrictMode;
-import android.os.SystemProperties;
import android.os.Trace;
-import android.text.TextUtils;
import android.util.AndroidRuntimeException;
import android.util.ArraySet;
import android.util.Log;
-import com.android.server.LocalServices;
-
-import dalvik.system.VMRuntime;
-
import java.lang.reflect.Method;
-import java.io.File;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
/**
* Top level factory, used creating all the main WebView implementation classes.
@@ -67,14 +54,8 @@
private static final String NULL_WEBVIEW_FACTORY =
"com.android.webview.nullwebview.NullWebViewFactoryProvider";
- private static final String CHROMIUM_WEBVIEW_NATIVE_RELRO_32 =
- "/data/misc/shared_relro/libwebviewchromium32.relro";
- private static final String CHROMIUM_WEBVIEW_NATIVE_RELRO_64 =
- "/data/misc/shared_relro/libwebviewchromium64.relro";
-
public static final String CHROMIUM_WEBVIEW_VMSIZE_SIZE_PROPERTY =
"persist.sys.webview.vmsize";
- private static final long CHROMIUM_WEBVIEW_DEFAULT_VMSIZE_BYTES = 100 * 1024 * 1024;
private static final String LOGTAG = "WebViewFactory";
@@ -84,7 +65,6 @@
// same provider.
private static WebViewFactoryProvider sProviderInstance;
private static final Object sProviderLock = new Object();
- private static boolean sAddressSpaceReserved = false;
private static PackageInfo sPackageInfo;
// Error codes for loadWebViewNativeLibraryFromPackage
@@ -120,7 +100,7 @@
return "Unknown";
}
- private static class MissingWebViewPackageException extends Exception {
+ static class MissingWebViewPackageException extends Exception {
public MissingWebViewPackageException(String message) { super(message); }
public MissingWebViewPackageException(Exception e) { super(e); }
}
@@ -183,7 +163,7 @@
}
try {
- int loadNativeRet = loadNativeLibrary(clazzLoader, packageInfo);
+ int loadNativeRet = WebViewLibraryLoader.loadNativeLibrary(clazzLoader, packageInfo);
// If we failed waiting for relro we want to return that fact even if we successfully
// load the relro file.
if (loadNativeRet == LIBLOAD_SUCCESS) return response.status;
@@ -414,7 +394,7 @@
ClassLoader clazzLoader = webViewContext.getClassLoader();
Trace.traceBegin(Trace.TRACE_TAG_WEBVIEW, "WebViewFactory.loadNativeLibrary()");
- loadNativeLibrary(clazzLoader, sPackageInfo);
+ WebViewLibraryLoader.loadNativeLibrary(clazzLoader, sPackageInfo);
Trace.traceEnd(Trace.TRACE_TAG_WEBVIEW);
Trace.traceBegin(Trace.TRACE_TAG_WEBVIEW, "Class.forName()");
@@ -450,20 +430,7 @@
*/
public static void prepareWebViewInZygote() {
try {
- System.loadLibrary("webviewchromium_loader");
- long addressSpaceToReserve =
- SystemProperties.getLong(CHROMIUM_WEBVIEW_VMSIZE_SIZE_PROPERTY,
- CHROMIUM_WEBVIEW_DEFAULT_VMSIZE_BYTES);
- sAddressSpaceReserved = nativeReserveAddressSpace(addressSpaceToReserve);
-
- if (sAddressSpaceReserved) {
- if (DEBUG) {
- Log.v(LOGTAG, "address space reserved: " + addressSpaceToReserve + " bytes");
- }
- } else {
- Log.e(LOGTAG, "reserving " + addressSpaceToReserve +
- " bytes of address space failed");
- }
+ WebViewLibraryLoader.reserveAddressSpaceInZygote();
} catch (Throwable t) {
// Log and discard errors at this stage as we must not crash the zygote.
Log.e(LOGTAG, "error preparing native loader", t);
@@ -479,13 +446,13 @@
// waiting on relro creation.
if (Build.SUPPORTED_32_BIT_ABIS.length > 0) {
if (DEBUG) Log.v(LOGTAG, "Create 32 bit relro");
- createRelroFile(false /* is64Bit */, nativeLibraryPaths);
+ WebViewLibraryLoader.createRelroFile(false /* is64Bit */, nativeLibraryPaths);
numRelros++;
}
if (Build.SUPPORTED_64_BIT_ABIS.length > 0) {
if (DEBUG) Log.v(LOGTAG, "Create 64 bit relro");
- createRelroFile(true /* is64Bit */, nativeLibraryPaths);
+ WebViewLibraryLoader.createRelroFile(true /* is64Bit */, nativeLibraryPaths);
numRelros++;
}
return numRelros;
@@ -501,49 +468,7 @@
fixupStubApplicationInfo(packageInfo.applicationInfo,
AppGlobals.getInitialApplication().getPackageManager());
- nativeLibs = WebViewFactory.getWebViewNativeLibraryPaths(packageInfo);
- if (nativeLibs != null) {
- long newVmSize = 0L;
-
- for (String path : nativeLibs) {
- if (path == null || TextUtils.isEmpty(path)) continue;
- if (DEBUG) Log.d(LOGTAG, "Checking file size of " + path);
- File f = new File(path);
- if (f.exists()) {
- newVmSize = Math.max(newVmSize, f.length());
- continue;
- }
- if (path.contains("!/")) {
- String[] split = TextUtils.split(path, "!/");
- if (split.length == 2) {
- try (ZipFile z = new ZipFile(split[0])) {
- ZipEntry e = z.getEntry(split[1]);
- if (e != null && e.getMethod() == ZipEntry.STORED) {
- newVmSize = Math.max(newVmSize, e.getSize());
- continue;
- }
- }
- catch (IOException e) {
- Log.e(LOGTAG, "error reading APK file " + split[0] + ", ", e);
- }
- }
- }
- Log.e(LOGTAG, "error sizing load for " + path);
- }
-
- if (DEBUG) {
- Log.v(LOGTAG, "Based on library size, need " + newVmSize +
- " bytes of address space.");
- }
- // The required memory can be larger than the file on disk (due to .bss), and an
- // upgraded version of the library will likely be larger, so always attempt to
- // reserve twice as much as we think to allow for the library to grow during this
- // boot cycle.
- newVmSize = Math.max(2 * newVmSize, CHROMIUM_WEBVIEW_DEFAULT_VMSIZE_BYTES);
- Log.d(LOGTAG, "Setting new address space to " + newVmSize);
- SystemProperties.set(CHROMIUM_WEBVIEW_VMSIZE_SIZE_PROPERTY,
- Long.toString(newVmSize));
- }
+ nativeLibs = WebViewLibraryLoader.updateWebViewZygoteVmSize(packageInfo);
} catch (Throwable t) {
// Log and discard errors at this stage as we must not crash the system server.
Log.e(LOGTAG, "error preparing webview native library", t);
@@ -554,173 +479,6 @@
return prepareWebViewInSystemServer(nativeLibs);
}
- private static String getLoadFromApkPath(String apkPath,
- String[] abiList,
- String nativeLibFileName)
- throws MissingWebViewPackageException {
- // Search the APK for a native library conforming to a listed ABI.
- try (ZipFile z = new ZipFile(apkPath)) {
- for (String abi : abiList) {
- final String entry = "lib/" + abi + "/" + nativeLibFileName;
- ZipEntry e = z.getEntry(entry);
- if (e != null && e.getMethod() == ZipEntry.STORED) {
- // Return a path formatted for dlopen() load from APK.
- return apkPath + "!/" + entry;
- }
- }
- } catch (IOException e) {
- throw new MissingWebViewPackageException(e);
- }
- return "";
- }
-
- private static String[] getWebViewNativeLibraryPaths(PackageInfo packageInfo)
- throws MissingWebViewPackageException {
- ApplicationInfo ai = packageInfo.applicationInfo;
- final String NATIVE_LIB_FILE_NAME = getWebViewLibrary(ai);
-
- String path32;
- String path64;
- boolean primaryArchIs64bit = VMRuntime.is64BitAbi(ai.primaryCpuAbi);
- if (!TextUtils.isEmpty(ai.secondaryCpuAbi)) {
- // Multi-arch case.
- if (primaryArchIs64bit) {
- // Primary arch: 64-bit, secondary: 32-bit.
- path64 = ai.nativeLibraryDir;
- path32 = ai.secondaryNativeLibraryDir;
- } else {
- // Primary arch: 32-bit, secondary: 64-bit.
- path64 = ai.secondaryNativeLibraryDir;
- path32 = ai.nativeLibraryDir;
- }
- } else if (primaryArchIs64bit) {
- // Single-arch 64-bit.
- path64 = ai.nativeLibraryDir;
- path32 = "";
- } else {
- // Single-arch 32-bit.
- path32 = ai.nativeLibraryDir;
- path64 = "";
- }
-
- // Form the full paths to the extracted native libraries.
- // If libraries were not extracted, try load from APK paths instead.
- if (!TextUtils.isEmpty(path32)) {
- path32 += "/" + NATIVE_LIB_FILE_NAME;
- File f = new File(path32);
- if (!f.exists()) {
- path32 = getLoadFromApkPath(ai.sourceDir,
- Build.SUPPORTED_32_BIT_ABIS,
- NATIVE_LIB_FILE_NAME);
- }
- }
- if (!TextUtils.isEmpty(path64)) {
- path64 += "/" + NATIVE_LIB_FILE_NAME;
- File f = new File(path64);
- if (!f.exists()) {
- path64 = getLoadFromApkPath(ai.sourceDir,
- Build.SUPPORTED_64_BIT_ABIS,
- NATIVE_LIB_FILE_NAME);
- }
- }
-
- if (DEBUG) Log.v(LOGTAG, "Native 32-bit lib: " + path32 + ", 64-bit lib: " + path64);
- return new String[] { path32, path64 };
- }
-
- private static void createRelroFile(final boolean is64Bit, String[] nativeLibraryPaths) {
- final String abi =
- is64Bit ? Build.SUPPORTED_64_BIT_ABIS[0] : Build.SUPPORTED_32_BIT_ABIS[0];
-
- // crashHandler is invoked by the ActivityManagerService when the isolated process crashes.
- Runnable crashHandler = new Runnable() {
- @Override
- public void run() {
- try {
- Log.e(LOGTAG, "relro file creator for " + abi + " crashed. Proceeding without");
- getUpdateService().notifyRelroCreationCompleted();
- } catch (RemoteException e) {
- Log.e(LOGTAG, "Cannot reach WebViewUpdateService. " + e.getMessage());
- }
- }
- };
-
- try {
- if (nativeLibraryPaths == null
- || nativeLibraryPaths[0] == null || nativeLibraryPaths[1] == null) {
- throw new IllegalArgumentException(
- "Native library paths to the WebView RelRo process must not be null!");
- }
- int pid = LocalServices.getService(ActivityManagerInternal.class).startIsolatedProcess(
- RelroFileCreator.class.getName(), nativeLibraryPaths, "WebViewLoader-" + abi, abi,
- Process.SHARED_RELRO_UID, crashHandler);
- if (pid <= 0) throw new Exception("Failed to start the relro file creator process");
- } catch (Throwable t) {
- // Log and discard errors as we must not crash the system server.
- Log.e(LOGTAG, "error starting relro file creator for abi " + abi, t);
- crashHandler.run();
- }
- }
-
- private static class RelroFileCreator {
- // Called in an unprivileged child process to create the relro file.
- public static void main(String[] args) {
- boolean result = false;
- boolean is64Bit = VMRuntime.getRuntime().is64Bit();
- try{
- if (args.length != 2 || args[0] == null || args[1] == null) {
- Log.e(LOGTAG, "Invalid RelroFileCreator args: " + Arrays.toString(args));
- return;
- }
- Log.v(LOGTAG, "RelroFileCreator (64bit = " + is64Bit + "), " +
- " 32-bit lib: " + args[0] + ", 64-bit lib: " + args[1]);
- if (!sAddressSpaceReserved) {
- Log.e(LOGTAG, "can't create relro file; address space not reserved");
- return;
- }
- result = nativeCreateRelroFile(args[0] /* path32 */,
- args[1] /* path64 */,
- CHROMIUM_WEBVIEW_NATIVE_RELRO_32,
- CHROMIUM_WEBVIEW_NATIVE_RELRO_64);
- if (result && DEBUG) Log.v(LOGTAG, "created relro file");
- } finally {
- // We must do our best to always notify the update service, even if something fails.
- try {
- getUpdateService().notifyRelroCreationCompleted();
- } catch (RemoteException e) {
- Log.e(LOGTAG, "error notifying update service", e);
- }
-
- if (!result) Log.e(LOGTAG, "failed to create relro file");
-
- // Must explicitly exit or else this process will just sit around after we return.
- System.exit(0);
- }
- }
- }
-
- // Assumes that we have waited for relro creation
- private static int loadNativeLibrary(ClassLoader clazzLoader, PackageInfo packageInfo)
- throws MissingWebViewPackageException {
- if (!sAddressSpaceReserved) {
- Log.e(LOGTAG, "can't load with relro file; address space not reserved");
- return LIBLOAD_ADDRESS_SPACE_NOT_RESERVED;
- }
-
- String[] args = getWebViewNativeLibraryPaths(packageInfo);
- int result = nativeLoadWithRelroFile(args[0] /* path32 */,
- args[1] /* path64 */,
- CHROMIUM_WEBVIEW_NATIVE_RELRO_32,
- CHROMIUM_WEBVIEW_NATIVE_RELRO_64,
- clazzLoader);
- if (result != LIBLOAD_SUCCESS) {
- Log.w(LOGTAG, "failed to load with relro file, proceeding without");
- } else if (DEBUG) {
- Log.v(LOGTAG, "loaded with relro file");
- }
- return result;
- }
-
private static String WEBVIEW_UPDATE_SERVICE_NAME = "webviewupdate";
/** @hide */
@@ -728,11 +486,4 @@
return IWebViewUpdateService.Stub.asInterface(
ServiceManager.getService(WEBVIEW_UPDATE_SERVICE_NAME));
}
-
- private static native boolean nativeReserveAddressSpace(long addressSpaceToReserve);
- private static native boolean nativeCreateRelroFile(String lib32, String lib64,
- String relro32, String relro64);
- private static native int nativeLoadWithRelroFile(String lib32, String lib64,
- String relro32, String relro64,
- ClassLoader clazzLoader);
}
diff --git a/core/java/android/webkit/WebViewFactoryProvider.java b/core/java/android/webkit/WebViewFactoryProvider.java
index 00fdac8..613eb72 100644
--- a/core/java/android/webkit/WebViewFactoryProvider.java
+++ b/core/java/android/webkit/WebViewFactoryProvider.java
@@ -21,6 +21,8 @@
import android.content.Intent;
import android.net.Uri;
+import java.util.List;
+
/**
* This is the main entry-point into the WebView back end implementations, which the WebView
* proxy class uses to instantiate all the other objects as needed. The backend must provide an
@@ -78,18 +80,21 @@
/**
* Implement the API method
* {@link android.webkit.WebView#initSafeBrowsing(Context , ValueCallback<Boolean>)}
- * @hide
*/
- default void initSafeBrowsing(Context context, ValueCallback<Boolean> callback) {
- }
+ void initSafeBrowsing(Context context, ValueCallback<Boolean> callback);
/**
* Implement the API method
* {@link android.webkit.WebView#shutdownSafeBrowsing()}
- * @hide
*/
- default void shutdownSafeBrowsing() {
- }
+ void shutdownSafeBrowsing();
+
+ /**
+ * Implement the API method
+ * {@link android.webkit.WebView#setSafeBrowsingWhitelist(List<String>,
+ * ValueCallback<Boolean>)}
+ */
+ void setSafeBrowsingWhitelist(List<String> urls, ValueCallback<Boolean> callback);
}
Statics getStatics();
diff --git a/core/java/android/webkit/WebViewLibraryLoader.java b/core/java/android/webkit/WebViewLibraryLoader.java
new file mode 100644
index 0000000..6f9e8ec
--- /dev/null
+++ b/core/java/android/webkit/WebViewLibraryLoader.java
@@ -0,0 +1,320 @@
+/*
+ * Copyright (C) 2017 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.webkit;
+
+import android.app.ActivityManagerInternal;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.os.Build;
+import android.os.Process;
+import android.os.RemoteException;
+import android.os.SystemProperties;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.android.server.LocalServices;
+
+import dalvik.system.VMRuntime;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+class WebViewLibraryLoader {
+ private static final String LOGTAG = WebViewLibraryLoader.class.getSimpleName();
+
+ private static final String CHROMIUM_WEBVIEW_NATIVE_RELRO_32 =
+ "/data/misc/shared_relro/libwebviewchromium32.relro";
+ private static final String CHROMIUM_WEBVIEW_NATIVE_RELRO_64 =
+ "/data/misc/shared_relro/libwebviewchromium64.relro";
+ private static final long CHROMIUM_WEBVIEW_DEFAULT_VMSIZE_BYTES = 100 * 1024 * 1024;
+
+ private static final boolean DEBUG = false;
+
+ private static boolean sAddressSpaceReserved = false;
+
+ /**
+ * Private class for running the actual relro creation in an unprivileged child process.
+ * RelroFileCreator is a static class (without access to the outer class) to avoid accidentally
+ * using any static members from the outer class. Those members will in reality differ between
+ * the child process in which RelroFileCreator operates, and the app process in which the static
+ * members of this class are used.
+ */
+ private static class RelroFileCreator {
+ // Called in an unprivileged child process to create the relro file.
+ public static void main(String[] args) {
+ boolean result = false;
+ boolean is64Bit = VMRuntime.getRuntime().is64Bit();
+ try {
+ if (args.length != 2 || args[0] == null || args[1] == null) {
+ Log.e(LOGTAG, "Invalid RelroFileCreator args: " + Arrays.toString(args));
+ return;
+ }
+ Log.v(LOGTAG, "RelroFileCreator (64bit = " + is64Bit + "), "
+ + " 32-bit lib: " + args[0] + ", 64-bit lib: " + args[1]);
+ if (!sAddressSpaceReserved) {
+ Log.e(LOGTAG, "can't create relro file; address space not reserved");
+ return;
+ }
+ result = nativeCreateRelroFile(args[0] /* path32 */,
+ args[1] /* path64 */,
+ CHROMIUM_WEBVIEW_NATIVE_RELRO_32,
+ CHROMIUM_WEBVIEW_NATIVE_RELRO_64);
+ if (result && DEBUG) Log.v(LOGTAG, "created relro file");
+ } finally {
+ // We must do our best to always notify the update service, even if something fails.
+ try {
+ WebViewFactory.getUpdateService().notifyRelroCreationCompleted();
+ } catch (RemoteException e) {
+ Log.e(LOGTAG, "error notifying update service", e);
+ }
+
+ if (!result) Log.e(LOGTAG, "failed to create relro file");
+
+ // Must explicitly exit or else this process will just sit around after we return.
+ System.exit(0);
+ }
+ }
+ }
+
+ /**
+ * Create a single relro file by invoking an isolated process that to do the actual work.
+ */
+ static void createRelroFile(final boolean is64Bit, String[] nativeLibraryPaths) {
+ final String abi =
+ is64Bit ? Build.SUPPORTED_64_BIT_ABIS[0] : Build.SUPPORTED_32_BIT_ABIS[0];
+
+ // crashHandler is invoked by the ActivityManagerService when the isolated process crashes.
+ Runnable crashHandler = new Runnable() {
+ @Override
+ public void run() {
+ try {
+ Log.e(LOGTAG, "relro file creator for " + abi + " crashed. Proceeding without");
+ WebViewFactory.getUpdateService().notifyRelroCreationCompleted();
+ } catch (RemoteException e) {
+ Log.e(LOGTAG, "Cannot reach WebViewUpdateService. " + e.getMessage());
+ }
+ }
+ };
+
+ try {
+ if (nativeLibraryPaths == null
+ || nativeLibraryPaths[0] == null || nativeLibraryPaths[1] == null) {
+ throw new IllegalArgumentException(
+ "Native library paths to the WebView RelRo process must not be null!");
+ }
+ int pid = LocalServices.getService(ActivityManagerInternal.class).startIsolatedProcess(
+ RelroFileCreator.class.getName(), nativeLibraryPaths,
+ "WebViewLoader-" + abi, abi, Process.SHARED_RELRO_UID, crashHandler);
+ if (pid <= 0) throw new Exception("Failed to start the relro file creator process");
+ } catch (Throwable t) {
+ // Log and discard errors as we must not crash the system server.
+ Log.e(LOGTAG, "error starting relro file creator for abi " + abi, t);
+ crashHandler.run();
+ }
+ }
+
+ /**
+ *
+ * @return the native WebView libraries in the new WebView APK.
+ */
+ static String[] updateWebViewZygoteVmSize(PackageInfo packageInfo)
+ throws WebViewFactory.MissingWebViewPackageException {
+ // Find the native libraries of the new WebView package, to change the size of the
+ // memory region in the Zygote reserved for the library.
+ String[] nativeLibs = getWebViewNativeLibraryPaths(packageInfo);
+ if (nativeLibs != null) {
+ long newVmSize = 0L;
+
+ for (String path : nativeLibs) {
+ if (path == null || TextUtils.isEmpty(path)) continue;
+ if (DEBUG) Log.d(LOGTAG, "Checking file size of " + path);
+ File f = new File(path);
+ if (f.exists()) {
+ newVmSize = Math.max(newVmSize, f.length());
+ continue;
+ }
+ if (path.contains("!/")) {
+ String[] split = TextUtils.split(path, "!/");
+ if (split.length == 2) {
+ try (ZipFile z = new ZipFile(split[0])) {
+ ZipEntry e = z.getEntry(split[1]);
+ if (e != null && e.getMethod() == ZipEntry.STORED) {
+ newVmSize = Math.max(newVmSize, e.getSize());
+ continue;
+ }
+ }
+ catch (IOException e) {
+ Log.e(LOGTAG, "error reading APK file " + split[0] + ", ", e);
+ }
+ }
+ }
+ Log.e(LOGTAG, "error sizing load for " + path);
+ }
+
+ if (DEBUG) {
+ Log.v(LOGTAG, "Based on library size, need " + newVmSize
+ + " bytes of address space.");
+ }
+ // The required memory can be larger than the file on disk (due to .bss), and an
+ // upgraded version of the library will likely be larger, so always attempt to
+ // reserve twice as much as we think to allow for the library to grow during this
+ // boot cycle.
+ newVmSize = Math.max(2 * newVmSize, CHROMIUM_WEBVIEW_DEFAULT_VMSIZE_BYTES);
+ Log.d(LOGTAG, "Setting new address space to " + newVmSize);
+ setWebViewZygoteVmSize(newVmSize);
+ }
+ return nativeLibs;
+ }
+
+ /**
+ * Reserve space for the native library to be loaded into.
+ */
+ static void reserveAddressSpaceInZygote() {
+ System.loadLibrary("webviewchromium_loader");
+ long addressSpaceToReserve =
+ SystemProperties.getLong(WebViewFactory.CHROMIUM_WEBVIEW_VMSIZE_SIZE_PROPERTY,
+ CHROMIUM_WEBVIEW_DEFAULT_VMSIZE_BYTES);
+ sAddressSpaceReserved = nativeReserveAddressSpace(addressSpaceToReserve);
+
+ if (sAddressSpaceReserved) {
+ if (DEBUG) {
+ Log.v(LOGTAG, "address space reserved: " + addressSpaceToReserve + " bytes");
+ }
+ } else {
+ Log.e(LOGTAG, "reserving " + addressSpaceToReserve + " bytes of address space failed");
+ }
+ }
+
+ /**
+ * Load WebView's native library into the current process.
+ * Note: assumes that we have waited for relro creation.
+ * @param clazzLoader class loader used to find the linker namespace to load the library into.
+ * @param packageInfo the package from which WebView is loaded.
+ */
+ static int loadNativeLibrary(ClassLoader clazzLoader, PackageInfo packageInfo)
+ throws WebViewFactory.MissingWebViewPackageException {
+ if (!sAddressSpaceReserved) {
+ Log.e(LOGTAG, "can't load with relro file; address space not reserved");
+ return WebViewFactory.LIBLOAD_ADDRESS_SPACE_NOT_RESERVED;
+ }
+
+ final String libraryFileName =
+ WebViewFactory.getWebViewLibrary(packageInfo.applicationInfo);
+ int result = nativeLoadWithRelroFile(libraryFileName, CHROMIUM_WEBVIEW_NATIVE_RELRO_32,
+ CHROMIUM_WEBVIEW_NATIVE_RELRO_64, clazzLoader);
+ if (result != WebViewFactory.LIBLOAD_SUCCESS) {
+ Log.w(LOGTAG, "failed to load with relro file, proceeding without");
+ } else if (DEBUG) {
+ Log.v(LOGTAG, "loaded with relro file");
+ }
+ return result;
+ }
+
+ /**
+ * Fetch WebView's native library paths from {@param packageInfo}.
+ */
+ static String[] getWebViewNativeLibraryPaths(PackageInfo packageInfo)
+ throws WebViewFactory.MissingWebViewPackageException {
+ ApplicationInfo ai = packageInfo.applicationInfo;
+ final String nativeLibFileName = WebViewFactory.getWebViewLibrary(ai);
+
+ String path32;
+ String path64;
+ boolean primaryArchIs64bit = VMRuntime.is64BitAbi(ai.primaryCpuAbi);
+ if (!TextUtils.isEmpty(ai.secondaryCpuAbi)) {
+ // Multi-arch case.
+ if (primaryArchIs64bit) {
+ // Primary arch: 64-bit, secondary: 32-bit.
+ path64 = ai.nativeLibraryDir;
+ path32 = ai.secondaryNativeLibraryDir;
+ } else {
+ // Primary arch: 32-bit, secondary: 64-bit.
+ path64 = ai.secondaryNativeLibraryDir;
+ path32 = ai.nativeLibraryDir;
+ }
+ } else if (primaryArchIs64bit) {
+ // Single-arch 64-bit.
+ path64 = ai.nativeLibraryDir;
+ path32 = "";
+ } else {
+ // Single-arch 32-bit.
+ path32 = ai.nativeLibraryDir;
+ path64 = "";
+ }
+
+ // Form the full paths to the extracted native libraries.
+ // If libraries were not extracted, try load from APK paths instead.
+ if (!TextUtils.isEmpty(path32)) {
+ path32 += "/" + nativeLibFileName;
+ File f = new File(path32);
+ if (!f.exists()) {
+ path32 = getLoadFromApkPath(ai.sourceDir,
+ Build.SUPPORTED_32_BIT_ABIS,
+ nativeLibFileName);
+ }
+ }
+ if (!TextUtils.isEmpty(path64)) {
+ path64 += "/" + nativeLibFileName;
+ File f = new File(path64);
+ if (!f.exists()) {
+ path64 = getLoadFromApkPath(ai.sourceDir,
+ Build.SUPPORTED_64_BIT_ABIS,
+ nativeLibFileName);
+ }
+ }
+
+ if (DEBUG) Log.v(LOGTAG, "Native 32-bit lib: " + path32 + ", 64-bit lib: " + path64);
+ return new String[] { path32, path64 };
+ }
+
+ private static String getLoadFromApkPath(String apkPath,
+ String[] abiList,
+ String nativeLibFileName)
+ throws WebViewFactory.MissingWebViewPackageException {
+ // Search the APK for a native library conforming to a listed ABI.
+ try (ZipFile z = new ZipFile(apkPath)) {
+ for (String abi : abiList) {
+ final String entry = "lib/" + abi + "/" + nativeLibFileName;
+ ZipEntry e = z.getEntry(entry);
+ if (e != null && e.getMethod() == ZipEntry.STORED) {
+ // Return a path formatted for dlopen() load from APK.
+ return apkPath + "!/" + entry;
+ }
+ }
+ } catch (IOException e) {
+ throw new WebViewFactory.MissingWebViewPackageException(e);
+ }
+ return "";
+ }
+
+ /**
+ * Sets the size of the memory area in which to store the relro section.
+ */
+ private static void setWebViewZygoteVmSize(long vmSize) {
+ SystemProperties.set(WebViewFactory.CHROMIUM_WEBVIEW_VMSIZE_SIZE_PROPERTY,
+ Long.toString(vmSize));
+ }
+
+ static native boolean nativeReserveAddressSpace(long addressSpaceToReserve);
+ static native boolean nativeCreateRelroFile(String lib32, String lib64,
+ String relro32, String relro64);
+ static native int nativeLoadWithRelroFile(String lib, String relro32, String relro64,
+ ClassLoader clazzLoader);
+}
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index 5476ab2..91e2f7d 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -913,14 +913,7 @@
mCheckedIdStates = new LongSparseArray<Integer>();
}
}
-
- if (mCheckStates != null) {
- mCheckStates.clear();
- }
-
- if (mCheckedIdStates != null) {
- mCheckedIdStates.clear();
- }
+ clearChoices();
}
/**
diff --git a/core/java/android/widget/ArrayAdapter.java b/core/java/android/widget/ArrayAdapter.java
index 74f22b3..690067b 100644
--- a/core/java/android/widget/ArrayAdapter.java
+++ b/core/java/android/widget/ArrayAdapter.java
@@ -526,6 +526,13 @@
*/
@Override
public CharSequence[] getAutofillOptions() {
+ // First check if app developer explicitly set them.
+ final CharSequence[] explicitOptions = super.getAutofillOptions();
+ if (explicitOptions != null) {
+ return explicitOptions;
+ }
+
+ // Otherwise, only return options that came from static resources.
if (!mObjectsFromResources || mObjects == null || mObjects.isEmpty()) {
return null;
}
diff --git a/core/java/android/widget/BaseAdapter.java b/core/java/android/widget/BaseAdapter.java
index c960342..5838cc1 100644
--- a/core/java/android/widget/BaseAdapter.java
+++ b/core/java/android/widget/BaseAdapter.java
@@ -16,6 +16,7 @@
package android.widget;
+import android.annotation.Nullable;
import android.database.DataSetObservable;
import android.database.DataSetObserver;
import android.view.View;
@@ -29,6 +30,7 @@
*/
public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {
private final DataSetObservable mDataSetObservable = new DataSetObservable();
+ private CharSequence[] mAutofillOptions;
public boolean hasStableIds() {
return false;
@@ -82,4 +84,16 @@
public boolean isEmpty() {
return getCount() == 0;
}
+
+ @Override
+ public CharSequence[] getAutofillOptions() {
+ return mAutofillOptions;
+ }
+
+ /**
+ * Sets the value returned by {@link #getAutofillOptions()}
+ */
+ public void setAutofillOptions(@Nullable CharSequence... options) {
+ mAutofillOptions = options;
+ }
}
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index 6374aa2..04a8265 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -83,6 +83,7 @@
import android.view.DragAndDropPermissions;
import android.view.DragEvent;
import android.view.Gravity;
+import android.view.HapticFeedbackConstants;
import android.view.InputDevice;
import android.view.LayoutInflater;
import android.view.Menu;
@@ -176,6 +177,8 @@
private boolean mInsertionControllerEnabled;
private boolean mSelectionControllerEnabled;
+ private final boolean mHapticTextHandleEnabled;
+
// Used to highlight a word when it is corrected by the IME
private CorrectionHighlighter mCorrectionHighlighter;
@@ -320,6 +323,8 @@
// Synchronize the filter list, which places the undo input filter at the end.
mTextView.setFilters(mTextView.getFilters());
mProcessTextIntentActionsHandler = new ProcessTextIntentActionsHandler(this);
+ mHapticTextHandleEnabled = mTextView.getContext().getResources().getBoolean(
+ com.android.internal.R.bool.config_enableHapticTextHandle);
}
ParcelableParcel saveInstanceState() {
@@ -1382,7 +1387,7 @@
if (mTextActionMode != null) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_MOVE:
- hideFloatingToolbar();
+ hideFloatingToolbar(ActionMode.DEFAULT_HIDE_DURATION);
break;
case MotionEvent.ACTION_UP: // fall through
case MotionEvent.ACTION_CANCEL:
@@ -1391,10 +1396,10 @@
}
}
- private void hideFloatingToolbar() {
+ void hideFloatingToolbar(int duration) {
if (mTextActionMode != null) {
mTextView.removeCallbacks(mShowFloatingToolbar);
- mTextActionMode.hide(ActionMode.DEFAULT_HIDE_DURATION);
+ mTextActionMode.hide(duration);
}
}
@@ -2659,7 +2664,7 @@
.setEnabled(mTextView.canSelectAllText())
.setOnMenuItemClickListener(mOnContextMenuItemClickListener);
menu.add(Menu.NONE, TextView.ID_AUTOFILL, MENU_ITEM_ORDER_AUTOFILL,
- com.android.internal.R.string.autofill)
+ android.R.string.autofill)
.setEnabled(mTextView.canRequestAutofill())
.setOnMenuItemClickListener(mOnContextMenuItemClickListener);
@@ -4258,7 +4263,7 @@
mNumberPreviousOffsets++;
}
- private void filterOnTouchUp() {
+ private void filterOnTouchUp(boolean fromTouchScreen) {
final long now = SystemClock.uptimeMillis();
int i = 0;
int index = mPreviousOffsetIndex;
@@ -4270,7 +4275,7 @@
if (i > 0 && i < iMax
&& (now - mPreviousOffsetsTimes[index]) > TOUCH_UP_FILTER_DELAY_BEFORE) {
- positionAtCursorOffset(mPreviousOffsets[index], false);
+ positionAtCursorOffset(mPreviousOffsets[index], false, fromTouchScreen);
}
}
@@ -4287,7 +4292,7 @@
public void invalidate() {
super.invalidate();
if (isShowing()) {
- positionAtCursorOffset(getCurrentCursorOffset(), true);
+ positionAtCursorOffset(getCurrentCursorOffset(), true, false);
}
};
@@ -4306,7 +4311,7 @@
// Make sure the offset is always considered new, even when focusing at same position
mPreviousOffset = -1;
- positionAtCursorOffset(getCurrentCursorOffset(), false);
+ positionAtCursorOffset(getCurrentCursorOffset(), false, false);
}
protected void dismiss() {
@@ -4343,7 +4348,7 @@
protected abstract void updateSelection(int offset);
- public abstract void updatePosition(float x, float y);
+ protected abstract void updatePosition(float x, float y, boolean fromTouchScreen);
protected boolean isAtRtlRun(@NonNull Layout layout, int offset) {
return layout.isRtlCharAt(offset);
@@ -4362,8 +4367,11 @@
* @param offset Cursor offset. Must be in [-1, length].
* @param forceUpdatePosition whether to force update the position. This should be true
* when If the parent has been scrolled, for example.
+ * @param fromTouchScreen {@code true} if the cursor is moved with motion events from the
+ * touch screen.
*/
- protected void positionAtCursorOffset(int offset, boolean forceUpdatePosition) {
+ protected void positionAtCursorOffset(int offset, boolean forceUpdatePosition,
+ boolean fromTouchScreen) {
// A HandleView relies on the layout, which may be nulled by external methods
Layout layout = mTextView.getLayout();
if (layout == null) {
@@ -4377,6 +4385,9 @@
if (offsetChanged || forceUpdatePosition) {
if (offsetChanged) {
updateSelection(offset);
+ if (fromTouchScreen && mHapticTextHandleEnabled) {
+ mTextView.performHapticFeedback(HapticFeedbackConstants.TEXT_HANDLE_MOVE);
+ }
addPositionToTouchUpFilter(offset);
}
final int line = layout.getLineForOffset(offset);
@@ -4409,7 +4420,7 @@
@Override
public void updatePosition(int parentPositionX, int parentPositionY,
boolean parentPositionChanged, boolean parentScrolled) {
- positionAtCursorOffset(getCurrentCursorOffset(), parentScrolled);
+ positionAtCursorOffset(getCurrentCursorOffset(), parentScrolled, false);
if (parentPositionChanged || mPositionHasChanged) {
if (mIsDragging) {
// Update touchToWindow offset in case of parent scrolling while dragging
@@ -4521,12 +4532,13 @@
xInWindow - mTouchToWindowOffsetX + mHotspotX + getHorizontalOffset();
final float newPosY = yInWindow - mTouchToWindowOffsetY + mTouchOffsetY;
- updatePosition(newPosX, newPosY);
+ updatePosition(newPosX, newPosY,
+ ev.isFromSource(InputDevice.SOURCE_TOUCHSCREEN));
break;
}
case MotionEvent.ACTION_UP:
- filterOnTouchUp();
+ filterOnTouchUp(ev.isFromSource(InputDevice.SOURCE_TOUCHSCREEN));
mIsDragging = false;
updateDrawable();
break;
@@ -4707,7 +4719,7 @@
}
@Override
- public void updatePosition(float x, float y) {
+ protected void updatePosition(float x, float y, boolean fromTouchScreen) {
Layout layout = mTextView.getLayout();
int offset;
if (layout != null) {
@@ -4720,7 +4732,7 @@
} else {
offset = -1;
}
- positionAtCursorOffset(offset, false);
+ positionAtCursorOffset(offset, false, fromTouchScreen);
if (mTextActionMode != null) {
invalidateActionMode();
}
@@ -4811,12 +4823,13 @@
}
@Override
- public void updatePosition(float x, float y) {
+ protected void updatePosition(float x, float y, boolean fromTouchScreen) {
final Layout layout = mTextView.getLayout();
if (layout == null) {
// HandleView will deal appropriately in positionAtCursorOffset when
// layout is null.
- positionAndAdjustForCrossingHandles(mTextView.getOffsetForPosition(x, y));
+ positionAndAdjustForCrossingHandles(mTextView.getOffsetForPosition(x, y),
+ fromTouchScreen);
return;
}
@@ -4859,12 +4872,12 @@
// to the current position.
mLanguageDirectionChanged = true;
mTouchWordDelta = 0.0f;
- positionAndAdjustForCrossingHandles(offset);
+ positionAndAdjustForCrossingHandles(offset, fromTouchScreen);
return;
} else if (mLanguageDirectionChanged && !isLvlBoundary) {
// We've just moved past the boundary so update the position. After this we can
// figure out if the user is expanding or shrinking to go by word or character.
- positionAndAdjustForCrossingHandles(offset);
+ positionAndAdjustForCrossingHandles(offset, fromTouchScreen);
mTouchWordDelta = 0.0f;
mLanguageDirectionChanged = false;
return;
@@ -4898,7 +4911,7 @@
final int nextOffset = (atRtl == isStartHandle())
? layout.getOffsetToRightOf(mPreviousOffset)
: layout.getOffsetToLeftOf(mPreviousOffset);
- positionAndAdjustForCrossingHandles(nextOffset);
+ positionAndAdjustForCrossingHandles(nextOffset, fromTouchScreen);
return;
}
}
@@ -4977,14 +4990,15 @@
if (positionCursor) {
mPreviousLineTouched = currLine;
- positionAndAdjustForCrossingHandles(offset);
+ positionAndAdjustForCrossingHandles(offset, fromTouchScreen);
}
mPrevX = x;
}
@Override
- protected void positionAtCursorOffset(int offset, boolean forceUpdatePosition) {
- super.positionAtCursorOffset(offset, forceUpdatePosition);
+ protected void positionAtCursorOffset(int offset, boolean forceUpdatePosition,
+ boolean fromTouchScreen) {
+ super.positionAtCursorOffset(offset, forceUpdatePosition, fromTouchScreen);
mInWord = (offset != -1) && !getWordIteratorWithText().isBoundary(offset);
}
@@ -5000,7 +5014,7 @@
return superResult;
}
- private void positionAndAdjustForCrossingHandles(int offset) {
+ private void positionAndAdjustForCrossingHandles(int offset, boolean fromTouchScreen) {
final int anotherHandleOffset =
isStartHandle() ? mTextView.getSelectionEnd() : mTextView.getSelectionStart();
if ((isStartHandle() && offset >= anotherHandleOffset)
@@ -5025,14 +5039,14 @@
} else {
offset = TextUtils.unpackRangeEndFromLong(range);
}
- positionAtCursorOffset(offset, false);
+ positionAtCursorOffset(offset, false, fromTouchScreen);
return;
}
}
// Handles can not cross and selection is at least one character.
offset = getNextCursorOffset(anotherHandleOffset, !isStartHandle());
}
- positionAtCursorOffset(offset, false);
+ positionAtCursorOffset(offset, false, fromTouchScreen);
}
private boolean positionNearEdgeOfScrollingView(float x, boolean atRtl) {
@@ -5475,7 +5489,8 @@
private void updateCharacterBasedSelection(MotionEvent event) {
final int offset = mTextView.getOffsetForPosition(event.getX(), event.getY());
- Selection.setSelection((Spannable) mTextView.getText(), mStartOffset, offset);
+ updateSelectionInternal(mStartOffset, offset,
+ event.isFromSource(InputDevice.SOURCE_TOUCHSCREEN));
}
private void updateWordBasedSelection(MotionEvent event) {
@@ -5533,7 +5548,8 @@
}
}
mLineSelectionIsOn = currLine;
- Selection.setSelection((Spannable) mTextView.getText(), startOffset, offset);
+ updateSelectionInternal(startOffset, offset,
+ event.isFromSource(InputDevice.SOURCE_TOUCHSCREEN));
}
private void updateParagraphBasedSelection(MotionEvent event) {
@@ -5544,7 +5560,19 @@
final long paragraphsRange = getParagraphsRange(start, end);
final int selectionStart = TextUtils.unpackRangeStartFromLong(paragraphsRange);
final int selectionEnd = TextUtils.unpackRangeEndFromLong(paragraphsRange);
+ updateSelectionInternal(selectionStart, selectionEnd,
+ event.isFromSource(InputDevice.SOURCE_TOUCHSCREEN));
+ }
+
+ private void updateSelectionInternal(int selectionStart, int selectionEnd,
+ boolean fromTouchScreen) {
+ final boolean performHapticFeedback = fromTouchScreen && mHapticTextHandleEnabled
+ && ((mTextView.getSelectionStart() != selectionStart)
+ || (mTextView.getSelectionEnd() != selectionEnd));
Selection.setSelection((Spannable) mTextView.getText(), selectionStart, selectionEnd);
+ if (performHapticFeedback) {
+ mTextView.performHapticFeedback(HapticFeedbackConstants.TEXT_HANDLE_MOVE);
+ }
}
/**
diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java
index 7bdd6da..4d3189e 100644
--- a/core/java/android/widget/NumberPicker.java
+++ b/core/java/android/widget/NumberPicker.java
@@ -737,6 +737,7 @@
mInputText.setFilters(new InputFilter[] {
new InputTextFilter()
});
+ mInputText.setAccessibilityLiveRegion(View.ACCESSIBILITY_LIVE_REGION_POLITE);
mInputText.setRawInputType(InputType.TYPE_CLASS_NUMBER);
mInputText.setImeOptions(EditorInfo.IME_ACTION_DONE);
@@ -770,6 +771,12 @@
if (getImportantForAccessibility() == IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES);
}
+
+ // Should be focusable by default, as the text view whose visibility changes is focusable
+ if (getFocusable() == View.FOCUSABLE_AUTO) {
+ setFocusable(View.FOCUSABLE);
+ setFocusableInTouchMode(true);
+ }
}
@Override
@@ -856,7 +863,7 @@
switch (action) {
case MotionEvent.ACTION_DOWN: {
removeAllCallbacks();
- mInputText.setVisibility(View.INVISIBLE);
+ hideSoftInput();
mLastDownOrMoveEventY = mLastDownEventY = event.getY();
mLastDownEventTime = event.getEventTime();
mIgnoreMoveEvents = false;
@@ -883,11 +890,9 @@
mFlingScroller.forceFinished(true);
mAdjustScroller.forceFinished(true);
} else if (mLastDownEventY < mTopSelectionDividerTop) {
- hideSoftInput();
postChangeCurrentByOneFromLongPress(
false, ViewConfiguration.getLongPressTimeout());
} else if (mLastDownEventY > mBottomSelectionDividerBottom) {
- hideSoftInput();
postChangeCurrentByOneFromLongPress(
true, ViewConfiguration.getLongPressTimeout());
} else {
@@ -1120,6 +1125,7 @@
@Override
public void scrollBy(int x, int y) {
int[] selectorIndices = mSelectorIndices;
+ int startScrollOffset = mCurrentScrollOffset;
if (!mWrapSelectorWheel && y > 0
&& selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] <= mMinValue) {
mCurrentScrollOffset = mInitialScrollOffset;
@@ -1147,6 +1153,9 @@
mCurrentScrollOffset = mInitialScrollOffset;
}
}
+ if (startScrollOffset != mCurrentScrollOffset) {
+ onScrollChanged(0, mCurrentScrollOffset, 0, startScrollOffset);
+ }
}
@Override
@@ -1281,9 +1290,9 @@
InputMethodManager inputMethodManager = InputMethodManager.peekInstance();
if (inputMethodManager != null && inputMethodManager.isActive(mInputText)) {
inputMethodManager.hideSoftInputFromWindow(getWindowToken(), 0);
- if (mHasSelectorWheel) {
- mInputText.setVisibility(View.INVISIBLE);
- }
+ }
+ if (mHasSelectorWheel) {
+ mInputText.setVisibility(View.INVISIBLE);
}
}
@@ -1735,7 +1744,10 @@
}
int previous = mValue;
mValue = current;
- updateInputTextView();
+ // If we're flinging, we'll update the text view at the end when it becomes visible
+ if (mScrollState != OnScrollListener.SCROLL_STATE_FLING) {
+ updateInputTextView();
+ }
if (notifyChange) {
notifyChange(previous, current);
}
@@ -1752,7 +1764,7 @@
*/
private void changeValueByOne(boolean increment) {
if (mHasSelectorWheel) {
- mInputText.setVisibility(View.INVISIBLE);
+ hideSoftInput();
if (!moveToFinalScrollerPosition(mFlingScroller)) {
moveToFinalScrollerPosition(mAdjustScroller);
}
@@ -1799,9 +1811,8 @@
*/
private void onScrollerFinished(Scroller scroller) {
if (scroller == mFlingScroller) {
- if (!ensureScrollWheelAdjusted()) {
- updateInputTextView();
- }
+ ensureScrollWheelAdjusted();
+ updateInputTextView();
onScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE);
} else {
if (mScrollState != OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
@@ -1937,9 +1948,25 @@
*/
String text = (mDisplayedValues == null) ? formatNumber(mValue)
: mDisplayedValues[mValue - mMinValue];
- if (!TextUtils.isEmpty(text) && !text.equals(mInputText.getText().toString())) {
- mInputText.setText(text);
- return true;
+ if (!TextUtils.isEmpty(text)) {
+ CharSequence beforeText = mInputText.getText();
+ if (!text.equals(beforeText.toString())) {
+ mInputText.setText(text);
+ if (AccessibilityManager.getInstance(mContext).isEnabled()) {
+ AccessibilityEvent event = AccessibilityEvent.obtain(
+ AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED);
+ mInputText.onInitializeAccessibilityEvent(event);
+ mInputText.onPopulateAccessibilityEvent(event);
+ event.setFromIndex(0);
+ event.setRemovedCount(beforeText.length());
+ event.setAddedCount(text.length());
+ event.setBeforeText(beforeText);
+ event.setSource(NumberPicker.this,
+ AccessibilityNodeProviderImpl.VIRTUAL_VIEW_ID_INPUT);
+ requestSendAccessibilityEvent(NumberPicker.this, event);
+ }
+ return true;
+ }
}
return false;
diff --git a/core/java/android/widget/PopupWindow.java b/core/java/android/widget/PopupWindow.java
index 8464c6e..bf25915 100644
--- a/core/java/android/widget/PopupWindow.java
+++ b/core/java/android/widget/PopupWindow.java
@@ -1334,6 +1334,10 @@
+ "calling setContentView() before attempting to show the popup.");
}
+ if (p.accessibilityTitle == null) {
+ p.accessibilityTitle = mContext.getString(R.string.popup_window_default_title);
+ }
+
// The old decor view may be transitioning out. Make sure it finishes
// and cleans up before we try to create another one.
if (mDecorView != null) {
diff --git a/core/java/android/widget/RelativeLayout.java b/core/java/android/widget/RelativeLayout.java
index 181ad31..75fc538 100644
--- a/core/java/android/widget/RelativeLayout.java
+++ b/core/java/android/widget/RelativeLayout.java
@@ -486,7 +486,7 @@
if (targetSdkVersion < Build.VERSION_CODES.KITKAT) {
width = Math.max(width, myWidth - params.mLeft);
} else {
- width = Math.max(width, myWidth - params.mLeft - params.leftMargin);
+ width = Math.max(width, myWidth - params.mLeft + params.leftMargin);
}
} else {
if (targetSdkVersion < Build.VERSION_CODES.KITKAT) {
@@ -833,25 +833,28 @@
if (!wrapContent) {
centerHorizontal(child, params, myWidth);
} else {
- params.mLeft = mPaddingLeft + params.leftMargin;
- params.mRight = params.mLeft + child.getMeasuredWidth();
+ positionAtEdge(child, params, myWidth);
}
return true;
} else {
// This is the default case. For RTL we start from the right and for LTR we start
// from the left. This will give LEFT/TOP for LTR and RIGHT/TOP for RTL.
- if (isLayoutRtl()) {
- params.mRight = myWidth - mPaddingRight- params.rightMargin;
- params.mLeft = params.mRight - child.getMeasuredWidth();
- } else {
- params.mLeft = mPaddingLeft + params.leftMargin;
- params.mRight = params.mLeft + child.getMeasuredWidth();
- }
+ positionAtEdge(child, params, myWidth);
}
}
return rules[ALIGN_PARENT_END] != 0;
}
+ private void positionAtEdge(View child, LayoutParams params, int myWidth) {
+ if (isLayoutRtl()) {
+ params.mRight = myWidth - mPaddingRight - params.rightMargin;
+ params.mLeft = params.mRight - child.getMeasuredWidth();
+ } else {
+ params.mLeft = mPaddingLeft + params.leftMargin;
+ params.mRight = params.mLeft + child.getMeasuredWidth();
+ }
+ }
+
private boolean positionChildVertical(View child, LayoutParams params, int myHeight,
boolean wrapContent) {
diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java
index 6e62351..b77aa1c 100644
--- a/core/java/android/widget/RemoteViews.java
+++ b/core/java/android/widget/RemoteViews.java
@@ -2435,7 +2435,14 @@
recalculateMemoryUsage();
}
-
+ /**
+ * Returns a deep copy of the RemoteViews object. The RemoteView may not be
+ * attached to another RemoteView -- it must be the root of a hierarchy.
+ *
+ * @throws IllegalStateException if this is not the root of a RemoteView
+ * hierarchy
+ */
+ @Override
public RemoteViews clone() {
synchronized (this) {
Preconditions.checkState(mIsRoot, "RemoteView has been attached to another RemoteView. "
diff --git a/core/java/android/widget/SelectionActionModeHelper.java b/core/java/android/widget/SelectionActionModeHelper.java
index 142412a..3f4ce44 100644
--- a/core/java/android/widget/SelectionActionModeHelper.java
+++ b/core/java/android/widget/SelectionActionModeHelper.java
@@ -68,9 +68,7 @@
public void startActionModeAsync(boolean adjustSelection) {
cancelAsyncTask();
- if (isNoOpTextClassifier() || !hasSelection()) {
- // No need to make an async call for a no-op TextClassifier.
- // Do not call the TextClassifier if there is no selection.
+ if (skipTextClassification()) {
startActionMode(null);
} else {
resetTextClassificationHelper(true /* resetSelectionTag */);
@@ -88,9 +86,7 @@
public void invalidateActionModeAsync() {
cancelAsyncTask();
- if (isNoOpTextClassifier() || !hasSelection()) {
- // No need to make an async call for a no-op TextClassifier.
- // Do not call the TextClassifier if there is no selection.
+ if (skipTextClassification()) {
invalidateActionMode(null);
} else {
resetTextClassificationHelper(false /* resetSelectionTag */);
@@ -132,13 +128,16 @@
mTextClassification = null;
}
- private boolean isNoOpTextClassifier() {
- return mEditor.getTextView().getTextClassifier() == TextClassifier.NO_OP;
- }
-
- private boolean hasSelection() {
+ private boolean skipTextClassification() {
final TextView textView = mEditor.getTextView();
- return textView.getSelectionEnd() > textView.getSelectionStart();
+ // No need to make an async call for a no-op TextClassifier.
+ final boolean noOpTextClassifier = textView.getTextClassifier() == TextClassifier.NO_OP;
+ // Do not call the TextClassifier if there is no selection.
+ final boolean noSelection = textView.getSelectionEnd() == textView.getSelectionStart();
+ // Do not call the TextClassifier if this is a password field.
+ final boolean password = textView.hasPasswordTransformationMethod()
+ || TextView.isPasswordInputType(textView.getInputType());
+ return noOpTextClassifier || noSelection || password;
}
private void startActionMode(@Nullable SelectionResult result) {
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 9a92489..243e215 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -374,6 +374,8 @@
private static final int KEY_DOWN_HANDLED_BY_KEY_LISTENER = 1;
private static final int KEY_DOWN_HANDLED_BY_MOVEMENT_METHOD = 2;
+ private static final int FLOATING_TOOLBAR_SELECT_ALL_REFRESH_DELAY = 500;
+
// System wide time for last cut, copy or text changed action.
static long sLastCutCopyOrTextChangedTime;
@@ -5674,7 +5676,7 @@
return mTransformation instanceof PasswordTransformationMethod;
}
- private static boolean isPasswordInputType(int inputType) {
+ static boolean isPasswordInputType(int inputType) {
final int variation =
inputType & (EditorInfo.TYPE_MASK_CLASS | EditorInfo.TYPE_MASK_VARIATION);
return variation
@@ -10318,7 +10320,16 @@
return;
}
- setText(value.getTextValue(), mBufferType, true, 0);
+ final CharSequence autofilledValue = value.getTextValue();
+
+ // First autofill it...
+ setText(autofilledValue, mBufferType, true, 0);
+
+ // ...then move cursor to the end.
+ final CharSequence text = getText();
+ if ((text instanceof Spannable)) {
+ Selection.setSelection((Spannable) text, text.length());
+ }
}
@Override
@@ -11138,6 +11149,10 @@
}
boolean selectAllText() {
+ if (mEditor != null) {
+ // Hide the toolbar before changing the selection to avoid flickering.
+ mEditor.hideFloatingToolbar(FLOATING_TOOLBAR_SELECT_ALL_REFRESH_DELAY);
+ }
final int length = mText.length();
Selection.setSelection((Spannable) mText, 0, length);
return length > 0;
diff --git a/core/java/android/widget/TimePickerClockDelegate.java b/core/java/android/widget/TimePickerClockDelegate.java
index d3c83ee..526246b 100644
--- a/core/java/android/widget/TimePickerClockDelegate.java
+++ b/core/java/android/widget/TimePickerClockDelegate.java
@@ -26,6 +26,7 @@
import android.icu.text.DecimalFormatSymbols;
import android.os.Parcelable;
import android.text.SpannableStringBuilder;
+import android.text.TextUtils;
import android.text.format.DateFormat;
import android.text.format.DateUtils;
import android.text.style.TtsSpan;
@@ -41,6 +42,7 @@
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
+import android.view.inputmethod.InputMethodManager;
import android.widget.RadialTimePickerView.OnValueSelectedListener;
import android.widget.TextInputTimePickerView.OnValueTypedListener;
@@ -110,7 +112,11 @@
private int mCurrentHour;
private int mCurrentMinute;
private boolean mIs24Hour;
- private boolean mIsAmPmAtStart;
+
+ // The portrait layout puts AM/PM at the right by default.
+ private boolean mIsAmPmAtLeft = false;
+ // The landscape layouts put AM/PM at the bottom by default.
+ private boolean mIsAmPmAtTop = false;
// Localization data.
private boolean mHourFormatShowLeadingZero;
@@ -262,6 +268,10 @@
mRadialTimePickerModeButton.setContentDescription(
mTextInputPickerModeEnabledDescription);
updateTextInputPicker();
+ InputMethodManager imm = InputMethodManager.peekInstance();
+ if (imm != null) {
+ imm.hideSoftInputFromWindow(mDelegator.getWindowToken(), 0);
+ }
mRadialPickerModeEnabled = true;
}
}
@@ -430,34 +440,70 @@
if (mIs24Hour) {
mAmPmLayout.setVisibility(View.GONE);
} else {
- // Ensure that AM/PM layout is in the correct position.
+ // Find the location of AM/PM based on locale information.
final String dateTimePattern = DateFormat.getBestDateTimePattern(mLocale, "hm");
final boolean isAmPmAtStart = dateTimePattern.startsWith("a");
- setAmPmAtStart(isAmPmAtStart);
-
+ setAmPmStart(isAmPmAtStart);
updateAmPmLabelStates(mCurrentHour < 12 ? AM : PM);
}
}
- private void setAmPmAtStart(boolean isAmPmAtStart) {
- if (mIsAmPmAtStart != isAmPmAtStart) {
- mIsAmPmAtStart = isAmPmAtStart;
-
- final RelativeLayout.LayoutParams params =
- (RelativeLayout.LayoutParams) mAmPmLayout.getLayoutParams();
- if (params.getRule(RelativeLayout.RIGHT_OF) != 0 ||
- params.getRule(RelativeLayout.LEFT_OF) != 0) {
- if (isAmPmAtStart) {
- params.removeRule(RelativeLayout.RIGHT_OF);
- params.addRule(RelativeLayout.LEFT_OF, mHourView.getId());
- } else {
- params.removeRule(RelativeLayout.LEFT_OF);
- params.addRule(RelativeLayout.RIGHT_OF, mMinuteView.getId());
- }
+ private void setAmPmStart(boolean isAmPmAtStart) {
+ final RelativeLayout.LayoutParams params =
+ (RelativeLayout.LayoutParams) mAmPmLayout.getLayoutParams();
+ if (params.getRule(RelativeLayout.RIGHT_OF) != 0
+ || params.getRule(RelativeLayout.LEFT_OF) != 0) {
+ // Horizontal mode, with AM/PM appearing to left/right of hours and minutes.
+ final boolean isAmPmAtLeft;
+ if (TextUtils.getLayoutDirectionFromLocale(mLocale) == View.LAYOUT_DIRECTION_LTR) {
+ isAmPmAtLeft = isAmPmAtStart;
+ } else {
+ isAmPmAtLeft = !isAmPmAtStart;
+ }
+ if (mIsAmPmAtLeft == isAmPmAtLeft) {
+ // AM/PM is already at the correct location. No change needed.
+ return;
}
- mAmPmLayout.setLayoutParams(params);
+ if (isAmPmAtLeft) {
+ params.removeRule(RelativeLayout.RIGHT_OF);
+ params.addRule(RelativeLayout.LEFT_OF, mHourView.getId());
+ } else {
+ params.removeRule(RelativeLayout.LEFT_OF);
+ params.addRule(RelativeLayout.RIGHT_OF, mMinuteView.getId());
+ }
+ mIsAmPmAtLeft = isAmPmAtLeft;
+ } else if (params.getRule(RelativeLayout.BELOW) != 0
+ || params.getRule(RelativeLayout.ABOVE) != 0) {
+ // Vertical mode, with AM/PM appearing to top/bottom of hours and minutes.
+ if (mIsAmPmAtTop == isAmPmAtStart) {
+ // AM/PM is already at the correct location. No change needed.
+ return;
+ }
+
+ final int otherViewId;
+ if (isAmPmAtStart) {
+ otherViewId = params.getRule(RelativeLayout.BELOW);
+ params.removeRule(RelativeLayout.BELOW);
+ params.addRule(RelativeLayout.ABOVE, otherViewId);
+ } else {
+ otherViewId = params.getRule(RelativeLayout.ABOVE);
+ params.removeRule(RelativeLayout.ABOVE);
+ params.addRule(RelativeLayout.BELOW, otherViewId);
+ }
+
+ // Switch the top and bottom paddings on the other view.
+ final View otherView = mRadialTimePickerHeader.findViewById(otherViewId);
+ final int top = otherView.getPaddingTop();
+ final int bottom = otherView.getPaddingBottom();
+ final int left = otherView.getPaddingLeft();
+ final int right = otherView.getPaddingRight();
+ otherView.setPadding(left, bottom, right, top);
+
+ mIsAmPmAtTop = isAmPmAtStart;
}
+
+ mAmPmLayout.setLayoutParams(params);
}
/**
diff --git a/core/java/com/android/internal/app/IBatteryStats.aidl b/core/java/com/android/internal/app/IBatteryStats.aidl
index a44fd67..4275e0b 100644
--- a/core/java/com/android/internal/app/IBatteryStats.aidl
+++ b/core/java/com/android/internal/app/IBatteryStats.aidl
@@ -66,7 +66,7 @@
void noteSyncStart(String name, int uid);
void noteSyncFinish(String name, int uid);
void noteJobStart(String name, int uid);
- void noteJobFinish(String name, int uid);
+ void noteJobFinish(String name, int uid, int stopReason);
void noteStartWakelock(int uid, int pid, String name, String historyName,
int type, boolean unimportantForLogging);
diff --git a/core/java/com/android/internal/app/IMediaContainerService.aidl b/core/java/com/android/internal/app/IMediaContainerService.aidl
index 81ea191..36e4c1c6 100644
--- a/core/java/com/android/internal/app/IMediaContainerService.aidl
+++ b/core/java/com/android/internal/app/IMediaContainerService.aidl
@@ -27,9 +27,6 @@
PackageInfoLite getMinimalPackageInfo(String packagePath, int flags, String abiOverride);
ObbInfo getObbInfo(String filename);
- long calculateDirectorySize(String directory);
- /** Return file system stats: [0] is total bytes, [1] is available bytes */
- long[] getFileSystemStats(String path);
void clearDirectory(String directory);
long calculateInstalledSize(String packagePath, boolean isForwardLocked, String abiOverride);
}
diff --git a/core/java/com/android/internal/app/LocalePickerWithRegion.java b/core/java/com/android/internal/app/LocalePickerWithRegion.java
index d0719ee..3d5cd0f 100644
--- a/core/java/com/android/internal/app/LocalePickerWithRegion.java
+++ b/core/java/com/android/internal/app/LocalePickerWithRegion.java
@@ -238,7 +238,7 @@
mSearchView.setOnQueryTextListener(this);
// Restore previous search status
- if (!TextUtils.isEmpty(mPreviousSearch)) {
+ if (mPreviousSearch != null) {
searchMenuItem.expandActionView();
mSearchView.setIconified(false);
mSearchView.setActivated(true);
diff --git a/core/java/com/android/internal/app/MediaRouteControllerDialog.java b/core/java/com/android/internal/app/MediaRouteControllerDialog.java
index 635a868..61e63d1 100644
--- a/core/java/com/android/internal/app/MediaRouteControllerDialog.java
+++ b/core/java/com/android/internal/app/MediaRouteControllerDialog.java
@@ -72,6 +72,7 @@
private boolean mVolumeSliderTouched;
private View mControlView;
+ private boolean mAttachedToWindow;
public MediaRouteControllerDialog(Context context, int theme) {
super(context, theme);
@@ -215,6 +216,7 @@
@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
+ mAttachedToWindow = true;
mRouter.addCallback(0, mCallback, MediaRouter.CALLBACK_FLAG_UNFILTERED_EVENTS);
update();
@@ -223,6 +225,7 @@
@Override
public void onDetachedFromWindow() {
mRouter.removeCallback(mCallback);
+ mAttachedToWindow = false;
super.onDetachedFromWindow();
}
@@ -260,7 +263,14 @@
mCurrentIconDrawable = icon;
if (icon instanceof AnimationDrawable) {
AnimationDrawable animDrawable = (AnimationDrawable) icon;
- if (!animDrawable.isRunning()) {
+ if (!mAttachedToWindow && !mRoute.isConnecting()) {
+ // When the route is already connected before the view is attached, show the
+ // last frame of the connected animation immediately.
+ if (animDrawable.isRunning()) {
+ animDrawable.stop();
+ }
+ icon = animDrawable.getFrame(animDrawable.getNumberOfFrames() - 1);
+ } else if (!animDrawable.isRunning()) {
animDrawable.start();
}
}
diff --git a/core/java/com/android/internal/app/ResolverComparator.java b/core/java/com/android/internal/app/ResolverComparator.java
index a0f58a9..378826d 100644
--- a/core/java/com/android/internal/app/ResolverComparator.java
+++ b/core/java/com/android/internal/app/ResolverComparator.java
@@ -30,6 +30,7 @@
import android.content.pm.ResolveInfo;
import android.content.SharedPreferences;
import android.content.ServiceConnection;
+import android.metrics.LogMaker;
import android.os.Environment;
import android.os.Handler;
import android.os.IBinder;
@@ -46,6 +47,8 @@
import android.util.ArrayMap;
import android.util.Log;
import com.android.internal.app.ResolverActivity.ResolvedComponentInfo;
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import java.io.File;
import java.lang.InterruptedException;
@@ -99,6 +102,8 @@
private String mContentType;
private String[] mAnnotations;
private String mAction;
+ private ComponentName mResolvedRankerName;
+ private ComponentName mRankerServiceName;
private IResolverRankerService mRanker;
private ResolverRankerServiceConnection mConnection;
private AfterCompute mAfterCompute;
@@ -119,9 +124,17 @@
if (receivedTargets != null && mTargets != null
&& receivedTargets.size() == mTargets.size()) {
final int size = mTargets.size();
+ boolean isUpdated = false;
for (int i = 0; i < size; ++i) {
- mTargets.get(i).setSelectProbability(
- receivedTargets.get(i).getSelectProbability());
+ final float predictedProb =
+ receivedTargets.get(i).getSelectProbability();
+ if (predictedProb != mTargets.get(i).getSelectProbability()) {
+ mTargets.get(i).setSelectProbability(predictedProb);
+ isUpdated = true;
+ }
+ }
+ if (isUpdated) {
+ mRankerServiceName = mResolvedRankerName;
}
} else {
Log.e(TAG, "Sizes of sent and received ResolverTargets diff.");
@@ -170,6 +183,7 @@
mContentType = intent.getType();
getContentAnnotations(intent);
mAction = intent.getAction();
+ mRankerServiceName = new ComponentName(mContext, this.getClass());
}
// get annotations of content from intent.
@@ -361,7 +375,15 @@
try {
int selectedPos = new ArrayList<ComponentName>(mTargetsDict.keySet())
.indexOf(componentName);
- if (selectedPos > 0) {
+ if (selectedPos >= 0 && mTargets != null) {
+ final float selectedProbability = getScore(componentName);
+ int order = 0;
+ for (ResolverTarget target : mTargets) {
+ if (target.getSelectProbability() > selectedProbability) {
+ order++;
+ }
+ }
+ logMetrics(order);
mRanker.train(mTargets, selectedPos);
} else {
if (DEBUG) {
@@ -392,6 +414,19 @@
}
}
+ // records metrics for evaluation.
+ private void logMetrics(int selectedPos) {
+ if (mRankerServiceName != null) {
+ MetricsLogger metricsLogger = new MetricsLogger();
+ LogMaker log = new LogMaker(MetricsEvent.ACTION_TARGET_SELECTED);
+ log.setComponentName(mRankerServiceName);
+ int isCategoryUsed = (mAnnotations == null) ? 0 : 1;
+ log.addTaggedData(MetricsEvent.FIELD_IS_CATEGORY_USED, isCategoryUsed);
+ log.addTaggedData(MetricsEvent.FIELD_RANKED_POSITION, selectedPos);
+ metricsLogger.write(log);
+ }
+ }
+
// connect to a ranking service.
private void initRanker(Context context) {
synchronized (mLock) {
@@ -454,6 +489,7 @@
if (DEBUG) {
Log.d(TAG, "Succeeded to retrieve a ranker: " + componentName);
}
+ mResolvedRankerName = componentName;
intent.setComponent(componentName);
return intent;
}
@@ -523,6 +559,8 @@
private void reset() {
mTargetsDict.clear();
mTargets = null;
+ mRankerServiceName = new ComponentName(mContext, this.getClass());
+ mResolvedRankerName = null;
startWatchDog(WATCHDOG_TIMEOUT_MILLIS);
initRanker(mContext);
}
diff --git a/core/java/com/android/internal/app/procstats/ProcessState.java b/core/java/com/android/internal/app/procstats/ProcessState.java
index 9470668..e0a4053 100644
--- a/core/java/com/android/internal/app/procstats/ProcessState.java
+++ b/core/java/com/android/internal/app/procstats/ProcessState.java
@@ -196,7 +196,6 @@
ProcessState pnew = new ProcessState(this, mPackage, mUid, mVersion, mName, now);
pnew.mDurations.addDurations(mDurations);
pnew.mPssTable.copyFrom(mPssTable, PSS_COUNT);
- pnew.mNumExcessiveWake = mNumExcessiveWake;
pnew.mNumExcessiveCpu = mNumExcessiveCpu;
pnew.mNumCachedKill = mNumCachedKill;
pnew.mMinCachedKillPss = mMinCachedKillPss;
@@ -250,7 +249,6 @@
public void add(ProcessState other) {
mDurations.addDurations(other.mDurations);
mPssTable.mergeStats(other.mPssTable);
- mNumExcessiveWake += other.mNumExcessiveWake;
mNumExcessiveCpu += other.mNumExcessiveCpu;
if (other.mNumCachedKill > 0) {
addCachedKill(other.mNumCachedKill, other.mMinCachedKillPss,
@@ -264,7 +262,6 @@
mStartTime = now;
mLastPssState = STATE_NOTHING;
mLastPssTime = 0;
- mNumExcessiveWake = 0;
mNumExcessiveCpu = 0;
mNumCachedKill = 0;
mMinCachedKillPss = mAvgCachedKillPss = mMaxCachedKillPss = 0;
@@ -286,7 +283,7 @@
out.writeInt(mMultiPackage ? 1 : 0);
mDurations.writeToParcel(out);
mPssTable.writeToParcel(out);
- out.writeInt(mNumExcessiveWake);
+ out.writeInt(0); // was mNumExcessiveWake
out.writeInt(mNumExcessiveCpu);
out.writeInt(mNumCachedKill);
if (mNumCachedKill > 0) {
@@ -309,7 +306,7 @@
if (!mPssTable.readFromParcel(in)) {
return false;
}
- mNumExcessiveWake = in.readInt();
+ in.readInt(); // was mNumExcessiveWake
mNumExcessiveCpu = in.readInt();
mNumCachedKill = in.readInt();
if (mNumCachedKill > 0) {
@@ -493,18 +490,6 @@
}
}
- public void reportExcessiveWake(ArrayMap<String, ProcessStateHolder> pkgList) {
- ensureNotDead();
- mCommonProcess.mNumExcessiveWake++;
- if (!mCommonProcess.mMultiPackage) {
- return;
- }
-
- for (int ip=pkgList.size()-1; ip>=0; ip--) {
- pullFixedProc(pkgList, ip).mNumExcessiveWake++;
- }
- }
-
public void reportExcessiveCpu(ArrayMap<String, ProcessStateHolder> pkgList) {
ensureNotDead();
mCommonProcess.mNumExcessiveCpu++;
@@ -895,10 +880,6 @@
}
}
}
- if (mNumExcessiveWake != 0) {
- pw.print(prefix); pw.print("Killed for excessive wake locks: ");
- pw.print(mNumExcessiveWake); pw.println(" times");
- }
if (mNumExcessiveCpu != 0) {
pw.print(prefix); pw.print("Killed for excessive CPU use: ");
pw.print(mNumExcessiveCpu); pw.println(" times");
@@ -1072,7 +1053,7 @@
dumpAllPssCheckin(pw);
pw.println();
}
- if (mNumExcessiveWake > 0 || mNumExcessiveCpu > 0 || mNumCachedKill > 0) {
+ if (mNumExcessiveCpu > 0 || mNumCachedKill > 0) {
pw.print("pkgkills,");
pw.print(pkgName);
pw.print(",");
@@ -1082,7 +1063,7 @@
pw.print(",");
pw.print(DumpUtils.collapseString(pkgName, itemName));
pw.print(",");
- pw.print(mNumExcessiveWake);
+ pw.print("0"); // was mNumExcessiveWake
pw.print(",");
pw.print(mNumExcessiveCpu);
pw.print(",");
@@ -1114,13 +1095,13 @@
dumpAllPssCheckin(pw);
pw.println();
}
- if (mNumExcessiveWake > 0 || mNumExcessiveCpu > 0 || mNumCachedKill > 0) {
+ if (mNumExcessiveCpu > 0 || mNumCachedKill > 0) {
pw.print("kills,");
pw.print(procName);
pw.print(",");
pw.print(uid);
pw.print(",");
- pw.print(mNumExcessiveWake);
+ pw.print("0"); // was mNumExcessiveWake
pw.print(",");
pw.print(mNumExcessiveCpu);
pw.print(",");
diff --git a/core/java/com/android/internal/app/procstats/SparseMappingTable.java b/core/java/com/android/internal/app/procstats/SparseMappingTable.java
index f941836..956ce99 100644
--- a/core/java/com/android/internal/app/procstats/SparseMappingTable.java
+++ b/core/java/com/android/internal/app/procstats/SparseMappingTable.java
@@ -646,7 +646,7 @@
*/
private static void logOrThrow(String message, Throwable th) {
Slog.e(TAG, message, th);
- if (Build.TYPE.equals("eng")) {
+ if (Build.IS_ENG) {
throw new RuntimeException(message, th);
}
}
diff --git a/core/java/com/android/internal/backup/LocalTransport.java b/core/java/com/android/internal/backup/LocalTransport.java
index f76b702..543bd0c 100644
--- a/core/java/com/android/internal/backup/LocalTransport.java
+++ b/core/java/com/android/internal/backup/LocalTransport.java
@@ -30,6 +30,7 @@
import android.system.ErrnoException;
import android.system.Os;
import android.system.StructStat;
+import android.util.ArrayMap;
import android.util.Log;
import com.android.org.bouncycastle.util.encoders.Base64;
@@ -44,7 +45,6 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
-import static android.system.OsConstants.SEEK_CUR;
/**
* Backup transport for stashing stuff into a known location on disk, and
@@ -70,9 +70,8 @@
// The currently-active restore set always has the same (nonzero!) token
private static final long CURRENT_SET_TOKEN = 1;
- // Full backup size quota is set to reasonable value.
+ // Size quotas at reasonable values, similar to the current cloud-storage limits
private static final long FULL_BACKUP_SIZE_QUOTA = 25 * 1024 * 1024;
-
private static final long KEY_VALUE_BACKUP_SIZE_QUOTA = 5 * 1024 * 1024;
private Context mContext;
@@ -157,6 +156,17 @@
return TRANSPORT_OK;
}
+ // Encapsulation of a single k/v element change
+ private class KVOperation {
+ final String key; // Element filename, not the raw key, for efficiency
+ final byte[] value; // null when this is a deletion operation
+
+ KVOperation(String k, byte[] v) {
+ key = k;
+ value = v;
+ }
+ }
+
@Override
public int performBackup(PackageInfo packageInfo, ParcelFileDescriptor data) {
if (DEBUG) {
@@ -175,62 +185,135 @@
// Each 'record' in the restore set is kept in its own file, named by
// the record key. Wind through the data file, extracting individual
- // record operations and building a set of all the updates to apply
+ // record operations and building a list of all the updates to apply
// in this update.
- BackupDataInput changeSet = new BackupDataInput(data.getFileDescriptor());
+ final ArrayList<KVOperation> changeOps;
try {
- int bufSize = 512;
- byte[] buf = new byte[bufSize];
- while (changeSet.readNextHeader()) {
- String key = changeSet.getKey();
- String base64Key = new String(Base64.encode(key.getBytes()));
- File entityFile = new File(packageDir, base64Key);
-
- int dataSize = changeSet.getDataSize();
-
- if (DEBUG) Log.v(TAG, "Got change set key=" + key + " size=" + dataSize
- + " key64=" + base64Key);
-
- if (dataSize >= 0) {
- if (entityFile.exists()) {
- entityFile.delete();
- }
- FileOutputStream entity = new FileOutputStream(entityFile);
-
- if (dataSize > bufSize) {
- bufSize = dataSize;
- buf = new byte[bufSize];
- }
- changeSet.readEntityData(buf, 0, dataSize);
- if (DEBUG) {
- try {
- long cur = Os.lseek(data.getFileDescriptor(), 0, SEEK_CUR);
- Log.v(TAG, " read entity data; new pos=" + cur);
- }
- catch (ErrnoException e) {
- Log.w(TAG, "Unable to stat input file in performBackup() on "
- + packageInfo.packageName);
- }
- }
-
- try {
- entity.write(buf, 0, dataSize);
- } catch (IOException e) {
- Log.e(TAG, "Unable to update key file " + entityFile.getAbsolutePath());
- return TRANSPORT_ERROR;
- } finally {
- entity.close();
- }
- } else {
- entityFile.delete();
- }
- }
- return TRANSPORT_OK;
+ changeOps = parseBackupStream(data);
} catch (IOException e) {
// oops, something went wrong. abort the operation and return error.
- Log.v(TAG, "Exception reading backup input:", e);
+ Log.v(TAG, "Exception reading backup input", e);
return TRANSPORT_ERROR;
}
+
+ // Okay, now we've parsed out the delta's individual operations. We need to measure
+ // the effect against what we already have in the datastore to detect quota overrun.
+ // So, we first need to tally up the current in-datastore size per key.
+ final ArrayMap<String, Integer> datastore = new ArrayMap<>();
+ int totalSize = parseKeySizes(packageDir, datastore);
+
+ // ... and now figure out the datastore size that will result from applying the
+ // sequence of delta operations
+ if (DEBUG) {
+ if (changeOps.size() > 0) {
+ Log.v(TAG, "Calculating delta size impact");
+ } else {
+ Log.v(TAG, "No operations in backup stream, so no size change");
+ }
+ }
+ int updatedSize = totalSize;
+ for (KVOperation op : changeOps) {
+ // Deduct the size of the key we're about to replace, if any
+ final Integer curSize = datastore.get(op.key);
+ if (curSize != null) {
+ updatedSize -= curSize.intValue();
+ if (DEBUG && op.value == null) {
+ Log.v(TAG, " delete " + op.key + ", updated total " + updatedSize);
+ }
+ }
+
+ // And add back the size of the value we're about to store, if any
+ if (op.value != null) {
+ updatedSize += op.value.length;
+ if (DEBUG) {
+ Log.v(TAG, ((curSize == null) ? " new " : " replace ")
+ + op.key + ", updated total " + updatedSize);
+ }
+ }
+ }
+
+ // If our final size is over quota, report the failure
+ if (updatedSize > KEY_VALUE_BACKUP_SIZE_QUOTA) {
+ if (DEBUG) {
+ Log.i(TAG, "New datastore size " + updatedSize
+ + " exceeds quota " + KEY_VALUE_BACKUP_SIZE_QUOTA);
+ }
+ return TRANSPORT_QUOTA_EXCEEDED;
+ }
+
+ // No problem with storage size, so go ahead and apply the delta operations
+ // (in the order that the app provided them)
+ for (KVOperation op : changeOps) {
+ File element = new File(packageDir, op.key);
+
+ // this is either a deletion or a rewrite-from-zero, so we can just remove
+ // the existing file and proceed in either case.
+ element.delete();
+
+ // if this wasn't a deletion, put the new data in place
+ if (op.value != null) {
+ try (FileOutputStream out = new FileOutputStream(element)) {
+ out.write(op.value, 0, op.value.length);
+ } catch (IOException e) {
+ Log.e(TAG, "Unable to update key file " + element);
+ return TRANSPORT_ERROR;
+ }
+ }
+ }
+ return TRANSPORT_OK;
+ }
+
+ // Parses a backup stream into individual key/value operations
+ private ArrayList<KVOperation> parseBackupStream(ParcelFileDescriptor data)
+ throws IOException {
+ ArrayList<KVOperation> changeOps = new ArrayList<>();
+ BackupDataInput changeSet = new BackupDataInput(data.getFileDescriptor());
+ while (changeSet.readNextHeader()) {
+ String key = changeSet.getKey();
+ String base64Key = new String(Base64.encode(key.getBytes()));
+ int dataSize = changeSet.getDataSize();
+ if (DEBUG) {
+ Log.v(TAG, " Delta operation key " + key + " size " + dataSize
+ + " key64 " + base64Key);
+ }
+
+ byte[] buf = (dataSize >= 0) ? new byte[dataSize] : null;
+ if (dataSize >= 0) {
+ changeSet.readEntityData(buf, 0, dataSize);
+ }
+ changeOps.add(new KVOperation(base64Key, buf));
+ }
+ return changeOps;
+ }
+
+ // Reads the given datastore directory, building a table of the value size of each
+ // keyed element, and returning the summed total.
+ private int parseKeySizes(File packageDir, ArrayMap<String, Integer> datastore) {
+ int totalSize = 0;
+ final String[] elements = packageDir.list();
+ if (elements != null) {
+ if (DEBUG) {
+ Log.v(TAG, "Existing datastore contents:");
+ }
+ for (String file : elements) {
+ File element = new File(packageDir, file);
+ String key = file; // filename
+ int size = (int) element.length();
+ totalSize += size;
+ if (DEBUG) {
+ Log.v(TAG, " key " + key + " size " + size);
+ }
+ datastore.put(key, size);
+ }
+ if (DEBUG) {
+ Log.v(TAG, " TOTAL: " + totalSize);
+ }
+ } else {
+ if (DEBUG) {
+ Log.v(TAG, "No existing data for this package");
+ }
+ }
+ return totalSize;
}
// Deletes the contents but not the given directory
diff --git a/core/java/com/android/internal/content/FileSystemProvider.java b/core/java/com/android/internal/content/FileSystemProvider.java
index ebea1a4..17a598a 100644
--- a/core/java/com/android/internal/content/FileSystemProvider.java
+++ b/core/java/com/android/internal/content/FileSystemProvider.java
@@ -28,6 +28,8 @@
import android.graphics.Point;
import android.net.Uri;
import android.os.Binder;
+import android.os.Build;
+import android.os.Bundle;
import android.os.CancellationSignal;
import android.os.FileObserver;
import android.os.FileUtils;
@@ -37,6 +39,7 @@
import android.provider.DocumentsContract.Document;
import android.provider.DocumentsProvider;
import android.provider.MediaStore;
+import android.provider.MetadataReader;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.Log;
@@ -44,7 +47,10 @@
import com.android.internal.annotations.GuardedBy;
+import libcore.io.IoUtils;
+
import java.io.File;
+import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.LinkedList;
@@ -68,6 +74,14 @@
private Handler mHandler;
+ private static final String MIMETYPE_PDF = "application/pdf";
+
+ private static final String MIMETYPE_JPEG = "image/jpeg";
+
+ private static final String MIMETYPE_JPG = "image/jpg";
+
+
+
protected abstract File getFileForDocId(String docId, boolean visible)
throws FileNotFoundException;
@@ -99,6 +113,30 @@
}
}
+ @Override
+ public @Nullable Bundle getDocumentMetadata(String documentId, @Nullable String[] tags)
+ throws FileNotFoundException {
+ File file = getFileForDocId(documentId);
+ if (!(file.exists() && file.isFile() && file.canRead())) {
+ return Bundle.EMPTY;
+ }
+ String filePath = file.getAbsolutePath();
+ Bundle metadata = new Bundle();
+ if (getTypeForFile(file).equals(MIMETYPE_JPEG)
+ || getTypeForFile(file).equals(MIMETYPE_JPG)) {
+ FileInputStream stream = new FileInputStream(filePath);
+ try {
+ MetadataReader.getMetadata(metadata, stream, getTypeForFile(file), tags);
+ return metadata;
+ } catch (IOException e) {
+ Log.e(TAG, "An error occurred retrieving the metadata", e);
+ } finally {
+ IoUtils.closeQuietly(stream);
+ }
+ }
+ return null;
+ }
+
protected final List<String> findDocumentPath(File parent, File doc)
throws FileNotFoundException {
@@ -387,6 +425,13 @@
String documentId, Point sizeHint, CancellationSignal signal)
throws FileNotFoundException {
final File file = getFileForDocId(documentId);
+ if (getTypeForFile(file).equals(MIMETYPE_PDF)) {
+ try {
+ return PdfUtils.openPdfThumbnail(file, sizeHint);
+ } catch (Exception e) {
+ Log.v(TAG, "Could not load PDF's thumbnail", e);
+ }
+ }
return DocumentsContract.openImageThumbnail(file);
}
@@ -416,7 +461,10 @@
final String mimeType = getTypeForFile(file);
final String displayName = file.getName();
- if (mimeType.startsWith("image/")) {
+ // As of right now, we aren't sure on the performance affect of loading all PDF Thumbnails
+ // Until a solution is found, it will be behind a debuggable flag.
+ if (mimeType.startsWith("image/")
+ || (mimeType.equals(MIMETYPE_PDF) && Build.IS_DEBUGGABLE)) {
flags |= Document.FLAG_SUPPORTS_THUMBNAIL;
}
diff --git a/core/java/com/android/internal/content/PackageHelper.java b/core/java/com/android/internal/content/PackageHelper.java
index 9c361b3..e923223 100644
--- a/core/java/com/android/internal/content/PackageHelper.java
+++ b/core/java/com/android/internal/content/PackageHelper.java
@@ -16,11 +16,14 @@
package com.android.internal.content;
+import static android.net.TrafficStats.MB_IN_BYTES;
+import static android.os.storage.VolumeInfo.ID_PRIVATE_INTERNAL;
+
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
import android.content.pm.PackageInstaller.SessionParams;
+import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.PackageParser.PackageLite;
import android.os.Environment;
@@ -39,21 +42,19 @@
import com.android.internal.annotations.VisibleForTesting;
+import libcore.io.IoUtils;
+
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collections;
import java.util.Objects;
+import java.util.UUID;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
-import libcore.io.IoUtils;
-
-import static android.net.TrafficStats.MB_IN_BYTES;
-import static android.os.storage.VolumeInfo.ID_PRIVATE_INTERNAL;
-
/**
* Constants used internally between the PackageManager
* and media container service transports.
@@ -358,7 +359,7 @@
public boolean fitsOnInternalStorage(Context context, SessionParams params)
throws IOException {
StorageManager storage = getStorageManager(context);
- File target = getDataDirectory();
+ final UUID target = storage.getUuidForPath(getDataDirectory());
return (params.sizeBytes <= storage.getAllocatableBytes(target,
translateAllocateFlags(params.installFlags)));
}
@@ -466,7 +467,8 @@
boolean isInternalStorage = ID_PRIVATE_INTERNAL.equals(vol.id);
if (vol.type == VolumeInfo.TYPE_PRIVATE && vol.isMountedWritable()
&& (!isInternalStorage || allow3rdPartyOnInternal)) {
- final long availBytes = storageManager.getAllocatableBytes(new File(vol.path),
+ final UUID target = storageManager.getUuidForPath(new File(vol.path));
+ final long availBytes = storageManager.getAllocatableBytes(target,
translateAllocateFlags(params.installFlags));
if (availBytes >= params.sizeBytes) {
allCandidates.add(vol.fsUuid);
@@ -523,7 +525,7 @@
public static boolean fitsOnInternal(Context context, SessionParams params) throws IOException {
final StorageManager storage = context.getSystemService(StorageManager.class);
- final File target = Environment.getDataDirectory();
+ final UUID target = storage.getUuidForPath(Environment.getDataDirectory());
return (params.sizeBytes <= storage.getAllocatableBytes(target,
translateAllocateFlags(params.installFlags)));
}
diff --git a/core/java/com/android/internal/content/PdfUtils.java b/core/java/com/android/internal/content/PdfUtils.java
new file mode 100644
index 0000000..1716d42
--- /dev/null
+++ b/core/java/com/android/internal/content/PdfUtils.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.content;
+
+import android.annotation.Nullable;
+import android.content.res.AssetFileDescriptor;
+import android.graphics.Bitmap;
+import android.graphics.Point;
+import android.graphics.Rect;
+import android.graphics.pdf.PdfRenderer;
+import android.os.AsyncTask;
+import android.os.ParcelFileDescriptor;
+
+import libcore.io.IoUtils;
+import libcore.io.Streams;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+/**
+ * Utils class for extracting PDF Thumbnails
+ */
+public final class PdfUtils {
+
+ private PdfUtils() {
+ }
+
+ /**
+ * Returns the front page of the pdf as a thumbnail
+ * @param file Given PDF File
+ * @param size Cropping of the front page.
+ * @return AssetFileDescriptor containing the thumbnail as a bitmap.
+ * @throws IOException if the file isn't a pdf or if the file doesn't exist.
+ */
+ public static @Nullable AssetFileDescriptor openPdfThumbnail(File file, Point size)
+ throws IOException {
+ // Create the bitmap of the PDF's first page
+ ParcelFileDescriptor pdfDescriptor =
+ ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
+ PdfRenderer renderer = new PdfRenderer(pdfDescriptor);
+ PdfRenderer.Page frontPage = renderer.openPage(0);
+ Bitmap thumbnail = Bitmap.createBitmap(size.x, size.y,
+ Bitmap.Config.ARGB_8888);
+ frontPage.render(thumbnail, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
+
+ // Create an AssetFileDescriptor that contains the Bitmap's information
+ final ByteArrayOutputStream out = new ByteArrayOutputStream();
+ // Quality is an integer that determines how much compression is used.
+ // However, this integer is ignored when using the PNG format
+ int quality = 100;
+ // The use of Bitmap.CompressFormat.JPEG leads to a black PDF background on the thumbnail
+ thumbnail.compress(Bitmap.CompressFormat.PNG, quality, out);
+
+ final ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
+
+ final ParcelFileDescriptor[] fds = ParcelFileDescriptor.createReliablePipe();
+ new AsyncTask<Object, Object, Object>() {
+ @Override
+ protected Object doInBackground(Object... params) {
+ final FileOutputStream fos = new FileOutputStream(fds[1].getFileDescriptor());
+ try {
+ Streams.copy(in, fos);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ IoUtils.closeQuietly(fds[1]);
+ try {
+ pdfDescriptor.close();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ return null;
+ }
+ }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+ pdfDescriptor.close();
+ return new AssetFileDescriptor(fds[0], 0, AssetFileDescriptor.UNKNOWN_LENGTH);
+ }
+
+}
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index 30875a8..3599e64 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -42,7 +42,7 @@
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemClock;
-import android.os.SystemProperties;
+import android.os.UserHandle;
import android.os.WorkSource;
import android.telephony.DataConnectionRealTimeInfo;
import android.telephony.ModemActivityInfo;
@@ -75,7 +75,7 @@
import com.android.internal.util.FastXmlSerializer;
import com.android.internal.util.JournaledFile;
import com.android.internal.util.XmlUtils;
-import com.android.server.NetworkManagementSocketTagger;
+
import libcore.util.EmptyArray;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
@@ -95,6 +95,7 @@
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
+import java.util.concurrent.Future;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantLock;
@@ -118,18 +119,37 @@
private static final int MAGIC = 0xBA757475; // 'BATSTATS'
// Current on-disk Parcel version
- private static final int VERSION = 159 + (USE_OLD_HISTORY ? 1000 : 0);
+ private static final int VERSION = 162 + (USE_OLD_HISTORY ? 1000 : 0);
// Maximum number of items we will record in the history.
- private static final int MAX_HISTORY_ITEMS = 2000;
+ private static final int MAX_HISTORY_ITEMS;
// No, really, THIS is the maximum number of items we will record in the history.
- private static final int MAX_MAX_HISTORY_ITEMS = 3000;
+ private static final int MAX_MAX_HISTORY_ITEMS;
// The maximum number of names wakelocks we will keep track of
// per uid; once the limit is reached, we batch the remaining wakelocks
// in to one common name.
- private static final int MAX_WAKELOCKS_PER_UID = 100;
+ private static final int MAX_WAKELOCKS_PER_UID;
+
+ static final int MAX_HISTORY_BUFFER; // 256KB
+ static final int MAX_MAX_HISTORY_BUFFER; // 320KB
+
+ static {
+ if (ActivityManager.isLowRamDeviceStatic()) {
+ MAX_HISTORY_ITEMS = 800;
+ MAX_MAX_HISTORY_ITEMS = 1200;
+ MAX_WAKELOCKS_PER_UID = 40;
+ MAX_HISTORY_BUFFER = 96*1024; // 96KB
+ MAX_MAX_HISTORY_BUFFER = 128*1024; // 128KB
+ } else {
+ MAX_HISTORY_ITEMS = 2000;
+ MAX_MAX_HISTORY_ITEMS = 3000;
+ MAX_WAKELOCKS_PER_UID = 100;
+ MAX_HISTORY_BUFFER = 256*1024; // 256KB
+ MAX_MAX_HISTORY_BUFFER = 320*1024; // 256KB
+ }
+ }
// Number of transmit power states the Wifi controller can be in.
private static final int NUM_WIFI_TX_LEVELS = 1;
@@ -174,6 +194,17 @@
public String getSubsystemLowPowerStats();
}
+ public static abstract class UserInfoProvider {
+ private int[] userIds;
+ protected abstract @Nullable int[] getUserIds();
+ private final void refreshUserIds() {
+ userIds = getUserIds();
+ }
+ private final boolean exists(int userId) {
+ return userIds != null ? ArrayUtils.contains(userIds, userId) : true;
+ }
+ }
+
private final PlatformIdleStateCallback mPlatformIdleStateCallback;
final class MyHandler extends Handler {
@@ -236,12 +267,13 @@
int UPDATE_BT = 0x08;
int UPDATE_ALL = UPDATE_CPU | UPDATE_WIFI | UPDATE_RADIO | UPDATE_BT;
- void scheduleSync(String reason, int flags);
- void scheduleCpuSyncDueToRemovedUid(int uid);
+ Future<?> scheduleSync(String reason, int flags);
+ Future<?> scheduleCpuSyncDueToRemovedUid(int uid);
}
public final MyHandler mHandler;
- private final ExternalStatsSync mExternalSync;
+ private ExternalStatsSync mExternalSync = null;
+ private UserInfoProvider mUserInfoProvider = null;
private BatteryCallback mCallback;
@@ -299,8 +331,6 @@
boolean mRecordingHistory = false;
int mNumHistoryItems;
- static final int MAX_HISTORY_BUFFER = 256*1024; // 256KB
- static final int MAX_MAX_HISTORY_BUFFER = 320*1024; // 320KB
final Parcel mHistoryBuffer = Parcel.obtain();
final HistoryItem mHistoryLastWritten = new HistoryItem();
final HistoryItem mHistoryLastLastWritten = new HistoryItem();
@@ -630,8 +660,8 @@
mCheckinFile = null;
mDailyFile = null;
mHandler = null;
- mExternalSync = null;
mPlatformIdleStateCallback = null;
+ mUserInfoProvider = null;
clearHistoryLocked();
}
@@ -3467,26 +3497,31 @@
public void updateTimeBasesLocked(boolean unplugged, boolean screenOff, long uptime,
long realtime) {
- boolean batteryStatusChanged = mOnBatteryTimeBase.setRunning(unplugged, uptime, realtime);
+ final boolean updateOnBatteryTimeBase = unplugged != mOnBatteryTimeBase.isRunning();
+ final boolean updateOnBatteryScreenOffTimeBase =
+ (unplugged && screenOff) != mOnBatteryScreenOffTimeBase.isRunning();
- if (batteryStatusChanged) {
- for (int i = 0; i < mUidStats.size(); i++) {
- mUidStats.valueAt(i).updateOnBatteryBgTimeBase(uptime, realtime);
+ if (updateOnBatteryScreenOffTimeBase || updateOnBatteryTimeBase) {
+ if (updateOnBatteryScreenOffTimeBase) {
+ updateKernelWakelocksLocked();
+ updateBatteryPropertiesLocked();
}
- }
-
- boolean unpluggedScreenOff = unplugged && screenOff;
- if (unpluggedScreenOff != mOnBatteryScreenOffTimeBase.isRunning()) {
- updateKernelWakelocksLocked();
- updateBatteryPropertiesLocked();
if (DEBUG_ENERGY_CPU) {
- Slog.d(TAG, "Updating cpu time because screen is now " +
- (unpluggedScreenOff ? "off" : "on"));
+ Slog.d(TAG, "Updating cpu time because screen is now " + (screenOff ? "off" : "on")
+ + " and battery is " + (unplugged ? "on" : "off"));
}
updateCpuTimeLocked(true /* updateCpuFreqData */);
- mOnBatteryScreenOffTimeBase.setRunning(unpluggedScreenOff, uptime, realtime);
- for (int i = 0; i < mUidStats.size(); i++) {
- mUidStats.valueAt(i).updateOnBatteryScreenOffBgTimeBase(uptime, realtime);
+
+ mOnBatteryTimeBase.setRunning(unplugged, uptime, realtime);
+ mOnBatteryScreenOffTimeBase.setRunning(unplugged && screenOff, uptime, realtime);
+ for (int i = mUidStats.size() - 1; i >= 0; --i) {
+ final Uid u = mUidStats.valueAt(i);
+ if (updateOnBatteryTimeBase) {
+ u.updateOnBatteryBgTimeBase(uptime, realtime);
+ }
+ if (updateOnBatteryScreenOffTimeBase) {
+ u.updateOnBatteryScreenOffBgTimeBase(uptime, realtime);
+ }
}
}
}
@@ -3647,11 +3682,11 @@
addHistoryEventLocked(elapsedRealtime, uptime, HistoryItem.EVENT_JOB_START, name, uid);
}
- public void noteJobFinishLocked(String name, int uid) {
+ public void noteJobFinishLocked(String name, int uid, int stopReason) {
uid = mapUid(uid);
final long elapsedRealtime = mClocks.elapsedRealtime();
final long uptime = mClocks.uptimeMillis();
- getUidStatsLocked(uid).noteStopJobLocked(name, elapsedRealtime);
+ getUidStatsLocked(uid).noteStopJobLocked(name, elapsedRealtime, stopReason);
if (!mActiveEvents.updateState(HistoryItem.EVENT_JOB_FINISH, name, uid, 0)) {
return;
}
@@ -3970,14 +4005,6 @@
return 0;
}
- public void reportExcessiveWakeLocked(int uid, String proc, long overTime, long usedTime) {
- uid = mapUid(uid);
- Uid u = mUidStats.get(uid);
- if (u != null) {
- u.reportExcessiveWakeLocked(proc, overTime, usedTime);
- }
- }
-
public void reportExcessiveCpuLocked(int uid, String proc, long overTime, long usedTime) {
uid = mapUid(uid);
Uid u = mUidStats.get(uid);
@@ -5615,6 +5642,7 @@
StopwatchTimer mFlashlightTurnedOnTimer;
StopwatchTimer mCameraTurnedOnTimer;
StopwatchTimer mForegroundActivityTimer;
+ StopwatchTimer mForegroundServiceTimer;
/** Total time spent by the uid holding any partial wakelocks. */
DualTimer mAggregatedPartialWakelockTimer;
DualTimer mBluetoothScanTimer;
@@ -5625,6 +5653,8 @@
int mProcessState = ActivityManager.PROCESS_STATE_NONEXISTENT;
StopwatchTimer[] mProcessStateTimer;
+ boolean mInForegroundService = false;
+
BatchTimer mVibratorOnTimer;
Counter[] mUserActivityCounters;
@@ -5693,6 +5723,11 @@
final OverflowArrayMap<DualTimer> mJobStats;
/**
+ * Count of the jobs that have completed and the reasons why they completed.
+ */
+ final ArrayMap<String, SparseIntArray> mJobCompletions = new ArrayMap<>();
+
+ /**
* The statistics we have collected for this uid's sensor activations.
*/
final SparseArray<Sensor> mSensorStats = new SparseArray<>();
@@ -5814,6 +5849,11 @@
}
@Override
+ public ArrayMap<String, SparseIntArray> getJobCompletionStats() {
+ return mJobCompletions;
+ }
+
+ @Override
public SparseArray<? extends BatteryStats.Uid.Sensor> getSensorStats() {
return mSensorStats;
}
@@ -6087,6 +6127,14 @@
return mForegroundActivityTimer;
}
+ public StopwatchTimer createForegroundServiceTimerLocked() {
+ if (mForegroundServiceTimer == null) {
+ mForegroundServiceTimer = new StopwatchTimer(mBsi.mClocks, Uid.this,
+ FOREGROUND_SERVICE, null, mBsi.mOnBatteryTimeBase);
+ }
+ return mForegroundServiceTimer;
+ }
+
public DualTimer createAggregatedPartialWakelockTimerLocked() {
if (mAggregatedPartialWakelockTimer == null) {
mAggregatedPartialWakelockTimer = new DualTimer(mBsi.mClocks, this,
@@ -6172,6 +6220,16 @@
}
}
+ public void noteForegroundServiceResumedLocked(long elapsedRealtimeMs) {
+ createForegroundServiceTimerLocked().startRunningLocked(elapsedRealtimeMs);
+ }
+
+ public void noteForegroundServicePausedLocked(long elapsedRealtimeMs) {
+ if (mForegroundServiceTimer != null) {
+ mForegroundServiceTimer.stopRunningLocked(elapsedRealtimeMs);
+ }
+ }
+
public BatchTimer createVibratorOnTimerLocked() {
if (mVibratorOnTimer == null) {
mVibratorOnTimer = new BatchTimer(mBsi.mClocks, Uid.this, VIBRATOR_ON,
@@ -6300,6 +6358,11 @@
}
@Override
+ public Timer getForegroundServiceTimer() {
+ return mForegroundServiceTimer;
+ }
+
+ @Override
public Timer getBluetoothScanTimer() {
return mBluetoothScanTimer;
}
@@ -6586,6 +6649,7 @@
active |= !resetTimerIfNotNull(mFlashlightTurnedOnTimer, false);
active |= !resetTimerIfNotNull(mCameraTurnedOnTimer, false);
active |= !resetTimerIfNotNull(mForegroundActivityTimer, false);
+ active |= !resetTimerIfNotNull(mForegroundServiceTimer, false);
active |= !resetTimerIfNotNull(mAggregatedPartialWakelockTimer, false);
active |= !resetTimerIfNotNull(mBluetoothScanTimer, false);
active |= !resetTimerIfNotNull(mBluetoothUnoptimizedScanTimer, false);
@@ -6697,6 +6761,7 @@
}
}
mJobStats.cleanup();
+ mJobCompletions.clear();
for (int ise=mSensorStats.size()-1; ise>=0; ise--) {
Sensor s = mSensorStats.valueAt(ise);
if (s.reset()) {
@@ -6779,6 +6844,10 @@
mForegroundActivityTimer.detach();
mForegroundActivityTimer = null;
}
+ if (mForegroundServiceTimer != null) {
+ mForegroundServiceTimer.detach();
+ mForegroundServiceTimer = null;
+ }
if (mAggregatedPartialWakelockTimer != null) {
mAggregatedPartialWakelockTimer.detach();
mAggregatedPartialWakelockTimer = null;
@@ -6854,6 +6923,21 @@
return !active;
}
+ void writeJobCompletionsToParcelLocked(Parcel out) {
+ int NJC = mJobCompletions.size();
+ out.writeInt(NJC);
+ for (int ijc=0; ijc<NJC; ijc++) {
+ out.writeString(mJobCompletions.keyAt(ijc));
+ SparseIntArray types = mJobCompletions.valueAt(ijc);
+ int NT = types.size();
+ out.writeInt(NT);
+ for (int it=0; it<NT; it++) {
+ out.writeInt(types.keyAt(it));
+ out.writeInt(types.valueAt(it));
+ }
+ }
+ }
+
void writeToParcelLocked(Parcel out, long uptimeUs, long elapsedRealtimeUs) {
mOnBatteryBackgroundTimeBase.writeToParcel(out, uptimeUs, elapsedRealtimeUs);
mOnBatteryScreenOffBackgroundTimeBase.writeToParcel(out, uptimeUs, elapsedRealtimeUs);
@@ -6885,6 +6969,8 @@
Timer.writeTimerToParcel(out, timer, elapsedRealtimeUs);
}
+ writeJobCompletionsToParcelLocked(out);
+
int NSE = mSensorStats.size();
out.writeInt(NSE);
for (int ise=0; ise<NSE; ise++) {
@@ -6971,6 +7057,12 @@
} else {
out.writeInt(0);
}
+ if (mForegroundServiceTimer != null) {
+ out.writeInt(1);
+ mForegroundServiceTimer.writeToParcel(out, elapsedRealtimeUs);
+ } else {
+ out.writeInt(0);
+ }
if (mAggregatedPartialWakelockTimer != null) {
out.writeInt(1);
mAggregatedPartialWakelockTimer.writeToParcel(out, elapsedRealtimeUs);
@@ -7100,6 +7192,24 @@
}
}
+ void readJobCompletionsFromParcelLocked(Parcel in) {
+ int numJobCompletions = in.readInt();
+ mJobCompletions.clear();
+ for (int j = 0; j < numJobCompletions; j++) {
+ String jobName = in.readString();
+ int numTypes = in.readInt();
+ if (numTypes > 0) {
+ SparseIntArray types = new SparseIntArray();
+ for (int k = 0; k < numTypes; k++) {
+ int type = in.readInt();
+ int count = in.readInt();
+ types.put(type, count);
+ }
+ mJobCompletions.put(jobName, types);
+ }
+ }
+ }
+
void readFromParcelLocked(TimeBase timeBase, TimeBase screenOffTimeBase, Parcel in) {
mOnBatteryBackgroundTimeBase.readFromParcel(in);
mOnBatteryScreenOffBackgroundTimeBase.readFromParcel(in);
@@ -7134,6 +7244,8 @@
}
}
+ readJobCompletionsFromParcelLocked(in);
+
int numSensors = in.readInt();
mSensorStats.clear();
for (int k = 0; k < numSensors; k++) {
@@ -7230,6 +7342,12 @@
mForegroundActivityTimer = null;
}
if (in.readInt() != 0) {
+ mForegroundServiceTimer = new StopwatchTimer(mBsi.mClocks, Uid.this,
+ FOREGROUND_SERVICE, null, mBsi.mOnBatteryTimeBase, in);
+ } else {
+ mForegroundServiceTimer = null;
+ }
+ if (in.readInt() != 0) {
mAggregatedPartialWakelockTimer = new DualTimer(mBsi.mClocks, this,
AGGREGATED_WAKE_TYPE_PARTIAL, null,
mBsi.mOnBatteryScreenOffTimeBase, mOnBatteryScreenOffBackgroundTimeBase,
@@ -7723,17 +7841,6 @@
return null;
}
- public void addExcessiveWake(long overTime, long usedTime) {
- if (mExcessivePower == null) {
- mExcessivePower = new ArrayList<ExcessivePower>();
- }
- ExcessivePower ew = new ExcessivePower();
- ew.type = ExcessivePower.TYPE_WAKE;
- ew.overTime = overTime;
- ew.usedTime = usedTime;
- mExcessivePower.add(ew);
- }
-
public void addExcessiveCpu(long overTime, long usedTime) {
if (mExcessivePower == null) {
mExcessivePower = new ArrayList<ExcessivePower>();
@@ -8286,6 +8393,9 @@
public void updateUidProcessStateLocked(int procState) {
int uidRunningState;
+ // Make special note of Foreground Services
+ final boolean userAwareService =
+ (procState == ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
if (procState == ActivityManager.PROCESS_STATE_NONEXISTENT) {
uidRunningState = ActivityManager.PROCESS_STATE_NONEXISTENT;
} else if (procState == ActivityManager.PROCESS_STATE_TOP) {
@@ -8304,24 +8414,37 @@
uidRunningState = PROCESS_STATE_CACHED;
}
- if (mProcessState == uidRunningState) return;
+ if (mProcessState == uidRunningState && userAwareService == mInForegroundService) {
+ return;
+ }
final long elapsedRealtimeMs = mBsi.mClocks.elapsedRealtime();
- final long uptimeMs = mBsi.mClocks.uptimeMillis();
+ if (mProcessState != uidRunningState) {
+ final long uptimeMs = mBsi.mClocks.uptimeMillis();
- if (mProcessState != ActivityManager.PROCESS_STATE_NONEXISTENT) {
- mProcessStateTimer[mProcessState].stopRunningLocked(elapsedRealtimeMs);
- }
- mProcessState = uidRunningState;
- if (uidRunningState != ActivityManager.PROCESS_STATE_NONEXISTENT) {
- if (mProcessStateTimer[uidRunningState] == null) {
- makeProcessState(uidRunningState, null);
+ if (mProcessState != ActivityManager.PROCESS_STATE_NONEXISTENT) {
+ mProcessStateTimer[mProcessState].stopRunningLocked(elapsedRealtimeMs);
}
- mProcessStateTimer[uidRunningState].startRunningLocked(elapsedRealtimeMs);
+ mProcessState = uidRunningState;
+ if (uidRunningState != ActivityManager.PROCESS_STATE_NONEXISTENT) {
+ if (mProcessStateTimer[uidRunningState] == null) {
+ makeProcessState(uidRunningState, null);
+ }
+ mProcessStateTimer[uidRunningState].startRunningLocked(elapsedRealtimeMs);
+ }
+
+ updateOnBatteryBgTimeBase(uptimeMs * 1000, elapsedRealtimeMs * 1000);
+ updateOnBatteryScreenOffBgTimeBase(uptimeMs * 1000, elapsedRealtimeMs * 1000);
}
- updateOnBatteryBgTimeBase(uptimeMs * 1000, elapsedRealtimeMs * 1000);
- updateOnBatteryScreenOffBgTimeBase(uptimeMs * 1000, elapsedRealtimeMs * 1000);
+ if (userAwareService != mInForegroundService) {
+ if (userAwareService) {
+ noteForegroundServiceResumedLocked(elapsedRealtimeMs);
+ } else {
+ noteForegroundServicePausedLocked(elapsedRealtimeMs);
+ }
+ mInForegroundService = userAwareService;
+ }
}
/** Whether to consider Uid to be in the background for background timebase purposes. */
@@ -8457,11 +8580,20 @@
}
}
- public void noteStopJobLocked(String name, long elapsedRealtimeMs) {
+ public void noteStopJobLocked(String name, long elapsedRealtimeMs, int stopReason) {
DualTimer t = mJobStats.stopObject(name);
if (t != null) {
t.stopRunningLocked(elapsedRealtimeMs);
}
+ if (mBsi.mOnBatteryTimeBase.isRunning()) {
+ SparseIntArray types = mJobCompletions.get(name);
+ if (types == null) {
+ types = new SparseIntArray();
+ mJobCompletions.put(name, types);
+ }
+ int last = types.get(stopReason, 0);
+ types.put(stopReason, last + 1);
+ }
}
public StopwatchTimer getWakelockTimerLocked(Wakelock wl, int type) {
@@ -8548,13 +8680,6 @@
}
}
- public void reportExcessiveWakeLocked(String proc, long overTime, long usedTime) {
- Proc p = getProcessStatsLocked(proc);
- if (p != null) {
- p.addExcessiveWake(overTime, usedTime);
- }
- }
-
public void reportExcessiveCpuLocked(String proc, long overTime, long usedTime) {
Proc p = getProcessStatsLocked(proc);
if (p != null) {
@@ -8592,17 +8717,14 @@
return mCpuFreqs;
}
- public BatteryStatsImpl(File systemDir, Handler handler, ExternalStatsSync externalSync) {
- this(new SystemClocks(), systemDir, handler, externalSync, null);
+ public BatteryStatsImpl(File systemDir, Handler handler, PlatformIdleStateCallback cb,
+ UserInfoProvider userInfoProvider) {
+ this(new SystemClocks(), systemDir, handler, cb, userInfoProvider);
}
- public BatteryStatsImpl(File systemDir, Handler handler, ExternalStatsSync externalSync,
- PlatformIdleStateCallback cb) {
- this(new SystemClocks(), systemDir, handler, externalSync, cb);
- }
-
- public BatteryStatsImpl(Clocks clocks, File systemDir, Handler handler,
- ExternalStatsSync externalSync, PlatformIdleStateCallback cb) {
+ private BatteryStatsImpl(Clocks clocks, File systemDir, Handler handler,
+ PlatformIdleStateCallback cb,
+ UserInfoProvider userInfoProvider) {
init(clocks);
if (systemDir != null) {
@@ -8613,7 +8735,6 @@
}
mCheckinFile = new AtomicFile(new File(systemDir, "batterystats-checkin.bin"));
mDailyFile = new AtomicFile(new File(systemDir, "batterystats-daily.xml"));
- mExternalSync = externalSync;
mHandler = new MyHandler(handler.getLooper());
mStartCount++;
mScreenOnTimer = new StopwatchTimer(mClocks, null, -1, null, mOnBatteryTimeBase);
@@ -8690,6 +8811,7 @@
clearHistoryLocked();
updateDailyDeadlineLocked();
mPlatformIdleStateCallback = cb;
+ mUserInfoProvider = userInfoProvider;
}
public BatteryStatsImpl(Parcel p) {
@@ -8740,6 +8862,10 @@
}
}
+ public void setExternalStatsSyncLocked(ExternalStatsSync sync) {
+ mExternalSync = sync;
+ }
+
public void updateDailyDeadlineLocked() {
// Get the current time.
long currentTime = mDailyStartTime = System.currentTimeMillis();
@@ -9745,7 +9871,7 @@
return;
}
- final long elapsedRealtimeMs = SystemClock.elapsedRealtime();
+ final long elapsedRealtimeMs = mClocks.elapsedRealtime();
long radioTime = mMobileRadioActivePerAppTimer.getTimeSinceMarkLocked(
elapsedRealtimeMs * 1000);
mMobileRadioActivePerAppTimer.setMark(elapsedRealtimeMs);
@@ -10141,12 +10267,6 @@
// If no app is holding a wakelock, then the distribution is normal.
final int wakelockWeight = 50;
- // Read the time spent for each cluster at various cpu frequencies.
- final long[][] clusterSpeeds = new long[mKernelCpuSpeedReaders.length][];
- for (int cluster = 0; cluster < mKernelCpuSpeedReaders.length; cluster++) {
- clusterSpeeds[cluster] = mKernelCpuSpeedReaders[cluster].readDelta();
- }
-
int numWakelocks = 0;
// Calculate how many wakelocks we have to distribute amongst. The system is excluded.
@@ -10170,10 +10290,13 @@
mTempTotalCpuUserTimeUs = 0;
mTempTotalCpuSystemTimeUs = 0;
+ final SparseLongArray updatedUids = new SparseLongArray();
+
// Read the CPU data for each UID. This will internally generate a snapshot so next time
// we read, we get a delta. If we are to distribute the cpu time, then do so. Otherwise
// we just ignore the data.
final long startTimeMs = mClocks.uptimeMillis();
+ mUserInfoProvider.refreshUserIds();
mKernelUidCpuTimeReader.readDelta(!mOnBatteryInternal ? null :
new KernelUidCpuTimeReader.Callback() {
@Override
@@ -10187,6 +10310,11 @@
+ " no mapping to owning uid: " + uid);
return;
}
+ if (!mUserInfoProvider.exists(UserHandle.getUserId(uid))) {
+ Slog.d(TAG, "Got readings for an invalid user's uid " + uid);
+ mKernelUidCpuTimeReader.removeUid(uid);
+ return;
+ }
final Uid u = getUidStatsLocked(uid);
// Accumulate the total system and user time.
@@ -10221,32 +10349,7 @@
u.mUserCpuTime.addCountLocked(userTimeUs);
u.mSystemCpuTime.addCountLocked(systemTimeUs);
-
- // Add the cpu speeds to this UID. These are used as a ratio
- // for computing the power this UID used.
- final int numClusters = mPowerProfile.getNumCpuClusters();
- if (u.mCpuClusterSpeed == null || u.mCpuClusterSpeed.length !=
- numClusters) {
- u.mCpuClusterSpeed = new LongSamplingCounter[numClusters][];
- }
-
- for (int cluster = 0; cluster < clusterSpeeds.length; cluster++) {
- final int speedsInCluster = mPowerProfile.getNumSpeedStepsInCpuCluster(
- cluster);
- if (u.mCpuClusterSpeed[cluster] == null || speedsInCluster !=
- u.mCpuClusterSpeed[cluster].length) {
- u.mCpuClusterSpeed[cluster] =
- new LongSamplingCounter[speedsInCluster];
- }
-
- final LongSamplingCounter[] cpuSpeeds = u.mCpuClusterSpeed[cluster];
- for (int speed = 0; speed < clusterSpeeds[cluster].length; speed++) {
- if (cpuSpeeds[speed] == null) {
- cpuSpeeds[speed] = new LongSamplingCounter(mOnBatteryTimeBase);
- }
- cpuSpeeds[speed].addCountLocked(clusterSpeeds[cluster][speed]);
- }
- }
+ updatedUids.put(u.getUid(), userTimeUs + systemTimeUs);
}
});
@@ -10286,6 +10389,8 @@
timer.mUid.mUserCpuTime.addCountLocked(userTimeUs);
timer.mUid.mSystemCpuTime.addCountLocked(systemTimeUs);
+ final int uid = timer.mUid.getUid();
+ updatedUids.put(uid, updatedUids.get(uid, 0) + userTimeUs + systemTimeUs);
final Uid.Proc proc = timer.mUid.getProcessStatsLocked("*wakelock*");
proc.addCpuTimeLocked(userTimeUs / 1000, systemTimeUs / 1000);
@@ -10310,6 +10415,8 @@
final Uid u = getUidStatsLocked(Process.SYSTEM_UID);
u.mUserCpuTime.addCountLocked(mTempTotalCpuUserTimeUs);
u.mSystemCpuTime.addCountLocked(mTempTotalCpuSystemTimeUs);
+ updatedUids.put(Process.SYSTEM_UID, updatedUids.get(Process.SYSTEM_UID, 0)
+ + mTempTotalCpuUserTimeUs + mTempTotalCpuSystemTimeUs);
final Uid.Proc proc = u.getProcessStatsLocked("*lost*");
proc.addCpuTimeLocked((int) mTempTotalCpuUserTimeUs / 1000,
@@ -10317,6 +10424,51 @@
}
}
+ long totalCpuClustersTime = 0;
+ // Read the time spent for each cluster at various cpu frequencies.
+ final long[][] clusterSpeeds = new long[mKernelCpuSpeedReaders.length][];
+ for (int cluster = 0; cluster < mKernelCpuSpeedReaders.length; cluster++) {
+ clusterSpeeds[cluster] = mKernelCpuSpeedReaders[cluster].readDelta();
+ if (clusterSpeeds[cluster] != null) {
+ for (int speed = clusterSpeeds[cluster].length - 1; speed >= 0; --speed) {
+ totalCpuClustersTime += clusterSpeeds[cluster][speed];
+ }
+ }
+ }
+ if (totalCpuClustersTime != 0) {
+ // We have cpu times per freq aggregated over all uids but we need the times per uid.
+ // So, we distribute total time spent by an uid to different cpu freqs based on the
+ // amount of time cpu was running at that freq.
+ final int updatedUidsCount = updatedUids.size();
+ for (int i = 0; i < updatedUidsCount; ++i) {
+ final Uid u = getUidStatsLocked(updatedUids.keyAt(i));
+ final long appCpuTimeMs = updatedUids.valueAt(i) / 1000;
+ // Add the cpu speeds to this UID.
+ final int numClusters = mPowerProfile.getNumCpuClusters();
+ if (u.mCpuClusterSpeed == null || u.mCpuClusterSpeed.length !=
+ numClusters) {
+ u.mCpuClusterSpeed = new LongSamplingCounter[numClusters][];
+ }
+
+ for (int cluster = 0; cluster < clusterSpeeds.length; cluster++) {
+ final int speedsInCluster = clusterSpeeds[cluster].length;
+ if (u.mCpuClusterSpeed[cluster] == null || speedsInCluster !=
+ u.mCpuClusterSpeed[cluster].length) {
+ u.mCpuClusterSpeed[cluster] = new LongSamplingCounter[speedsInCluster];
+ }
+
+ final LongSamplingCounter[] cpuSpeeds = u.mCpuClusterSpeed[cluster];
+ for (int speed = 0; speed < speedsInCluster; speed++) {
+ if (cpuSpeeds[speed] == null) {
+ cpuSpeeds[speed] = new LongSamplingCounter(mOnBatteryTimeBase);
+ }
+ cpuSpeeds[speed].addCountLocked(appCpuTimeMs * clusterSpeeds[cluster][speed]
+ / totalCpuClustersTime);
+ }
+ }
+ }
+ }
+
// See if there is a difference in wakelocks between this collection and the last
// collection.
if (ArrayUtils.referenceEquals(mPartialTimers, mLastPartialTimers)) {
@@ -10359,6 +10511,11 @@
+ " no mapping to owning uid: " + uid);
return;
}
+ if (!mUserInfoProvider.exists(UserHandle.getUserId(uid))) {
+ Slog.d(TAG, "Got readings for an invalid user's uid " + uid);
+ mKernelUidCpuFreqTimeReader.removeUid(uid);
+ return;
+ }
final Uid u = getUidStatsLocked(uid);
if (u.mCpuFreqTimeMs == null) {
u.mCpuFreqTimeMs = new LongSamplingCounterArray(mOnBatteryTimeBase);
@@ -11020,6 +11177,23 @@
return u;
}
+ public void onCleanupUserLocked(int userId) {
+ final int firstUidForUser = UserHandle.getUid(userId, 0);
+ final int lastUidForUser = UserHandle.getUid(userId, UserHandle.PER_USER_RANGE - 1);
+ mKernelUidCpuFreqTimeReader.removeUidsInRange(firstUidForUser, lastUidForUser);
+ mKernelUidCpuTimeReader.removeUidsInRange(firstUidForUser, lastUidForUser);
+ }
+
+ public void onUserRemovedLocked(int userId) {
+ final int firstUidForUser = UserHandle.getUid(userId, 0);
+ final int lastUidForUser = UserHandle.getUid(userId, UserHandle.PER_USER_RANGE - 1);
+ mUidStats.put(firstUidForUser, null);
+ mUidStats.put(lastUidForUser, null);
+ final int firstIndex = mUidStats.indexOfKey(firstUidForUser);
+ final int lastIndex = mUidStats.indexOfKey(lastUidForUser);
+ mUidStats.removeAtRange(firstIndex, lastIndex - firstIndex + 1);
+ }
+
/**
* Remove the statistics object for a particular uid.
*/
@@ -11515,6 +11689,9 @@
u.createForegroundActivityTimerLocked().readSummaryFromParcelLocked(in);
}
if (in.readInt() != 0) {
+ u.createForegroundServiceTimerLocked().readSummaryFromParcelLocked(in);
+ }
+ if (in.readInt() != 0) {
u.createAggregatedPartialWakelockTimerLocked().readSummaryFromParcelLocked(in);
}
if (in.readInt() != 0) {
@@ -11642,6 +11819,8 @@
u.readJobSummaryFromParcelLocked(name, in);
}
+ u.readJobCompletionsFromParcelLocked(in);
+
int NP = in.readInt();
if (NP > 1000) {
throw new ParcelFormatException("File corrupt: too many sensors " + NP);
@@ -11924,6 +12103,12 @@
} else {
out.writeInt(0);
}
+ if (u.mForegroundServiceTimer != null) {
+ out.writeInt(1);
+ u.mForegroundServiceTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
+ } else {
+ out.writeInt(0);
+ }
if (u.mAggregatedPartialWakelockTimer != null) {
out.writeInt(1);
u.mAggregatedPartialWakelockTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
@@ -12081,6 +12266,8 @@
jobStats.valueAt(ij).writeSummaryFromParcelLocked(out, NOWREAL_SYS);
}
+ u.writeJobCompletionsToParcelLocked(out);
+
int NSE = u.mSensorStats.size();
out.writeInt(NSE);
for (int ise=0; ise<NSE; ise++) {
diff --git a/core/java/com/android/internal/os/ClassLoaderFactory.java b/core/java/com/android/internal/os/ClassLoaderFactory.java
new file mode 100644
index 0000000..61c57c8
--- /dev/null
+++ b/core/java/com/android/internal/os/ClassLoaderFactory.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.os;
+
+import android.os.Trace;
+
+import dalvik.system.DelegateLastClassLoader;
+import dalvik.system.PathClassLoader;
+
+/**
+ * Creates class loaders.
+ *
+ * @hide
+ */
+public class ClassLoaderFactory {
+ // Unconstructable
+ private ClassLoaderFactory() {}
+
+ private static final String PATH_CLASS_LOADER_NAME = PathClassLoader.class.getName();
+ private static final String DELEGATE_LAST_CLASS_LOADER_NAME =
+ DelegateLastClassLoader.class.getName();
+
+ /**
+ * Returns true if {@code name} is a supported classloader. {@code name} must be a
+ * binary name of a class, as defined by {@code Class.getName}.
+ */
+ public static boolean isValidClassLoaderName(String name) {
+ // This method is used to parse package data and does not accept null names.
+ return name != null && (isPathClassLoaderName(name) || isDelegateLastClassLoaderName(name));
+ }
+
+ /**
+ * Returns true if {@code name} is the encoding for the PathClassLoader.
+ */
+ public static boolean isPathClassLoaderName(String name) {
+ // For null values we default to PathClassLoader. This cover the case when packages
+ // don't specify any value for their class loaders.
+ return name == null || PATH_CLASS_LOADER_NAME.equals(name);
+ }
+
+ /**
+ * Returns true if {@code name} is the encoding for the DelegateLastClassLoader.
+ */
+ public static boolean isDelegateLastClassLoaderName(String name) {
+ return DELEGATE_LAST_CLASS_LOADER_NAME.equals(name);
+ }
+
+ /**
+ * Same as {@code createClassLoader} below, except that no associated namespace
+ * is created.
+ */
+ public static ClassLoader createClassLoader(String dexPath,
+ String librarySearchPath, ClassLoader parent, String classloaderName) {
+ if (isPathClassLoaderName(classloaderName)) {
+ return new PathClassLoader(dexPath, librarySearchPath, parent);
+ } else if (isPathClassLoaderName(classloaderName)) {
+ return new DelegateLastClassLoader(dexPath, librarySearchPath, parent);
+ }
+
+ throw new AssertionError("Invalid classLoaderName: " + classloaderName);
+ }
+
+ /**
+ * Create a ClassLoader and initialize a linker-namespace for it.
+ */
+ public static ClassLoader createClassLoader(String dexPath,
+ String librarySearchPath, String libraryPermittedPath, ClassLoader parent,
+ int targetSdkVersion, boolean isNamespaceShared, String classloaderName) {
+
+ final ClassLoader classLoader = createClassLoader(dexPath, librarySearchPath, parent,
+ classloaderName);
+
+ Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "createClassloaderNamespace");
+ String errorMessage = createClassloaderNamespace(classLoader,
+ targetSdkVersion,
+ librarySearchPath,
+ libraryPermittedPath,
+ isNamespaceShared);
+ Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
+
+ if (errorMessage != null) {
+ throw new UnsatisfiedLinkError("Unable to create namespace for the classloader " +
+ classLoader + ": " + errorMessage);
+ }
+
+ return classLoader;
+ }
+
+ private static native String createClassloaderNamespace(ClassLoader classLoader,
+ int targetSdkVersion,
+ String librarySearchPath,
+ String libraryPermittedPath,
+ boolean isNamespaceShared);
+}
diff --git a/core/java/com/android/internal/os/CpuPowerCalculator.java b/core/java/com/android/internal/os/CpuPowerCalculator.java
index 8417856..9d52e19 100644
--- a/core/java/com/android/internal/os/CpuPowerCalculator.java
+++ b/core/java/com/android/internal/os/CpuPowerCalculator.java
@@ -33,29 +33,17 @@
long rawUptimeUs, int statsType) {
app.cpuTimeMs = (u.getUserCpuTimeUs(statsType) + u.getSystemCpuTimeUs(statsType)) / 1000;
-
- // Aggregate total time spent on each cluster.
- long totalTime = 0;
final int numClusters = mProfile.getNumCpuClusters();
- for (int cluster = 0; cluster < numClusters; cluster++) {
- final int speedsForCluster = mProfile.getNumSpeedStepsInCpuCluster(cluster);
- for (int speed = 0; speed < speedsForCluster; speed++) {
- totalTime += u.getTimeAtCpuSpeed(cluster, speed, statsType);
- }
- }
- totalTime = Math.max(totalTime, 1);
double cpuPowerMaMs = 0;
for (int cluster = 0; cluster < numClusters; cluster++) {
final int speedsForCluster = mProfile.getNumSpeedStepsInCpuCluster(cluster);
for (int speed = 0; speed < speedsForCluster; speed++) {
- final double ratio = (double) u.getTimeAtCpuSpeed(cluster, speed, statsType) /
- totalTime;
- final double cpuSpeedStepPower = ratio * app.cpuTimeMs *
+ final double cpuSpeedStepPower = u.getTimeAtCpuSpeed(cluster, speed, statsType) *
mProfile.getAveragePowerForCpu(cluster, speed);
- if (DEBUG && ratio != 0) {
+ if (DEBUG) {
Log.d(TAG, "UID " + u.getUid() + ": CPU cluster #" + cluster + " step #"
- + speed + " ratio=" + BatteryStatsHelper.makemAh(ratio) + " power="
+ + speed + " power="
+ BatteryStatsHelper.makemAh(cpuSpeedStepPower / (60 * 60 * 1000)));
}
cpuPowerMaMs += cpuSpeedStepPower;
diff --git a/core/java/com/android/internal/os/KernelUidCpuFreqTimeReader.java b/core/java/com/android/internal/os/KernelUidCpuFreqTimeReader.java
index ff521c2..7295380 100644
--- a/core/java/com/android/internal/os/KernelUidCpuFreqTimeReader.java
+++ b/core/java/com/android/internal/os/KernelUidCpuFreqTimeReader.java
@@ -17,8 +17,10 @@
package com.android.internal.os;
import android.annotation.Nullable;
+import android.os.SystemClock;
import android.util.Slog;
import android.util.SparseArray;
+import android.util.TimeUtils;
import com.android.internal.annotations.VisibleForTesting;
@@ -50,6 +52,8 @@
private long[] mCpuFreqs;
private int mCpuFreqsCount;
+ private long mLastTimeReadMs;
+ private long mNowTimeMs;
private SparseArray<long[]> mLastUidCpuFreqTimeMs = new SparseArray<>();
@@ -64,7 +68,9 @@
return;
}
try (BufferedReader reader = new BufferedReader(new FileReader(UID_TIMES_PROC_FILE))) {
+ mNowTimeMs = SystemClock.elapsedRealtime();
readDelta(reader, callback);
+ mLastTimeReadMs = mNowTimeMs;
mProcFileAvailable = true;
} catch (IOException e) {
mReadErrorCounter++;
@@ -76,6 +82,17 @@
mLastUidCpuFreqTimeMs.delete(uid);
}
+ public void removeUidsInRange(int startUid, int endUid) {
+ if (endUid < startUid) {
+ return;
+ }
+ mLastUidCpuFreqTimeMs.put(startUid, null);
+ mLastUidCpuFreqTimeMs.put(endUid, null);
+ final int firstIndex = mLastUidCpuFreqTimeMs.indexOfKey(startUid);
+ final int lastIndex = mLastUidCpuFreqTimeMs.indexOfKey(endUid);
+ mLastUidCpuFreqTimeMs.removeAtRange(firstIndex, lastIndex - firstIndex + 1);
+ }
+
@VisibleForTesting
public void readDelta(BufferedReader reader, @Nullable Callback callback) throws IOException {
String line = reader.readLine();
@@ -104,14 +121,33 @@
return;
}
final long[] deltaUidTimeMs = new long[size];
+ final long[] curUidTimeMs = new long[size];
+ boolean notify = false;
for (int i = 0; i < size; ++i) {
// Times read will be in units of 10ms
final long totalTimeMs = Long.parseLong(timesStr[i], 10) * 10;
deltaUidTimeMs[i] = totalTimeMs - uidTimeMs[i];
- uidTimeMs[i] = totalTimeMs;
+ // If there is malformed data for any uid, then we just log about it and ignore
+ // the data for that uid.
+ if (deltaUidTimeMs[i] < 0 || totalTimeMs < 0) {
+ final StringBuilder sb = new StringBuilder("Malformed cpu freq data for UID=")
+ .append(uid).append("\n");
+ sb.append("data=").append("(").append(uidTimeMs[i]).append(",")
+ .append(totalTimeMs).append(")").append("\n");
+ sb.append("times=").append("(")
+ .append(TimeUtils.formatForLogging(mLastTimeReadMs)).append(",")
+ .append(TimeUtils.formatForLogging(mNowTimeMs)).append(")");
+ Slog.wtf(TAG, sb.toString());
+ return;
+ }
+ curUidTimeMs[i] = totalTimeMs;
+ notify = notify || (deltaUidTimeMs[i] > 0);
}
- if (callback != null) {
- callback.onUidCpuFreqTime(uid, deltaUidTimeMs);
+ if (notify) {
+ System.arraycopy(curUidTimeMs, 0, uidTimeMs, 0, size);
+ if (callback != null) {
+ callback.onUidCpuFreqTime(uid, deltaUidTimeMs);
+ }
}
}
diff --git a/core/java/com/android/internal/os/KernelUidCpuTimeReader.java b/core/java/com/android/internal/os/KernelUidCpuTimeReader.java
index 181e1ac..37d9d1d 100644
--- a/core/java/com/android/internal/os/KernelUidCpuTimeReader.java
+++ b/core/java/com/android/internal/os/KernelUidCpuTimeReader.java
@@ -130,17 +130,42 @@
* @param uid The UID to remove.
*/
public void removeUid(int uid) {
- int index = mLastUserTimeUs.indexOfKey(uid);
+ final int index = mLastSystemTimeUs.indexOfKey(uid);
if (index >= 0) {
- mLastUserTimeUs.removeAt(index);
mLastSystemTimeUs.removeAt(index);
+ mLastUserTimeUs.removeAt(index);
}
+ removeUidsFromKernelModule(uid, uid);
+ }
+ /**
+ * Removes UIDs in a given range from the kernel module and internal accounting data.
+ * @param startUid the first uid to remove
+ * @param endUid the last uid to remove
+ */
+ public void removeUidsInRange(int startUid, int endUid) {
+ if (endUid < startUid) {
+ return;
+ }
+ mLastSystemTimeUs.put(startUid, 0);
+ mLastUserTimeUs.put(startUid, 0);
+ mLastSystemTimeUs.put(endUid, 0);
+ mLastUserTimeUs.put(endUid, 0);
+ final int startIndex = mLastSystemTimeUs.indexOfKey(startUid);
+ final int endIndex = mLastSystemTimeUs.indexOfKey(endUid);
+ mLastSystemTimeUs.removeAtRange(startIndex, endIndex - startIndex + 1);
+ mLastUserTimeUs.removeAtRange(startIndex, endIndex - startIndex + 1);
+ removeUidsFromKernelModule(startUid, endUid);
+ }
+
+ private void removeUidsFromKernelModule(int startUid, int endUid) {
+ Slog.d(TAG, "Removing uids " + startUid + "-" + endUid);
try (FileWriter writer = new FileWriter(sRemoveUidProcFile)) {
- writer.write(Integer.toString(uid) + "-" + Integer.toString(uid));
+ writer.write(startUid + "-" + endUid);
writer.flush();
} catch (IOException e) {
- Slog.e(TAG, "failed to remove uid from uid_cputime module", e);
+ Slog.e(TAG, "failed to remove uids " + startUid + " - " + endUid
+ + " from uid_cputime module", e);
}
}
}
diff --git a/core/java/com/android/internal/os/PathClassLoaderFactory.java b/core/java/com/android/internal/os/PathClassLoaderFactory.java
deleted file mode 100644
index 06a93b2..0000000
--- a/core/java/com/android/internal/os/PathClassLoaderFactory.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.internal.os;
-
-import android.os.Trace;
-
-import dalvik.system.PathClassLoader;
-
-/**
- * Creates path class loaders.
- *
- * @hide
- */
-public class PathClassLoaderFactory {
- // Unconstructable
- private PathClassLoaderFactory() {}
-
- /**
- * Create a PathClassLoader and initialize a linker-namespace for it.
- *
- * @hide
- */
- public static PathClassLoader createClassLoader(String dexPath,
- String librarySearchPath,
- String libraryPermittedPath,
- ClassLoader parent,
- int targetSdkVersion,
- boolean isNamespaceShared) {
- PathClassLoader pathClassloader = new PathClassLoader(dexPath, librarySearchPath, parent);
-
- Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "createClassloaderNamespace");
- String errorMessage = createClassloaderNamespace(pathClassloader,
- targetSdkVersion,
- librarySearchPath,
- libraryPermittedPath,
- isNamespaceShared);
- Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
-
- if (errorMessage != null) {
- throw new UnsatisfiedLinkError("Unable to create namespace for the classloader " +
- pathClassloader + ": " + errorMessage);
- }
-
- return pathClassloader;
- }
-
- private static native String createClassloaderNamespace(ClassLoader classLoader,
- int targetSdkVersion,
- String librarySearchPath,
- String libraryPermittedPath,
- boolean isNamespaceShared);
-}
diff --git a/core/java/com/android/internal/os/RuntimeInit.java b/core/java/com/android/internal/os/RuntimeInit.java
index f4be128..66475e4 100644
--- a/core/java/com/android/internal/os/RuntimeInit.java
+++ b/core/java/com/android/internal/os/RuntimeInit.java
@@ -31,6 +31,7 @@
import com.android.internal.logging.AndroidConfig;
import com.android.server.NetworkManagementSocketTagger;
import dalvik.system.VMRuntime;
+import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.TimeZone;
@@ -228,8 +229,8 @@
* @param argv Argument vector for main()
* @param classLoader the classLoader to load {@className} with
*/
- private static void invokeStaticMain(String className, String[] argv, ClassLoader classLoader)
- throws Zygote.MethodAndArgsCaller {
+ private static Runnable findStaticMain(String className, String[] argv,
+ ClassLoader classLoader) {
Class<?> cl;
try {
@@ -263,7 +264,7 @@
* clears up all the stack frames that were required in setting
* up the process.
*/
- throw new Zygote.MethodAndArgsCaller(m, argv);
+ return new MethodAndArgsCaller(m, argv);
}
public static final void main(String[] argv) {
@@ -286,8 +287,8 @@
if (DEBUG) Slog.d(TAG, "Leaving RuntimeInit!");
}
- protected static void applicationInit(int targetSdkVersion, String[] argv, ClassLoader classLoader)
- throws Zygote.MethodAndArgsCaller {
+ protected static Runnable applicationInit(int targetSdkVersion, String[] argv,
+ ClassLoader classLoader) {
// If the application calls System.exit(), terminate the process
// immediately without running any shutdown hooks. It is not possible to
// shutdown an Android application gracefully. Among other things, the
@@ -300,20 +301,13 @@
VMRuntime.getRuntime().setTargetHeapUtilization(0.75f);
VMRuntime.getRuntime().setTargetSdkVersion(targetSdkVersion);
- final Arguments args;
- try {
- args = new Arguments(argv);
- } catch (IllegalArgumentException ex) {
- Slog.e(TAG, ex.getMessage());
- // let the process exit
- return;
- }
+ final Arguments args = new Arguments(argv);
// The end of of the RuntimeInit event (see #zygoteInit).
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
// Remaining arguments are passed to the start class's static main
- invokeStaticMain(args.startClass, args.startArgs, classLoader);
+ return findStaticMain(args.startClass, args.startArgs, classLoader);
}
/**
@@ -422,4 +416,37 @@
System.arraycopy(args, curArg, startArgs, 0, startArgs.length);
}
}
+
+ /**
+ * Helper class which holds a method and arguments and can call them. This is used as part of
+ * a trampoline to get rid of the initial process setup stack frames.
+ */
+ static class MethodAndArgsCaller implements Runnable {
+ /** method to call */
+ private final Method mMethod;
+
+ /** argument array */
+ private final String[] mArgs;
+
+ public MethodAndArgsCaller(Method method, String[] args) {
+ mMethod = method;
+ mArgs = args;
+ }
+
+ public void run() {
+ try {
+ mMethod.invoke(null, new Object[] { mArgs });
+ } catch (IllegalAccessException ex) {
+ throw new RuntimeException(ex);
+ } catch (InvocationTargetException ex) {
+ Throwable cause = ex.getCause();
+ if (cause instanceof RuntimeException) {
+ throw (RuntimeException) cause;
+ } else if (cause instanceof Error) {
+ throw (Error) cause;
+ }
+ throw new RuntimeException(ex);
+ }
+ }
+ }
}
diff --git a/core/java/com/android/internal/os/SamplingProfilerIntegration.java b/core/java/com/android/internal/os/SamplingProfilerIntegration.java
deleted file mode 100644
index 6429aa4..0000000
--- a/core/java/com/android/internal/os/SamplingProfilerIntegration.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.internal.os;
-
-import android.content.pm.PackageInfo;
-import android.os.Build;
-import android.os.SystemProperties;
-import android.util.Log;
-import dalvik.system.profiler.BinaryHprofWriter;
-import dalvik.system.profiler.SamplingProfiler;
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.PrintStream;
-import java.util.Date;
-import java.util.concurrent.Executor;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.atomic.AtomicBoolean;
-import libcore.io.IoUtils;
-
-/**
- * Integrates the framework with Dalvik's sampling profiler.
- */
-public class SamplingProfilerIntegration {
-
- private static final String TAG = "SamplingProfilerIntegration";
-
- public static final String SNAPSHOT_DIR = "/data/snapshots";
-
- private static final boolean enabled;
- private static final Executor snapshotWriter;
- private static final int samplingProfilerMilliseconds;
- private static final int samplingProfilerDepth;
-
- /** Whether or not a snapshot is being persisted. */
- private static final AtomicBoolean pending = new AtomicBoolean(false);
-
- static {
- samplingProfilerMilliseconds = SystemProperties.getInt("persist.sys.profiler_ms", 0);
- samplingProfilerDepth = SystemProperties.getInt("persist.sys.profiler_depth", 4);
- if (samplingProfilerMilliseconds > 0) {
- File dir = new File(SNAPSHOT_DIR);
- dir.mkdirs();
- // the directory needs to be writable to anybody to allow file writing
- dir.setWritable(true, false);
- // the directory needs to be executable to anybody to allow file creation
- dir.setExecutable(true, false);
- if (dir.isDirectory()) {
- snapshotWriter = Executors.newSingleThreadExecutor(new ThreadFactory() {
- public Thread newThread(Runnable r) {
- return new Thread(r, TAG);
- }
- });
- enabled = true;
- Log.i(TAG, "Profiling enabled. Sampling interval ms: "
- + samplingProfilerMilliseconds);
- } else {
- snapshotWriter = null;
- enabled = true;
- Log.w(TAG, "Profiling setup failed. Could not create " + SNAPSHOT_DIR);
- }
- } else {
- snapshotWriter = null;
- enabled = false;
- Log.i(TAG, "Profiling disabled.");
- }
- }
-
- private static SamplingProfiler samplingProfiler;
- private static long startMillis;
-
- /**
- * Is profiling enabled?
- */
- public static boolean isEnabled() {
- return enabled;
- }
-
- /**
- * Starts the profiler if profiling is enabled.
- */
- public static void start() {
- if (!enabled) {
- return;
- }
- if (samplingProfiler != null) {
- Log.e(TAG, "SamplingProfilerIntegration already started at " + new Date(startMillis));
- return;
- }
-
- ThreadGroup group = Thread.currentThread().getThreadGroup();
- SamplingProfiler.ThreadSet threadSet = SamplingProfiler.newThreadGroupThreadSet(group);
- samplingProfiler = new SamplingProfiler(samplingProfilerDepth, threadSet);
- samplingProfiler.start(samplingProfilerMilliseconds);
- startMillis = System.currentTimeMillis();
- }
-
- /**
- * Writes a snapshot if profiling is enabled.
- */
- public static void writeSnapshot(final String processName, final PackageInfo packageInfo) {
- if (!enabled) {
- return;
- }
- if (samplingProfiler == null) {
- Log.e(TAG, "SamplingProfilerIntegration is not started");
- return;
- }
-
- /*
- * If we're already writing a snapshot, don't bother enqueueing another
- * request right now. This will reduce the number of individual
- * snapshots and in turn the total amount of memory consumed (one big
- * snapshot is smaller than N subset snapshots).
- */
- if (pending.compareAndSet(false, true)) {
- snapshotWriter.execute(new Runnable() {
- public void run() {
- try {
- writeSnapshotFile(processName, packageInfo);
- } finally {
- pending.set(false);
- }
- }
- });
- }
- }
-
- /**
- * Writes the zygote's snapshot to internal storage if profiling is enabled.
- */
- public static void writeZygoteSnapshot() {
- if (!enabled) {
- return;
- }
- writeSnapshotFile("zygote", null);
- samplingProfiler.shutdown();
- samplingProfiler = null;
- startMillis = 0;
- }
-
- /**
- * pass in PackageInfo to retrieve various values for snapshot header
- */
- private static void writeSnapshotFile(String processName, PackageInfo packageInfo) {
- if (!enabled) {
- return;
- }
- samplingProfiler.stop();
-
- /*
- * We use the global start time combined with the process name
- * as a unique ID. We can't use a counter because processes
- * restart. This could result in some overlap if we capture
- * two snapshots in rapid succession.
- */
- String name = processName.replaceAll(":", ".");
- String path = SNAPSHOT_DIR + "/" + name + "-" + startMillis + ".snapshot";
- long start = System.currentTimeMillis();
- OutputStream outputStream = null;
- try {
- outputStream = new BufferedOutputStream(new FileOutputStream(path));
- PrintStream out = new PrintStream(outputStream);
- generateSnapshotHeader(name, packageInfo, out);
- if (out.checkError()) {
- throw new IOException();
- }
- BinaryHprofWriter.write(samplingProfiler.getHprofData(), outputStream);
- } catch (IOException e) {
- Log.e(TAG, "Error writing snapshot to " + path, e);
- return;
- } finally {
- IoUtils.closeQuietly(outputStream);
- }
- // set file readable to the world so that SamplingProfilerService
- // can put it to dropbox
- new File(path).setReadable(true, false);
-
- long elapsed = System.currentTimeMillis() - start;
- Log.i(TAG, "Wrote snapshot " + path + " in " + elapsed + "ms.");
- samplingProfiler.start(samplingProfilerMilliseconds);
- }
-
- /**
- * generate header for snapshots, with the following format
- * (like an HTTP header but without the \r):
- *
- * Version: <version number of profiler>\n
- * Process: <process name>\n
- * Package: <package name, if exists>\n
- * Package-Version: <version number of the package, if exists>\n
- * Build: <fingerprint>\n
- * \n
- * <the actual snapshot content begins here...>
- */
- private static void generateSnapshotHeader(String processName, PackageInfo packageInfo,
- PrintStream out) {
- // profiler version
- out.println("Version: 3");
- out.println("Process: " + processName);
- if (packageInfo != null) {
- out.println("Package: " + packageInfo.packageName);
- out.println("Package-Version: " + packageInfo.versionCode);
- }
- out.println("Build: " + Build.FINGERPRINT);
- // single blank line means the end of snapshot header.
- out.println();
- }
-}
diff --git a/core/java/com/android/internal/os/WebViewZygoteInit.java b/core/java/com/android/internal/os/WebViewZygoteInit.java
index 58e4a3e..cadb66a 100644
--- a/core/java/com/android/internal/os/WebViewZygoteInit.java
+++ b/core/java/com/android/internal/os/WebViewZygoteInit.java
@@ -29,7 +29,7 @@
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
/**
* Startup class for the WebView zygote process.
@@ -69,8 +69,7 @@
}
@Override
- protected boolean handlePreloadPackage(String packagePath, String libsPath,
- String cacheKey) {
+ protected void handlePreloadPackage(String packagePath, String libsPath, String cacheKey) {
Log.i(TAG, "Beginning package preload");
// Ask ApplicationLoaders to create and cache a classloader for the WebView APK so that
// our children will reuse the same classloader instead of creating their own.
@@ -92,13 +91,18 @@
try {
Class<WebViewFactoryProvider> providerClass =
WebViewFactory.getWebViewProviderClass(loader);
- Object result = providerClass.getMethod("preloadInZygote").invoke(null);
- preloadSucceeded = ((Boolean) result).booleanValue();
- if (!preloadSucceeded) {
- Log.e(TAG, "preloadInZygote returned false");
+ Method preloadInZygote = providerClass.getMethod("preloadInZygote");
+ preloadInZygote.setAccessible(true);
+ if (preloadInZygote.getReturnType() != Boolean.TYPE) {
+ Log.e(TAG, "Unexpected return type: preloadInZygote must return boolean");
+ } else {
+ preloadSucceeded = (boolean) providerClass.getMethod("preloadInZygote")
+ .invoke(null);
+ if (!preloadSucceeded) {
+ Log.e(TAG, "preloadInZygote returned false");
+ }
}
- } catch (ClassNotFoundException | NoSuchMethodException | SecurityException |
- IllegalAccessException | InvocationTargetException e) {
+ } catch (ReflectiveOperationException e) {
Log.e(TAG, "Exception while preloading package", e);
}
@@ -106,12 +110,10 @@
DataOutputStream socketOut = getSocketOutputStream();
socketOut.writeInt(preloadSucceeded ? 1 : 0);
} catch (IOException ioe) {
- Log.e(TAG, "Error writing to command socket", ioe);
- return true;
+ throw new IllegalStateException("Error writing to command socket", ioe);
}
Log.i(TAG, "Package preload done");
- return false;
}
}
@@ -125,16 +127,23 @@
throw new RuntimeException("Failed to setpgid(0,0)", ex);
}
+ final Runnable caller;
try {
sServer.registerServerSocket("webview_zygote");
- sServer.runSelectLoop(TextUtils.join(",", Build.SUPPORTED_ABIS));
- sServer.closeServerSocket();
- } catch (Zygote.MethodAndArgsCaller caller) {
- caller.run();
+ // The select loop returns early in the child process after a fork and
+ // loops forever in the zygote.
+ caller = sServer.runSelectLoop(TextUtils.join(",", Build.SUPPORTED_ABIS));
} catch (RuntimeException e) {
Log.e(TAG, "Fatal exception:", e);
+ throw e;
+ } finally {
+ sServer.closeServerSocket();
}
- System.exit(0);
+ // We're in the child process and have exited the select loop. Proceed to execute the
+ // command.
+ if (caller != null) {
+ caller.run();
+ }
}
}
diff --git a/core/java/com/android/internal/os/WrapperInit.java b/core/java/com/android/internal/os/WrapperInit.java
index b245678..89328b2 100644
--- a/core/java/com/android/internal/os/WrapperInit.java
+++ b/core/java/com/android/internal/os/WrapperInit.java
@@ -25,7 +25,6 @@
import android.system.StructCapUserHeader;
import android.util.BootTimingsTraceLog;
import android.util.Slog;
-import com.android.internal.os.Zygote.MethodAndArgsCaller;
import dalvik.system.VMRuntime;
import java.io.DataOutputStream;
import java.io.FileDescriptor;
@@ -61,37 +60,35 @@
* @param args The command-line arguments.
*/
public static void main(String[] args) {
- try {
- // Parse our mandatory arguments.
- int fdNum = Integer.parseInt(args[0], 10);
- int targetSdkVersion = Integer.parseInt(args[1], 10);
+ // Parse our mandatory arguments.
+ int fdNum = Integer.parseInt(args[0], 10);
+ int targetSdkVersion = Integer.parseInt(args[1], 10);
- // Tell the Zygote what our actual PID is (since it only knows about the
- // wrapper that it directly forked).
- if (fdNum != 0) {
- try {
- FileDescriptor fd = new FileDescriptor();
- fd.setInt$(fdNum);
- DataOutputStream os = new DataOutputStream(new FileOutputStream(fd));
- os.writeInt(Process.myPid());
- os.close();
- IoUtils.closeQuietly(fd);
- } catch (IOException ex) {
- Slog.d(TAG, "Could not write pid of wrapped process to Zygote pipe.", ex);
- }
+ // Tell the Zygote what our actual PID is (since it only knows about the
+ // wrapper that it directly forked).
+ if (fdNum != 0) {
+ try {
+ FileDescriptor fd = new FileDescriptor();
+ fd.setInt$(fdNum);
+ DataOutputStream os = new DataOutputStream(new FileOutputStream(fd));
+ os.writeInt(Process.myPid());
+ os.close();
+ IoUtils.closeQuietly(fd);
+ } catch (IOException ex) {
+ Slog.d(TAG, "Could not write pid of wrapped process to Zygote pipe.", ex);
}
-
- // Mimic system Zygote preloading.
- ZygoteInit.preload(new BootTimingsTraceLog("WrapperInitTiming",
- Trace.TRACE_TAG_DALVIK));
-
- // Launch the application.
- String[] runtimeArgs = new String[args.length - 2];
- System.arraycopy(args, 2, runtimeArgs, 0, runtimeArgs.length);
- WrapperInit.wrapperInit(targetSdkVersion, runtimeArgs);
- } catch (Zygote.MethodAndArgsCaller caller) {
- caller.run();
}
+
+ // Mimic system Zygote preloading.
+ ZygoteInit.preload(new BootTimingsTraceLog("WrapperInitTiming",
+ Trace.TRACE_TAG_DALVIK));
+
+ // Launch the application.
+ String[] runtimeArgs = new String[args.length - 2];
+ System.arraycopy(args, 2, runtimeArgs, 0, runtimeArgs.length);
+ Runnable r = wrapperInit(targetSdkVersion, runtimeArgs);
+
+ r.run();
}
/**
@@ -142,8 +139,7 @@
* @param targetSdkVersion target SDK version
* @param argv arg strings
*/
- private static void wrapperInit(int targetSdkVersion, String[] argv)
- throws Zygote.MethodAndArgsCaller {
+ private static Runnable wrapperInit(int targetSdkVersion, String[] argv) {
if (RuntimeInit.DEBUG) {
Slog.d(RuntimeInit.TAG, "RuntimeInit: Starting application from wrapper");
}
@@ -163,7 +159,9 @@
argv = removedArgs;
}
- RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader);
+ // Perform the same initialization that would happen after the Zygote forks.
+ Zygote.nativePreApplicationInit();
+ return RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader);
}
/**
diff --git a/core/java/com/android/internal/os/Zygote.java b/core/java/com/android/internal/os/Zygote.java
index 5eca496..a9350db 100644
--- a/core/java/com/android/internal/os/Zygote.java
+++ b/core/java/com/android/internal/os/Zygote.java
@@ -121,6 +121,11 @@
int[] fdsToIgnore, String instructionSet, String appDataDir);
/**
+ * Called to do any initialization before starting an application.
+ */
+ native static void nativePreApplicationInit();
+
+ /**
* Special method to start the system server process. In addition to the
* common actions performed in forkAndSpecialize, the pid of the child
* process is recorded such that the death of the child process will cause
@@ -216,39 +221,4 @@
command.append(" '").append(arg.replace("'", "'\\''")).append("'");
}
}
-
- /**
- * Helper exception class which holds a method and arguments and
- * can call them. This is used as part of a trampoline to get rid of
- * the initial process setup stack frames.
- */
- public static class MethodAndArgsCaller extends Exception
- implements Runnable {
- /** method to call */
- private final Method mMethod;
-
- /** argument array */
- private final String[] mArgs;
-
- public MethodAndArgsCaller(Method method, String[] args) {
- mMethod = method;
- mArgs = args;
- }
-
- public void run() {
- try {
- mMethod.invoke(null, new Object[] { mArgs });
- } catch (IllegalAccessException ex) {
- throw new RuntimeException(ex);
- } catch (InvocationTargetException ex) {
- Throwable cause = ex.getCause();
- if (cause instanceof RuntimeException) {
- throw (RuntimeException) cause;
- } else if (cause instanceof Error) {
- throw (Error) cause;
- }
- throw new RuntimeException(ex);
- }
- }
- }
}
diff --git a/core/java/com/android/internal/os/ZygoteConnection.java b/core/java/com/android/internal/os/ZygoteConnection.java
index f0c0b99..9fa3239 100644
--- a/core/java/com/android/internal/os/ZygoteConnection.java
+++ b/core/java/com/android/internal/os/ZygoteConnection.java
@@ -18,33 +18,35 @@
import static android.system.OsConstants.F_SETFD;
import static android.system.OsConstants.O_CLOEXEC;
+import static android.system.OsConstants.POLLIN;
import static android.system.OsConstants.STDERR_FILENO;
import static android.system.OsConstants.STDIN_FILENO;
import static android.system.OsConstants.STDOUT_FILENO;
+import static com.android.internal.os.ZygoteConnectionConstants.CONNECTION_TIMEOUT_MILLIS;
+import static com.android.internal.os.ZygoteConnectionConstants.MAX_ZYGOTE_ARGC;
+import static com.android.internal.os.ZygoteConnectionConstants.WRAPPED_PID_TIMEOUT_MILLIS;
import android.net.Credentials;
import android.net.LocalSocket;
import android.os.FactoryTest;
import android.os.Process;
-import android.os.SELinux;
import android.os.SystemProperties;
import android.os.Trace;
import android.system.ErrnoException;
import android.system.Os;
+import android.system.StructPollfd;
import android.util.Log;
import dalvik.system.VMRuntime;
import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
+import java.io.EOFException;
import java.io.FileDescriptor;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
-import java.io.PrintStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
-import java.util.Arrays;
import libcore.io.IoUtils;
/**
@@ -57,18 +59,6 @@
private static final int[][] intArray2d = new int[0][0];
/**
- * {@link android.net.LocalSocket#setSoTimeout} value for connections.
- * Effectively, the amount of time a requestor has between the start of
- * the request and the completed request. The select-loop mode Zygote
- * doesn't have the logic to return to the select loop in the middle of
- * a request, so we need to time out here to avoid being denial-of-serviced.
- */
- private static final int CONNECTION_TIMEOUT_MILLIS = 1000;
-
- /** max number of arguments that a connection can specify */
- private static final int MAX_ZYGOTE_ARGC = 1024;
-
- /**
* The command socket.
*
* mSocket is retained in the child process in "peer wait" mode, so
@@ -80,6 +70,7 @@
private final BufferedReader mSocketReader;
private final Credentials peer;
private final String abiList;
+ private boolean isEof;
/**
* Constructs instance from connected socket.
@@ -106,6 +97,8 @@
Log.e(TAG, "Cannot read peer credentials", ex);
throw ex;
}
+
+ isEof = false;
}
/**
@@ -118,21 +111,14 @@
}
/**
- * Reads one start command from the command socket. If successful,
- * a child is forked and a {@link Zygote.MethodAndArgsCaller}
- * exception is thrown in that child while in the parent process,
- * the method returns normally. On failure, the child is not
- * spawned and messages are printed to the log and stderr. Returns
- * a boolean status value indicating whether an end-of-file on the command
- * socket has been encountered.
+ * Reads one start command from the command socket. If successful, a child is forked and a
+ * {@code Runnable} that calls the childs main method (or equivalent) is returned in the child
+ * process. {@code null} is always returned in the parent process (the zygote).
*
- * @return false if command socket should continue to be read from, or
- * true if an end-of-file has been encountered.
- * @throws Zygote.MethodAndArgsCaller trampoline to invoke main()
- * method in child process
+ * If the client closes the socket, an {@code EOF} condition is set, which callers can test
+ * for by calling {@code ZygoteConnection.isClosedByPeer}.
*/
- boolean runOnce(ZygoteServer zygoteServer) throws Zygote.MethodAndArgsCaller {
-
+ Runnable processOneCommand(ZygoteServer zygoteServer) {
String args[];
Arguments parsedArgs = null;
FileDescriptor[] descriptors;
@@ -141,130 +127,120 @@
args = readArgumentList();
descriptors = mSocket.getAncillaryFileDescriptors();
} catch (IOException ex) {
- Log.w(TAG, "IOException on command socket " + ex.getMessage());
- closeSocket();
- return true;
+ throw new IllegalStateException("IOException on command socket", ex);
}
+ // readArgumentList returns null only when it has reached EOF with no available
+ // data to read. This will only happen when the remote socket has disconnected.
if (args == null) {
- // EOF reached.
- closeSocket();
- return true;
- }
-
- /** the stderr of the most recent request, if avail */
- PrintStream newStderr = null;
-
- if (descriptors != null && descriptors.length >= 3) {
- newStderr = new PrintStream(
- new FileOutputStream(descriptors[2]));
+ isEof = true;
+ return null;
}
int pid = -1;
FileDescriptor childPipeFd = null;
FileDescriptor serverPipeFd = null;
- try {
- parsedArgs = new Arguments(args);
+ parsedArgs = new Arguments(args);
- if (parsedArgs.abiListQuery) {
- return handleAbiListQuery();
- }
+ if (parsedArgs.abiListQuery) {
+ handleAbiListQuery();
+ return null;
+ }
- if (parsedArgs.preloadDefault) {
- return handlePreload();
- }
+ if (parsedArgs.preloadDefault) {
+ handlePreload();
+ return null;
+ }
- if (parsedArgs.preloadPackage != null) {
- return handlePreloadPackage(parsedArgs.preloadPackage,
- parsedArgs.preloadPackageLibs, parsedArgs.preloadPackageCacheKey);
- }
+ if (parsedArgs.preloadPackage != null) {
+ handlePreloadPackage(parsedArgs.preloadPackage, parsedArgs.preloadPackageLibs,
+ parsedArgs.preloadPackageCacheKey);
+ return null;
+ }
- if (parsedArgs.permittedCapabilities != 0 || parsedArgs.effectiveCapabilities != 0) {
- throw new ZygoteSecurityException("Client may not specify capabilities: " +
- "permitted=0x" + Long.toHexString(parsedArgs.permittedCapabilities) +
- ", effective=0x" + Long.toHexString(parsedArgs.effectiveCapabilities));
- }
+ if (parsedArgs.permittedCapabilities != 0 || parsedArgs.effectiveCapabilities != 0) {
+ throw new ZygoteSecurityException("Client may not specify capabilities: " +
+ "permitted=0x" + Long.toHexString(parsedArgs.permittedCapabilities) +
+ ", effective=0x" + Long.toHexString(parsedArgs.effectiveCapabilities));
+ }
- applyUidSecurityPolicy(parsedArgs, peer);
- applyInvokeWithSecurityPolicy(parsedArgs, peer);
+ applyUidSecurityPolicy(parsedArgs, peer);
+ applyInvokeWithSecurityPolicy(parsedArgs, peer);
- applyDebuggerSystemProperty(parsedArgs);
- applyInvokeWithSystemProperty(parsedArgs);
+ applyDebuggerSystemProperty(parsedArgs);
+ applyInvokeWithSystemProperty(parsedArgs);
- int[][] rlimits = null;
+ int[][] rlimits = null;
- if (parsedArgs.rlimits != null) {
- rlimits = parsedArgs.rlimits.toArray(intArray2d);
- }
+ if (parsedArgs.rlimits != null) {
+ rlimits = parsedArgs.rlimits.toArray(intArray2d);
+ }
- int[] fdsToIgnore = null;
+ int[] fdsToIgnore = null;
- if (parsedArgs.invokeWith != null) {
+ if (parsedArgs.invokeWith != null) {
+ try {
FileDescriptor[] pipeFds = Os.pipe2(O_CLOEXEC);
childPipeFd = pipeFds[1];
serverPipeFd = pipeFds[0];
Os.fcntlInt(childPipeFd, F_SETFD, 0);
- fdsToIgnore = new int[] { childPipeFd.getInt$(), serverPipeFd.getInt$() };
+ fdsToIgnore = new int[]{childPipeFd.getInt$(), serverPipeFd.getInt$()};
+ } catch (ErrnoException errnoEx) {
+ throw new IllegalStateException("Unable to set up pipe for invoke-with", errnoEx);
}
-
- /**
- * In order to avoid leaking descriptors to the Zygote child,
- * the native code must close the two Zygote socket descriptors
- * in the child process before it switches from Zygote-root to
- * the UID and privileges of the application being launched.
- *
- * In order to avoid "bad file descriptor" errors when the
- * two LocalSocket objects are closed, the Posix file
- * descriptors are released via a dup2() call which closes
- * the socket and substitutes an open descriptor to /dev/null.
- */
-
- int [] fdsToClose = { -1, -1 };
-
- FileDescriptor fd = mSocket.getFileDescriptor();
-
- if (fd != null) {
- fdsToClose[0] = fd.getInt$();
- }
-
- fd = zygoteServer.getServerSocketFileDescriptor();
-
- if (fd != null) {
- fdsToClose[1] = fd.getInt$();
- }
-
- fd = null;
-
- pid = Zygote.forkAndSpecialize(parsedArgs.uid, parsedArgs.gid, parsedArgs.gids,
- parsedArgs.debugFlags, rlimits, parsedArgs.mountExternal, parsedArgs.seInfo,
- parsedArgs.niceName, fdsToClose, fdsToIgnore, parsedArgs.instructionSet,
- parsedArgs.appDataDir);
- } catch (ErrnoException ex) {
- logAndPrintError(newStderr, "Exception creating pipe", ex);
- } catch (IllegalArgumentException ex) {
- logAndPrintError(newStderr, "Invalid zygote arguments", ex);
- } catch (ZygoteSecurityException ex) {
- logAndPrintError(newStderr,
- "Zygote security policy prevents request: ", ex);
}
+ /**
+ * In order to avoid leaking descriptors to the Zygote child,
+ * the native code must close the two Zygote socket descriptors
+ * in the child process before it switches from Zygote-root to
+ * the UID and privileges of the application being launched.
+ *
+ * In order to avoid "bad file descriptor" errors when the
+ * two LocalSocket objects are closed, the Posix file
+ * descriptors are released via a dup2() call which closes
+ * the socket and substitutes an open descriptor to /dev/null.
+ */
+
+ int [] fdsToClose = { -1, -1 };
+
+ FileDescriptor fd = mSocket.getFileDescriptor();
+
+ if (fd != null) {
+ fdsToClose[0] = fd.getInt$();
+ }
+
+ fd = zygoteServer.getServerSocketFileDescriptor();
+
+ if (fd != null) {
+ fdsToClose[1] = fd.getInt$();
+ }
+
+ fd = null;
+
+ pid = Zygote.forkAndSpecialize(parsedArgs.uid, parsedArgs.gid, parsedArgs.gids,
+ parsedArgs.debugFlags, rlimits, parsedArgs.mountExternal, parsedArgs.seInfo,
+ parsedArgs.niceName, fdsToClose, fdsToIgnore, parsedArgs.instructionSet,
+ parsedArgs.appDataDir);
+
try {
if (pid == 0) {
// in child
+ zygoteServer.setForkChild();
+
zygoteServer.closeServerSocket();
IoUtils.closeQuietly(serverPipeFd);
serverPipeFd = null;
- handleChildProc(parsedArgs, descriptors, childPipeFd, newStderr);
- // should never get here, the child is expected to either
- // throw Zygote.MethodAndArgsCaller or exec().
- return true;
+ return handleChildProc(parsedArgs, descriptors, childPipeFd);
} else {
- // in parent...pid of < 0 means failure
+ // In the parent. A pid < 0 indicates a failure and will be handled in
+ // handleParentProc.
IoUtils.closeQuietly(childPipeFd);
childPipeFd = null;
- return handleParentProc(pid, descriptors, serverPipeFd, parsedArgs);
+ handleParentProc(pid, descriptors, serverPipeFd);
+ return null;
}
} finally {
IoUtils.closeQuietly(childPipeFd);
@@ -272,15 +248,13 @@
}
}
- private boolean handleAbiListQuery() {
+ private void handleAbiListQuery() {
try {
final byte[] abiListBytes = abiList.getBytes(StandardCharsets.US_ASCII);
mSocketOutStream.writeInt(abiListBytes.length);
mSocketOutStream.write(abiListBytes);
- return false;
} catch (IOException ioe) {
- Log.e(TAG, "Error writing to command socket", ioe);
- return true;
+ throw new IllegalStateException("Error writing to command socket", ioe);
}
}
@@ -290,7 +264,7 @@
* if no preload was initiated. The latter implies that the zygote is not configured to load
* resources lazy or that the zygote has already handled a previous request to handlePreload.
*/
- private boolean handlePreload() {
+ private void handlePreload() {
try {
if (isPreloadComplete()) {
mSocketOutStream.writeInt(1);
@@ -298,11 +272,8 @@
preload();
mSocketOutStream.writeInt(0);
}
-
- return false;
} catch (IOException ioe) {
- Log.e(TAG, "Error writing to command socket", ioe);
- return true;
+ throw new IllegalStateException("Error writing to command socket", ioe);
}
}
@@ -318,7 +289,7 @@
return mSocketOutStream;
}
- protected boolean handlePreloadPackage(String packagePath, String libsPath, String cacheKey) {
+ protected void handlePreloadPackage(String packagePath, String libsPath, String cacheKey) {
throw new RuntimeException("Zyogte does not support package preloading");
}
@@ -334,6 +305,10 @@
}
}
+ boolean isClosedByPeer() {
+ return isEof;
+ }
+
/**
* Handles argument parsing for args related to the zygote spawner.
*
@@ -781,15 +756,9 @@
* @param parsedArgs non-null; zygote args
* @param descriptors null-ok; new file descriptors for stdio if available.
* @param pipeFd null-ok; pipe for communication back to Zygote.
- * @param newStderr null-ok; stream to use for stderr until stdio
- * is reopened.
- *
- * @throws Zygote.MethodAndArgsCaller on success to
- * trampoline to code that invokes static main.
*/
- private void handleChildProc(Arguments parsedArgs,
- FileDescriptor[] descriptors, FileDescriptor pipeFd, PrintStream newStderr)
- throws Zygote.MethodAndArgsCaller {
+ private Runnable handleChildProc(Arguments parsedArgs, FileDescriptor[] descriptors,
+ FileDescriptor pipeFd) {
/**
* By the time we get here, the native code has closed the two actual Zygote
* socket connections, and substituted /dev/null in their place. The LocalSocket
@@ -806,7 +775,6 @@
for (FileDescriptor fd: descriptors) {
IoUtils.closeQuietly(fd);
}
- newStderr = System.err;
} catch (ErrnoException ex) {
Log.e(TAG, "Error reopening stdio", ex);
}
@@ -823,9 +791,12 @@
parsedArgs.niceName, parsedArgs.targetSdkVersion,
VMRuntime.getCurrentInstructionSet(),
pipeFd, parsedArgs.remainingArgs);
+
+ // Should not get here.
+ throw new IllegalStateException("WrapperInit.execApplication unexpectedly returned");
} else {
- ZygoteInit.zygoteInit(parsedArgs.targetSdkVersion,
- parsedArgs.remainingArgs, null /* classLoader */);
+ return ZygoteInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs,
+ null /* classLoader */);
}
}
@@ -837,13 +808,8 @@
* @param descriptors null-ok; file descriptors for child's new stdio if
* specified.
* @param pipeFd null-ok; pipe for communication with child.
- * @param parsedArgs non-null; zygote args
- * @return true for "exit command loop" and false for "continue command
- * loop"
*/
- private boolean handleParentProc(int pid,
- FileDescriptor[] descriptors, FileDescriptor pipeFd, Arguments parsedArgs) {
-
+ private void handleParentProc(int pid, FileDescriptor[] descriptors, FileDescriptor pipeFd) {
if (pid > 0) {
setChildPgid(pid);
}
@@ -856,17 +822,60 @@
boolean usingWrapper = false;
if (pipeFd != null && pid > 0) {
- DataInputStream is = new DataInputStream(new FileInputStream(pipeFd));
int innerPid = -1;
try {
- innerPid = is.readInt();
- } catch (IOException ex) {
- Log.w(TAG, "Error reading pid from wrapped process, child may have died", ex);
- } finally {
- try {
- is.close();
- } catch (IOException ex) {
+ // Do a busy loop here. We can't guarantee that a failure (and thus an exception
+ // bail) happens in a timely manner.
+ final int BYTES_REQUIRED = 4; // Bytes in an int.
+
+ StructPollfd fds[] = new StructPollfd[] {
+ new StructPollfd()
+ };
+
+ byte data[] = new byte[BYTES_REQUIRED];
+
+ int remainingSleepTime = WRAPPED_PID_TIMEOUT_MILLIS;
+ int dataIndex = 0;
+ long startTime = System.nanoTime();
+
+ while (dataIndex < data.length && remainingSleepTime > 0) {
+ fds[0].fd = pipeFd;
+ fds[0].events = (short) POLLIN;
+ fds[0].revents = 0;
+ fds[0].userData = null;
+
+ int res = android.system.Os.poll(fds, remainingSleepTime);
+ long endTime = System.nanoTime();
+ int elapsedTimeMs = (int)((endTime - startTime) / 1000000l);
+ remainingSleepTime = WRAPPED_PID_TIMEOUT_MILLIS - elapsedTimeMs;
+
+ if (res > 0) {
+ if ((fds[0].revents & POLLIN) != 0) {
+ // Only read one byte, so as not to block.
+ int readBytes = android.system.Os.read(pipeFd, data, dataIndex, 1);
+ if (readBytes < 0) {
+ throw new RuntimeException("Some error");
+ }
+ dataIndex += readBytes;
+ } else {
+ // Error case. revents should contain one of the error bits.
+ break;
+ }
+ } else if (res == 0) {
+ Log.w(TAG, "Timed out waiting for child.");
+ }
}
+
+ if (dataIndex == data.length) {
+ DataInputStream is = new DataInputStream(new ByteArrayInputStream(data));
+ innerPid = is.readInt();
+ }
+
+ if (innerPid == -1) {
+ Log.w(TAG, "Error reading pid from wrapped process, child may have died");
+ }
+ } catch (Exception ex) {
+ Log.w(TAG, "Error reading pid from wrapped process, child may have died", ex);
}
// Ensure that the pid reported by the wrapped process is either the
@@ -892,11 +901,8 @@
mSocketOutStream.writeInt(pid);
mSocketOutStream.writeBoolean(usingWrapper);
} catch (IOException ex) {
- Log.e(TAG, "Error writing to command socket", ex);
- return true;
+ throw new IllegalStateException("Error writing to command socket", ex);
}
-
- return false;
}
private void setChildPgid(int pid) {
@@ -912,20 +918,4 @@
+ "normal if peer is not in our session");
}
}
-
- /**
- * Logs an error message and prints it to the specified stream, if
- * provided
- *
- * @param newStderr null-ok; a standard error stream
- * @param message non-null; error message
- * @param ex null-ok an exception
- */
- private static void logAndPrintError (PrintStream newStderr,
- String message, Throwable ex) {
- Log.e(TAG, message, ex);
- if (newStderr != null) {
- newStderr.println(message + (ex == null ? "" : ex));
- }
- }
}
diff --git a/core/java/com/android/internal/os/ZygoteConnectionConstants.java b/core/java/com/android/internal/os/ZygoteConnectionConstants.java
new file mode 100644
index 0000000..506e39f
--- /dev/null
+++ b/core/java/com/android/internal/os/ZygoteConnectionConstants.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.os;
+
+/**
+ * Sharable zygote constants.
+ *
+ * @hide
+ */
+public class ZygoteConnectionConstants {
+ /**
+ * {@link android.net.LocalSocket#setSoTimeout} value for connections.
+ * Effectively, the amount of time a requestor has between the start of
+ * the request and the completed request. The select-loop mode Zygote
+ * doesn't have the logic to return to the select loop in the middle of
+ * a request, so we need to time out here to avoid being denial-of-serviced.
+ */
+ public static final int CONNECTION_TIMEOUT_MILLIS = 1000;
+
+ /** max number of arguments that a connection can specify */
+ public static final int MAX_ZYGOTE_ARGC = 1024;
+
+ /**
+ * Wait time for a wrapped app to report back its pid.
+ *
+ * We'll wait up to thirty seconds. This should give enough time for the fork
+ * to go through, but not to trigger the watchdog in the system server (by default
+ * sixty seconds).
+ *
+ * WARNING: This may trigger the watchdog in debug mode. However, to support
+ * wrapping on lower-end devices we do not have much choice.
+ */
+ public static final int WRAPPED_PID_TIMEOUT_MILLIS = 30000;
+}
diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java
index 21cf95f..948f203 100644
--- a/core/java/com/android/internal/os/ZygoteInit.java
+++ b/core/java/com/android/internal/os/ZygoteInit.java
@@ -24,7 +24,6 @@
import android.icu.impl.CacheValue;
import android.icu.text.DecimalFormatSymbols;
import android.icu.util.ULocale;
-import android.net.LocalServerSocket;
import android.opengl.EGL14;
import android.os.Build;
import android.os.IInstalld;
@@ -451,10 +450,7 @@
/**
* Finish remaining work for the newly forked system server process.
*/
- private static void handleSystemServerProcess(
- ZygoteConnection.Arguments parsedArgs)
- throws Zygote.MethodAndArgsCaller {
-
+ private static Runnable handleSystemServerProcess(ZygoteConnection.Arguments parsedArgs) {
// set umask to 0077 so new files and directories will default to owner-only permissions.
Os.umask(S_IRWXG | S_IRWXO);
@@ -500,6 +496,8 @@
WrapperInit.execApplication(parsedArgs.invokeWith,
parsedArgs.niceName, parsedArgs.targetSdkVersion,
VMRuntime.getCurrentInstructionSet(), null, args);
+
+ throw new IllegalStateException("Unexpected return from WrapperInit.execApplication");
} else {
ClassLoader cl = null;
if (systemServerClasspath != null) {
@@ -511,7 +509,7 @@
/*
* Pass the remaining arguments to SystemServer.
*/
- ZygoteInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl);
+ return ZygoteInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl);
}
/* should never reach here */
@@ -522,15 +520,12 @@
* namespace, i.e., this classloader can access platform-private native libraries. The
* classloader will use java.library.path as the native library path.
*/
- static PathClassLoader createPathClassLoader(String classPath, int targetSdkVersion) {
- String libraryPath = System.getProperty("java.library.path");
+ static ClassLoader createPathClassLoader(String classPath, int targetSdkVersion) {
+ String libraryPath = System.getProperty("java.library.path");
- return PathClassLoaderFactory.createClassLoader(classPath,
- libraryPath,
- libraryPath,
- ClassLoader.getSystemClassLoader(),
- targetSdkVersion,
- true /* isNamespaceShared */);
+ return ClassLoaderFactory.createClassLoader(classPath, libraryPath, libraryPath,
+ ClassLoader.getSystemClassLoader(), targetSdkVersion, true /* isNamespaceShared */,
+ null /* classLoaderName */);
}
/**
@@ -543,17 +538,18 @@
.asInterface(ServiceManager.getService("installd"));
final String instructionSet = VMRuntime.getRuntime().vmInstructionSet();
- String sharedLibraries = "";
+ String classPathForElement = "";
for (String classPathElement : classPathElements) {
// System server is fully AOTed and never profiled
// for profile guided compilation.
- // TODO: Make this configurable between INTERPRET_ONLY, SPEED, SPACE and EVERYTHING?
+ String systemServerFilter = SystemProperties.get(
+ "dalvik.vm.systemservercompilerfilter", "speed");
int dexoptNeeded;
try {
dexoptNeeded = DexFile.getDexOptNeeded(
- classPathElement, instructionSet, "speed",
- false /* newProfile */);
+ classPathElement, instructionSet, systemServerFilter,
+ false /* newProfile */, false /* downgrade */);
} catch (FileNotFoundException ignored) {
// Do not add to the classpath.
Log.w(TAG, "Missing classpath element for system server: " + classPathElement);
@@ -571,13 +567,15 @@
final String packageName = "*";
final String outputPath = null;
final int dexFlags = 0;
- final String compilerFilter = "speed";
+ final String compilerFilter = systemServerFilter;
final String uuid = StorageManager.UUID_PRIVATE_INTERNAL;
final String seInfo = null;
+ final String classLoaderContext =
+ getSystemServerClassLoaderContext(classPathForElement);
try {
installd.dexopt(classPathElement, Process.SYSTEM_UID, packageName,
instructionSet, dexoptNeeded, outputPath, dexFlags, compilerFilter,
- uuid, sharedLibraries, seInfo);
+ uuid, classLoaderContext, seInfo, false /* downgrade */);
} catch (RemoteException | ServiceSpecificException e) {
// Ignore (but log), we need this on the classpath for fallback mode.
Log.w(TAG, "Failed compiling classpath element for system server: "
@@ -585,18 +583,43 @@
}
}
- if (!sharedLibraries.isEmpty()) {
- sharedLibraries += ":";
- }
- sharedLibraries += classPathElement;
+ classPathForElement = encodeSystemServerClassPath(
+ classPathForElement, classPathElement);
}
}
/**
- * Prepare the arguments and fork for the system server process.
+ * Encodes the system server class loader context in a format that is accepted by dexopt.
+ * This assumes the system server is always loaded with a {@link dalvik.system.PathClassLoader}.
+ *
+ * Note that ideally we would use the {@code DexoptUtils} to compute this. However we have no
+ * dependency here on the server so we hard code the logic again.
*/
- private static boolean startSystemServer(String abiList, String socketName, ZygoteServer zygoteServer)
- throws Zygote.MethodAndArgsCaller, RuntimeException {
+ private static String getSystemServerClassLoaderContext(String classPath) {
+ return classPath == null ? "PCL[]" : "PCL[" + classPath + "]";
+ }
+
+ /**
+ * Encodes the class path in a format accepted by dexopt.
+ * @param classPath the old class path (may be empty).
+ * @param newElement the new class path elements
+ * @return the class path encoding resulted from appending {@code newElement} to
+ * {@code classPath}.
+ */
+ private static String encodeSystemServerClassPath(String classPath, String newElement) {
+ return (classPath == null || classPath.isEmpty())
+ ? newElement
+ : classPath + ":" + newElement;
+ }
+
+ /**
+ * Prepare the arguments and forks for the system server process.
+ *
+ * Returns an {@code Runnable} that provides an entrypoint into system_server code in the
+ * child process, and {@code null} in the parent.
+ */
+ private static Runnable forkSystemServer(String abiList, String socketName,
+ ZygoteServer zygoteServer) {
long capabilities = posixCapabilitiesAsBits(
OsConstants.CAP_IPC_LOCK,
OsConstants.CAP_KILL,
@@ -653,10 +676,10 @@
}
zygoteServer.closeServerSocket();
- handleSystemServerProcess(parsedArgs);
+ return handleSystemServerProcess(parsedArgs);
}
- return true;
+ return null;
}
/**
@@ -687,6 +710,7 @@
throw new RuntimeException("Failed to setpgid(0,0)", ex);
}
+ final Runnable caller;
try {
// Report Zygote start time to tron unless it is a runtime restart
if (!"1".equals(SystemProperties.get("sys.boot_completed"))) {
@@ -699,8 +723,6 @@
Trace.TRACE_TAG_DALVIK);
bootTimingsTraceLog.traceBegin("ZygoteInit");
RuntimeInit.enableDdms();
- // Start profiling the zygote initialization.
- SamplingProfilerIntegration.start();
boolean startSystemServer = false;
String socketName = "zygote";
@@ -739,9 +761,6 @@
Zygote.resetNicePriority();
}
- // Finish profiling the zygote initialization.
- SamplingProfilerIntegration.writeZygoteSnapshot();
-
// Do an initial gc to clean up after startup
bootTimingsTraceLog.traceBegin("PostZygoteInitGC");
gcAndFinalize();
@@ -761,19 +780,32 @@
ZygoteHooks.stopZygoteNoThreadCreation();
if (startSystemServer) {
- startSystemServer(abiList, socketName, zygoteServer);
+ Runnable r = forkSystemServer(abiList, socketName, zygoteServer);
+
+ // {@code r == null} in the parent (zygote) process, and {@code r != null} in the
+ // child (system_server) process.
+ if (r != null) {
+ r.run();
+ return;
+ }
}
Log.i(TAG, "Accepting command socket connections");
- zygoteServer.runSelectLoop(abiList);
- zygoteServer.closeServerSocket();
- } catch (Zygote.MethodAndArgsCaller caller) {
- caller.run();
+ // The select loop returns early in the child process after a fork and
+ // loops forever in the zygote.
+ caller = zygoteServer.runSelectLoop(abiList);
} catch (Throwable ex) {
Log.e(TAG, "System zygote died with exception", ex);
- zygoteServer.closeServerSocket();
throw ex;
+ } finally {
+ zygoteServer.closeServerSocket();
+ }
+
+ // We're in the child process and have exited the select loop. Proceed to execute the
+ // command.
+ if (caller != null) {
+ caller.run();
}
}
@@ -817,8 +849,7 @@
* @param targetSdkVersion target SDK version
* @param argv arg strings
*/
- public static final void zygoteInit(int targetSdkVersion, String[] argv,
- ClassLoader classLoader) throws Zygote.MethodAndArgsCaller {
+ public static final Runnable zygoteInit(int targetSdkVersion, String[] argv, ClassLoader classLoader) {
if (RuntimeInit.DEBUG) {
Slog.d(RuntimeInit.TAG, "RuntimeInit: Starting application from zygote");
}
@@ -828,7 +859,7 @@
RuntimeInit.commonInit();
ZygoteInit.nativeZygoteInit();
- RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader);
+ return RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader);
}
private static final native void nativeZygoteInit();
diff --git a/core/java/com/android/internal/os/ZygoteServer.java b/core/java/com/android/internal/os/ZygoteServer.java
index 126d9e7..8baa15a 100644
--- a/core/java/com/android/internal/os/ZygoteServer.java
+++ b/core/java/com/android/internal/os/ZygoteServer.java
@@ -25,6 +25,7 @@
import android.system.StructPollfd;
import android.util.Log;
+import android.util.Slog;
import java.io.IOException;
import java.io.FileDescriptor;
import java.util.ArrayList;
@@ -45,9 +46,18 @@
private LocalServerSocket mServerSocket;
+ /**
+ * Set by the child process, immediately after a call to {@code Zygote.forkAndSpecialize}.
+ */
+ private boolean mIsForkChild;
+
ZygoteServer() {
}
+ void setForkChild() {
+ mIsForkChild = true;
+ }
+
/**
* Registers a server socket for zygote command connections
*
@@ -129,11 +139,8 @@
* Runs the zygote process's select loop. Accepts new connections as
* they happen, and reads commands from connections one spawn-request's
* worth at a time.
- *
- * @throws Zygote.MethodAndArgsCaller in a child process when a main()
- * should be executed.
*/
- void runSelectLoop(String abiList) throws Zygote.MethodAndArgsCaller {
+ Runnable runSelectLoop(String abiList) {
ArrayList<FileDescriptor> fds = new ArrayList<FileDescriptor>();
ArrayList<ZygoteConnection> peers = new ArrayList<ZygoteConnection>();
@@ -156,15 +163,62 @@
if ((pollFds[i].revents & POLLIN) == 0) {
continue;
}
+
if (i == 0) {
ZygoteConnection newPeer = acceptCommandPeer(abiList);
peers.add(newPeer);
fds.add(newPeer.getFileDesciptor());
} else {
- boolean done = peers.get(i).runOnce(this);
- if (done) {
- peers.remove(i);
- fds.remove(i);
+ try {
+ ZygoteConnection connection = peers.get(i);
+ final Runnable command = connection.processOneCommand(this);
+
+ if (mIsForkChild) {
+ // We're in the child. We should always have a command to run at this
+ // stage if processOneCommand hasn't called "exec".
+ if (command == null) {
+ throw new IllegalStateException("command == null");
+ }
+
+ return command;
+ } else {
+ // We're in the server - we should never have any commands to run.
+ if (command != null) {
+ throw new IllegalStateException("command != null");
+ }
+
+ // We don't know whether the remote side of the socket was closed or
+ // not until we attempt to read from it from processOneCommand. This shows up as
+ // a regular POLLIN event in our regular processing loop.
+ if (connection.isClosedByPeer()) {
+ connection.closeSocket();
+ peers.remove(i);
+ fds.remove(i);
+ }
+ }
+ } catch (Exception e) {
+ if (!mIsForkChild) {
+ // We're in the server so any exception here is one that has taken place
+ // pre-fork while processing commands or reading / writing from the
+ // control socket. Make a loud noise about any such exceptions so that
+ // we know exactly what failed and why.
+
+ Slog.e(TAG, "Exception executing zygote command: ", e);
+
+ // Make sure the socket is closed so that the other end knows immediately
+ // that something has gone wrong and doesn't time out waiting for a
+ // response.
+ ZygoteConnection conn = peers.remove(i);
+ conn.closeSocket();
+
+ fds.remove(i);
+ } else {
+ // We're in the child so any exception caught here has happened post
+ // fork and before we execute ActivityThread.main (or any other main()
+ // method). Log the details of the exception and bring down the process.
+ Log.e(TAG, "Caught post-fork exception in child process.", e);
+ throw e;
+ }
}
}
}
diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl
index 40ecc8c..45a8654 100644
--- a/core/java/com/android/internal/statusbar/IStatusBar.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl
@@ -32,6 +32,7 @@
void animateExpandNotificationsPanel();
void animateExpandSettingsPanel(String subPanel);
void animateCollapsePanels();
+ void togglePanel();
/**
* Notifies the status bar of a System UI visibility flag change.
diff --git a/core/java/com/android/internal/statusbar/IStatusBarService.aidl b/core/java/com/android/internal/statusbar/IStatusBarService.aidl
index 22eef07..82eb1ab 100644
--- a/core/java/com/android/internal/statusbar/IStatusBarService.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBarService.aidl
@@ -31,6 +31,7 @@
{
void expandNotificationsPanel();
void collapsePanels();
+ void togglePanel();
void disable(int what, IBinder token, String pkg);
void disableForUser(int what, IBinder token, String pkg, int userId);
void disable2(int what, IBinder token, String pkg);
diff --git a/core/java/com/android/internal/textservice/ITextServicesManager.aidl b/core/java/com/android/internal/textservice/ITextServicesManager.aidl
index 4882a12..c5940ba 100644
--- a/core/java/com/android/internal/textservice/ITextServicesManager.aidl
+++ b/core/java/com/android/internal/textservice/ITextServicesManager.aidl
@@ -36,9 +36,6 @@
in ITextServicesSessionListener tsListener,
in ISpellCheckerSessionListener scListener, in Bundle bundle);
oneway void finishSpellCheckerService(in ISpellCheckerSessionListener listener);
- oneway void setCurrentSpellChecker(String locale, String sciId);
- oneway void setCurrentSpellCheckerSubtype(String locale, int hashCode);
- oneway void setSpellCheckerEnabled(boolean enabled);
boolean isSpellCheckerEnabled();
SpellCheckerInfo[] getEnabledSpellCheckers();
}
diff --git a/core/java/com/android/internal/util/AsyncChannel.java b/core/java/com/android/internal/util/AsyncChannel.java
index d8be9fd..e760f25 100644
--- a/core/java/com/android/internal/util/AsyncChannel.java
+++ b/core/java/com/android/internal/util/AsyncChannel.java
@@ -402,7 +402,6 @@
// Initialize destination fields
mDstMessenger = dstMessenger;
- linkToDeathMonitor();
if (DBG) log("connected srcHandler to the dstMessenger X");
}
@@ -768,9 +767,10 @@
/** Handle of the reply message */
@Override
public void handleMessage(Message msg) {
- mResultMsg = Message.obtain();
- mResultMsg.copyFrom(msg);
+ Message msgCopy = Message.obtain();
+ msgCopy.copyFrom(msg);
synchronized(mLockObject) {
+ mResultMsg = msgCopy;
mLockObject.notify();
}
}
@@ -812,22 +812,26 @@
*/
private static Message sendMessageSynchronously(Messenger dstMessenger, Message msg) {
SyncMessenger sm = SyncMessenger.obtain();
+ Message resultMsg = null;
try {
if (dstMessenger != null && msg != null) {
msg.replyTo = sm.mMessenger;
synchronized (sm.mHandler.mLockObject) {
+ if (sm.mHandler.mResultMsg != null) {
+ Slog.wtf(TAG, "mResultMsg should be null here");
+ sm.mHandler.mResultMsg = null;
+ }
dstMessenger.send(msg);
sm.mHandler.mLockObject.wait();
+ resultMsg = sm.mHandler.mResultMsg;
+ sm.mHandler.mResultMsg = null;
}
- } else {
- sm.mHandler.mResultMsg = null;
}
} catch (InterruptedException e) {
- sm.mHandler.mResultMsg = null;
+ Slog.e(TAG, "error in sendMessageSynchronously", e);
} catch (RemoteException e) {
- sm.mHandler.mResultMsg = null;
+ Slog.e(TAG, "error in sendMessageSynchronously", e);
}
- Message resultMsg = sm.mHandler.mResultMsg;
sm.recycle();
return resultMsg;
}
diff --git a/core/java/com/android/internal/util/CollectionUtils.java b/core/java/com/android/internal/util/CollectionUtils.java
index 1f84061..dbb6e93 100644
--- a/core/java/com/android/internal/util/CollectionUtils.java
+++ b/core/java/com/android/internal/util/CollectionUtils.java
@@ -20,13 +20,17 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.util.ArraySet;
+import android.util.ExceptionUtils;
+
+import com.android.internal.util.FunctionalUtils.ThrowingConsumer;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Set;
-import java.util.function.Function;
+import java.util.function.*;
import java.util.stream.Stream;
/**
@@ -57,6 +61,32 @@
}
/**
+ * @see #filter(List, java.util.function.Predicate)
+ */
+ public static @NonNull <T> Set<T> filter(@Nullable Set<T> set,
+ java.util.function.Predicate<? super T> predicate) {
+ if (set == null || set.size() == 0) return Collections.emptySet();
+ ArraySet<T> result = null;
+ if (set instanceof ArraySet) {
+ ArraySet<T> arraySet = (ArraySet<T>) set;
+ int size = arraySet.size();
+ for (int i = 0; i < size; i++) {
+ final T item = arraySet.valueAt(i);
+ if (predicate.test(item)) {
+ result = ArrayUtils.add(result, item);
+ }
+ }
+ } else {
+ for (T item : set) {
+ if (predicate.test(item)) {
+ result = ArrayUtils.add(result, item);
+ }
+ }
+ }
+ return emptyIfNull(result);
+ }
+
+ /**
* Returns a list of items resulting from applying the given function to each element of the
* provided list.
*
@@ -76,6 +106,27 @@
}
/**
+ * @see #map(List, Function)
+ */
+ public static @NonNull <I, O> Set<O> map(@Nullable Set<I> cur,
+ Function<? super I, ? extends O> f) {
+ if (isEmpty(cur)) return Collections.emptySet();
+ ArraySet<O> result = new ArraySet<>();
+ if (cur instanceof ArraySet) {
+ ArraySet<I> arraySet = (ArraySet<I>) cur;
+ int size = arraySet.size();
+ for (int i = 0; i < size; i++) {
+ result.add(f.apply(arraySet.valueAt(i)));
+ }
+ } else {
+ for (I item : cur) {
+ result.add(f.apply(item));
+ }
+ }
+ return result;
+ }
+
+ /**
* {@link #map(List, Function)} + {@link #filter(List, java.util.function.Predicate)}
*
* Calling this is equivalent (but more memory efficient) to:
@@ -179,6 +230,17 @@
}
/**
+ * @see #add(List, Object)
+ */
+ public static @NonNull <T> Set<T> add(@Nullable Set<T> cur, T val) {
+ if (cur == null || cur == Collections.emptySet()) {
+ cur = new ArraySet<>();
+ }
+ cur.add(val);
+ return cur;
+ }
+
+ /**
* Similar to {@link List#remove}, but with support for list values of {@code null} and
* {@link Collections#emptyList}
*/
@@ -191,9 +253,52 @@
}
/**
+ * @see #remove(List, Object)
+ */
+ public static @NonNull <T> Set<T> remove(@Nullable Set<T> cur, T val) {
+ if (isEmpty(cur)) {
+ return emptyIfNull(cur);
+ }
+ cur.remove(val);
+ return cur;
+ }
+
+ /**
* @return a list that will not be affected by mutations to the given original list.
*/
public static @NonNull <T> List<T> copyOf(@Nullable List<T> cur) {
return isEmpty(cur) ? Collections.emptyList() : new ArrayList<>(cur);
}
+
+ /**
+ * @return a list that will not be affected by mutations to the given original list.
+ */
+ public static @NonNull <T> Set<T> copyOf(@Nullable Set<T> cur) {
+ return isEmpty(cur) ? Collections.emptySet() : new ArraySet<>(cur);
+ }
+
+ /**
+ * Applies {@code action} to each element in {@code cur}
+ *
+ * This avoids creating an iterator if the given set is an {@link ArraySet}
+ */
+ public static <T> void forEach(@Nullable Set<T> cur, @Nullable ThrowingConsumer<T> action) {
+ if (cur == null || action == null) return;
+ int size = cur.size();
+ if (size == 0) return;
+ try {
+ if (cur instanceof ArraySet) {
+ ArraySet<T> arraySet = (ArraySet<T>) cur;
+ for (int i = 0; i < size; i++) {
+ action.accept(arraySet.valueAt(i));
+ }
+ } else {
+ for (T t : cur) {
+ action.accept(t);
+ }
+ }
+ } catch (Exception e) {
+ throw ExceptionUtils.propagate(e);
+ }
+ }
}
diff --git a/core/java/com/android/internal/util/FastXmlSerializer.java b/core/java/com/android/internal/util/FastXmlSerializer.java
index 3c1d2d6..b85b84f 100644
--- a/core/java/com/android/internal/util/FastXmlSerializer.java
+++ b/core/java/com/android/internal/util/FastXmlSerializer.java
@@ -49,18 +49,19 @@
null, null, null, null, "<", null, ">", null, // 56-63
};
- private static final int BUFFER_LEN = 8192;
+ private static final int DEFAULT_BUFFER_LEN = 32*1024;
private static String sSpace = " ";
- private final char[] mText = new char[BUFFER_LEN];
+ private final int mBufferLen;
+ private final char[] mText;
private int mPos;
private Writer mWriter;
private OutputStream mOutputStream;
private CharsetEncoder mCharset;
- private ByteBuffer mBytes = ByteBuffer.allocate(BUFFER_LEN);
+ private ByteBuffer mBytes;
private boolean mIndent = false;
private boolean mInTag;
@@ -68,9 +69,25 @@
private int mNesting = 0;
private boolean mLineStart = true;
+ public FastXmlSerializer() {
+ this(DEFAULT_BUFFER_LEN);
+ }
+
+ /**
+ * Allocate a FastXmlSerializer with the given internal output buffer size. If the
+ * size is zero or negative, then the default buffer size will be used.
+ *
+ * @param bufferSize Size in bytes of the in-memory output buffer that the writer will use.
+ */
+ public FastXmlSerializer(int bufferSize) {
+ mBufferLen = (bufferSize > 0) ? bufferSize : DEFAULT_BUFFER_LEN;
+ mText = new char[mBufferLen];
+ mBytes = ByteBuffer.allocate(mBufferLen);
+ }
+
private void append(char c) throws IOException {
int pos = mPos;
- if (pos >= (BUFFER_LEN-1)) {
+ if (pos >= (mBufferLen-1)) {
flush();
pos = mPos;
}
@@ -79,17 +96,17 @@
}
private void append(String str, int i, final int length) throws IOException {
- if (length > BUFFER_LEN) {
+ if (length > mBufferLen) {
final int end = i + length;
while (i < end) {
- int next = i + BUFFER_LEN;
- append(str, i, next<end ? BUFFER_LEN : (end-i));
+ int next = i + mBufferLen;
+ append(str, i, next<end ? mBufferLen : (end-i));
i = next;
}
return;
}
int pos = mPos;
- if ((pos+length) > BUFFER_LEN) {
+ if ((pos+length) > mBufferLen) {
flush();
pos = mPos;
}
@@ -98,17 +115,17 @@
}
private void append(char[] buf, int i, final int length) throws IOException {
- if (length > BUFFER_LEN) {
+ if (length > mBufferLen) {
final int end = i + length;
while (i < end) {
- int next = i + BUFFER_LEN;
- append(buf, i, next<end ? BUFFER_LEN : (end-i));
+ int next = i + mBufferLen;
+ append(buf, i, next<end ? mBufferLen : (end-i));
i = next;
}
return;
}
int pos = mPos;
- if ((pos+length) > BUFFER_LEN) {
+ if ((pos+length) > mBufferLen) {
flush();
pos = mPos;
}
diff --git a/core/java/com/android/internal/util/FunctionalUtils.java b/core/java/com/android/internal/util/FunctionalUtils.java
index 9aeb041..cdef97e 100644
--- a/core/java/com/android/internal/util/FunctionalUtils.java
+++ b/core/java/com/android/internal/util/FunctionalUtils.java
@@ -45,4 +45,15 @@
public interface ThrowingSupplier<T> {
T get() throws Exception;
}
+
+ /**
+ * An equivalent of {@link java.util.function.Consumer} that allows throwing checked exceptions
+ *
+ * This can be used to specify a lambda argument without forcing all the checked exceptions
+ * to be handled within it
+ */
+ @FunctionalInterface
+ public interface ThrowingConsumer<T> {
+ void accept(T t) throws Exception;
+ }
}
diff --git a/core/java/com/android/internal/util/NotificationColorUtil.java b/core/java/com/android/internal/util/NotificationColorUtil.java
index 0c046a9..2778d93 100644
--- a/core/java/com/android/internal/util/NotificationColorUtil.java
+++ b/core/java/com/android/internal/util/NotificationColorUtil.java
@@ -360,20 +360,28 @@
return findContrastColorAgainstDark(color, Color.BLACK, true /* fg */, 12);
}
- /**
- * Finds a text color with sufficient contrast over bg that has the same hue as the original
- * color, assuming it is for large text.
+ /**
+ * Finds a large text color with sufficient contrast over bg that has the same or darker hue as
+ * the original color, depending on the value of {@code isBgDarker}.
+ *
+ * @param isBgDarker {@code true} if {@code bg} is darker than {@code color}.
*/
- public static int ensureLargeTextContrast(int color, int bg) {
- return findContrastColor(color, bg, true, 3);
+ public static int ensureLargeTextContrast(int color, int bg, boolean isBgDarker) {
+ return isBgDarker
+ ? findContrastColorAgainstDark(color, bg, true, 3)
+ : findContrastColor(color, bg, true, 3);
}
/**
- * Finds a text color with sufficient contrast over bg that has the same hue as the original
- * color.
+ * Finds a text color with sufficient contrast over bg that has the same or darker hue as the
+ * original color, depending on the value of {@code isBgDarker}.
+ *
+ * @param isBgDarker {@code true} if {@code bg} is darker than {@code color}.
*/
- private static int ensureTextContrast(int color, int bg) {
- return findContrastColor(color, bg, true, 4.5);
+ private static int ensureTextContrast(int color, int bg, boolean isBgDarker) {
+ return isBgDarker
+ ? findContrastColorAgainstDark(color, bg, true, 4.5)
+ : findContrastColor(color, bg, true, 4.5);
}
/** Finds a background color for a text view with given text color and hint text color, that
@@ -402,22 +410,37 @@
/**
* Resolves a Notification's color such that it has enough contrast to be used as the
+ * color for the Notification's action and header text on a background that is lighter than
+ * {@code notificationColor}.
+ *
+ * @see {@link #resolveContrastColor(Context, int, boolean)}
+ */
+ public static int resolveContrastColor(Context context, int notificationColor,
+ int backgroundColor) {
+ return NotificationColorUtil.resolveContrastColor(context, notificationColor,
+ backgroundColor, false /* isDark */);
+ }
+
+ /**
+ * Resolves a Notification's color such that it has enough contrast to be used as the
* color for the Notification's action and header text.
*
* @param notificationColor the color of the notification or {@link Notification#COLOR_DEFAULT}
* @param backgroundColor the background color to ensure the contrast against.
+ * @param isDark whether or not the {@code notificationColor} will be placed on a background
+ * that is darker than the color itself
* @return a color of the same hue with enough contrast against the backgrounds.
*/
public static int resolveContrastColor(Context context, int notificationColor,
- int backgroundColor) {
+ int backgroundColor, boolean isDark) {
final int resolvedColor = resolveColor(context, notificationColor);
final int actionBg = context.getColor(
com.android.internal.R.color.notification_action_list);
int color = resolvedColor;
- color = NotificationColorUtil.ensureLargeTextContrast(color, actionBg);
- color = NotificationColorUtil.ensureTextContrast(color, backgroundColor);
+ color = NotificationColorUtil.ensureLargeTextContrast(color, actionBg, isDark);
+ color = NotificationColorUtil.ensureTextContrast(color, backgroundColor, isDark);
if (color != resolvedColor) {
if (DEBUG){
diff --git a/core/java/com/android/internal/util/Protocol.java b/core/java/com/android/internal/util/Protocol.java
index b075db8..1aa32cc 100644
--- a/core/java/com/android/internal/util/Protocol.java
+++ b/core/java/com/android/internal/util/Protocol.java
@@ -65,5 +65,6 @@
public static final int BASE_NETWORK_MONITOR = 0x00082000;
public static final int BASE_NETWORK_FACTORY = 0x00083000;
public static final int BASE_ETHERNET = 0x00084000;
+ public static final int BASE_LOWPAN = 0x00085000;
//TODO: define all used protocols
}
diff --git a/core/java/com/android/internal/util/XmlUtils.java b/core/java/com/android/internal/util/XmlUtils.java
index 3d8c85e..3188d30 100644
--- a/core/java/com/android/internal/util/XmlUtils.java
+++ b/core/java/com/android/internal/util/XmlUtils.java
@@ -1694,10 +1694,10 @@
return in.getAttributeValue(null, name);
}
- public static void writeStringAttribute(XmlSerializer out, String name, String value)
+ public static void writeStringAttribute(XmlSerializer out, String name, CharSequence value)
throws IOException {
if (value != null) {
- out.attribute(null, name, value);
+ out.attribute(null, name, value.toString());
}
}
diff --git a/core/java/com/android/internal/view/FloatingActionMode.java b/core/java/com/android/internal/view/FloatingActionMode.java
index ff211b6..497e7b0 100644
--- a/core/java/com/android/internal/view/FloatingActionMode.java
+++ b/core/java/com/android/internal/view/FloatingActionMode.java
@@ -295,6 +295,8 @@
*/
private static final class FloatingToolbarVisibilityHelper {
+ private static final long MIN_SHOW_DURATION_FOR_MOVE_HIDE = 500;
+
private final FloatingToolbar mToolbar;
private boolean mHideRequested;
@@ -304,6 +306,8 @@
private boolean mActive;
+ private long mLastShowTime;
+
public FloatingToolbarVisibilityHelper(FloatingToolbar toolbar) {
mToolbar = Preconditions.checkNotNull(toolbar);
}
@@ -327,7 +331,13 @@
}
public void setMoving(boolean moving) {
- mMoving = moving;
+ // Avoid unintended flickering by allowing the toolbar to show long enough before
+ // triggering the 'moving' flag - which signals a hide.
+ final boolean showingLongEnough =
+ System.currentTimeMillis() - mLastShowTime > MIN_SHOW_DURATION_FOR_MOVE_HIDE;
+ if (!moving || showingLongEnough) {
+ mMoving = moving;
+ }
}
public void setOutOfBounds(boolean outOfBounds) {
@@ -347,6 +357,7 @@
mToolbar.hide();
} else {
mToolbar.show();
+ mLastShowTime = System.currentTimeMillis();
}
}
}
diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java
index 53a9654..9462a06 100644
--- a/core/java/com/android/internal/widget/LockPatternUtils.java
+++ b/core/java/com/android/internal/widget/LockPatternUtils.java
@@ -909,26 +909,48 @@
*/
public void setSeparateProfileChallengeEnabled(int userHandle, boolean enabled,
String managedUserPassword) {
- UserInfo info = getUserManager().getUserInfo(userHandle);
- if (info.isManagedProfile()) {
- try {
- getLockSettings().setSeparateProfileChallengeEnabled(userHandle, enabled,
- managedUserPassword);
- onAfterChangingPassword(userHandle);
- } catch (RemoteException e) {
- Log.e(TAG, "Couldn't update work profile challenge enabled");
- }
+ if (!isManagedProfile(userHandle)) {
+ return;
+ }
+ try {
+ getLockSettings().setSeparateProfileChallengeEnabled(userHandle, enabled,
+ managedUserPassword);
+ onAfterChangingPassword(userHandle);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Couldn't update work profile challenge enabled");
}
}
/**
- * Retrieves whether the Separate Profile Challenge is enabled for this {@param userHandle}.
+ * Returns true if {@param userHandle} is a managed profile with separate challenge.
*/
public boolean isSeparateProfileChallengeEnabled(int userHandle) {
- UserInfo info = getUserManager().getUserInfo(userHandle);
- if (info == null || !info.isManagedProfile()) {
- return false;
- }
+ return isManagedProfile(userHandle) && hasSeparateChallenge(userHandle);
+ }
+
+ /**
+ * Returns true if {@param userHandle} is a managed profile with unified challenge.
+ */
+ public boolean isManagedProfileWithUnifiedChallenge(int userHandle) {
+ return isManagedProfile(userHandle) && !hasSeparateChallenge(userHandle);
+ }
+
+ /**
+ * Retrieves whether the current DPM allows use of the Profile Challenge.
+ */
+ public boolean isSeparateProfileChallengeAllowed(int userHandle) {
+ return isManagedProfile(userHandle)
+ && getDevicePolicyManager().isSeparateProfileChallengeAllowed(userHandle);
+ }
+
+ /**
+ * Retrieves whether the current profile and device locks can be unified.
+ */
+ public boolean isSeparateProfileChallengeAllowedToUnify(int userHandle) {
+ return getDevicePolicyManager().isProfileActivePasswordSufficientForParent(userHandle);
+ }
+
+ private boolean hasSeparateChallenge(int userHandle) {
try {
return getLockSettings().getSeparateProfileChallengeEnabled(userHandle);
} catch (RemoteException e) {
@@ -938,22 +960,9 @@
}
}
- /**
- * Retrieves whether the current DPM allows use of the Profile Challenge.
- */
- public boolean isSeparateProfileChallengeAllowed(int userHandle) {
- UserInfo info = getUserManager().getUserInfo(userHandle);
- if (info == null || !info.isManagedProfile()) {
- return false;
- }
- return getDevicePolicyManager().isSeparateProfileChallengeAllowed(userHandle);
- }
-
- /**
- * Retrieves whether the current profile and device locks can be unified.
- */
- public boolean isSeparateProfileChallengeAllowedToUnify(int userHandle) {
- return getDevicePolicyManager().isProfileActivePasswordSufficientForParent(userHandle);
+ private boolean isManagedProfile(int userHandle) {
+ final UserInfo info = getUserManager().getUserInfo(userHandle);
+ return info != null && info.isManagedProfile();
}
/**
diff --git a/core/java/com/android/server/BootReceiver.java b/core/java/com/android/server/BootReceiver.java
index 4f9e8a5..18990cf 100644
--- a/core/java/com/android/server/BootReceiver.java
+++ b/core/java/com/android/server/BootReceiver.java
@@ -217,6 +217,8 @@
"/proc/last_kmsg", -LOG_SIZE, "SYSTEM_LAST_KMSG");
addFileWithFootersToDropBox(db, timestamps, headers, lastKmsgFooter,
"/sys/fs/pstore/console-ramoops", -LOG_SIZE, "SYSTEM_LAST_KMSG");
+ addFileWithFootersToDropBox(db, timestamps, headers, lastKmsgFooter,
+ "/sys/fs/pstore/console-ramoops-0", -LOG_SIZE, "SYSTEM_LAST_KMSG");
addFileToDropBox(db, timestamps, headers, "/cache/recovery/log", -LOG_SIZE,
"SYSTEM_RECOVERY_LOG");
addFileToDropBox(db, timestamps, headers, "/cache/recovery/last_kmsg",
@@ -302,6 +304,10 @@
if (fileTime <= 0) {
file = new File("/sys/fs/pstore/console-ramoops");
fileTime = file.lastModified();
+ if (fileTime <= 0) {
+ file = new File("/sys/fs/pstore/console-ramoops-0");
+ fileTime = file.lastModified();
+ }
}
if (fileTime <= 0) return; // File does not exist
diff --git a/core/java/com/android/server/net/OWNERS b/core/java/com/android/server/net/OWNERS
new file mode 100644
index 0000000..74f39a1
--- /dev/null
+++ b/core/java/com/android/server/net/OWNERS
@@ -0,0 +1,5 @@
+set noparent
+
+ek@google.com
+hugobenichi@google.com
+lorenzo@google.com
diff --git a/core/jni/Android.bp b/core/jni/Android.bp
index a228d34..c629341 100644
--- a/core/jni/Android.bp
+++ b/core/jni/Android.bp
@@ -90,6 +90,7 @@
"android_os_Parcel.cpp",
"android_os_SELinux.cpp",
"android_os_seccomp.cpp",
+ "android_os_SharedMemory.cpp",
"android_os_SystemClock.cpp",
"android_os_SystemProperties.cpp",
"android_os_Trace.cpp",
@@ -162,7 +163,6 @@
"android_hardware_camera2_DngCreator.cpp",
"android_hardware_display_DisplayViewport.cpp",
"android_hardware_HardwareBuffer.cpp",
- "android_hardware_Radio.cpp",
"android_hardware_SensorManager.cpp",
"android_hardware_SerialPort.cpp",
"android_hardware_SoundTrigger.cpp",
@@ -185,8 +185,8 @@
"android_content_res_Configuration.cpp",
"android_animation_PropertyValuesHolder.cpp",
"com_android_internal_net_NetworkStatsFactory.cpp",
+ "com_android_internal_os_ClassLoaderFactory.cpp",
"com_android_internal_os_FuseAppLoop.cpp",
- "com_android_internal_os_PathClassLoaderFactory.cpp",
"com_android_internal_os_Zygote.cpp",
"com_android_internal_os_ZygoteInit.cpp",
"com_android_internal_util_VirtualRefBasePtr.cpp",
@@ -216,7 +216,6 @@
"libgif",
"libseccomp_policy",
"libselinux",
- "libcrypto",
"libgrallocusage",
],
@@ -225,6 +224,7 @@
"libandroidfw",
"libappfuse",
"libbase",
+ "libcrypto",
"libnativehelper",
"liblog",
"libcutils",
@@ -259,12 +259,10 @@
"libpdfium",
"libimg_utils",
"libnetd_client",
- "libradio",
"libsoundtrigger",
"libminikin",
"libprocessgroup",
"libnativebridge",
- "libradio_metadata",
"libnativeloader",
"libmemunreachable",
"libhidlbase",
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index daf815a..1ad8541 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -32,8 +32,8 @@
#include <SkGraphics.h>
#include "jni.h"
-#include "JNIHelp.h"
-#include "JniInvocation.h"
+#include <nativehelper/JNIHelp.h>
+#include <nativehelper/JniInvocation.h>
#include "android_util_Binder.h"
#include <stdio.h>
@@ -88,7 +88,6 @@
extern int register_android_hardware_camera2_legacy_PerfMeasurement(JNIEnv *env);
extern int register_android_hardware_camera2_DngCreator(JNIEnv *env);
extern int register_android_hardware_HardwareBuffer(JNIEnv *env);
-extern int register_android_hardware_Radio(JNIEnv *env);
extern int register_android_hardware_SensorManager(JNIEnv *env);
extern int register_android_hardware_SerialPort(JNIEnv *env);
extern int register_android_hardware_SoundTrigger(JNIEnv *env);
@@ -168,6 +167,7 @@
extern int register_android_os_FileObserver(JNIEnv *env);
extern int register_android_os_UEventObserver(JNIEnv* env);
extern int register_android_os_MemoryFile(JNIEnv* env);
+extern int register_android_os_SharedMemory(JNIEnv* env);
extern int register_android_net_LocalSocketImpl(JNIEnv* env);
extern int register_android_net_NetworkUtils(JNIEnv* env);
extern int register_android_net_TrafficStats(JNIEnv* env);
@@ -203,8 +203,8 @@
extern int register_android_animation_PropertyValuesHolder(JNIEnv *env);
extern int register_com_android_internal_content_NativeLibraryHelper(JNIEnv *env);
extern int register_com_android_internal_net_NetworkStatsFactory(JNIEnv *env);
+extern int register_com_android_internal_os_ClassLoaderFactory(JNIEnv* env);
extern int register_com_android_internal_os_FuseAppLoop(JNIEnv* env);
-extern int register_com_android_internal_os_PathClassLoaderFactory(JNIEnv* env);
extern int register_com_android_internal_os_Zygote(JNIEnv *env);
extern int register_com_android_internal_os_ZygoteInit(JNIEnv *env);
extern int register_com_android_internal_util_VirtualRefBasePtr(JNIEnv *env);
@@ -614,6 +614,7 @@
char useJitProfilesOptsBuf[sizeof("-Xjitsaveprofilinginfo:")-1 + PROPERTY_VALUE_MAX];
char jitprithreadweightOptBuf[sizeof("-Xjitprithreadweight:")-1 + PROPERTY_VALUE_MAX];
char jittransitionweightOptBuf[sizeof("-Xjittransitionweight:")-1 + PROPERTY_VALUE_MAX];
+ char hotstartupsamplesOptsBuf[sizeof("-Xps-hot-startup-method-samples:")-1 + PROPERTY_VALUE_MAX];
char gctypeOptsBuf[sizeof("-Xgc:")-1 + PROPERTY_VALUE_MAX];
char backgroundgcOptsBuf[sizeof("-XX:BackgroundGC=")-1 + PROPERTY_VALUE_MAX];
char heaptargetutilizationOptsBuf[sizeof("-XX:HeapTargetUtilization=")-1 + PROPERTY_VALUE_MAX];
@@ -740,6 +741,12 @@
jittransitionweightOptBuf,
"-Xjittransitionweight:");
+ /*
+ * Profile related options.
+ */
+ parseRuntimeOption("dalvik.vm.hot-startup-method-samples", hotstartupsamplesOptsBuf,
+ "-Xps-hot-startup-method-samples:");
+
property_get("ro.config.low_ram", propBuf, "");
if (strcmp(propBuf, "true") == 0) {
addOption("-XX:LowMemoryMode");
@@ -786,19 +793,27 @@
"--compiler-filter=", "-Ximage-compiler-option");
}
- // Make sure there is a preloaded-classes file.
- if (!hasFile("/system/etc/preloaded-classes")) {
- ALOGE("Missing preloaded-classes file, /system/etc/preloaded-classes not found: %s\n",
- strerror(errno));
- return -1;
- }
- addOption("-Ximage-compiler-option");
- addOption("--image-classes=/system/etc/preloaded-classes");
-
- // If there is a compiled-classes file, push it.
- if (hasFile("/system/etc/compiled-classes")) {
+ // If there is a boot profile, it takes precedence over the image and preloaded classes.
+ if (hasFile("/system/etc/boot-image.prof")) {
addOption("-Ximage-compiler-option");
- addOption("--compiled-classes=/system/etc/compiled-classes");
+ addOption("--profile-file=/system/etc/boot-image.prof");
+ addOption("-Ximage-compiler-option");
+ addOption("--compiler-filter=speed-profile");
+ } else {
+ // Make sure there is a preloaded-classes file.
+ if (!hasFile("/system/etc/preloaded-classes")) {
+ ALOGE("Missing preloaded-classes file, /system/etc/preloaded-classes not found: %s\n",
+ strerror(errno));
+ return -1;
+ }
+ addOption("-Ximage-compiler-option");
+ addOption("--image-classes=/system/etc/preloaded-classes");
+
+ // If there is a compiled-classes file, push it.
+ if (hasFile("/system/etc/compiled-classes")) {
+ addOption("-Ximage-compiler-option");
+ addOption("--compiled-classes=/system/etc/compiled-classes");
+ }
}
property_get("dalvik.vm.image-dex2oat-flags", dex2oatImageFlagsBuf, "");
@@ -1073,7 +1088,7 @@
* Start VM. This thread becomes the main thread of the VM, and will
* not return until the VM exits.
*/
- char* slashClassName = toSlashClassName(className);
+ char* slashClassName = toSlashClassName(className != NULL ? className : "");
jclass startClass = env->FindClass(slashClassName);
if (startClass == NULL) {
ALOGE("JavaVM unable to locate class '%s'\n", slashClassName);
@@ -1387,7 +1402,8 @@
REG_JNI(register_android_net_NetworkUtils),
REG_JNI(register_android_net_TrafficStats),
REG_JNI(register_android_os_MemoryFile),
- REG_JNI(register_com_android_internal_os_PathClassLoaderFactory),
+ REG_JNI(register_android_os_SharedMemory),
+ REG_JNI(register_com_android_internal_os_ClassLoaderFactory),
REG_JNI(register_com_android_internal_os_Zygote),
REG_JNI(register_com_android_internal_os_ZygoteInit),
REG_JNI(register_com_android_internal_util_VirtualRefBasePtr),
@@ -1397,7 +1413,6 @@
REG_JNI(register_android_hardware_camera2_legacy_PerfMeasurement),
REG_JNI(register_android_hardware_camera2_DngCreator),
REG_JNI(register_android_hardware_HardwareBuffer),
- REG_JNI(register_android_hardware_Radio),
REG_JNI(register_android_hardware_SensorManager),
REG_JNI(register_android_hardware_SerialPort),
REG_JNI(register_android_hardware_SoundTrigger),
diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp
index be8b9de..ad05a51 100755
--- a/core/jni/android/graphics/Bitmap.cpp
+++ b/core/jni/android/graphics/Bitmap.cpp
@@ -485,11 +485,9 @@
//////////////////// ToColor procs
-typedef void (*ToColorProc)(SkColor dst[], const void* src, int width,
- SkColorTable*);
+typedef void (*ToColorProc)(SkColor dst[], const void* src, int width);
-static void ToColor_F16_Alpha(SkColor dst[], const void* src, int width,
- SkColorTable*) {
+static void ToColor_F16_Alpha(SkColor dst[], const void* src, int width) {
SkASSERT(width > 0);
uint64_t* s = (uint64_t*)src;
do {
@@ -497,8 +495,7 @@
} while (--width != 0);
}
-static void ToColor_F16_Raw(SkColor dst[], const void* src, int width,
- SkColorTable*) {
+static void ToColor_F16_Raw(SkColor dst[], const void* src, int width) {
SkASSERT(width > 0);
uint64_t* s = (uint64_t*)src;
do {
@@ -506,8 +503,7 @@
} while (--width != 0);
}
-static void ToColor_S32_Alpha(SkColor dst[], const void* src, int width,
- SkColorTable*) {
+static void ToColor_S32_Alpha(SkColor dst[], const void* src, int width) {
SkASSERT(width > 0);
const SkPMColor* s = (const SkPMColor*)src;
do {
@@ -515,8 +511,7 @@
} while (--width != 0);
}
-static void ToColor_S32_Raw(SkColor dst[], const void* src, int width,
- SkColorTable*) {
+static void ToColor_S32_Raw(SkColor dst[], const void* src, int width) {
SkASSERT(width > 0);
const SkPMColor* s = (const SkPMColor*)src;
do {
@@ -526,8 +521,7 @@
} while (--width != 0);
}
-static void ToColor_S32_Opaque(SkColor dst[], const void* src, int width,
- SkColorTable*) {
+static void ToColor_S32_Opaque(SkColor dst[], const void* src, int width) {
SkASSERT(width > 0);
const SkPMColor* s = (const SkPMColor*)src;
do {
@@ -537,8 +531,7 @@
} while (--width != 0);
}
-static void ToColor_S4444_Alpha(SkColor dst[], const void* src, int width,
- SkColorTable*) {
+static void ToColor_S4444_Alpha(SkColor dst[], const void* src, int width) {
SkASSERT(width > 0);
const SkPMColor16* s = (const SkPMColor16*)src;
do {
@@ -546,8 +539,7 @@
} while (--width != 0);
}
-static void ToColor_S4444_Raw(SkColor dst[], const void* src, int width,
- SkColorTable*) {
+static void ToColor_S4444_Raw(SkColor dst[], const void* src, int width) {
SkASSERT(width > 0);
const SkPMColor16* s = (const SkPMColor16*)src;
do {
@@ -557,8 +549,7 @@
} while (--width != 0);
}
-static void ToColor_S4444_Opaque(SkColor dst[], const void* src, int width,
- SkColorTable*) {
+static void ToColor_S4444_Opaque(SkColor dst[], const void* src, int width) {
SkASSERT(width > 0);
const SkPMColor16* s = (const SkPMColor16*)src;
do {
@@ -568,8 +559,7 @@
} while (--width != 0);
}
-static void ToColor_S565(SkColor dst[], const void* src, int width,
- SkColorTable*) {
+static void ToColor_S565(SkColor dst[], const void* src, int width) {
SkASSERT(width > 0);
const uint16_t* s = (const uint16_t*)src;
do {
@@ -579,41 +569,7 @@
} while (--width != 0);
}
-static void ToColor_SI8_Alpha(SkColor dst[], const void* src, int width,
- SkColorTable* ctable) {
- SkASSERT(width > 0);
- const uint8_t* s = (const uint8_t*)src;
- const SkPMColor* colors = ctable->readColors();
- do {
- *dst++ = SkUnPreMultiply::PMColorToColor(colors[*s++]);
- } while (--width != 0);
-}
-
-static void ToColor_SI8_Raw(SkColor dst[], const void* src, int width,
- SkColorTable* ctable) {
- SkASSERT(width > 0);
- const uint8_t* s = (const uint8_t*)src;
- const SkPMColor* colors = ctable->readColors();
- do {
- SkPMColor c = colors[*s++];
- *dst++ = SkColorSetARGB(SkGetPackedA32(c), SkGetPackedR32(c),
- SkGetPackedG32(c), SkGetPackedB32(c));
- } while (--width != 0);
-}
-
-static void ToColor_SI8_Opaque(SkColor dst[], const void* src, int width,
- SkColorTable* ctable) {
- SkASSERT(width > 0);
- const uint8_t* s = (const uint8_t*)src;
- const SkPMColor* colors = ctable->readColors();
- do {
- SkPMColor c = colors[*s++];
- *dst++ = SkColorSetRGB(SkGetPackedR32(c), SkGetPackedG32(c),
- SkGetPackedB32(c));
- } while (--width != 0);
-}
-
-static void ToColor_SA8(SkColor dst[], const void* src, int width, SkColorTable*) {
+static void ToColor_SA8(SkColor dst[], const void* src, int width) {
SkASSERT(width > 0);
const uint8_t* s = (const uint8_t*)src;
do {
@@ -649,20 +605,6 @@
}
case kRGB_565_SkColorType:
return ToColor_S565;
- case kIndex_8_SkColorType:
- if (src.getColorTable() == NULL) {
- return NULL;
- }
- switch (src.alphaType()) {
- case kOpaque_SkAlphaType:
- return ToColor_SI8_Opaque;
- case kPremul_SkAlphaType:
- return ToColor_SI8_Alpha;
- case kUnpremul_SkAlphaType:
- return ToColor_SI8_Raw;
- default:
- return NULL;
- }
case kAlpha_8_SkColorType:
return ToColor_SA8;
case kRGBA_F16_SkColorType:
@@ -738,7 +680,7 @@
bitmap.setInfo(SkImageInfo::Make(width, height, colorType, kPremul_SkAlphaType, colorSpace));
- sk_sp<Bitmap> nativeBitmap = Bitmap::allocateHeapBitmap(&bitmap, NULL);
+ sk_sp<Bitmap> nativeBitmap = Bitmap::allocateHeapBitmap(&bitmap);
if (!nativeBitmap) {
return NULL;
}
@@ -752,8 +694,6 @@
static bool bitmapCopyTo(SkBitmap* dst, SkColorType dstCT, const SkBitmap& src,
SkBitmap::Allocator* alloc) {
- LOG_ALWAYS_FATAL_IF(kIndex_8_SkColorType == dstCT, "Error, cannot copyTo kIndex8.");
-
SkPixmap srcPM;
if (!src.peekPixels(&srcPM)) {
return false;
@@ -766,7 +706,7 @@
// allow the call to readPixels() to succeed and preserve this lenient behavior.
if (kOpaque_SkAlphaType != srcPM.alphaType()) {
srcPM = SkPixmap(srcPM.info().makeAlphaType(kOpaque_SkAlphaType), srcPM.addr(),
- srcPM.rowBytes(), srcPM.ctable());
+ srcPM.rowBytes());
dstInfo = dstInfo.makeAlphaType(kOpaque_SkAlphaType);
}
break;
@@ -787,7 +727,7 @@
if (!dst->setInfo(dstInfo)) {
return false;
}
- if (!dst->tryAllocPixels(alloc, nullptr)) {
+ if (!dst->tryAllocPixels(alloc)) {
return false;
}
@@ -800,7 +740,7 @@
for (int y = 0; y < src.height(); y++) {
const uint8_t* srcRow = srcPM.addr8(0, y);
uint32_t* dstRow = dst->getAddr32(0, y);
- ToColor_SA8(dstRow, srcRow, src.width(), nullptr);
+ ToColor_SA8(dstRow, srcRow, src.width());
}
return true;
}
@@ -1099,7 +1039,6 @@
kRGBA_F16_SkColorType != colorType &&
kRGB_565_SkColorType != colorType &&
kARGB_4444_SkColorType != colorType &&
- kIndex_8_SkColorType != colorType &&
kAlpha_8_SkColorType != colorType) {
SkDebugf("Bitmap_createFromParcel unknown colortype: %d\n", colorType);
return NULL;
@@ -1111,24 +1050,6 @@
return NULL;
}
- sk_sp<SkColorTable> ctable = NULL;
- if (colorType == kIndex_8_SkColorType) {
- int count = p->readInt32();
- if (count < 0 || count > 256) {
- // The data is corrupt, since SkColorTable enforces a value between 0 and 256,
- // inclusive.
- return NULL;
- }
- if (count > 0) {
- size_t size = count * sizeof(SkPMColor);
- const SkPMColor* src = (const SkPMColor*)p->readInplace(size);
- if (src == NULL) {
- return NULL;
- }
- ctable = SkColorTable::Make(src, count);
- }
- }
-
// Read the bitmap blob.
size_t size = bitmap->getSize();
android::Parcel::ReadableBlob blob;
@@ -1160,7 +1081,7 @@
// Map the pixels in place and take ownership of the ashmem region.
nativeBitmap = sk_sp<Bitmap>(GraphicsJNI::mapAshmemBitmap(env, bitmap.get(),
- ctable.get(), dupFd, const_cast<void*>(blob.data()), size, !isMutable));
+ dupFd, const_cast<void*>(blob.data()), size, !isMutable));
if (!nativeBitmap) {
close(dupFd);
blob.release();
@@ -1185,7 +1106,7 @@
#endif
// Copy the pixels into a new buffer.
- nativeBitmap = Bitmap::allocateHeapBitmap(bitmap.get(), ctable);
+ nativeBitmap = Bitmap::allocateHeapBitmap(bitmap.get());
if (!nativeBitmap) {
blob.release();
doThrowRE(env, "Could not allocate java pixel ref.");
@@ -1240,19 +1161,6 @@
p->writeInt32(bitmap.rowBytes());
p->writeInt32(density);
- if (bitmap.colorType() == kIndex_8_SkColorType) {
- // The bitmap needs to be locked to access its color table.
- SkColorTable* ctable = bitmap.getColorTable();
- if (ctable != NULL) {
- int count = ctable->count();
- p->writeInt32(count);
- memcpy(p->writeInplace(count * sizeof(SkPMColor)),
- ctable->readColors(), count * sizeof(SkPMColor));
- } else {
- p->writeInt32(0); // indicate no ctable
- }
- }
-
// Transfer the underlying ashmem region if we have one and it's immutable.
android::status_t status;
int fd = bitmapWrapper->bitmap().getAshmemFd();
@@ -1394,7 +1302,7 @@
}
SkColor dst[1];
- proc(dst, src, 1, bitmap.getColorTable());
+ proc(dst, src, 1);
SkColorSpace* colorSpace = bitmap.colorSpace();
if (bitmap.colorType() != kRGBA_F16_SkColorType &&
@@ -1424,7 +1332,6 @@
return;
}
- SkColorTable* ctable = bitmap.getColorTable();
jint* dst = env->GetIntArrayElements(pixelArray, NULL);
SkColor* d = (SkColor*)dst + offset;
@@ -1432,7 +1339,7 @@
if (bitmap.colorType() == kRGBA_F16_SkColorType ||
GraphicsJNI::isColorSpaceSRGB(colorSpace)) {
while (--height >= 0) {
- proc(d, src, width, ctable);
+ proc(d, src, width);
d += stride;
src = (void*)((const char*)src + bitmap.rowBytes());
}
@@ -1441,7 +1348,7 @@
auto xform = SkColorSpaceXform::New(colorSpace, sRGB.get());
while (--height >= 0) {
- proc(d, src, width, ctable);
+ proc(d, src, width);
xform->apply(SkColorSpaceXform::kBGRA_8888_ColorFormat, d,
SkColorSpaceXform::kBGRA_8888_ColorFormat, d, width,
@@ -1551,22 +1458,6 @@
return JNI_FALSE;
}
- if (bm0.colorType() == kIndex_8_SkColorType) {
- SkColorTable* ct0 = bm0.getColorTable();
- SkColorTable* ct1 = bm1.getColorTable();
- if (NULL == ct0 || NULL == ct1) {
- return JNI_FALSE;
- }
- if (ct0->count() != ct1->count()) {
- return JNI_FALSE;
- }
-
- const size_t size = ct0->count() * sizeof(SkPMColor);
- if (memcmp(ct0->readColors(), ct1->readColors(), size) != 0) {
- return JNI_FALSE;
- }
- }
-
// now compare each scanline. We can't do the entire buffer at once,
// since we don't care about the pixel values that might extend beyond
// the width (since the scanline might be larger than the logical width)
diff --git a/core/jni/android/graphics/Bitmap.h b/core/jni/android/graphics/Bitmap.h
index a4bfc94..06877915 100644
--- a/core/jni/android/graphics/Bitmap.h
+++ b/core/jni/android/graphics/Bitmap.h
@@ -19,9 +19,7 @@
#include <jni.h>
#include <android/bitmap.h>
#include <SkBitmap.h>
-#include <SkColorTable.h>
#include <SkImageInfo.h>
-#include <SkPixelRef.h>
namespace android {
diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp
index 5a25d5e..94edde1 100644
--- a/core/jni/android/graphics/BitmapFactory.cpp
+++ b/core/jni/android/graphics/BitmapFactory.cpp
@@ -14,7 +14,7 @@
#include "Utils.h"
#include "core_jni_helpers.h"
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include <androidfw/Asset.h>
#include <androidfw/ResourceTypes.h>
#include <cutils/compiler.h>
@@ -130,27 +130,15 @@
scaleDivRange(chunk->getYDivs(), chunk->numYDivs, scale, scaledHeight);
}
-static SkColorType colorTypeForScaledOutput(SkColorType colorType) {
- switch (colorType) {
- case kUnknown_SkColorType:
- case kIndex_8_SkColorType:
- return kN32_SkColorType;
- default:
- break;
- }
- return colorType;
-}
-
class ScaleCheckingAllocator : public SkBitmap::HeapAllocator {
public:
ScaleCheckingAllocator(float scale, int size)
: mScale(scale), mSize(size) {
}
- virtual bool allocPixelRef(SkBitmap* bitmap, SkColorTable* ctable) {
+ virtual bool allocPixelRef(SkBitmap* bitmap) {
// accounts for scale in final allocation, using eventual size and config
- const int bytesPerPixel = SkColorTypeBytesPerPixel(
- colorTypeForScaledOutput(bitmap->colorType()));
+ const int bytesPerPixel = SkColorTypeBytesPerPixel(bitmap->colorType());
const int requestedSize = bytesPerPixel *
int(bitmap->width() * mScale + 0.5f) *
int(bitmap->height() * mScale + 0.5f);
@@ -159,7 +147,7 @@
mSize, requestedSize);
return false;
}
- return SkBitmap::HeapAllocator::allocPixelRef(bitmap, ctable);
+ return SkBitmap::HeapAllocator::allocPixelRef(bitmap);
}
private:
const float mScale;
@@ -175,7 +163,7 @@
~RecyclingPixelAllocator() {
}
- virtual bool allocPixelRef(SkBitmap* bitmap, SkColorTable* ctable) {
+ virtual bool allocPixelRef(SkBitmap* bitmap) {
const SkImageInfo& info = bitmap->info();
if (info.colorType() == kUnknown_SkColorType) {
ALOGW("unable to reuse a bitmap as the target has an unknown bitmap configuration");
@@ -195,7 +183,7 @@
return false;
}
- mBitmap->reconfigure(info, bitmap->rowBytes(), sk_ref_sp(ctable));
+ mBitmap->reconfigure(info, bitmap->rowBytes());
bitmap->setPixelRef(sk_ref_sp(mBitmap), 0, 0);
return true;
}
@@ -334,13 +322,7 @@
env->SetIntField(options, gOptions_heightFieldID, scaledHeight);
env->SetObjectField(options, gOptions_mimeFieldID, mimeType);
- SkColorType outColorType = decodeColorType;
- // Scaling can affect the output color type
- if (willScale || scale != 1.0f) {
- outColorType = colorTypeForScaledOutput(outColorType);
- }
-
- jint configID = GraphicsJNI::colorTypeToLegacyBitmapConfig(outColorType);
+ jint configID = GraphicsJNI::colorTypeToLegacyBitmapConfig(decodeColorType);
if (isHardware) {
configID = GraphicsJNI::kHardware_LegacyBitmapConfig;
}
@@ -397,24 +379,6 @@
decodeAllocator = &defaultAllocator;
}
- // Construct a color table for the decode if necessary
- sk_sp<SkColorTable> colorTable(nullptr);
- SkPMColor* colorPtr = nullptr;
- int* colorCount = nullptr;
- int maxColors = 256;
- SkPMColor colors[256];
- if (kIndex_8_SkColorType == decodeColorType) {
- colorTable.reset(new SkColorTable(colors, maxColors));
-
- // SkColorTable expects us to initialize all of the colors before creating an
- // SkColorTable. However, we are using SkBitmap with an Allocator to allocate
- // memory for the decode, so we need to create the SkColorTable before decoding.
- // It is safe for SkAndroidCodec to modify the colors because this SkBitmap is
- // not being used elsewhere.
- colorPtr = const_cast<SkPMColor*>(colorTable->readColors());
- colorCount = &maxColors;
- }
-
SkAlphaType alphaType = codec->computeOutputAlphaType(requireUnpremultiplied);
const SkImageInfo decodeInfo = SkImageInfo::Make(size.width(), size.height(),
@@ -437,7 +401,7 @@
}
SkBitmap decodingBitmap;
if (!decodingBitmap.setInfo(bitmapInfo) ||
- !decodingBitmap.tryAllocPixels(decodeAllocator, colorTable.get())) {
+ !decodingBitmap.tryAllocPixels(decodeAllocator)) {
// SkAndroidCodec should recommend a valid SkImageInfo, so setInfo()
// should only only fail if the calculated value for rowBytes is too
// large.
@@ -450,8 +414,6 @@
SkAndroidCodec::AndroidOptions codecOptions;
codecOptions.fZeroInitialized = decodeAllocator == &defaultAllocator ?
SkCodec::kYes_ZeroInitialized : SkCodec::kNo_ZeroInitialized;
- codecOptions.fColorPtr = colorPtr;
- codecOptions.fColorCount = colorCount;
codecOptions.fSampleSize = sampleSize;
SkCodec::Result result = codec->getAndroidPixels(decodeInfo, decodingBitmap.getPixels(),
decodingBitmap.rowBytes(), &codecOptions);
@@ -518,13 +480,13 @@
outputAllocator = &defaultAllocator;
}
- SkColorType scaledColorType = colorTypeForScaledOutput(decodingBitmap.colorType());
+ SkColorType scaledColorType = decodingBitmap.colorType();
// FIXME: If the alphaType is kUnpremul and the image has alpha, the
// colors may not be correct, since Skia does not yet support drawing
// to/from unpremultiplied bitmaps.
outputBitmap.setInfo(
bitmapInfo.makeWH(scaledWidth, scaledHeight).makeColorType(scaledColorType));
- if (!outputBitmap.tryAllocPixels(outputAllocator, NULL)) {
+ if (!outputBitmap.tryAllocPixels(outputAllocator)) {
// This should only fail on OOM. The recyclingAllocator should have
// enough memory since we check this before decoding using the
// scaleCheckingAllocator.
@@ -579,6 +541,9 @@
if (isHardware) {
sk_sp<Bitmap> hardwareBitmap = Bitmap::allocateHardwareBitmap(outputBitmap);
+ if (!hardwareBitmap.get()) {
+ return nullObjectReturn("Failed to allocate a hardware bitmap");
+ }
return bitmap::createBitmap(env, hardwareBitmap.release(), bitmapCreateFlags,
ninePatchChunk, ninePatchInsets, -1);
}
diff --git a/core/jni/android/graphics/BitmapRegionDecoder.cpp b/core/jni/android/graphics/BitmapRegionDecoder.cpp
index 9355cfc..3b081ef 100644
--- a/core/jni/android/graphics/BitmapRegionDecoder.cpp
+++ b/core/jni/android/graphics/BitmapRegionDecoder.cpp
@@ -33,7 +33,7 @@
#include "android_util_Binder.h"
#include "core_jni_helpers.h"
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include <androidfw/Asset.h>
#include <binder/Parcel.h>
#include <jni.h>
diff --git a/core/jni/android/graphics/CreateJavaOutputStreamAdaptor.cpp b/core/jni/android/graphics/CreateJavaOutputStreamAdaptor.cpp
index 067489a..0e907c3 100644
--- a/core/jni/android/graphics/CreateJavaOutputStreamAdaptor.cpp
+++ b/core/jni/android/graphics/CreateJavaOutputStreamAdaptor.cpp
@@ -5,7 +5,7 @@
#include "SkTypes.h"
#include "Utils.h"
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include <memory>
static jmethodID gInputStream_readMethodID;
diff --git a/core/jni/android/graphics/FontFamily.cpp b/core/jni/android/graphics/FontFamily.cpp
index 9ad57b1..4cf2b56 100644
--- a/core/jni/android/graphics/FontFamily.cpp
+++ b/core/jni/android/graphics/FontFamily.cpp
@@ -16,7 +16,7 @@
#define LOG_TAG "Minikin"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include <core_jni_helpers.h>
#include "SkData.h"
@@ -24,8 +24,8 @@
#include "SkRefCnt.h"
#include "SkTypeface.h"
#include "GraphicsJNI.h"
-#include <ScopedPrimitiveArray.h>
-#include <ScopedUtfChars.h>
+#include <nativehelper/ScopedPrimitiveArray.h>
+#include <nativehelper/ScopedUtfChars.h>
#include <android_runtime/AndroidRuntime.h>
#include <android_runtime/android_util_AssetManager.h>
#include <androidfw/AssetManager.h>
diff --git a/core/jni/android/graphics/GIFMovie.cpp b/core/jni/android/graphics/GIFMovie.cpp
index e501cf8..dd99b37 100644
--- a/core/jni/android/graphics/GIFMovie.cpp
+++ b/core/jni/android/graphics/GIFMovie.cpp
@@ -391,8 +391,8 @@
}
SkColor bgColor = SkPackARGB32(0, 0, 0, 0);
- if (gif->SColorMap != nullptr) {
- const GifColorType& col = gif->SColorMap->Colors[fGIF->SBackGroundColor];
+ if (gif->SColorMap != nullptr && gif->SBackGroundColor < gif->SColorMap->ColorCount) {
+ const GifColorType& col = gif->SColorMap->Colors[gif->SBackGroundColor];
bgColor = SkColorSetARGB(0xFF, col.Red, col.Green, col.Blue);
}
diff --git a/core/jni/android/graphics/Graphics.cpp b/core/jni/android/graphics/Graphics.cpp
index 5a2238f..7c75ff4 100644
--- a/core/jni/android/graphics/Graphics.cpp
+++ b/core/jni/android/graphics/Graphics.cpp
@@ -4,7 +4,7 @@
#include <sys/mman.h>
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "GraphicsJNI.h"
#include "core_jni_helpers.h"
@@ -327,8 +327,6 @@
return kARGB_4444_LegacyBitmapConfig;
case kRGB_565_SkColorType:
return kRGB_565_LegacyBitmapConfig;
- case kIndex_8_SkColorType:
- return kIndex8_LegacyBitmapConfig;
case kAlpha_8_SkColorType:
return kA8_LegacyBitmapConfig;
case kUnknown_SkColorType:
@@ -342,7 +340,7 @@
const uint8_t gConfig2ColorType[] = {
kUnknown_SkColorType,
kAlpha_8_SkColorType,
- kIndex_8_SkColorType,
+ kUnknown_SkColorType, // Previously kIndex_8_SkColorType,
kRGB_565_SkColorType,
kARGB_4444_SkColorType,
kN32_SkColorType,
@@ -435,7 +433,7 @@
///////////////////////////////////////////////////////////////////////////////
android::Bitmap* GraphicsJNI::mapAshmemBitmap(JNIEnv* env, SkBitmap* bitmap,
- SkColorTable* ctable, int fd, void* addr, size_t size, bool readOnly) {
+ int fd, void* addr, size_t size, bool readOnly) {
const SkImageInfo& info = bitmap->info();
if (info.colorType() == kUnknown_SkColorType) {
doThrowIAE(env, "unknown bitmap configuration");
@@ -456,7 +454,7 @@
// attempting to compute our own.
const size_t rowBytes = bitmap->rowBytes();
- auto wrapper = new android::Bitmap(addr, fd, size, info, rowBytes, sk_ref_sp(ctable));
+ auto wrapper = new android::Bitmap(addr, fd, size, info, rowBytes);
wrapper->getSkBitmap(bitmap);
if (readOnly) {
bitmap->pixelRef()->setImmutable();
@@ -609,8 +607,8 @@
}
///////////////////////////////////////////////////////////////////////////////
-bool HeapAllocator::allocPixelRef(SkBitmap* bitmap, SkColorTable* ctable) {
- mStorage = android::Bitmap::allocateHeapBitmap(bitmap, sk_ref_sp(ctable));
+bool HeapAllocator::allocPixelRef(SkBitmap* bitmap) {
+ mStorage = android::Bitmap::allocateHeapBitmap(bitmap);
return !!mStorage;
}
@@ -626,7 +624,7 @@
RecyclingClippingPixelAllocator::~RecyclingClippingPixelAllocator() {}
-bool RecyclingClippingPixelAllocator::allocPixelRef(SkBitmap* bitmap, SkColorTable* ctable) {
+bool RecyclingClippingPixelAllocator::allocPixelRef(SkBitmap* bitmap) {
// Ensure that the caller did not pass in a NULL bitmap to the constructor or this
// function.
LOG_ALWAYS_FATAL_IF(!mRecycledBitmap);
@@ -649,7 +647,7 @@
const size_t rowBytes = maxInfo.minRowBytes();
const size_t bytesNeeded = maxInfo.getSafeSize(rowBytes);
if (bytesNeeded <= mRecycledBytes) {
- // Here we take advantage of reconfigure() to reset the rowBytes and ctable
+ // Here we take advantage of reconfigure() to reset the rowBytes
// of mRecycledBitmap. It is very important that we pass in
// mRecycledBitmap->info() for the SkImageInfo. According to the
// specification for BitmapRegionDecoder, we are not allowed to change
@@ -658,7 +656,7 @@
// storage needs
mRecycledBitmap->reconfigure(
mRecycledBitmap->info().makeColorSpace(bitmap->refColorSpace()),
- rowBytes, sk_ref_sp(ctable));
+ rowBytes);
// Give the bitmap the same pixelRef as mRecycledBitmap.
// skbug.com/4538: We also need to make sure that the rowBytes on the pixel ref
@@ -685,7 +683,7 @@
// decode is complete.
mNeedsCopy = true;
- return heapAllocator.allocPixelRef(bitmap, ctable);
+ return heapAllocator.allocPixelRef(bitmap);
}
void RecyclingClippingPixelAllocator::copyIfNecessary() {
@@ -716,8 +714,8 @@
"env->GetJavaVM failed");
}
-bool AshmemPixelAllocator::allocPixelRef(SkBitmap* bitmap, SkColorTable* ctable) {
- mStorage = android::Bitmap::allocateAshmemBitmap(bitmap, sk_ref_sp(ctable));
+bool AshmemPixelAllocator::allocPixelRef(SkBitmap* bitmap) {
+ mStorage = android::Bitmap::allocateAshmemBitmap(bitmap);
return !!mStorage;
}
diff --git a/core/jni/android/graphics/GraphicsJNI.h b/core/jni/android/graphics/GraphicsJNI.h
index 7fbea25..7f4b384 100644
--- a/core/jni/android/graphics/GraphicsJNI.h
+++ b/core/jni/android/graphics/GraphicsJNI.h
@@ -91,7 +91,7 @@
static jobject createBitmapRegionDecoder(JNIEnv* env, SkBitmapRegionDecoder* bitmap);
static android::Bitmap* mapAshmemBitmap(JNIEnv* env, SkBitmap* bitmap,
- SkColorTable* ctable, int fd, void* addr, size_t size, bool readOnly);
+ int fd, void* addr, size_t size, bool readOnly);
/**
* Given a bitmap we natively allocate a memory block to store the contents
@@ -99,7 +99,7 @@
* SkPixelRef, which ensures that upon deletion the appropriate caches
* are notified.
*/
- static bool allocatePixels(JNIEnv* env, SkBitmap* bitmap, SkColorTable* ctable);
+ static bool allocatePixels(JNIEnv* env, SkBitmap* bitmap);
/** Copy the colors in colors[] to the bitmap, convert to the correct
format along the way.
@@ -127,7 +127,7 @@
HeapAllocator() { };
~HeapAllocator() { };
- virtual bool allocPixelRef(SkBitmap* bitmap, SkColorTable* ctable) override;
+ virtual bool allocPixelRef(SkBitmap* bitmap) override;
/**
* Fetches the backing allocation object. Must be called!
@@ -176,7 +176,7 @@
~RecyclingClippingPixelAllocator();
- virtual bool allocPixelRef(SkBitmap* bitmap, SkColorTable* ctable) override;
+ virtual bool allocPixelRef(SkBitmap* bitmap) override;
/**
* Must be called!
@@ -206,7 +206,7 @@
public:
explicit AshmemPixelAllocator(JNIEnv* env);
~AshmemPixelAllocator() { };
- virtual bool allocPixelRef(SkBitmap* bitmap, SkColorTable* ctable);
+ virtual bool allocPixelRef(SkBitmap* bitmap);
android::Bitmap* getStorageObjAndReset() {
return mStorage.release();
};
diff --git a/core/jni/android/graphics/Movie.cpp b/core/jni/android/graphics/Movie.cpp
index 776ed66..b243817 100644
--- a/core/jni/android/graphics/Movie.cpp
+++ b/core/jni/android/graphics/Movie.cpp
@@ -1,6 +1,6 @@
#include "CreateJavaOutputStreamAdaptor.h"
#include "GraphicsJNI.h"
-#include "ScopedLocalRef.h"
+#include <nativehelper/ScopedLocalRef.h>
#include "SkFrontBufferedStream.h"
#include "Movie.h"
#include "SkStream.h"
diff --git a/core/jni/android/graphics/NinePatch.cpp b/core/jni/android/graphics/NinePatch.cpp
index 91e5caf..460a0d7 100644
--- a/core/jni/android/graphics/NinePatch.cpp
+++ b/core/jni/android/graphics/NinePatch.cpp
@@ -31,7 +31,7 @@
#include "GraphicsJNI.h"
#include "NinePatchUtils.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "core_jni_helpers.h"
using namespace android;
@@ -91,7 +91,6 @@
jlong chunkHandle, jobject dstRect) {
Res_png_9patch* chunk = reinterpret_cast<Res_png_9patch*>(chunkHandle);
SkASSERT(chunk);
- SkASSERT(boundsRect);
SkBitmap bitmap;
GraphicsJNI::getSkBitmap(env, jbitmap, &bitmap);
diff --git a/core/jni/android/graphics/Paint.cpp b/core/jni/android/graphics/Paint.cpp
index fa25a8f..7c7a1c7 100644
--- a/core/jni/android/graphics/Paint.cpp
+++ b/core/jni/android/graphics/Paint.cpp
@@ -22,8 +22,8 @@
#include "jni.h"
#include "GraphicsJNI.h"
#include "core_jni_helpers.h"
-#include <ScopedStringChars.h>
-#include <ScopedUtfChars.h>
+#include <nativehelper/ScopedStringChars.h>
+#include <nativehelper/ScopedUtfChars.h>
#include "SkBlurDrawLooper.h"
#include "SkColorFilter.h"
@@ -961,6 +961,40 @@
return SkScalarToFloat(metrics.fDescent);
}
+ static jfloat getUnderlinePosition(jlong paintHandle, jlong typefaceHandle) {
+ Paint::FontMetrics metrics;
+ getMetricsInternal(paintHandle, typefaceHandle, &metrics);
+ SkScalar position;
+ if (metrics.hasUnderlinePosition(&position)) {
+ return SkScalarToFloat(position);
+ } else {
+ const SkScalar textSize = reinterpret_cast<Paint*>(paintHandle)->getTextSize();
+ return SkScalarToFloat(Paint::kStdUnderline_Top * textSize);
+ }
+ }
+
+ static jfloat getUnderlineThickness(jlong paintHandle, jlong typefaceHandle) {
+ Paint::FontMetrics metrics;
+ getMetricsInternal(paintHandle, typefaceHandle, &metrics);
+ SkScalar thickness;
+ if (metrics.hasUnderlineThickness(&thickness)) {
+ return SkScalarToFloat(thickness);
+ } else {
+ const SkScalar textSize = reinterpret_cast<Paint*>(paintHandle)->getTextSize();
+ return SkScalarToFloat(Paint::kStdUnderline_Thickness * textSize);
+ }
+ }
+
+ static jfloat getStrikeThruPosition(jlong paintHandle, jlong typefaceHandle) {
+ const SkScalar textSize = reinterpret_cast<Paint*>(paintHandle)->getTextSize();
+ return SkScalarToFloat(Paint::kStdStrikeThru_Top * textSize);
+ }
+
+ static jfloat getStrikeThruThickness(jlong paintHandle, jlong typefaceHandle) {
+ const SkScalar textSize = reinterpret_cast<Paint*>(paintHandle)->getTextSize();
+ return SkScalarToFloat(Paint::kStdStrikeThru_Thickness * textSize);
+ }
+
static void setShadowLayer(jlong paintHandle, jfloat radius,
jfloat dx, jfloat dy, jint color) {
Paint* paint = reinterpret_cast<Paint*>(paintHandle);
@@ -1072,6 +1106,10 @@
{"nSetHyphenEdit", "(JI)V", (void*) PaintGlue::setHyphenEdit},
{"nAscent","(JJ)F", (void*) PaintGlue::ascent},
{"nDescent","(JJ)F", (void*) PaintGlue::descent},
+ {"nGetUnderlinePosition","(JJ)F", (void*) PaintGlue::getUnderlinePosition},
+ {"nGetUnderlineThickness","(JJ)F", (void*) PaintGlue::getUnderlineThickness},
+ {"nGetStrikeThruPosition","(JJ)F", (void*) PaintGlue::getStrikeThruPosition},
+ {"nGetStrikeThruThickness","(JJ)F", (void*) PaintGlue::getStrikeThruThickness},
{"nSetShadowLayer", "(JFFFI)V", (void*)PaintGlue::setShadowLayer},
{"nHasShadowLayer", "(J)Z", (void*)PaintGlue::hasShadowLayer}
};
diff --git a/core/jni/android/graphics/Typeface.cpp b/core/jni/android/graphics/Typeface.cpp
index eb2ca5d..e4540c0 100644
--- a/core/jni/android/graphics/Typeface.cpp
+++ b/core/jni/android/graphics/Typeface.cpp
@@ -19,7 +19,7 @@
#include "FontUtils.h"
#include "GraphicsJNI.h"
-#include "ScopedPrimitiveArray.h"
+#include <nativehelper/ScopedPrimitiveArray.h>
#include "SkTypeface.h"
#include <android_runtime/android_util_AssetManager.h>
#include <androidfw/AssetManager.h>
diff --git a/core/jni/android/graphics/pdf/PdfEditor.cpp b/core/jni/android/graphics/pdf/PdfEditor.cpp
index c727519..e75712c 100644
--- a/core/jni/android/graphics/pdf/PdfEditor.cpp
+++ b/core/jni/android/graphics/pdf/PdfEditor.cpp
@@ -26,7 +26,7 @@
#include "PdfUtils.h"
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdelete-non-virtual-dtor"
diff --git a/core/jni/android/graphics/pdf/PdfRenderer.cpp b/core/jni/android/graphics/pdf/PdfRenderer.cpp
index 33bbdc4..95cdbb5 100644
--- a/core/jni/android/graphics/pdf/PdfRenderer.cpp
+++ b/core/jni/android/graphics/pdf/PdfRenderer.cpp
@@ -17,7 +17,7 @@
#include "PdfUtils.h"
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "GraphicsJNI.h"
#include "SkBitmap.h"
#include "SkMatrix.h"
diff --git a/core/jni/android/opengl/util.cpp b/core/jni/android/opengl/util.cpp
index 1370e61..1522c20 100644
--- a/core/jni/android/opengl/util.cpp
+++ b/core/jni/android/opengl/util.cpp
@@ -15,7 +15,7 @@
*/
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "GraphicsJNI.h"
#include <math.h>
@@ -49,27 +49,6 @@
pDest[3] = pM[3 + 4 * 0] * x + pM[3 + 4 * 1] * y + pM[3 + 4 * 2] * z + pM[3 + 4 * 3] * w;
}
-class MallocHelper {
-public:
- MallocHelper() {
- mData = 0;
- }
-
- ~MallocHelper() {
- if (mData != 0) {
- free(mData);
- }
- }
-
- void* alloc(size_t size) {
- mData = malloc(size);
- return mData;
- }
-
-private:
- void* mData;
-};
-
#if 0
static
void
@@ -85,10 +64,7 @@
static
int visibilityTest(float* pWS, float* pPositions, int positionsLength,
unsigned short* pIndices, int indexCount) {
- MallocHelper mallocHelper;
int result = POLY_CLIP_OUT;
- float* pTransformed = 0;
- int transformedIndexCount = 0;
if ( indexCount < 3 ) {
return POLY_CLIP_OUT;
@@ -116,8 +92,9 @@
return -1;
}
- transformedIndexCount = maxIndex - minIndex + 1;
- pTransformed = (float*) mallocHelper.alloc(transformedIndexCount * 4 * sizeof(float));
+ int transformedIndexCount = maxIndex - minIndex + 1;
+ std::unique_ptr<float[]> holder{new float[transformedIndexCount * 4]};
+ float* pTransformed = holder.get();
if (pTransformed == 0 ) {
return -2;
@@ -646,9 +623,6 @@
static int checkFormat(SkColorType colorType, int format, int type)
{
switch(colorType) {
- case kIndex_8_SkColorType:
- if (format == GL_PALETTE8_RGBA8_OES)
- return 0;
case kN32_SkColorType:
case kAlpha_8_SkColorType:
if (type == GL_UNSIGNED_BYTE)
@@ -680,8 +654,6 @@
return GL_RGBA;
case kN32_SkColorType:
return GL_RGBA;
- case kIndex_8_SkColorType:
- return GL_PALETTE8_RGBA8_OES;
case kRGB_565_SkColorType:
return GL_RGB;
default:
@@ -698,8 +670,6 @@
return GL_UNSIGNED_SHORT_4_4_4_4;
case kN32_SkColorType:
return GL_UNSIGNED_BYTE;
- case kIndex_8_SkColorType:
- return -1; // No type for compressed data.
case kRGB_565_SkColorType:
return GL_UNSIGNED_SHORT_5_6_5;
default:
@@ -743,28 +713,10 @@
const int h = bitmap.height();
const void* p = bitmap.getPixels();
if (internalformat == GL_PALETTE8_RGBA8_OES) {
- if (sizeof(SkPMColor) != sizeof(uint32_t)) {
- err = -1;
- goto error;
- }
- const size_t size = bitmap.getSize();
- const size_t palette_size = 256*sizeof(SkPMColor);
- const size_t imageSize = size + palette_size;
- void* const data = malloc(imageSize);
- if (data) {
- void* const pixels = (char*)data + palette_size;
- SkColorTable* ctable = bitmap.getColorTable();
- memcpy(data, ctable->readColors(), ctable->count() * sizeof(SkPMColor));
- memcpy(pixels, p, size);
- glCompressedTexImage2D(target, level, internalformat, w, h, border, imageSize, data);
- free(data);
- } else {
- err = -1;
- }
+ err = -1;
} else {
glTexImage2D(target, level, internalformat, w, h, border, internalformat, type, p);
}
-error:
return err;
}
diff --git a/core/jni/android_app_NativeActivity.cpp b/core/jni/android_app_NativeActivity.cpp
index ee74ef0..18f3177 100644
--- a/core/jni/android_app_NativeActivity.cpp
+++ b/core/jni/android_app_NativeActivity.cpp
@@ -35,7 +35,7 @@
#include <utils/Looper.h>
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "android_os_MessageQueue.h"
#include "android_view_InputChannel.h"
#include "android_view_KeyEvent.h"
@@ -45,7 +45,7 @@
#include "core_jni_helpers.h"
-#include "ScopedUtfChars.h"
+#include <nativehelper/ScopedUtfChars.h>
#define LOG_TRACE(...)
//#define LOG_TRACE(...) ALOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__)
diff --git a/core/jni/android_app_admin_SecurityLog.cpp b/core/jni/android_app_admin_SecurityLog.cpp
index e8ca793..5c45b4b 100644
--- a/core/jni/android_app_admin_SecurityLog.cpp
+++ b/core/jni/android_app_admin_SecurityLog.cpp
@@ -16,7 +16,7 @@
#include <fcntl.h>
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "core_jni_helpers.h"
#include "jni.h"
#include <private/android_logger.h>
diff --git a/core/jni/android_app_backup_FullBackup.cpp b/core/jni/android_app_backup_FullBackup.cpp
index 63b2e2a..3e39989 100644
--- a/core/jni/android_app_backup_FullBackup.cpp
+++ b/core/jni/android_app_backup_FullBackup.cpp
@@ -20,7 +20,7 @@
#include <utils/Log.h>
#include <utils/String8.h>
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
#include <androidfw/BackupHelpers.h>
diff --git a/core/jni/android_backup_BackupDataInput.cpp b/core/jni/android_backup_BackupDataInput.cpp
index 096a784..aa8acc16 100644
--- a/core/jni/android_backup_BackupDataInput.cpp
+++ b/core/jni/android_backup_BackupDataInput.cpp
@@ -17,7 +17,7 @@
#define LOG_TAG "FileBackupHelper_native"
#include <utils/Log.h>
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
#include <androidfw/BackupHelpers.h>
diff --git a/core/jni/android_backup_BackupDataOutput.cpp b/core/jni/android_backup_BackupDataOutput.cpp
index a7894f4..4f5d1f80 100644
--- a/core/jni/android_backup_BackupDataOutput.cpp
+++ b/core/jni/android_backup_BackupDataOutput.cpp
@@ -17,7 +17,7 @@
#define LOG_TAG "FileBackupHelper_native"
#include <utils/Log.h>
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "core_jni_helpers.h"
#include <androidfw/BackupHelpers.h>
diff --git a/core/jni/android_backup_BackupHelperDispatcher.cpp b/core/jni/android_backup_BackupHelperDispatcher.cpp
index 80bdaf8..fac7eba 100644
--- a/core/jni/android_backup_BackupHelperDispatcher.cpp
+++ b/core/jni/android_backup_BackupHelperDispatcher.cpp
@@ -17,7 +17,7 @@
#define LOG_TAG "BackupHelperDispatcher_native"
#include <utils/Log.h>
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
#include <sys/types.h>
diff --git a/core/jni/android_backup_FileBackupHelperBase.cpp b/core/jni/android_backup_FileBackupHelperBase.cpp
index 6d6ac1b..65840ee 100644
--- a/core/jni/android_backup_FileBackupHelperBase.cpp
+++ b/core/jni/android_backup_FileBackupHelperBase.cpp
@@ -17,7 +17,7 @@
#define LOG_TAG "FileBackupHelper_native"
#include <utils/Log.h>
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "core_jni_helpers.h"
#include <androidfw/BackupHelpers.h>
diff --git a/core/jni/android_content_res_ObbScanner.cpp b/core/jni/android_content_res_ObbScanner.cpp
index 36d78cf..de429a0 100644
--- a/core/jni/android_content_res_ObbScanner.cpp
+++ b/core/jni/android_content_res_ObbScanner.cpp
@@ -21,7 +21,7 @@
#include <androidfw/ObbFile.h>
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "utils/misc.h"
#include "android_runtime/AndroidRuntime.h"
diff --git a/core/jni/android_database_CursorWindow.cpp b/core/jni/android_database_CursorWindow.cpp
index f1fa76a..0d09b56 100644
--- a/core/jni/android_database_CursorWindow.cpp
+++ b/core/jni/android_database_CursorWindow.cpp
@@ -20,7 +20,7 @@
#include <inttypes.h>
#include <jni.h>
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
#include <utils/Log.h>
diff --git a/core/jni/android_database_SQLiteCommon.h b/core/jni/android_database_SQLiteCommon.h
index 0cac176..81164ef 100644
--- a/core/jni/android_database_SQLiteCommon.h
+++ b/core/jni/android_database_SQLiteCommon.h
@@ -18,7 +18,7 @@
#define _ANDROID_DATABASE_SQLITE_COMMON_H
#include <jni.h>
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include <sqlite3.h>
diff --git a/core/jni/android_database_SQLiteConnection.cpp b/core/jni/android_database_SQLiteConnection.cpp
index bcc3bb0..c3f9bf7 100644
--- a/core/jni/android_database_SQLiteConnection.cpp
+++ b/core/jni/android_database_SQLiteConnection.cpp
@@ -17,7 +17,7 @@
#define LOG_TAG "SQLiteConnection"
#include <jni.h>
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
#include <android_runtime/Log.h>
@@ -112,7 +112,8 @@
static jlong nativeOpen(JNIEnv* env, jclass clazz, jstring pathStr, jint openFlags,
- jstring labelStr, jboolean enableTrace, jboolean enableProfile) {
+ jstring labelStr, jboolean enableTrace, jboolean enableProfile, jint lookasideSz,
+ jint lookasideCnt) {
int sqliteFlags;
if (openFlags & SQLiteConnection::CREATE_IF_NECESSARY) {
sqliteFlags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE;
@@ -137,6 +138,16 @@
return 0;
}
+ if (lookasideSz >= 0 && lookasideCnt >= 0) {
+ int err = sqlite3_db_config(db, SQLITE_DBCONFIG_LOOKASIDE, NULL, lookasideSz, lookasideCnt);
+ if (err != SQLITE_OK) {
+ ALOGE("sqlite3_db_config(..., %d, %d) failed: %d", lookasideSz, lookasideCnt, err);
+ throw_sqlite3_exception(env, db, "Cannot set lookaside");
+ sqlite3_close(db);
+ return 0;
+ }
+ }
+
// Check that the database is really read/write when that is what we asked for.
if ((sqliteFlags & SQLITE_OPEN_READWRITE) && sqlite3_db_readonly(db, NULL)) {
throw_sqlite3_exception(env, db, "Could not open the database in read/write mode.");
@@ -789,7 +800,7 @@
static const JNINativeMethod sMethods[] =
{
/* name, signature, funcPtr */
- { "nativeOpen", "(Ljava/lang/String;ILjava/lang/String;ZZ)J",
+ { "nativeOpen", "(Ljava/lang/String;ILjava/lang/String;ZZII)J",
(void*)nativeOpen },
{ "nativeClose", "(J)V",
(void*)nativeClose },
diff --git a/core/jni/android_database_SQLiteDebug.cpp b/core/jni/android_database_SQLiteDebug.cpp
index 4e4c36c..3ba9b91 100644
--- a/core/jni/android_database_SQLiteDebug.cpp
+++ b/core/jni/android_database_SQLiteDebug.cpp
@@ -17,7 +17,7 @@
#define LOG_TAG "SQLiteDebug"
#include <jni.h>
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
#include <stdio.h>
diff --git a/core/jni/android_database_SQLiteGlobal.cpp b/core/jni/android_database_SQLiteGlobal.cpp
index 03e2387..ec5dc4a 100644
--- a/core/jni/android_database_SQLiteGlobal.cpp
+++ b/core/jni/android_database_SQLiteGlobal.cpp
@@ -17,7 +17,7 @@
#define LOG_TAG "SQLiteGlobal"
#include <jni.h>
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include "core_jni_helpers.h"
#include <sqlite3.h>
diff --git a/core/jni/android_ddm_DdmHandleNativeHeap.cpp b/core/jni/android_ddm_DdmHandleNativeHeap.cpp
index 3e7a04e..2f25d8f 100644
--- a/core/jni/android_ddm_DdmHandleNativeHeap.cpp
+++ b/core/jni/android_ddm_DdmHandleNativeHeap.cpp
@@ -18,7 +18,7 @@
#undef LOG_TAG
#define LOG_TAG "DdmHandleNativeHeap"
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include <jni.h>
#include "core_jni_helpers.h"
diff --git a/core/jni/android_graphics_Canvas.cpp b/core/jni/android_graphics_Canvas.cpp
index c0f719e..80f6abe 100644
--- a/core/jni/android_graphics_Canvas.cpp
+++ b/core/jni/android_graphics_Canvas.cpp
@@ -452,7 +452,7 @@
GraphicsJNI::defaultColorSpace());
SkBitmap bitmap;
bitmap.setInfo(info);
- sk_sp<Bitmap> androidBitmap = Bitmap::allocateHeapBitmap(&bitmap, NULL);
+ sk_sp<Bitmap> androidBitmap = Bitmap::allocateHeapBitmap(&bitmap);
if (!androidBitmap) {
return;
}
diff --git a/core/jni/android_hardware_Camera.cpp b/core/jni/android_hardware_Camera.cpp
index d606c2d..d6f8dc4 100644
--- a/core/jni/android_hardware_Camera.cpp
+++ b/core/jni/android_hardware_Camera.cpp
@@ -20,7 +20,7 @@
#include <utils/Log.h>
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "core_jni_helpers.h"
#include <android_runtime/android_graphics_SurfaceTexture.h>
#include <android_runtime/android_view_Surface.h>
diff --git a/core/jni/android_hardware_Radio.cpp b/core/jni/android_hardware_Radio.cpp
deleted file mode 100644
index 39e615c..0000000
--- a/core/jni/android_hardware_Radio.cpp
+++ /dev/null
@@ -1,967 +0,0 @@
-/*
-**
-** Copyright 2015, 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.
-*/
-
-#define LOG_NDEBUG 1
-#define LOG_TAG "Radio-JNI"
-#include <utils/Log.h>
-
-#include "jni.h"
-#include "JNIHelp.h"
-#include "core_jni_helpers.h"
-#include <system/radio.h>
-#include <system/RadioMetadataWrapper.h>
-#include <radio/RadioCallback.h>
-#include <radio/Radio.h>
-#include <utils/RefBase.h>
-#include <utils/Vector.h>
-#include <binder/IMemory.h>
-#include <binder/MemoryDealer.h>
-
-using namespace android;
-
-static jclass gArrayListClass;
-static struct {
- jmethodID add;
-} gArrayListMethods;
-
-static const char* const kRadioManagerClassPathName = "android/hardware/radio/RadioManager";
-static jclass gRadioManagerClass;
-
-static const char* const kRadioModuleClassPathName = "android/hardware/radio/RadioModule";
-static jclass gRadioModuleClass;
-static struct {
- jfieldID mNativeContext;
- jfieldID mId;
-} gModuleFields;
-static jmethodID gPostEventFromNative;
-
-static const char* const kModulePropertiesClassPathName =
- "android/hardware/radio/RadioManager$ModuleProperties";
-static jclass gModulePropertiesClass;
-static jmethodID gModulePropertiesCstor;
-
-
-static const char* const kRadioBandDescriptorClassPathName =
- "android/hardware/radio/RadioManager$BandDescriptor";
-static jclass gRadioBandDescriptorClass;
-static struct {
- jfieldID mRegion;
- jfieldID mType;
- jfieldID mLowerLimit;
- jfieldID mUpperLimit;
- jfieldID mSpacing;
-} gRadioBandDescriptorFields;
-
-static const char* const kRadioFmBandDescriptorClassPathName =
- "android/hardware/radio/RadioManager$FmBandDescriptor";
-static jclass gRadioFmBandDescriptorClass;
-static jmethodID gRadioFmBandDescriptorCstor;
-
-static const char* const kRadioAmBandDescriptorClassPathName =
- "android/hardware/radio/RadioManager$AmBandDescriptor";
-static jclass gRadioAmBandDescriptorClass;
-static jmethodID gRadioAmBandDescriptorCstor;
-
-static const char* const kRadioBandConfigClassPathName =
- "android/hardware/radio/RadioManager$BandConfig";
-static jclass gRadioBandConfigClass;
-static struct {
- jfieldID mDescriptor;
-} gRadioBandConfigFields;
-
-
-static const char* const kRadioFmBandConfigClassPathName =
- "android/hardware/radio/RadioManager$FmBandConfig";
-static jclass gRadioFmBandConfigClass;
-static jmethodID gRadioFmBandConfigCstor;
-static struct {
- jfieldID mStereo;
- jfieldID mRds;
- jfieldID mTa;
- jfieldID mAf;
- jfieldID mEa;
-} gRadioFmBandConfigFields;
-
-static const char* const kRadioAmBandConfigClassPathName =
- "android/hardware/radio/RadioManager$AmBandConfig";
-static jclass gRadioAmBandConfigClass;
-static jmethodID gRadioAmBandConfigCstor;
-static struct {
- jfieldID mStereo;
-} gRadioAmBandConfigFields;
-
-
-static const char* const kRadioProgramInfoClassPathName =
- "android/hardware/radio/RadioManager$ProgramInfo";
-static jclass gRadioProgramInfoClass;
-static jmethodID gRadioProgramInfoCstor;
-
-static const char* const kRadioMetadataClassPathName =
- "android/hardware/radio/RadioMetadata";
-static jclass gRadioMetadataClass;
-static jmethodID gRadioMetadataCstor;
-static struct {
- jmethodID putIntFromNative;
- jmethodID putStringFromNative;
- jmethodID putBitmapFromNative;
- jmethodID putClockFromNative;
-} gRadioMetadataMethods;
-
-static Mutex gLock;
-
-enum {
- RADIO_STATUS_OK = 0,
- RADIO_STATUS_ERROR = INT_MIN,
- RADIO_PERMISSION_DENIED = -1,
- RADIO_STATUS_NO_INIT = -19,
- RADIO_STATUS_BAD_VALUE = -22,
- RADIO_STATUS_DEAD_OBJECT = -32,
- RADIO_STATUS_INVALID_OPERATION = -38,
- RADIO_STATUS_TIMED_OUT = -110,
-};
-
-
-// ----------------------------------------------------------------------------
-
-static sp<Radio> getRadio(JNIEnv* env, jobject thiz)
-{
- Mutex::Autolock l(gLock);
- Radio* const radio = (Radio*)env->GetLongField(thiz, gModuleFields.mNativeContext);
- return sp<Radio>(radio);
-}
-
-static sp<Radio> setRadio(JNIEnv* env, jobject thiz, const sp<Radio>& module)
-{
- Mutex::Autolock l(gLock);
- sp<Radio> old = (Radio*)env->GetLongField(thiz, gModuleFields.mNativeContext);
- if (module.get()) {
- module->incStrong((void*)setRadio);
- }
- if (old != 0) {
- old->decStrong((void*)setRadio);
- }
- env->SetLongField(thiz, gModuleFields.mNativeContext, (jlong)module.get());
- return old;
-}
-
-static jint convertBandDescriptorFromNative(JNIEnv *env,
- jobject *jBandDescriptor,
- const radio_band_config_t *nBandconfig)
-{
- ALOGV("%s type %d region %d", __FUNCTION__, nBandconfig->band.type, nBandconfig->region);
-
- if (nBandconfig->band.type == RADIO_BAND_FM ||
- nBandconfig->band.type == RADIO_BAND_FM_HD) {
- *jBandDescriptor = env->NewObject(gRadioFmBandDescriptorClass, gRadioFmBandDescriptorCstor,
- nBandconfig->region, nBandconfig->band.type,
- nBandconfig->band.lower_limit, nBandconfig->band.upper_limit,
- nBandconfig->band.spacings[0],
- nBandconfig->band.fm.stereo,
- nBandconfig->band.fm.rds != RADIO_RDS_NONE,
- nBandconfig->band.fm.ta,
- nBandconfig->band.fm.af,
- nBandconfig->band.fm.ea);
- } else if (nBandconfig->band.type == RADIO_BAND_AM) {
- *jBandDescriptor = env->NewObject(gRadioAmBandDescriptorClass, gRadioAmBandDescriptorCstor,
- nBandconfig->region, nBandconfig->band.type,
- nBandconfig->band.lower_limit, nBandconfig->band.upper_limit,
- nBandconfig->band.spacings[0],
- nBandconfig->band.am.stereo);
- } else {
- ALOGE("%s unknown band type %d", __FUNCTION__, nBandconfig->band.type);
- return (jint)RADIO_STATUS_BAD_VALUE;
- }
-
- if (*jBandDescriptor == NULL) {
- return (jint)RADIO_STATUS_NO_INIT;
- }
-
- return (jint)RADIO_STATUS_OK;
-}
-
-static jint convertBandConfigFromNative(JNIEnv *env,
- jobject *jBandConfig,
- const radio_band_config_t *nBandconfig)
-{
- ALOGV("%s type %d region %d", __FUNCTION__, nBandconfig->band.type, nBandconfig->region);
-
- if (nBandconfig->band.type == RADIO_BAND_FM ||
- nBandconfig->band.type == RADIO_BAND_FM_HD) {
- *jBandConfig = env->NewObject(gRadioFmBandConfigClass, gRadioFmBandConfigCstor,
- nBandconfig->region, nBandconfig->band.type,
- nBandconfig->band.lower_limit, nBandconfig->band.upper_limit,
- nBandconfig->band.spacings[0],
- nBandconfig->band.fm.stereo,
- nBandconfig->band.fm.rds != RADIO_RDS_NONE,
- nBandconfig->band.fm.ta,
- nBandconfig->band.fm.af,
- nBandconfig->band.fm.ea);
- } else if (nBandconfig->band.type == RADIO_BAND_AM) {
- *jBandConfig = env->NewObject(gRadioAmBandConfigClass, gRadioAmBandConfigCstor,
- nBandconfig->region, nBandconfig->band.type,
- nBandconfig->band.lower_limit, nBandconfig->band.upper_limit,
- nBandconfig->band.spacings[0],
- nBandconfig->band.am.stereo);
- } else {
- ALOGE("%s unknown band type %d", __FUNCTION__, nBandconfig->band.type);
- return (jint)RADIO_STATUS_BAD_VALUE;
- }
-
- if (*jBandConfig == NULL) {
- return (jint)RADIO_STATUS_NO_INIT;
- }
-
- return (jint)RADIO_STATUS_OK;
-}
-
-static jint convertMetadataFromNative(JNIEnv *env,
- jobject *jMetadata,
- const radio_metadata_t *nMetadata)
-{
- ALOGV("%s", __FUNCTION__);
- int count = radio_metadata_get_count(nMetadata);
- if (count <= 0) {
- return (jint)count;
- }
- *jMetadata = env->NewObject(gRadioMetadataClass, gRadioMetadataCstor);
-
- jint jCount = 0;
- jint jStatus = 0;
- for (unsigned int i = 0; i < (unsigned int)count; i++) {
- radio_metadata_key_t key;
- radio_metadata_type_t type;
- void *value;
- size_t size;
- if (radio_metadata_get_at_index(nMetadata, i , &key, &type, &value, &size) != 0) {
- continue;
- }
- switch (type) {
- case RADIO_METADATA_TYPE_INT: {
- ALOGV("%s RADIO_METADATA_TYPE_INT %d", __FUNCTION__, key);
- int32_t val = *(int32_t *)value;
- jStatus = env->CallIntMethod(*jMetadata,
- gRadioMetadataMethods.putIntFromNative,
- key, (jint)val);
- if (jStatus == 0) {
- jCount++;
- }
- } break;
- case RADIO_METADATA_TYPE_TEXT: {
- ALOGV("%s RADIO_METADATA_TYPE_TEXT %d", __FUNCTION__, key);
- jstring jText = env->NewStringUTF((char *)value);
- jStatus = env->CallIntMethod(*jMetadata,
- gRadioMetadataMethods.putStringFromNative,
- key, jText);
- if (jStatus == 0) {
- jCount++;
- }
- env->DeleteLocalRef(jText);
- } break;
- case RADIO_METADATA_TYPE_RAW: {
- ALOGV("%s RADIO_METADATA_TYPE_RAW %d size %zu", __FUNCTION__, key, size);
- if (size == 0) {
- break;
- }
- jbyteArray jData = env->NewByteArray(size);
- if (jData == NULL) {
- break;
- }
- env->SetByteArrayRegion(jData, 0, size, (jbyte *)value);
- jStatus = env->CallIntMethod(*jMetadata,
- gRadioMetadataMethods.putBitmapFromNative,
- key, jData);
- if (jStatus == 0) {
- jCount++;
- }
- env->DeleteLocalRef(jData);
- } break;
- case RADIO_METADATA_TYPE_CLOCK: {
- ALOGV("%s RADIO_METADATA_TYPE_CLOCK %d", __FUNCTION__, key);
- radio_metadata_clock_t *clock = (radio_metadata_clock_t *) value;
- jStatus =
- env->CallIntMethod(*jMetadata,
- gRadioMetadataMethods.putClockFromNative,
- key, (jint) clock->utc_seconds_since_epoch,
- (jint) clock->timezone_offset_in_minutes);
- if (jStatus == 0) {
- jCount++;
- }
- } break;
- }
- }
- return jCount;
-}
-
-static jint convertProgramInfoFromNative(JNIEnv *env,
- jobject *jProgramInfo,
- const radio_program_info_t *nProgramInfo)
-{
- ALOGV("%s", __FUNCTION__);
- int jStatus;
- jobject jMetadata = NULL;
-
- if (nProgramInfo == nullptr || nProgramInfo->metadata == nullptr) {
- return (jint)RADIO_STATUS_BAD_VALUE;
- }
-
- jStatus = convertMetadataFromNative(env, &jMetadata, nProgramInfo->metadata);
- if (jStatus < 0) {
- return jStatus;
- }
-
- ALOGV("%s channel %d tuned %d", __FUNCTION__, nProgramInfo->channel, nProgramInfo->tuned);
-
- int flags = 0; // TODO(b/32621193): pass from the HAL
- jstring jVendorExension = env->NewStringUTF(""); // TODO(b/32621193): pass from the HAL
- *jProgramInfo = env->NewObject(gRadioProgramInfoClass, gRadioProgramInfoCstor,
- nProgramInfo->channel, nProgramInfo->sub_channel,
- nProgramInfo->tuned, nProgramInfo->stereo,
- nProgramInfo->digital, nProgramInfo->signal_strength,
- jMetadata, flags, jVendorExension);
-
- env->DeleteLocalRef(jMetadata);
- env->DeleteLocalRef(jVendorExension);
- return (jint)RADIO_STATUS_OK;
-}
-
-
-static jint convertBandConfigToNative(JNIEnv *env,
- radio_band_config_t *nBandconfig,
- jobject jBandConfig)
-{
- ALOGV("%s", __FUNCTION__);
-
- jobject jDescriptor = env->GetObjectField(jBandConfig, gRadioBandConfigFields.mDescriptor);
-
- if (jDescriptor == NULL) {
- return (jint)RADIO_STATUS_NO_INIT;
- }
-
- nBandconfig->region =
- (radio_region_t)env->GetIntField(jDescriptor, gRadioBandDescriptorFields.mRegion);
- nBandconfig->band.type =
- (radio_band_t)env->GetIntField(jDescriptor, gRadioBandDescriptorFields.mType);
- nBandconfig->band.lower_limit =
- env->GetIntField(jDescriptor, gRadioBandDescriptorFields.mLowerLimit);
- nBandconfig->band.upper_limit =
- env->GetIntField(jDescriptor, gRadioBandDescriptorFields.mUpperLimit);
- nBandconfig->band.num_spacings = 1;
- nBandconfig->band.spacings[0] =
- env->GetIntField(jDescriptor, gRadioBandDescriptorFields.mSpacing);
-
- if (env->IsInstanceOf(jBandConfig, gRadioFmBandConfigClass)) {
- nBandconfig->band.fm.deemphasis = radio_demephasis_for_region(nBandconfig->region);
- nBandconfig->band.fm.stereo =
- env->GetBooleanField(jBandConfig, gRadioFmBandConfigFields.mStereo);
- nBandconfig->band.fm.rds =
- radio_rds_for_region(env->GetBooleanField(jBandConfig,
- gRadioFmBandConfigFields.mRds),
- nBandconfig->region);
- nBandconfig->band.fm.ta = env->GetBooleanField(jBandConfig, gRadioFmBandConfigFields.mTa);
- nBandconfig->band.fm.af = env->GetBooleanField(jBandConfig, gRadioFmBandConfigFields.mAf);
- nBandconfig->band.fm.ea = env->GetBooleanField(jBandConfig, gRadioFmBandConfigFields.mEa);
- } else if (env->IsInstanceOf(jBandConfig, gRadioAmBandConfigClass)) {
- nBandconfig->band.am.stereo =
- env->GetBooleanField(jBandConfig, gRadioAmBandConfigFields.mStereo);
- } else {
- return (jint)RADIO_STATUS_BAD_VALUE;
- }
-
- return (jint)RADIO_STATUS_OK;
-}
-
-static jint
-android_hardware_Radio_listModules(JNIEnv *env, jobject clazz,
- jobject jModules)
-{
- ALOGV("%s", __FUNCTION__);
-
- if (jModules == NULL) {
- ALOGE("listModules NULL ArrayList");
- return RADIO_STATUS_BAD_VALUE;
- }
- if (!env->IsInstanceOf(jModules, gArrayListClass)) {
- ALOGE("listModules not an arraylist");
- return RADIO_STATUS_BAD_VALUE;
- }
-
- unsigned int numModules = 0;
- radio_properties_t *nModules = NULL;
-
- status_t status = Radio::listModules(nModules, &numModules);
- if (status != NO_ERROR || numModules == 0) {
- return (jint)status;
- }
-
- nModules = (radio_properties_t *)calloc(numModules, sizeof(radio_properties_t));
-
- status = Radio::listModules(nModules, &numModules);
- ALOGV("%s Radio::listModules status %d numModules %d", __FUNCTION__, status, numModules);
-
- if (status != NO_ERROR) {
- numModules = 0;
- }
-
- for (size_t i = 0; i < numModules; i++) {
- if (nModules[i].num_bands == 0) {
- continue;
- }
- ALOGV("%s module %zu id %d implementor %s product %s",
- __FUNCTION__, i, nModules[i].handle, nModules[i].implementor,
- nModules[i].product);
-
-
- jobjectArray jBands = env->NewObjectArray(nModules[i].num_bands,
- gRadioBandDescriptorClass, NULL);
-
- for (size_t j = 0; j < nModules[i].num_bands; j++) {
- jobject jBandDescriptor;
- int jStatus =
- convertBandDescriptorFromNative(env, &jBandDescriptor, &nModules[i].bands[j]);
- if (jStatus != RADIO_STATUS_OK) {
- continue;
- }
- env->SetObjectArrayElement(jBands, j, jBandDescriptor);
- env->DeleteLocalRef(jBandDescriptor);
- }
-
- if (env->GetArrayLength(jBands) == 0) {
- continue;
- }
- jstring jImplementor = env->NewStringUTF(nModules[i].implementor);
- jstring jProduct = env->NewStringUTF(nModules[i].product);
- jstring jVersion = env->NewStringUTF(nModules[i].version);
- jstring jSerial = env->NewStringUTF(nModules[i].serial);
- bool isBgscanSupported = false; // TODO(b/32621193): pass from the HAL
- jstring jVendorExension = env->NewStringUTF(""); // TODO(b/32621193): pass from the HAL
- jobject jModule = env->NewObject(gModulePropertiesClass, gModulePropertiesCstor,
- nModules[i].handle, nModules[i].class_id,
- jImplementor, jProduct, jVersion, jSerial,
- nModules[i].num_tuners,
- nModules[i].num_audio_sources,
- nModules[i].supports_capture,
- jBands, isBgscanSupported, jVendorExension);
-
- env->DeleteLocalRef(jImplementor);
- env->DeleteLocalRef(jProduct);
- env->DeleteLocalRef(jVersion);
- env->DeleteLocalRef(jSerial);
- env->DeleteLocalRef(jBands);
- env->DeleteLocalRef(jVendorExension);
- if (jModule == NULL) {
- continue;
- }
- env->CallBooleanMethod(jModules, gArrayListMethods.add, jModule);
- }
-
- free(nModules);
- return (jint) status;
-}
-
-// ----------------------------------------------------------------------------
-
-class JNIRadioCallback: public RadioCallback
-{
-public:
- JNIRadioCallback(JNIEnv* env, jobject thiz, jobject weak_thiz);
- ~JNIRadioCallback();
-
- virtual void onEvent(struct radio_event *event);
-
-private:
- jclass mClass; // Reference to Radio class
- jobject mObject; // Weak ref to Radio Java object to call on
-};
-
-JNIRadioCallback::JNIRadioCallback(JNIEnv* env, jobject thiz, jobject weak_thiz)
-{
-
- // Hold onto the RadioModule class for use in calling the static method
- // that posts events to the application thread.
- jclass clazz = env->GetObjectClass(thiz);
- if (clazz == NULL) {
- ALOGE("Can't find class %s", kRadioModuleClassPathName);
- return;
- }
- mClass = (jclass)env->NewGlobalRef(clazz);
-
- // We use a weak reference so the RadioModule object can be garbage collected.
- // The reference is only used as a proxy for callbacks.
- mObject = env->NewGlobalRef(weak_thiz);
-}
-
-JNIRadioCallback::~JNIRadioCallback()
-{
- // remove global references
- JNIEnv *env = AndroidRuntime::getJNIEnv();
- if (env == NULL) {
- return;
- }
- env->DeleteGlobalRef(mObject);
- env->DeleteGlobalRef(mClass);
-}
-
-void JNIRadioCallback::onEvent(struct radio_event *event)
-{
- JNIEnv *env = AndroidRuntime::getJNIEnv();
- if (env == NULL) {
- return;
- }
-
- ALOGV("%s", __FUNCTION__);
-
- jobject jObj = NULL;
- jint jArg2 = 0;
- jint jStatus = RADIO_STATUS_OK;
- switch (event->type) {
- case RADIO_EVENT_CONFIG:
- jStatus = convertBandConfigFromNative(env, &jObj, &event->config);
- break;
- case RADIO_EVENT_TUNED:
- case RADIO_EVENT_AF_SWITCH:
- ALOGV("%s RADIO_EVENT_TUNED channel %d", __FUNCTION__, event->info.channel);
- jStatus = convertProgramInfoFromNative(env, &jObj, &event->info);
- break;
- case RADIO_EVENT_METADATA:
- jStatus = convertMetadataFromNative(env, &jObj, event->metadata);
- if (jStatus >= 0) {
- jStatus = RADIO_STATUS_OK;
- }
- break;
- case RADIO_EVENT_ANTENNA:
- case RADIO_EVENT_TA:
- case RADIO_EVENT_EA:
- case RADIO_EVENT_CONTROL:
- jArg2 = event->on ? 1 : 0;
- break;
- }
-
- if (jStatus != RADIO_STATUS_OK) {
- return;
- }
- env->CallStaticVoidMethod(mClass, gPostEventFromNative, mObject,
- event->type, event->status, jArg2, jObj);
-
- env->DeleteLocalRef(jObj);
- if (env->ExceptionCheck()) {
- ALOGW("An exception occurred while notifying an event.");
- env->ExceptionClear();
- }
-}
-
-// ----------------------------------------------------------------------------
-
-static void
-android_hardware_Radio_setup(JNIEnv *env, jobject thiz,
- jobject weak_this, jobject jConfig, jboolean withAudio)
-{
- ALOGV("%s", __FUNCTION__);
-
- setRadio(env, thiz, 0);
-
- sp<JNIRadioCallback> callback = new JNIRadioCallback(env, thiz, weak_this);
-
- radio_handle_t handle = (radio_handle_t)env->GetIntField(thiz, gModuleFields.mId);
-
- struct radio_band_config nConfig;
- struct radio_band_config *configPtr = NULL;
- if (jConfig != NULL) {
- jint jStatus = convertBandConfigToNative(env, &nConfig, jConfig);
- if (jStatus != RADIO_STATUS_OK) {
- return;
- }
- configPtr = &nConfig;
- }
- sp<Radio> module = Radio::attach(handle, configPtr, (bool)withAudio, callback);
- if (module == 0) {
- return;
- }
-
- setRadio(env, thiz, module);
-}
-
-static void
-android_hardware_Radio_close(JNIEnv *env, jobject thiz)
-{
- ALOGV("%s", __FUNCTION__);
- sp<Radio> module = setRadio(env, thiz, 0);
- ALOGV("detach module %p", module.get());
- if (module != 0) {
- ALOGV("detach module->detach()");
- module->detach();
- }
-}
-
-static void
-android_hardware_Radio_finalize(JNIEnv *env, jobject thiz)
-{
- ALOGV("%s", __FUNCTION__);
- sp<Radio> module = getRadio(env, thiz);
- if (module != 0) {
- ALOGW("Radio finalized without being detached");
- }
- android_hardware_Radio_close(env, thiz);
-}
-
-static jint
-android_hardware_Radio_setConfiguration(JNIEnv *env, jobject thiz, jobject jConfig)
-{
- ALOGV("%s", __FUNCTION__);
- sp<Radio> module = getRadio(env, thiz);
- if (module == NULL) {
- return RADIO_STATUS_NO_INIT;
- }
-
- if (!env->IsInstanceOf(jConfig, gRadioFmBandConfigClass) &&
- !env->IsInstanceOf(jConfig, gRadioAmBandConfigClass)) {
- return RADIO_STATUS_BAD_VALUE;
- }
-
- struct radio_band_config nConfig;
- jint jStatus = convertBandConfigToNative(env, &nConfig, jConfig);
- if (jStatus != RADIO_STATUS_OK) {
- return jStatus;
- }
-
- status_t status = module->setConfiguration(&nConfig);
- return (jint)status;
-}
-
-static jint
-android_hardware_Radio_getConfiguration(JNIEnv *env, jobject thiz, jobjectArray jConfigs)
-{
- ALOGV("%s", __FUNCTION__);
- sp<Radio> module = getRadio(env, thiz);
- if (module == NULL) {
- return RADIO_STATUS_NO_INIT;
- }
- if (env->GetArrayLength(jConfigs) != 1) {
- return (jint)RADIO_STATUS_BAD_VALUE;
- }
-
- struct radio_band_config nConfig;
-
- status_t status = module->getConfiguration(&nConfig);
- if (status != NO_ERROR) {
- return (jint)status;
- }
- jobject jConfig;
- int jStatus = convertBandConfigFromNative(env, &jConfig, &nConfig);
- if (jStatus != RADIO_STATUS_OK) {
- return jStatus;
- }
- env->SetObjectArrayElement(jConfigs, 0, jConfig);
- env->DeleteLocalRef(jConfig);
- return RADIO_STATUS_OK;
-}
-
-static jint
-android_hardware_Radio_setMute(JNIEnv *env, jobject thiz, jboolean mute)
-{
- ALOGV("%s", __FUNCTION__);
- sp<Radio> module = getRadio(env, thiz);
- if (module == NULL) {
- return RADIO_STATUS_NO_INIT;
- }
- status_t status = module->setMute((bool)mute);
- return (jint)status;
-}
-
-static jboolean
-android_hardware_Radio_getMute(JNIEnv *env, jobject thiz)
-{
- ALOGV("%s", __FUNCTION__);
- sp<Radio> module = getRadio(env, thiz);
- if (module == NULL) {
- return true;
- }
- bool mute = true;
- status_t status = module->getMute(&mute);
- if (status != NO_ERROR) {
- return true;
- }
- return (jboolean)mute;
-}
-
-static jint
-android_hardware_Radio_step(JNIEnv *env, jobject thiz, jint direction, jboolean skipSubChannel)
-{
- ALOGV("%s", __FUNCTION__);
- sp<Radio> module = getRadio(env, thiz);
- if (module == NULL) {
- return RADIO_STATUS_NO_INIT;
- }
- status_t status = module->step((radio_direction_t)direction, (bool)skipSubChannel);
- return (jint)status;
-}
-
-static jint
-android_hardware_Radio_scan(JNIEnv *env, jobject thiz, jint direction, jboolean skipSubChannel)
-{
- ALOGV("%s", __FUNCTION__);
- sp<Radio> module = getRadio(env, thiz);
- if (module == NULL) {
- return RADIO_STATUS_NO_INIT;
- }
- status_t status = module->scan((radio_direction_t)direction, (bool)skipSubChannel);
- return (jint)status;
-}
-
-static jint
-android_hardware_Radio_tune(JNIEnv *env, jobject thiz, jint channel, jint subChannel)
-{
- ALOGV("%s", __FUNCTION__);
- sp<Radio> module = getRadio(env, thiz);
- if (module == NULL) {
- return RADIO_STATUS_NO_INIT;
- }
- status_t status = module->tune((uint32_t)channel, (uint32_t)subChannel);
- return (jint)status;
-}
-
-static jint
-android_hardware_Radio_cancel(JNIEnv *env, jobject thiz)
-{
- ALOGV("%s", __FUNCTION__);
- sp<Radio> module = getRadio(env, thiz);
- if (module == NULL) {
- return RADIO_STATUS_NO_INIT;
- }
- status_t status = module->cancel();
- return (jint)status;
-}
-
-static jint
-android_hardware_Radio_getProgramInformation(JNIEnv *env, jobject thiz, jobjectArray jInfos)
-{
- ALOGV("%s", __FUNCTION__);
- sp<Radio> module = getRadio(env, thiz);
- if (module == NULL) {
- return RADIO_STATUS_NO_INIT;
- }
- if (env->GetArrayLength(jInfos) != 1) {
- return (jint)RADIO_STATUS_BAD_VALUE;
- }
-
- struct radio_program_info nInfo;
- RadioMetadataWrapper metadataWrapper(&nInfo.metadata);
- jobject jInfo = NULL;
- int jStatus;
-
- jStatus = (int)module->getProgramInformation(&nInfo);
- if (jStatus != RADIO_STATUS_OK) {
- goto exit;
- }
- jStatus = convertProgramInfoFromNative(env, &jInfo, &nInfo);
- if (jStatus != RADIO_STATUS_OK) {
- goto exit;
- }
- env->SetObjectArrayElement(jInfos, 0, jInfo);
-
-exit:
- if (jInfo != NULL) {
- env->DeleteLocalRef(jInfo);
- }
- return jStatus;
-}
-
-static jboolean
-android_hardware_Radio_isAntennaConnected(JNIEnv *env, jobject thiz)
-{
- ALOGV("%s", __FUNCTION__);
- sp<Radio> module = getRadio(env, thiz);
- if (module == NULL) {
- return false;
- }
-
- struct radio_band_config nConfig;
-
- status_t status = module->getConfiguration(&nConfig);
- if (status != NO_ERROR) {
- return false;
- }
-
- return (jboolean)nConfig.band.antenna_connected;
-}
-
-
-static jboolean
-android_hardware_Radio_hasControl(JNIEnv *env, jobject thiz)
-{
- ALOGV("%s", __FUNCTION__);
- sp<Radio> module = getRadio(env, thiz);
- if (module == NULL) {
- return false;
- }
-
- bool hasControl;
- status_t status = module->hasControl(&hasControl);
- if (status != NO_ERROR) {
- return false;
- }
-
- return (jboolean)hasControl;
-}
-
-
-static JNINativeMethod gMethods[] = {
- {"listModules",
- "(Ljava/util/List;)I",
- (void *)android_hardware_Radio_listModules},
-};
-
-static JNINativeMethod gModuleMethods[] = {
- {"native_setup",
- "(Ljava/lang/Object;Landroid/hardware/radio/RadioManager$BandConfig;Z)V",
- (void *)android_hardware_Radio_setup},
- {"native_finalize",
- "()V",
- (void *)android_hardware_Radio_finalize},
- {"close",
- "()V",
- (void *)android_hardware_Radio_close},
- {"setConfiguration",
- "(Landroid/hardware/radio/RadioManager$BandConfig;)I",
- (void *)android_hardware_Radio_setConfiguration},
- {"getConfiguration",
- "([Landroid/hardware/radio/RadioManager$BandConfig;)I",
- (void *)android_hardware_Radio_getConfiguration},
- {"setMute",
- "(Z)I",
- (void *)android_hardware_Radio_setMute},
- {"getMute",
- "()Z",
- (void *)android_hardware_Radio_getMute},
- {"step",
- "(IZ)I",
- (void *)android_hardware_Radio_step},
- {"scan",
- "(IZ)I",
- (void *)android_hardware_Radio_scan},
- {"tune",
- "(II)I",
- (void *)android_hardware_Radio_tune},
- {"cancel",
- "()I",
- (void *)android_hardware_Radio_cancel},
- {"getProgramInformation",
- "([Landroid/hardware/radio/RadioManager$ProgramInfo;)I",
- (void *)android_hardware_Radio_getProgramInformation},
- {"isAntennaConnected",
- "()Z",
- (void *)android_hardware_Radio_isAntennaConnected},
- {"hasControl",
- "()Z",
- (void *)android_hardware_Radio_hasControl},
-};
-
-int register_android_hardware_Radio(JNIEnv *env)
-{
- jclass arrayListClass = FindClassOrDie(env, "java/util/ArrayList");
- gArrayListClass = MakeGlobalRefOrDie(env, arrayListClass);
- gArrayListMethods.add = GetMethodIDOrDie(env, arrayListClass, "add", "(Ljava/lang/Object;)Z");
-
- jclass lClass = FindClassOrDie(env, kRadioManagerClassPathName);
- gRadioManagerClass = MakeGlobalRefOrDie(env, lClass);
-
- jclass moduleClass = FindClassOrDie(env, kRadioModuleClassPathName);
- gRadioModuleClass = MakeGlobalRefOrDie(env, moduleClass);
- gPostEventFromNative = GetStaticMethodIDOrDie(env, moduleClass, "postEventFromNative",
- "(Ljava/lang/Object;IIILjava/lang/Object;)V");
- gModuleFields.mNativeContext = GetFieldIDOrDie(env, moduleClass, "mNativeContext", "J");
- gModuleFields.mId = GetFieldIDOrDie(env, moduleClass, "mId", "I");
-
- jclass modulePropertiesClass = FindClassOrDie(env, kModulePropertiesClassPathName);
- gModulePropertiesClass = MakeGlobalRefOrDie(env, modulePropertiesClass);
- gModulePropertiesCstor = GetMethodIDOrDie(env, modulePropertiesClass, "<init>",
- "(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IIZ[Landroid/hardware/radio/RadioManager$BandDescriptor;ZLjava/lang/String;)V");
-
- jclass bandDescriptorClass = FindClassOrDie(env, kRadioBandDescriptorClassPathName);
- gRadioBandDescriptorClass = MakeGlobalRefOrDie(env, bandDescriptorClass);
- gRadioBandDescriptorFields.mRegion = GetFieldIDOrDie(env, bandDescriptorClass, "mRegion", "I");
- gRadioBandDescriptorFields.mType = GetFieldIDOrDie(env, bandDescriptorClass, "mType", "I");
- gRadioBandDescriptorFields.mLowerLimit =
- GetFieldIDOrDie(env, bandDescriptorClass, "mLowerLimit", "I");
- gRadioBandDescriptorFields.mUpperLimit =
- GetFieldIDOrDie(env, bandDescriptorClass, "mUpperLimit", "I");
- gRadioBandDescriptorFields.mSpacing =
- GetFieldIDOrDie(env, bandDescriptorClass, "mSpacing", "I");
-
- jclass fmBandDescriptorClass = FindClassOrDie(env, kRadioFmBandDescriptorClassPathName);
- gRadioFmBandDescriptorClass = MakeGlobalRefOrDie(env, fmBandDescriptorClass);
- gRadioFmBandDescriptorCstor = GetMethodIDOrDie(env, fmBandDescriptorClass, "<init>",
- "(IIIIIZZZZZ)V");
-
- jclass amBandDescriptorClass = FindClassOrDie(env, kRadioAmBandDescriptorClassPathName);
- gRadioAmBandDescriptorClass = MakeGlobalRefOrDie(env, amBandDescriptorClass);
- gRadioAmBandDescriptorCstor = GetMethodIDOrDie(env, amBandDescriptorClass, "<init>",
- "(IIIIIZ)V");
-
- jclass bandConfigClass = FindClassOrDie(env, kRadioBandConfigClassPathName);
- gRadioBandConfigClass = MakeGlobalRefOrDie(env, bandConfigClass);
- gRadioBandConfigFields.mDescriptor =
- GetFieldIDOrDie(env, bandConfigClass, "mDescriptor",
- "Landroid/hardware/radio/RadioManager$BandDescriptor;");
-
- jclass fmBandConfigClass = FindClassOrDie(env, kRadioFmBandConfigClassPathName);
- gRadioFmBandConfigClass = MakeGlobalRefOrDie(env, fmBandConfigClass);
- gRadioFmBandConfigCstor = GetMethodIDOrDie(env, fmBandConfigClass, "<init>",
- "(IIIIIZZZZZ)V");
- gRadioFmBandConfigFields.mStereo = GetFieldIDOrDie(env, fmBandConfigClass, "mStereo", "Z");
- gRadioFmBandConfigFields.mRds = GetFieldIDOrDie(env, fmBandConfigClass, "mRds", "Z");
- gRadioFmBandConfigFields.mTa = GetFieldIDOrDie(env, fmBandConfigClass, "mTa", "Z");
- gRadioFmBandConfigFields.mAf = GetFieldIDOrDie(env, fmBandConfigClass, "mAf", "Z");
- gRadioFmBandConfigFields.mEa =
- GetFieldIDOrDie(env, fmBandConfigClass, "mEa", "Z");
-
-
- jclass amBandConfigClass = FindClassOrDie(env, kRadioAmBandConfigClassPathName);
- gRadioAmBandConfigClass = MakeGlobalRefOrDie(env, amBandConfigClass);
- gRadioAmBandConfigCstor = GetMethodIDOrDie(env, amBandConfigClass, "<init>",
- "(IIIIIZ)V");
- gRadioAmBandConfigFields.mStereo = GetFieldIDOrDie(env, amBandConfigClass, "mStereo", "Z");
-
- jclass programInfoClass = FindClassOrDie(env, kRadioProgramInfoClassPathName);
- gRadioProgramInfoClass = MakeGlobalRefOrDie(env, programInfoClass);
- gRadioProgramInfoCstor = GetMethodIDOrDie(env, programInfoClass, "<init>",
- "(IIZZZILandroid/hardware/radio/RadioMetadata;ILjava/lang/String;)V");
-
- jclass metadataClass = FindClassOrDie(env, kRadioMetadataClassPathName);
- gRadioMetadataClass = MakeGlobalRefOrDie(env, metadataClass);
- gRadioMetadataCstor = GetMethodIDOrDie(env, metadataClass, "<init>", "()V");
- gRadioMetadataMethods.putIntFromNative = GetMethodIDOrDie(env, metadataClass,
- "putIntFromNative",
- "(II)I");
- gRadioMetadataMethods.putStringFromNative = GetMethodIDOrDie(env, metadataClass,
- "putStringFromNative",
- "(ILjava/lang/String;)I");
- gRadioMetadataMethods.putBitmapFromNative = GetMethodIDOrDie(env, metadataClass,
- "putBitmapFromNative",
- "(I[B)I");
- gRadioMetadataMethods.putClockFromNative = GetMethodIDOrDie(env, metadataClass,
- "putClockFromNative",
- "(IJI)I");
-
-
- RegisterMethodsOrDie(env, kRadioManagerClassPathName, gMethods, NELEM(gMethods));
-
- int ret = RegisterMethodsOrDie(env, kRadioModuleClassPathName, gModuleMethods, NELEM(gModuleMethods));
-
- ALOGV("%s DONE", __FUNCTION__);
-
- return ret;
-}
diff --git a/core/jni/android_hardware_SensorManager.cpp b/core/jni/android_hardware_SensorManager.cpp
index e90a41c..5b327d4 100644
--- a/core/jni/android_hardware_SensorManager.cpp
+++ b/core/jni/android_hardware_SensorManager.cpp
@@ -15,13 +15,13 @@
*/
#define LOG_TAG "SensorManager"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "android_os_MessageQueue.h"
#include "core_jni_helpers.h"
#include "jni.h"
-#include <ScopedUtfChars.h>
-#include <ScopedLocalRef.h>
+#include <nativehelper/ScopedUtfChars.h>
+#include <nativehelper/ScopedLocalRef.h>
#include <android_runtime/AndroidRuntime.h>
#include <android_runtime/android_hardware_HardwareBuffer.h>
#include <vndk/hardware_buffer.h>
diff --git a/core/jni/android_hardware_SerialPort.cpp b/core/jni/android_hardware_SerialPort.cpp
index 393dc7b..190ddce 100644
--- a/core/jni/android_hardware_SerialPort.cpp
+++ b/core/jni/android_hardware_SerialPort.cpp
@@ -19,7 +19,7 @@
#include "utils/Log.h"
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "core_jni_helpers.h"
#include <stdio.h>
diff --git a/core/jni/android_hardware_SoundTrigger.cpp b/core/jni/android_hardware_SoundTrigger.cpp
index 0c7f5a1..9dbb8d7 100644
--- a/core/jni/android_hardware_SoundTrigger.cpp
+++ b/core/jni/android_hardware_SoundTrigger.cpp
@@ -20,7 +20,7 @@
#include <utils/Log.h>
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "core_jni_helpers.h"
#include <system/sound_trigger.h>
#include <soundtrigger/SoundTriggerCallback.h>
diff --git a/core/jni/android_hardware_UsbDevice.cpp b/core/jni/android_hardware_UsbDevice.cpp
index 89d33e2..879d409 100644
--- a/core/jni/android_hardware_UsbDevice.cpp
+++ b/core/jni/android_hardware_UsbDevice.cpp
@@ -19,7 +19,7 @@
#include "utils/Log.h"
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "core_jni_helpers.h"
#include <usbhost/usbhost.h>
diff --git a/core/jni/android_hardware_UsbDeviceConnection.cpp b/core/jni/android_hardware_UsbDeviceConnection.cpp
index ba08bce..d953aee 100644
--- a/core/jni/android_hardware_UsbDeviceConnection.cpp
+++ b/core/jni/android_hardware_UsbDeviceConnection.cpp
@@ -19,7 +19,7 @@
#include "utils/Log.h"
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "core_jni_helpers.h"
#include <usbhost/usbhost.h>
diff --git a/core/jni/android_hardware_UsbRequest.cpp b/core/jni/android_hardware_UsbRequest.cpp
index 01fe078..9bdb605 100644
--- a/core/jni/android_hardware_UsbRequest.cpp
+++ b/core/jni/android_hardware_UsbRequest.cpp
@@ -19,7 +19,7 @@
#include "utils/Log.h"
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "core_jni_helpers.h"
#include <usbhost/usbhost.h>
diff --git a/core/jni/android_hardware_camera2_CameraMetadata.cpp b/core/jni/android_hardware_camera2_CameraMetadata.cpp
index d8eb7d2..fad5b0e 100644
--- a/core/jni/android_hardware_camera2_CameraMetadata.cpp
+++ b/core/jni/android_hardware_camera2_CameraMetadata.cpp
@@ -28,7 +28,7 @@
#include <vector>
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "android_os_Parcel.h"
#include "core_jni_helpers.h"
#include "android_runtime/android_hardware_camera2_CameraMetadata.h"
diff --git a/core/jni/android_hardware_camera2_DngCreator.cpp b/core/jni/android_hardware_camera2_DngCreator.cpp
index 3d021d6..c8eef7f 100644
--- a/core/jni/android_hardware_camera2_DngCreator.cpp
+++ b/core/jni/android_hardware_camera2_DngCreator.cpp
@@ -46,7 +46,7 @@
#include "android_runtime/android_hardware_camera2_CameraMetadata.h"
#include <jni.h>
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
using namespace android;
using namespace img_utils;
diff --git a/core/jni/android_hardware_camera2_legacy_LegacyCameraDevice.cpp b/core/jni/android_hardware_camera2_legacy_LegacyCameraDevice.cpp
index 7121194..863ca8b 100644
--- a/core/jni/android_hardware_camera2_legacy_LegacyCameraDevice.cpp
+++ b/core/jni/android_hardware_camera2_legacy_LegacyCameraDevice.cpp
@@ -22,7 +22,7 @@
#include <camera/CameraUtils.h>
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "core_jni_helpers.h"
#include "android_runtime/android_view_Surface.h"
#include "android_runtime/android_graphics_SurfaceTexture.h"
diff --git a/core/jni/android_hardware_camera2_legacy_PerfMeasurement.cpp b/core/jni/android_hardware_camera2_legacy_PerfMeasurement.cpp
index a081665..fac243a 100644
--- a/core/jni/android_hardware_camera2_legacy_PerfMeasurement.cpp
+++ b/core/jni/android_hardware_camera2_legacy_PerfMeasurement.cpp
@@ -21,7 +21,7 @@
#include <utils/Vector.h>
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "core_jni_helpers.h"
#include <ui/GraphicBuffer.h>
diff --git a/core/jni/android_hardware_location_ActivityRecognitionHardware.cpp b/core/jni/android_hardware_location_ActivityRecognitionHardware.cpp
index 637234f..1c9ab94 100644
--- a/core/jni/android_hardware_location_ActivityRecognitionHardware.cpp
+++ b/core/jni/android_hardware_location_ActivityRecognitionHardware.cpp
@@ -17,7 +17,7 @@
#define LOG_TAG "ActivityRecognitionHardware"
#include <jni.h>
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
#include <android_runtime/Log.h>
diff --git a/core/jni/android_media_AudioRecord.cpp b/core/jni/android_media_AudioRecord.cpp
index 5e93fc9..e4da3c6 100644
--- a/core/jni/android_media_AudioRecord.cpp
+++ b/core/jni/android_media_AudioRecord.cpp
@@ -20,13 +20,13 @@
#include <inttypes.h>
#include <jni.h>
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include "core_jni_helpers.h"
#include <utils/Log.h>
#include <media/AudioRecord.h>
-#include <ScopedUtfChars.h>
+#include <nativehelper/ScopedUtfChars.h>
#include "android_media_AudioFormat.h"
#include "android_media_AudioErrors.h"
diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp
index 1779ada..7ec68ed 100644
--- a/core/jni/android_media_AudioSystem.cpp
+++ b/core/jni/android_media_AudioSystem.cpp
@@ -22,7 +22,7 @@
#include <sstream>
#include <jni.h>
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include "core_jni_helpers.h"
#include <media/AudioSystem.h>
@@ -396,7 +396,7 @@
}
static void
-android_media_AudioSystem_recording_callback(int event, audio_session_t session, int source,
+android_media_AudioSystem_recording_callback(int event, const record_client_info_t *clientInfo,
const audio_config_base_t *clientConfig, const audio_config_base_t *deviceConfig,
audio_patch_handle_t patchHandle)
{
@@ -404,8 +404,8 @@
if (env == NULL) {
return;
}
- if (clientConfig == NULL || deviceConfig == NULL) {
- ALOGE("Unexpected null client/device configurations in recording callback");
+ if (clientInfo == NULL || clientConfig == NULL || deviceConfig == NULL) {
+ ALOGE("Unexpected null client/device info or configurations in recording callback");
return;
}
@@ -433,7 +433,7 @@
jclass clazz = env->FindClass(kClassPathName);
env->CallStaticVoidMethod(clazz,
gAudioPolicyEventHandlerMethods.postRecordConfigEventFromNative,
- event, session, source, recParamArray);
+ event, (jint) clientInfo->uid, clientInfo->session, clientInfo->source, recParamArray);
env->DeleteLocalRef(clazz);
env->DeleteLocalRef(recParamArray);
@@ -1930,7 +1930,7 @@
"dynamicPolicyCallbackFromNative", "(ILjava/lang/String;I)V");
gAudioPolicyEventHandlerMethods.postRecordConfigEventFromNative =
GetStaticMethodIDOrDie(env, env->FindClass(kClassPathName),
- "recordingCallbackFromNative", "(III[I)V");
+ "recordingCallbackFromNative", "(IIII[I)V");
jclass audioMixClass = FindClassOrDie(env, "android/media/audiopolicy/AudioMix");
gAudioMixClass = MakeGlobalRefOrDie(env, audioMixClass);
diff --git a/core/jni/android_media_AudioTrack.cpp b/core/jni/android_media_AudioTrack.cpp
index 3e9ffce..c7ed599 100644
--- a/core/jni/android_media_AudioTrack.cpp
+++ b/core/jni/android_media_AudioTrack.cpp
@@ -19,11 +19,11 @@
#include "android_media_AudioTrack.h"
-#include <JNIHelp.h>
-#include <JniConstants.h>
+#include <nativehelper/JNIHelp.h>
+#include <nativehelper/JniConstants.h>
#include "core_jni_helpers.h"
-#include "ScopedBytes.h"
+#include <nativehelper/ScopedBytes.h>
#include <utils/Log.h>
#include <media/AudioSystem.h>
diff --git a/core/jni/android_media_DeviceCallback.cpp b/core/jni/android_media_DeviceCallback.cpp
index e159373..108fa00 100644
--- a/core/jni/android_media_DeviceCallback.cpp
+++ b/core/jni/android_media_DeviceCallback.cpp
@@ -19,8 +19,8 @@
#define LOG_TAG "AudioDeviceCallback-JNI"
#include <utils/Log.h>
-#include <JNIHelp.h>
-#include <JniConstants.h>
+#include <nativehelper/JNIHelp.h>
+#include <nativehelper/JniConstants.h>
#include "core_jni_helpers.h"
#include <media/AudioSystem.h>
diff --git a/core/jni/android_media_JetPlayer.cpp b/core/jni/android_media_JetPlayer.cpp
index 873c3f2..da116bf 100644
--- a/core/jni/android_media_JetPlayer.cpp
+++ b/core/jni/android_media_JetPlayer.cpp
@@ -23,7 +23,7 @@
#include <fcntl.h>
#include <jni.h>
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include "core_jni_helpers.h"
#include <utils/Log.h>
diff --git a/core/jni/android_media_RemoteDisplay.cpp b/core/jni/android_media_RemoteDisplay.cpp
index bd1a6ec..3b517f1 100644
--- a/core/jni/android_media_RemoteDisplay.cpp
+++ b/core/jni/android_media_RemoteDisplay.cpp
@@ -17,7 +17,7 @@
#define LOG_TAG "RemoteDisplay"
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "android_os_Parcel.h"
#include "android_util_Binder.h"
@@ -36,7 +36,7 @@
#include <utils/Log.h>
-#include <ScopedUtfChars.h>
+#include <nativehelper/ScopedUtfChars.h>
namespace android {
diff --git a/core/jni/android_media_ToneGenerator.cpp b/core/jni/android_media_ToneGenerator.cpp
index aec6263..ecb3cd6 100644
--- a/core/jni/android_media_ToneGenerator.cpp
+++ b/core/jni/android_media_ToneGenerator.cpp
@@ -22,7 +22,7 @@
#include <fcntl.h>
#include <jni.h>
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include "core_jni_helpers.h"
#include <utils/Log.h>
diff --git a/core/jni/android_net_LocalSocketImpl.cpp b/core/jni/android_net_LocalSocketImpl.cpp
index 37b6df1..6df23f7 100644
--- a/core/jni/android_net_LocalSocketImpl.cpp
+++ b/core/jni/android_net_LocalSocketImpl.cpp
@@ -16,7 +16,7 @@
#define LOG_TAG "LocalSocketImpl"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "jni.h"
#include "utils/Log.h"
#include "utils/misc.h"
@@ -35,7 +35,7 @@
#include <cutils/sockets.h>
#include <netinet/tcp.h>
-#include <ScopedUtfChars.h>
+#include <nativehelper/ScopedUtfChars.h>
namespace android {
diff --git a/core/jni/android_net_NetUtils.cpp b/core/jni/android_net_NetUtils.cpp
index 3e99521..823f1cc 100644
--- a/core/jni/android_net_NetUtils.cpp
+++ b/core/jni/android_net_NetUtils.cpp
@@ -17,7 +17,7 @@
#define LOG_TAG "NetUtils"
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "NetdClient.h"
#include <utils/misc.h>
#include <android_runtime/AndroidRuntime.h>
diff --git a/core/jni/android_net_TrafficStats.cpp b/core/jni/android_net_TrafficStats.cpp
index 7b7d0cf..d0c237d 100644
--- a/core/jni/android_net_TrafficStats.cpp
+++ b/core/jni/android_net_TrafficStats.cpp
@@ -25,7 +25,7 @@
#include "core_jni_helpers.h"
#include <jni.h>
-#include <ScopedUtfChars.h>
+#include <nativehelper/ScopedUtfChars.h>
#include <utils/misc.h>
#include <utils/Log.h>
diff --git a/core/jni/android_opengl_EGL14.cpp b/core/jni/android_opengl_EGL14.cpp
index c8b1784..6163588 100644
--- a/core/jni/android_opengl_EGL14.cpp
+++ b/core/jni/android_opengl_EGL14.cpp
@@ -21,7 +21,7 @@
#pragma GCC diagnostic ignored "-Wunused-function"
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
#include <android_runtime/android_view_Surface.h>
#include <android_runtime/android_graphics_SurfaceTexture.h>
diff --git a/core/jni/android_opengl_EGLExt.cpp b/core/jni/android_opengl_EGLExt.cpp
index 62ccad4..df1aa20 100644
--- a/core/jni/android_opengl_EGLExt.cpp
+++ b/core/jni/android_opengl_EGLExt.cpp
@@ -21,7 +21,7 @@
#pragma GCC diagnostic ignored "-Wunused-function"
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
#include <android_runtime/android_view_Surface.h>
#include <android_runtime/android_graphics_SurfaceTexture.h>
diff --git a/core/jni/android_opengl_GLES10.cpp b/core/jni/android_opengl_GLES10.cpp
index 5bcb800..6d4f6ec 100644
--- a/core/jni/android_opengl_GLES10.cpp
+++ b/core/jni/android_opengl_GLES10.cpp
@@ -25,7 +25,7 @@
#include <GLES/glext.h>
#include <jni.h>
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
#include <utils/misc.h>
#include <assert.h>
diff --git a/core/jni/android_opengl_GLES10Ext.cpp b/core/jni/android_opengl_GLES10Ext.cpp
index 38f7ba6..e630cfca 100644
--- a/core/jni/android_opengl_GLES10Ext.cpp
+++ b/core/jni/android_opengl_GLES10Ext.cpp
@@ -25,7 +25,7 @@
#include <GLES/glext.h>
#include <jni.h>
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
#include <utils/misc.h>
#include <assert.h>
diff --git a/core/jni/android_opengl_GLES11.cpp b/core/jni/android_opengl_GLES11.cpp
index 014672d..ab9cbb1 100644
--- a/core/jni/android_opengl_GLES11.cpp
+++ b/core/jni/android_opengl_GLES11.cpp
@@ -25,7 +25,7 @@
#include <GLES/glext.h>
#include <jni.h>
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
#include <utils/misc.h>
#include <assert.h>
diff --git a/core/jni/android_opengl_GLES11Ext.cpp b/core/jni/android_opengl_GLES11Ext.cpp
index b4a1ab6..8f71a6d 100644
--- a/core/jni/android_opengl_GLES11Ext.cpp
+++ b/core/jni/android_opengl_GLES11Ext.cpp
@@ -25,7 +25,7 @@
#include <GLES/glext.h>
#include <jni.h>
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
#include <utils/misc.h>
#include <assert.h>
diff --git a/core/jni/android_opengl_GLES20.cpp b/core/jni/android_opengl_GLES20.cpp
index c1ffa81..f83d204 100644
--- a/core/jni/android_opengl_GLES20.cpp
+++ b/core/jni/android_opengl_GLES20.cpp
@@ -25,7 +25,7 @@
#include <GLES2/gl2ext.h>
#include <jni.h>
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
#include <utils/misc.h>
#include <assert.h>
diff --git a/core/jni/android_opengl_GLES30.cpp b/core/jni/android_opengl_GLES30.cpp
index 1d12b0a..b649daf 100644
--- a/core/jni/android_opengl_GLES30.cpp
+++ b/core/jni/android_opengl_GLES30.cpp
@@ -25,7 +25,7 @@
#include <GLES3/gl3ext.h>
#include <jni.h>
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
#include <utils/misc.h>
#include <assert.h>
diff --git a/core/jni/android_opengl_GLES31.cpp b/core/jni/android_opengl_GLES31.cpp
index e0750e4..07d920f 100644
--- a/core/jni/android_opengl_GLES31.cpp
+++ b/core/jni/android_opengl_GLES31.cpp
@@ -23,7 +23,7 @@
#include <stdint.h>
#include <GLES3/gl31.h>
#include <jni.h>
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
#include <utils/misc.h>
#include <assert.h>
diff --git a/core/jni/android_opengl_GLES31Ext.cpp b/core/jni/android_opengl_GLES31Ext.cpp
index 8212eb1..723dd4c 100644
--- a/core/jni/android_opengl_GLES31Ext.cpp
+++ b/core/jni/android_opengl_GLES31Ext.cpp
@@ -24,7 +24,7 @@
#include <GLES2/gl2ext.h>
#include <jni.h>
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
#include <utils/misc.h>
#include <assert.h>
diff --git a/core/jni/android_opengl_GLES32.cpp b/core/jni/android_opengl_GLES32.cpp
index 91b573b..62a6e6c 100644
--- a/core/jni/android_opengl_GLES32.cpp
+++ b/core/jni/android_opengl_GLES32.cpp
@@ -23,7 +23,7 @@
#include <stdint.h>
#include <GLES3/gl32.h>
#include <jni.h>
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
#include <utils/misc.h>
#include <assert.h>
diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp
index 76140c0..6c2b460 100644
--- a/core/jni/android_os_Debug.cpp
+++ b/core/jni/android_os_Debug.cpp
@@ -48,10 +48,14 @@
namespace android
{
-using UniqueFile = std::unique_ptr<FILE, decltype(&fclose)>;
+static void safeFclose(FILE* fp) {
+ if (fp) fclose(fp);
+}
+
+using UniqueFile = std::unique_ptr<FILE, decltype(&safeFclose)>;
static inline UniqueFile MakeUniqueFile(const char* path, const char* mode) {
- return UniqueFile(fopen(path, mode), fclose);
+ return UniqueFile(fopen(path, mode), safeFclose);
}
enum {
@@ -77,14 +81,27 @@
HEAP_GL,
HEAP_OTHER_MEMTRACK,
+ // Dalvik extra sections (heap).
HEAP_DALVIK_NORMAL,
HEAP_DALVIK_LARGE,
- HEAP_DALVIK_LINEARALLOC,
- HEAP_DALVIK_ACCOUNTING,
- HEAP_DALVIK_CODE_CACHE,
HEAP_DALVIK_ZYGOTE,
HEAP_DALVIK_NON_MOVING,
- HEAP_DALVIK_INDIRECT_REFERENCE_TABLE,
+
+ // Dalvik other extra sections.
+ HEAP_DALVIK_OTHER_LINEARALLOC,
+ HEAP_DALVIK_OTHER_ACCOUNTING,
+ HEAP_DALVIK_OTHER_CODE_CACHE,
+ HEAP_DALVIK_OTHER_COMPILER_METADATA,
+ HEAP_DALVIK_OTHER_INDIRECT_REFERENCE_TABLE,
+
+ // Boot vdex / app dex / app vdex
+ HEAP_DEX_BOOT_VDEX,
+ HEAP_DEX_APP_DEX,
+ HEAP_DEX_APP_VDEX,
+
+ // App art, boot art.
+ HEAP_ART_APP,
+ HEAP_ART_BOOT,
_NUM_HEAP,
_NUM_EXCLUSIVE_HEAP = HEAP_OTHER_MEMTRACK+1,
@@ -293,15 +310,30 @@
whichHeap = HEAP_TTF;
is_swappable = true;
} else if ((nameLen > 4 && strstr(name, ".dex") != NULL) ||
- (nameLen > 5 && strcmp(name+nameLen-5, ".odex") == 0) ||
- (nameLen > 5 && strcmp(name+nameLen-5, ".vdex") == 0)) {
+ (nameLen > 5 && strcmp(name+nameLen-5, ".odex") == 0)) {
whichHeap = HEAP_DEX;
+ subHeap = HEAP_DEX_APP_DEX;
+ is_swappable = true;
+ } else if (nameLen > 5 && strcmp(name+nameLen-5, ".vdex") == 0) {
+ whichHeap = HEAP_DEX;
+ // Handle system@framework@boot* and system/framework/boot*
+ if (strstr(name, "@boot") != NULL || strstr(name, "/boot") != NULL) {
+ subHeap = HEAP_DEX_BOOT_VDEX;
+ } else {
+ subHeap = HEAP_DEX_APP_VDEX;
+ }
is_swappable = true;
} else if (nameLen > 4 && strcmp(name+nameLen-4, ".oat") == 0) {
whichHeap = HEAP_OAT;
is_swappable = true;
} else if (nameLen > 4 && strcmp(name+nameLen-4, ".art") == 0) {
whichHeap = HEAP_ART;
+ // Handle system@framework@boot* and system/framework/boot*
+ if (strstr(name, "@boot") != NULL || strstr(name, "/boot") != NULL) {
+ subHeap = HEAP_ART_BOOT;
+ } else {
+ subHeap = HEAP_ART_APP;
+ }
is_swappable = true;
} else if (strncmp(name, "/dev/", 5) == 0) {
if (strncmp(name, "/dev/kgsl-3d0", 13) == 0) {
@@ -310,7 +342,7 @@
if (strncmp(name, "/dev/ashmem/dalvik-", 19) == 0) {
whichHeap = HEAP_DALVIK_OTHER;
if (strstr(name, "/dev/ashmem/dalvik-LinearAlloc") == name) {
- subHeap = HEAP_DALVIK_LINEARALLOC;
+ subHeap = HEAP_DALVIK_OTHER_LINEARALLOC;
} else if ((strstr(name, "/dev/ashmem/dalvik-alloc space") == name) ||
(strstr(name, "/dev/ashmem/dalvik-main space") == name)) {
// This is the regular Dalvik heap.
@@ -328,13 +360,14 @@
whichHeap = HEAP_DALVIK;
subHeap = HEAP_DALVIK_ZYGOTE;
} else if (strstr(name, "/dev/ashmem/dalvik-indirect ref") == name) {
- subHeap = HEAP_DALVIK_INDIRECT_REFERENCE_TABLE;
+ subHeap = HEAP_DALVIK_OTHER_INDIRECT_REFERENCE_TABLE;
} else if (strstr(name, "/dev/ashmem/dalvik-jit-code-cache") == name ||
- strstr(name, "/dev/ashmem/dalvik-data-code-cache") == name ||
- strstr(name, "/dev/ashmem/dalvik-CompilerMetadata") == name) {
- subHeap = HEAP_DALVIK_CODE_CACHE;
+ strstr(name, "/dev/ashmem/dalvik-data-code-cache") == name) {
+ subHeap = HEAP_DALVIK_OTHER_CODE_CACHE;
+ } else if (strstr(name, "/dev/ashmem/dalvik-CompilerMetadata") == name) {
+ subHeap = HEAP_DALVIK_OTHER_COMPILER_METADATA;
} else {
- subHeap = HEAP_DALVIK_ACCOUNTING; // Default to accounting.
+ subHeap = HEAP_DALVIK_OTHER_ACCOUNTING; // Default to accounting.
}
} else if (strncmp(name, "/dev/ashmem/CursorWindow", 24) == 0) {
whichHeap = HEAP_CURSOR;
@@ -419,7 +452,8 @@
stats[whichHeap].sharedClean += shared_clean;
stats[whichHeap].swappedOut += swapped_out;
stats[whichHeap].swappedOutPss += swapped_out_pss;
- if (whichHeap == HEAP_DALVIK || whichHeap == HEAP_DALVIK_OTHER) {
+ if (whichHeap == HEAP_DALVIK || whichHeap == HEAP_DALVIK_OTHER ||
+ whichHeap == HEAP_DEX || whichHeap == HEAP_ART) {
stats[subHeap].pss += pss;
stats[subHeap].swappablePss += swappable_pss;
stats[subHeap].privateDirty += private_dirty;
@@ -972,21 +1006,16 @@
fprintf(fp, "END\n");
}
-/*
- * Dump the native heap, writing human-readable output to the specified
- * file descriptor.
- */
-static void android_os_Debug_dumpNativeHeap(JNIEnv* env, jobject clazz,
- jobject fileDescriptor)
+static bool openFile(JNIEnv* env, jobject fileDescriptor, UniqueFile& fp)
{
if (fileDescriptor == NULL) {
jniThrowNullPointerException(env, "fd == null");
- return;
+ return false;
}
int origFd = jniGetFDFromFileDescriptor(env, fileDescriptor);
if (origFd < 0) {
jniThrowRuntimeException(env, "Invalid file descriptor");
- return;
+ return false;
}
/* dup() the descriptor so we don't close the original with fclose() */
@@ -994,14 +1023,28 @@
if (fd < 0) {
ALOGW("dup(%d) failed: %s\n", origFd, strerror(errno));
jniThrowRuntimeException(env, "dup() failed");
- return;
+ return false;
}
- UniqueFile fp(fdopen(fd, "w"), fclose);
+ fp.reset(fdopen(fd, "w"));
if (fp == nullptr) {
ALOGW("fdopen(%d) failed: %s\n", fd, strerror(errno));
close(fd);
jniThrowRuntimeException(env, "fdopen() failed");
+ return false;
+ }
+ return true;
+}
+
+/*
+ * Dump the native heap, writing human-readable output to the specified
+ * file descriptor.
+ */
+static void android_os_Debug_dumpNativeHeap(JNIEnv* env, jobject,
+ jobject fileDescriptor)
+{
+ UniqueFile fp(nullptr, safeFclose);
+ if (!openFile(env, fileDescriptor, fp)) {
return;
}
@@ -1010,6 +1053,21 @@
ALOGD("Native heap dump complete.\n");
}
+/*
+ * Dump the native malloc info, writing xml output to the specified
+ * file descriptor.
+ */
+static void android_os_Debug_dumpNativeMallocInfo(JNIEnv* env, jobject,
+ jobject fileDescriptor)
+{
+ UniqueFile fp(nullptr, safeFclose);
+ if (!openFile(env, fileDescriptor, fp)) {
+ return;
+ }
+
+ malloc_info(0, fp.get());
+}
+
static bool dumpTraces(JNIEnv* env, jint pid, jstring fileName, jint timeoutSecs,
DebuggerdDumpType dumpType) {
const ScopedUtfChars fileNameChars(env, fileName);
@@ -1070,6 +1128,8 @@
(void*) android_os_Debug_getMemInfo },
{ "dumpNativeHeap", "(Ljava/io/FileDescriptor;)V",
(void*) android_os_Debug_dumpNativeHeap },
+ { "dumpNativeMallocInfo", "(Ljava/io/FileDescriptor;)V",
+ (void*) android_os_Debug_dumpNativeMallocInfo },
{ "getBinderSentTransactions", "()I",
(void*) android_os_Debug_getBinderSentTransactions },
{ "getBinderReceivedTransactions", "()I",
diff --git a/core/jni/android_os_HwBinder.cpp b/core/jni/android_os_HwBinder.cpp
index 6c6fa66..1b14d282 100644
--- a/core/jni/android_os_HwBinder.cpp
+++ b/core/jni/android_os_HwBinder.cpp
@@ -25,7 +25,7 @@
#include <cstring>
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include <android/hidl/manager/1.0/IServiceManager.h>
#include <android/hidl/base/1.0/IBase.h>
#include <android/hidl/base/1.0/BpHwBase.h>
@@ -42,6 +42,8 @@
using android::AndroidRuntime;
using android::hardware::hidl_vec;
using android::hardware::hidl_string;
+using android::hardware::IPCThreadState;
+using android::hardware::ProcessState;
template<typename T>
using Return = android::hardware::Return<T>;
@@ -381,8 +383,7 @@
return NULL;
}
- sp<hardware::IBinder> service = hardware::toBinder<
- hidl::base::V1_0::IBase, hidl::base::V1_0::BpHwBase>(ret);
+ sp<hardware::IBinder> service = hardware::toBinder<hidl::base::V1_0::IBase>(ret);
if (service == NULL) {
signalExceptionForError(env, NAME_NOT_FOUND);
@@ -395,6 +396,15 @@
return JHwRemoteBinder::NewObject(env, service);
}
+void JHwBinder_native_configureRpcThreadpool(jlong maxThreads, jboolean callerWillJoin) {
+ CHECK(maxThreads > 0);
+ ProcessState::self()->setThreadPoolConfiguration(maxThreads, callerWillJoin /*callerJoinsPool*/);
+}
+
+void JHwBinder_native_joinRpcThreadpool() {
+ IPCThreadState::self()->joinThreadPool();
+}
+
static JNINativeMethod gMethods[] = {
{ "native_init", "()J", (void *)JHwBinder_native_init },
{ "native_setup", "()V", (void *)JHwBinder_native_setup },
@@ -408,6 +418,12 @@
{ "getService", "(Ljava/lang/String;Ljava/lang/String;)L" PACKAGE_PATH "/IHwBinder;",
(void *)JHwBinder_native_getService },
+
+ { "configureRpcThreadpool", "(JZ)V",
+ (void *)JHwBinder_native_configureRpcThreadpool },
+
+ { "joinRpcThreadpool", "()V",
+ (void *)JHwBinder_native_joinRpcThreadpool },
};
namespace android {
diff --git a/core/jni/android_os_HwBlob.cpp b/core/jni/android_os_HwBlob.cpp
index 8590ecf..0c23797 100644
--- a/core/jni/android_os_HwBlob.cpp
+++ b/core/jni/android_os_HwBlob.cpp
@@ -22,7 +22,7 @@
#include "android_os_HwParcel.h"
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
#include <hidl/Status.h>
#include <nativehelper/ScopedLocalRef.h>
diff --git a/core/jni/android_os_HwParcel.cpp b/core/jni/android_os_HwParcel.cpp
index 6ea809a..b412b6a 100644
--- a/core/jni/android_os_HwParcel.cpp
+++ b/core/jni/android_os_HwParcel.cpp
@@ -24,7 +24,7 @@
#include "android_os_HwBlob.h"
#include "android_os_HwRemoteBinder.h"
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
#include <hidl/HidlTransportSupport.h>
#include <hidl/Status.h>
diff --git a/core/jni/android_os_HwRemoteBinder.cpp b/core/jni/android_os_HwRemoteBinder.cpp
index 9c2ee9c..cf59a56a 100644
--- a/core/jni/android_os_HwRemoteBinder.cpp
+++ b/core/jni/android_os_HwRemoteBinder.cpp
@@ -22,10 +22,10 @@
#include "android_os_HwParcel.h"
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
#include <hidl/Status.h>
-#include <ScopedUtfChars.h>
+#include <nativehelper/ScopedUtfChars.h>
#include <nativehelper/ScopedLocalRef.h>
#include "core_jni_helpers.h"
diff --git a/core/jni/android_os_MemoryFile.cpp b/core/jni/android_os_MemoryFile.cpp
index c198a73..b21566b 100644
--- a/core/jni/android_os_MemoryFile.cpp
+++ b/core/jni/android_os_MemoryFile.cpp
@@ -19,102 +19,21 @@
#include <cutils/ashmem.h>
#include "core_jni_helpers.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include <unistd.h>
#include <sys/mman.h>
namespace android {
-static jobject android_os_MemoryFile_open(JNIEnv* env, jobject clazz, jstring name, jint length)
-{
- const char* namestr = (name ? env->GetStringUTFChars(name, NULL) : NULL);
-
- int result = ashmem_create_region(namestr, length);
-
- if (name)
- env->ReleaseStringUTFChars(name, namestr);
-
- if (result < 0) {
- jniThrowException(env, "java/io/IOException", "ashmem_create_region failed");
- return NULL;
- }
-
- return jniCreateFileDescriptor(env, result);
-}
-
-static jlong android_os_MemoryFile_mmap(JNIEnv* env, jobject clazz, jobject fileDescriptor,
- jint length, jint prot)
-{
- int fd = jniGetFDFromFileDescriptor(env, fileDescriptor);
- void* result = mmap(NULL, length, prot, MAP_SHARED, fd, 0);
- if (result == MAP_FAILED) {
- jniThrowException(env, "java/io/IOException", "mmap failed");
- }
- return reinterpret_cast<jlong>(result);
-}
-
-static void android_os_MemoryFile_munmap(JNIEnv* env, jobject clazz, jlong addr, jint length)
-{
- int result = munmap(reinterpret_cast<void *>(addr), length);
- if (result < 0)
- jniThrowException(env, "java/io/IOException", "munmap failed");
-}
-
-static void android_os_MemoryFile_close(JNIEnv* env, jobject clazz, jobject fileDescriptor)
-{
- int fd = jniGetFDFromFileDescriptor(env, fileDescriptor);
- if (fd >= 0) {
- jniSetFileDescriptorOfFD(env, fileDescriptor, -1);
- close(fd);
- }
-}
-
-static jint android_os_MemoryFile_read(JNIEnv* env, jobject clazz,
- jobject fileDescriptor, jlong address, jbyteArray buffer, jint srcOffset, jint destOffset,
- jint count, jboolean unpinned)
-{
- int fd = jniGetFDFromFileDescriptor(env, fileDescriptor);
- if (unpinned && ashmem_pin_region(fd, 0, 0) == ASHMEM_WAS_PURGED) {
- ashmem_unpin_region(fd, 0, 0);
- jniThrowException(env, "java/io/IOException", "ashmem region was purged");
- return -1;
- }
-
- env->SetByteArrayRegion(buffer, destOffset, count, (const jbyte *)address + srcOffset);
-
- if (unpinned) {
- ashmem_unpin_region(fd, 0, 0);
- }
- return count;
-}
-
-static jint android_os_MemoryFile_write(JNIEnv* env, jobject clazz,
- jobject fileDescriptor, jlong address, jbyteArray buffer, jint srcOffset, jint destOffset,
- jint count, jboolean unpinned)
-{
- int fd = jniGetFDFromFileDescriptor(env, fileDescriptor);
- if (unpinned && ashmem_pin_region(fd, 0, 0) == ASHMEM_WAS_PURGED) {
- ashmem_unpin_region(fd, 0, 0);
- jniThrowException(env, "java/io/IOException", "ashmem region was purged");
- return -1;
- }
-
- env->GetByteArrayRegion(buffer, srcOffset, count, (jbyte *)address + destOffset);
-
- if (unpinned) {
- ashmem_unpin_region(fd, 0, 0);
- }
- return count;
-}
-
-static void android_os_MemoryFile_pin(JNIEnv* env, jobject clazz, jobject fileDescriptor, jboolean pin)
-{
+static jboolean android_os_MemoryFile_pin(JNIEnv* env, jobject clazz, jobject fileDescriptor,
+ jboolean pin) {
int fd = jniGetFDFromFileDescriptor(env, fileDescriptor);
int result = (pin ? ashmem_pin_region(fd, 0, 0) : ashmem_unpin_region(fd, 0, 0));
if (result < 0) {
jniThrowException(env, "java/io/IOException", NULL);
}
+ return result == ASHMEM_WAS_PURGED;
}
static jint android_os_MemoryFile_get_size(JNIEnv* env, jobject clazz,
@@ -138,19 +57,12 @@
}
static const JNINativeMethod methods[] = {
- {"native_open", "(Ljava/lang/String;I)Ljava/io/FileDescriptor;", (void*)android_os_MemoryFile_open},
- {"native_mmap", "(Ljava/io/FileDescriptor;II)J", (void*)android_os_MemoryFile_mmap},
- {"native_munmap", "(JI)V", (void*)android_os_MemoryFile_munmap},
- {"native_close", "(Ljava/io/FileDescriptor;)V", (void*)android_os_MemoryFile_close},
- {"native_read", "(Ljava/io/FileDescriptor;J[BIIIZ)I", (void*)android_os_MemoryFile_read},
- {"native_write", "(Ljava/io/FileDescriptor;J[BIIIZ)V", (void*)android_os_MemoryFile_write},
- {"native_pin", "(Ljava/io/FileDescriptor;Z)V", (void*)android_os_MemoryFile_pin},
+ {"native_pin", "(Ljava/io/FileDescriptor;Z)Z", (void*)android_os_MemoryFile_pin},
{"native_get_size", "(Ljava/io/FileDescriptor;)I",
(void*)android_os_MemoryFile_get_size}
};
-int register_android_os_MemoryFile(JNIEnv* env)
-{
+int register_android_os_MemoryFile(JNIEnv* env) {
return RegisterMethodsOrDie(env, "android/os/MemoryFile", methods, NELEM(methods));
}
diff --git a/core/jni/android_os_MessageQueue.cpp b/core/jni/android_os_MessageQueue.cpp
index e57a719..f7a98d1 100644
--- a/core/jni/android_os_MessageQueue.cpp
+++ b/core/jni/android_os_MessageQueue.cpp
@@ -16,7 +16,7 @@
#define LOG_TAG "MessageQueue-JNI"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
#include <utils/Looper.h>
diff --git a/core/jni/android_os_Parcel.cpp b/core/jni/android_os_Parcel.cpp
index cd7aae7..f0ac79a 100644
--- a/core/jni/android_os_Parcel.cpp
+++ b/core/jni/android_os_Parcel.cpp
@@ -20,7 +20,7 @@
#include "android_os_Parcel.h"
#include "android_util_Binder.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include <fcntl.h>
#include <stdio.h>
@@ -41,8 +41,8 @@
#include <utils/threads.h>
#include <utils/String8.h>
-#include <ScopedUtfChars.h>
-#include <ScopedLocalRef.h>
+#include <nativehelper/ScopedUtfChars.h>
+#include <nativehelper/ScopedLocalRef.h>
#include <android_runtime/AndroidRuntime.h>
@@ -90,25 +90,25 @@
env->CallVoidMethod(parcelObj, gParcelOffsets.recycle);
}
-static jint android_os_Parcel_dataSize(JNIEnv* env, jclass clazz, jlong nativePtr)
+static jint android_os_Parcel_dataSize(jlong nativePtr)
{
Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
return parcel ? parcel->dataSize() : 0;
}
-static jint android_os_Parcel_dataAvail(JNIEnv* env, jclass clazz, jlong nativePtr)
+static jint android_os_Parcel_dataAvail(jlong nativePtr)
{
Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
return parcel ? parcel->dataAvail() : 0;
}
-static jint android_os_Parcel_dataPosition(JNIEnv* env, jclass clazz, jlong nativePtr)
+static jint android_os_Parcel_dataPosition(jlong nativePtr)
{
Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
return parcel ? parcel->dataPosition() : 0;
}
-static jint android_os_Parcel_dataCapacity(JNIEnv* env, jclass clazz, jlong nativePtr)
+static jint android_os_Parcel_dataCapacity(jlong nativePtr)
{
Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
return parcel ? parcel->dataCapacity() : 0;
@@ -127,7 +127,7 @@
return 0;
}
-static void android_os_Parcel_setDataPosition(JNIEnv* env, jclass clazz, jlong nativePtr, jint pos)
+static void android_os_Parcel_setDataPosition(jlong nativePtr, jint pos)
{
Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
if (parcel != NULL) {
@@ -146,7 +146,7 @@
}
}
-static jboolean android_os_Parcel_pushAllowFds(JNIEnv* env, jclass clazz, jlong nativePtr, jboolean allowFds)
+static jboolean android_os_Parcel_pushAllowFds(jlong nativePtr, jboolean allowFds)
{
Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
jboolean ret = JNI_TRUE;
@@ -156,7 +156,7 @@
return ret;
}
-static void android_os_Parcel_restoreAllowFds(JNIEnv* env, jclass clazz, jlong nativePtr, jboolean lastValue)
+static void android_os_Parcel_restoreAllowFds(jlong nativePtr, jboolean lastValue)
{
Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
if (parcel != NULL) {
@@ -398,7 +398,7 @@
return ret;
}
-static jint android_os_Parcel_readInt(JNIEnv* env, jclass clazz, jlong nativePtr)
+static jint android_os_Parcel_readInt(jlong nativePtr)
{
Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
if (parcel != NULL) {
@@ -407,7 +407,7 @@
return 0;
}
-static jlong android_os_Parcel_readLong(JNIEnv* env, jclass clazz, jlong nativePtr)
+static jlong android_os_Parcel_readLong(jlong nativePtr)
{
Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
if (parcel != NULL) {
@@ -416,7 +416,7 @@
return 0;
}
-static jfloat android_os_Parcel_readFloat(JNIEnv* env, jclass clazz, jlong nativePtr)
+static jfloat android_os_Parcel_readFloat(jlong nativePtr)
{
Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
if (parcel != NULL) {
@@ -425,7 +425,7 @@
return 0;
}
-static jdouble android_os_Parcel_readDouble(JNIEnv* env, jclass clazz, jlong nativePtr)
+static jdouble android_os_Parcel_readDouble(jlong nativePtr)
{
Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
if (parcel != NULL) {
@@ -673,7 +673,7 @@
return thisParcel->getOpenAshmemSize();
}
-static jboolean android_os_Parcel_hasFileDescriptors(JNIEnv* env, jclass clazz, jlong nativePtr)
+static jboolean android_os_Parcel_hasFileDescriptors(jlong nativePtr)
{
jboolean ret = JNI_FALSE;
Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
@@ -747,7 +747,7 @@
return Parcel::getGlobalAllocCount();
}
-static jlong android_os_Parcel_getBlobAshmemSize(JNIEnv* env, jclass clazz, jlong nativePtr)
+static jlong android_os_Parcel_getBlobAshmemSize(jlong nativePtr)
{
Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
if (parcel != NULL) {
@@ -759,24 +759,24 @@
// ----------------------------------------------------------------------------
static const JNINativeMethod gParcelMethods[] = {
- // @FastNative
+ // @CriticalNative
{"nativeDataSize", "(J)I", (void*)android_os_Parcel_dataSize},
- // @FastNative
+ // @CriticalNative
{"nativeDataAvail", "(J)I", (void*)android_os_Parcel_dataAvail},
- // @FastNative
+ // @CriticalNative
{"nativeDataPosition", "(J)I", (void*)android_os_Parcel_dataPosition},
- // @FastNative
+ // @CriticalNative
{"nativeDataCapacity", "(J)I", (void*)android_os_Parcel_dataCapacity},
// @FastNative
{"nativeSetDataSize", "(JI)J", (void*)android_os_Parcel_setDataSize},
- // @FastNative
+ // @CriticalNative
{"nativeSetDataPosition", "(JI)V", (void*)android_os_Parcel_setDataPosition},
// @FastNative
{"nativeSetDataCapacity", "(JI)V", (void*)android_os_Parcel_setDataCapacity},
- // @FastNative
+ // @CriticalNative
{"nativePushAllowFds", "(JZ)Z", (void*)android_os_Parcel_pushAllowFds},
- // @FastNative
+ // @CriticalNative
{"nativeRestoreAllowFds", "(JZ)V", (void*)android_os_Parcel_restoreAllowFds},
{"nativeWriteByteArray", "(J[BII)V", (void*)android_os_Parcel_writeByteArray},
@@ -796,13 +796,13 @@
{"nativeCreateByteArray", "(J)[B", (void*)android_os_Parcel_createByteArray},
{"nativeReadByteArray", "(J[BI)Z", (void*)android_os_Parcel_readByteArray},
{"nativeReadBlob", "(J)[B", (void*)android_os_Parcel_readBlob},
- // @FastNative
+ // @CriticalNative
{"nativeReadInt", "(J)I", (void*)android_os_Parcel_readInt},
- // @FastNative
+ // @CriticalNative
{"nativeReadLong", "(J)J", (void*)android_os_Parcel_readLong},
- // @FastNative
+ // @CriticalNative
{"nativeReadFloat", "(J)F", (void*)android_os_Parcel_readFloat},
- // @FastNative
+ // @CriticalNative
{"nativeReadDouble", "(J)D", (void*)android_os_Parcel_readDouble},
{"nativeReadString", "(J)Ljava/lang/String;", (void*)android_os_Parcel_readString},
{"nativeReadStrongBinder", "(J)Landroid/os/IBinder;", (void*)android_os_Parcel_readStrongBinder},
@@ -821,7 +821,7 @@
{"nativeUnmarshall", "(J[BII)J", (void*)android_os_Parcel_unmarshall},
{"nativeCompareData", "(JJ)I", (void*)android_os_Parcel_compareData},
{"nativeAppendFrom", "(JJII)J", (void*)android_os_Parcel_appendFrom},
- // @FastNative
+ // @CriticalNative
{"nativeHasFileDescriptors", "(J)Z", (void*)android_os_Parcel_hasFileDescriptors},
{"nativeWriteInterfaceToken", "(JLjava/lang/String;)V", (void*)android_os_Parcel_writeInterfaceToken},
{"nativeEnforceInterface", "(JLjava/lang/String;)V", (void*)android_os_Parcel_enforceInterface},
@@ -829,6 +829,7 @@
{"getGlobalAllocSize", "()J", (void*)android_os_Parcel_getGlobalAllocSize},
{"getGlobalAllocCount", "()J", (void*)android_os_Parcel_getGlobalAllocCount},
+ // @CriticalNative
{"nativeGetBlobAshmemSize", "(J)J", (void*)android_os_Parcel_getBlobAshmemSize},
};
diff --git a/core/jni/android_os_SELinux.cpp b/core/jni/android_os_SELinux.cpp
index 4b68c0d..6778b29 100644
--- a/core/jni/android_os_SELinux.cpp
+++ b/core/jni/android_os_SELinux.cpp
@@ -17,15 +17,15 @@
#define LOG_TAG "SELinuxJNI"
#include <utils/Log.h>
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "jni.h"
#include "core_jni_helpers.h"
#include "selinux/selinux.h"
#include "selinux/android.h"
#include <errno.h>
#include <memory>
-#include <ScopedLocalRef.h>
-#include <ScopedUtfChars.h>
+#include <nativehelper/ScopedLocalRef.h>
+#include <nativehelper/ScopedUtfChars.h>
namespace android {
diff --git a/core/jni/android_os_SharedMemory.cpp b/core/jni/android_os_SharedMemory.cpp
new file mode 100644
index 0000000..24d0811
--- /dev/null
+++ b/core/jni/android_os_SharedMemory.cpp
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#define LOG_TAG "SharedMemory"
+
+#include "core_jni_helpers.h"
+
+#include <cutils/ashmem.h>
+#include <utils/Log.h>
+#include "JNIHelp.h"
+#include "JniConstants.h"
+#include "ScopedLocalRef.h"
+
+#include <algorithm>
+#include <errno.h>
+#include <limits>
+#include <unistd.h>
+
+namespace {
+
+static void throwErrnoException(JNIEnv* env, const char* functionName, int error) {
+ static jmethodID ctor = env->GetMethodID(JniConstants::errnoExceptionClass,
+ "<init>", "(Ljava/lang/String;I)V");
+
+ ScopedLocalRef<jstring> detailMessage(env, env->NewStringUTF(functionName));
+ if (detailMessage.get() == NULL) {
+ // Not really much we can do here. We're probably dead in the water,
+ // but let's try to stumble on...
+ env->ExceptionClear();
+ }
+
+ jobject exception = env->NewObject(JniConstants::errnoExceptionClass, ctor,
+ detailMessage.get(), error);
+ env->Throw(reinterpret_cast<jthrowable>(exception));
+}
+
+static jobject SharedMemory_create(JNIEnv* env, jobject, jstring jname, jint size) {
+
+ // Name is optional so we can't use ScopedUtfChars for this as it throws NPE on null
+ const char* name = jname ? env->GetStringUTFChars(jname, nullptr) : nullptr;
+
+ int fd = ashmem_create_region(name, size);
+
+ // Capture the error, if there is one, before calling ReleaseStringUTFChars
+ int err = fd < 0 ? errno : 0;
+
+ if (name) {
+ env->ReleaseStringUTFChars(jname, name);
+ }
+
+ if (fd < 0) {
+ throwErrnoException(env, "SharedMemory_create", err);
+ return nullptr;
+ }
+
+ return jniCreateFileDescriptor(env, fd);
+}
+
+static jint SharedMemory_getSize(JNIEnv* env, jobject, jobject fileDescriptor) {
+ int fd = jniGetFDFromFileDescriptor(env, fileDescriptor);
+ if (!ashmem_valid(fd)) {
+ return -1;
+ }
+ size_t size = ashmem_get_size_region(fd);
+ return static_cast<jint>(std::min(size, static_cast<size_t>(std::numeric_limits<jint>::max())));
+}
+
+static jint SharedMemory_setProt(JNIEnv* env, jobject, jobject fileDescriptor, jint prot) {
+ int fd = jniGetFDFromFileDescriptor(env, fileDescriptor);
+ int err = 0;
+ if (ashmem_set_prot_region(fd, prot)) {
+ err = errno;
+ }
+ return err;
+}
+
+static const JNINativeMethod methods[] = {
+ {"nCreate", "(Ljava/lang/String;I)Ljava/io/FileDescriptor;", (void*)SharedMemory_create},
+ {"nGetSize", "(Ljava/io/FileDescriptor;)I", (void*)SharedMemory_getSize},
+ {"nSetProt", "(Ljava/io/FileDescriptor;I)I", (void*)SharedMemory_setProt},
+};
+
+} // anonymous namespace
+
+namespace android {
+
+int register_android_os_SharedMemory(JNIEnv* env)
+{
+ return RegisterMethodsOrDie(env, "android/os/SharedMemory", methods, NELEM(methods));
+}
+
+} // namespace android
diff --git a/core/jni/android_os_SystemClock.cpp b/core/jni/android_os_SystemClock.cpp
index 2fade69..1f000d7 100644
--- a/core/jni/android_os_SystemClock.cpp
+++ b/core/jni/android_os_SystemClock.cpp
@@ -25,7 +25,7 @@
#include <errno.h>
#include <string.h>
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "jni.h"
#include "core_jni_helpers.h"
diff --git a/core/jni/android_os_Trace.cpp b/core/jni/android_os_Trace.cpp
index de91f70..4f4e5da 100644
--- a/core/jni/android_os_Trace.cpp
+++ b/core/jni/android_os_Trace.cpp
@@ -23,9 +23,9 @@
#include <utils/String8.h>
#include <log/log.h>
-#include <JNIHelp.h>
-#include <ScopedUtfChars.h>
-#include <ScopedStringChars.h>
+#include <nativehelper/JNIHelp.h>
+#include <nativehelper/ScopedUtfChars.h>
+#include <nativehelper/ScopedStringChars.h>
namespace android {
diff --git a/core/jni/android_os_UEventObserver.cpp b/core/jni/android_os_UEventObserver.cpp
index 30d40a2..2df74b0 100644
--- a/core/jni/android_os_UEventObserver.cpp
+++ b/core/jni/android_os_UEventObserver.cpp
@@ -21,13 +21,13 @@
#include "hardware_legacy/uevent.h"
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "core_jni_helpers.h"
#include <utils/Mutex.h>
#include <utils/Vector.h>
#include <utils/String8.h>
-#include <ScopedUtfChars.h>
+#include <nativehelper/ScopedUtfChars.h>
namespace android {
diff --git a/core/jni/android_os_VintfObject.cpp b/core/jni/android_os_VintfObject.cpp
index fa9379e..7ec4b8e 100644
--- a/core/jni/android_os_VintfObject.cpp
+++ b/core/jni/android_os_VintfObject.cpp
@@ -21,7 +21,7 @@
#include <vector>
#include <string>
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include <vintf/VintfObject.h>
#include <vintf/parse_string.h>
#include <vintf/parse_xml.h>
@@ -102,7 +102,10 @@
cPackageInfo[i] = cString;
env->ReleaseStringUTFChars(element, cString);
}
- int32_t status = VintfObject::CheckCompatibility(cPackageInfo);
+ std::string error;
+ int32_t status = VintfObject::CheckCompatibility(cPackageInfo, &error);
+ if (status)
+ LOG(WARNING) << "VintfObject.verify() returns " << status << ": " << error;
return status;
}
diff --git a/core/jni/android_os_VintfRuntimeInfo.cpp b/core/jni/android_os_VintfRuntimeInfo.cpp
index ecb6854..19220cf0 100644
--- a/core/jni/android_os_VintfRuntimeInfo.cpp
+++ b/core/jni/android_os_VintfRuntimeInfo.cpp
@@ -17,7 +17,7 @@
#define LOG_TAG "VintfRuntimeInfo"
//#define LOG_NDEBUG 0
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include <vintf/VintfObject.h>
#include <vintf/parse_string.h>
#include <vintf/parse_xml.h>
diff --git a/core/jni/android_os_seccomp.cpp b/core/jni/android_os_seccomp.cpp
index 4502371..06e2a16 100644
--- a/core/jni/android_os_seccomp.cpp
+++ b/core/jni/android_os_seccomp.cpp
@@ -15,7 +15,7 @@
*/
#include "core_jni_helpers.h"
-#include "JniConstants.h"
+#include <nativehelper/JniConstants.h>
#include "utils/Log.h"
#include <selinux/selinux.h>
diff --git a/core/jni/android_server_NetworkManagementSocketTagger.cpp b/core/jni/android_server_NetworkManagementSocketTagger.cpp
index 818bf53..58295af 100644
--- a/core/jni/android_server_NetworkManagementSocketTagger.cpp
+++ b/core/jni/android_server_NetworkManagementSocketTagger.cpp
@@ -17,7 +17,7 @@
#define LOG_TAG "NMST_QTagUidNative"
#include <utils/Log.h>
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "jni.h"
#include <utils/misc.h>
diff --git a/core/jni/android_server_Watchdog.cpp b/core/jni/android_server_Watchdog.cpp
index d1f9434..01d565b 100644
--- a/core/jni/android_server_Watchdog.cpp
+++ b/core/jni/android_server_Watchdog.cpp
@@ -25,7 +25,7 @@
#include <errno.h>
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "core_jni_helpers.h"
static void dumpOneStack(int tid, int outFd) {
diff --git a/core/jni/android_text_AndroidBidi.cpp b/core/jni/android_text_AndroidBidi.cpp
index d744b7c..f72f0f0 100644
--- a/core/jni/android_text_AndroidBidi.cpp
+++ b/core/jni/android_text_AndroidBidi.cpp
@@ -17,7 +17,7 @@
#define LOG_TAG "AndroidUnicode"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "core_jni_helpers.h"
#include "utils/misc.h"
#include "utils/Log.h"
@@ -42,7 +42,7 @@
// Set callbacks to override bidi classes of new emoji
ubidi_setClassCallback(
bidi, minikin::emojiBidiOverride, nullptr, nullptr, nullptr, &status);
- ubidi_setPara(bidi, chs, n, dir, NULL, &status);
+ ubidi_setPara(bidi, reinterpret_cast<const UChar*>(chs), n, dir, NULL, &status);
if (U_SUCCESS(status)) {
for (int i = 0; i < n; ++i) {
info[i] = ubidi_getLevelAt(bidi, i);
diff --git a/core/jni/android_text_AndroidCharacter.cpp b/core/jni/android_text_AndroidCharacter.cpp
index 474a74e..8885aac 100644
--- a/core/jni/android_text_AndroidCharacter.cpp
+++ b/core/jni/android_text_AndroidCharacter.cpp
@@ -17,8 +17,8 @@
#define LOG_TAG "AndroidUnicode"
-#include "JNIHelp.h"
-#include "ScopedPrimitiveArray.h"
+#include <nativehelper/JNIHelp.h>
+#include <nativehelper/ScopedPrimitiveArray.h>
#include "core_jni_helpers.h"
#include "utils/misc.h"
#include "utils/Log.h"
diff --git a/core/jni/android_text_StaticLayout.cpp b/core/jni/android_text_StaticLayout.cpp
index 4a445d8..ba8dec1 100644
--- a/core/jni/android_text_StaticLayout.cpp
+++ b/core/jni/android_text_StaticLayout.cpp
@@ -21,9 +21,9 @@
#include "unicode/brkiter.h"
#include "utils/misc.h"
#include "utils/Log.h"
-#include "ScopedStringChars.h"
-#include "ScopedPrimitiveArray.h"
-#include "JNIHelp.h"
+#include <nativehelper/ScopedStringChars.h>
+#include <nativehelper/ScopedPrimitiveArray.h>
+#include <nativehelper/JNIHelp.h>
#include "core_jni_helpers.h"
#include <cstdint>
#include <vector>
@@ -137,15 +137,19 @@
return reinterpret_cast<jlong>(hyphenator);
}
-static void nSetLocale(JNIEnv* env, jclass, jlong nativePtr, jstring javaLocaleName,
- jlong nativeHyphenator) {
- ScopedIcuLocale icuLocale(env, javaLocaleName);
+static void nSetLocales(JNIEnv* env, jclass, jlong nativePtr, jstring javaLocaleNames,
+ jlongArray nativeHyphenators) {
minikin::LineBreaker* b = reinterpret_cast<minikin::LineBreaker*>(nativePtr);
- minikin::Hyphenator* hyphenator = reinterpret_cast<minikin::Hyphenator*>(nativeHyphenator);
- if (icuLocale.valid()) {
- b->setLocale(icuLocale.locale(), hyphenator);
+ ScopedUtfChars localeNames(env, javaLocaleNames);
+ ScopedLongArrayRO hyphArr(env, nativeHyphenators);
+ const size_t numLocales = hyphArr.size();
+ std::vector<minikin::Hyphenator*> hyphVec;
+ hyphVec.reserve(numLocales);
+ for (size_t i = 0; i < numLocales; i++) {
+ hyphVec.push_back(reinterpret_cast<minikin::Hyphenator*>(hyphArr[i]));
}
+ b->setLocales(localeNames.c_str(), hyphVec);
}
static void nSetIndents(JNIEnv* env, jclass, jlong nativePtr, jintArray indents) {
@@ -194,7 +198,7 @@
{"nFreeBuilder", "(J)V", (void*) nFreeBuilder},
{"nFinishBuilder", "(J)V", (void*) nFinishBuilder},
{"nLoadHyphenator", "(Ljava/nio/ByteBuffer;III)J", (void*) nLoadHyphenator},
- {"nSetLocale", "(JLjava/lang/String;J)V", (void*) nSetLocale},
+ {"nSetLocales", "(JLjava/lang/String;[J)V", (void*) nSetLocales},
{"nSetupParagraph", "(J[CIFIF[IIIIZ)V", (void*) nSetupParagraph},
{"nSetIndents", "(J[I)V", (void*) nSetIndents},
{"nAddStyleRun", "(JJJIIZ)F", (void*) nAddStyleRun},
diff --git a/core/jni/android_util_AssetManager.cpp b/core/jni/android_util_AssetManager.cpp
index 90aee9e..b137da3 100644
--- a/core/jni/android_util_AssetManager.cpp
+++ b/core/jni/android_util_AssetManager.cpp
@@ -37,9 +37,9 @@
#include "android_util_Binder.h"
#include "core_jni_helpers.h"
#include "jni.h"
-#include "JNIHelp.h"
-#include "ScopedStringChars.h"
-#include "ScopedUtfChars.h"
+#include <nativehelper/JNIHelp.h>
+#include <nativehelper/ScopedStringChars.h>
+#include <nativehelper/ScopedUtfChars.h>
#include "utils/Log.h"
#include "utils/misc.h"
#include "utils/String8.h"
diff --git a/core/jni/android_util_Binder.cpp b/core/jni/android_util_Binder.cpp
index 26b0034..5b0f776 100644
--- a/core/jni/android_util_Binder.cpp
+++ b/core/jni/android_util_Binder.cpp
@@ -20,7 +20,7 @@
#include "android_os_Parcel.h"
#include "android_util_Binder.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include <fcntl.h>
#include <inttypes.h>
@@ -44,8 +44,8 @@
#include <utils/SystemClock.h>
#include <utils/threads.h>
-#include <ScopedUtfChars.h>
-#include <ScopedLocalRef.h>
+#include <nativehelper/ScopedUtfChars.h>
+#include <nativehelper/ScopedLocalRef.h>
#include "core_jni_helpers.h"
@@ -836,7 +836,7 @@
env->SetLongField(obj, gBinderOffsets.mObject, (jlong)jbh);
}
-static void android_os_Binder_destroy(JNIEnv* env, jobject obj)
+static void android_os_Binder_destroyBinder(JNIEnv* env, jobject obj)
{
JavaBBinderHolder* jbh = (JavaBBinderHolder*)
env->GetLongField(obj, gBinderOffsets.mObject);
@@ -847,7 +847,7 @@
} else {
// Encountering an uninitialized binder is harmless. All it means is that
// the Binder was only partially initialized when its finalizer ran and called
- // destroy(). The Binder could be partially initialized for several reasons.
+ // destroyBinder(). The Binder could be partially initialized for several reasons.
// For example, a Binder subclass constructor might have thrown an exception before
// it could delegate to its superclass's constructor. Consequently init() would
// not have been called and the holder pointer would remain NULL.
@@ -872,7 +872,7 @@
{ "getThreadStrictModePolicy", "()I", (void*)android_os_Binder_getThreadStrictModePolicy },
{ "flushPendingCommands", "()V", (void*)android_os_Binder_flushPendingCommands },
{ "init", "()V", (void*)android_os_Binder_init },
- { "destroy", "()V", (void*)android_os_Binder_destroy },
+ { "destroyBinder", "()V", (void*)android_os_Binder_destroyBinder },
{ "blockUntilThreadAvailable", "()V", (void*)android_os_Binder_blockUntilThreadAvailable }
};
diff --git a/core/jni/android_util_EventLog.cpp b/core/jni/android_util_EventLog.cpp
index 8a7600b..9fd7c40 100644
--- a/core/jni/android_util_EventLog.cpp
+++ b/core/jni/android_util_EventLog.cpp
@@ -20,7 +20,7 @@
#include <log/log.h>
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "core_jni_helpers.h"
#include "jni.h"
diff --git a/core/jni/android_util_FileObserver.cpp b/core/jni/android_util_FileObserver.cpp
index 2b93b6d..6f975b2 100644
--- a/core/jni/android_util_FileObserver.cpp
+++ b/core/jni/android_util_FileObserver.cpp
@@ -15,7 +15,7 @@
** limitations under the License.
*/
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "jni.h"
#include "utils/Log.h"
#include "utils/misc.h"
diff --git a/core/jni/android_util_Log.cpp b/core/jni/android_util_Log.cpp
index 56505af..a6adc88 100644
--- a/core/jni/android_util_Log.cpp
+++ b/core/jni/android_util_Log.cpp
@@ -26,7 +26,7 @@
#include <utils/String8.h>
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "utils/misc.h"
#include "core_jni_helpers.h"
#include "android_util_Log.h"
diff --git a/core/jni/android_util_Log.h b/core/jni/android_util_Log.h
index 4804a854..8a32864 100644
--- a/core/jni/android_util_Log.h
+++ b/core/jni/android_util_Log.h
@@ -18,7 +18,7 @@
#define _ANDROID_UTIL_LOG_H
#include <jni.h>
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
namespace android {
diff --git a/core/jni/android_util_Process.cpp b/core/jni/android_util_Process.cpp
index f34b138..44f15cd 100644
--- a/core/jni/android_util_Process.cpp
+++ b/core/jni/android_util_Process.cpp
@@ -30,7 +30,7 @@
#include "core_jni_helpers.h"
#include "android_util_Binder.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include <dirent.h>
#include <fcntl.h>
diff --git a/core/jni/android_util_StringBlock.cpp b/core/jni/android_util_StringBlock.cpp
index b396afe..760f9e3 100644
--- a/core/jni/android_util_StringBlock.cpp
+++ b/core/jni/android_util_StringBlock.cpp
@@ -18,7 +18,7 @@
#define LOG_TAG "StringBlock"
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include <utils/misc.h>
#include <core_jni_helpers.h>
#include <utils/Log.h>
diff --git a/core/jni/android_util_XmlBlock.cpp b/core/jni/android_util_XmlBlock.cpp
index 99882cc..ad6bad2 100644
--- a/core/jni/android_util_XmlBlock.cpp
+++ b/core/jni/android_util_XmlBlock.cpp
@@ -18,7 +18,7 @@
#define LOG_TAG "XmlBlock"
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include <core_jni_helpers.h>
#include <androidfw/AssetManager.h>
#include <androidfw/ResourceTypes.h>
diff --git a/core/jni/android_util_jar_StrictJarFile.cpp b/core/jni/android_util_jar_StrictJarFile.cpp
index 4f1f926..4ab8db4 100644
--- a/core/jni/android_util_jar_StrictJarFile.cpp
+++ b/core/jni/android_util_jar_StrictJarFile.cpp
@@ -22,10 +22,10 @@
#include <log/log.h>
-#include "JNIHelp.h"
-#include "JniConstants.h"
-#include "ScopedLocalRef.h"
-#include "ScopedUtfChars.h"
+#include <nativehelper/JNIHelp.h>
+#include <nativehelper/JniConstants.h>
+#include <nativehelper/ScopedLocalRef.h>
+#include <nativehelper/ScopedUtfChars.h>
#include "jni.h"
#include "ziparchive/zip_archive.h"
diff --git a/core/jni/android_view_DisplayEventReceiver.cpp b/core/jni/android_view_DisplayEventReceiver.cpp
index 831393b..c1b5aae 100644
--- a/core/jni/android_view_DisplayEventReceiver.cpp
+++ b/core/jni/android_view_DisplayEventReceiver.cpp
@@ -18,7 +18,7 @@
//#define LOG_NDEBUG 0
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include <inttypes.h>
@@ -30,7 +30,7 @@
#include <gui/DisplayEventReceiver.h>
#include "android_os_MessageQueue.h"
-#include <ScopedLocalRef.h>
+#include <nativehelper/ScopedLocalRef.h>
#include "core_jni_helpers.h"
diff --git a/core/jni/android_view_InputChannel.cpp b/core/jni/android_view_InputChannel.cpp
index 1c6ead0..71742cb 100644
--- a/core/jni/android_view_InputChannel.cpp
+++ b/core/jni/android_view_InputChannel.cpp
@@ -16,7 +16,7 @@
#define LOG_TAG "InputChannel-JNI"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
#include <binder/Parcel.h>
diff --git a/core/jni/android_view_InputDevice.cpp b/core/jni/android_view_InputDevice.cpp
index 9cf6a9d..494fad7 100644
--- a/core/jni/android_view_InputDevice.cpp
+++ b/core/jni/android_view_InputDevice.cpp
@@ -17,10 +17,10 @@
#include <input/Input.h>
#include <android_runtime/AndroidRuntime.h>
-#include <nativehelper/jni.h>
+#include <jni.h>
#include <nativehelper/JNIHelp.h>
-#include <ScopedLocalRef.h>
+#include <nativehelper/ScopedLocalRef.h>
#include "android_view_InputDevice.h"
#include "android_view_KeyCharacterMap.h"
diff --git a/core/jni/android_view_InputEventReceiver.cpp b/core/jni/android_view_InputEventReceiver.cpp
index 8293cd8..31e954b 100644
--- a/core/jni/android_view_InputEventReceiver.cpp
+++ b/core/jni/android_view_InputEventReceiver.cpp
@@ -18,7 +18,7 @@
//#define LOG_NDEBUG 0
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
#include <utils/Log.h>
@@ -31,7 +31,7 @@
#include "android_view_KeyEvent.h"
#include "android_view_MotionEvent.h"
-#include <ScopedLocalRef.h>
+#include <nativehelper/ScopedLocalRef.h>
#include "core_jni_helpers.h"
diff --git a/core/jni/android_view_InputEventSender.cpp b/core/jni/android_view_InputEventSender.cpp
index 3bd6917..420ff2a 100644
--- a/core/jni/android_view_InputEventSender.cpp
+++ b/core/jni/android_view_InputEventSender.cpp
@@ -18,7 +18,7 @@
//#define LOG_NDEBUG 0
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
#include <utils/Log.h>
@@ -31,7 +31,7 @@
#include "android_view_KeyEvent.h"
#include "android_view_MotionEvent.h"
-#include <ScopedLocalRef.h>
+#include <nativehelper/ScopedLocalRef.h>
#include "core_jni_helpers.h"
diff --git a/core/jni/android_view_InputQueue.cpp b/core/jni/android_view_InputQueue.cpp
index 96ccdee..24c3ff8 100644
--- a/core/jni/android_view_InputQueue.cpp
+++ b/core/jni/android_view_InputQueue.cpp
@@ -26,9 +26,9 @@
#include <input/Input.h>
#include <utils/Looper.h>
#include <utils/TypeHelpers.h>
-#include <ScopedLocalRef.h>
+#include <nativehelper/ScopedLocalRef.h>
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "android_os_MessageQueue.h"
#include "android_view_KeyEvent.h"
#include "android_view_MotionEvent.h"
diff --git a/core/jni/android_view_KeyCharacterMap.cpp b/core/jni/android_view_KeyCharacterMap.cpp
index e5519a7..586b26e 100644
--- a/core/jni/android_view_KeyCharacterMap.cpp
+++ b/core/jni/android_view_KeyCharacterMap.cpp
@@ -20,7 +20,7 @@
#include <input/Input.h>
#include <binder/Parcel.h>
-#include <nativehelper/jni.h>
+#include <jni.h>
#include <nativehelper/JNIHelp.h>
#include "android_os_Parcel.h"
diff --git a/core/jni/android_view_KeyEvent.cpp b/core/jni/android_view_KeyEvent.cpp
index 216e6f6..8a6e745 100644
--- a/core/jni/android_view_KeyEvent.cpp
+++ b/core/jni/android_view_KeyEvent.cpp
@@ -16,13 +16,13 @@
#define LOG_TAG "KeyEvent-JNI"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
#include <android_runtime/Log.h>
#include <utils/Log.h>
#include <input/Input.h>
-#include <ScopedUtfChars.h>
+#include <nativehelper/ScopedUtfChars.h>
#include "android_view_KeyEvent.h"
#include "core_jni_helpers.h"
diff --git a/core/jni/android_view_MotionEvent.cpp b/core/jni/android_view_MotionEvent.cpp
index 2132f3d..64bf0dc 100644
--- a/core/jni/android_view_MotionEvent.cpp
+++ b/core/jni/android_view_MotionEvent.cpp
@@ -16,14 +16,14 @@
#define LOG_TAG "MotionEvent-JNI"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include <SkMatrix.h>
#include <android_runtime/AndroidRuntime.h>
#include <android_runtime/Log.h>
#include <utils/Log.h>
#include <input/Input.h>
-#include <ScopedUtfChars.h>
+#include <nativehelper/ScopedUtfChars.h>
#include "android_os_Parcel.h"
#include "android_view_MotionEvent.h"
#include "android_util_Binder.h"
@@ -345,8 +345,10 @@
return 0;
}
- MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
- if (!event) {
+ MotionEvent* event;
+ if (nativePtr) {
+ event = reinterpret_cast<MotionEvent*>(nativePtr);
+ } else {
event = new MotionEvent();
}
diff --git a/core/jni/android_view_PointerIcon.cpp b/core/jni/android_view_PointerIcon.cpp
index 4150636..4f79790 100644
--- a/core/jni/android_view_PointerIcon.cpp
+++ b/core/jni/android_view_PointerIcon.cpp
@@ -16,7 +16,7 @@
#define LOG_TAG "PointerIcon-JNI"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "android_view_PointerIcon.h"
@@ -24,7 +24,7 @@
#include <android_runtime/Log.h>
#include <utils/Log.h>
#include <android/graphics/GraphicsJNI.h>
-#include "ScopedLocalRef.h"
+#include <nativehelper/ScopedLocalRef.h>
#include "core_jni_helpers.h"
diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp
index 494e266..3ad4da6 100644
--- a/core/jni/android_view_Surface.cpp
+++ b/core/jni/android_view_Surface.cpp
@@ -19,7 +19,7 @@
#include <stdio.h>
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "android_os_Parcel.h"
#include "android/graphics/GraphicBuffer.h"
#include "android/graphics/GraphicsJNI.h"
@@ -47,7 +47,7 @@
#include <utils/misc.h>
#include <utils/Log.h>
-#include <ScopedUtfChars.h>
+#include <nativehelper/ScopedUtfChars.h>
#include <AnimationContext.h>
#include <FrameInfo.h>
@@ -537,6 +537,20 @@
return err;
}
+static jint nativeSetSharedBufferModeEnabled(JNIEnv* env, jclass clazz, jlong nativeObject,
+ jboolean enabled) {
+ Surface* surface = reinterpret_cast<Surface*>(nativeObject);
+ return ((ANativeWindow*) nativeObject)->perform(surface,
+ NATIVE_WINDOW_SET_SHARED_BUFFER_MODE, enabled);
+}
+
+static jint nativeSetAutoRefreshEnabled(JNIEnv* env, jclass clazz, jlong nativeObject,
+ jboolean enabled) {
+ Surface* surface = reinterpret_cast<Surface*>(nativeObject);
+ return ((ANativeWindow*) nativeObject)->perform(surface,
+ NATIVE_WINDOW_SET_AUTO_REFRESH, enabled);
+}
+
namespace uirenderer {
using namespace android::uirenderer::renderthread;
@@ -618,6 +632,8 @@
{"nativeSetScalingMode", "(JI)I", (void*)nativeSetScalingMode },
{"nativeForceScopedDisconnect", "(J)I", (void*)nativeForceScopedDisconnect},
{"nativeAttachAndQueueBuffer", "(JLandroid/graphics/GraphicBuffer;)I", (void*)nativeAttachAndQueueBuffer},
+ {"nativeSetSharedBufferModeEnabled", "(JZ)I", (void*)nativeSetSharedBufferModeEnabled},
+ {"nativeSetAutoRefreshEnabled", "(JZ)I", (void*)nativeSetAutoRefreshEnabled},
// HWUI context
{"nHwuiCreate", "(JJ)J", (void*) hwui::create },
diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp
index 97aa562..db9b52e 100644
--- a/core/jni/android_view_SurfaceControl.cpp
+++ b/core/jni/android_view_SurfaceControl.cpp
@@ -24,8 +24,9 @@
#include "android/graphics/Region.h"
#include "core_jni_helpers.h"
-#include <JNIHelp.h>
-#include <ScopedUtfChars.h>
+#include <android-base/chrono_utils.h>
+#include <nativehelper/JNIHelp.h>
+#include <nativehelper/ScopedUtfChars.h>
#include <android_runtime/android_view_Surface.h>
#include <android_runtime/android_view_SurfaceSession.h>
#include <gui/Surface.h>
@@ -245,7 +246,7 @@
auto bitmap = new Bitmap(
(void*) screenshot->getPixels(), (void*) screenshot.get(), DeleteScreenshot,
- screenshotInfo, rowBytes, nullptr);
+ screenshotInfo, rowBytes);
screenshot.release();
bitmap->setImmutable();
return bitmap::createBitmap(env, bitmap,
@@ -561,8 +562,9 @@
sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
if (token == NULL) return;
- ALOGD_IF_SLOW(100, "Excessive delay in setPowerMode()");
+ android::base::Timer t;
SurfaceComposerClient::setDisplayPowerMode(token, mode);
+ if (t.duration() > 100ms) ALOGD("Excessive delay in setPowerMode()");
}
static jboolean nativeClearContentFrameStats(JNIEnv* env, jclass clazz, jlong nativeObject) {
diff --git a/core/jni/android_view_SurfaceSession.cpp b/core/jni/android_view_SurfaceSession.cpp
index 508d897..30c0030 100644
--- a/core/jni/android_view_SurfaceSession.cpp
+++ b/core/jni/android_view_SurfaceSession.cpp
@@ -16,7 +16,7 @@
#define LOG_TAG "SurfaceSession"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
#include <android_runtime/android_view_SurfaceSession.h>
diff --git a/core/jni/android_view_ThreadedRenderer.cpp b/core/jni/android_view_ThreadedRenderer.cpp
index 286c1a2..46b0a79 100644
--- a/core/jni/android_view_ThreadedRenderer.cpp
+++ b/core/jni/android_view_ThreadedRenderer.cpp
@@ -23,7 +23,7 @@
#include <nativehelper/JNIHelp.h>
#include "core_jni_helpers.h"
#include <GraphicsJNI.h>
-#include <ScopedPrimitiveArray.h>
+#include <nativehelper/ScopedPrimitiveArray.h>
#include <gui/BufferItemConsumer.h>
#include <gui/BufferQueue.h>
diff --git a/core/jni/android_view_VelocityTracker.cpp b/core/jni/android_view_VelocityTracker.cpp
index e1f2241..153789c 100644
--- a/core/jni/android_view_VelocityTracker.cpp
+++ b/core/jni/android_view_VelocityTracker.cpp
@@ -16,7 +16,7 @@
#define LOG_TAG "VelocityTracker-JNI"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
#include <utils/Log.h>
@@ -24,7 +24,7 @@
#include <input/VelocityTracker.h>
#include "android_view_MotionEvent.h"
-#include <ScopedUtfChars.h>
+#include <nativehelper/ScopedUtfChars.h>
#include "core_jni_helpers.h"
diff --git a/core/jni/com_android_internal_content_NativeLibraryHelper.cpp b/core/jni/com_android_internal_content_NativeLibraryHelper.cpp
index f8f9efe..fce5dd5 100644
--- a/core/jni/com_android_internal_content_NativeLibraryHelper.cpp
+++ b/core/jni/com_android_internal_content_NativeLibraryHelper.cpp
@@ -19,7 +19,7 @@
#include "core_jni_helpers.h"
-#include <ScopedUtfChars.h>
+#include <nativehelper/ScopedUtfChars.h>
#include <androidfw/ZipFileRO.h>
#include <androidfw/ZipUtils.h>
#include <utils/Log.h>
diff --git a/core/jni/com_android_internal_net_NetworkStatsFactory.cpp b/core/jni/com_android_internal_net_NetworkStatsFactory.cpp
index 4a2b881..0cb6935 100644
--- a/core/jni/com_android_internal_net_NetworkStatsFactory.cpp
+++ b/core/jni/com_android_internal_net_NetworkStatsFactory.cpp
@@ -24,9 +24,9 @@
#include <core_jni_helpers.h>
#include <jni.h>
-#include <ScopedUtfChars.h>
-#include <ScopedLocalRef.h>
-#include <ScopedPrimitiveArray.h>
+#include <nativehelper/ScopedUtfChars.h>
+#include <nativehelper/ScopedLocalRef.h>
+#include <nativehelper/ScopedPrimitiveArray.h>
#include <utils/Log.h>
#include <utils/misc.h>
diff --git a/core/jni/com_android_internal_os_ClassLoaderFactory.cpp b/core/jni/com_android_internal_os_ClassLoaderFactory.cpp
new file mode 100644
index 0000000..7052e5f
--- /dev/null
+++ b/core/jni/com_android_internal_os_ClassLoaderFactory.cpp
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <string>
+
+#include "nativeloader/native_loader.h"
+
+#include "core_jni_helpers.h"
+
+
+static jstring createClassloaderNamespace_native(JNIEnv* env,
+ jobject clazz,
+ jobject classLoader,
+ jint targetSdkVersion,
+ jstring librarySearchPath,
+ jstring libraryPermittedPath,
+ jboolean isShared) {
+ return android::CreateClassLoaderNamespace(env, targetSdkVersion,
+ classLoader, isShared == JNI_TRUE,
+ librarySearchPath, libraryPermittedPath);
+}
+
+static const JNINativeMethod g_methods[] = {
+ { "createClassloaderNamespace",
+ "(Ljava/lang/ClassLoader;ILjava/lang/String;Ljava/lang/String;Z)Ljava/lang/String;",
+ reinterpret_cast<void*>(createClassloaderNamespace_native) },
+};
+
+static const char* const kClassLoaderFactoryPathName = "com/android/internal/os/ClassLoaderFactory";
+
+namespace android
+{
+
+int register_com_android_internal_os_ClassLoaderFactory(JNIEnv* env) {
+ return RegisterMethodsOrDie(env, kClassLoaderFactoryPathName, g_methods, NELEM(g_methods));
+}
+
+} // namespace android
diff --git a/core/jni/com_android_internal_os_PathClassLoaderFactory.cpp b/core/jni/com_android_internal_os_PathClassLoaderFactory.cpp
deleted file mode 100644
index a7a912c..0000000
--- a/core/jni/com_android_internal_os_PathClassLoaderFactory.cpp
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <string>
-
-#include "nativeloader/native_loader.h"
-
-#include "core_jni_helpers.h"
-
-
-static jstring createClassloaderNamespace_native(JNIEnv* env,
- jobject clazz,
- jobject classLoader,
- jint targetSdkVersion,
- jstring librarySearchPath,
- jstring libraryPermittedPath,
- jboolean isShared) {
- return android::CreateClassLoaderNamespace(env, targetSdkVersion,
- classLoader, isShared == JNI_TRUE,
- librarySearchPath, libraryPermittedPath);
-}
-
-static const JNINativeMethod g_methods[] = {
- { "createClassloaderNamespace",
- "(Ljava/lang/ClassLoader;ILjava/lang/String;Ljava/lang/String;Z)Ljava/lang/String;",
- reinterpret_cast<void*>(createClassloaderNamespace_native) },
-};
-
-static const char* const kPathClassLoaderFactoryPathName = "com/android/internal/os/PathClassLoaderFactory";
-
-namespace android
-{
-
-int register_com_android_internal_os_PathClassLoaderFactory(JNIEnv* env) {
- return RegisterMethodsOrDie(env, kPathClassLoaderFactoryPathName, g_methods, NELEM(g_methods));
-}
-
-} // namespace android
diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp
index d73e7dd..3887c76 100644
--- a/core/jni/com_android_internal_os_Zygote.cpp
+++ b/core/jni/com_android_internal_os_Zygote.cpp
@@ -54,10 +54,10 @@
#include <processgroup/processgroup.h>
#include "core_jni_helpers.h"
-#include "JNIHelp.h"
-#include "ScopedLocalRef.h"
-#include "ScopedPrimitiveArray.h"
-#include "ScopedUtfChars.h"
+#include <nativehelper/JNIHelp.h>
+#include <nativehelper/ScopedLocalRef.h>
+#include <nativehelper/ScopedPrimitiveArray.h>
+#include <nativehelper/ScopedUtfChars.h>
#include "fd_utils.h"
#include "nativebridge/native_bridge.h"
@@ -221,6 +221,14 @@
// The debug malloc library needs to know whether it's the zygote or a child.
extern "C" int gMallocLeakZygoteChild;
+static void PreApplicationInit() {
+ // The child process sets this to indicate it's not the zygote.
+ gMallocLeakZygoteChild = 1;
+
+ // Set the jemalloc decay time to 1.
+ mallopt(M_DECAY_TIME, 1);
+}
+
static void EnableKeepCapabilities(JNIEnv* env) {
int rc = prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);
if (rc == -1) {
@@ -517,11 +525,7 @@
pid_t pid = fork();
if (pid == 0) {
- // The child process.
- gMallocLeakZygoteChild = 1;
-
- // Set the jemalloc decay time to 1.
- mallopt(M_DECAY_TIME, 1);
+ PreApplicationInit();
// Clean up any descriptors which must be closed immediately
DetachDescriptors(env, fdsToClose);
@@ -678,6 +682,10 @@
namespace android {
+static void com_android_internal_os_Zygote_nativePreApplicationInit(JNIEnv*, jclass) {
+ PreApplicationInit();
+}
+
static jint com_android_internal_os_Zygote_nativeForkAndSpecialize(
JNIEnv* env, jclass, jint uid, jint gid, jintArray gids,
jint debug_flags, jobjectArray rlimits,
@@ -807,7 +815,9 @@
{ "nativeAllowFileAcrossFork", "(Ljava/lang/String;)V",
(void *) com_android_internal_os_Zygote_nativeAllowFileAcrossFork },
{ "nativeUnmountStorageOnInit", "()V",
- (void *) com_android_internal_os_Zygote_nativeUnmountStorageOnInit }
+ (void *) com_android_internal_os_Zygote_nativeUnmountStorageOnInit },
+ { "nativePreApplicationInit", "()V",
+ (void *) com_android_internal_os_Zygote_nativePreApplicationInit }
};
int register_com_android_internal_os_Zygote(JNIEnv* env) {
diff --git a/core/jni/com_google_android_gles_jni_EGLImpl.cpp b/core/jni/com_google_android_gles_jni_EGLImpl.cpp
index c00d698..940ac22 100644
--- a/core/jni/com_google_android_gles_jni_EGLImpl.cpp
+++ b/core/jni/com_google_android_gles_jni_EGLImpl.cpp
@@ -15,7 +15,7 @@
** limitations under the License.
*/
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
#include <android_runtime/android_view_Surface.h>
#include <android_runtime/android_graphics_SurfaceTexture.h>
diff --git a/core/jni/com_google_android_gles_jni_GLImpl.cpp b/core/jni/com_google_android_gles_jni_GLImpl.cpp
index eeb92fc..ac23eca 100644
--- a/core/jni/com_google_android_gles_jni_GLImpl.cpp
+++ b/core/jni/com_google_android_gles_jni_GLImpl.cpp
@@ -22,7 +22,7 @@
#pragma GCC diagnostic ignored "-Wunused-function"
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
#include <utils/misc.h>
diff --git a/core/jni/core_jni_helpers.h b/core/jni/core_jni_helpers.h
index 3f169c3..1325b0c 100644
--- a/core/jni/core_jni_helpers.h
+++ b/core/jni/core_jni_helpers.h
@@ -17,7 +17,7 @@
#ifndef CORE_JNI_HELPERS
#define CORE_JNI_HELPERS
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
namespace android {
diff --git a/core/jni/include/android_runtime/AndroidRuntime.h b/core/jni/include/android_runtime/AndroidRuntime.h
index c2189d4..3ec8b1f 100644
--- a/core/jni/include/android_runtime/AndroidRuntime.h
+++ b/core/jni/include/android_runtime/AndroidRuntime.h
@@ -26,7 +26,7 @@
#include <utils/Vector.h>
#include <utils/threads.h>
#include <pthread.h>
-#include <nativehelper/jni.h>
+#include <jni.h>
namespace android {
diff --git a/core/jni/include/android_runtime/android_view_InputQueue.h b/core/jni/include/android_runtime/android_view_InputQueue.h
index ed37b0a..ac8da58 100644
--- a/core/jni/include/android_runtime/android_view_InputQueue.h
+++ b/core/jni/include/android_runtime/android_view_InputQueue.h
@@ -22,7 +22,7 @@
#include <utils/TypeHelpers.h>
#include <utils/Vector.h>
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
/*
* Declare a concrete type for the NDK's AInputQueue forward declaration
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index ae115d3..aa98bace 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -94,6 +94,7 @@
<protected-broadcast android:name="android.os.action.POWER_SAVE_TEMP_WHITELIST_CHANGED" />
<protected-broadcast android:name="android.os.action.POWER_SAVE_MODE_CHANGED_INTERNAL" />
+ <!-- @deprecated This is rarely used and will be phased out soon. -->
<protected-broadcast android:name="android.os.action.SCREEN_BRIGHTNESS_BOOST_CHANGED" />
<protected-broadcast android:name="android.app.action.ENTER_CAR_MODE" />
@@ -544,6 +545,7 @@
<protected-broadcast android:name="android.media.tv.action.PREVIEW_PROGRAM_BROWSABLE_DISABLED" />
<protected-broadcast android:name="android.media.tv.action.WATCH_NEXT_PROGRAM_BROWSABLE_DISABLED" />
<protected-broadcast android:name="android.media.tv.action.CHANNEL_BROWSABLE_REQUESTED" />
+ <protected-broadcast android:name="com.android.server.InputMethodManagerService.SHOW_INPUT_METHOD_PICKER" />
<!-- ====================================================================== -->
<!-- RUNTIME PERMISSIONS -->
@@ -957,18 +959,18 @@
<!-- ====================================================================== -->
<!-- @hide Allows an application to Access UCE-Presence.
- <p>Protection level: dangerous
+ <p>Protection level: signature|privileged
-->
<permission android:name="android.permission.ACCESS_UCE_PRESENCE_SERVICE"
android:permissionGroup="android.permission-group.PHONE"
- android:protectionLevel="signatureOrSystem"/>
+ android:protectionLevel="signature|privileged"/>
<!-- @hide Allows an application to Access UCE-OPTIONS.
- <p>Protection level: dangerous
+ <p>Protection level: signature|privileged
-->
<permission android:name="android.permission.ACCESS_UCE_OPTIONS_SERVICE"
android:permissionGroup="android.permission-group.PHONE"
- android:protectionLevel="signatureOrSystem"/>
+ android:protectionLevel="signature|privileged"/>
@@ -1526,7 +1528,12 @@
<permission android:name="android.permission.HARDWARE_TEST"
android:protectionLevel="signature" />
- <!-- @SystemApi Allows access to FM
+ <!-- @SystemApi Allows access to Broadcast Radio
+ @hide This is not a third-party API (intended for system apps).-->
+ <permission android:name="android.permission.ACCESS_BROADCAST_RADIO"
+ android:protectionLevel="signature|privileged" />
+
+ <!-- @deprecated @SystemApi Allows access to FM
@hide This is not a third-party API (intended for system apps).-->
<permission android:name="android.permission.ACCESS_FM_RADIO"
android:protectionLevel="signature|privileged" />
@@ -1693,6 +1700,10 @@
<permission android:name="android.permission.RECEIVE_STK_COMMANDS"
android:protectionLevel="signature|privileged" />
+ <!-- Allows an application to send EMBMS download intents to apps-->
+ <permission android:name="android.permission.SEND_EMBMS_INTENTS"
+ android:protectionLevel="signature|privileged" />
+
<!-- Must be required by an ImsService to ensure that only the
system can bind to it.
<p>Protection level: signature|privileged
@@ -1854,6 +1865,10 @@
<permission android:name="android.permission.MANAGE_ACTIVITY_STACKS"
android:protectionLevel="signature|privileged" />
+ <!-- @SystemApi @hide Allows an application to embed other activities -->
+ <permission android:name="android.permission.ACTIVITY_EMBEDDING"
+ android:protectionLevel="signature|privileged" />
+
<!-- Allows an application to start any activity, regardless of permission
protection or exported state.
@hide -->
@@ -2208,7 +2223,7 @@
<!-- Allows an application to clear the caches of all installed
applications on the device.
- <p>Protection level: system|signature
+ <p>Protection level: signature|privileged
-->
<permission android:name="android.permission.CLEAR_APP_CACHE"
android:protectionLevel="signature|privileged" />
@@ -2393,6 +2408,15 @@
<permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW"
android:protectionLevel="signature" />
+ <!-- @SystemApi Allows an application to use
+ {@link android.view.WindowManager.LayoutsParams#PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS}
+ to hide non-system-overlay windows.
+ <p>Not for use by third-party applications.
+ @hide
+ -->
+ <permission android:name="android.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS"
+ android:protectionLevel="signature|installer" />
+
<!-- @SystemApi Allows an application to manage (create, destroy,
Z-order) application tokens in the window manager.
<p>Not for use by third-party applications.
@@ -2520,6 +2544,23 @@
<permission android:name="android.permission.BIND_PRINT_RECOMMENDATION_SERVICE"
android:protectionLevel="signature" />
+ <!-- Allows applications to get the installed and enabled print services.
+ @hide
+ @SystemApi
+ @TestApi
+ <p>Protection level: signature|preinstalled
+ -->
+ <permission android:name="android.permission.READ_PRINT_SERVICES"
+ android:protectionLevel="signature|preinstalled" />
+
+ <!-- Allows applications to get the currently recommended print services for printers.
+ @hide
+ @SystemApi
+ <p>Protection level: signature|preinstalled
+ -->
+ <permission android:name="android.permission.READ_PRINT_SERVICE_RECOMMENDATIONS"
+ android:protectionLevel="signature|preinstalled" />
+
<!-- Must be required by a {@link android.nfc.cardemulation.HostApduService}
or {@link android.nfc.cardemulation.OffHostApduService} to ensure that only
the system can bind to it.
@@ -2560,7 +2601,7 @@
<!-- Must be required by a {@link android.service.wallpaper.WallpaperService},
to ensure that only the system can bind to it.
- <p>Protection level: system|signature
+ <p>Protection level: signature|privileged
-->
<permission android:name="android.permission.BIND_WALLPAPER"
android:protectionLevel="signature|privileged" />
@@ -2597,7 +2638,7 @@
<!-- Must be required by a {@link android.media.tv.TvInputService}
to ensure that only the system can bind to it.
- <p>Protection level: signature
+ <p>Protection level: signature|privileged
-->
<permission android:name="android.permission.BIND_TV_INPUT"
android:protectionLevel="signature|privileged" />
@@ -2619,12 +2660,24 @@
<permission android:name="android.permission.TV_VIRTUAL_REMOTE_CONTROLLER"
android:protectionLevel="signature|privileged" />
+ <!-- Allows an application to change HDMI CEC active source.
+ <p>Not for use by third-party applications.
+ @hide -->
+ <permission android:name="android.permission.CHANGE_HDMI_CEC_ACTIVE_SOURCE"
+ android:protectionLevel="signature|privileged" />
+
<!-- @SystemApi Allows an application to modify parental controls
<p>Not for use by third-party applications.
@hide -->
<permission android:name="android.permission.MODIFY_PARENTAL_CONTROLS"
android:protectionLevel="signature|privileged" />
+ <!-- @SystemApi Allows an application to read TvContentRatingSystemInfo
+ <p>Not for use by third-party applications.
+ @hide -->
+ <permission android:name="android.permission.READ_CONTENT_RATING_SYSTEMS"
+ android:protectionLevel="signature|privileged" />
+
<!-- @SystemApi Allows an application to notify TV inputs by sending broadcasts.
<p>Protection level: signature|privileged
<p>Not for use by third-party applications.
@@ -3113,9 +3166,7 @@
<permission android:name="android.permission.MANAGE_NETWORK_POLICY"
android:protectionLevel="signature" />
- <!-- @SystemApi Allows an application to account its network traffic against other UIDs. Used
- by system services like download manager and media server. Not for use by
- third party apps. @hide -->
+ <!-- @SystemApi @hide @deprecated use UPDATE_DEVICE_STATS instead -->
<permission android:name="android.permission.MODIFY_NETWORK_ACCOUNTING"
android:protectionLevel="signature|privileged" />
@@ -3347,7 +3398,7 @@
<!-- The system process that is allowed to bind to services in carrier apps will
have this permission. Carrier apps should use this permission to protect
their services that only the system is allowed to bind to.
- <p>Protection level: system|signature
+ <p>Protection level: signature|privileged
-->
<permission android:name="android.permission.BIND_CARRIER_SERVICES"
android:label="@string/permlab_bindCarrierServices"
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_00_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_00_mtrl.png
new file mode 100644
index 0000000..5aa4e98
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_01_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_01_mtrl.png
new file mode 100644
index 0000000..2afba7f
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_02_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_02_mtrl.png
new file mode 100644
index 0000000..94c696c
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_03_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_03_mtrl.png
new file mode 100644
index 0000000..2bbc0e0
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_04_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_04_mtrl.png
new file mode 100644
index 0000000..1554f45
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_05_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_05_mtrl.png
new file mode 100644
index 0000000..f7f9bec
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_06_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_06_mtrl.png
new file mode 100644
index 0000000..caf35d0
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_07_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_07_mtrl.png
new file mode 100644
index 0000000..428b6cf
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_08_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_08_mtrl.png
new file mode 100644
index 0000000..5bba9bb
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_09_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_09_mtrl.png
new file mode 100644
index 0000000..d562375
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_10_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_10_mtrl.png
new file mode 100644
index 0000000..a083bd2
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_11_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_11_mtrl.png
new file mode 100644
index 0000000..cdd80c8f
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_12_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_12_mtrl.png
new file mode 100644
index 0000000..f38ba50
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_13_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_13_mtrl.png
new file mode 100644
index 0000000..92d5887
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_14_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_14_mtrl.png
new file mode 100644
index 0000000..e5fb306
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_15_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_15_mtrl.png
new file mode 100644
index 0000000..ae62588
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_16_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_16_mtrl.png
new file mode 100644
index 0000000..952eda0
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_17_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_17_mtrl.png
new file mode 100644
index 0000000..d51aa42
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_18_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_18_mtrl.png
new file mode 100644
index 0000000..95a696f
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_19_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_19_mtrl.png
new file mode 100644
index 0000000..a9435e3
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_20_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_20_mtrl.png
new file mode 100644
index 0000000..851168a
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_21_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_21_mtrl.png
new file mode 100644
index 0000000..c0e15e9
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_22_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_22_mtrl.png
new file mode 100644
index 0000000..41a7b9c
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_23_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_23_mtrl.png
new file mode 100644
index 0000000..8618f96
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_24_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_24_mtrl.png
new file mode 100644
index 0000000..81488d1
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_25_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_25_mtrl.png
new file mode 100644
index 0000000..6b635c9
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_26_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_26_mtrl.png
new file mode 100644
index 0000000..8a7e4fc
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_27_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_27_mtrl.png
new file mode 100644
index 0000000..6f7d3a2
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_28_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_28_mtrl.png
new file mode 100644
index 0000000..fc6caf5
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_29_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_29_mtrl.png
new file mode 100644
index 0000000..3554271
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_30_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_30_mtrl.png
new file mode 100644
index 0000000..6c82a89
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_00_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_00_mtrl.png
new file mode 100644
index 0000000..d6daf80
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_01_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_01_mtrl.png
new file mode 100644
index 0000000..41275f1
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_02_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_02_mtrl.png
new file mode 100644
index 0000000..b63b7c3
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_03_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_03_mtrl.png
new file mode 100644
index 0000000..403d1b7
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_04_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_04_mtrl.png
new file mode 100644
index 0000000..a19aa06
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_05_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_05_mtrl.png
new file mode 100644
index 0000000..33d4dbf
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_06_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_06_mtrl.png
new file mode 100644
index 0000000..ad89fa1
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_07_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_07_mtrl.png
new file mode 100644
index 0000000..9a970c8
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_08_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_08_mtrl.png
new file mode 100644
index 0000000..5c71217
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_09_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_09_mtrl.png
new file mode 100644
index 0000000..181c812
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_10_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_10_mtrl.png
new file mode 100644
index 0000000..1b285a7
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_11_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_11_mtrl.png
new file mode 100644
index 0000000..00f1c62
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_12_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_12_mtrl.png
new file mode 100644
index 0000000..f86cca7
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_13_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_13_mtrl.png
new file mode 100644
index 0000000..4e47fc8
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_14_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_14_mtrl.png
new file mode 100644
index 0000000..8b33f2c
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_15_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_15_mtrl.png
new file mode 100644
index 0000000..451bda7
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_16_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_16_mtrl.png
new file mode 100644
index 0000000..dedbff1
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_17_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_17_mtrl.png
new file mode 100644
index 0000000..d6be31c
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_18_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_18_mtrl.png
new file mode 100644
index 0000000..bfd1900
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_19_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_19_mtrl.png
new file mode 100644
index 0000000..003f13d
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_20_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_20_mtrl.png
new file mode 100644
index 0000000..5564760
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_21_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_21_mtrl.png
new file mode 100644
index 0000000..ebc1ae1
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_22_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_22_mtrl.png
new file mode 100644
index 0000000..92a9230
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_23_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_23_mtrl.png
new file mode 100644
index 0000000..6f5c84a
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_24_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_24_mtrl.png
new file mode 100644
index 0000000..ba4ab1d
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_25_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_25_mtrl.png
new file mode 100644
index 0000000..f246835
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_26_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_26_mtrl.png
new file mode 100644
index 0000000..04b790b
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_27_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_27_mtrl.png
new file mode 100644
index 0000000..63e0d79
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_28_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_28_mtrl.png
new file mode 100644
index 0000000..89027f4
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_29_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_29_mtrl.png
new file mode 100644
index 0000000..4b4870b
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_30_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_30_mtrl.png
new file mode 100644
index 0000000..1dae891
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_00_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_00_mtrl.png
new file mode 100644
index 0000000..5aa4e98
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_01_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_01_mtrl.png
new file mode 100644
index 0000000..2afba7f
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_02_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_02_mtrl.png
new file mode 100644
index 0000000..94c696c
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_03_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_03_mtrl.png
new file mode 100644
index 0000000..2bbc0e0
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_04_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_04_mtrl.png
new file mode 100644
index 0000000..1554f45
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_05_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_05_mtrl.png
new file mode 100644
index 0000000..f7f9bec
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_06_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_06_mtrl.png
new file mode 100644
index 0000000..caf35d0
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_07_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_07_mtrl.png
new file mode 100644
index 0000000..4c36c70
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_08_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_08_mtrl.png
new file mode 100644
index 0000000..5bba9bb
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_09_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_09_mtrl.png
new file mode 100644
index 0000000..d562375
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_10_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_10_mtrl.png
new file mode 100644
index 0000000..19b7700
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_11_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_11_mtrl.png
new file mode 100644
index 0000000..d86fe79
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_12_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_12_mtrl.png
new file mode 100644
index 0000000..c38e4be
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_13_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_13_mtrl.png
new file mode 100644
index 0000000..4ea1ce3
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_14_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_14_mtrl.png
new file mode 100644
index 0000000..b49e12c
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_15_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_15_mtrl.png
new file mode 100644
index 0000000..5ce7064
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_16_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_16_mtrl.png
new file mode 100644
index 0000000..ebc0b50
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_17_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_17_mtrl.png
new file mode 100644
index 0000000..04af459
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_18_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_18_mtrl.png
new file mode 100644
index 0000000..862f22d
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_19_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_19_mtrl.png
new file mode 100644
index 0000000..9d8f434
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_20_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_20_mtrl.png
new file mode 100644
index 0000000..099703e
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_21_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_21_mtrl.png
new file mode 100644
index 0000000..6463743
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_22_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_22_mtrl.png
new file mode 100644
index 0000000..c3808eb
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_23_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_23_mtrl.png
new file mode 100644
index 0000000..14215bb
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_24_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_24_mtrl.png
new file mode 100644
index 0000000..0720a34
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_25_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_25_mtrl.png
new file mode 100644
index 0000000..08d94b0
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_26_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_26_mtrl.png
new file mode 100644
index 0000000..58bd80b
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_27_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_27_mtrl.png
new file mode 100644
index 0000000..0c7a1f3
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_28_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_28_mtrl.png
new file mode 100644
index 0000000..1a8c1e6
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_29_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_29_mtrl.png
new file mode 100644
index 0000000..10bc6c4
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_30_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_30_mtrl.png
new file mode 100644
index 0000000..5aa4e98
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_00_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_00_mtrl.png
new file mode 100644
index 0000000..d6daf80
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_01_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_01_mtrl.png
new file mode 100644
index 0000000..41275f1
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_02_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_02_mtrl.png
new file mode 100644
index 0000000..b63b7c3
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_03_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_03_mtrl.png
new file mode 100644
index 0000000..403d1b7
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_04_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_04_mtrl.png
new file mode 100644
index 0000000..a19aa06
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_05_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_05_mtrl.png
new file mode 100644
index 0000000..33d4dbf
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_06_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_06_mtrl.png
new file mode 100644
index 0000000..ad89fa1
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_07_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_07_mtrl.png
new file mode 100644
index 0000000..9a970c8
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_08_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_08_mtrl.png
new file mode 100644
index 0000000..5c71217
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_09_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_09_mtrl.png
new file mode 100644
index 0000000..181c812
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_10_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_10_mtrl.png
new file mode 100644
index 0000000..1b285a7
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_11_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_11_mtrl.png
new file mode 100644
index 0000000..4a91688
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_12_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_12_mtrl.png
new file mode 100644
index 0000000..4a3bc21
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_13_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_13_mtrl.png
new file mode 100644
index 0000000..84d944d
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_14_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_14_mtrl.png
new file mode 100644
index 0000000..8fe61bc
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_15_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_15_mtrl.png
new file mode 100644
index 0000000..d1a9906
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_16_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_16_mtrl.png
new file mode 100644
index 0000000..3de70e3
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_17_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_17_mtrl.png
new file mode 100644
index 0000000..a2caa31
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_18_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_18_mtrl.png
new file mode 100644
index 0000000..984e0b1
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_19_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_19_mtrl.png
new file mode 100644
index 0000000..1a20df8
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_20_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_20_mtrl.png
new file mode 100644
index 0000000..2ffe3f7
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_21_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_21_mtrl.png
new file mode 100644
index 0000000..87f7880
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_22_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_22_mtrl.png
new file mode 100644
index 0000000..39f1db7
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_23_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_23_mtrl.png
new file mode 100644
index 0000000..e1501fe6
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_24_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_24_mtrl.png
new file mode 100644
index 0000000..1ac9df6
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_25_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_25_mtrl.png
new file mode 100644
index 0000000..486225b
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_26_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_26_mtrl.png
new file mode 100644
index 0000000..e2aec2b
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_27_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_27_mtrl.png
new file mode 100644
index 0000000..c63ee04
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_28_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_28_mtrl.png
new file mode 100644
index 0000000..2f92d61
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_29_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_29_mtrl.png
new file mode 100644
index 0000000..9b7c065
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_30_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_30_mtrl.png
new file mode 100644
index 0000000..d6daf80
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_off_dark_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_off_dark_mtrl.png
new file mode 100644
index 0000000..1f180ad
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_off_dark_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_off_light_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_off_light_mtrl.png
new file mode 100644
index 0000000..18d83e9
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_off_light_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_off_mtrl_alpha.png b/core/res/res/drawable-hdpi/ic_media_route_off_mtrl_alpha.png
deleted file mode 100644
index d37e8ee..0000000
--- a/core/res/res/drawable-hdpi/ic_media_route_off_mtrl_alpha.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_on_0_mtrl_alpha.png b/core/res/res/drawable-hdpi/ic_media_route_on_0_mtrl_alpha.png
deleted file mode 100644
index 0c604d9..0000000
--- a/core/res/res/drawable-hdpi/ic_media_route_on_0_mtrl_alpha.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_on_1_mtrl_alpha.png b/core/res/res/drawable-hdpi/ic_media_route_on_1_mtrl_alpha.png
deleted file mode 100644
index 2c3f4ff..0000000
--- a/core/res/res/drawable-hdpi/ic_media_route_on_1_mtrl_alpha.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_on_2_mtrl_alpha.png b/core/res/res/drawable-hdpi/ic_media_route_on_2_mtrl_alpha.png
deleted file mode 100644
index 991c50e..0000000
--- a/core/res/res/drawable-hdpi/ic_media_route_on_2_mtrl_alpha.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_on_mtrl_alpha.png b/core/res/res/drawable-hdpi/ic_media_route_on_mtrl_alpha.png
deleted file mode 100644
index 05fb919..0000000
--- a/core/res/res/drawable-hdpi/ic_media_route_on_mtrl_alpha.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_00_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_00_mtrl.png
new file mode 100644
index 0000000..49d353d
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_01_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_01_mtrl.png
new file mode 100644
index 0000000..ca1bf45
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_02_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_02_mtrl.png
new file mode 100644
index 0000000..69611bc
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_03_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_03_mtrl.png
new file mode 100644
index 0000000..53e0f64
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_04_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_04_mtrl.png
new file mode 100644
index 0000000..bcf2a18
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_05_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_05_mtrl.png
new file mode 100644
index 0000000..937f5a0
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_06_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_06_mtrl.png
new file mode 100644
index 0000000..5a5e2d5
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_07_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_07_mtrl.png
new file mode 100644
index 0000000..82cf33c
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_08_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_08_mtrl.png
new file mode 100644
index 0000000..522b331
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_09_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_09_mtrl.png
new file mode 100644
index 0000000..23723a3
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_10_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_10_mtrl.png
new file mode 100644
index 0000000..313b6d2
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_11_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_11_mtrl.png
new file mode 100644
index 0000000..cfbc110
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_12_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_12_mtrl.png
new file mode 100644
index 0000000..2b2c628
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_13_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_13_mtrl.png
new file mode 100644
index 0000000..260adca
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_14_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_14_mtrl.png
new file mode 100644
index 0000000..cadb1c5
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_15_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_15_mtrl.png
new file mode 100644
index 0000000..b91e799
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_16_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_16_mtrl.png
new file mode 100644
index 0000000..19edb96
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_17_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_17_mtrl.png
new file mode 100644
index 0000000..e7b20cc
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_18_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_18_mtrl.png
new file mode 100644
index 0000000..7ea341e
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_19_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_19_mtrl.png
new file mode 100644
index 0000000..fb8b556
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_20_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_20_mtrl.png
new file mode 100644
index 0000000..91016aa
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_21_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_21_mtrl.png
new file mode 100644
index 0000000..c51481a
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_22_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_22_mtrl.png
new file mode 100644
index 0000000..80d09e2
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_23_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_23_mtrl.png
new file mode 100644
index 0000000..c4ad65f
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_24_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_24_mtrl.png
new file mode 100644
index 0000000..060be80
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_25_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_25_mtrl.png
new file mode 100644
index 0000000..e45e858
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_26_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_26_mtrl.png
new file mode 100644
index 0000000..55c3959
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_27_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_27_mtrl.png
new file mode 100644
index 0000000..9c11d99
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_28_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_28_mtrl.png
new file mode 100644
index 0000000..d3c334b
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_29_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_29_mtrl.png
new file mode 100644
index 0000000..a3164c9
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_30_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_30_mtrl.png
new file mode 100644
index 0000000..b550760
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_00_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_00_mtrl.png
new file mode 100644
index 0000000..d5efab4
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_01_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_01_mtrl.png
new file mode 100644
index 0000000..74d39ac
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_02_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_02_mtrl.png
new file mode 100644
index 0000000..3775cef
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_03_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_03_mtrl.png
new file mode 100644
index 0000000..d960a39
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_04_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_04_mtrl.png
new file mode 100644
index 0000000..6101cdf
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_05_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_05_mtrl.png
new file mode 100644
index 0000000..fca6c96
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_06_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_06_mtrl.png
new file mode 100644
index 0000000..b2bdc46
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_07_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_07_mtrl.png
new file mode 100644
index 0000000..9d8335e
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_08_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_08_mtrl.png
new file mode 100644
index 0000000..4593765
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_09_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_09_mtrl.png
new file mode 100644
index 0000000..d740810
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_10_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_10_mtrl.png
new file mode 100644
index 0000000..7b8a7fc
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_11_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_11_mtrl.png
new file mode 100644
index 0000000..e5d3c682
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_12_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_12_mtrl.png
new file mode 100644
index 0000000..b264a99
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_13_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_13_mtrl.png
new file mode 100644
index 0000000..0232d72
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_14_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_14_mtrl.png
new file mode 100644
index 0000000..2aa94bb
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_15_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_15_mtrl.png
new file mode 100644
index 0000000..693f6c6
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_16_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_16_mtrl.png
new file mode 100644
index 0000000..b7aea5c
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_17_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_17_mtrl.png
new file mode 100644
index 0000000..217cb3d
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_18_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_18_mtrl.png
new file mode 100644
index 0000000..933f338
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_19_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_19_mtrl.png
new file mode 100644
index 0000000..a2ced71
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_20_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_20_mtrl.png
new file mode 100644
index 0000000..4303ca4
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_21_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_21_mtrl.png
new file mode 100644
index 0000000..c4d9559
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_22_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_22_mtrl.png
new file mode 100644
index 0000000..a6e278b
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_23_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_23_mtrl.png
new file mode 100644
index 0000000..19bf6c2
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_24_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_24_mtrl.png
new file mode 100644
index 0000000..c6c2163
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_25_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_25_mtrl.png
new file mode 100644
index 0000000..fe87238
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_26_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_26_mtrl.png
new file mode 100644
index 0000000..229c489
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_27_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_27_mtrl.png
new file mode 100644
index 0000000..64155d9
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_28_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_28_mtrl.png
new file mode 100644
index 0000000..cb4c0ed
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_29_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_29_mtrl.png
new file mode 100644
index 0000000..a85c70c
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_30_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_30_mtrl.png
new file mode 100644
index 0000000..d99afbf
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_00_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_00_mtrl.png
new file mode 100644
index 0000000..49d353d
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_01_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_01_mtrl.png
new file mode 100644
index 0000000..ca1bf45
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_02_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_02_mtrl.png
new file mode 100644
index 0000000..69611bc
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_03_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_03_mtrl.png
new file mode 100644
index 0000000..53e0f64
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_04_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_04_mtrl.png
new file mode 100644
index 0000000..bcf2a18
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_05_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_05_mtrl.png
new file mode 100644
index 0000000..937f5a0
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_06_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_06_mtrl.png
new file mode 100644
index 0000000..5a5e2d5
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_07_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_07_mtrl.png
new file mode 100644
index 0000000..82cf33c
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_08_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_08_mtrl.png
new file mode 100644
index 0000000..522b331
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_09_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_09_mtrl.png
new file mode 100644
index 0000000..23723a3
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_10_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_10_mtrl.png
new file mode 100644
index 0000000..313b6d2
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_11_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_11_mtrl.png
new file mode 100644
index 0000000..db37fc5
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_12_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_12_mtrl.png
new file mode 100644
index 0000000..79941dc
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_13_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_13_mtrl.png
new file mode 100644
index 0000000..3361fe2
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_14_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_14_mtrl.png
new file mode 100644
index 0000000..5649d0f
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_15_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_15_mtrl.png
new file mode 100644
index 0000000..801b562
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_16_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_16_mtrl.png
new file mode 100644
index 0000000..38e1408
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_17_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_17_mtrl.png
new file mode 100644
index 0000000..f99797d
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_18_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_18_mtrl.png
new file mode 100644
index 0000000..7048711
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_19_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_19_mtrl.png
new file mode 100644
index 0000000..6f60804
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_20_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_20_mtrl.png
new file mode 100644
index 0000000..da3a23b
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_21_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_21_mtrl.png
new file mode 100644
index 0000000..4007ed1
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_22_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_22_mtrl.png
new file mode 100644
index 0000000..518d2b9
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_23_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_23_mtrl.png
new file mode 100644
index 0000000..d821697
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_24_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_24_mtrl.png
new file mode 100644
index 0000000..aa19608
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_25_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_25_mtrl.png
new file mode 100644
index 0000000..81bf08c
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_26_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_26_mtrl.png
new file mode 100644
index 0000000..1bb7aec
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_27_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_27_mtrl.png
new file mode 100644
index 0000000..864795c
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_28_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_28_mtrl.png
new file mode 100644
index 0000000..ed07e9f
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_29_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_29_mtrl.png
new file mode 100644
index 0000000..a188260
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_30_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_30_mtrl.png
new file mode 100644
index 0000000..49d353d
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_00_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_00_mtrl.png
new file mode 100644
index 0000000..d5efab4
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_01_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_01_mtrl.png
new file mode 100644
index 0000000..74d39ac
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_02_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_02_mtrl.png
new file mode 100644
index 0000000..3775cef
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_03_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_03_mtrl.png
new file mode 100644
index 0000000..d960a39
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_04_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_04_mtrl.png
new file mode 100644
index 0000000..6101cdf
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_05_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_05_mtrl.png
new file mode 100644
index 0000000..fca6c96
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_06_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_06_mtrl.png
new file mode 100644
index 0000000..b2bdc46
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_07_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_07_mtrl.png
new file mode 100644
index 0000000..9d8335e
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_08_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_08_mtrl.png
new file mode 100644
index 0000000..4593765
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_09_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_09_mtrl.png
new file mode 100644
index 0000000..d740810
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_10_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_10_mtrl.png
new file mode 100644
index 0000000..7b8a7fc
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_11_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_11_mtrl.png
new file mode 100644
index 0000000..aadb0cd
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_12_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_12_mtrl.png
new file mode 100644
index 0000000..628e63d
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_13_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_13_mtrl.png
new file mode 100644
index 0000000..dfc63ae
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_14_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_14_mtrl.png
new file mode 100644
index 0000000..450ead1
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_15_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_15_mtrl.png
new file mode 100644
index 0000000..6424958
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_16_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_16_mtrl.png
new file mode 100644
index 0000000..c5b7fa4
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_17_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_17_mtrl.png
new file mode 100644
index 0000000..13fcf6f
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_18_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_18_mtrl.png
new file mode 100644
index 0000000..5be9c69
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_19_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_19_mtrl.png
new file mode 100644
index 0000000..3de2194
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_20_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_20_mtrl.png
new file mode 100644
index 0000000..c40a2cf
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_21_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_21_mtrl.png
new file mode 100644
index 0000000..9923ccd
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_22_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_22_mtrl.png
new file mode 100644
index 0000000..8a000c1
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_23_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_23_mtrl.png
new file mode 100644
index 0000000..3680ced
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_24_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_24_mtrl.png
new file mode 100644
index 0000000..d014f5e
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_25_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_25_mtrl.png
new file mode 100644
index 0000000..a8aefdb
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_26_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_26_mtrl.png
new file mode 100644
index 0000000..4716d66
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_27_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_27_mtrl.png
new file mode 100644
index 0000000..fdeaf4f
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_28_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_28_mtrl.png
new file mode 100644
index 0000000..9accc7a
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_29_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_29_mtrl.png
new file mode 100644
index 0000000..1f0a327
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_30_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_30_mtrl.png
new file mode 100644
index 0000000..d5efab4
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_off_dark_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_off_dark_mtrl.png
new file mode 100644
index 0000000..9ef3ea6
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_off_dark_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_off_light_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_off_light_mtrl.png
new file mode 100644
index 0000000..cbcc75a
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_off_light_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_off_mtrl_alpha.png b/core/res/res/drawable-mdpi/ic_media_route_off_mtrl_alpha.png
deleted file mode 100644
index a652117..0000000
--- a/core/res/res/drawable-mdpi/ic_media_route_off_mtrl_alpha.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_on_0_mtrl_alpha.png b/core/res/res/drawable-mdpi/ic_media_route_on_0_mtrl_alpha.png
deleted file mode 100644
index 35d1c56..0000000
--- a/core/res/res/drawable-mdpi/ic_media_route_on_0_mtrl_alpha.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_on_1_mtrl_alpha.png b/core/res/res/drawable-mdpi/ic_media_route_on_1_mtrl_alpha.png
deleted file mode 100644
index 264188b..0000000
--- a/core/res/res/drawable-mdpi/ic_media_route_on_1_mtrl_alpha.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_on_2_mtrl_alpha.png b/core/res/res/drawable-mdpi/ic_media_route_on_2_mtrl_alpha.png
deleted file mode 100644
index 06ae665..0000000
--- a/core/res/res/drawable-mdpi/ic_media_route_on_2_mtrl_alpha.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_on_mtrl_alpha.png b/core/res/res/drawable-mdpi/ic_media_route_on_mtrl_alpha.png
deleted file mode 100644
index a69e301..0000000
--- a/core/res/res/drawable-mdpi/ic_media_route_on_mtrl_alpha.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_00_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_00_mtrl.png
new file mode 100644
index 0000000..0907a1e
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_01_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_01_mtrl.png
new file mode 100644
index 0000000..365d96e
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_02_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_02_mtrl.png
new file mode 100644
index 0000000..7191add
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_03_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_03_mtrl.png
new file mode 100644
index 0000000..fd8a5df
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_04_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_04_mtrl.png
new file mode 100644
index 0000000..9ae573b
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_05_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_05_mtrl.png
new file mode 100644
index 0000000..a41d549
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_06_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_06_mtrl.png
new file mode 100644
index 0000000..4faef98
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_07_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_07_mtrl.png
new file mode 100644
index 0000000..337372c
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_08_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_08_mtrl.png
new file mode 100644
index 0000000..a78de95
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_09_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_09_mtrl.png
new file mode 100644
index 0000000..74f8912
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_10_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_10_mtrl.png
new file mode 100644
index 0000000..0b868fb
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_11_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_11_mtrl.png
new file mode 100644
index 0000000..8c381cc
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_12_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_12_mtrl.png
new file mode 100644
index 0000000..17e40a0
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_13_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_13_mtrl.png
new file mode 100644
index 0000000..5280b2f
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_14_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_14_mtrl.png
new file mode 100644
index 0000000..dfe29ce
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_15_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_15_mtrl.png
new file mode 100644
index 0000000..663d361
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_16_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_16_mtrl.png
new file mode 100644
index 0000000..5e2ecdf
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_17_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_17_mtrl.png
new file mode 100644
index 0000000..8d6c1f24
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_18_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_18_mtrl.png
new file mode 100644
index 0000000..4edd1ac
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_19_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_19_mtrl.png
new file mode 100644
index 0000000..af45ea7
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_20_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_20_mtrl.png
new file mode 100644
index 0000000..f075756
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_21_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_21_mtrl.png
new file mode 100644
index 0000000..69bd877
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_22_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_22_mtrl.png
new file mode 100644
index 0000000..8c956bb
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_23_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_23_mtrl.png
new file mode 100644
index 0000000..76bf9ab
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_24_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_24_mtrl.png
new file mode 100644
index 0000000..1a7f9a1
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_25_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_25_mtrl.png
new file mode 100644
index 0000000..1275eaa
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_26_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_26_mtrl.png
new file mode 100644
index 0000000..c4ed71d
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_27_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_27_mtrl.png
new file mode 100644
index 0000000..03252d7
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_28_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_28_mtrl.png
new file mode 100644
index 0000000..ea8ee85
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_29_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_29_mtrl.png
new file mode 100644
index 0000000..b024c4e
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_30_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_30_mtrl.png
new file mode 100644
index 0000000..35516f6
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_00_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_00_mtrl.png
new file mode 100644
index 0000000..dbd9854
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_01_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_01_mtrl.png
new file mode 100644
index 0000000..f0c30b1
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_02_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_02_mtrl.png
new file mode 100644
index 0000000..f21743b
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_03_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_03_mtrl.png
new file mode 100644
index 0000000..0b96ae0
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_04_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_04_mtrl.png
new file mode 100644
index 0000000..2e5407f
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_05_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_05_mtrl.png
new file mode 100644
index 0000000..0beb389
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_06_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_06_mtrl.png
new file mode 100644
index 0000000..a41586e
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_07_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_07_mtrl.png
new file mode 100644
index 0000000..709f650
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_08_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_08_mtrl.png
new file mode 100644
index 0000000..494a716
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_09_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_09_mtrl.png
new file mode 100644
index 0000000..9ec48f4
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_10_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_10_mtrl.png
new file mode 100644
index 0000000..f4c22b1
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_11_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_11_mtrl.png
new file mode 100644
index 0000000..6fd600f
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_12_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_12_mtrl.png
new file mode 100644
index 0000000..cfee3e1
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_13_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_13_mtrl.png
new file mode 100644
index 0000000..cc79904
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_14_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_14_mtrl.png
new file mode 100644
index 0000000..28c7441
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_15_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_15_mtrl.png
new file mode 100644
index 0000000..6c7e534
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_16_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_16_mtrl.png
new file mode 100644
index 0000000..e7d20d7
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_17_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_17_mtrl.png
new file mode 100644
index 0000000..ea492d2
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_18_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_18_mtrl.png
new file mode 100644
index 0000000..92c6ad8
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_19_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_19_mtrl.png
new file mode 100644
index 0000000..f666d89
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_20_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_20_mtrl.png
new file mode 100644
index 0000000..c2b600d
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_21_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_21_mtrl.png
new file mode 100644
index 0000000..31736aa
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_22_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_22_mtrl.png
new file mode 100644
index 0000000..3032ef0
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_23_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_23_mtrl.png
new file mode 100644
index 0000000..1d5cbc0
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_24_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_24_mtrl.png
new file mode 100644
index 0000000..84ebcc3
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_25_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_25_mtrl.png
new file mode 100644
index 0000000..505aadf
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_26_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_26_mtrl.png
new file mode 100644
index 0000000..3b8c662
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_27_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_27_mtrl.png
new file mode 100644
index 0000000..d650c07
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_28_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_28_mtrl.png
new file mode 100644
index 0000000..3caa40d
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_29_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_29_mtrl.png
new file mode 100644
index 0000000..d3f8ea6
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_30_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_30_mtrl.png
new file mode 100644
index 0000000..b54396c
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_00_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_00_mtrl.png
new file mode 100644
index 0000000..0907a1e
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_01_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_01_mtrl.png
new file mode 100644
index 0000000..365d96e
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_02_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_02_mtrl.png
new file mode 100644
index 0000000..7191add
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_03_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_03_mtrl.png
new file mode 100644
index 0000000..fd8a5df
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_04_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_04_mtrl.png
new file mode 100644
index 0000000..9ae573b
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_05_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_05_mtrl.png
new file mode 100644
index 0000000..a41d549
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_06_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_06_mtrl.png
new file mode 100644
index 0000000..4faef98
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_07_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_07_mtrl.png
new file mode 100644
index 0000000..337372c
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_08_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_08_mtrl.png
new file mode 100644
index 0000000..a78de95
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_09_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_09_mtrl.png
new file mode 100644
index 0000000..74f8912
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_10_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_10_mtrl.png
new file mode 100644
index 0000000..0b868fb
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_11_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_11_mtrl.png
new file mode 100644
index 0000000..90ca46c
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_12_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_12_mtrl.png
new file mode 100644
index 0000000..db02019
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_13_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_13_mtrl.png
new file mode 100644
index 0000000..ce5ee81
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_14_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_14_mtrl.png
new file mode 100644
index 0000000..3dcbef6
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_15_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_15_mtrl.png
new file mode 100644
index 0000000..7646f18
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_16_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_16_mtrl.png
new file mode 100644
index 0000000..c16cac9
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_17_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_17_mtrl.png
new file mode 100644
index 0000000..7dbc57c
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_18_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_18_mtrl.png
new file mode 100644
index 0000000..39d17e0
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_19_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_19_mtrl.png
new file mode 100644
index 0000000..ad0e121
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_20_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_20_mtrl.png
new file mode 100644
index 0000000..30ea5df
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_21_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_21_mtrl.png
new file mode 100644
index 0000000..151a222
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_22_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_22_mtrl.png
new file mode 100644
index 0000000..7d4e660
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_23_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_23_mtrl.png
new file mode 100644
index 0000000..8e26d54
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_24_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_24_mtrl.png
new file mode 100644
index 0000000..e85f239
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_25_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_25_mtrl.png
new file mode 100644
index 0000000..81f38ac
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_26_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_26_mtrl.png
new file mode 100644
index 0000000..5a50e6a
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_27_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_27_mtrl.png
new file mode 100644
index 0000000..6069dad
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_28_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_28_mtrl.png
new file mode 100644
index 0000000..37cc4c6
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_29_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_29_mtrl.png
new file mode 100644
index 0000000..aff0d4c
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_30_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_30_mtrl.png
new file mode 100644
index 0000000..0907a1e
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_00_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_00_mtrl.png
new file mode 100644
index 0000000..dbd9854
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_01_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_01_mtrl.png
new file mode 100644
index 0000000..f0c30b1
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_02_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_02_mtrl.png
new file mode 100644
index 0000000..f21743b
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_03_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_03_mtrl.png
new file mode 100644
index 0000000..0b96ae0
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_04_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_04_mtrl.png
new file mode 100644
index 0000000..2e5407f
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_05_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_05_mtrl.png
new file mode 100644
index 0000000..302fafa
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_06_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_06_mtrl.png
new file mode 100644
index 0000000..a41586e
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_07_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_07_mtrl.png
new file mode 100644
index 0000000..709f650
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_08_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_08_mtrl.png
new file mode 100644
index 0000000..494a716
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_09_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_09_mtrl.png
new file mode 100644
index 0000000..9ec48f4
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_10_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_10_mtrl.png
new file mode 100644
index 0000000..f4c22b1
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_11_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_11_mtrl.png
new file mode 100644
index 0000000..7d72685
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_12_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_12_mtrl.png
new file mode 100644
index 0000000..4c545ef
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_13_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_13_mtrl.png
new file mode 100644
index 0000000..a8e9b00
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_14_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_14_mtrl.png
new file mode 100644
index 0000000..b67140d
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_15_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_15_mtrl.png
new file mode 100644
index 0000000..166bdae
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_16_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_16_mtrl.png
new file mode 100644
index 0000000..1bda465
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_17_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_17_mtrl.png
new file mode 100644
index 0000000..cc8ec51
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_18_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_18_mtrl.png
new file mode 100644
index 0000000..cf2013c
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_19_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_19_mtrl.png
new file mode 100644
index 0000000..daa1ca1
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_20_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_20_mtrl.png
new file mode 100644
index 0000000..56355d9
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_21_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_21_mtrl.png
new file mode 100644
index 0000000..42657ec
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_22_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_22_mtrl.png
new file mode 100644
index 0000000..53e4121
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_23_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_23_mtrl.png
new file mode 100644
index 0000000..f6e9ffa
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_24_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_24_mtrl.png
new file mode 100644
index 0000000..a313e16
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_25_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_25_mtrl.png
new file mode 100644
index 0000000..40034b6
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_26_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_26_mtrl.png
new file mode 100644
index 0000000..678f972
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_27_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_27_mtrl.png
new file mode 100644
index 0000000..d2a3707
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_28_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_28_mtrl.png
new file mode 100644
index 0000000..427c52e
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_29_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_29_mtrl.png
new file mode 100644
index 0000000..8a4d807
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_30_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_30_mtrl.png
new file mode 100644
index 0000000..dbd9854
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_off_dark_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_off_dark_mtrl.png
new file mode 100644
index 0000000..1d85b66
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_off_dark_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_off_light_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_off_light_mtrl.png
new file mode 100644
index 0000000..231aec4
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_off_light_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_off_mtrl_alpha.png b/core/res/res/drawable-xhdpi/ic_media_route_off_mtrl_alpha.png
deleted file mode 100644
index e75ffb8..0000000
--- a/core/res/res/drawable-xhdpi/ic_media_route_off_mtrl_alpha.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_on_0_mtrl_alpha.png b/core/res/res/drawable-xhdpi/ic_media_route_on_0_mtrl_alpha.png
deleted file mode 100644
index 1b9fc12..0000000
--- a/core/res/res/drawable-xhdpi/ic_media_route_on_0_mtrl_alpha.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_on_1_mtrl_alpha.png b/core/res/res/drawable-xhdpi/ic_media_route_on_1_mtrl_alpha.png
deleted file mode 100644
index f63d47e..0000000
--- a/core/res/res/drawable-xhdpi/ic_media_route_on_1_mtrl_alpha.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_on_2_mtrl_alpha.png b/core/res/res/drawable-xhdpi/ic_media_route_on_2_mtrl_alpha.png
deleted file mode 100644
index fe005d9..0000000
--- a/core/res/res/drawable-xhdpi/ic_media_route_on_2_mtrl_alpha.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_on_mtrl_alpha.png b/core/res/res/drawable-xhdpi/ic_media_route_on_mtrl_alpha.png
deleted file mode 100644
index ea86408..0000000
--- a/core/res/res/drawable-xhdpi/ic_media_route_on_mtrl_alpha.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_00_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_00_mtrl.png
new file mode 100644
index 0000000..97949c6
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_01_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_01_mtrl.png
new file mode 100644
index 0000000..3f35bcd
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_02_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_02_mtrl.png
new file mode 100644
index 0000000..0ed2094
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_03_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_03_mtrl.png
new file mode 100644
index 0000000..7fa7f01
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_04_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_04_mtrl.png
new file mode 100644
index 0000000..b7e1ea1
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_05_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_05_mtrl.png
new file mode 100644
index 0000000..ff07932
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_06_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_06_mtrl.png
new file mode 100644
index 0000000..4a7b283
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_07_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_07_mtrl.png
new file mode 100644
index 0000000..41c4443
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_08_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_08_mtrl.png
new file mode 100644
index 0000000..461fa46
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_09_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_09_mtrl.png
new file mode 100644
index 0000000..f96d1f0
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_10_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_10_mtrl.png
new file mode 100644
index 0000000..87a9b49
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_11_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_11_mtrl.png
new file mode 100644
index 0000000..96b5366
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_12_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_12_mtrl.png
new file mode 100644
index 0000000..532a86d
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_13_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_13_mtrl.png
new file mode 100644
index 0000000..9f37eb2
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_14_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_14_mtrl.png
new file mode 100644
index 0000000..2437e0e
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_15_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_15_mtrl.png
new file mode 100644
index 0000000..79bc6ce
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_16_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_16_mtrl.png
new file mode 100644
index 0000000..9dbbe2f
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_17_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_17_mtrl.png
new file mode 100644
index 0000000..1da48b8
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_18_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_18_mtrl.png
new file mode 100644
index 0000000..8963582
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_19_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_19_mtrl.png
new file mode 100644
index 0000000..ec4be83
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_20_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_20_mtrl.png
new file mode 100644
index 0000000..4658fc3
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_21_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_21_mtrl.png
new file mode 100644
index 0000000..3ecd6bd
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_22_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_22_mtrl.png
new file mode 100644
index 0000000..565e8de
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_23_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_23_mtrl.png
new file mode 100644
index 0000000..9c5c607
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_24_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_24_mtrl.png
new file mode 100644
index 0000000..87b84a7
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_25_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_25_mtrl.png
new file mode 100644
index 0000000..9e12e5b
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_26_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_26_mtrl.png
new file mode 100644
index 0000000..85e8791
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_27_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_27_mtrl.png
new file mode 100644
index 0000000..a7bd75d
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_28_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_28_mtrl.png
new file mode 100644
index 0000000..204f393
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_29_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_29_mtrl.png
new file mode 100644
index 0000000..78f787a
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_30_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_30_mtrl.png
new file mode 100644
index 0000000..a2e61c2
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_00_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_00_mtrl.png
new file mode 100644
index 0000000..80d5155
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_01_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_01_mtrl.png
new file mode 100644
index 0000000..8ec05ae
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_02_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_02_mtrl.png
new file mode 100644
index 0000000..42cd13c
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_03_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_03_mtrl.png
new file mode 100644
index 0000000..f43727f
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_04_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_04_mtrl.png
new file mode 100644
index 0000000..e61a05c
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_05_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_05_mtrl.png
new file mode 100644
index 0000000..8dc5976
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_06_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_06_mtrl.png
new file mode 100644
index 0000000..ead968e
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_07_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_07_mtrl.png
new file mode 100644
index 0000000..52aa7d5
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_08_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_08_mtrl.png
new file mode 100644
index 0000000..58986d4
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_09_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_09_mtrl.png
new file mode 100644
index 0000000..42d6c7c
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_10_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_10_mtrl.png
new file mode 100644
index 0000000..e7e0e60
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_11_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_11_mtrl.png
new file mode 100644
index 0000000..75bd261
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_12_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_12_mtrl.png
new file mode 100644
index 0000000..5207dac
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_13_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_13_mtrl.png
new file mode 100644
index 0000000..c2f69e7
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_14_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_14_mtrl.png
new file mode 100644
index 0000000..167f882
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_15_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_15_mtrl.png
new file mode 100644
index 0000000..d6a85f2
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_16_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_16_mtrl.png
new file mode 100644
index 0000000..cb0390d
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_17_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_17_mtrl.png
new file mode 100644
index 0000000..6a65d15
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_18_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_18_mtrl.png
new file mode 100644
index 0000000..8086a55
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_19_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_19_mtrl.png
new file mode 100644
index 0000000..eee4115
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_20_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_20_mtrl.png
new file mode 100644
index 0000000..d214ad1
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_21_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_21_mtrl.png
new file mode 100644
index 0000000..ac56ac4
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_22_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_22_mtrl.png
new file mode 100644
index 0000000..49af14e
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_23_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_23_mtrl.png
new file mode 100644
index 0000000..5003095b
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_24_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_24_mtrl.png
new file mode 100644
index 0000000..62054a0
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_25_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_25_mtrl.png
new file mode 100644
index 0000000..4c83dd4
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_26_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_26_mtrl.png
new file mode 100644
index 0000000..a55f8e4
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_27_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_27_mtrl.png
new file mode 100644
index 0000000..81567b7
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_28_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_28_mtrl.png
new file mode 100644
index 0000000..4047475
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_29_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_29_mtrl.png
new file mode 100644
index 0000000..23db45a
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_30_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_30_mtrl.png
new file mode 100644
index 0000000..e7d9961
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_00_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_00_mtrl.png
new file mode 100644
index 0000000..97949c6
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_01_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_01_mtrl.png
new file mode 100644
index 0000000..3f35bcd
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_02_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_02_mtrl.png
new file mode 100644
index 0000000..0ed2094
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_03_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_03_mtrl.png
new file mode 100644
index 0000000..7fa7f01
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_04_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_04_mtrl.png
new file mode 100644
index 0000000..b7e1ea1
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_05_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_05_mtrl.png
new file mode 100644
index 0000000..ff07932
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_06_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_06_mtrl.png
new file mode 100644
index 0000000..4a7b283
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_07_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_07_mtrl.png
new file mode 100644
index 0000000..41c4443
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_08_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_08_mtrl.png
new file mode 100644
index 0000000..461fa46
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_09_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_09_mtrl.png
new file mode 100644
index 0000000..f96d1f0
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_10_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_10_mtrl.png
new file mode 100644
index 0000000..87a9b49
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_11_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_11_mtrl.png
new file mode 100644
index 0000000..685a340
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_12_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_12_mtrl.png
new file mode 100644
index 0000000..b49c30e
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_13_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_13_mtrl.png
new file mode 100644
index 0000000..aa92d9e
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_14_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_14_mtrl.png
new file mode 100644
index 0000000..73d487c
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_15_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_15_mtrl.png
new file mode 100644
index 0000000..f427d0c
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_16_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_16_mtrl.png
new file mode 100644
index 0000000..8fbaa08
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_17_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_17_mtrl.png
new file mode 100644
index 0000000..1f0fcd6
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_18_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_18_mtrl.png
new file mode 100644
index 0000000..80c905a
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_19_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_19_mtrl.png
new file mode 100644
index 0000000..9b27fa3
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_20_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_20_mtrl.png
new file mode 100644
index 0000000..24f2b75
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_21_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_21_mtrl.png
new file mode 100644
index 0000000..f499d0a
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_22_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_22_mtrl.png
new file mode 100644
index 0000000..e22ca9b
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_23_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_23_mtrl.png
new file mode 100644
index 0000000..596ca8b
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_24_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_24_mtrl.png
new file mode 100644
index 0000000..363a4d6
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_25_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_25_mtrl.png
new file mode 100644
index 0000000..10e275b
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_26_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_26_mtrl.png
new file mode 100644
index 0000000..aa87c9e
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_27_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_27_mtrl.png
new file mode 100644
index 0000000..77a2b8f
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_28_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_28_mtrl.png
new file mode 100644
index 0000000..f6108d9
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_29_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_29_mtrl.png
new file mode 100644
index 0000000..e3a6a20
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_30_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_30_mtrl.png
new file mode 100644
index 0000000..fa6dc9a
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_00_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_00_mtrl.png
new file mode 100644
index 0000000..80d5155
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_01_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_01_mtrl.png
new file mode 100644
index 0000000..8ec05ae
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_02_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_02_mtrl.png
new file mode 100644
index 0000000..42cd13c
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_03_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_03_mtrl.png
new file mode 100644
index 0000000..f43727f
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_04_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_04_mtrl.png
new file mode 100644
index 0000000..849638b
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_05_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_05_mtrl.png
new file mode 100644
index 0000000..06e21b0
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_06_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_06_mtrl.png
new file mode 100644
index 0000000..ead968e
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_07_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_07_mtrl.png
new file mode 100644
index 0000000..52aa7d5
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_08_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_08_mtrl.png
new file mode 100644
index 0000000..58986d4
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_09_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_09_mtrl.png
new file mode 100644
index 0000000..42d6c7c
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_10_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_10_mtrl.png
new file mode 100644
index 0000000..e7e0e60
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_11_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_11_mtrl.png
new file mode 100644
index 0000000..933be30
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_12_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_12_mtrl.png
new file mode 100644
index 0000000..b39230f
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_13_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_13_mtrl.png
new file mode 100644
index 0000000..01492c4
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_14_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_14_mtrl.png
new file mode 100644
index 0000000..b56aa16
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_15_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_15_mtrl.png
new file mode 100644
index 0000000..bdd3d2c
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_16_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_16_mtrl.png
new file mode 100644
index 0000000..b76d5d7
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_17_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_17_mtrl.png
new file mode 100644
index 0000000..5fb12e7
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_18_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_18_mtrl.png
new file mode 100644
index 0000000..64fe3c5
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_19_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_19_mtrl.png
new file mode 100644
index 0000000..68fd051
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_20_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_20_mtrl.png
new file mode 100644
index 0000000..a4fd4cc
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_21_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_21_mtrl.png
new file mode 100644
index 0000000..40b02f0
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_22_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_22_mtrl.png
new file mode 100644
index 0000000..fcd6ddb
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_23_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_23_mtrl.png
new file mode 100644
index 0000000..cb250dd
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_24_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_24_mtrl.png
new file mode 100644
index 0000000..43d2119
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_25_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_25_mtrl.png
new file mode 100644
index 0000000..bdcaf69
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_26_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_26_mtrl.png
new file mode 100644
index 0000000..3d2bff4
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_27_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_27_mtrl.png
new file mode 100644
index 0000000..290e7d9
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_28_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_28_mtrl.png
new file mode 100644
index 0000000..6c670fb
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_29_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_29_mtrl.png
new file mode 100644
index 0000000..e93c824
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_30_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_30_mtrl.png
new file mode 100644
index 0000000..80d5155
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_off_dark_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_off_dark_mtrl.png
new file mode 100644
index 0000000..9acbd29
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_off_dark_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_off_light_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_off_light_mtrl.png
new file mode 100644
index 0000000..5d4273d
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_off_light_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_off_mtrl_alpha.png b/core/res/res/drawable-xxhdpi/ic_media_route_off_mtrl_alpha.png
deleted file mode 100644
index 44d98d5..0000000
--- a/core/res/res/drawable-xxhdpi/ic_media_route_off_mtrl_alpha.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_on_0_mtrl_alpha.png b/core/res/res/drawable-xxhdpi/ic_media_route_on_0_mtrl_alpha.png
deleted file mode 100644
index c807b50..0000000
--- a/core/res/res/drawable-xxhdpi/ic_media_route_on_0_mtrl_alpha.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_on_1_mtrl_alpha.png b/core/res/res/drawable-xxhdpi/ic_media_route_on_1_mtrl_alpha.png
deleted file mode 100644
index d54f44a..0000000
--- a/core/res/res/drawable-xxhdpi/ic_media_route_on_1_mtrl_alpha.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_on_2_mtrl_alpha.png b/core/res/res/drawable-xxhdpi/ic_media_route_on_2_mtrl_alpha.png
deleted file mode 100644
index 17c1d99..0000000
--- a/core/res/res/drawable-xxhdpi/ic_media_route_on_2_mtrl_alpha.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_on_mtrl_alpha.png b/core/res/res/drawable-xxhdpi/ic_media_route_on_mtrl_alpha.png
deleted file mode 100644
index 906401e..0000000
--- a/core/res/res/drawable-xxhdpi/ic_media_route_on_mtrl_alpha.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_00_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_00_mtrl.png
new file mode 100644
index 0000000..5561c62
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_01_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_01_mtrl.png
new file mode 100644
index 0000000..9eff17e
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_02_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_02_mtrl.png
new file mode 100644
index 0000000..67923e2
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_03_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_03_mtrl.png
new file mode 100644
index 0000000..1aa0e98
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_04_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_04_mtrl.png
new file mode 100644
index 0000000..7cd549d
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_05_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_05_mtrl.png
new file mode 100644
index 0000000..2c14d79
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_06_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_06_mtrl.png
new file mode 100644
index 0000000..9f061a5
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_07_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_07_mtrl.png
new file mode 100644
index 0000000..fe15230
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_08_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_08_mtrl.png
new file mode 100644
index 0000000..220a4fe
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_09_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_09_mtrl.png
new file mode 100644
index 0000000..77aac4c
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_10_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_10_mtrl.png
new file mode 100644
index 0000000..bf69188
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_11_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_11_mtrl.png
new file mode 100644
index 0000000..22197da
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_12_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_12_mtrl.png
new file mode 100644
index 0000000..380e929
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_13_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_13_mtrl.png
new file mode 100644
index 0000000..d93a600
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_14_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_14_mtrl.png
new file mode 100644
index 0000000..3709d5f
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_15_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_15_mtrl.png
new file mode 100644
index 0000000..2a5019b
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_16_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_16_mtrl.png
new file mode 100644
index 0000000..f75a072
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_17_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_17_mtrl.png
new file mode 100644
index 0000000..c8dcd0d
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_18_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_18_mtrl.png
new file mode 100644
index 0000000..172775e
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_19_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_19_mtrl.png
new file mode 100644
index 0000000..2f081fd
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_20_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_20_mtrl.png
new file mode 100644
index 0000000..cb4c55b
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_21_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_21_mtrl.png
new file mode 100644
index 0000000..de155f6
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_22_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_22_mtrl.png
new file mode 100644
index 0000000..2cc028d
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_23_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_23_mtrl.png
new file mode 100644
index 0000000..e848d08
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_24_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_24_mtrl.png
new file mode 100644
index 0000000..584c2f8
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_25_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_25_mtrl.png
new file mode 100644
index 0000000..c9299be
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_26_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_26_mtrl.png
new file mode 100644
index 0000000..8abcbd6
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_27_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_27_mtrl.png
new file mode 100644
index 0000000..ee53e47
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_28_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_28_mtrl.png
new file mode 100644
index 0000000..b10d23a
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_29_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_29_mtrl.png
new file mode 100644
index 0000000..65a2363
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_30_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_30_mtrl.png
new file mode 100644
index 0000000..2b73472
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_00_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_00_mtrl.png
new file mode 100644
index 0000000..6a656b8
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_01_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_01_mtrl.png
new file mode 100644
index 0000000..7d3a3b6
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_02_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_02_mtrl.png
new file mode 100644
index 0000000..6b22554
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_03_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_03_mtrl.png
new file mode 100644
index 0000000..0a9245c
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_04_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_04_mtrl.png
new file mode 100644
index 0000000..f9a7f6c
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_05_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_05_mtrl.png
new file mode 100644
index 0000000..ac396ed
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_06_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_06_mtrl.png
new file mode 100644
index 0000000..8c15241d
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_07_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_07_mtrl.png
new file mode 100644
index 0000000..e6a75e2
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_08_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_08_mtrl.png
new file mode 100644
index 0000000..90280a9
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_09_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_09_mtrl.png
new file mode 100644
index 0000000..d9a4632
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_10_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_10_mtrl.png
new file mode 100644
index 0000000..b1ae68b
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_11_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_11_mtrl.png
new file mode 100644
index 0000000..e5cba8f
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_12_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_12_mtrl.png
new file mode 100644
index 0000000..611faeb
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_13_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_13_mtrl.png
new file mode 100644
index 0000000..dfada4d
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_14_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_14_mtrl.png
new file mode 100644
index 0000000..6118202
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_15_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_15_mtrl.png
new file mode 100644
index 0000000..60d5199
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_16_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_16_mtrl.png
new file mode 100644
index 0000000..ee0b672
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_17_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_17_mtrl.png
new file mode 100644
index 0000000..5a97f67
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_18_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_18_mtrl.png
new file mode 100644
index 0000000..9237a7d
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_19_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_19_mtrl.png
new file mode 100644
index 0000000..4d4c663
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_20_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_20_mtrl.png
new file mode 100644
index 0000000..141f9f6
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_21_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_21_mtrl.png
new file mode 100644
index 0000000..2baa531
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_22_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_22_mtrl.png
new file mode 100644
index 0000000..7a911d5
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_23_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_23_mtrl.png
new file mode 100644
index 0000000..a760b85
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_24_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_24_mtrl.png
new file mode 100644
index 0000000..5c15a87
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_25_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_25_mtrl.png
new file mode 100644
index 0000000..36a9f1f
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_26_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_26_mtrl.png
new file mode 100644
index 0000000..03e8c9f
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_27_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_27_mtrl.png
new file mode 100644
index 0000000..533c694
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_28_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_28_mtrl.png
new file mode 100644
index 0000000..ead60f5
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_29_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_29_mtrl.png
new file mode 100644
index 0000000..0a8534f
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_30_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_30_mtrl.png
new file mode 100644
index 0000000..fa69ad0
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_00_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_00_mtrl.png
new file mode 100644
index 0000000..5561c62
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_01_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_01_mtrl.png
new file mode 100644
index 0000000..9eff17e
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_02_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_02_mtrl.png
new file mode 100644
index 0000000..67923e2
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_03_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_03_mtrl.png
new file mode 100644
index 0000000..1aa0e98
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_04_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_04_mtrl.png
new file mode 100644
index 0000000..7cd549d
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_05_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_05_mtrl.png
new file mode 100644
index 0000000..2c14d79
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_06_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_06_mtrl.png
new file mode 100644
index 0000000..9f061a5
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_07_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_07_mtrl.png
new file mode 100644
index 0000000..fe15230
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_08_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_08_mtrl.png
new file mode 100644
index 0000000..220a4fe
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_09_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_09_mtrl.png
new file mode 100644
index 0000000..77aac4c
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_10_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_10_mtrl.png
new file mode 100644
index 0000000..bf69188
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_11_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_11_mtrl.png
new file mode 100644
index 0000000..98b0448
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_12_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_12_mtrl.png
new file mode 100644
index 0000000..a926419
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_13_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_13_mtrl.png
new file mode 100644
index 0000000..53f6e3e
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_14_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_14_mtrl.png
new file mode 100644
index 0000000..4a2d1b1
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_15_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_15_mtrl.png
new file mode 100644
index 0000000..22cce05
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_16_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_16_mtrl.png
new file mode 100644
index 0000000..d40db21
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_17_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_17_mtrl.png
new file mode 100644
index 0000000..0a95b7e
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_18_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_18_mtrl.png
new file mode 100644
index 0000000..08698bd
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_19_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_19_mtrl.png
new file mode 100644
index 0000000..698d23a
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_20_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_20_mtrl.png
new file mode 100644
index 0000000..36ed854
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_21_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_21_mtrl.png
new file mode 100644
index 0000000..2c0d925
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_22_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_22_mtrl.png
new file mode 100644
index 0000000..747b901
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_23_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_23_mtrl.png
new file mode 100644
index 0000000..bae8665
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_24_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_24_mtrl.png
new file mode 100644
index 0000000..fd7b1a8
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_25_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_25_mtrl.png
new file mode 100644
index 0000000..03f624e
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_26_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_26_mtrl.png
new file mode 100644
index 0000000..d2a06ed
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_27_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_27_mtrl.png
new file mode 100644
index 0000000..c5b2a16
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_28_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_28_mtrl.png
new file mode 100644
index 0000000..8b045cb
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_29_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_29_mtrl.png
new file mode 100644
index 0000000..522ec67
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_30_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_30_mtrl.png
new file mode 100644
index 0000000..5561c62
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_00_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_00_mtrl.png
new file mode 100644
index 0000000..6a656b8
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_01_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_01_mtrl.png
new file mode 100644
index 0000000..7d3a3b6
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_02_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_02_mtrl.png
new file mode 100644
index 0000000..6b22554
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_03_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_03_mtrl.png
new file mode 100644
index 0000000..0a9245c
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_04_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_04_mtrl.png
new file mode 100644
index 0000000..f9a7f6c
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_05_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_05_mtrl.png
new file mode 100644
index 0000000..ac396ed
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_06_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_06_mtrl.png
new file mode 100644
index 0000000..8c15241d
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_07_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_07_mtrl.png
new file mode 100644
index 0000000..e6a75e2
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_08_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_08_mtrl.png
new file mode 100644
index 0000000..90280a9
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_09_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_09_mtrl.png
new file mode 100644
index 0000000..d9a4632
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_10_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_10_mtrl.png
new file mode 100644
index 0000000..b1ae68b
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_11_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_11_mtrl.png
new file mode 100644
index 0000000..e3ce3fd
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_12_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_12_mtrl.png
new file mode 100644
index 0000000..42482a4
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_13_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_13_mtrl.png
new file mode 100644
index 0000000..ff30f98
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_14_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_14_mtrl.png
new file mode 100644
index 0000000..0ddcb55
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_15_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_15_mtrl.png
new file mode 100644
index 0000000..46ec435
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_16_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_16_mtrl.png
new file mode 100644
index 0000000..d95fd77
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_17_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_17_mtrl.png
new file mode 100644
index 0000000..f116a1f
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_18_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_18_mtrl.png
new file mode 100644
index 0000000..957db7f
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_19_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_19_mtrl.png
new file mode 100644
index 0000000..624ec47
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_20_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_20_mtrl.png
new file mode 100644
index 0000000..362fba4
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_21_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_21_mtrl.png
new file mode 100644
index 0000000..24032b9
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_22_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_22_mtrl.png
new file mode 100644
index 0000000..6e4c83c
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_23_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_23_mtrl.png
new file mode 100644
index 0000000..1d2a09e
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_24_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_24_mtrl.png
new file mode 100644
index 0000000..7b05dfa
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_25_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_25_mtrl.png
new file mode 100644
index 0000000..30de74a1
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_26_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_26_mtrl.png
new file mode 100644
index 0000000..b08b782
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_27_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_27_mtrl.png
new file mode 100644
index 0000000..e52a1aa
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_28_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_28_mtrl.png
new file mode 100644
index 0000000..2c311f5
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_29_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_29_mtrl.png
new file mode 100644
index 0000000..efdf5fc
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_30_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_30_mtrl.png
new file mode 100644
index 0000000..6a656b8
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable/ic_media_route_connected_dark_material.xml b/core/res/res/drawable/ic_media_route_connected_dark_material.xml
new file mode 100644
index 0000000..efde152
--- /dev/null
+++ b/core/res/res/drawable/ic_media_route_connected_dark_material.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2017 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.
+-->
+
+<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true">
+ <item android:drawable="@drawable/ic_media_route_connected_dark_00_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_dark_01_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_dark_02_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_dark_03_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_dark_04_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_dark_05_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_dark_06_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_dark_07_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_dark_08_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_dark_09_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_dark_10_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_dark_11_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_dark_12_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_dark_13_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_dark_14_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_dark_15_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_dark_16_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_dark_17_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_dark_18_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_dark_19_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_dark_20_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_dark_21_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_dark_22_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_dark_23_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_dark_24_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_dark_25_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_dark_26_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_dark_27_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_dark_28_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_dark_29_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_dark_30_mtrl"
+ android:duration="42" />
+</animation-list>
diff --git a/core/res/res/drawable/ic_media_route_connected_light_material.xml b/core/res/res/drawable/ic_media_route_connected_light_material.xml
new file mode 100644
index 0000000..466a43a
--- /dev/null
+++ b/core/res/res/drawable/ic_media_route_connected_light_material.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2017 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.
+-->
+
+<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true">
+ <item android:drawable="@drawable/ic_media_route_connected_light_00_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_light_01_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_light_02_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_light_03_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_light_04_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_light_05_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_light_06_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_light_07_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_light_08_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_light_09_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_light_10_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_light_11_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_light_12_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_light_13_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_light_14_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_light_15_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_light_16_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_light_17_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_light_18_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_light_19_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_light_20_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_light_21_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_light_22_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_light_23_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_light_24_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_light_25_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_light_26_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_light_27_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_light_28_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_light_29_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connected_light_30_mtrl"
+ android:duration="42" />
+</animation-list>
diff --git a/core/res/res/drawable/ic_media_route_connecting_dark_material.xml b/core/res/res/drawable/ic_media_route_connecting_dark_material.xml
new file mode 100644
index 0000000..1c4bae5
--- /dev/null
+++ b/core/res/res/drawable/ic_media_route_connecting_dark_material.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2014 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.
+-->
+
+<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false">
+ <item android:drawable="@drawable/ic_media_route_connecting_dark_00_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_dark_01_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_dark_02_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_dark_03_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_dark_04_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_dark_05_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_dark_06_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_dark_07_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_dark_08_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_dark_09_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_dark_10_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_dark_11_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_dark_12_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_dark_13_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_dark_14_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_dark_15_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_dark_16_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_dark_17_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_dark_18_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_dark_19_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_dark_20_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_dark_21_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_dark_22_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_dark_23_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_dark_24_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_dark_25_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_dark_26_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_dark_27_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_dark_28_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_dark_29_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_dark_30_mtrl"
+ android:duration="42" />
+</animation-list>
diff --git a/core/res/res/drawable/ic_media_route_connecting_light_material.xml b/core/res/res/drawable/ic_media_route_connecting_light_material.xml
new file mode 100644
index 0000000..4b7e807
--- /dev/null
+++ b/core/res/res/drawable/ic_media_route_connecting_light_material.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2017 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.
+-->
+
+<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false">
+ <item android:drawable="@drawable/ic_media_route_connecting_light_00_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_light_01_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_light_02_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_light_03_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_light_04_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_light_05_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_light_06_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_light_07_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_light_08_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_light_09_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_light_10_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_light_11_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_light_12_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_light_13_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_light_14_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_light_15_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_light_16_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_light_17_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_light_18_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_light_19_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_light_20_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_light_21_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_light_22_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_light_23_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_light_24_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_light_25_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_light_26_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_light_27_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_light_28_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_light_29_mtrl"
+ android:duration="42" />
+ <item android:drawable="@drawable/ic_media_route_connecting_light_30_mtrl"
+ android:duration="42" />
+</animation-list>
diff --git a/core/res/res/drawable/ic_media_route_connecting_material.xml b/core/res/res/drawable/ic_media_route_connecting_material.xml
deleted file mode 100644
index 51decd3..0000000
--- a/core/res/res/drawable/ic_media_route_connecting_material.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2014 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.
--->
-
-<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
- android:oneshot="false">
- <item android:duration="500">
- <bitmap android:src="@drawable/ic_media_route_on_0_mtrl_alpha"
- android:tint="?attr/colorControlNormal" />
- </item>
- <item android:duration="500">
- <bitmap android:src="@drawable/ic_media_route_on_1_mtrl_alpha"
- android:tint="?attr/colorControlNormal" />
- </item>
- <item android:duration="500">
- <bitmap android:src="@drawable/ic_media_route_on_2_mtrl_alpha"
- android:tint="?attr/colorControlNormal" />
- </item>
- <item android:duration="500">
- <bitmap android:src="@drawable/ic_media_route_on_1_mtrl_alpha"
- android:tint="?attr/colorControlNormal" />
- </item>
-</animation-list>
diff --git a/core/res/res/drawable/ic_media_route_dark_material.xml b/core/res/res/drawable/ic_media_route_dark_material.xml
new file mode 100644
index 0000000..2a60f58
--- /dev/null
+++ b/core/res/res/drawable/ic_media_route_dark_material.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_checked="true" android:state_enabled="true"
+ android:drawable="@android:drawable/ic_media_route_connecting_dark_material" />
+ <item android:state_activated="true" android:state_enabled="true"
+ android:drawable="@android:drawable/ic_media_route_connected_dark_material" />
+ <item android:state_enabled="true">
+ <bitmap android:src="@android:drawable/ic_media_route_off_dark_mtrl"/>
+ </item>
+ <item>
+ <bitmap android:src="@android:drawable/ic_media_route_off_dark_mtrl"
+ android:alpha="0.5" />
+ </item>
+</selector>
diff --git a/core/res/res/drawable/ic_media_route_light_material.xml b/core/res/res/drawable/ic_media_route_light_material.xml
new file mode 100644
index 0000000..f35187e
--- /dev/null
+++ b/core/res/res/drawable/ic_media_route_light_material.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_checked="true" android:state_enabled="true"
+ android:drawable="@android:drawable/ic_media_route_connecting_light_material" />
+ <item android:state_activated="true" android:state_enabled="true"
+ android:drawable="@android:drawable/ic_media_route_connected_light_material" />
+ <item android:state_enabled="true">
+ <bitmap android:src="@android:drawable/ic_media_route_off_light_mtrl"/>
+ </item>
+ <item>
+ <bitmap android:src="@android:drawable/ic_media_route_off_light_mtrl"
+ android:alpha="0.62" />
+ </item>
+</selector>
\ No newline at end of file
diff --git a/core/res/res/drawable/ic_media_route_material.xml b/core/res/res/drawable/ic_media_route_material.xml
deleted file mode 100644
index 3e3f388..0000000
--- a/core/res/res/drawable/ic_media_route_material.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2014 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_checked="true" android:state_enabled="true"
- android:drawable="@android:drawable/ic_media_route_connecting_material" />
- <item android:state_activated="true" android:state_enabled="true">
- <bitmap android:src="@android:drawable/ic_media_route_on_mtrl_alpha"
- android:tint="?attr/colorControlNormal" />
- </item>
- <item android:state_enabled="true">
- <bitmap android:src="@android:drawable/ic_media_route_off_mtrl_alpha"
- android:tint="?attr/colorControlNormal" />
- </item>
- <item>
- <bitmap android:src="@android:drawable/ic_media_route_disabled_mtrl_alpha"
- android:tint="?attr/colorControlNormal" />
- </item>
-</selector>
diff --git a/core/res/res/drawable/scrollbar_handle_material.xml b/core/res/res/drawable/scrollbar_handle_material.xml
index 33efbba..f020112 100644
--- a/core/res/res/drawable/scrollbar_handle_material.xml
+++ b/core/res/res/drawable/scrollbar_handle_material.xml
@@ -19,7 +19,4 @@
android:shape="rectangle">
<solid
android:color="#84ffffff" />
- <size
- android:width="4dp"
- android:height="4dp" />
</shape>
diff --git a/core/res/res/layout-land/time_picker_material.xml b/core/res/res/layout-land/time_picker_material.xml
index d83ccb2..f3d4a84 100644
--- a/core/res/res/layout-land/time_picker_material.xml
+++ b/core/res/res/layout-land/time_picker_material.xml
@@ -17,7 +17,6 @@
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
- android:layoutDirection="ltr"
android:layout_width="match_parent"
android:layout_height="wrap_content">
@@ -34,6 +33,8 @@
android:layoutDirection="ltr"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:layout_centerHorizontal="true"
+ android:layout_centerVertical="true"
android:paddingTop="@dimen/timepicker_radial_picker_top_margin"
android:orientation="horizontal">
diff --git a/core/res/res/layout/autofill_save.xml b/core/res/res/layout/autofill_save.xml
index 90b74ac..77fa62a 100644
--- a/core/res/res/layout/autofill_save.xml
+++ b/core/res/res/layout/autofill_save.xml
@@ -16,100 +16,92 @@
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/autofill_save"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
+ android:layout_marginTop="32dp"
+ android:paddingTop="16dp"
+ android:elevation="32dp"
+ android:background="?android:attr/colorBackground"
android:orientation="vertical">
<LinearLayout
- android:id="@+id/autofill_save"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
- android:layout_marginTop="32dp"
- android:paddingTop="16dp"
- android:elevation="32dp"
- android:background="?android:attr/colorBackground"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp"
android:orientation="vertical">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
- android:paddingLeft="16dp"
- android:paddingRight="16dp"
- android:orientation="vertical">
-
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal">
-
- <TextView
- android:id="@+id/autofill_save_title"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:text="@string/autofill_save_title"
- android:textSize="16sp"
- android:textColor="?android:attr/textColorPrimary"
- android:layout_weight="1">
- </TextView>
-
- <ImageView
- android:id="@+id/autofill_save_close"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="16dp"
- android:src="@android:drawable/ic_close"
- android:alpha="0.54"
- android:background="?android:attr/selectableItemBackgroundBorderless"
- android:contentDescription="@android:string/close_button_text">
- </ImageView>
-
- </LinearLayout>
+ android:orientation="horizontal">
<TextView
- android:id="@+id/autofill_save_subtitle"
- android:layout_width="fill_parent"
+ android:id="@+id/autofill_save_title"
+ android:layout_width="0dp"
android:layout_height="wrap_content"
- android:layout_marginTop="4dp"
- android:visibility="gone">
+ android:text="@string/autofill_save_title"
+ android:textSize="16sp"
+ android:textColor="?android:attr/textColorPrimary"
+ android:layout_weight="1">
</TextView>
+ <ImageView
+ android:id="@+id/autofill_save_close"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="16dp"
+ android:src="@android:drawable/ic_close"
+ android:alpha="0.54"
+ android:background="?android:attr/selectableItemBackgroundBorderless"
+ android:contentDescription="@android:string/close_button_text">
+ </ImageView>
+
</LinearLayout>
- <com.android.internal.widget.ButtonBarLayout
- android:layout_width="wrap_content"
+ <com.android.server.autofill.ui.CustomScrollView
+ android:id="@+id/autofill_save_custom_subtitle"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_gravity="end"
- android:padding="16dp"
- android:clipToPadding="false"
- android:layout_weight="1"
- android:orientation="horizontal">
-
- <Space
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:layout_weight="1"
- android:visibility="invisible">
- </Space>
-
- <Button
- android:id="@+id/autofill_save_no"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- style="?android:attr/buttonBarButtonStyle"
- android:text="@string/autofill_save_no">
- </Button>
-
- <Button
- android:id="@+id/autofill_save_yes"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- style="@style/Widget.Material.Button.Colored"
- android:text="@string/autofill_save_yes">
- <requestFocus />
- </Button>
-
- </com.android.internal.widget.ButtonBarLayout>
+ android:layout_marginTop="4dp"
+ android:visibility="gone"/>
</LinearLayout>
+ <com.android.internal.widget.ButtonBarLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="end"
+ android:padding="16dp"
+ android:clipToPadding="false"
+ android:layout_weight="1"
+ android:orientation="horizontal">
+
+ <Space
+ android:layout_width="0dp"
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ android:visibility="invisible">
+ </Space>
+
+ <Button
+ android:id="@+id/autofill_save_no"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ style="?android:attr/buttonBarButtonStyle"
+ android:text="@string/autofill_save_no">
+ </Button>
+
+ <Button
+ android:id="@+id/autofill_save_yes"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ style="@style/Widget.Material.Button.Colored"
+ android:text="@string/autofill_save_yes">
+ <requestFocus />
+ </Button>
+
+ </com.android.internal.widget.ButtonBarLayout>
+
</LinearLayout>
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 291ccde..39d6bfd 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"KB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dae"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> uur"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> uur"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> uur"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> u. <xliff:g id="MINUTES">%2$d</xliff:g> min."</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> u. <xliff:g id="MINUTES">%2$d</xliff:g> min."</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> minute"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min."</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min. <xliff:g id="SECONDS">%2$d</xliff:g> s."</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min. <xliff:g id="SECONDS">%2$d</xliff:g> s."</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sekondes"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sekonde"</string>
<string name="untitled" msgid="4638956954852782576">"<Titelloos>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Geen foonnommer)"</string>
<string name="unknownName" msgid="6867811765370350269">"Onbekend"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Geen stem- of nooddiens nie"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Word tydelik nie deur die selnetwerk by jou ligging aangebied nie"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Kan netwerk nie bereik nie"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Om die opvangs te verbeter, probeer die tipe verander wat gekies is by Stelsel > Netwerk en internet > Mobiele netwerke > Voorkeurnetwerktipe."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Om opvangs te verbeter, probeer die soort verander wat by Instellings > Netwerk en internet > Mobiele netwerke > Voorkeurnetwerksoort gekies is."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Opletberigte"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Oproepaanstuur"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Noodterugbel-modus"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM is nie opgestel nie"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM word nie toegelaat nie"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Foon word nie toegelaat nie"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Opspringvenster"</string>
</resources>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 6f2db2c..c3e054e 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"ኪባ"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ቀኖች"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ቀን <xliff:g id="HOURS">%2$d</xliff:g> ሰዓ"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ቀን <xliff:g id="HOURS">%2$d</xliff:g> ሰዓ"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ሰዓ"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ሰዓ <xliff:g id="MINUTES">%2$d</xliff:g> ደቂቃ"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ሰዓ <xliff:g id="MINUTES">%2$d</xliff:g> ደቂቃ"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> ደቂቃዎች"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> ደቂቃዎች"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> ደቂቃ <xliff:g id="SECONDS">%2$d</xliff:g> ሴ"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> ደቂቃ <xliff:g id="SECONDS">%2$d</xliff:g> ሴ"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> ሴ"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> ሴ"</string>
<string name="untitled" msgid="4638956954852782576">"<ርዕስ አልባ>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(ምንም ስልክ ቁጥር የለም)"</string>
<string name="unknownName" msgid="6867811765370350269">"አይታወቅም"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"ምንም የድምፅ እና የድንገተኛ አደጋ ጥሪ አገልግሎት የለም"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"ለጊዜው በአካባቢዎ ባለው የተንቀሳቃሽ ስልክ አውታረ መረብ አይቀርብም"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"አውታረ መረብ ላይ መድረስ አይቻልም"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"ቅበላን ለማሻሻል የተመረጠውን ዓይነት በሥርዓት > አውታረ መረቦች እና በይነመረብ > የተንቀሳቃሽ ስልክ አውታረ መረቦች > ተመራጭ የአውታረ መረብ ዓይነት ላይ ለመለወጥ ይሞክሩ።"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"ቅበላን ለማሻሻል የተመረጠውን ዓይነት በቅንብሮች > አውታረ መረብ እና በይነመረብ > የተንቀሳቃሽ ስልክ አውታረ መረቦች > ተመራጭ የአውታረ መረብ ዓይነት ላይ ለመለወጥ ይሞክሩ።"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"ማንቂያዎች"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"ጥሪ ማስተላለፍ"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"የአደጋ ጊዜ ጥሪ ሁነታ"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"ሲም አልቀረበም"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"ሲም አይፈቀድም"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"ስልክ አይፈቀድም"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"ብቅ-ባይ መስኮት"</string>
</resources>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index d1e3a54..0363078 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"بايت"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"كيلوبايت"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"ميغابايت"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"غيغابايت"</string>
- <string name="terabyteShort" msgid="231613018159186962">"تيرابايت"</string>
<string name="petabyteShort" msgid="5637816680144990219">"بيتابايت"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> يوم"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> يوم <xliff:g id="HOURS">%2$d</xliff:g> ساعة"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> يوم <xliff:g id="HOURS">%2$d</xliff:g> ساعة"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ساعة"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ساعة <xliff:g id="MINUTES">%2$d</xliff:g> دقيقة"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ساعة <xliff:g id="MINUTES">%2$d</xliff:g> دقيقة"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> دقيقة"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> دقيقة"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> دقيقة <xliff:g id="SECONDS">%2$d</xliff:g> ثانية"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> دقيقة <xliff:g id="SECONDS">%2$d</xliff:g> ثانية"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> ثانية"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> ثانية"</string>
<string name="untitled" msgid="4638956954852782576">"<بلا عنوان>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(ليس هناك رقم هاتف)"</string>
<string name="unknownName" msgid="6867811765370350269">"غير معروف"</string>
@@ -99,7 +83,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"لا تتوفر خدمة الصوت/الطوارئ"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"مؤقتا لا تقدمها شبكة الجوال في موقعك"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"يتعذر الوصول إلى الشبكة"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"لتحسين الاستقبال، يمكنك تجربة تغيير النوع المحدّد في النظام > الشبكة والإنترنت > شبكات الجوّال > نوع الشبكة المفضّل."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"لتحسين الاستقبال، يمكنك محاولة تغيير النوع المحدّد من خلال الإعدادات > الشبكة والإنترنت > شبكات الجوّال > نوع الشبكة المفضّل."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"التنبيهات"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"إعادة توجيه المكالمة"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"وضع معاودة الاتصال بالطوارئ"</string>
@@ -1917,4 +1901,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"لم يتم تقديم SIM"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"غير مسموح باستخدام SIM"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"غير مسموح باستخدام الهاتف"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"نافذة منبثقة"</string>
</resources>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index 857c628..1ef8e8b 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> gün"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> gan <xliff:g id="HOURS">%2$d</xliff:g> saat"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> gün <xliff:g id="HOURS">%2$d</xliff:g> saat"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> saat"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> saat <xliff:g id="MINUTES">%2$d</xliff:g> dəq"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> saat <xliff:g id="MINUTES">%2$d</xliff:g> dəq"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> dəqiqə"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> dəq"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> dəq <xliff:g id="SECONDS">%2$d</xliff:g> san"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> dəq <xliff:g id="SECONDS">%2$d</xliff:g> san"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> saniyə"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> saniyə"</string>
<string name="untitled" msgid="4638956954852782576">"Başlıqsız"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Telefon nömrəsi yoxdur)"</string>
<string name="unknownName" msgid="6867811765370350269">"Naməlum"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Səsli/təcili xidmət yoxdur"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Müvəqqəti olaraq məkanda mobil şəbəkə tərəfindən təklif edilmir"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Şəbəkəyə daxil olmaq mümkün deyil"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Qəbulu inkişaf etdirmək üçün seçilmiş növü Sistem > Şəbəkə və İnternet > Mobil şəbəkə > Tərcih edilən şəbəkə növü bölməsində dəyişə bilərsiniz."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Qəbulu inkişaf etdirmək üçün seçilmiş növü Ayarlar > Şəbəkə və İnternet > Mobil şəbəkə > Tərcih edilən şəbəkə növü bölməsində dəyişə bilərsiniz."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Siqnallar"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Zəng yönləndirmə"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Təcili geriyə zəng rejimi"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM təmin edilməyib"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM-ə icazə verilmir"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Telefona icazə verilmir"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Popap Pəncərəsi"</string>
</resources>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index 5eafdd8..0b9e8dc 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dana"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dan <xliff:g id="HOURS">%2$d</xliff:g> s"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dan <xliff:g id="HOURS">%2$d</xliff:g> s"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> s"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> s <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> s <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sek"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sek"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sek"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sek"</string>
<string name="untitled" msgid="4638956954852782576">"<Bez naslova>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Nema broja telefona)"</string>
<string name="unknownName" msgid="6867811765370350269">"Nepoznato"</string>
@@ -96,7 +80,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Nema glasovne usluge/usluge za hitne pozive"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Privremeno je onemogućeno na mobilnoj mreži na vašoj lokaciji"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Povezivanje sa mrežom nije uspelo"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Da biste poboljšali prijem, probajte da promenite izabrani tip u odeljku Sistem > Mreža i internet > Mobilne mreže > Željeni tip mreže."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Da biste poboljšali prijem, probajte da promenite izabrani tip u odeljku Podešavanja > Mreža i internet > Mobilne mreže > Željeni tip mreže."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Obaveštenja"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Preusmeravanje poziva"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Režim za hitan povratni poziv"</string>
@@ -1815,4 +1799,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM kartica nije podešena"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM kartica nije dozvoljena"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Telefon nije dozvoljen"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Iskačući prozor"</string>
</resources>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 1ac84b1..beca6e4 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"б"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"КБ"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"Мб"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"ГБ"</string>
- <string name="terabyteShort" msgid="231613018159186962">"Тб"</string>
<string name="petabyteShort" msgid="5637816680144990219">"Пб"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> сут"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> дз. <xliff:g id="HOURS">%2$d</xliff:g> гадз"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> дз. <xliff:g id="HOURS">%2$d</xliff:g> гадз"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> гадз"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> гадз <xliff:g id="MINUTES">%2$d</xliff:g> хв"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> гадз <xliff:g id="MINUTES">%2$d</xliff:g> хв"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> хв"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> хвіліна"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> хв <xliff:g id="SECONDS">%2$d</xliff:g> с"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> хв <xliff:g id="SECONDS">%2$d</xliff:g> с"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> с"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> секунда"</string>
<string name="untitled" msgid="4638956954852782576">"<Без назвы>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Няма нумара тэлефона)"</string>
<string name="unknownName" msgid="6867811765370350269">"Невядома"</string>
@@ -97,7 +81,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Няма сэрвісу галасавых / экстранных выклікаў"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Часова не прапаноўваецца сеткай мабільнай сувязі ў вашым месцазанходжанні"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Немагчыма падключыцца да сеткі"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Каб палепшыць якасць прыёму, паспрабуйце змяніць тып, выбраны ў меню \"Сістэма > Сетка і інтэрнэт > Мабільныя сеткі > Прыярытэтны тып сеткі\"."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Каб палепшыць якасць прыёму, паспрабуйце змяніць тып, выбраны ў меню \"Налады > Сетка і інтэрнэт > Мабільныя сеткі > Прыярытэтны тып сеткі\"."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Абвесткі"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Пераадрасацыя выкліку"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Рэжым экстраннага зваротнага выкліку"</string>
@@ -1849,4 +1833,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM-карты няма"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM-карта не дапускаецца"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Тэлефон не дапускаецца"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Выплыўное акно"</string>
</resources>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 01e1aa5..82a474f 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"Б"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"КБ"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"МБ"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"ГБ"</string>
- <string name="terabyteShort" msgid="231613018159186962">"ТБ"</string>
<string name="petabyteShort" msgid="5637816680144990219">"ПБ"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> дни"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ден <xliff:g id="HOURS">%2$d</xliff:g> ч"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ден <xliff:g id="HOURS">%2$d</xliff:g> ч"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ч"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ч <xliff:g id="MINUTES">%2$d</xliff:g> мин"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ч <xliff:g id="MINUTES">%2$d</xliff:g> мин"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> мин"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> мин"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> мин <xliff:g id="SECONDS">%2$d</xliff:g> сек"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> мин <xliff:g id="SECONDS">%2$d</xliff:g> сек"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> сек"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> сек"</string>
<string name="untitled" msgid="4638956954852782576">"<Без заглавие>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Няма телефонен номер)"</string>
<string name="unknownName" msgid="6867811765370350269">"Неизвестно"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Няма услуга за гласови/спешни обаждания"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Временно не се предлага от мобилната мрежа в местоположението ви"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Не може да се установи връзка с мрежата"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"За да подобрите сигнала, променете избрания тип мрежа от „Система“ > „Мрежа и интернет“ > „Мобилни мрежи“ > „Предпочитан тип мрежа“."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"За да подобрите сигнала, променете избрания тип мрежа от „Настройки“ > „Мрежа и интернет“ > „Мобилни мрежи“ > „Предпочитан тип мрежа“."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Сигнали"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Пренасочване на обаждания"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Режим на обратно обаждане при спешност"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM картата не е обезпечена"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM картата не е разрешена"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Телефонът не е разрешен"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Изскачащ прозорец"</string>
</resources>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index f97b4f0..86f0315 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"বাইট"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> দিন"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> দিন <xliff:g id="HOURS">%2$d</xliff:g> ঘণ্টা"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> দিন <xliff:g id="HOURS">%2$d</xliff:g> ঘণ্টা"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ঘণ্টা"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ঘণ্টা <xliff:g id="MINUTES">%2$d</xliff:g> মিনিট"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ঘণ্টা <xliff:g id="MINUTES">%2$d</xliff:g> মিনিট"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> মিনিট"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> মিনিট"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> মিনিট <xliff:g id="SECONDS">%2$d</xliff:g> সেকেন্ড"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> মিনিট <xliff:g id="SECONDS">%2$d</xliff:g> সেকেন্ড"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> সেকেন্ড"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> সেকেন্ড"</string>
<string name="untitled" msgid="4638956954852782576">"<শিরোনামহীন>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(কোনো ফোন নম্বর নেই)"</string>
<string name="unknownName" msgid="6867811765370350269">"অজানা"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"কোনো ভয়েস/জরুরী পরিষেবা নেই"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"সাময়িকভাবে মোবাইল নেটওয়ার্ক আপনার অবস্থানে এই পরিষেবা দিচ্ছে না"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"নেটওয়ার্কের সিগন্যাল নেই"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"রিসেপশন উন্নত করতে সিস্টেম > নেটওয়ার্ক এবং ইন্টারনেট > মোবাইল নেটওয়ার্ক > পছন্দের নেটওয়ার্কের ধরণ এ গিয়ে নির্বাচিত নেটওয়ার্কের ধরণ পরিবর্তন করে দেখুন।"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"রিসেপশন উন্নত করতে সেটিংস > নেটওয়ার্ক এবং ইন্টারনেট > মোবাইল নেটওয়ার্ক > পছন্দের নেটওয়ার্কের ধরণ এ গিয়ে নির্বাচিত নেটওয়ার্কের ধরণ পরিবর্তন করে দেখুন।"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"সতর্কবার্তা"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"কল ফরওয়ার্ড করা"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"জরুরি কলব্যাক মোড"</string>
@@ -1782,4 +1766,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"সিম প্রস্তুত নয়"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"সিম অনুমোদিত নয়"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"ফোন অনুমোদিত নয়"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"পপ-আপ উইন্ডো"</string>
</resources>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index 66f5e21..4a08928 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dana"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> d i <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> d i <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> sati"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h i <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h i <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min i <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min i <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sek"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sek"</string>
<string name="untitled" msgid="4638956954852782576">"<Bez naslova>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Nema broja telefona)"</string>
<string name="unknownName" msgid="6867811765370350269">"Nepoznato"</string>
@@ -96,7 +80,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Nema govornih/hitnih usluga"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Trenutno nije u ponudi mobilne mreže na vašoj lokaciji"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Nije moguće dosegnuti mrežu"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Za poboljšanje prijema, pokušajte promijeniti vrstu odabranu u meniju Sistem > Mreža i internet > Mobilne mreže > Preferirana vrsta mreže."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Da poboljšate prijem, pokušajte promijeniti odabranu vrstu u meniju Postavke < Mreža i internet < Mobilne mreže < Preferirana vrsta mreže."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Upozorenja"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Preusmjeravanje poziva"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Način rada za hitni povratni poziv"</string>
@@ -1821,4 +1805,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM kartica nije dodijeljena"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM kartica nije dozvoljena"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Telefon nije dozvoljen"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Iskočni prozor"</string>
</resources>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 80b3859..dd2616b 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dies"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dia <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dia <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> hores"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> minuts"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
<string name="untitled" msgid="4638956954852782576">"<Sense títol>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Sense número de telèfon)"</string>
<string name="unknownName" msgid="6867811765370350269">"Desconegut"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Sense servei de veu/emergència"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"La xarxa mòbil de la teva ubicació temporalment no ofereix aquest servei"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"No es pot accedir a la xarxa"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Per millorar la recepció, prova de canviar-ne el tipus a Sistema > Xarxa i Internet > Xarxes mòbils > Tipus de xarxa preferit."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Per millorar la recepció, prova de canviar el tipus de xarxa a Configuració > Xarxa i Internet > Xarxes mòbils > Tipus de xarxa preferit."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertes"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Desviació de trucades"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Mode de devolució de trucada d\'emergència"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM no proporcionada"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM no compatible"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Telèfon no no compatible"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Finestra emergent"</string>
</resources>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 66e660e..4f053b4 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> d"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> d <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> d <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
<string name="untitled" msgid="4638956954852782576">"<Bez názvu>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(žádné telefonní číslo)"</string>
<string name="unknownName" msgid="6867811765370350269">"Není známo"</string>
@@ -97,7 +81,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Hlasová ani tísňová volání nejsou k dispozici"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Mobilní síť ve vaší oblasti tuto službu dočasně nenabízí"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"K síti se nelze připojit"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Chcete-li zlepšit příjem, zkuste změnit vybraný typ sítě v nastavení Systém > Síť a internet > Mobilní sítě > Preferovaný typ sítě."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Chcete-li zlepšit příjem, zkuste změnit vybraný typ sítě v Nastavení > Síť a internet > Mobilní sítě > Preferovaný typ sítě."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Upozornění"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Přesměrování hovorů"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Režim tísňového zpětného volání"</string>
@@ -1849,4 +1833,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM karta není poskytována"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM karta není povolena"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Telefon není povolen"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Vyskakovací okno"</string>
</resources>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 66a1412..692a851 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"b"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"Mb"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"Tb"</string>
<string name="petabyteShort" msgid="5637816680144990219">"Pb"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dage"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> t."</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> t."</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> timer"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> t. <xliff:g id="MINUTES">%2$d</xliff:g> min."</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> t. <xliff:g id="MINUTES">%2$d</xliff:g> min."</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min."</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min."</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min. <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min. <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sek."</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sek."</string>
<string name="untitled" msgid="4638956954852782576">"<Uden titel>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Intet telefonnummer)"</string>
<string name="unknownName" msgid="6867811765370350269">"Ukendt"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Ingen tale- og nødtjenester"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Tilbydes i øjeblikket ikke af mobilnetværket på din placering"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Der er ingen forbindelse til netværket"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Hvis du vil forbedre signalet, kan du prøve at ændre den valgte netværkstype i System > Netværk og internet > Mobilnetværk > Foretrukken netværkstype."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Hvis du vil forbedre signalet, kan du prøve at ændre den valgte netværkstype i Indstillinger > Netværk og internet > Mobilnetværk > Foretrukken netværkstype."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Underretninger"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Viderestilling af opkald"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Nødtilbagekaldstilstand"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM-kortet er ikke aktiveret"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM-kortet har ikke adgangstilladelse"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Telefonen har ikke adgangstilladelse"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Pop op-vindue"</string>
</resources>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 91f4c46..1f5873c 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"KB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> Tage"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> Tag <xliff:g id="HOURS">%2$d</xliff:g> Std."</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> Tag <xliff:g id="HOURS">%2$d</xliff:g> Std."</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> Std."</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> Std. <xliff:g id="MINUTES">%2$d</xliff:g> Min."</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> Std. <xliff:g id="MINUTES">%2$d</xliff:g> Min."</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> Min."</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> Min. <xliff:g id="SECONDS">%2$d</xliff:g> Sek."</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> Min. <xliff:g id="SECONDS">%2$d</xliff:g> Sek."</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> Sek."</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> Sek."</string>
<string name="untitled" msgid="4638956954852782576">"<Unbenannt>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Keine Telefonnummer)"</string>
<string name="unknownName" msgid="6867811765370350269">"Unbekannt"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Keine Anrufe/Notrufe"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Derzeit nicht im Mobilfunknetz in deiner Region verfügbar"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Netzwerk nicht erreichbar"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Der Empfang lässt sich möglicherweise verbessern, indem du unter \"System\" > \"Netzwerk\" & \"Internet\" > \"Mobilfunknetze\" > \"Bevorzugter Netzwerktyp\" einen anderen Typ auswählst."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Der Empfang lässt sich möglicherweise verbessern, indem du unter \"Einstellungen\" > \"Netzwerk\" & \"Internet\" > \"Mobilfunknetze\" > \"Bevorzugter Netzwerktyp\" einen anderen Typ auswählst."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Warnmeldungen"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Anrufweiterleitung"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Notfallrückrufmodus"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM nicht eingerichtet"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM-Karte nicht zulässig"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Smartphone nicht zulässig"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Pop-up-Fenster"</string>
</resources>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 28961bc..7ab10d2 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ημέρες"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ημ. <xliff:g id="HOURS">%2$d</xliff:g> ώρες"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ημ. <xliff:g id="HOURS">%2$d</xliff:g> ώρα"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ώρες"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ώρα <xliff:g id="MINUTES">%2$d</xliff:g> λ"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ώρα <xliff:g id="MINUTES">%2$d</xliff:g> λ"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> λεπτά"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> λεπτά"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> λ. <xliff:g id="SECONDS">%2$d</xliff:g> δευτ."</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> λ <xliff:g id="SECONDS">%2$d</xliff:g> δευτ."</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> δευτ."</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> δευτ."</string>
<string name="untitled" msgid="4638956954852782576">"<Χωρίς τίτλο>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Δεν υπάρχει τηλεφωνικός αριθμός)"</string>
<string name="unknownName" msgid="6867811765370350269">"Άγνωστο"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Δεν υπάρχει φωνητική υπηρεσία/υπηρεσία έκτακτης ανάγκης"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Δεν προσφέρεται προσωρινά από το δίκτυο κινητής τηλεφωνίας στην τοποθεσία σας"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Δεν είναι δυνατή η σύνδεση στο δίκτυο"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Για να βελτιώσετε τη λήψη, δοκιμάστε να αλλάξετε τον επιλεγμένο τύπο από το Σύστημα > Δίκτυο και διαδίκτυο > Δίκτυα κινητής τηλεφωνίας > Προτιμώμενος τύπος δικτύου."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Για να βελτιώσετε τη λήψη, δοκιμάστε να αλλάξετε τον επιλεγμένο τύπο από τις Ρυθμίσεις > Δίκτυο και διαδίκτυο > Δίκτυα κινητής τηλεφωνίας > Προτιμώμενος τύπος δικτύου."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Ειδοποιήσεις"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Προώθηση κλήσης"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Λειτουργία επιστροφής κλήσης έκτακτης ανάγκης"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"Δεν παρέχεται κάρτα SIM"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"Η κάρτα SIM δεν επιτρέπεται"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Το τηλέφωνο δεν επιτρέπεται"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Αναδυόμενο παράθυρο"</string>
</resources>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 0fd0ec7..213d966 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> days"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hrs"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hr"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> hrs"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> hr <xliff:g id="MINUTES">%2$d</xliff:g> mins"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> hr <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> mins"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> secs"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sec"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> secs"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sec"</string>
<string name="untitled" msgid="4638956954852782576">"<Untitled>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(No phone number)"</string>
<string name="unknownName" msgid="6867811765370350269">"Unknown"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"No voice/emergency service"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Temporarily not offered by the mobile network at your location"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Can’t find network"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"To improve reception, try changing the type selected at System > Network & Internet > Mobile networks > Preferred network type."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"To improve reception, try changing the type selected at Settings > Network & Internet > Mobile networks > Preferred network type."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alerts"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Call forwarding"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Emergency callback mode"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM not provisioned"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM not allowed"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Phone not allowed"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Pop-Up Window"</string>
</resources>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 0fd0ec7..213d966 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> days"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hrs"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hr"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> hrs"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> hr <xliff:g id="MINUTES">%2$d</xliff:g> mins"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> hr <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> mins"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> secs"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sec"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> secs"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sec"</string>
<string name="untitled" msgid="4638956954852782576">"<Untitled>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(No phone number)"</string>
<string name="unknownName" msgid="6867811765370350269">"Unknown"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"No voice/emergency service"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Temporarily not offered by the mobile network at your location"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Can’t find network"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"To improve reception, try changing the type selected at System > Network & Internet > Mobile networks > Preferred network type."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"To improve reception, try changing the type selected at Settings > Network & Internet > Mobile networks > Preferred network type."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alerts"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Call forwarding"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Emergency callback mode"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM not provisioned"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM not allowed"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Phone not allowed"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Pop-Up Window"</string>
</resources>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 0fd0ec7..213d966 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> days"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hrs"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hr"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> hrs"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> hr <xliff:g id="MINUTES">%2$d</xliff:g> mins"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> hr <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> mins"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> secs"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sec"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> secs"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sec"</string>
<string name="untitled" msgid="4638956954852782576">"<Untitled>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(No phone number)"</string>
<string name="unknownName" msgid="6867811765370350269">"Unknown"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"No voice/emergency service"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Temporarily not offered by the mobile network at your location"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Can’t find network"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"To improve reception, try changing the type selected at System > Network & Internet > Mobile networks > Preferred network type."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"To improve reception, try changing the type selected at Settings > Network & Internet > Mobile networks > Preferred network type."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alerts"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Call forwarding"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Emergency callback mode"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM not provisioned"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM not allowed"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Phone not allowed"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Pop-Up Window"</string>
</resources>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index dd029bf..6d21cd1 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"KB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> días"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> día <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> día <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
<string name="untitled" msgid="4638956954852782576">"<Sin título>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(No hay número de teléfono)"</string>
<string name="unknownName" msgid="6867811765370350269">"Desconocido"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Sin servicio de voz/emergencia"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"La red móvil de tu ubicación no ofrece este servicio de forma temporal"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"No se puede establecer conexión con la red"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Para mejorar la recepción, cambia el tipo de red. Selecciona Sistema > Internet y red > Redes móviles > Tipo de red preferido."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Para mejorar la recepción, cambia el tipo de red. Selecciona Configuración > Internet y red > Redes móviles > Tipo de red preferido."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertas"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Desvío de llamada"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modo de devolución de llamada de emergencia"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM no provista"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM no permitida"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Teléfono no permitido"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Ventana emergente"</string>
</resources>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index aedb7d1..3f1de71 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> días"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> día <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> día <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
<string name="untitled" msgid="4638956954852782576">"<Sin título>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Sin número de teléfono)"</string>
<string name="unknownName" msgid="6867811765370350269">"Desconocido"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Sin servicio de emergencia ni de voz"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"La red móvil disponible en tu ubicación no ofrece esta opción de forma temporal"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"No se puede establecer conexión con la red"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Para mejorar la recepción, prueba a cambiar el tipo de red seleccionado en Sistema > Red e Internet > Redes móviles > Tipo de red preferido."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Para mejorar la recepción, prueba a cambiar el tipo seleccionado en Ajustes > Red e Internet > Redes móviles > Tipo de red preferido."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertas"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Desvío de llamada"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modo de devolución de llamada de emergencia"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM no proporcionada"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM no compatible"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Teléfono no compatible"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Ventana emergente"</string>
</resources>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index 4de3f1b3..edd53ca 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> päeva"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> päev <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> päev <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
<string name="untitled" msgid="4638956954852782576">"<Pealkirjata>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Telefoninumbrit pole)"</string>
<string name="unknownName" msgid="6867811765370350269">"Teadmata"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Häälkõned/hädaabiteenus pole saadaval"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Teie asukoha mobiilsidevõrk seda teenust ajutiselt ei paku"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Võrguga ei saa ühendust"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Vastuvõtu parandamiseks muutke valitud tüüpi jaotises Süsteem > Võrk ja Internet > Mobiilsidevõrgud > Eelistatud võrgutüüp."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Vastuvõtu parandamiseks muutke valitud tüüpi jaotises Seaded > Võrk ja Internet > Mobiilsidevõrgud > Eelistatud võrgutüüp."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Teatised"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Kõnede suunamine"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Hädaolukorra tagasihelistusrežiim"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM-kaart on ettevalmistamata"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM-kaart pole lubatud"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Telefon pole lubatud"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Hüpikaken"</string>
</resources>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index e469757..db29f4b 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> egun"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> egun <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> egun <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> m"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> m"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> m"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> m <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> m <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
<string name="untitled" msgid="4638956954852782576">"<Izengabea>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Ez dago telefono-zenbakirik)"</string>
<string name="unknownName" msgid="6867811765370350269">"Ezezaguna"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Ez dago ahots- edo larrialdi-deien zerbitzurik"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Zauden tokiko sare mugikorrak ez du eskaintzen aukera hori une honetan"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Ezin da konektatu sarera"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Seinalea hobea izan dadin, aldatu hautatutako sare mota Sistema > Sareak eta Internet > Sare mugikorrak > Sare mota hobetsia atalean."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Seinalea hobea izan dadin, aldatu sare mota Ezarpenak > Sareak eta Internet > Sare mugikorrak > Sare mota hobetsia atalean."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Abisuak"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Dei-desbideratzea"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Larrialdi-deiak soilik jasotzeko modua"</string>
@@ -1782,4 +1766,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"Ez dago SIM txartelik"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"Ez da onartzen SIM txartela"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Ez da onartzen telefonoa"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Leiho gainerakorra"</string>
</resources>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 1777e59..d753351 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"بایت"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"کیلوبایت"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"مگابایت"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"گیگابایت"</string>
- <string name="terabyteShort" msgid="231613018159186962">"ترابایت"</string>
<string name="petabyteShort" msgid="5637816680144990219">"پتابایت"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> روز"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> روز و <xliff:g id="HOURS">%2$d</xliff:g> ساعت"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> روز و <xliff:g id="HOURS">%2$d</xliff:g> ساعت"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ساعت"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ساعت و <xliff:g id="MINUTES">%2$d</xliff:g> دقیقه"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ساعت و <xliff:g id="MINUTES">%2$d</xliff:g> دقیقه"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> دقیقه"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> دقیقه"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> دقیقه و <xliff:g id="SECONDS">%2$d</xliff:g> ثانیه"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> دقیقه و <xliff:g id="SECONDS">%2$d</xliff:g> ثانیه"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> ثانیه"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> ثانیه"</string>
<string name="untitled" msgid="4638956954852782576">"<بدون عنوان>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(بدون شماره تلفن)"</string>
<string name="unknownName" msgid="6867811765370350269">"نامشخص"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"سرویس صوتی/اضطراری دردسترس نیست"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"موقتاً توسط شبکه داده دستگاه همراه در مکان شما ارائه نمیشود"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"شبکه دردسترس نیست"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"برای بهبود دریافت، نوع شبکهای را که انتخاب کردهاید در «سیستم» > «شبکه و اینترنت» > «شبکههای تلفن همراه» > «نوع شبکه ترجیحی» تغییر دهید."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"برای بهبود دریافت، نوع شبکه انتخابشده را در «تنظیمات > شبکه و اینترنت > شبکههای تلفن همراه > نوع شبکه ترجیحی» تغییر دهید."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"هشدارها"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"بازارسال تماس"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"حالت پاسخ تماس اضطراری"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"سیمکارت مجوز لازم را ندارد"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"سیمکارت مجاز نیست"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"تلفن مجاز نیست"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"پنجره بازشو"</string>
</resources>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index f5db45f..efffd63 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"t"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kt"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"Mt"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"Gt"</string>
- <string name="terabyteShort" msgid="231613018159186962">"Tt"</string>
<string name="petabyteShort" msgid="5637816680144990219">"Pt"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> päivää"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> päivä <xliff:g id="HOURS">%2$d</xliff:g> t"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> päivä <xliff:g id="HOURS">%2$d</xliff:g> t"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> t"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> t <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> t <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
<string name="untitled" msgid="4638956954852782576">"<Nimetön>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Ei puhelinnumeroa)"</string>
<string name="unknownName" msgid="6867811765370350269">"Tuntematon"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Ei ääni- tai hätäpuheluja"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Sijaintisi mobiiliverkko ei tarjoa tätä tilapäisesti."</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Ei yhteyttä verkkoon"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Voit yrittää parantaa kuuluvuutta vaihtamalla tyypin asetusta. Valitse Järjestelmä > Verkko > Internet > Mobiiliverkot > Ensisijainen verkko."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Voit yrittää parantaa kuuluvuutta vaihtamalla tyypin asetusta. Valitse Asetukset > Verkko > Internet > Mobiiliverkot > Ensisijainen verkko."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Ilmoitukset"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Soitonsiirto"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Hätäpuhelujen takaisinsoittotila"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM-kortti ei käyttäjien hallinnassa"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM-kortti estetty"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Puhelin estetty"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Ponnahdusikkuna"</string>
</resources>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index e84d629..82f9147 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"o"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"ko"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"Mo"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"Go"</string>
- <string name="terabyteShort" msgid="231613018159186962">"To"</string>
<string name="petabyteShort" msgid="5637816680144990219">"Po"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> jours"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> j et <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> j et <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h et <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h et <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min et <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min et <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
<string name="untitled" msgid="4638956954852782576">"<Sans_titre>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Aucun numéro de téléphone)"</string>
<string name="unknownName" msgid="6867811765370350269">"Inconnu"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Aucun service vocal ou d\'urgence"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Ce service est temporairement non offert par le réseau cellulaire à l\'endroit où vous êtes"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Impossible de joindre le réseau"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Pour améliorer la réception, essayez de changer le type de réseau sélectionné, sous Système > Réseaux et Internet > Réseaux cellulaires > Type de réseau préféré."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Pour améliorer la réception, essayez de changer le type de réseau sélectionné, sous Paramètres > Réseaux et Internet > Réseaux cellulaires > Type de réseau préféré."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertes"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Transfert d\'appel"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Mode de rappel d\'urgence"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"Carte SIM non configurée"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"Carte SIM non autorisée"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Téléphone non autorisé"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Fenêtre contextuelle"</string>
</resources>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index a455275..a35e19e 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"octet(s)"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"Ko"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"Mo"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"Go"</string>
- <string name="terabyteShort" msgid="231613018159186962">"To"</string>
<string name="petabyteShort" msgid="5637816680144990219">"Po"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> jours"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> j et <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> j et <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h et <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h et <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min et <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min et <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
<string name="untitled" msgid="4638956954852782576">"<Sans nom>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Aucun numéro de téléphone)"</string>
<string name="unknownName" msgid="6867811765370350269">"Inconnu"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Aucun service vocal/d\'urgence"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Momentanément non proposé par le réseau mobile à votre position"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Impossible d\'accéder au réseau"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Pour améliorer la réception, essayez de modifier le type sélectionné sous Système > Réseau et Internet > Réseaux mobiles > Type de réseau préféré."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Pour améliorer la réception, essayez de modifier le type sélectionné sous Paramètres > Réseau et Internet > Réseaux mobiles > Type de réseau préféré."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertes"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Transfert d\'appel"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Mode de rappel d\'urgence"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"Carte SIM non configurée"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"Carte SIM non autorisée"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Téléphone non autorisé"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Fenêtre pop-up"</string>
</resources>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index 5839348..fc4e132 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> días"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> día <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> día <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> minuto"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> seg"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> seg"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> segundos"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> segundo"</string>
<string name="untitled" msgid="4638956954852782576">"<Sen título>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Sen número de teléfono)"</string>
<string name="unknownName" msgid="6867811765370350269">"Descoñecido"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Non hai servizo de chamadas de emerxencia nin de voz"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"A rede de telefonía móbil non ofrece o servizo na túa localización temporalmente"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Non se pode conectar coa rede"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Para mellorar a recepción, proba a cambiar o tipo seleccionado en Sistema > Rede e Internet > Redes de telefonía móbil > Tipo de rede preferido."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Para mellorar a recepción, proba a cambiar o tipo seleccionado en Configuración > Rede e Internet > Redes de telefonía móbil > Tipo de rede preferido."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertas"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Desvío de chamadas"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modo de devolución de chamadas de emerxencia"</string>
@@ -1782,4 +1766,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"Non se introduciu ningunha tarxeta SIM"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"Non se admite a tarxeta SIM"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Non se admite o teléfono"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Ventá emerxente"</string>
</resources>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index 8ce54f5..10f6658 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> દિવસ"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> દિવસ <xliff:g id="HOURS">%2$d</xliff:g> કલાક"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> દિવસ <xliff:g id="HOURS">%2$d</xliff:g> કલાક"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> કલાક"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> કલાક <xliff:g id="MINUTES">%2$d</xliff:g> મિનિટ"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> કલાક <xliff:g id="MINUTES">%2$d</xliff:g> મિનિટ"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> મિનિટ"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> મિનિટ"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> મિનિટ <xliff:g id="SECONDS">%2$d</xliff:g> સેકંડ"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> મિ <xliff:g id="SECONDS">%2$d</xliff:g> સે"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> સેકંડ"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> સેકંડ"</string>
<string name="untitled" msgid="4638956954852782576">"<અનામાંકિત>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(કોઈ ફોન નંબર નથી)"</string>
<string name="unknownName" msgid="6867811765370350269">"અજાણ્યું"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"કોઈ વૉઇસ/કટોકટીની સેવા નથી"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"તમારા સ્થળે મોબાઇલ નેટવર્ક દ્વારા અસ્થાયીરૂપે ઑફર કરવામાં આવતી નથી"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"નેટવર્ક પર પહોંચી શકાતું નથી"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"રિસેપ્શનને બહેતર બનાવવા માટે, સિસ્ટમ > નેટવર્ક અને ઇન્ટરનેટ > મોબાઇલ નેટવર્ક > પસંદગીનો નેટવર્ક પ્રકારમાં પસંદ કરેલો પ્રકાર બદલવાનો પ્રયાસ કરો."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"રિસેપ્શનને બહેતર બનાવવા માટે, સેટિંગ્સ > નેટવર્ક અને ઇન્ટરનેટ > મોબાઇલ નેટવર્ક > પસંદગીના નેટવર્ક પ્રકાર પર પસંદ કરેલ પ્રકાર બદલવાનો પ્રયાસ કરો."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"ચેતવણીઓ"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"કૉલ ફૉર્વર્ડિંગ"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"કટોકટી કૉલબૅક મોડ"</string>
@@ -1782,4 +1766,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIMની જોગવાઈ કરી નથી"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM મંજૂર નથી"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"ફોન મંજૂર નથી"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"પૉપઅપ વિંડો"</string>
</resources>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 2b74852..b34c20c 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> दिन"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> दिन <xliff:g id="HOURS">%2$d</xliff:g> घंटे"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> दिन <xliff:g id="HOURS">%2$d</xliff:g> घंटा"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> घंटे"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> घं. <xliff:g id="MINUTES">%2$d</xliff:g> मि."</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> घं. <xliff:g id="MINUTES">%2$d</xliff:g> मि."</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> मिनट"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> मिनट"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> मि. <xliff:g id="SECONDS">%2$d</xliff:g> से."</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> मि. <xliff:g id="SECONDS">%2$d</xliff:g> से."</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> सेकंड"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> सेकंड"</string>
<string name="untitled" msgid="4638956954852782576">"<शीर्षक-रहित>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(कोई फ़ोन नंबर नहीं)"</string>
<string name="unknownName" msgid="6867811765370350269">"अज्ञात"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"कोई वॉइस/आपातकालीन सेवा नहीं है"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"आपके स्थान के मोबाइल नेटवर्क की ओर से इस समय ऑफ़र नहीं किया जा रहा है"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"नेटवर्क तक नहीं पहुंच पा रहे हैं"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"रिसेप्शन बेहतर करने के लिए, सिस्टम > नेटवर्क और इंटरनेट > मोबाइल नेटवर्क > पसंदीदा नेटवर्क प्रकार पर जाकर, चुना गया प्रकार बदलकर देखें."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"रिसेप्शन बेहतर करने के लिए, सेटिंग > नेटवर्क और इंटरनेट > मोबाइल नेटवर्क > पसंदीदा नेटवर्क प्रकार पर जाकर, चुना गया प्रकार बदलकर देखें."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"सूचनाएं"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"कॉल अग्रेषण"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"आपातकालीन कॉलबैक मोड"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM का प्रावधान नहीं किया गया है"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM की अनुमति नहीं है"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"फ़ोन की अनुमति नहीं है"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"पॉपअप विंडो"</string>
</resources>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 2605c86..f333c27 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> d"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> d <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> d <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
<string name="untitled" msgid="4638956954852782576">"<Bez naslova>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Nema telefonskog broja)"</string>
<string name="unknownName" msgid="6867811765370350269">"Nepoznato"</string>
@@ -96,7 +80,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Nema glasovnih i hitnih usluga"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Trenutačno nije u ponudi mobilne mreže na vašoj lokaciji"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Pristup mreži nije moguć"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Za bolji prijem pokušajte odabrati drugu vrstu mreže u odjeljku Sustav > Mreža i internet > Mobilne mreže > Željena vrsta mreže."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Za bolji prijem pokušajte promijeniti vrstu odabranu u odjeljku Postavke > Mreža i internet > Mobilne mreže > Preferirana vrsta mreže."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Upozorenja"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Preusmjeravanje poziva"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Način hitnog povratnog poziva"</string>
@@ -1815,4 +1799,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"Ne pruža se usluga za SIM"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM nije dopušten"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Telefon nije dopušten"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Skočni prozor"</string>
</resources>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 99ab8b2..f188cc8 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> nap"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> nap <xliff:g id="HOURS">%2$d</xliff:g> óra"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> nap <xliff:g id="HOURS">%2$d</xliff:g> óra"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> óra"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> óra <xliff:g id="MINUTES">%2$d</xliff:g> perc"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> óra <xliff:g id="MINUTES">%2$d</xliff:g> perc"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> perc"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> perc"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> perc <xliff:g id="SECONDS">%2$d</xliff:g> mp"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> perc <xliff:g id="SECONDS">%2$d</xliff:g> mp"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> másodperc"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> másodperc"</string>
<string name="untitled" msgid="4638956954852782576">"<Névtelen>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Nincs telefonszám)"</string>
<string name="unknownName" msgid="6867811765370350269">"Ismeretlen"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Hang- és segélyszolgáltatás letiltva"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Az Ön tartózkodási helyén ideiglenesen nem áll rendelkezésre a mobilhálózaton"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"A hálózat nem érhető el"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"A vétel javítása érdekében próbálja módosítani a kiválasztott hálózattípust a Rendszer > Hálózat és internet > Mobilhálózatok > Preferált hálózattípus menüben."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"A vétel javítása érdekében próbálja módosítani a kiválasztott hálózattípust a Beállítások > Hálózat és internet > Mobilhálózatok > Preferált hálózattípus menüpontban."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Értesítések"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Hívásátirányítás"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Sürgősségi visszahívás mód"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"Nem engedélyezett SIM-kártya"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"A SIM-kártya nem engedélyezett"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"A telefon nem engedélyezett"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Előugró ablak"</string>
</resources>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index b08feef..083566d 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"Բ"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"կԲ"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"ՄԲ"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"ԳԲ"</string>
- <string name="terabyteShort" msgid="231613018159186962">"ՏԲ"</string>
<string name="petabyteShort" msgid="5637816680144990219">"Պբ"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> օր"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> օր <xliff:g id="HOURS">%2$d</xliff:g> ժ"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> օր <xliff:g id="HOURS">%2$d</xliff:g> ժ"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ժ"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ժ <xliff:g id="MINUTES">%2$d</xliff:g> ր"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ժ <xliff:g id="MINUTES">%2$d</xliff:g> ր"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> րոպե"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> րոպե"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> ր <xliff:g id="SECONDS">%2$d</xliff:g> վ"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> ր <xliff:g id="SECONDS">%2$d</xliff:g> վ"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> վ"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> վ"</string>
<string name="untitled" msgid="4638956954852782576">"<Անանուն>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Հեռախոսահամար չկա)"</string>
<string name="unknownName" msgid="6867811765370350269">"Անհայտ"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Ձայնային/արտակարգ իրավիճակների ծառայությունն անհասանելի է"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Ձեր գտնվելու վայրում ծառայությունը ժամանակավորապես չի տրամադրվում բջջային ցանցի կողմից"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Ցանցն անհասանելի է"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Ազդանշանի ընդունման որակը բարելավելու համար փոխեք ցանցի տեսակը՝ անցնելով Համակարգ > Ցանց և ինտերնետ > Բջջային ցանցեր > Ցանկալի ցանցի տեսակը։"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Ազդանշանի ընդունման որակը բարելավելու համար փոխեք ցանցի տեսակը՝ անցնելով Համակարգ > Ցանց և ինտերնետ > Բջջային ցանցեր > Ցանկալի ցանցի տեսակը։"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Ծանուցումներ"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Զանգի վերահասցեավորում"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Շտապ հետկանչի ռեժիմ"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM քարտը նախապատրաստված չէ"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM քարտի օգտագործումն արգելված է"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Հեռախոսի օգտագործումն արգելված է"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Հայտնվող պատուհան"</string>
</resources>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index c407a074..e8474c0 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> hari"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> hari <xliff:g id="HOURS">%2$d</xliff:g> jam"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> hari <xliff:g id="HOURS">%2$d</xliff:g> jam"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> jam"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> jam <xliff:g id="MINUTES">%2$d</xliff:g> mnt"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> jam <xliff:g id="MINUTES">%2$d</xliff:g> mnt"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> mnt"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> menit"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> mnt <xliff:g id="SECONDS">%2$d</xliff:g> dtk"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> mnt <xliff:g id="SECONDS">%2$d</xliff:g> dtk"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> dtk"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> dtk"</string>
<string name="untitled" msgid="4638956954852782576">"<Tanpa judul>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Tidak ada nomor telepon)"</string>
<string name="unknownName" msgid="6867811765370350269">"Tidak diketahui"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Tidak ada layanan panggilan suara/darurat"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Untuk sementara tidak ditawarkan oleh jaringan seluler di lokasi Anda"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Tidak dapat menjangkau jaringan"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Untuk meningkatkan penerimaan sinyal, coba ubah jenis yang dipilih di Sistem > Jaringan & Internet > Jaringan seluler > Jenis jaringan pilihan."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Untuk menyempurnakan penerimaan sinyal, coba ubah jenis yang dipilih di Setelan > Jaringan & Internet > Jaringan seluler > Jenis jaringan pilihan."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Notifikasi"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Penerusan panggilan"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Mode panggilan balik darurat"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM tidak di-provisioning"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM tidak diizinkan"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Ponsel tidak diizinkan"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Jendela Pop-up"</string>
</resources>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index 68402a41..a41c41e 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dagar"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> klst."</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> klst."</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> klst."</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> k. <xliff:g id="MINUTES">%2$d</xliff:g> mín."</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> k. <xliff:g id="MINUTES">%2$d</xliff:g> mín."</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> mín."</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> mín."</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> m. <xliff:g id="SECONDS">%2$d</xliff:g> sek."</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> m. <xliff:g id="SECONDS">%2$d</xliff:g> sek."</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sek."</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sek."</string>
<string name="untitled" msgid="4638956954852782576">"<Ónefnt>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Ekkert símanúmer)"</string>
<string name="unknownName" msgid="6867811765370350269">"Óþekkt"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Símtöl/neyðarsímtöl eru ekki í boði"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Ekki í boði á farsímakerfinu á þínum stað eins og er"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Ekki næst samband við símkerfi"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Reyndu að breyta valinni gerð í Kerfi > Netkerfi og internet > Farsímakerfi > Valin símkerfistegund til að bæta móttökuskilyrðin."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Reyndu að breyta valinni gerð í Stillingar > Netkerfi og internet > Farsímakerfi > Valin símkerfistegund til að bæta móttökuskilyrðin."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Tilkynningar"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Símtalsflutningur"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Stilling fyrir svarhringingu neyðarsímtala"</string>
@@ -1782,4 +1766,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM-korti ekki úthlutað"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM-kort er ekki leyft"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Sími er ekki leyfður"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Sprettigluggi"</string>
</resources>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 363f4c9..0c0abf6 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> giorni"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> giorno <xliff:g id="HOURS">%2$d</xliff:g> ore"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> giorno <xliff:g id="HOURS">%2$d</xliff:g> ora"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ore"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ora <xliff:g id="MINUTES">%2$d</xliff:g> minuti"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ora <xliff:g id="MINUTES">%2$d</xliff:g> minuto"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> minuti"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> minuto <xliff:g id="SECONDS">%2$d</xliff:g> secondi"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> minuto <xliff:g id="SECONDS">%2$d</xliff:g> secondo"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> secondi"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> secondo"</string>
<string name="untitled" msgid="4638956954852782576">"<Senza nome>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Nessun numero di telefono)"</string>
<string name="unknownName" msgid="6867811765370350269">"Sconosciuto"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Nessun servizio di telefonia/emergenza"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Servizio temporaneamente non offerto dalla rete mobile nella tua località"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Impossibile raggiungere la rete"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Per migliorare la ricezione, prova a modificare il tipo selezionato in Sistema > Rete e Internet > Reti mobili > Tipo di rete preferito."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Per migliorare la ricezione, prova a modificare il tipo selezionato in Impostazioni > Rete e Internet > Reti mobili > Tipo di rete preferito."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Avvisi"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Deviazione chiamate"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modalità di richiamata di emergenza"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"Scheda SIM non predisposta"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"Scheda SIM non consentita"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Telefono non consentito"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Finestra popup"</string>
</resources>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 9dd6033..0df22ea 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ימים"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"יום <xliff:g id="DAYS">%1$d</xliff:g> <xliff:g id="HOURS">%2$d</xliff:g> שע\'"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"יום <xliff:g id="DAYS">%1$d</xliff:g> שעה <xliff:g id="HOURS">%2$d</xliff:g>"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> שעות"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"שעה <xliff:g id="HOURS">%1$d</xliff:g> <xliff:g id="MINUTES">%2$d</xliff:g> דק\'"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> שעות <xliff:g id="MINUTES">%2$d</xliff:g> דק\'"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> דקות"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> דקות"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"דקה <xliff:g id="MINUTES">%1$d</xliff:g> <xliff:g id="SECONDS">%2$d</xliff:g> שנ\'"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"דקה <xliff:g id="MINUTES">%1$d</xliff:g> שנ\' <xliff:g id="SECONDS">%2$d</xliff:g>"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> שניות"</string>
- <string name="durationSecond" msgid="985669622276420331">"שנייה <xliff:g id="SECONDS">%1$d</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">">ללא כותרת<"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(אין מספר טלפון)"</string>
<string name="unknownName" msgid="6867811765370350269">"לא ידוע"</string>
@@ -97,7 +81,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"אין אפשרות לבצע שיחות חירום ושיחות קוליות רגילות"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"הרשת הסלולרית במיקום הזה חסמה את השירות באופן זמני"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"לא ניתן להתחבר לרשת"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"כדי לשפר את הקליטה, נסה לשנות את הסוג הנבחר ב\'מערכת\' > \'רשת ואינטרנט\' > \'רשתות סלולריות\' > \'סוג רשת מועדף\'."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"כדי לשפר את הקליטה, כדאי לנסות לשנות את סוג הרשת ב\'הגדרות\' > \'רשת ואינטרנט\' > \'רשתות סלולריות\' > \'סוג רשת מועדף\'."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"התראות"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"העברת שיחות"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"מצב \'התקשרות חזרה בחירום\'"</string>
@@ -1849,4 +1833,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"כרטיס ה-SIM לא מזוהה"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"כרטיס ה-SIM לא מורשה"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"הטלפון לא מורשה"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"חלון קופץ"</string>
</resources>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index a5ae39f..3919001 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"KB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g>日"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g>日<xliff:g id="HOURS">%2$d</xliff:g>時間"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g>日<xliff:g id="HOURS">%2$d</xliff:g>時間"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g>時間"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g>時間<xliff:g id="MINUTES">%2$d</xliff:g>分"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g>時間<xliff:g id="MINUTES">%2$d</xliff:g>分"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g>分"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g>分"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g>分<xliff:g id="SECONDS">%2$d</xliff:g>秒"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g>分<xliff:g id="SECONDS">%2$d</xliff:g>秒"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g>秒"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g>秒"</string>
<string name="untitled" msgid="4638956954852782576">"<新規>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(電話番号なし)"</string>
<string name="unknownName" msgid="6867811765370350269">"不明"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"音声通話 / 緊急通報サービス停止"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"現在地のモバイル ネットワークでは一時的に提供されていません"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"ネットワークにアクセスできません"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"受信状態を改善するには、[システム] > [ネットワークとインターネット] > [モバイル ネットワーク] > [優先ネットワーク タイプ] で選択したタイプを変更してみてください。"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"受信状態を改善するには、[設定] > [ネットワークとインターネット] > [モバイル ネットワーク] > [優先ネットワーク タイプ] で選択したタイプを変更してみてください。"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"通知"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"電話の転送"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"緊急通報待機モード"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM には対応していません"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM は許可されていません"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"電話は許可されていません"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"ポップアップ ウィンドウ"</string>
</resources>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index ae8825b..6c75ef3 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"ბაიტი"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"კბაიტი"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"მბაიტი"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"გბაიტი"</string>
- <string name="terabyteShort" msgid="231613018159186962">"ტბაიტი"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> დღე"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> დღე <xliff:g id="HOURS">%2$d</xliff:g> სთ"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> დღე <xliff:g id="HOURS">%2$d</xliff:g> სთ"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> სთ"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> სთ <xliff:g id="MINUTES">%2$d</xliff:g> წთ"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> სთ <xliff:g id="MINUTES">%2$d</xliff:g> წთ"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> წთ"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> წთ"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> წთ <xliff:g id="SECONDS">%2$d</xliff:g> წმ"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> წთ <xliff:g id="SECONDS">%2$d</xliff:g> წმ"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> წმ"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> წმ"</string>
<string name="untitled" msgid="4638956954852782576">"უსათაურო"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(ტელეფონის ნომრის გარეშე)"</string>
<string name="unknownName" msgid="6867811765370350269">"უცნობი"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"ხმოვანი/გადაუდებელი ზარების სერვისი არ არის"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"დროებით არ არის შემოთავაზებული მობილური ქსელის მიერ თქვენს მდებარეობაზე"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"ქსელთან დაკავშირება ვერ ხერხდება"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"მიღების გასაუმჯობესებლად ცადეთ არჩეული ტიპის შეცვლა აქ: სისტემა > ქსელი და ინტერნეტი > მობილური ქსელები > ქსელის სასურველი ტიპი."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"მიღების გასაუმჯობესებლად ცადეთ არჩეული ტიპის შეცვლა აქ: პარამეტრები > ქსელი და ინტერნეტი > მობილური ქსელები > ქსელის სასურველი ტიპი."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"გაფრთხილებები"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"ზარის გადამისამართება"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"გადაუდებელი გადმორეკვის რეჟიმი"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM ბარათი უზრუნველყოფილი არ არის"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM ბარათი დაუშვებელია"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"ტელეფონი დაუშვებელია"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"ამომხტარი ფანჯარა"</string>
</resources>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index d926511..54a4b2f 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"Б"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"КБ"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MБ"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"ГБ"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TБ"</string>
<string name="petabyteShort" msgid="5637816680144990219">"ПБ"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> күн"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> күн <xliff:g id="HOURS">%2$d</xliff:g> сағ."</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> күн <xliff:g id="HOURS">%2$d</xliff:g> сағ."</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> сағ."</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> сағ. <xliff:g id="MINUTES">%2$d</xliff:g> м."</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> сағ. <xliff:g id="MINUTES">%2$d</xliff:g> м."</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> мин."</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> мин"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> мин. <xliff:g id="SECONDS">%2$d</xliff:g> с."</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> мин. <xliff:g id="SECONDS">%2$d</xliff:g> с."</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> сек."</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> сек."</string>
<string name="untitled" msgid="4638956954852782576">"<Атаусыз>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Телефон нөмірі жоқ)"</string>
<string name="unknownName" msgid="6867811765370350269">"Белгісіз"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Дауыстық/жедел қызметке қоңыраулар қызметі жоқ"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Орналасқан аймағыңызда мобильдік желі уақытша ұсынбады"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Желіге қосылу мүмкін емес"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Қабылдауды жақсарту үшін \"Жүйе > Желі және интернет > Мобильдік желілер > Қалаған желі түрі\" тармағынан түрді өзгертіп көріңіз."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Қабылдауды жақсарту үшін \"Параметрлер > Желі және интернет > Мобильді желілер және қалаулы желі түрі\" тармағынан түрді өзгертіп көріңіз."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Дабылдар"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Қоңырауды басқа нөмірге бағыттау"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Шұғыл кері қоңырау шалу режимі"</string>
@@ -1782,4 +1766,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM картасы белсендірілмеген"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM картасына рұқсат етілмеген"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Телефонға рұқсат етілмеген"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Қалқымалы терезе"</string>
</resources>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index 6a77d99..e2592fb 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"មេកាបៃ"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"ជីកាបៃ"</string>
- <string name="terabyteShort" msgid="231613018159186962">"តេរ៉ាបៃ"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ថ្ងៃ"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ថ្ងៃ <xliff:g id="HOURS">%2$d</xliff:g> ម៉ោង"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ថ្ងៃ <xliff:g id="HOURS">%2$d</xliff:g> ម៉ោង"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ម៉ោង"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ម៉ោង <xliff:g id="MINUTES">%2$d</xliff:g> នាទី"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ម៉ោង <xliff:g id="MINUTES">%2$d</xliff:g> នាទី"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> នាទី"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> នាទី"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g>នាទី <xliff:g id="SECONDS">%2$d</xliff:g>វិនាទី"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g>នាទី <xliff:g id="SECONDS">%2$d</xliff:g>វិនាទី"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> វិនាទី"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> វិនាទី"</string>
<string name="untitled" msgid="4638956954852782576">"<គ្មានចំណងជើង>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(គ្មានលេខទូរស័ព្ទ)"</string>
<string name="unknownName" msgid="6867811765370350269">"មិនស្គាល់"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"គ្មានសេវាកម្មសំឡេង/សង្រ្គោះបន្ទាន់ទេ"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"មិនបានផ្តល់ជូនដោយបណ្តាញចល័តនៅទីកន្លែងរបស់អ្នកជាបណ្តោះអាសន្ន"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"មិនអាចភ្ជាប់ទៅបណ្តាញបានទេ"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"ដើម្បីកែលម្អការទទួលយក សាកល្បងប្តូរប្រភេទដែលបានជ្រើសរើសនៅ ប្រព័ន្ធ > បណ្តាញ និងអ៊ីនធឺណិត > បណ្តាញទូរសព្ទចល័ត > ប្រភេទបណ្តាញដែលចង់ប្រើ។"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"ដើម្បីធ្វើឲ្យការទទួលរលកសញ្ញាប្រសើរជាងមុន សូមសាកល្បងប្តូរប្រភេទដែលបានជ្រើសរើសនៅ ការកំណត់ > បណ្តាញ និងអ៊ីនធឺណិត > បណ្តាញទូរសព្ទចល័ត > ប្រភេទបណ្តាញដែលចង់ប្រើ។"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"ការជូនដំណឹង"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"ការបញ្ជូនការហៅទូរសព្ទបន្ត"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"មុខងារហៅត្រឡប់វិញបន្ទាន់"</string>
@@ -1783,4 +1767,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"សីុមមិនត្រូវបានផ្តល់ជូនទេ"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"មិនអនុញ្ញាតចំពោះសីុមទេ"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"មិនអនុញ្ញាតចំពោះទូរសព្ទទេ"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"វិនដូលេចឡើង"</string>
</resources>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index d9be958..0f21aef 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ದಿನಗಳು"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ದಿನ <xliff:g id="HOURS">%2$d</xliff:g> ಗಂಟೆಗಳು"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ದಿನ <xliff:g id="HOURS">%2$d</xliff:g> ಗಂ"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ಗಂಟೆಗಳು"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ಗಂಟೆ <xliff:g id="MINUTES">%2$d</xliff:g> ನಿಮಿಷಗಳು"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ಗಂಟೆ <xliff:g id="MINUTES">%2$d</xliff:g> ನಿಮಿಷ"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> ನಿಮಿಷಗಳು"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> ನಿಮಿಷ"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> ನಿಮಿ <xliff:g id="SECONDS">%2$d</xliff:g> ಸೆಕೆಂಡುಗಳು"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> ನಿಮಿ <xliff:g id="SECONDS">%2$d</xliff:g> ಸೆ"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> ಸೆಕೆಂಡುಗಳು"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> ಸೆಕೆಂಡುಗಳು"</string>
<string name="untitled" msgid="4638956954852782576">"<ಶೀರ್ಷಿಕೆ ರಹಿತ>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(ಯಾವುದೇ ಫೋನ್ ಸಂಖ್ಯೆಯಿಲ್ಲ)"</string>
<string name="unknownName" msgid="6867811765370350269">"ಅಪರಿಚಿತ"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"ಧ್ವನಿ/ತುರ್ತು ಸೇವೆ ಇಲ್ಲ"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"ತಾತ್ಕಾಲಿಕವಾಗಿ ಮೊಬೈಲ್ ನೆಟ್ವರ್ಕ್ನಿಂದ ನಿಮ್ಮ ಸ್ಥಳದಲ್ಲಿ ಒದಗಿಸುತ್ತಿಲ್ಲ"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"ನೆಟ್ವರ್ಕ್ ತಲುಪಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"ನೆಟ್ವರ್ಕ್ ಸಂಪರ್ಕ ಪಡೆಯುವುದನ್ನು ಸುಧಾರಿಸಲು, ಆಯ್ಕೆ ಮಾಡಿರುವ ವಿಧವನ್ನು ಸಿಸ್ಟಂ > ನೆಟ್ವರ್ಕ್ ಮತ್ತು ಇಂಟರ್ನೆಟ್ > ಮೊಬೈಲ್ ನೆಟ್ವರ್ಕ್ಗಳು > ಆದ್ಯತೆಯ ನೆಟ್ವರ್ಕ್ ವಿಧದಲ್ಲಿ ಬದಲಿಸಿ ನೋಡಿ."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"ನೆಟ್ವರ್ಕ್ ಸಂಪರ್ಕ ಪಡೆಯುವುದನ್ನು ಸುಧಾರಿಸಲು, ಆಯ್ಕೆ ಮಾಡಿರುವ ವಿಧವನ್ನು ಸೆಟ್ಟಿಂಗ್ಗಳು > ನೆಟ್ವರ್ಕ್ ಮತ್ತು ಇಂಟರ್ನೆಟ್ > ಮೊಬೈಲ್ ನೆಟ್ವರ್ಕ್ಗಳು > ಆದ್ಯತೆಯ ನೆಟ್ವರ್ಕ್ ವಿಧದಲ್ಲಿ ಬದಲಿಸಿ ನೋಡಿ."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"ಎಚ್ಚರಿಕೆಗಳು"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"ಕರೆ ಫಾರ್ವರ್ಡ್ ಮಾಡುವಿಕೆ"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"ತುರ್ತು ಕಾಲ್ಬ್ಯಾಕ್ ಮೋಡ್"</string>
@@ -1782,4 +1766,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"ಸಿಮ್ ಸಿದ್ಧವಾಗಿಲ್ಲ"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"ಸಿಮ್ಗೆ ಅನುಮತಿಯಿಲ್ಲ"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"ಫೋನ್ಗೆ ಅನುಮತಿಯಿಲ್ಲ"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"ಪಾಪ್ಅಪ್ ವಿಂಡೋ"</string>
</resources>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 902ec1d..41be35b 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"KB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g>일"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g>일 <xliff:g id="HOURS">%2$d</xliff:g>시간"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g>일 <xliff:g id="HOURS">%2$d</xliff:g>시간"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g>시간"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g>시간 <xliff:g id="MINUTES">%2$d</xliff:g>분"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g>시간 <xliff:g id="MINUTES">%2$d</xliff:g>분"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g>분"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g>분"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g>분 <xliff:g id="SECONDS">%2$d</xliff:g>초"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g>분 <xliff:g id="SECONDS">%2$d</xliff:g>초"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g>초"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g>초"</string>
<string name="untitled" msgid="4638956954852782576">"<제목 없음>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(전화번호 없음)"</string>
<string name="unknownName" msgid="6867811765370350269">"알 수 없음"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"음성/긴급 서비스를 이용할 수 없음"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"현재 위치에서 모바일 네트워크가 서비스 제공을 일시적으로 중단했습니다."</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"네트워크에 연결할 수 없습니다."</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"수신 상태를 개선하려면 시스템 > 네트워크 및 인터넷 > 모바일 네트워크 > 기본 네트워크 유형에서 선택된 유형을 변경해 보세요."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"수신 상태를 개선하려면 설정 > 네트워크 및 인터넷 > 모바일 네트워크 > 기본 네트워크 유형에서 선택된 유형을 변경해 보세요."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"알림"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"착신전환"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"긴급 콜백 모드"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM이 프로비저닝되지 않음"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM이 허용되지 않음"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"전화가 허용되지 않음"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"팝업 창"</string>
</resources>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index d084443..051b01e 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"Б"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"Кб"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"Мб"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"Гб"</string>
- <string name="terabyteShort" msgid="231613018159186962">"ТБ"</string>
<string name="petabyteShort" msgid="5637816680144990219">"ПБ"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> күн"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> күн <xliff:g id="HOURS">%2$d</xliff:g> с"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> күн <xliff:g id="HOURS">%2$d</xliff:g> с"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> с"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> с. <xliff:g id="MINUTES">%2$d</xliff:g> мүн"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> саат <xliff:g id="MINUTES">%2$d</xliff:g> мүн"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> мүн"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> мүн."</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> мүн. <xliff:g id="SECONDS">%2$d</xliff:g> сек"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> мүн. <xliff:g id="SECONDS">%2$d</xliff:g> сек"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> сек"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> сек"</string>
<string name="untitled" msgid="4638956954852782576">"<Баш аты жок>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Телефон номери жок)"</string>
<string name="unknownName" msgid="6867811765370350269">"Белгисиз"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Бардык чалуулар жана кызматтар бөгөттөлгөн"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Өзгөчө кырдаалдагы кызматтар сиз жайгашкан жердеги мобилдик тармак тарабынан убактылуу бөгөттөлгөн"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Тармакка туташпай жатат"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Кабыл алуу мүмкүнчүлүгүн жакшыртуу үчүн Тутум > Тармак жана Интернет > Мобилдик тармактар > Тандалган тармак бөлүмүнөн тармактын түрүн өзгөртүп көрүңүз."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Кабыл алуу мүмкүнчүлүгүн жакшыртуу үчүн Жөндөөлөр > Тармак жана Интернет > Мобилдик тармактар > Тандалган тармак бөлүмүнөн тармактын түрүн өзгөртүп көрүңүз."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Эскертүүлөр"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Чалууну башка номерге багыттоо"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Шашылыш кайра чалуу режими"</string>
@@ -1782,4 +1766,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM карта таанылган жок"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM картаны колдонууга тыюу салынган"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Телефонду колдонууга тыюу салынган"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Калкып чыкма терезе"</string>
</resources>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index 1653c06..9790dd2 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ມື້"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ມື້ <xliff:g id="HOURS">%2$d</xliff:g> ຊມ"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ມື້ <xliff:g id="HOURS">%2$d</xliff:g> ຊມ"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ຊມ"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ຊມ <xliff:g id="MINUTES">%2$d</xliff:g> ນທ"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ຊມ <xliff:g id="MINUTES">%2$d</xliff:g> ນທ"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> ນທ"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> ນທ"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> ນທ <xliff:g id="SECONDS">%2$d</xliff:g> ວິ"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> ນທ <xliff:g id="SECONDS">%2$d</xliff:g> ວິ"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> ວິ"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> ວິ"</string>
<string name="untitled" msgid="4638956954852782576">"<ບໍ່ມີຊື່>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(ບໍ່ມີເບີໂທລະສັບ)"</string>
<string name="unknownName" msgid="6867811765370350269">"ບໍ່ຮູ້ຈັກ"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"ບໍ່ມີບໍລິການສຽງ/ສຸກເສີນ"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"ເຄືອຂ່າຍຂອງທ່ານບໍ່ໄດ້ໃຫ້ບໍລິການຢູ່ສະຖານທີ່ນີ້ເປັນການຊົ່ວຄາວ"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Can’t reach network"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"ເພື່ອປັບປຸງການຮັບສັນຍານ, ໃຫ້ລອງປ່ຽນປະເພດທີ່ເລືອກໄວ້ທີ່ ລະບົບ > ເຄືອຂ່າຍ ແລະ ອິນເຕີເນັດ > ເຄືອຂ່າຍມືຖື > ປະເພດເຄືອຂ່າຍທີ່ຕ້ອງການ."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"ເພື່ອປັບປຸງການຮັບສັນຍານ, ໃຫ້ລອງປ່ຽນປະເພດທີ່ເລືອກໄວ້ຢູ່ທີ່ ການຕັ້ງຄ່າ > ເຄືອຂ່າຍ ແລະ ອິນເຕີເນັດ > ເຄືອຂ່າຍມືຖື > ປະເພດເຄືອຂ່າຍທີ່ຕ້ອງການ."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"ການເຕືອນ"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"ການໂອນສາຍ"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"ໂໝດໂທກັບສຸກເສີນ"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"ບໍ່ມີການນຳໃຊ້ SIM"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"ບໍ່ອະນຸຍາດໃຫ້ໃຊ້ SIM"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"ບໍ່ອະນຸຍາດໃຫ້ໃຊ້ໂທລະສັບ"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"ໜ້າຈໍປັອບອັບ"</string>
</resources>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 47dc7af..35cb9b9 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"KB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> d."</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> val."</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> val."</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> val."</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> val. <xliff:g id="MINUTES">%2$d</xliff:g> min."</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> val. <xliff:g id="MINUTES">%2$d</xliff:g> min."</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min."</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min."</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min. <xliff:g id="SECONDS">%2$d</xliff:g> sek."</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min. <xliff:g id="SECONDS">%2$d</xliff:g> sek."</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sek."</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sek."</string>
<string name="untitled" msgid="4638956954852782576">"<Be pavadinimo>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Nėra telefono numerio)"</string>
<string name="unknownName" msgid="6867811765370350269">"Nežinoma"</string>
@@ -97,7 +81,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Balso skambučių / skambučių pagalbos numeriais paslauga neteikiama"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Laikinai nesiūloma mobiliojo ryšio tinkle jūsų vietovėje"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Nepavyko pasiekti tinklo"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Kad pagerintumėte ryšį, pabandykite pakeisti tipą, pasirinktą skiltyje „Nustatymai“ > „Tinklas ir internetas“ > „Mobiliojo ryšio tinklai“ > „Pageidaujamas tinklo tipas“."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Kad pagerintumėte ryšį, pabandykite pakeisti tipą, pasirinktą skiltyje „Nustatymai“ > „Tinklas ir internetas“ > „Mobiliojo ryšio tinklai“ > „Pageidaujamas tinklo tipas“."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Įspėjimai"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Skambučio peradresavimas"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Atskambinimo pagalbos numeriu režimas"</string>
@@ -1849,4 +1833,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM kortelė neteikiama"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM kortelė neleidžiama"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Telefonas neleidžiamas"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Iššokantysis langas"</string>
</resources>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 32f2c85..2c54905 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> d."</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
<string name="untitled" msgid="4638956954852782576">"<Bez nosaukuma>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Nav tālruņa numura)"</string>
<string name="unknownName" msgid="6867811765370350269">"Nezināms"</string>
@@ -96,7 +80,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Balss un ārkārtas izsaukumu pakalpojums nedarbojas"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Pagaidām netiek piedāvāts mobilajā tīklā jūsu atrašanās vietā"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Nevar sasniegt tīklu"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Lai uzlabotu uztveršanu, mainiet atlasīto veidu sadaļā Sistēma > Tīkls un internets > Mobilie tīkli > Ieteicamais tīkla veids."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Lai uzlabotu uztveršanu, mainiet atlasīto veidu sadaļā Iestatījumi > Tīkls un internets > Mobilie tīkli > Ieteicamais tīkla veids."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Brīdinājumi"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Zvanu pāradresācija"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Ārkārtas atzvana režīms"</string>
@@ -1815,4 +1799,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM karte netiek nodrošināta"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM karti nav atļauts izmantot"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Tālruni nav atļauts izmantot"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Uznirstošais logs"</string>
</resources>
diff --git a/core/res/res/values-mcc204-mnc12/config.xml b/core/res/res/values-mcc204-mnc12/config.xml
deleted file mode 100644
index 80432d7..0000000
--- a/core/res/res/values-mcc204-mnc12/config.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2015, 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 my obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Don't use roaming icon for considered operators -->
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>20408</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc206-mnc05/config.xml b/core/res/res/values-mcc206-mnc05/config.xml
deleted file mode 100644
index a684aaa..0000000
--- a/core/res/res/values-mcc206-mnc05/config.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2013, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>20610</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc206-mnc10/config.xml b/core/res/res/values-mcc206-mnc10/config.xml
deleted file mode 100644
index 5c96317..0000000
--- a/core/res/res/values-mcc206-mnc10/config.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2013, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>20605</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc208-mnc15/config.xml b/core/res/res/values-mcc208-mnc15/config.xml
deleted file mode 100644
index 32b951c..0000000
--- a/core/res/res/values-mcc208-mnc15/config.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2013, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>20801</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc208-mnc26/config.xml b/core/res/res/values-mcc208-mnc26/config.xml
deleted file mode 100644
index 31d2d0f..0000000
--- a/core/res/res/values-mcc208-mnc26/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2013, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Don't use roaming icon for considered operators -->
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>20801</item>
- <item>20810</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc214-mnc02/config.xml b/core/res/res/values-mcc214-mnc02/config.xml
deleted file mode 100755
index c83de57..0000000
--- a/core/res/res/values-mcc214-mnc02/config.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2013, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-
-<resources>
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>21401</item>
- <item>21402</item>
- <item>21403</item>
- <item>21404</item>
- <item>21405</item>
- <item>21406</item>
- <item>21407</item>
- <item>21408</item>
- <item>21409</item>
- <item>21410</item>
- <item>21411</item>
- <item>21412</item>
- <item>21413</item>
- <item>21414</item>
- <item>21415</item>
- <item>21416</item>
- <item>21417</item>
- <item>21418</item>
- <item>21419</item>
- <item>21420</item>
- <item>21421</item>
- </string-array>
-
-</resources>
diff --git a/core/res/res/values-mcc214-mnc04/config.xml b/core/res/res/values-mcc214-mnc04/config.xml
deleted file mode 100644
index 6dfa87b..0000000
--- a/core/res/res/values-mcc214-mnc04/config.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2013, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Don't use roaming icon for considered operators -->
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>21401</item>
- <item>21402</item>
- <item>21403</item>
- <item>21405</item>
- <item>21406</item>
- <item>21407</item>
- <item>21408</item>
- <item>21409</item>
- <item>21410</item>
- <item>21411</item>
- <item>21412</item>
- <item>21413</item>
- <item>21414</item>
- <item>21415</item>
- <item>21416</item>
- <item>21417</item>
- <item>21418</item>
- <item>21419</item>
- <item>21420</item>
- <item>21421</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc214-mnc05/config.xml b/core/res/res/values-mcc214-mnc05/config.xml
deleted file mode 100755
index 9302b0c..0000000
--- a/core/res/res/values-mcc214-mnc05/config.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2013, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources>
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>21401</item>
- <item>21402</item>
- <item>21403</item>
- <item>21404</item>
- <item>21406</item>
- <item>21407</item>
- <item>21408</item>
- <item>21409</item>
- <item>21410</item>
- <item>21411</item>
- <item>21412</item>
- <item>21413</item>
- <item>21414</item>
- <item>21415</item>
- <item>21416</item>
- <item>21417</item>
- <item>21418</item>
- <item>21419</item>
- <item>21420</item>
- <item>21421</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc214-mnc06/config.xml b/core/res/res/values-mcc214-mnc06/config.xml
deleted file mode 100755
index c3f2643..0000000
--- a/core/res/res/values-mcc214-mnc06/config.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2013, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources>
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>21401</item>
- <item>21402</item>
- <item>21403</item>
- <item>21404</item>
- <item>21405</item>
- <item>21407</item>
- <item>21408</item>
- <item>21409</item>
- <item>21410</item>
- <item>21411</item>
- <item>21412</item>
- <item>21413</item>
- <item>21414</item>
- <item>21415</item>
- <item>21416</item>
- <item>21417</item>
- <item>21418</item>
- <item>21419</item>
- <item>21420</item>
- <item>21421</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc214-mnc08/config.xml b/core/res/res/values-mcc214-mnc08/config.xml
deleted file mode 100755
index 5af6d5d..0000000
--- a/core/res/res/values-mcc214-mnc08/config.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2013, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources>
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>21401</item>
- <item>21402</item>
- <item>21403</item>
- <item>21404</item>
- <item>21405</item>
- <item>21406</item>
- <item>21407</item>
- <item>21409</item>
- <item>21410</item>
- <item>21411</item>
- <item>21412</item>
- <item>21413</item>
- <item>21414</item>
- <item>21415</item>
- <item>21416</item>
- <item>21417</item>
- <item>21418</item>
- <item>21419</item>
- <item>21420</item>
- <item>21421</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc214-mnc09/config.xml b/core/res/res/values-mcc214-mnc09/config.xml
deleted file mode 100755
index d789771..0000000
--- a/core/res/res/values-mcc214-mnc09/config.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2013, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources>
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>21401</item>
- <item>21402</item>
- <item>21403</item>
- <item>21404</item>
- <item>21405</item>
- <item>21406</item>
- <item>21407</item>
- <item>21408</item>
- <item>21410</item>
- <item>21411</item>
- <item>21412</item>
- <item>21413</item>
- <item>21414</item>
- <item>21415</item>
- <item>21416</item>
- <item>21417</item>
- <item>21418</item>
- <item>21419</item>
- <item>21420</item>
- <item>21421</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc214-mnc10/config.xml b/core/res/res/values-mcc214-mnc10/config.xml
deleted file mode 100755
index b66e1a2..0000000
--- a/core/res/res/values-mcc214-mnc10/config.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2013, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources>
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>21401</item>
- <item>21402</item>
- <item>21403</item>
- <item>21404</item>
- <item>21405</item>
- <item>21406</item>
- <item>21407</item>
- <item>21408</item>
- <item>21409</item>
- <item>21411</item>
- <item>21412</item>
- <item>21413</item>
- <item>21414</item>
- <item>21415</item>
- <item>21416</item>
- <item>21417</item>
- <item>21418</item>
- <item>21419</item>
- <item>21420</item>
- <item>21421</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc214-mnc11/config.xml b/core/res/res/values-mcc214-mnc11/config.xml
deleted file mode 100755
index 9fd06db..0000000
--- a/core/res/res/values-mcc214-mnc11/config.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2013, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources>
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>21401</item>
- <item>21402</item>
- <item>21403</item>
- <item>21404</item>
- <item>21405</item>
- <item>21406</item>
- <item>21407</item>
- <item>21408</item>
- <item>21409</item>
- <item>21410</item>
- <item>21412</item>
- <item>21413</item>
- <item>21414</item>
- <item>21415</item>
- <item>21416</item>
- <item>21417</item>
- <item>21418</item>
- <item>21419</item>
- <item>21420</item>
- <item>21421</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc214-mnc12/config.xml b/core/res/res/values-mcc214-mnc12/config.xml
deleted file mode 100755
index 7468238..0000000
--- a/core/res/res/values-mcc214-mnc12/config.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2013, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources>
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>21401</item>
- <item>21402</item>
- <item>21403</item>
- <item>21404</item>
- <item>21405</item>
- <item>21406</item>
- <item>21407</item>
- <item>21408</item>
- <item>21409</item>
- <item>21410</item>
- <item>21411</item>
- <item>21413</item>
- <item>21414</item>
- <item>21415</item>
- <item>21416</item>
- <item>21417</item>
- <item>21418</item>
- <item>21419</item>
- <item>21420</item>
- <item>21421</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc214-mnc13/config.xml b/core/res/res/values-mcc214-mnc13/config.xml
deleted file mode 100755
index 35ff4ae..0000000
--- a/core/res/res/values-mcc214-mnc13/config.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2013, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources>
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>21401</item>
- <item>21402</item>
- <item>21403</item>
- <item>21404</item>
- <item>21405</item>
- <item>21406</item>
- <item>21407</item>
- <item>21408</item>
- <item>21409</item>
- <item>21410</item>
- <item>21411</item>
- <item>21412</item>
- <item>21414</item>
- <item>21415</item>
- <item>21416</item>
- <item>21417</item>
- <item>21418</item>
- <item>21419</item>
- <item>21420</item>
- <item>21421</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc214-mnc14/config.xml b/core/res/res/values-mcc214-mnc14/config.xml
deleted file mode 100755
index b6a7440..0000000
--- a/core/res/res/values-mcc214-mnc14/config.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2013, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources>
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>21401</item>
- <item>21402</item>
- <item>21403</item>
- <item>21404</item>
- <item>21405</item>
- <item>21406</item>
- <item>21407</item>
- <item>21408</item>
- <item>21409</item>
- <item>21410</item>
- <item>21411</item>
- <item>21412</item>
- <item>21413</item>
- <item>21415</item>
- <item>21416</item>
- <item>21417</item>
- <item>21418</item>
- <item>21419</item>
- <item>21420</item>
- <item>21421</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc214-mnc15/config.xml b/core/res/res/values-mcc214-mnc15/config.xml
deleted file mode 100755
index 8296410..0000000
--- a/core/res/res/values-mcc214-mnc15/config.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2013, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources>
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>21401</item>
- <item>21402</item>
- <item>21403</item>
- <item>21404</item>
- <item>21405</item>
- <item>21406</item>
- <item>21407</item>
- <item>21408</item>
- <item>21409</item>
- <item>21410</item>
- <item>21411</item>
- <item>21412</item>
- <item>21413</item>
- <item>21414</item>
- <item>21416</item>
- <item>21417</item>
- <item>21418</item>
- <item>21419</item>
- <item>21420</item>
- <item>21421</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc214-mnc16/config.xml b/core/res/res/values-mcc214-mnc16/config.xml
deleted file mode 100755
index 1aaf577..0000000
--- a/core/res/res/values-mcc214-mnc16/config.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2013, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources>
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>21401</item>
- <item>21402</item>
- <item>21403</item>
- <item>21404</item>
- <item>21405</item>
- <item>21406</item>
- <item>21407</item>
- <item>21408</item>
- <item>21409</item>
- <item>21410</item>
- <item>21411</item>
- <item>21412</item>
- <item>21413</item>
- <item>21414</item>
- <item>21415</item>
- <item>21417</item>
- <item>21418</item>
- <item>21419</item>
- <item>21420</item>
- <item>21421</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc214-mnc17/config.xml b/core/res/res/values-mcc214-mnc17/config.xml
deleted file mode 100755
index be92a32..0000000
--- a/core/res/res/values-mcc214-mnc17/config.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2013, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources>
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>21401</item>
- <item>21402</item>
- <item>21403</item>
- <item>21404</item>
- <item>21405</item>
- <item>21406</item>
- <item>21407</item>
- <item>21408</item>
- <item>21409</item>
- <item>21410</item>
- <item>21411</item>
- <item>21412</item>
- <item>21413</item>
- <item>21414</item>
- <item>21415</item>
- <item>21416</item>
- <item>21418</item>
- <item>21419</item>
- <item>21420</item>
- <item>21421</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc214-mnc18/config.xml b/core/res/res/values-mcc214-mnc18/config.xml
deleted file mode 100755
index 078d7e2..0000000
--- a/core/res/res/values-mcc214-mnc18/config.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2013, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources>
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>21401</item>
- <item>21402</item>
- <item>21403</item>
- <item>21404</item>
- <item>21405</item>
- <item>21406</item>
- <item>21407</item>
- <item>21408</item>
- <item>21409</item>
- <item>21410</item>
- <item>21411</item>
- <item>21412</item>
- <item>21413</item>
- <item>21414</item>
- <item>21415</item>
- <item>21416</item>
- <item>21417</item>
- <item>21419</item>
- <item>21420</item>
- <item>21421</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc214-mnc19/config.xml b/core/res/res/values-mcc214-mnc19/config.xml
deleted file mode 100755
index d194687..0000000
--- a/core/res/res/values-mcc214-mnc19/config.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2013, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources>
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>21401</item>
- <item>21402</item>
- <item>21403</item>
- <item>21404</item>
- <item>21405</item>
- <item>21406</item>
- <item>21407</item>
- <item>21408</item>
- <item>21409</item>
- <item>21410</item>
- <item>21411</item>
- <item>21412</item>
- <item>21413</item>
- <item>21414</item>
- <item>21415</item>
- <item>21416</item>
- <item>21417</item>
- <item>21418</item>
- <item>21420</item>
- <item>21421</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc214-mnc20/config.xml b/core/res/res/values-mcc214-mnc20/config.xml
deleted file mode 100755
index 6aaf970..0000000
--- a/core/res/res/values-mcc214-mnc20/config.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2013, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources>
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>21401</item>
- <item>21402</item>
- <item>21403</item>
- <item>21404</item>
- <item>21405</item>
- <item>21406</item>
- <item>21407</item>
- <item>21408</item>
- <item>21409</item>
- <item>21410</item>
- <item>21411</item>
- <item>21412</item>
- <item>21413</item>
- <item>21414</item>
- <item>21415</item>
- <item>21416</item>
- <item>21417</item>
- <item>21418</item>
- <item>21419</item>
- <item>21421</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc214-mnc21/config.xml b/core/res/res/values-mcc214-mnc21/config.xml
deleted file mode 100755
index f890b14..0000000
--- a/core/res/res/values-mcc214-mnc21/config.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2013, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources>
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>21401</item>
- <item>21402</item>
- <item>21403</item>
- <item>21404</item>
- <item>21405</item>
- <item>21406</item>
- <item>21407</item>
- <item>21408</item>
- <item>21409</item>
- <item>21410</item>
- <item>21411</item>
- <item>21412</item>
- <item>21413</item>
- <item>21414</item>
- <item>21415</item>
- <item>21416</item>
- <item>21417</item>
- <item>21418</item>
- <item>21419</item>
- <item>21420</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc219-mnc02/config.xml b/core/res/res/values-mcc219-mnc02/config.xml
deleted file mode 100644
index 2ac6ba6..0000000
--- a/core/res/res/values-mcc219-mnc02/config.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2015, 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 my obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Don't use roaming icon for considered operators -->
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>21901</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc232-mnc10/config.xml b/core/res/res/values-mcc232-mnc10/config.xml
deleted file mode 100644
index bdf83016..0000000
--- a/core/res/res/values-mcc232-mnc10/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- ** Copyright 2016, The Android Open Source Project
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
--->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Don't use roaming icon for considered operators -->
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>23203</item>
- <item>23205</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc232-mnc11/config.xml b/core/res/res/values-mcc232-mnc11/config.xml
deleted file mode 100644
index 91e37b4..0000000
--- a/core/res/res/values-mcc232-mnc11/config.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- ** Copyright 2016, The Android Open Source Project
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
--->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Don't use roaming icon for considered operators -->
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>23201</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc232-mnc12/config.xml b/core/res/res/values-mcc232-mnc12/config.xml
deleted file mode 100644
index 91e37b4..0000000
--- a/core/res/res/values-mcc232-mnc12/config.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- ** Copyright 2016, The Android Open Source Project
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
--->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Don't use roaming icon for considered operators -->
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>23201</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc232-mnc13/config.xml b/core/res/res/values-mcc232-mnc13/config.xml
deleted file mode 100644
index 2c14f87..0000000
--- a/core/res/res/values-mcc232-mnc13/config.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- ** Copyright 2016, The Android Open Source Project
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
--->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Don't use roaming icon for considered operators -->
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>23203</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc234-mnc08/config.xml b/core/res/res/values-mcc234-mnc08/config.xml
deleted file mode 100644
index 13d4d8f..0000000
--- a/core/res/res/values-mcc234-mnc08/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2014, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Don't use roaming icon for considered operators -->
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>23430</item>
- <item>23433</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc234-mnc10/config.xml b/core/res/res/values-mcc234-mnc10/config.xml
deleted file mode 100644
index b704d3f..0000000
--- a/core/res/res/values-mcc234-mnc10/config.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2013, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>23420</item>
- <item>23426</item>
- <item>23430</item>
- <item>23431</item>
- <item>23432</item>
- <item>23433</item>
- <item>23434</item>
- <item>23486</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc234-mnc20/config.xml b/core/res/res/values-mcc234-mnc20/config.xml
index 27c91d2..1e4bb0b 100644
--- a/core/res/res/values-mcc234-mnc20/config.xml
+++ b/core/res/res/values-mcc234-mnc20/config.xml
@@ -32,15 +32,4 @@
<!-- Configure mobile network MTU. Carrier specific value is set here.
-->
<integer name="config_mobile_mtu">1440</integer>
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>23410</item>
- <item>23426</item>
- <item>23430</item>
- <item>23431</item>
- <item>23432</item>
- <item>23433</item>
- <item>23434</item>
- <item>23486</item>
- </string-array>
-
</resources>
diff --git a/core/res/res/values-mcc234-mnc26/config.xml b/core/res/res/values-mcc234-mnc26/config.xml
deleted file mode 100644
index 8d259de..0000000
--- a/core/res/res/values-mcc234-mnc26/config.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2013, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>23410</item>
- <item>23420</item>
- <item>23430</item>
- <item>23431</item>
- <item>23432</item>
- <item>23433</item>
- <item>23434</item>
- <item>23486</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc234-mnc30/config.xml b/core/res/res/values-mcc234-mnc30/config.xml
deleted file mode 100644
index eabdf9a..0000000
--- a/core/res/res/values-mcc234-mnc30/config.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2013, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Don't use roaming icon for considered operators -->
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>23430</item>
- <item>23431</item>
- <item>23432</item>
- <item>23433</item>
- <item>23434</item>
- <item>23486</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc234-mnc31/config.xml b/core/res/res/values-mcc234-mnc31/config.xml
deleted file mode 100644
index eabdf9a..0000000
--- a/core/res/res/values-mcc234-mnc31/config.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2013, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Don't use roaming icon for considered operators -->
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>23430</item>
- <item>23431</item>
- <item>23432</item>
- <item>23433</item>
- <item>23434</item>
- <item>23486</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc234-mnc32/config.xml b/core/res/res/values-mcc234-mnc32/config.xml
deleted file mode 100644
index eabdf9a..0000000
--- a/core/res/res/values-mcc234-mnc32/config.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2013, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Don't use roaming icon for considered operators -->
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>23430</item>
- <item>23431</item>
- <item>23432</item>
- <item>23433</item>
- <item>23434</item>
- <item>23486</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc234-mnc33/config.xml b/core/res/res/values-mcc234-mnc33/config.xml
deleted file mode 100644
index 776b570..0000000
--- a/core/res/res/values-mcc234-mnc33/config.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2009, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. Do not translate. -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Don't use roaming icon for considered operators -->
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>23430</item>
- <item>23431</item>
- <item>23432</item>
- <item>23433</item>
- <item>23434</item>
- <item>23486</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc234-mnc34/config.xml b/core/res/res/values-mcc234-mnc34/config.xml
deleted file mode 100644
index eabdf9a..0000000
--- a/core/res/res/values-mcc234-mnc34/config.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2013, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Don't use roaming icon for considered operators -->
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>23430</item>
- <item>23431</item>
- <item>23432</item>
- <item>23433</item>
- <item>23434</item>
- <item>23486</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc234-mnc86/config.xml b/core/res/res/values-mcc234-mnc86/config.xml
deleted file mode 100644
index eabdf9a..0000000
--- a/core/res/res/values-mcc234-mnc86/config.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2013, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Don't use roaming icon for considered operators -->
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>23430</item>
- <item>23431</item>
- <item>23432</item>
- <item>23433</item>
- <item>23434</item>
- <item>23486</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc302-mnc370/config.xml b/core/res/res/values-mcc302-mnc370/config.xml
index f3ae851..1241a9d 100644
--- a/core/res/res/values-mcc302-mnc370/config.xml
+++ b/core/res/res/values-mcc302-mnc370/config.xml
@@ -35,15 +35,7 @@
-->
<integer name="config_mobile_mtu">1410</integer>
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>302220</item>
- <item>302610</item>
- <item>302660</item>
- <item>302720</item>
- <item>302780</item>
- </string-array>
-
- <!-- Values for GPS configuration (Rogers) -->
+ <!-- Values for GPS configuration (Rogers) -->
<string-array translatable="false" name="config_gpsParameters">
<item>SUPL_HOST=supl.google.com</item>
<item>SUPL_PORT=7275</item>
diff --git a/core/res/res/values-mcc302-mnc500/config.xml b/core/res/res/values-mcc302-mnc500/config.xml
deleted file mode 100644
index 77f6419..0000000
--- a/core/res/res/values-mcc302-mnc500/config.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- ** Copyright 2016, The Android Open Source Project
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
--->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Don't use roaming icon for considered operators -->
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>302</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc302-mnc510/config.xml b/core/res/res/values-mcc302-mnc510/config.xml
deleted file mode 100644
index 77f6419..0000000
--- a/core/res/res/values-mcc302-mnc510/config.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- ** Copyright 2016, The Android Open Source Project
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
--->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Don't use roaming icon for considered operators -->
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>302</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc302-mnc610/config.xml b/core/res/res/values-mcc302-mnc610/config.xml
index 44dbdf7..232f149 100644
--- a/core/res/res/values-mcc302-mnc610/config.xml
+++ b/core/res/res/values-mcc302-mnc610/config.xml
@@ -18,11 +18,6 @@
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Don't use roaming icon for considered operators -->
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>302</item>
- </string-array>
-
<!-- Configure mobile network MTU. Carrier specific value is set here.
-->
<integer name="config_mobile_mtu">1428</integer>
diff --git a/core/res/res/values-mcc302-mnc640/config.xml b/core/res/res/values-mcc302-mnc640/config.xml
index f6b2b4d..1d2e625 100644
--- a/core/res/res/values-mcc302-mnc640/config.xml
+++ b/core/res/res/values-mcc302-mnc640/config.xml
@@ -18,11 +18,6 @@
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Don't use roaming icon for considered operators -->
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>302</item>
- </string-array>
-
<!-- Values for GPS configuration (Bell) -->
<string-array translatable="false" name="config_gpsParameters">
<item>SUPL_HOST=supl.google.com</item>
diff --git a/core/res/res/values-mcc302-mnc660/config.xml b/core/res/res/values-mcc302-mnc660/config.xml
index c689d22..8c2e702 100644
--- a/core/res/res/values-mcc302-mnc660/config.xml
+++ b/core/res/res/values-mcc302-mnc660/config.xml
@@ -43,12 +43,4 @@
-->
<integer name="config_mobile_mtu">1430</integer>
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>302220</item>
- <item>302370</item>
- <item>302610</item>
- <item>302720</item>
- <item>302780</item>
- </string-array>
-
</resources>
diff --git a/core/res/res/values-mcc302-mnc720/config.xml b/core/res/res/values-mcc302-mnc720/config.xml
index 0b8c778..ef1ecd2 100644
--- a/core/res/res/values-mcc302-mnc720/config.xml
+++ b/core/res/res/values-mcc302-mnc720/config.xml
@@ -37,15 +37,7 @@
-->
<integer name="config_mobile_mtu">1430</integer>
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>302220</item>
- <item>302370</item>
- <item>302610</item>
- <item>302660</item>
- <item>302780</item>
- </string-array>
-
- <!-- Values for GPS configuration (Rogers) -->
+ <!-- Values for GPS configuration (Rogers) -->
<string-array translatable="false" name="config_gpsParameters">
<item>SUPL_HOST=supl.google.com</item>
<item>SUPL_PORT=7275</item>
diff --git a/core/res/res/values-mcc302-mnc780/config.xml b/core/res/res/values-mcc302-mnc780/config.xml
index a48f695..d300dab 100644
--- a/core/res/res/values-mcc302-mnc780/config.xml
+++ b/core/res/res/values-mcc302-mnc780/config.xml
@@ -20,12 +20,6 @@
<!-- These resources are around just to allow their values to be customized
for different hardware and product builds. -->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-
- <!-- Don't use roaming icon for considered operators -->
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>302</item>
- </string-array>
-
<!-- Configure mobile network MTU. Carrier specific value is set here.
-->
<integer name="config_mobile_mtu">1358</integer>
diff --git a/core/res/res/values-mcc310-mnc150/config.xml b/core/res/res/values-mcc310-mnc150/config.xml
index e1f696e..e7d1325 100644
--- a/core/res/res/values-mcc310-mnc150/config.xml
+++ b/core/res/res/values-mcc310-mnc150/config.xml
@@ -18,23 +18,6 @@
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Show roaming icon though same named operators. -->
- <string-array translatable="false" name="config_sameNamedOperatorConsideredRoaming">
- <item>310110</item>
- <item>310140</item>
- <item>310400</item>
- <item>310470</item>
- <item>311170</item>
- </string-array>
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>310</item>
- <item>311</item>
- <item>312</item>
- <item>313</item>
- <item>314</item>
- <item>315</item>
- <item>316</item>
- </string-array>
<string-array translatable="false" name="config_twoDigitNumberPattern">
<item>"0"</item>
<item>"00"</item>
diff --git a/core/res/res/values-mcc310-mnc410/config.xml b/core/res/res/values-mcc310-mnc410/config.xml
index 9accdf0..00ab712 100644
--- a/core/res/res/values-mcc310-mnc410/config.xml
+++ b/core/res/res/values-mcc310-mnc410/config.xml
@@ -20,28 +20,9 @@
<!-- These resources are around just to allow their values to be customized
for different hardware and product builds. -->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-
<!-- Configure mobile network MTU. Carrier specific value is set here.
-->
<integer name="config_mobile_mtu">1410</integer>
- <!-- Show roaming icon though same named operators. -->
- <string-array translatable="false" name="config_sameNamedOperatorConsideredRoaming">
- <item>310110</item>
- <item>310140</item>
- <item>310400</item>
- <item>310470</item>
- <item>311170</item>
- </string-array>
-
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>310</item>
- <item>311</item>
- <item>312</item>
- <item>313</item>
- <item>314</item>
- <item>315</item>
- <item>316</item>
- </string-array>
<!-- Do not translate. Defines the slots is Two Digit Number for dialing normally not USSD -->
<string-array name="config_twoDigitNumberPattern">
<item>"0"</item>
diff --git a/core/res/res/values-mcc340-mnc01/config.xml b/core/res/res/values-mcc340-mnc01/config.xml
index cfc1380..1ca8963 100644
--- a/core/res/res/values-mcc340-mnc01/config.xml
+++ b/core/res/res/values-mcc340-mnc01/config.xml
@@ -38,10 +38,4 @@
<string-array translatable="false" name="config_tether_apndata">
<item>Orangeweb,orangeweb,,,orange,orange,,,,,340,01,1,DUN</item>
</string-array>
-
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>20801</item>
- <item>20815</item>
- </string-array>
-
</resources>
diff --git a/core/res/res/values-mcc404/config.xml b/core/res/res/values-mcc404/config.xml
index d6655f2..4cadef7 100644
--- a/core/res/res/values-mcc404/config.xml
+++ b/core/res/res/values-mcc404/config.xml
@@ -18,11 +18,6 @@
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Show roaming icon though same named operators. -->
- <string-array translatable="false" name="config_sameNamedOperatorConsideredRoaming">
- <item>404</item>
- <item>405</item>
- </string-array>
<!-- Whether camera shutter sound is forced or not (country specific). -->
<bool name="config_camera_sound_forced">true</bool>
<!-- Show area update info settings in CellBroadcastReceiver and information in SIM status in Settings app -->
diff --git a/core/res/res/values-mcc405/config.xml b/core/res/res/values-mcc405/config.xml
index 17539d8..6b77e9c 100644
--- a/core/res/res/values-mcc405/config.xml
+++ b/core/res/res/values-mcc405/config.xml
@@ -18,11 +18,6 @@
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Show roaming icon though same named operators. -->
- <string-array translatable="false" name="config_sameNamedOperatorConsideredRoaming">
- <item>404</item>
- <item>405</item>
- </string-array>
<!-- Whether camera shutter sound is forced or not (country specific). -->
<bool name="config_camera_sound_forced">true</bool>
</resources>
diff --git a/core/res/res/values-mcc425-mnc07/config.xml b/core/res/res/values-mcc425-mnc07/config.xml
index a092fb9..770cebd 100644
--- a/core/res/res/values-mcc425-mnc07/config.xml
+++ b/core/res/res/values-mcc425-mnc07/config.xml
@@ -39,9 +39,4 @@
<string-array translatable="false" name="config_tether_apndata">
<item>PC HOT mobile,pc.hotm,,,,,,,,,425,07,,DUN</item>
</string-array>
-
- <!-- Don't use roaming icon for considered operators -->
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>42503</item>
- </string-array>
</resources>
diff --git a/core/res/res/values-mcc425-mnc08/config.xml b/core/res/res/values-mcc425-mnc08/config.xml
deleted file mode 100644
index 8470b86..0000000
--- a/core/res/res/values-mcc425-mnc08/config.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2013, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Don't use roaming icon for considered operators -->
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>42502</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc510-mnc21/config.xml b/core/res/res/values-mcc510-mnc21/config.xml
deleted file mode 100644
index 1fd9dfa..0000000
--- a/core/res/res/values-mcc510-mnc21/config.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2013, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Don't use roaming icon for considered operators -->
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>51001</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc520/config.xml b/core/res/res/values-mcc520/config.xml
deleted file mode 100644
index b2f3efa..0000000
--- a/core/res/res/values-mcc520/config.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2013, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Show roaming icon though same named operators. -->
- <string-array translatable="false" name="config_sameNamedOperatorConsideredRoaming">
- <item>520</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc530-mnc24/config.xml b/core/res/res/values-mcc530-mnc24/config.xml
deleted file mode 100644
index 5598e8d..0000000
--- a/core/res/res/values-mcc530-mnc24/config.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2013, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Show roaming icon though same named operators. -->
- <string-array translatable="false" name="config_sameNamedOperatorConsideredRoaming">
- <item>53001</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc722-mnc36/config.xml b/core/res/res/values-mcc722-mnc36/config.xml
deleted file mode 100644
index daf5373..0000000
--- a/core/res/res/values-mcc722-mnc36/config.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2016, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You my obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Don't use roaming icon for considered operators -->
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>72234</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc730-mnc01/config.xml b/core/res/res/values-mcc730-mnc01/config.xml
deleted file mode 100644
index 22f4027..0000000
--- a/core/res/res/values-mcc730-mnc01/config.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2015, 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 my obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Don't use roaming icon for considered operators -->
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>73010</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc730-mnc07/config.xml b/core/res/res/values-mcc730-mnc07/config.xml
deleted file mode 100644
index 836ddf9..0000000
--- a/core/res/res/values-mcc730-mnc07/config.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2015, 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 my obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Don't use roaming icon for considered operators -->
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>73002</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc730-mnc08/config.xml b/core/res/res/values-mcc730-mnc08/config.xml
deleted file mode 100644
index 836ddf9..0000000
--- a/core/res/res/values-mcc730-mnc08/config.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2015, 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 my obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Don't use roaming icon for considered operators -->
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>73002</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mcc730-mnc10/config.xml b/core/res/res/values-mcc730-mnc10/config.xml
deleted file mode 100644
index 58b7d78..0000000
--- a/core/res/res/values-mcc730-mnc10/config.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2015, 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 my obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Don't use roaming icon for considered operators -->
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- <item>73001</item>
- </string-array>
-</resources>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index db3f88c..920f960 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"Б"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"КБ"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"МБ"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"ГБ"</string>
- <string name="terabyteShort" msgid="231613018159186962">"ТБ"</string>
<string name="petabyteShort" msgid="5637816680144990219">"ПБ"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> дена"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ден <xliff:g id="HOURS">%2$d</xliff:g> ч."</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ден <xliff:g id="HOURS">%2$d</xliff:g> ч."</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ч."</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ч. <xliff:g id="MINUTES">%2$d</xliff:g> мин."</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ч. <xliff:g id="MINUTES">%2$d</xliff:g> мин."</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> мин."</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> мин."</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> мин. <xliff:g id="SECONDS">%2$d</xliff:g> с."</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> мин. <xliff:g id="SECONDS">%2$d</xliff:g> с."</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> сек."</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> сек."</string>
<string name="untitled" msgid="4638956954852782576">"<Без наслов>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Нема телефонски број)"</string>
<string name="unknownName" msgid="6867811765370350269">"Непознато"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Нема услуга за говорни/итни повици"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Привремено не се нуди од мобилната мрежа на вашата локација"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Не може да се дојде до мрежата"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"За подобрување на приемот, обидете се да го промените избраниот тип во: Систем > Мрежа и интернет > Мобилни мрежи > Претпочитан тип мрежа."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"За подобрување на приемот, обидете се да го промените избраниот тип во „Поставки > Мрежа и интернет > Мобилни мрежи > Претпочитан тип мрежа“."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Предупредувања"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Проследување повик"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Режим на итен повратен повик"</string>
@@ -1784,4 +1768,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"Не е обезбедена SIM-картичка"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"Не е дозволена SIM-картичка"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Не е дозволен телефон"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Појавен прозорец"</string>
</resources>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index 7b5f54d..843262d 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ദിവസം"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ദിവസം <xliff:g id="HOURS">%2$d</xliff:g> മണിക്കൂർ"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ദിവസം <xliff:g id="HOURS">%2$d</xliff:g> മണിക്കൂർ"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> മണിക്കൂർ"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> മണിക്കൂർ <xliff:g id="MINUTES">%2$d</xliff:g> മിനിറ്റ്"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> മണിക്കൂർ <xliff:g id="MINUTES">%2$d</xliff:g> മിനിറ്റ്"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> മിനിറ്റ്"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> മി."</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> മിനിറ്റ് <xliff:g id="SECONDS">%2$d</xliff:g> സെക്കൻഡ്"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> മിനിറ്റ് <xliff:g id="SECONDS">%2$d</xliff:g> സെക്കൻഡ്"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> സെക്കൻഡ്"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> സെക്കൻഡ്"</string>
<string name="untitled" msgid="4638956954852782576">"<ശീർഷകമില്ലാത്ത>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(ഫോൺ നമ്പറില്ല)"</string>
<string name="unknownName" msgid="6867811765370350269">"അജ്ഞാതം"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"വോയ്സ്/അടിയന്തിര സേവനമില്ല"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"നിങ്ങളുടെ ലൊക്കേഷനിൽ മൊബൈൽ നെറ്റ്വര്ക്ക് താൽക്കാലികമായി ലഭ്യമല്ല"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"നെറ്റ്വർക്കിലേക്ക് കണക്റ്റുചെയ്യാനാവുന്നില്ല"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"സ്വീകരണം മെച്ചപ്പെടുത്തുന്നതിന് സിസ്റ്റം > നെറ്റ്വർക്കും ഇന്റർനെറ്റും > മൊബൈൽ നെറ്റ്വർക്കുകൾ > തിരഞ്ഞെടുത്ത നെറ്റ്വർക്ക് തരം എന്നതിൽ തിരഞ്ഞെടുത്തിരിക്കുന്ന തരം മാറ്റിക്കൊണ്ട് ശ്രമിച്ചുനോക്കുക."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"സ്വീകരണം മെച്ചപ്പെടുത്തുന്നതിന് സിസ്റ്റം > നെറ്റ്വർക്കും ഇന്റെർനെറ്റും > മൊബൈൽ നെറ്റ്വർക്കുകൾ > തിരഞ്ഞെടുത്ത നെറ്റ്വർക്ക് തരം എന്നതിൽ തിരഞ്ഞെടുത്തിരിക്കുന്ന തരം മാറ്റിക്കൊണ്ട് ശ്രമിച്ചുനോക്കുക."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"അലേർട്ടുകൾ"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"കോൾ ഫോർവേഡിംഗ്"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"അടിയന്തര കോൾബാക്ക് മോഡ്"</string>
@@ -1782,4 +1766,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM പ്രൊവിഷൻ ചെയ്തിട്ടില്ല"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM അനുവദനീയമല്ല"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"ഫോൺ അനുവദനീയമല്ല"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"പോപ്പ് അപ്പ് വിൻഡോ"</string>
</resources>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index 61e4039..ed9863c 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"килобайт"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"МБ"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"ГБ"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TБ"</string>
<string name="petabyteShort" msgid="5637816680144990219">"ПБ"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> өдөр"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> өдөр <xliff:g id="HOURS">%2$d</xliff:g> цаг"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> өдөр <xliff:g id="HOURS">%2$d</xliff:g> цаг"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> цаг"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> цаг <xliff:g id="MINUTES">%2$d</xliff:g> минут"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> цаг <xliff:g id="MINUTES">%2$d</xliff:g> мин"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> мин"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> минут"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> мин <xliff:g id="SECONDS">%2$d</xliff:g> секунд"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> мин <xliff:g id="SECONDS">%2$d</xliff:g> сек"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> сек"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> сек"</string>
<string name="untitled" msgid="4638956954852782576">"<Гарчиггүй>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Утасны дугаар байхгүй)"</string>
<string name="unknownName" msgid="6867811765370350269">"Тодорхойгүй"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Дуу хоолой/яаралтай үйлчилгээ алга"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Таны байршилд таны мобайл сүлжээнээс түр хугацаанд блоклосон"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Сүлжээнд холбогдох боломжгүй байна"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Хүлээн авалтыг сайжруулахын тулд систем, сүлжээ, интернэт, мобайл сүлжээнд сонгосон сүлжээний төрлийг өөрчилнө үү."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Хүлээн авалтыг сайжруулахын тулд Тохиргоо > Сүлжээ & Интернэт > Мобайл сүлжээ > Сонгосон сүлжээний төрөл хэсгийг сонгон төрлөө өөрчилнө үү."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Сануулга"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Дуудлага шилжүүлэх"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Яаралтай дуудлага хийх горим"</string>
@@ -1779,4 +1763,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM-г хийгээгүй"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM боломжгүй"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Утас боломжгүй"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"гэнэт гарч ирэх цонх"</string>
</resources>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index 9bfa6d8..8fd7fe4 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> दिवस"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> दिवस <xliff:g id="HOURS">%2$d</xliff:g> तास"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> दिवस <xliff:g id="HOURS">%2$d</xliff:g> तास"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> तास"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ता <xliff:g id="MINUTES">%2$d</xliff:g> मि"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ता <xliff:g id="MINUTES">%2$d</xliff:g> मि"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> मिनिटे"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> मिनिट"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> मि <xliff:g id="SECONDS">%2$d</xliff:g> से"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> मि <xliff:g id="SECONDS">%2$d</xliff:g> से"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> सेकंद"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> सेकंद"</string>
<string name="untitled" msgid="4638956954852782576">"<अशीर्षकांकित>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(कोणताही फोन नंबर नाही)"</string>
<string name="unknownName" msgid="6867811765370350269">"अज्ञात"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"व्हॉइस/आणीबाणी सेवा नाही"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"तुम्ही असलेल्या स्थानी मोबाइल नेटवर्क तात्पुरते उपलब्ध नाही"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"नेटवर्कवर पोहोचूू शकत नाही"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"रिसेप्शन सुधारण्यासाठी प्रणाली > नेटवर्क आणि इंटरनेट > मोबाइल नेटवर्क > प्राधान्य दिलेला नेटवर्क प्रकार येथे निवडलेला प्रकार बदलून पहा."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"रिसेप्शन सुधारण्यासाठी, सोटिंग्ज > नेटवर्क आणि इंटरनेट > मोबाइल नेटवर्क > प्राधान्य दिलेला नेटवर्क प्रकार बदलून पहा."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"अलर्ट"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"कॉल फॉरवर्डिंग"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"इमर्जन्सी कॉलबॅक मोड"</string>
@@ -1782,4 +1766,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"सिमसाठी तरतूद नाही"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"सिमला अनुमती नाही"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"फोनला अनुमती नाही"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"पॉपअप विंडो"</string>
</resources>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index 6fc4786..e0c1147 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B."</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> hari"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> hari <xliff:g id="HOURS">%2$d</xliff:g> jam"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> hari <xliff:g id="HOURS">%2$d</xliff:g> jam"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> jam"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> jam <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> jam <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> minit"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> minit"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> saat"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> saat"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> saat"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> saat"</string>
<string name="untitled" msgid="4638956954852782576">"<Tidak bertajuk>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Tiada nombor telefon)"</string>
<string name="unknownName" msgid="6867811765370350269">"Tidak diketahui"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Tiada perkhidmatan suara/kecemasan"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Tidak ditawarkan oleh rangkaian mudah alih di lokasi anda untuk sementara waktu"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Tidak dapat mencapai rangkaian"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Untuk memperbaik penerimaan, cuba tukar jenis rangkaian yang dipilih di Sistem > Rangkaian & Internet > Rangkaian mudah alih > Jenis rangkaian pilihan."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Untuk memperbaik penerimaan, cuba tukar jenis rangkaian yang dipilih di Tetapan > Rangkaian & Internet > Rangkaian mudah alih > Jenis rangkaian pilihan."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Makluman"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Pemajuan panggilan"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Mod paggil balik kecemasan"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM tidak diperuntukkan"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM tidak dibenarkan"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Telefon tidak dibenarkan"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Tetingkap Timbul"</string>
</resources>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index aa1d6ec..e7eb060 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ရက်"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ရက် <xliff:g id="HOURS">%2$d</xliff:g> နာရီ"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ရက်<xliff:g id="HOURS">%2$d</xliff:g> နာရီ"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> နာရီ"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> နာရီ <xliff:g id="MINUTES">%2$d</xliff:g> မိနစ်"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> နာရီ <xliff:g id="MINUTES">%2$d</xliff:g> မိနစ်"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> မိနစ်"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> မိနစ်"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> မိနစ် <xliff:g id="SECONDS">%2$d</xliff:g> စက္ကန့်"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> မိနစ် <xliff:g id="SECONDS">%2$d</xliff:g> စက္ကန့်"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> စက္ကန့်"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> စက္ကန့်"</string>
<string name="untitled" msgid="4638956954852782576">"<ခေါင်းစဉ်မဲ့>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(ဖုန်းနံပါတ်မရှိပါ)"</string>
<string name="unknownName" msgid="6867811765370350269">"မသိရ"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"ဖုန်း/အရေးပေါ် ဝန်ဆောင်မှုများမရရှိနိုင်ပါ"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"သင်၏ ဒေသတွင် မိုဘိုင်းကွန်ရက် ယာယီမရရှိနိုင်ပါ"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"ကွန်ရက်ကို ချိတ်ဆက်၍မရပါ"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"လိုင်းဖမ်းယူမှု ကောင်းမွန်စေရန် စနစ် > ကွန်ရက်နှင့် အင်တာနက် > မိုဘိုင်းကွန်ရက်များ > အသုံးပြုလိုသည့် ကွန်ရက်အမျိုးအစားတွင် ရွေးချယ်ထားသည့် အမျိုးအစားကို ပြောင်းကြည့်ပါ။"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"လိုင်းဖမ်းယူမှု ကောင်းမွန်စေရန် ဆက်တင်များ > ကွန်ရက်နှင့် အင်တာနက် > မိုဘိုင်းကွန်ရက်များ > အသုံးပြုလိုသည့် ကွန်ရက်အမျိုးအစားတွင် ရွေးချယ်ထားသည့် အမျိုးအစားကို ပြောင်းကြည့်ပါ။"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"သတိပေးချက်များ"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"အဝင်ခေါ်ဆိုမှုအား ထပ်ဆင့်ပို့ခြင်း"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"အရေးပေါ် ပြန်လည်ခေါ်ဆိုနိုင်သောမုဒ်"</string>
@@ -1782,4 +1766,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"ဆင်းမ်ကို ထောက်ပံ့မထားပါ"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"ဆင်းမ်ကို ခွင့်မပြုပါ"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"ဖုန်းကို ခွင့်မပြုပါ"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"ပေါ့ပ်အပ် ဝင်းဒိုး"</string>
</resources>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index b5272b2..4548b0b 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dager"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> t"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> t"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> t"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> t <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> t <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sek"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sek"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sek"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sek"</string>
<string name="untitled" msgid="4638956954852782576">"<Uten navn>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Mangler telefonnummer)"</string>
<string name="unknownName" msgid="6867811765370350269">"Ukjent"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Ingen tale-/nødtjeneste"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Tilbys midlertidig ikke gjennom mobilnettverket der du er"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Får ikke kontakt med nettverket"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"For å forbedre signalet, prøv å endre valgt nettverkstype i System > Nettverk og Internett > Mobilnettverk > Foretrukket nettverkstype."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"For å forbedre signalet, prøv å endre valgt nettverkstype i Innstillinger > Nettverk og Internett > Mobilnettverk > Foretrukket nettverkstype."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Varsler"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Viderekobling"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modusen nødsamtale-tilbakeringing"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM-kortet er ikke klargjort"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM-kortet er ikke tillatt"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Telefonen er ikke tillatt"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Forgrunnsvindu"</string>
</resources>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index cf5cb10..3ac8c37 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"के.बि."</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> दिन"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> दिन<xliff:g id="HOURS">%2$d</xliff:g> घन्टा"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> दिन<xliff:g id="HOURS">%2$d</xliff:g> घन्टा"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> घन्टा"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> घन्टा <xliff:g id="MINUTES">%2$d</xliff:g> मि"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> घन्टा <xliff:g id="MINUTES">%2$d</xliff:g> मिनेट"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> मिनेट"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> मिनेट"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> मिनेट <xliff:g id="SECONDS">%2$d</xliff:g> से"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> मिनेट <xliff:g id="SECONDS">%2$d</xliff:g> से"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> सेकेन्ड"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> सेकेन्ड"</string>
<string name="untitled" msgid="4638956954852782576">"<बिना शीर्षक>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(कुनै फोन नम्बर छैन)"</string>
<string name="unknownName" msgid="6867811765370350269">"अज्ञात"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"कुनै पनि भ्वाइस/आपतकालीन सेवा उपलब्ध छैन"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"तपाईंको स्थानमा सञ्चालन भइरहेको मोबाइल नेटवर्कले अस्थायी रूपमा यो सुविधा प्रदान गर्दैन"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"नेटवर्कमाथि पहुँच राख्न सकिँदैन"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"रिसेप्सनमा सुधार गर्न, प्रणाली > नेटवर्क र इन्टरनेट > मोबाइल नेटवर्कहरू > रुचाइएको नेटवर्कको प्रकार मा गएर चयन गरिएको प्रकार परिवर्तन गरी हेर्नुहोस्।"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"रिसेप्सनमा सुधार गर्न प्रणालीहरू > नेटवर्क तथा इन्टरनेट > मोबाइल नेटवर्कहरू > रुचाइएको नेटवर्कको प्रकारमा गई चयन गरिएको प्रकार परिवर्तन गरी हेर्नुहोस्।"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"अलर्टहरू"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"कल फर्वार्ड गर्ने सेवा"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"आपतकालीन कलब्याक मोड"</string>
@@ -1787,4 +1771,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM को प्रावधान छैन"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM लाई अनुमति छैन"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"फोनलाई अनुमति छैन"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"पपअप विन्डो"</string>
</resources>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 53c3303..c4adc03b 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">" KB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dagen"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> uur"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> uur"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> uur"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> uur <xliff:g id="MINUTES">%2$d</xliff:g> min."</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> uur <xliff:g id="MINUTES">%2$d</xliff:g> min."</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> minuten"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min."</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sec"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sec"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> seconden"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> seconde"</string>
<string name="untitled" msgid="4638956954852782576">"<Naamloos>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Geen telefoonnummer)"</string>
<string name="unknownName" msgid="6867811765370350269">"Onbekend"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Geen service voor spraak-/noodoproepen"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Tijdelijk niet aangeboden door het mobiele netwerk op je locatie"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Kan netwerk niet bereiken"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Als je de ontvangst wilt verbeteren, kun je het netwerktype wijzigen dat is geselecteerd bij Systeem > Netwerk en internet > Mobiele netwerken > Voorkeursnetwerktype."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Als je de ontvangst wilt verbeteren, kun je het netwerktype wijzigen dat is geselecteerd bij Instellingen > Netwerk en internet > Mobiele netwerken > Voorkeursnetwerktype."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Meldingen"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Oproep doorschakelen"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modus voor noodoproepen"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"Simkaart niet geregistreerd"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"Simkaart niet toegestaan"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Telefoon niet toegestaan"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Pop-upvenster"</string>
</resources>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index 403955f..3adba7b 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ਦਿਨ"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ਦਿਨ <xliff:g id="HOURS">%2$d</xliff:g> ਘੰਟੇ"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ਦਿਨ <xliff:g id="HOURS">%2$d</xliff:g> ਘੰਟਾ"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ਘੰਟੇ"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ਘੰਟਾ <xliff:g id="MINUTES">%2$d</xliff:g> ਮਿੰਟ"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ਘੰਟਾ <xliff:g id="MINUTES">%2$d</xliff:g> ਮਿੰਟ"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> ਮਿੰਟ"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> ਮਿੰਟ"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> ਮਿੰਟ <xliff:g id="SECONDS">%2$d</xliff:g> ਸਕਿੰਟ"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> ਮਿੰਟ <xliff:g id="SECONDS">%2$d</xliff:g> ਸਕਿੰਟ"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> ਸਕਿੰਟ"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> ਸਕਿੰਟ"</string>
<string name="untitled" msgid="4638956954852782576">"<ਬਿਨਾਂ ਸਿਰਲੇਖ>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(ਕੋਈ ਫ਼ੋਨ ਨੰਬਰ ਨਹੀਂ)"</string>
<string name="unknownName" msgid="6867811765370350269">"ਅਗਿਆਤ"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"ਕੋਈ ਆਵਾਜ਼ੀ/ਸੰਕਟਕਾਲੀਨ ਸੇਵਾ ਨਹੀਂ"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"ਤੁਹਾਡੇ ਟਿਕਾਣੇ \'ਤੇ ਅਸਥਾਈ ਤੌਰ \'ਤੇ ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ ਵੱਲੋਂ ਉਪਲਬਧ ਨਹੀਂ ਕਰਵਾਈ ਗਈ"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"ਨੈੱਟਵਰਕ ਤੱਕ ਪਹੁੰਚ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"ਸਿਗਨਲ ਪ੍ਰਾਪਤੀ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਲਈ, ਸਿਸਟਮ > ਨੈੱਟਵਰਕ ਅਤੇ ਇੰਟਰਨੈੱਟ > ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ > ਤਰਜੀਹੀ ਨੈੱਟਵਰਕ ਦੀ ਕਿਸਮ \'ਤੇ ਚੁਣੀ ਗਈ ਕਿਸਮ ਨੂੰ ਬਦਲਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"ਸਿਗਨਲ ਪ੍ਰਾਪਤੀ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਲਈ, ਸੈਟਿੰਗਾਂ > ਨੈੱਟਵਰਕ ਅਤੇ ਇੰਟਰਨੈੱਟ > ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ > ਤਰਜੀਹੀ ਨੈੱਟਵਰਕ ਦੀ ਕਿਸਮ \'ਤੇ ਜਾਓ ਅਤੇ ਚੁਣੀ ਗਈ ਕਿਸਮ ਨੂੰ ਬਦਲਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"ਸੁਚੇਤਨਾਵਾਂ"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"ਕਾਲ ਫਾਰਵਾਰਡਿੰਗ"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"ਸੰਕਟਕਾਲੀਨ ਕਾਲਬੈਕ ਮੋਡ"</string>
@@ -1782,4 +1766,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM ਦੀ ਵਿਵਸਥਾ ਨਹੀਂ ਹੈ"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"ਫ਼ੋਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"ਪੌਪਅੱਪ ਵਿੰਡੋ"</string>
</resources>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index c22f899..92ffc65 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"KB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dni"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dzień <xliff:g id="HOURS">%2$d</xliff:g> godz."</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dzień <xliff:g id="HOURS">%2$d</xliff:g> godz."</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> godz."</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> godz. <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> godz. <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
<string name="untitled" msgid="4638956954852782576">"<Bez nazwy>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Brak numeru telefonu)"</string>
<string name="unknownName" msgid="6867811765370350269">"Nieznana"</string>
@@ -97,7 +81,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Brak usługi połączeń głosowych/alarmowych"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Usługa tymczasowo nieoferowana przez sieć komórkową w Twojej lokalizacji"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Brak zasięgu sieci"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Aby poprawić odbiór, zmień typ sieci – wybierz System > Sieć i internet > Sieci komórkowe > Preferowany typ sieci."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Aby poprawić odbiór, zmień typ sieci: wybierz Ustawienia > Sieć i internet > Sieci komórkowe > Preferowany typ sieci."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alerty"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Przekierowanie połączeń"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Tryb alarmowego połączenia zwrotnego"</string>
@@ -1849,4 +1833,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"Nieobsługiwana karta SIM"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"Niedozwolona karta SIM"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Niedozwolony telefon"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Wyskakujące okienko"</string>
</resources>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index 2dd62d3..0d9e310 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"KB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dias"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dia <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dia <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> m"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
<string name="untitled" msgid="4638956954852782576">"<Sem título>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Nenhum número de telefone)"</string>
<string name="unknownName" msgid="6867811765370350269">"Desconhecido"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Sem serviço de voz/emergência"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Serviço temporariamente bloqueado pela rede móvel no seu local"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Não foi possível acessar a rede"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Para melhorar a recepção, tente alterar o tipo selecionado em Sistema > Rede & Internet > Redes móveis > Tipo de rede preferencial."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Para melhorar a recepção, tente alterar o tipo selecionado em Configurações > Rede & Internet > Redes móveis > Tipo de rede preferencial."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertas"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Encaminhamento de chamada"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modo de retorno de chamada de emergência"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM não aprovisionado"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM não permitido"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Smartphone não permitido"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Janela pop-up"</string>
</resources>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 136d777..91da103 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dias"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dia <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dia <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> horas"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min."</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> seg"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> seg"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> seg"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> seg"</string>
<string name="untitled" msgid="4638956954852782576">"<Sem nome>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Nenhum número de telefone)"</string>
<string name="unknownName" msgid="6867811765370350269">"Desconhecido"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Sem serviço de voz/emergência"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Serviço temporariamente não disponibilizado pela rede móvel na sua localização"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Não é possível ligar à rede"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Para melhorar a receção, experimente alterar o tipo selecionado em Sistema > Rede e Internet > Redes móveis > Tipo de rede preferido."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Para melhorar a receção, experimente alterar o tipo selecionado em Definições > Rede e Internet > Redes móveis > Tipo de rede preferido."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertas"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Reencaminhamento de chamadas"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modo de chamada de retorno de emergência"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM não ativado"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM não permitido"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Telemóvel não permitido"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Janela pop-up"</string>
</resources>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 2dd62d3..0d9e310 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"KB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dias"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dia <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dia <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> m"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
<string name="untitled" msgid="4638956954852782576">"<Sem título>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Nenhum número de telefone)"</string>
<string name="unknownName" msgid="6867811765370350269">"Desconhecido"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Sem serviço de voz/emergência"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Serviço temporariamente bloqueado pela rede móvel no seu local"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Não foi possível acessar a rede"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Para melhorar a recepção, tente alterar o tipo selecionado em Sistema > Rede & Internet > Redes móveis > Tipo de rede preferencial."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Para melhorar a recepção, tente alterar o tipo selecionado em Configurações > Rede & Internet > Redes móveis > Tipo de rede preferencial."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertas"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Encaminhamento de chamada"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modo de retorno de chamada de emergência"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM não aprovisionado"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM não permitido"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Smartphone não permitido"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Janela pop-up"</string>
</resources>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index a0c0fe7..73d1bc2 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TO"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PO"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> zile"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> zile <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> zi <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min."</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sec"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sec"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sec"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sec"</string>
<string name="untitled" msgid="4638956954852782576">"<Fără titlu>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Niciun număr de telefon)"</string>
<string name="unknownName" msgid="6867811765370350269">"Necunoscut"</string>
@@ -96,7 +80,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Fără servicii vocale/de urgență"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Momentan nu este oferit de rețeaua mobilă în locația dvs."</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Nu se poate stabili conexiunea la rețea"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Pentru o recepție mai bună, încercați să schimbați tipul selectat în Sistem > Rețea și internet > Rețele mobile > Tip preferat de rețea."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Pentru o recepție mai bună, încercați să schimbați tipul selectat în Setări > Rețea și internet > Rețele mobile > Tip preferat de rețea."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alerte"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Redirecționarea apelurilor"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Mod de apelare inversă de urgență"</string>
@@ -1815,4 +1799,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"Cardul SIM nu este activat"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"Cardul SIM nu este permis"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Telefonul nu este permis"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Fereastră pop-up"</string>
</resources>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index ae7ce06..58c981d 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"Б"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"КБ"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"МБ"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"ГБ"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TБ"</string>
<string name="petabyteShort" msgid="5637816680144990219">"ПБ"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> дн."</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> день <xliff:g id="HOURS">%2$d</xliff:g> ч."</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> день <xliff:g id="HOURS">%2$d</xliff:g> ч."</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ч."</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ч. <xliff:g id="MINUTES">%2$d</xliff:g> мин."</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ч. <xliff:g id="MINUTES">%2$d</xliff:g> мин."</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> мин."</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> мин."</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> мин. <xliff:g id="SECONDS">%2$d</xliff:g> с"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> мин. <xliff:g id="SECONDS">%2$d</xliff:g> с"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> с"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> с"</string>
<string name="untitled" msgid="4638956954852782576">"<Без названия>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Нет номера телефона)"</string>
<string name="unknownName" msgid="6867811765370350269">"Неизвестно"</string>
@@ -97,7 +81,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Голосовые и экстренные вызовы недоступны"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Местная мобильная сеть временно не поддерживает эту функцию."</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Сеть недоступна"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Чтобы улучшить сигнал, попробуйте выбрать другой тип сети в настройках (раздел \"Мобильные сети\")."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Чтобы улучшить сигнал, попробуйте выбрать другой тип сети в настройках (раздел \"Мобильные сети\")."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Оповещения"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Переадресация вызовов"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Режим экстренных обратных вызовов"</string>
@@ -1849,4 +1833,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM-карта не активирована"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"Использование SIM-карты запрещено"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Звонки запрещены"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Всплывающее окно"</string>
</resources>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index d519fb6..63d2d45 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"දින <xliff:g id="DAYS">%1$d</xliff:g>"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"දින <xliff:g id="DAYS">%1$d</xliff:g> පැය <xliff:g id="HOURS">%2$d</xliff:g>"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"දින <xliff:g id="DAYS">%1$d</xliff:g> පැය <xliff:g id="HOURS">%2$d</xliff:g>"</string>
- <string name="durationHours" msgid="4266858287167358988">"පැය <xliff:g id="HOURS">%1$d</xliff:g>"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"පැය <xliff:g id="HOURS">%1$d</xliff:g> මිනි <xliff:g id="MINUTES">%2$d</xliff:g>"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"පැය <xliff:g id="HOURS">%1$d</xliff:g> මිනි <xliff:g id="MINUTES">%2$d</xliff:g>"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"මිනි <xliff:g id="MINUTES">%1$d</xliff:g>"</string>
- <string name="durationMinute" msgid="7155301744174623818">"මිනිත්තු <xliff:g id="MINUTES">%1$d</xliff:g>"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"මිනි <xliff:g id="MINUTES">%1$d</xliff:g> තත් <xliff:g id="SECONDS">%2$d</xliff:g>"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"මිනි <xliff:g id="MINUTES">%1$d</xliff:g> තත් <xliff:g id="SECONDS">%2$d</xliff:g>"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"තත් <xliff:g id="SECONDS">%1$d</xliff:g>"</string>
- <string name="durationSecond" msgid="985669622276420331">"තත් <xliff:g id="SECONDS">%1$d</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"<නම් යොදා නැත>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(දුරකථන අංකයක් නොමැත)"</string>
<string name="unknownName" msgid="6867811765370350269">"නොදනී"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"හඬ/හදිසි සේවාව නොමැත"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"ඔබේ ස්ථානයේ ජංගම ජාලය මගින් තාවකාලිකව පිරිනොනමයි"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"ජාලය වෙත ළඟා විය නොහැකිය"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"ප්රතිග්රහණය වැඩි දියුණු කිරීමට, පද්ධතිය > ජාලය සහ අන්තර්ජාලය > ජංගම ජාල > වඩා කැමති ජාල වර්ගය තුළ තෝරන ලද වර්ගය වෙනස් කිරීම උත්සාහ කරන්න."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"ප්රතිග්රහණය වැඩි දියුණු කිරීමට, සැකසීම් > ජාලය සහ අන්තර්ජාලය > ජංගම ජාල > වඩා කැමති ජාල වර්ගය තුළ තෝරන ලද වර්ගය වෙනස් කිරීම උත්සාහ කරන්න."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"ඇඟවීම්"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"ඇමතුම ප්රතියොමු කිරීම"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"හදිසි අවස්ථා පසු ඇමතුම් ප්රකාරය"</string>
@@ -1783,4 +1767,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM එක සක්රීය කර නොමැත"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM එක සඳහා ඉඩ නොදේ"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"දුරකථනය සඳහා ඉඩ නොදේ"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"උත්පතන කවුළුව"</string>
</resources>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index a5849ea..7be4b20 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> d."</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> hod."</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> hod."</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> hod."</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> hod. <xliff:g id="MINUTES">%2$d</xliff:g> min."</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> hod. <xliff:g id="MINUTES">%2$d</xliff:g> min."</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min. <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min. <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
<string name="untitled" msgid="4638956954852782576">"<Bez mena>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(žiadne telefónne číslo)"</string>
<string name="unknownName" msgid="6867811765370350269">"Bez názvu"</string>
@@ -97,7 +81,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Hlasové ani tiesňové volania nie sú k dispozícii"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Momentálne nie sú v ponuke mobilnej siete na vašom mieste"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Nepodarilo sa pripojiť k sieti"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Ak chcete vylepšiť príjem, skúste zmeniť vybratý typ siete v časti Systém > Sieť a internet > Mobilné siete > Preferovaný typ siete."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Ak chcete vylepšiť príjem, skúste zmeniť vybraný typ v časti Nastavenia > Sieť a internet > Mobilné siete > Preferovaný typ siete."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Upozornenia"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Presmerovanie hovorov"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Režim tiesňového spätného volania"</string>
@@ -1849,4 +1833,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM karta nie je k dispozícii"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM karta je zakázaná"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Telefón je zakázaný"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Automaticky otvárané okno"</string>
</resources>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index c5c0df6..e0d05a7 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"KB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"Št. dni: <xliff:g id="DAYS">%1$d</xliff:g>"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dan <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dan <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
<string name="untitled" msgid="4638956954852782576">"<Brez naslova>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Ni telefonske številke)"</string>
<string name="unknownName" msgid="6867811765370350269">"Neznano"</string>
@@ -97,7 +81,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Ni storitve za glasovne klice / klice v sili"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Ta storitev trenutno ni na voljo v mobilnem omrežju na vaši lokaciji"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Povezave z omrežjem ni mogoče vzpostaviti"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Če želite izboljšati sprejem, poskusite zamenjati vrsto omrežja v možnostih »Sistem« > »Omrežje in internet« > »Mobilna omrežja« > »Prednostna vrsta omrežja«."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Če želite izboljšati sprejem, poskusite zamenjati vrsto omrežja v »Nastavitve« > »Omrežje in internet« > »Mobilna omrežja« > »Prednostna vrsta omrežja«."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Opozorila"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Preusmerjanje klicev"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Način za povratni klic v sili"</string>
@@ -1849,4 +1833,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"Kartica SIM ni omogočena za uporabo"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"Kartica SIM ni dovoljena"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Telefon ni dovoljen"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Pojavno okno"</string>
</resources>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index 9fe56c9..793bad9 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"terabajt"</string>
<string name="petabyteShort" msgid="5637816680144990219">"petabajt"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ditë"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ditë e <xliff:g id="HOURS">%2$d</xliff:g> orë"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ditë e <xliff:g id="HOURS">%2$d</xliff:g> orë"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> orë"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> orë e <xliff:g id="MINUTES">%2$d</xliff:g> minuta"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> orë e <xliff:g id="MINUTES">%2$d</xliff:g> minuta"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> minuta"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> minuta"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> minuta e <xliff:g id="SECONDS">%2$d</xliff:g> sekonda"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> minuta e <xliff:g id="SECONDS">%2$d</xliff:g> sekonda"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sekonda"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sekonda"</string>
<string name="untitled" msgid="4638956954852782576">"<Pa titull>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Nuk ka numër telefoni)"</string>
<string name="unknownName" msgid="6867811765370350269">"E panjohur"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Nuk ka shërbim zanor/urgjence"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Përkohësisht nuk ofrohet nga rrjeti celular në vendndodhjen tënde"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Rrjeti i paarritshëm"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Për të përmirësuar marrjen e sinjalit, provo të ndryshosh llojin e zgjedhur te Sistemi > Rrjeti dhe interneti > Lloji i preferuar i rrjetit."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Për të përmirësuar marrjen e sinjalit, provo të ndryshosh llojin e zgjedhur te Cilësimet > Rrjeti dhe interneti > Lloji i preferuar i rrjetit."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Sinjalizimet"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Transferimi i telefonatave"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modaliteti i \"Kthimit të telefonatës së urgjencës\""</string>
@@ -1782,4 +1766,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"Karta SIM nuk është dhënë"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"Karta SIM nuk lejohet"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Telefoni nuk lejohet"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Dritare kërcyese"</string>
</resources>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index a15737c..a9e3af9 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> дана"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> дан <xliff:g id="HOURS">%2$d</xliff:g> с"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> дан <xliff:g id="HOURS">%2$d</xliff:g> с"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> с"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> с <xliff:g id="MINUTES">%2$d</xliff:g> мин"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> с <xliff:g id="MINUTES">%2$d</xliff:g> мин"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> мин"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> мин"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> мин <xliff:g id="SECONDS">%2$d</xliff:g> сек"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> мин <xliff:g id="SECONDS">%2$d</xliff:g> сек"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> сек"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> сек"</string>
<string name="untitled" msgid="4638956954852782576">"<Без наслова>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Нема броја телефона)"</string>
<string name="unknownName" msgid="6867811765370350269">"Непознато"</string>
@@ -96,7 +80,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Нема гласовне услуге/услуге за хитне позиве"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Привремено је онемогућено на мобилној мрежи на вашој локацији"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Повезивање са мрежом није успело"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Да бисте побољшали пријем, пробајте да промените изабрани тип у одељку Систем > Мрежа и интернет > Мобилне мреже > Жељени тип мреже."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Да бисте побољшали пријем, пробајте да промените изабрани тип у одељку Подешавања > Мрежа и интернет > Мобилне мреже > Жељени тип мреже."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Обавештења"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Преусмеравање позива"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Режим за хитан повратни позив"</string>
@@ -1815,4 +1799,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM картица није подешена"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM картица није дозвољена"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Телефон није дозвољен"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Искачући прозор"</string>
</resources>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 9806118..72f9d6f 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dagar"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> tim"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> tim"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> timmar"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> tim <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> tim <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> minuter"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sek"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sek"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sekunder"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sekund"</string>
<string name="untitled" msgid="4638956954852782576">"<Okänd>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Inget telefonnummer)"</string>
<string name="unknownName" msgid="6867811765370350269">"Okänt"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Tjänster för röst- och nödsamtal har blockerats"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Detta erbjuds för tillfället inte på mobilnätverket där du befinner dig"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Det går inte att nå nätverket"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Testa om du får bättre mottagning genom att ändra till en annan typ under System > Nätverk och internet > Mobila nätverk > Önskad nätverkstyp."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Testa om du får bättre mottagning genom att ändra till en annan typ under Inställningar > Nätverk och internet > Mobila nätverk > Önskad nätverkstyp."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Aviseringar"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Vidarekoppla samtal"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Läget Återuppringning vid nödsamtal"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM-kort tillhandahålls inte"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM-kort tillåts inte"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Mobil tillåts inte"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"popup-fönster"</string>
</resources>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 2e0946b..1532b5b5 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"Siku <xliff:g id="DAYS">%1$d</xliff:g>"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"Siku <xliff:g id="DAYS">%1$d</xliff:g> saa <xliff:g id="HOURS">%2$d</xliff:g>"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"Siku <xliff:g id="DAYS">%1$d</xliff:g> saa <xliff:g id="HOURS">%2$d</xliff:g>"</string>
- <string name="durationHours" msgid="4266858287167358988">"Saa <xliff:g id="HOURS">%1$d</xliff:g>"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"Saa <xliff:g id="HOURS">%1$d</xliff:g> dak <xliff:g id="MINUTES">%2$d</xliff:g>"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"Saa <xliff:g id="HOURS">%1$d</xliff:g> dak <xliff:g id="MINUTES">%2$d</xliff:g>"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"Dakika <xliff:g id="MINUTES">%1$d</xliff:g>"</string>
- <string name="durationMinute" msgid="7155301744174623818">"Dak <xliff:g id="MINUTES">%1$d</xliff:g>"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"Dak <xliff:g id="MINUTES">%1$d</xliff:g> sek <xliff:g id="SECONDS">%2$d</xliff:g>"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"Dak <xliff:g id="MINUTES">%1$d</xliff:g> sek <xliff:g id="SECONDS">%2$d</xliff:g>"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"Sekunde <xliff:g id="SECONDS">%1$d</xliff:g>"</string>
- <string name="durationSecond" msgid="985669622276420331">"Sekunde <xliff:g id="SECONDS">%1$d</xliff:g>"</string>
<string name="untitled" msgid="4638956954852782576">"<Haina jina>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Hakuna nambari ya simu)"</string>
<string name="unknownName" msgid="6867811765370350269">"Isiyojulikana"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Hakuna huduma ya simu za dharura au za sauti"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Kwa sasa, huduma hii haipatikani katika mtandao wa simu mahali ulipo"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Haiwezi kufikia mtandao"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Ili kupata mtandao thabiti, jaribu kubadilisha aina iliyochaguliwa katika Mfumo > Mtandao na Intaneti > Mitandao ya simu > Aina ya mtandao unaopendelea."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Ili kupata mtandao thabiti, jaribu kubadilisha aina uliyochagua katika Mipangilio > Mtandao na Intaneti > Mitandao ya simu > Aina ya mtandao unaopendelea."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Arifa"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Kupeleka simu kwenye nambari nyingine"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Hali ya kupiga simu za dharura"</string>
@@ -1779,4 +1763,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM haikubaliwi"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM imekataliwa"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Simu imekataliwa"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Dirisha Ibukizi"</string>
</resources>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index d5cddcb..d348ba5 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"பை."</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"கி.பை."</string>
- <string name="megabyteShort" msgid="6355851576770428922">"மெ.பை."</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"ஜி.பை."</string>
- <string name="terabyteShort" msgid="231613018159186962">"டெ.பை."</string>
<string name="petabyteShort" msgid="5637816680144990219">"பெ.பை."</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> நாட்கள்"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> நாள் <xliff:g id="HOURS">%2$d</xliff:g> ம.நே."</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> நாள் <xliff:g id="HOURS">%2$d</xliff:g> ம.நே."</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ம.நே."</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ம.நே. <xliff:g id="MINUTES">%2$d</xliff:g> நிமி."</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> மநே <xliff:g id="MINUTES">%2$d</xliff:g> நிமி"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> நிமிடங்கள்"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> நிமி."</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> நிமி <xliff:g id="SECONDS">%2$d</xliff:g> வி"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> நிமி <xliff:g id="SECONDS">%2$d</xliff:g> வி"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> வினாடிகள்"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> வினாடி"</string>
<string name="untitled" msgid="4638956954852782576">"<பெயரிடப்படாதது>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(தொலைபேசி எண் இல்லை)"</string>
<string name="unknownName" msgid="6867811765370350269">"அறியப்படாதவர்"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"குரல்/அவசரச் சேவை இல்லை"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"தற்காலிகமாக உங்கள் இருப்பிடத்தில் மொபைல் நெட்வொர்க் வழங்கவில்லை"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"நெட்வொர்க்குடன் இணைக்க முடியவில்லை"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"பெறுதலை மேம்படுத்த, சாதனம் > நெட்வொர்க் & இணையம் > மொபைல் நெட்வொர்க்குகள் > விரும்பும் நெட்வொர்க் வகை என்பதற்குச் சென்று, தேர்ந்தெடுத்த வகையை மாற்றவும்."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"பெறுதலை மேம்படுத்த, அமைப்புகள் > நெட்வொர்க் & இணையம் > மொபைல் நெட்வொர்க்குகள் > விரும்பும் நெட்வொர்க் வகை என்பதற்குச் சென்று, தேர்ந்தெடுத்த வகையை மாற்றவும்."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"விழிப்பூட்டல்கள்"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"அழைப்புப் பகிர்வு"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"அவசரகாலத் திரும்ப அழைக்கும் பயன்முறை"</string>
@@ -1782,4 +1766,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"சிம் அமைக்கப்படவில்லை"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"சிம் அனுமதிக்கப்படவில்லை"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"ஃபோன் அனுமதிக்கப்படவில்லை"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"பாப்அப் சாளரம்"</string>
</resources>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index a522d6b..0e38833 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> రోజులు"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> రో <xliff:g id="HOURS">%2$d</xliff:g> గం"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> రో <xliff:g id="HOURS">%2$d</xliff:g> గం"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> గంటలు"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> గం <xliff:g id="MINUTES">%2$d</xliff:g> నిమి"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> గం <xliff:g id="MINUTES">%2$d</xliff:g> నిమి"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> నిమిషాలు"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> నిమి"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> నిమి <xliff:g id="SECONDS">%2$d</xliff:g> సె"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> నిమి <xliff:g id="SECONDS">%2$d</xliff:g> సె"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> సెకన్లు"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> సెకను"</string>
<string name="untitled" msgid="4638956954852782576">"<శీర్షిక లేనిది>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(ఫోన్ నంబర్ లేదు)"</string>
<string name="unknownName" msgid="6867811765370350269">"తెలియదు"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"వాయిస్/అత్యవసర సేవ లేదు"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"మీ స్థానంలో మొబైల్ నెట్వర్క్ ద్వారా తాత్కాలికంగా అందించబడదు"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"నెట్వర్క్ను చేరుకోలేరు"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"స్వీకరణను మెరుగుపరచాలంటే, సిస్టమ్ > నెట్వర్క్ & ఇంటర్నెట్ > మొబైల్ నెట్వర్క్లు > ప్రాధాన్య నెట్వర్క్ రకంలో మీరు ఎంచుకున్న రకాన్ని మార్చి ప్రయత్నించండి."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"స్వీకరణను మెరుగుపరచాలంటే, సెట్టింగ్లు > నెట్వర్క్ & ఇంటర్నెట్ > మొబైల్ నెట్వర్క్లు > ప్రాధాన్య నెట్వర్క్ రకంలో మీరు ఎంచుకున్న రకాన్ని మార్చి ప్రయత్నించండి."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"హెచ్చరికలు"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"కాల్ ఫార్వార్డింగ్"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"అత్యవసర కాల్బ్యాక్ మోడ్"</string>
@@ -1782,4 +1766,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM సక్రియం కాలేదు"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM అనుమతించబడదు"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"ఫోన్ అనుమతించబడదు"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"పాప్అప్ విండో"</string>
</resources>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 9bb55a4..69f57bb 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> วัน"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> วัน <xliff:g id="HOURS">%2$d</xliff:g> ชม."</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> วัน <xliff:g id="HOURS">%2$d</xliff:g> ชม."</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ชม."</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ชม. <xliff:g id="MINUTES">%2$d</xliff:g> นาที"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ชม. <xliff:g id="MINUTES">%2$d</xliff:g> นาที"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> นาที"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> นาที"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> นาที <xliff:g id="SECONDS">%2$d</xliff:g> วิ."</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> นาที <xliff:g id="SECONDS">%2$d</xliff:g> วิ."</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> วินาที"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> วินาที"</string>
<string name="untitled" msgid="4638956954852782576">"<ไม่มีชื่อ>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(ไม่มีหมายเลขโทรศัพท์)"</string>
<string name="unknownName" msgid="6867811765370350269">"ไม่ทราบ"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"ไม่มีบริการเสียง/บริการฉุกเฉิน"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"งดให้บริการชั่วคราวโดยเครือข่ายมือถือในตำแหน่งของคุณ"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"เข้าถึงเครือข่ายไม่ได้"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"เพื่อให้การรับสัญญาณดีขึ้น ลองเปลี่ยนประเภทที่เลือกใน \"การตั้งค่า\" > \"เครือข่ายและอินเทอร์เน็ต\" > \"เครือข่ายมือถือ\" > \"ประเภทเครือข่ายที่ต้องการ\""</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"ลองเปลี่ยนประเภทที่เลือกใน \"การตั้งค่า\" > \"เครือข่ายและอินเทอร์เน็ต\" > \"เครือข่ายมือถือ\" > \"ประเภทเครือข่ายที่ต้องการ\" เพื่อให้การรับสัญญาณดีขึ้น"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"การแจ้งเตือน"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"การโอนสาย"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"โหมดติดต่อกลับฉุกเฉิน"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"ไม่มีการจัดสรรซิม"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"ไม่อนุญาตให้ใช้ซิม"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"ไม่อนุญาตให้ใช้โทรศัพท์"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"หน้าต่างป๊อปอัป"</string>
</resources>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index bd3c53a..afb3cbd 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> (na) araw"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hr"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hr"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> (na) oras"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> oras <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> oras <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> (na) min"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> seg"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> seg"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> (na) seg"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> (na) seg"</string>
<string name="untitled" msgid="4638956954852782576">"<Walang pamagat>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Walang numero ng telepono)"</string>
<string name="unknownName" msgid="6867811765370350269">"Hindi alam"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Walang serbisyo para sa voice/emergency"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Pansamantalang hindi inaalok ng mobile network sa iyong lokasyon"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Hindi maabot ang network"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Upang lumakas ang reception, subukang baguhin ang uring napili sa System > Network at Internet > Mga mobile network > Gustong uri ng network."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Upang mapahusay ang reception, subukang baguhin ang uring napili sa Mga Setting > Network at Internet > Mga mobile network > Gustong uri ng network."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Mga Alerto"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Pagpasa ng tawag"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Emergency callback mode"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"Hindi naprobisyon ang SIM"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"Hindi pinahihintulutan ang SIM"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Hindi pinahihintulutan ang telepono"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Window ng Popup"</string>
</resources>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 877fa1d..8d14b24 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> gün"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> gün <xliff:g id="HOURS">%2$d</xliff:g> sa."</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> gün <xliff:g id="HOURS">%2$d</xliff:g> sa."</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> sa."</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> sa. <xliff:g id="MINUTES">%2$d</xliff:g> dk."</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> sa. <xliff:g id="MINUTES">%2$d</xliff:g> dk."</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> dk."</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> dk."</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> dk. <xliff:g id="SECONDS">%2$d</xliff:g> sn."</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> dk. <xliff:g id="SECONDS">%2$d</xliff:g> sn."</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sn."</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sn."</string>
<string name="untitled" msgid="4638956954852782576">"<Adsız>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Telefon numarası yok)"</string>
<string name="unknownName" msgid="6867811765370350269">"Bilinmiyor"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Ses/acil durum hizmeti yok"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Bulunduğunuz yerdeki mobil ağ tarafından geçici olarak sunulmuyor"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Ağa erişilemiyor"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Sinyal gücünü iyileştirmek için Sistem > Ağ ve İnternet > Mobil ağlar > Tercih edilen ağ türü\'nden seçili türü değiştirmeyi deneyin."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Sinyal gücünü iyileştirmek için Ayarlar > Ağ ve İnternet > Mobil ağlar > Tercih edilen ağ türü bölümünde seçili türü değiştirmeyi deneyin."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Uyarılar"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Çağrı yönlendirme"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Acil geri arama modu"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM için temel hazırlık yapılmadı"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM\'e izin verilmiyor"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Telefona izin verilmiyor"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Pop-up Pencere"</string>
</resources>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 75c9848..5f25051 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"б"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"КБ"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"МБ"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"ГБ"</string>
- <string name="terabyteShort" msgid="231613018159186962">"ТБ"</string>
<string name="petabyteShort" msgid="5637816680144990219">"Пб"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> дн."</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> день <xliff:g id="HOURS">%2$d</xliff:g> год"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> дн. <xliff:g id="HOURS">%2$d</xliff:g> год"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> год"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> год <xliff:g id="MINUTES">%2$d</xliff:g> хв"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> год <xliff:g id="MINUTES">%2$d</xliff:g> хв"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> хв"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> хв"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> хв <xliff:g id="SECONDS">%2$d</xliff:g> с"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> хв <xliff:g id="SECONDS">%2$d</xliff:g> с"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> с"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> с"</string>
<string name="untitled" msgid="4638956954852782576">"<Без назви>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Немає номера тел.)"</string>
<string name="unknownName" msgid="6867811765370350269">"Невідомо"</string>
@@ -97,7 +81,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Немає голосової/екстреної служби"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Тимчасово не пропонується мобільною мережею у вашому місцезнаходженні"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Не вдається під’єднатися до мережі"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Щоб покращити якість сигналу, змініть тип у меню \"Система\" > \"Мережа й Інтернет\" > \"Мобільні мережі\" > \"Тип мережі\"."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Щоб покращити прийняття сигналу, змініть тип у меню \"Налаштування\" > \"Мережа й Інтернет\" > \"Мобільні мережі\" > \"Тип мережі\"."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Сповіщення"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Переадресація виклику"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Режим екстреного зворотного виклику"</string>
@@ -1849,4 +1833,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM-карту не затверджено"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM-карта заборонена"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Телефон заборонено"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Спливаюче вікно"</string>
</resources>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index b754a53..dc0fbb7 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"بائٹس"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> دن"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> دن <xliff:g id="HOURS">%2$d</xliff:g> گھنٹے"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> دن <xliff:g id="HOURS">%2$d</xliff:g> گھنٹہ"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> گھنٹے"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> گھنٹہ <xliff:g id="MINUTES">%2$d</xliff:g> منٹ"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> گھنٹہ <xliff:g id="MINUTES">%2$d</xliff:g> منٹ"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> منٹ"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> منٹ"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> منٹ <xliff:g id="SECONDS">%2$d</xliff:g> سیکنڈ"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> منٹ <xliff:g id="SECONDS">%2$d</xliff:g> سیکنڈ"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> سیکنڈ"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> سیکنڈ"</string>
<string name="untitled" msgid="4638956954852782576">">بلا عنوان<"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(کوئی فون نمبر نہیں ہے)"</string>
<string name="unknownName" msgid="6867811765370350269">"نامعلوم"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"کوئی صوتی/ہنگامی سروس نہیں"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"عارضی طور پر آپ کے مقام پر موبائل نیٹ ورک کی طرف سے پیش نہیں ہے"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"نیٹ ورک تک نہیں پہنچا جا سکتا"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"ریسپشن کو بہتر بنانے کیلئے، سسٹم > نیٹ ورک اور انٹرنیٹ > موبائل نیٹ ورکس > ترجیحی نیٹ ورک کی قسم تبدیل کرنے کی کوشش کریں۔"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"ریسپشن کو بہتر بنانے کیلئے، ترتیبات > نیٹ ورک اور انٹرنیٹ > موبائل نیٹ ورکس > ترجیحی نیٹ ورک کی قسم تبدیل کرنے کی کوشش کریں۔"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"الرٹس"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"کال آگے منتقل کرنا"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"ہنگامی کال بیک وضع"</string>
@@ -1782,4 +1766,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM فراہم کردہ نہیں ہے"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM کی اجازت نہیں ہے"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"فون کی اجازت نہیں ہے"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"پاپ اپ ونڈو"</string>
</resources>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index 24a8a9b..9fe7274 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"KB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> kun"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> kun <xliff:g id="HOURS">%2$d</xliff:g> soat"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> kun <xliff:g id="HOURS">%2$d</xliff:g> soat"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> soat"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> soat <xliff:g id="MINUTES">%2$d</xliff:g> daq"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> soat <xliff:g id="MINUTES">%2$d</xliff:g> daq"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> daqiqa"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> daqiqa"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> daq <xliff:g id="SECONDS">%2$d</xliff:g> son"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> daq <xliff:g id="SECONDS">%2$d</xliff:g> son"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> soniya"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> soniya"</string>
<string name="untitled" msgid="4638956954852782576">"<Nomsiz>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Telefon raqami yo‘q)"</string>
<string name="unknownName" msgid="6867811765370350269">"Noma’lum"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Ovozli va favqulodda chaqiruvlar ishlamaydi"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Hududingizda mobil tarmoq tomonidan vaqtinchalik taklif etilmayapti"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Tarmoq bilan bog‘lanib bo‘lmadi"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Qabul qilish sifatini yaxshilash uchun Tizim > Tarmoq va Internet > Mobil tarmoqlar > Asosiy tarmoq turi orqali o‘zgartirib ko‘ring."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Qabul qilish sifatini yaxshilash uchun Sozlamalar > Tarmoq va Internet > Mobil tarmoqlar > Asosiy tarmoq turi orqali o‘zgartirib ko‘ring."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Ogohlantirishlar"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Chaqiruvlarni uzatish"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Favqulodda qaytarib chaqirish rejimi"</string>
@@ -1782,4 +1766,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM karta yo‘q"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM karta ishlatish taqiqlangan"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Chaqiruvlar taqiqlangan"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Qalqib chiquvchi oyna"</string>
</resources>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 0c081fa..d44924e 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ngày"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ngày <xliff:g id="HOURS">%2$d</xliff:g> giờ"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ngày <xliff:g id="HOURS">%2$d</xliff:g> giờ"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> giờ"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> giờ <xliff:g id="MINUTES">%2$d</xliff:g> phút"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> giờ <xliff:g id="MINUTES">%2$d</xliff:g> phút"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> phút"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> phút"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> phút <xliff:g id="SECONDS">%2$d</xliff:g> giây"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> phút <xliff:g id="SECONDS">%2$d</xliff:g> giây"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> giây"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> giây"</string>
<string name="untitled" msgid="4638956954852782576">"<Không có tiêu đề>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Không có số điện thoại nào)"</string>
<string name="unknownName" msgid="6867811765370350269">"Không xác định"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Không có dịch vụ thoại/khẩn cấp"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Tạm thời không được cung cấp bởi mạng di động tại vị trí của bạn"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Không thể kết nối mạng"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Để cải thiện khả năng thu tín hiệu, hãy thử thay đổi loại mạng được chọn trong Hệ thống > Mạng và Internet > Mạng di động > Loại mạng ưa thích."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Để cải thiện khả năng thu tín hiệu, hãy thử thay đổi loại mạng được chọn trong Cài đặt > Mạng và Internet > Mạng di động > Loại mạng ưa thích."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Thông báo"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Chuyển tiếp cuộc gọi"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Chế độ gọi lại khẩn cấp"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM không được cấp phép"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"SIM không được cho phép"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Điện thoại không được cho phép"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Cửa sổ bật lên"</string>
</resources>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index fec4827..9c11b40 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g>天"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g>天<xliff:g id="HOURS">%2$d</xliff:g>小时"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g>天<xliff:g id="HOURS">%2$d</xliff:g>小时"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g>小时"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g>小时<xliff:g id="MINUTES">%2$d</xliff:g>分钟"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g>小时<xliff:g id="MINUTES">%2$d</xliff:g>分钟"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g>分钟"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> 分钟"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g>分钟<xliff:g id="SECONDS">%2$d</xliff:g>秒"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g>分钟<xliff:g id="SECONDS">%2$d</xliff:g>秒"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g>秒"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g>秒"</string>
<string name="untitled" msgid="4638956954852782576">"<未命名>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(无电话号码)"</string>
<string name="unknownName" msgid="6867811765370350269">"未知"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"无法使用语音通话/紧急呼救服务"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"您所在位置的移动网络暂时不提供这项服务"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"无法连接网络"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"要改善信号情况,请尝试更改在“系统”>“网络和互联网”>“移动网络”>“首选网络类型”中选择的类型。"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"要改善信号情况,请尝试更改在“设置”>“网络和互联网”>“移动网络”>“首选网络类型”中选择的类型。"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"提醒"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"来电转接"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"紧急回拨模式"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"未配置的 SIM 卡"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"不受允许的 SIM 卡"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"不受允许的手机"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"弹出式窗口"</string>
</resources>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 2517f68..b361443 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> 天"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> 天 <xliff:g id="HOURS">%2$d</xliff:g> 小時"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> 天 <xliff:g id="HOURS">%2$d</xliff:g> 小時"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> 小時"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> 小時 <xliff:g id="MINUTES">%2$d</xliff:g> 分鐘"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> 小時 <xliff:g id="MINUTES">%2$d</xliff:g> 分鐘"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> 分鐘"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> 分鐘"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> 分鐘 <xliff:g id="SECONDS">%2$d</xliff:g> 秒"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> 分鐘 <xliff:g id="SECONDS">%2$d</xliff:g> 秒"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> 秒"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> 秒"</string>
<string name="untitled" msgid="4638956954852782576">"<未命名>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(沒有電話號碼)"</string>
<string name="unknownName" msgid="6867811765370350269">"不明"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"沒有語音/緊急服務"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"您所在位置的流動網絡暫不提供這項服務"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"無法連接網絡"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"如要改善接收品質,請前往 [系統] > [網絡與互聯網] > [流動網絡] > [偏好的網絡類型],然後變更所選的網絡類型。"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"如要接收更強訊號,請前往 [設定] > [網絡與互聯網] > [流動網絡] > [偏好的網絡類型] 更改網絡類型。"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"通知"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"來電轉駁"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"緊急回撥模式"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"無法識別 SIM 卡"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"不允許使用 SIM 卡"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"不允許使用手機"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"彈出式視窗"</string>
</resources>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index da7d711..25ecccc 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"位元組"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"KB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> 天"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> 天 <xliff:g id="HOURS">%2$d</xliff:g> 小時"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> 天 <xliff:g id="HOURS">%2$d</xliff:g> 小時"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> 小時"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> 小時 <xliff:g id="MINUTES">%2$d</xliff:g> 分鐘"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> 小時 <xliff:g id="MINUTES">%2$d</xliff:g> 分鐘"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> 分鐘"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> 分鐘"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> 分鐘 <xliff:g id="SECONDS">%2$d</xliff:g> 秒"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> 分鐘 <xliff:g id="SECONDS">%2$d</xliff:g> 秒"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> 秒"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> 秒"</string>
<string name="untitled" msgid="4638956954852782576">"<未命名>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(沒有電話號碼)"</string>
<string name="unknownName" msgid="6867811765370350269">"不明"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"無法使用語音/緊急通話服務"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"你所在位置的行動網路暫時不提供這項服務"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"無法連上網路"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"如要改善收訊狀況,請依序開啟 [系統] > [網路與網際網路] > [行動網路] > [偏好的網路類型],然後選取其他網路類型。"</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"如要改善收訊狀況,請依序開啟 [設定] > [網路與網際網路] > [行動網路] > [偏好的網路類型],然後選取其他網路類型。"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"快訊"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"來電轉接"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"緊急回撥模式"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"未佈建的 SIM 卡"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"不受允許的 SIM 卡"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"不受允許的手機"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"彈出式視窗"</string>
</resources>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index b99689b..2a17a96 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -21,24 +21,8 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"B"</string>
- <string name="kilobyteShort" msgid="7542884022844556968">"kB"</string>
- <string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
- <string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
- <string name="terabyteShort" msgid="231613018159186962">"TB"</string>
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
- <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> izinsuku"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> usuku <xliff:g id="HOURS">%2$d</xliff:g> amahora"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> usuku <xliff:g id="HOURS">%2$d</xliff:g> ihora"</string>
- <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> amahora"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ihora <xliff:g id="MINUTES">%2$d</xliff:g> amaminithi"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ihora <xliff:g id="MINUTES">%2$d</xliff:g> iminithi"</string>
- <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> amaminithi"</string>
- <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> iminithi"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> iminithi <xliff:g id="SECONDS">%2$d</xliff:g> amasekhondi"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> iminithi <xliff:g id="SECONDS">%2$d</xliff:g> isekhondi"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> amasekhondi"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> isekhondi"</string>
<string name="untitled" msgid="4638956954852782576">"<Akunasihloko>"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(Ayikho inombolo yefoni)"</string>
<string name="unknownName" msgid="6867811765370350269">"Akwaziwa"</string>
@@ -95,7 +79,7 @@
<string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Ayikho isevisi yezwi/yesimo esiphuthumayo"</string>
<string name="RestrictedStateContent" msgid="4278821484643362350">"Okwesikhashana akunikezwa inethiwekhi yeselula endaweni yakho"</string>
<string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Ayikwazi ukufinyelela inethiwekhi"</string>
- <string name="NetworkPreferenceSwitchSummary" msgid="4164230263214915351">"Ukuze kuthuthukiswe ukwamukelwa, zama ukushintsha uhlobo olukhethiwe kusistimu > Inethiwekhi ne-inthanethi > amanethiwekhi eselula > uhlobo oluncanyelwayo lwenethiwekhi."</string>
+ <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Ukuze uthuthukise ukwamukelwa, zama ukushintsha uhlobo olukhethiwe kuzilungiselelo > Inethiwekhi ne-inthanethi > amanethiwekhi eselula > Uhlobo oluncanyelwayo lwenethiwekhi."</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Izexwayiso"</string>
<string name="notification_channel_call_forward" msgid="2419697808481833249">"Ukudlulisa ikholi"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Imodi yokushayela yesimo esiphuthumayo"</string>
@@ -1781,4 +1765,5 @@
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"I-SIM ayinikezelwe"</string>
<string name="mmcc_illegal_ms" msgid="2769452751852211112">"I-SIM ayivunyelwe"</string>
<string name="mmcc_illegal_me" msgid="4438696681169345015">"Ifoni ayivunyelwe"</string>
+ <string name="popup_window_default_title" msgid="4874318849712115433">"Iwindi lesigelekeqe"</string>
</resources>
diff --git a/core/res/res/values/arrays.xml b/core/res/res/values/arrays.xml
index e190bd1..733878b 100644
--- a/core/res/res/values/arrays.xml
+++ b/core/res/res/values/arrays.xml
@@ -22,66 +22,39 @@
<!-- Do not translate. These are all of the drawable resources that should be preloaded by
the zygote process before it starts forking application processes. -->
<array name="preloaded_drawables">
- <item>@drawable/ab_share_pack_material</item>
- <item>@drawable/ab_solid_shadow_material</item>
<item>@drawable/action_bar_item_background_material</item>
<item>@drawable/activated_background_material</item>
<item>@drawable/btn_borderless_material</item>
<item>@drawable/btn_check_material_anim</item>
<item>@drawable/btn_colored_material</item>
<item>@drawable/btn_default_material</item>
- <item>@drawable/btn_group_holo_dark</item>
- <item>@drawable/btn_group_holo_light</item>
<item>@drawable/btn_radio_material_anim</item>
- <item>@drawable/btn_star_material</item>
<item>@drawable/btn_toggle_material</item>
- <item>@drawable/button_inset</item>
- <item>@drawable/cab_background_bottom_material</item>
- <item>@drawable/cab_background_top_material</item>
<item>@drawable/control_background_32dp_material</item>
<item>@drawable/control_background_40dp_material</item>
<item>@drawable/dialog_background_material</item>
- <item>@drawable/editbox_dropdown_background_dark</item>
- <item>@drawable/edit_text_material</item>
- <item>@drawable/expander_group_material</item>
<item>@drawable/fastscroll_label_left_material</item>
<item>@drawable/fastscroll_label_right_material</item>
<item>@drawable/fastscroll_thumb_material</item>
<item>@drawable/fastscroll_track_material</item>
<item>@drawable/floating_popup_background_dark</item>
<item>@drawable/floating_popup_background_light</item>
- <item>@drawable/gallery_item_background</item>
<item>@drawable/ic_ab_back_material</item>
<item>@drawable/ic_ab_back_material_dark</item>
<item>@drawable/ic_ab_back_material_light</item>
<item>@drawable/ic_account_circle</item>
<item>@drawable/ic_arrow_drop_right_black_24dp</item>
- <item>@drawable/ic_clear</item>
- <item>@drawable/ic_clear_disabled</item>
<item>@drawable/ic_clear_material</item>
- <item>@drawable/ic_clear_normal</item>
- <item>@drawable/ic_commit_search_api_material</item>
<item>@drawable/ic_dialog_alert_material</item>
- <item>@drawable/ic_find_next_material</item>
- <item>@drawable/ic_find_previous_material</item>
- <item>@drawable/ic_go</item>
<item>@drawable/ic_go_search_api_material</item>
- <item>@drawable/ic_media_route_connecting_material</item>
- <item>@drawable/ic_media_route_material</item>
- <item>@drawable/ic_menu_close_clear_cancel</item>
<item>@drawable/ic_menu_copy_material</item>
<item>@drawable/ic_menu_cut_material</item>
- <item>@drawable/ic_menu_find_material</item>
- <item>@drawable/ic_menu_more</item>
<item>@drawable/ic_menu_moreoverflow_material</item>
<item>@drawable/ic_menu_paste_material</item>
- <item>@drawable/ic_menu_search_material</item>
<item>@drawable/ic_menu_selectall_material</item>
<item>@drawable/ic_menu_share_material</item>
<item>@drawable/ic_search_api_material</item>
<item>@drawable/ic_voice_search_api_material</item>
- <item>@drawable/indicator_check_mark_dark</item>
- <item>@drawable/indicator_check_mark_light</item>
<item>@drawable/item_background_borderless_material</item>
<item>@drawable/item_background_borderless_material_dark</item>
<item>@drawable/item_background_borderless_material_light</item>
@@ -90,30 +63,15 @@
<item>@drawable/item_background_material_light</item>
<item>@drawable/list_choice_background_material</item>
<item>@drawable/list_divider_material</item>
- <item>@drawable/list_section_divider_material</item>
- <item>@drawable/menu_background_fill_parent_width</item>
<item>@drawable/notification_material_action_background</item>
<item>@drawable/notification_material_media_action_background</item>
<item>@drawable/number_picker_divider_material</item>
<item>@drawable/popup_background_material</item>
- <item>@drawable/popup_inline_error_above_holo_dark</item>
- <item>@drawable/popup_inline_error_above_holo_light</item>
- <item>@drawable/popup_inline_error_holo_dark</item>
- <item>@drawable/popup_inline_error_holo_light</item>
<item>@drawable/progress_horizontal_material</item>
<item>@drawable/progress_indeterminate_horizontal_material</item>
<item>@drawable/progress_large_material</item>
<item>@drawable/progress_medium_material</item>
<item>@drawable/progress_small_material</item>
- <item>@drawable/quickcontact_badge_overlay_dark</item>
- <item>@drawable/quickcontact_badge_overlay_light</item>
- <item>@drawable/quickcontact_badge_overlay_normal_dark</item>
- <item>@drawable/quickcontact_badge_overlay_normal_light</item>
- <item>@drawable/quickcontact_badge_overlay_pressed_dark</item>
- <item>@drawable/quickcontact_badge_overlay_pressed_light</item>
- <item>@drawable/ratingbar_indicator_material</item>
- <item>@drawable/ratingbar_material</item>
- <item>@drawable/ratingbar_small_material</item>
<item>@drawable/screen_background_dark</item>
<item>@drawable/screen_background_dark_transparent</item>
<item>@drawable/screen_background_light</item>
@@ -125,17 +83,9 @@
<item>@drawable/seekbar_tick_mark_material</item>
<item>@drawable/seekbar_track_material</item>
<item>@drawable/spinner_background_material</item>
- <item>@drawable/spinner_textfield_background_material</item>
- <item>@drawable/switch_thumb_material_anim</item>
<item>@drawable/switch_track_material</item>
<item>@drawable/tab_indicator_material</item>
<item>@drawable/text_cursor_material</item>
- <item>@drawable/text_edit_paste_window</item>
- <item>@drawable/textfield_search_material</item>
- <item>@drawable/text_select_handle_left_material</item>
- <item>@drawable/text_select_handle_middle_material</item>
- <item>@drawable/text_select_handle_right_material</item>
- <item>@drawable/toast_frame</item>
</array>
<!-- Do not translate. These are all of the color state list resources that should be
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index dd840b0..8151ceb 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -69,6 +69,9 @@
<!-- Max height of the autofill data set picker as a fraction of the screen height -->
<attr name="autofillDatasetPickerMaxHeight" format="reference" />
+ <!-- Max height of the the autofill save custom subtitle as a fraction of the screen width/height -->
+ <attr name="autofillSaveCustomSubtitleMaxHeight" format="reference" />
+
<!-- Default disabled alpha for widgets that set enabled/disabled alpha programmatically. -->
<attr name="disabledAlpha" format="float" />
<!-- The alpha applied to the foreground color to create the primary text color. -->
diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml
index ced22cc..33f69b4 100644
--- a/core/res/res/values/attrs_manifest.xml
+++ b/core/res/res/values/attrs_manifest.xml
@@ -561,6 +561,35 @@
to be set for all windows of this activity -->
<attr name="showForAllUsers" format="boolean" />
+ <!-- Specifies whether an {@link Activity} should be shown on top of the the lock screen
+ whenever the lockscreen is up and the activity is resumed. Normally an activity will be
+ transitioned to the stopped state if it is started while the lockscreen is up, but with
+ this flag set the activity will remain in the resumed state visible on-top of the lock
+ screen.
+
+ <p>This should be used instead of {@link android.view.LayoutParams#FLAG_SHOW_WHEN_LOCKED}
+ flag set for Windows. When using the Window flag during activity startup, there may not be
+ time to add it before the system stops your activity for being behind the lock-screen.
+ This leads to a double life-cycle as it is then restarted.</p> -->
+ <attr name="showWhenLocked" format="boolean" />
+
+ <!-- Specifies whether the screen should be turned on when the {@link Activity} is resumed.
+ Normally an activity will be transitioned to the stopped state if it is started while the
+ screen if off, but with this flag set the activity will cause the screen to turn on if the
+ activity will be visible and resumed due to the screen coming on. The screen will not be
+ turned on if the activity won't be visible after the screen is turned on. This flag is
+ normally used in conjunction with the {@link android.R.attr#showWhenLocked} flag to make
+ sure the activity is visible after the screen is turned on when the lockscreen is up. In
+ addition, if this flag is set and the activity calls
+ {@link KeyguardManager#requestDismissKeyguard(Activity, KeyguardManager.KeyguardDismissCallback)}
+ the screen will turn on.
+
+ <p>This should be used instead of {@link android.view.LayoutParams.FLAG_TURN_SCREEN_ON}
+ flag set for Windows. When using the Window flag during activity startup, there may not be
+ time to add it before the system stops your activity because the screen has not yet turned
+ on. This leads to a double life-cycle as it is then restarted.</p> -->
+ <attr name="turnScreenOn" format="boolean" />
+
<!-- Specify the authorities under which this content provider can be
found. Multiple authorities may be supplied by separating them
with a semicolon. Authority names should use a Java-style naming
@@ -1022,6 +1051,22 @@
<p>The default value of this attribute is <code>false</code>. -->
<attr name="isolatedSplits" format="boolean" />
+ <!-- The classname of the classloader used to load the application's classes
+ from its APK. The APK in question can either be the 'base' APK or any
+ of the application's 'split' APKs if it's using a feature split.
+
+ <p>
+ The supported values for this attribute are
+ <code>dalvik.system.PathClassLoader</code> and
+ <code>dalvik.system.DelegateLastClassLoader</code>. If unspecified,
+ the default value of this attribute is <code>dalvik.system.PathClassLoader</code>.
+
+ If an unknown classloader is provided, a PackageParserException with cause
+ <code>PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED</code> will be
+ thrown and the app will not be installed.
+ -->
+ <attr name="classLoader" format="string" />
+
<!-- If set to <code>true</code>, indicates to the platform that this APK is
a 'feature' split and that it implicitly depends on the base APK. This distinguishes
this split APK from a 'configuration' split, which provides resource overrides
@@ -1456,6 +1501,9 @@
<enum name="productivity" value="7" />
</attr>
+ <!-- Declares the kind of classloader this application's classes must be loaded with -->
+ <attr name="classLoader" />
+
</declare-styleable>
<!-- The <code>permission</code> tag declares a security permission that can be
used to control access from other packages to specific components or
@@ -2093,6 +2141,10 @@
<attr name="maxAspectRatio" />
<attr name="lockTaskMode" />
<attr name="showForAllUsers" />
+
+ <attr name="showWhenLocked" />
+ <attr name="turnScreenOn" />
+
<attr name="directBootAware" />
<!-- @hide This activity is always focusable regardless of if it is in a task/stack whose
activities are normally not focusable.
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 7bbed29..46dbf04 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -147,6 +147,11 @@
fading edges is prohibitively expensive on most GPUs. -->
<bool name="config_ui_enableFadingMarquee">false</bool>
+ <!-- Enables or disables haptic effect when the text insertion/selection handle is moved
+ manually by the user. Off by default, since the expected haptic feedback may not be
+ available on some devices. -->
+ <bool name="config_enableHapticTextHandle">false</bool>
+
<!-- Whether dialogs should close automatically when the user touches outside
of them. This should not normally be modified. -->
<bool name="config_closeDialogWhenTouchOutside">true</bool>
@@ -411,15 +416,45 @@
-->
<integer translatable="false" name="config_wifi_wakeup_available">0</integer>
- <!-- Array of ConnectivityManager.TYPE_xxxx values allowable for tethering -->
- <!-- Common options are [1, 4] for TYPE_WIFI and TYPE_MOBILE_DUN or
- <!== [0,1,5,7] for TYPE_MOBILE, TYPE_WIFI, TYPE_MOBILE_HIPRI and TYPE_BLUETOOTH -->
+ <!-- Array of ConnectivityManager.TYPE_xxxx values allowable for tethering.
+
+ Common options are [1, 4] for TYPE_WIFI and TYPE_MOBILE_DUN or
+ [1,7,0] for TYPE_WIFI, TYPE_BLUETOOTH, and TYPE_MOBILE.
+
+ This list is also modified by code within the framework, including:
+
+ - TYPE_ETHERNET (9) is prepended to this list, and
+
+ - the return value of TelephonyManager.getTetherApnRequired()
+ determines how the array is further modified:
+
+ * DUN_REQUIRED
+ TYPE_MOBILE is removed (if present)
+ TYPE_MOBILE_HIPRI is removed (if present)
+ TYPE_MOBILE_DUN is appended (if not already present)
+
+ * DUN_NOT_REQUIRED
+ TYPE_MOBILE_DUN is removed (if present)
+ TYPE_MOBILE is appended (if not already present)
+ TYPE_MOBILE_HIPRI is appended (if not already present)
+
+ * DUN_UNSPECIFIED
+ if any of TYPE_MOBILE{,_DUN,_HIPRI} are present:
+ change nothing
+ else:
+ TYPE_MOBILE is appended
+ TYPE_MOBILE_HIPRI is appended
+
+ For other changes applied to this list, now and in the future, see
+ com.android.server.connectivity.tethering.TetheringConfiguration.
+
+ Note also: the order of this is important. The first upstream type
+ for which a satisfying network exists is used.
+ -->
<integer-array translatable="false" name="config_tether_upstream_types">
- <item>0</item>
<item>1</item>
- <item>5</item>
<item>7</item>
- <item>9</item>
+ <item>0</item>
</integer-array>
<!-- If the DUN connection for this CDMA device supports more than just DUN -->
@@ -1298,7 +1333,7 @@
permission.
[This is only used if config_enableUpdateableTimeZoneRules and
config_timeZoneRulesUpdateTrackingEnabled are true.] -->
- <string name="config_timeZoneRulesUpdaterPackage" translateable="false"></string>
+ <string name="config_timeZoneRulesUpdaterPackage" translateable="false">com.android.timezone.updater</string>
<!-- The package of the time zone rules data application. Expected to be configured
by OEMs to reference their own priv-app APK package.
@@ -1853,6 +1888,9 @@
<!-- Whether the display blanks itself when transitioning from a doze to a non-doze state -->
<bool name="config_displayBlanksAfterDoze">false</bool>
+ <!-- True if the display hardware only has brightness buckets rather than a full range of
+ backlight values -->
+ <bool name="config_displayBrightnessBucketsInDoze">false</bool>
<!-- Power Management: Specifies whether to decouple the auto-suspend state of the
device from the display on/off state.
@@ -1952,6 +1990,10 @@
<!-- Amount of time in ms the user needs to press the relevant key to bring up the global actions dialog -->
<integer name="config_globalActionsKeyTimeout">500</integer>
+ <!-- Default width of a vertical scrollbar and height of a horizontal scrollbar.
+ Takes effect only if the scrollbar drawables have no intrinsic size. -->
+ <dimen name="config_scrollbarSize">4dp</dimen>
+
<!-- Distance that should be scrolled, per axis value, in response to a horizontal
{@link MotionEvent#ACTION_SCROLL} event. -->
<dimen name="config_horizontalScrollFactor">64dp</dimen>
@@ -2188,11 +2230,19 @@
<string-array name="config_disabledUntilUsedPreinstalledCarrierApps" translatable="false" />
<!-- The list of classes that should be added to the notification ranking pipline.
- See {@link com.android.server.notification.NotificationSignalExtractor} -->
+ See {@link com.android.server.notification.NotificationSignalExtractor}
+ If you add a new extractor to this list make sure to update
+ NotificationManagerService.handleRankingSort()-->
<string-array name="config_notificationSignalExtractors">
+ <!-- many of the following extractors depend on the notification channel, so this
+ extractor must come first -->
+ <item>com.android.server.notification.NotificationChannelExtractor</item>
+ <item>com.android.server.notification.NotificationAdjustmentExtractor</item>
+ <!-- depends on AdjustmentExtractor-->
<item>com.android.server.notification.ValidateNotificationPeople</item>
<item>com.android.server.notification.PriorityExtractor</item>
<item>com.android.server.notification.ImportanceExtractor</item>
+ <!-- depends on ImportanceExtractor-->
<item>com.android.server.notification.NotificationIntrusivenessExtractor</item>
<item>com.android.server.notification.VisibilityExtractor</item>
<item>com.android.server.notification.BadgeExtractor</item>
@@ -2210,15 +2260,6 @@
when alpha identifier is not provided by the UICC -->
<bool name="config_stkNoAlphaUsrCnf">true</bool>
- <!-- Don't use roaming icon for considered operators.
- A match on config_sameNamedOperatorConsideredRoaming supersedes a match on this.
- Can use mcc or mcc+mnc as item. For example, 302 or 21407.
- If operators, 21404 and 21407, make roaming agreements, user of 21404 should not see
- the roaming icon as using 21407 network.
- To do this, add 21407 item to values-mcc214-mnc04/config.xml -->
- <string-array translatable="false" name="config_operatorConsideredNonRoaming">
- </string-array>
-
<!-- Threshold (in ms) under which a screen off / screen on will be considered a reset of the
immersive mode confirmation prompt.-->
<integer name="config_immersive_mode_confirmation_panic">5000</integer>
@@ -2226,17 +2267,6 @@
<!-- For some operators, PDU has garbages. To fix it, need to use valid index -->
<integer name="config_valid_wappush_index">-1</integer>
- <!-- This is NOT just for same named operators unlike the name suggests (will blacklist regardless of name).
- A match on this supersedes a match on config_operatorConsideredNonRoaming.
- Uses "startsWith" so you can use a leading substring like the mcc or
- use the complete mcc+mnc string.
- For a given mcc/mcc-mnc, some operators may want to roam (even if
- config_operatorConsideredNonRoaming has the mcc/mcc-mnc).
- user of 40485 should see the roaming icon as using 40483 network
- though same Reliance network.
- To do this, add 40483 item to values-mcc404-mnc85/config.xml -->
- <string-array translatable="false" name="config_sameNamedOperatorConsideredRoaming">
- </string-array>
<!-- call barring MMI code from TS 22.030 Annex B -->
<string-array translatable="false" name="config_callBarringMMI">
<item>33</item>
@@ -2989,6 +3019,13 @@
<!-- An array of packages that need to be treated as type service in battery settings -->
<string-array translatable="false" name="config_batteryPackageTypeService"/>
+ <!-- Flag indicating whether or not to enable night mode detection. -->
+ <bool name="config_enableNightMode">false</bool>
+
+ <!-- Flag indicating that the actions buttons for a notification should be tinted with by the
+ color supplied by the Notification.Builder if present. -->
+ <bool name="config_tintNotificationActionButtons">true</bool>
+
<!-- Show area update info settings in CellBroadcastReceiver and information in SIM status in Settings app -->
<bool name="config_showAreaUpdateInfoSettings">false</bool>
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index 80d8ab5..4f769b6 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -595,4 +595,7 @@
<!-- Max width/height of the autofill data set picker as a fraction of the screen width/height -->
<dimen name="autofill_dataset_picker_max_size">90%</dimen>
+ <!-- Max height of the the autofill save custom subtitle as a fraction of the screen width/height -->
+ <dimen name="autofill_save_custom_subtitle_max_height">20%</dimen>
+
</resources>
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 4868774..634d79a 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -2825,7 +2825,27 @@
<public type="string" name="paste_as_plain_text" id="0x01040019" />
+ <!-- ===============================================================
+ Resources added in version O MR1 of the platform
+
+ NOTE: add <public> elements within a <public-group> like so:
+
+ <public-group type="attr" first-id="0x01010531">
+ <public name="exampleAttr1" />
+ <public name="exampleAttr2" />
+ </public-group>
+
+ To add a new public-group block, choose an id value that is 1 greater
+ than the last of that item above. For example, the last "attr" id
+ value above is 0x01010530, so the public-group of attrs below has
+ the id value of 0x01010531.
+ =============================================================== -->
+ <eat-comment />
+
<public-group type="attr" first-id="0x01010569">
+ <public name="showWhenLocked"/>
+ <public name="turnScreenOn"/>
+ <public name="classLoader" />
</public-group>
<public-group type="style" first-id="0x010302e0">
@@ -2835,6 +2855,7 @@
</public-group>
<public-group type="string" first-id="0x0104001a">
+ <public name="autofill"/>
</public-group>
<!-- ===============================================================
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index ab26ae1..4b34402 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -20,65 +20,13 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- Suffix added to a number to signify size in bytes. -->
<string name="byteShort">B</string>
- <!-- Suffix added to a number to signify size in kilobytes (1000 bytes).
- If you retain the Latin script for the localization, please use the lowercase
- 'k', as it signifies 1000 bytes as opposed to 1024 bytes. -->
- <string name="kilobyteShort">kB</string>
- <!-- Suffix added to a number to signify size in megabytes. -->
- <string name="megabyteShort">MB</string>
- <!-- Suffix added to a number to signify size in gigabytes. -->
- <string name="gigabyteShort">GB</string>
- <!-- Suffix added to a number to signify size in terabytes. -->
- <string name="terabyteShort">TB</string>
<!-- Suffix added to a number to signify size in petabytes. -->
<string name="petabyteShort">PB</string>
- <!-- Format string used to add a suffix like "kB" or "MB" to a number
- to display a size in kilobytes, megabytes, or other size units.
- Some languages (like French) will want to add a space between
- the placeholders. -->
- <string name="fileSizeSuffix"><xliff:g id="number" example="123">%1$s</xliff:g> <xliff:g id="unit" example="MB">%2$s</xliff:g></string>
-
- <!-- [CHAR_LIMIT=10] Suffix added to signify duration in days -->
- <string name="durationDays"><xliff:g id="days">%1$d</xliff:g> days</string>
-
- <!-- [CHAR_LIMIT=10] Suffix added to signify duration of one day with hours -->
- <string name="durationDayHours"><xliff:g id="days">%1$d</xliff:g> day
- <xliff:g id="hours">%2$d</xliff:g> hrs</string>
-
- <!-- [CHAR_LIMIT=10] Suffix added to signify duration of one day with one hours -->
- <string name="durationDayHour"><xliff:g id="days">%1$d</xliff:g> day
- <xliff:g id="hours">%2$d</xliff:g> hr</string>
-
- <!-- [CHAR_LIMIT=10] Suffix added to signify duration in hours -->
- <string name="durationHours"><xliff:g id="hours">%1$d</xliff:g> hrs</string>
-
- <!-- [CHAR_LIMIT=10] Suffix added to signify duration of one hour with minutes -->
- <string name="durationHourMinutes"><xliff:g id="hours">%1$d</xliff:g> hr
- <xliff:g id="minutes">%2$d</xliff:g> mins</string>
-
- <!-- [CHAR_LIMIT=10] Suffix added to signify duration of one hour with one minute -->
- <string name="durationHourMinute"><xliff:g id="hours">%1$d</xliff:g> hr
- <xliff:g id="minutes">%2$d</xliff:g> min</string>
-
- <!-- [CHAR_LIMIT=10] Suffix added to signify duration in minutes -->
- <string name="durationMinutes"><xliff:g id="minutes">%1$d</xliff:g> mins</string>
-
- <!-- [CHAR_LIMIT=10] Suffix added to signify duration of one minute -->
- <string name="durationMinute"><xliff:g id="minutes">%1$d</xliff:g> min</string>
-
- <!-- [CHAR_LIMIT=10] Suffix added to signify duration of one minute with seconds -->
- <string name="durationMinuteSeconds"><xliff:g id="minutes">%1$d</xliff:g> min
- <xliff:g id="seconds">%2$d</xliff:g> secs</string>
-
- <!-- [CHAR_LIMIT=10] Suffix added to signify duration of one minute with one second -->
- <string name="durationMinuteSecond"><xliff:g id="minutes">%1$d</xliff:g> min
- <xliff:g id="seconds">%2$d</xliff:g> sec</string>
-
- <!-- [CHAR_LIMIT=10] Suffix added to signify duration in seconds -->
- <string name="durationSeconds"><xliff:g id="seconds">%1$d</xliff:g> secs</string>
-
- <!-- [CHAR_LIMIT=10] Suffix added to signify duration of one second -->
- <string name="durationSecond"><xliff:g id="seconds">%1$d</xliff:g> sec</string>
+ <!-- Format string used to add a suffix like "B" or "PB" to a number
+ to display a size in bytes or petabytes.
+ Some languages may want to remove the space between the placeholders
+ or replace it with a non-breaking space. -->
+ <string name="fileSizeSuffix"><xliff:g id="number" example="123">%1$s</xliff:g> <xliff:g id="unit" example="B">%2$s</xliff:g></string>
<!-- Used in Contacts for a field that has no label and in Note Pad
for a note with no name. -->
@@ -204,7 +152,7 @@
<!-- Displayed to tell the user that they should switch their network preference. -->
<string name="NetworkPreferenceSwitchTitle">Can\u2019t reach network</string>
<!-- Displayed to tell the user that they should switch their network preference. -->
- <string name="NetworkPreferenceSwitchSummary">To improve reception, try changing the type selected at System > Network & Internet > Mobile networks > Preferred network type."</string>
+ <string name="NetworkPreferenceSwitchSummary">To improve reception, try changing the type selected at Settings > Network & Internet > Mobile networks > Preferred network type."</string>
<!-- Telephony notification channel name for a channel containing network alert notifications. -->
<string name="notification_channel_network_alert">Alerts</string>
@@ -4709,4 +4657,7 @@
<string name="mmcc_imsi_unknown_in_hlr">SIM not provisioned</string>
<string name="mmcc_illegal_ms">SIM not allowed</string>
<string name="mmcc_illegal_me">Phone not allowed</string>
+
+ <!-- Popup window default title to be read by a screen reader-->
+ <string name="popup_window_default_title">Popup Window</string>
</resources>
diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml
index 5c6e3df..71299d8 100644
--- a/core/res/res/values/styles.xml
+++ b/core/res/res/values/styles.xml
@@ -1492,6 +1492,12 @@
<item name="background">@drawable/autofill_dataset_picker_background</item>
</style>
+ <!-- @hide -->
+ <style name="AutofillSaveAnimation">
+ <item name="android:windowEnterAnimation">@anim/slide_in_up</item>
+ <item name="android:windowExitAnimation">@anim/slide_out_down</item>
+ </style>
+
<!-- The style for the container of media actions in a notification. -->
<!-- @hide -->
<style name="NotificationMediaActionContainer">
diff --git a/core/res/res/values/styles_material.xml b/core/res/res/values/styles_material.xml
index c783ea8..470ac52 100644
--- a/core/res/res/values/styles_material.xml
+++ b/core/res/res/values/styles_material.xml
@@ -1054,7 +1054,7 @@
</style>
<style name="Widget.Material.MediaRouteButton" parent ="Widget.Material.ActionButton">
- <item name="externalRouteEnabledDrawable">@drawable/ic_media_route_material</item>
+ <item name="externalRouteEnabledDrawable">@drawable/ic_media_route_dark_material</item>
<item name="contentDescription">@string/media_route_button_content_description</item>
</style>
@@ -1203,7 +1203,10 @@
<style name="Widget.Material.Light.ActionBar" parent="Widget.Material.ActionBar" />
<style name="Widget.Material.Light.ActionBar.Solid" parent="Widget.Material.ActionBar.Solid" />
<style name="Widget.Material.Light.FastScroll" parent="Widget.Material.FastScroll"/>
- <style name="Widget.Material.Light.MediaRouteButton" parent="Widget.Material.MediaRouteButton" />
+
+ <style name="Widget.Material.Light.MediaRouteButton" parent="Widget.Material.MediaRouteButton">
+ <item name="externalRouteEnabledDrawable">@drawable/ic_media_route_light_material</item>
+ </style>
<!-- Animation Styles -->
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 115dc9f..37f1daa 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -241,6 +241,7 @@
<java-symbol type="attr" name="autofilledHighlight"/>
<java-symbol type="attr" name="autofillDatasetPickerMaxWidth"/>
<java-symbol type="attr" name="autofillDatasetPickerMaxHeight"/>
+ <java-symbol type="attr" name="autofillSaveCustomSubtitleMaxHeight"/>
<java-symbol type="bool" name="action_bar_embed_tabs" />
<java-symbol type="bool" name="action_bar_expanded_action_views_exclusive" />
<java-symbol type="bool" name="config_avoidGfxAccel" />
@@ -273,6 +274,7 @@
<java-symbol type="bool" name="config_syncstorageengine_masterSyncAutomatically" />
<java-symbol type="bool" name="config_telephony_use_own_number_for_voicemail" />
<java-symbol type="bool" name="config_ui_enableFadingMarquee" />
+ <java-symbol type="bool" name="config_enableHapticTextHandle" />
<java-symbol type="bool" name="config_use_strict_phone_number_comparation" />
<java-symbol type="bool" name="config_single_volume" />
<java-symbol type="bool" name="config_voice_capable" />
@@ -449,6 +451,7 @@
<java-symbol type="dimen" name="config_viewConfigurationTouchSlop" />
<java-symbol type="dimen" name="config_viewMinFlingVelocity" />
<java-symbol type="dimen" name="config_viewMaxFlingVelocity" />
+ <java-symbol type="dimen" name="config_scrollbarSize" />
<java-symbol type="dimen" name="config_horizontalScrollFactor" />
<java-symbol type="dimen" name="config_verticalScrollFactor" />
<java-symbol type="dimen" name="config_scrollFactor" />
@@ -656,18 +659,6 @@
<java-symbol type="string" name="display_manager_overlay_display_secure_suffix" />
<java-symbol type="string" name="display_manager_overlay_display_title" />
<java-symbol type="string" name="double_tap_toast" />
- <java-symbol type="string" name="durationDays" />
- <java-symbol type="string" name="durationDayHours" />
- <java-symbol type="string" name="durationDayHour" />
- <java-symbol type="string" name="durationHours" />
- <java-symbol type="string" name="durationHourMinutes" />
- <java-symbol type="string" name="durationHourMinute" />
- <java-symbol type="string" name="durationMinutes" />
- <java-symbol type="string" name="durationMinute" />
- <java-symbol type="string" name="durationMinuteSeconds" />
- <java-symbol type="string" name="durationMinuteSecond" />
- <java-symbol type="string" name="durationSeconds" />
- <java-symbol type="string" name="durationSecond" />
<java-symbol type="string" name="elapsed_time_short_format_h_mm_ss" />
<java-symbol type="string" name="elapsed_time_short_format_mm_ss" />
<java-symbol type="string" name="emailTypeCustom" />
@@ -687,7 +678,6 @@
<java-symbol type="string" name="fileSizeSuffix" />
<java-symbol type="string" name="force_close" />
<java-symbol type="string" name="gadget_host_error_inflating" />
- <java-symbol type="string" name="gigabyteShort" />
<java-symbol type="string" name="gpsNotifMessage" />
<java-symbol type="string" name="gpsNotifTicker" />
<java-symbol type="string" name="gpsNotifTitle" />
@@ -743,7 +733,6 @@
<java-symbol type="string" name="keyboardview_keycode_enter" />
<java-symbol type="string" name="keyboardview_keycode_mode_change" />
<java-symbol type="string" name="keyboardview_keycode_shift" />
- <java-symbol type="string" name="kilobyteShort" />
<java-symbol type="string" name="last_month" />
<java-symbol type="string" name="launchBrowserDefault" />
<java-symbol type="string" name="lock_to_app_toast" />
@@ -764,7 +753,6 @@
<java-symbol type="string" name="lockscreen_emergency_call" />
<java-symbol type="string" name="lockscreen_return_to_call" />
<java-symbol type="string" name="low_memory" />
- <java-symbol type="string" name="megabyteShort" />
<java-symbol type="string" name="midnight" />
<java-symbol type="string" name="mismatchPin" />
<java-symbol type="string" name="mmiComplete" />
@@ -967,7 +955,6 @@
<java-symbol type="string" name="sync_really_delete" />
<java-symbol type="string" name="sync_too_many_deletes_desc" />
<java-symbol type="string" name="sync_undo_deletes" />
- <java-symbol type="string" name="terabyteShort" />
<java-symbol type="string" name="text_copied" />
<java-symbol type="string" name="time_of_day" />
<java-symbol type="string" name="time_picker_decrement_hour_button" />
@@ -1193,8 +1180,6 @@
<java-symbol type="array" name="config_cdma_dun_supported_types" />
<java-symbol type="array" name="config_disabledUntilUsedPreinstalledImes" />
<java-symbol type="array" name="config_disabledUntilUsedPreinstalledCarrierApps" />
- <java-symbol type="array" name="config_operatorConsideredNonRoaming" />
- <java-symbol type="array" name="config_sameNamedOperatorConsideredRoaming" />
<java-symbol type="array" name="config_callBarringMMI" />
<java-symbol type="array" name="config_globalActionsList" />
<java-symbol type="array" name="config_telephonyHardware" />
@@ -1748,6 +1733,8 @@
<java-symbol type="bool" name="config_automatic_brightness_available" />
<java-symbol type="bool" name="config_autoBrightnessResetAmbientLuxAfterWarmUp" />
<java-symbol type="bool" name="config_notificationHeaderClickableForExpand" />
+ <java-symbol type="bool" name="config_enableNightMode" />
+ <java-symbol type="bool" name="config_tintNotificationActionButtons" />
<java-symbol type="bool" name="config_dozeAfterScreenOff" />
<java-symbol type="bool" name="config_enableActivityRecognitionHardwareOverlay" />
<java-symbol type="bool" name="config_enableFusedLocationOverlay" />
@@ -2907,8 +2894,8 @@
<java-symbol type="id" name="autofill_dataset_picker"/>
<java-symbol type="id" name="autofill_dataset_list"/>
<java-symbol type="id" name="autofill" />
+ <java-symbol type="id" name="autofill_save_custom_subtitle" />
<java-symbol type="id" name="autofill_save_title" />
- <java-symbol type="id" name="autofill_save_subtitle" />
<java-symbol type="id" name="autofill_save_no" />
<java-symbol type="id" name="autofill_save_yes" />
<java-symbol type="id" name="autofill_save_close" />
@@ -2931,7 +2918,9 @@
<java-symbol type="string" name="autofill_save_type_email_address" />
<java-symbol type="drawable" name="autofill_dataset_picker_background" />
<java-symbol type="style" name="AutofillDatasetPicker" />
+ <java-symbol type="style" name="AutofillSaveAnimation" />
<java-symbol type="dimen" name="autofill_dataset_picker_max_size"/>
+ <java-symbol type="dimen" name="autofill_save_custom_subtitle_max_height"/>
<java-symbol type="dimen" name="notification_big_picture_max_height"/>
<java-symbol type="dimen" name="notification_big_picture_max_width"/>
@@ -3051,6 +3040,7 @@
<java-symbol type="integer" name="config_inCallNotificationVolumeRelative" />
<java-symbol type="bool" name="config_dozeAlwaysOnDisplayAvailable" />
<java-symbol type="bool" name="config_displayBlanksAfterDoze" />
+ <java-symbol type="bool" name="config_displayBrightnessBucketsInDoze" />
<java-symbol type="integer" name="config_storageManagerDaystoRetainDefault" />
<java-symbol type="string" name="config_headlineFontFamily" />
<java-symbol type="string" name="config_headlineFontFamilyLight" />
@@ -3061,6 +3051,8 @@
<java-symbol type="array" name="config_batteryPackageTypeSystem" />
<java-symbol type="array" name="config_batteryPackageTypeService" />
+
+ <java-symbol type="string" name="popup_window_default_title" />
<java-symbol type="bool" name="config_showAreaUpdateInfoSettings" />
<java-symbol type="layout" name="shutdown_dialog" />
<java-symbol type="dimen" name="chooser_service_spacing" />
diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml
index 383ae5d..9c3d8eb 100644
--- a/core/res/res/values/themes.xml
+++ b/core/res/res/values/themes.xml
@@ -453,6 +453,9 @@
<!-- Autofill: max width/height of the dataset picker as a fraction of screen size -->
<item name="autofillDatasetPickerMaxWidth">@dimen/autofill_dataset_picker_max_size</item>
<item name="autofillDatasetPickerMaxHeight">@dimen/autofill_dataset_picker_max_size</item>
+
+ <!-- Autofill: max height of custom save subtitle as a fraction of screen size -->
+ <item name="autofillSaveCustomSubtitleMaxHeight">@dimen/autofill_save_custom_subtitle_max_height</item>
</style>
<!-- Variant of {@link #Theme} with no title bar -->
diff --git a/core/res/res/values/themes_material.xml b/core/res/res/values/themes_material.xml
index 86abe97..9dafa7a 100644
--- a/core/res/res/values/themes_material.xml
+++ b/core/res/res/values/themes_material.xml
@@ -214,7 +214,7 @@
<!-- Scrollbar attributes -->
<item name="scrollbarFadeDuration">250</item>
<item name="scrollbarDefaultDelayBeforeFade">400</item>
- <item name="scrollbarSize">10dp</item>
+ <item name="scrollbarSize">@dimen/config_scrollbarSize</item>
<item name="scrollbarThumbHorizontal">@drawable/scrollbar_handle_material</item>
<item name="scrollbarThumbVertical">@drawable/config_scrollbarThumbVertical</item>
<item name="scrollbarTrackHorizontal">@null</item>
@@ -582,7 +582,7 @@
<!-- Scrollbar attributes -->
<item name="scrollbarFadeDuration">250</item>
<item name="scrollbarDefaultDelayBeforeFade">400</item>
- <item name="scrollbarSize">10dp</item>
+ <item name="scrollbarSize">@dimen/config_scrollbarSize</item>
<item name="scrollbarThumbHorizontal">@drawable/scrollbar_handle_material</item>
<item name="scrollbarThumbVertical">@drawable/config_scrollbarThumbVertical</item>
<item name="scrollbarTrackHorizontal">@null</item>
diff --git a/core/res/res/xml/sms_short_codes.xml b/core/res/res/xml/sms_short_codes.xml
index 644638d..dbc9e51 100644
--- a/core/res/res/xml/sms_short_codes.xml
+++ b/core/res/res/xml/sms_short_codes.xml
@@ -61,7 +61,7 @@
<shortcode country="bh" pattern="\\d{1,5}" free="81181" />
<!-- Brazil: 1-5 digits (standard system default, not country specific) -->
- <shortcode country="br" pattern="\\d{1,5}" free="6000[012]\\d" />
+ <shortcode country="br" pattern="\\d{1,5}" free="6000[012]\\d|876|5500|9963" />
<!-- Belarus: 4 digits -->
<shortcode country="by" pattern="\\d{4}" premium="3336|4161|444[4689]|501[34]|7781" />
@@ -72,10 +72,16 @@
<!-- Switzerland: 3-5 digits: http://www.swisscom.ch/fxres/kmu/thirdpartybusiness_code_of_conduct_en.pdf -->
<shortcode country="ch" pattern="[2-9]\\d{2,4}" premium="543|83111|30118" free="98765" />
+ <!-- Chile: 4-5 digits (not confirmed), known premium codes listed -->
+ <shortcode country="cl" pattern="\\d{4,5}" free="9963" />
+
<!-- China: premium shortcodes start with "1066", free shortcodes start with "1065":
http://clients.txtnation.com/entries/197192-china-premium-sms-short-code-requirements -->
<shortcode country="cn" premium="1066.*" free="1065.*" />
+ <!-- Colombia: 1-6 digits (not confirmed) -->
+ <shortcode country="co" pattern="\\d{1,6}" free="890350" />
+
<!-- Cyprus: 4-6 digits (not confirmed), known premium codes listed, plus EU -->
<shortcode country="cy" pattern="\\d{4,6}" premium="7510" free="116\\d{3}" />
@@ -84,7 +90,7 @@
<shortcode country="cz" premium="9\\d{6,7}" free="116\\d{3}" />
<!-- Germany: 4-5 digits plus 1232xxx (premium codes from http://www.vodafone.de/infofaxe/537.pdf and http://premiumdienste.eplus.de/pdf/kodex.pdf), plus EU. To keep the premium regex from being too large, it only includes payment processors that have been used by SMS malware, with the regular pattern matching the other premium short codes. -->
- <shortcode country="de" pattern="\\d{4,5}|1232\\d{3}" premium="11(?:111|833)|1232(?:013|021|060|075|286|358)|118(?:44|80|86)|20[25]00|220(?:21|22|88|99)|221(?:14|21)|223(?:44|53|77)|224[13]0|225(?:20|59|90)|226(?:06|10|20|26|30|40|56|70)|227(?:07|33|39|66|76|78|79|88|99)|228(?:08|11|66|77)|23300|30030|3[12347]000|330(?:33|55|66)|33(?:233|331|366|533)|34(?:34|567)|37000|40(?:040|123|444|[3568]00)|41(?:010|414)|44(?:000|044|344|44[24]|544)|50005|50100|50123|50555|51000|52(?:255|783)|54(?:100|2542)|55(?:077|[24]00|222|333|55|[12369]55)|56(?:789|886)|60800|6[13]000|66(?:[12348]66|566|766|777|88|999)|68888|70(?:07|123|777)|76766|77(?:007|070|222|444|[567]77)|80(?:008|123|888)|82(?:002|[378]00|323|444|472|474|488|727)|83(?:005|[169]00|333|830)|84(?:141|300|32[34]|343|488|499|777|888)|85888|86(?:188|566|640|644|650|677|868|888)|870[24]9|871(?:23|[49]9)|872(?:1[0-8]|49|99)|87499|875(?:49|55|99)|876(?:0[1367]|1[1245678]|54|99)|877(?:00|99)|878(?:15|25|3[567]|8[12])|87999|880(?:08|44|55|77|99)|88688|888(?:03|10|8|89)|8899|90(?:009|999)|99999" free="116\\d{3}|81214|81215|47529|70296|83782" />
+ <shortcode country="de" pattern="\\d{4,5}|1232\\d{3}" premium="11(?:111|833)|1232(?:013|021|060|075|286|358)|118(?:44|80|86)|20[25]00|220(?:21|22|88|99)|221(?:14|21)|223(?:44|53|77)|224[13]0|225(?:20|59|90)|226(?:06|10|20|26|30|40|56|70)|227(?:07|33|39|66|76|78|79|88|99)|228(?:08|11|66|77)|23300|30030|3[12347]000|330(?:33|55|66)|33(?:233|331|366|533)|34(?:34|567)|37000|40(?:040|123|444|[3568]00)|41(?:010|414)|44(?:000|044|344|44[24]|544)|50005|50100|50123|50555|51000|52(?:255|783)|54(?:100|2542)|55(?:077|[24]00|222|333|55|[12369]55)|56(?:789|886)|60800|6[13]000|66(?:[12348]66|566|766|777|88|999)|68888|70(?:07|123|777)|76766|77(?:007|070|222|444|[567]77)|80(?:008|123|888)|82(?:002|[378]00|323|444|472|474|488|727)|83(?:005|[169]00|333|830)|84(?:141|300|32[34]|343|488|499|777|888)|85888|86(?:188|566|640|644|650|677|868|888)|870[24]9|871(?:23|[49]9)|872(?:1[0-8]|49|99)|87499|875(?:49|55|99)|876(?:0[1367]|1[1245678]|54|99)|877(?:00|99)|878(?:15|25|3[567]|8[12])|87999|880(?:08|44|55|77|99)|88688|888(?:03|10|8|89)|8899|90(?:009|999)|99999" free="116\\d{3}|81214|81215|47529|70296|83782|3011|73240" />
<!-- Denmark: see http://iprs.webspacecommerce.com/Denmark-Premium-Rate-Numbers -->
<shortcode country="dk" pattern="\\d{4,5}" premium="1\\d{3}" free="116\\d{3}|4665" />
@@ -108,11 +114,14 @@
<!-- United Kingdom (Great Britain): 4-6 digits, common codes [5-8]xxxx, plus EU:
http://www.short-codes.com/media/Co-regulatoryCodeofPracticeforcommonshortcodes170206.pdf,
visual voicemail code for EE: 887 -->
- <shortcode country="gb" pattern="\\d{4,6}" premium="[5-8]\\d{4}" free="116\\d{3}|2020|35890|61002|61202|887|83669|34664|40406|60174" />
+ <shortcode country="gb" pattern="\\d{4,6}" premium="[5-8]\\d{4}" free="116\\d{3}|2020|35890|61002|61202|887|83669|34664|40406|60174|7726|37726" />
<!-- Georgia: 4 digits, known premium codes listed -->
<shortcode country="ge" pattern="\\d{4}" premium="801[234]|888[239]" />
+ <!-- Ghana: 4 digits, known premium codes listed -->
+ <shortcode country="gh" pattern="\\d{4}" free="5041" />
+
<!-- Greece: 5 digits (54xxx, 19yxx, x=0-9, y=0-5): http://www.cmtelecom.com/premium-sms/greece -->
<shortcode country="gr" pattern="\\d{5}" premium="54\\d{3}|19[0-5]\\d{2}" free="116\\d{3}|12115" />
@@ -143,6 +152,9 @@
<!-- Japan: 8083 used by SOFTBANK_DCB_2 -->
<shortcode country="jp" free="8083" />
+ <!-- Kenya: 5 digits, known premium codes listed -->
+ <shortcode country="ke" pattern="\\d{5}" free="21725" />
+
<!-- Kyrgyzstan: 4 digits, known premium codes listed -->
<shortcode country="kg" pattern="\\d{4}" premium="415[2367]|444[69]" />
@@ -160,13 +172,16 @@
<!-- Luxembourg: 5 digits, 6xxxx, plus EU:
http://www.luxgsm.lu/assets/files/filepage/file_1253803400.pdf -->
- <shortcode country="lu" premium="6\\d{4}" free="116\\d{3}|60231" />
+ <shortcode country="lu" premium="6\\d{4}" free="116\\d{3}|60231|64085" />
<!-- Latvia: 4 digits, known premium codes listed, plus EU -->
<shortcode country="lv" pattern="\\d{4}" premium="18(?:19|63|7[1-4])" free="116\\d{3}|1399" />
+ <!-- Macedonia: 1-6 digits (not confirmed), known premium codes listed -->
+ <shortcode country="mk" pattern="\\d{1,6}" free="129005|122" />
+
<!-- Mexico: 4-5 digits (not confirmed), known premium codes listed -->
- <shortcode country="mx" pattern="\\d{4,5}" premium="53035|7766" free="46645|5050|26259|50025|50052" />
+ <shortcode country="mx" pattern="\\d{4,5}" premium="53035|7766" free="46645|5050|26259|50025|50052|9963" />
<!-- Malaysia: 5 digits: http://www.skmm.gov.my/attachment/Consumer_Regulation/Mobile_Content_Services_FAQs.pdf -->
<shortcode country="my" pattern="\\d{5}" premium="32298|33776" free="22099|28288" />
@@ -180,6 +195,9 @@
<!-- New Zealand: 3-4 digits, known premium codes listed -->
<shortcode country="nz" pattern="\\d{3,4}" premium="3903|8995|4679" free="3067|3068|4053" />
+ <!-- Peru: 4-5 digits (not confirmed), known premium codes listed -->
+ <shortcode country="pe" pattern="\\d{4,5}" free="9963" />
+
<!-- Philippines -->
<shortcode country="ph" free="2147|5495|5496" />
@@ -196,11 +214,14 @@
<!-- Qatar: 1-5 digits (standard system default, not country specific) -->
<shortcode country="qa" pattern="\\d{1,5}" free="92451" />
+ <!-- Reunion (French Territory): 1-5 digits (not confirmed) -->
+ <shortcode country="re" pattern="\\d{1,5}" free="38600,36300,36303,959" />
+
<!-- Romania: 4 digits, plus EU: http://www.simplus.ro/en/resources/glossary-of-terms/ -->
<shortcode country="ro" pattern="\\d{4}" premium="12(?:63|66|88)|13(?:14|80)" free="116\\d{3}|3654|8360" />
<!-- Russia: 4 digits, known premium codes listed: http://smscoin.net/info/pricing-russia/ -->
- <shortcode country="ru" pattern="\\d{4}" premium="1(?:1[56]1|899)|2(?:09[57]|322|47[46]|880|990)|3[589]33|4161|44(?:4[3-9]|81)|77(?:33|81)|8424" />
+ <shortcode country="ru" pattern="\\d{4}" premium="1(?:1[56]1|899)|2(?:09[57]|322|47[46]|880|990)|3[589]33|4161|44(?:4[3-9]|81)|77(?:33|81)|8424" free="6954,8501"/>
<!-- Saudi Arabia -->
<shortcode country="sa" free="8145" />
@@ -237,4 +258,7 @@
<!-- Vietnam: 1-5 digits (standard system default, not country specific) -->
<shortcode country="vn" pattern="\\d{1,5}" free="5001|9055" />
+ <!-- Mayotte (French Territory): 1-5 digits (not confirmed) -->
+ <shortcode country="yt" pattern="\\d{1,5}" free="38600,36300,36303,959" />
+
</shortcodes>
diff --git a/core/tests/BroadcastRadioTests/Android.mk b/core/tests/BroadcastRadioTests/Android.mk
new file mode 100644
index 0000000..c409e3a
--- /dev/null
+++ b/core/tests/BroadcastRadioTests/Android.mk
@@ -0,0 +1,35 @@
+# Copyright (C) 2017 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_PACKAGE_NAME := BroadcastRadioTests
+
+LOCAL_PRIVILEGED_MODULE := true
+LOCAL_CERTIFICATE := platform
+LOCAL_MODULE_TAGS := tests
+# TODO(b/13282254): uncomment when b/13282254 is fixed
+# LOCAL_SDK_VERSION := current
+
+LOCAL_STATIC_JAVA_LIBRARIES := compatibility-device-util android-support-test testng
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_DEX_PREOPT := false
+LOCAL_PROGUARD_ENABLED := disabled
+
+include $(BUILD_PACKAGE)
diff --git a/core/tests/BroadcastRadioTests/AndroidManifest.xml b/core/tests/BroadcastRadioTests/AndroidManifest.xml
new file mode 100644
index 0000000..d9b5522
--- /dev/null
+++ b/core/tests/BroadcastRadioTests/AndroidManifest.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="android.hardware.radio.tests">
+
+ <uses-permission android:name="android.permission.ACCESS_BROADCAST_RADIO" />
+
+ <application>
+ <uses-library android:name="android.test.runner" />
+ </application>
+
+ <instrumentation
+ android:name="android.support.test.runner.AndroidJUnitRunner"
+ android:targetPackage="android.hardware.radio.tests"
+ android:label="Tests for Broadcast Radio APIs" >
+ </instrumentation>
+</manifest>
diff --git a/core/tests/BroadcastRadioTests/src/android/hardware/radio/tests/functional/RadioTunerTest.java b/core/tests/BroadcastRadioTests/src/android/hardware/radio/tests/functional/RadioTunerTest.java
new file mode 100644
index 0000000..ee40c48
--- /dev/null
+++ b/core/tests/BroadcastRadioTests/src/android/hardware/radio/tests/functional/RadioTunerTest.java
@@ -0,0 +1,414 @@
+/*
+ * Copyright (C) 2017 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.hardware.radio.tests.functional;
+
+import android.Manifest;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.hardware.radio.ProgramSelector;
+import android.hardware.radio.RadioManager;
+import android.hardware.radio.RadioTuner;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+import android.test.suitebuilder.annotation.MediumTest;
+import android.util.Log;
+
+import java.lang.reflect.Constructor;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+import static org.junit.Assert.*;
+import static org.junit.Assume.*;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Mockito.after;
+import static org.mockito.Mockito.atLeast;
+import static org.mockito.Mockito.atMost;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.timeout;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.testng.Assert.assertThrows;
+
+/**
+ * A test for broadcast radio API.
+ */
+@RunWith(AndroidJUnit4.class)
+@MediumTest
+public class RadioTunerTest {
+ private static final String TAG = "BroadcastRadioTests.RadioTuner";
+
+ public final Context mContext = InstrumentationRegistry.getContext();
+
+ private final int kConfigCallbackTimeoutMs = 10000;
+ private final int kCancelTimeoutMs = 1000;
+ private final int kTuneCallbackTimeoutMs = 30000;
+ private final int kFullScanTimeoutMs = 60000;
+
+ private RadioManager mRadioManager;
+ private RadioTuner mRadioTuner;
+ private RadioManager.ModuleProperties mModule;
+ private final List<RadioManager.ModuleProperties> mModules = new ArrayList<>();
+ @Mock private RadioTuner.Callback mCallback;
+
+ RadioManager.AmBandDescriptor mAmBandDescriptor;
+ RadioManager.FmBandDescriptor mFmBandDescriptor;
+
+ RadioManager.BandConfig mAmBandConfig;
+ RadioManager.BandConfig mFmBandConfig;
+
+ @Before
+ public void setup() {
+ MockitoAnnotations.initMocks(this);
+
+ // check if radio is supported and skip the test if it's not
+ PackageManager packageManager = mContext.getPackageManager();
+ boolean isRadioSupported = packageManager.hasSystemFeature(
+ PackageManager.FEATURE_BROADCAST_RADIO);
+ assumeTrue(isRadioSupported);
+
+ // Check radio access permission
+ int res = mContext.checkCallingOrSelfPermission(Manifest.permission.ACCESS_BROADCAST_RADIO);
+ assertEquals("ACCESS_BROADCAST_RADIO permission not granted",
+ PackageManager.PERMISSION_GRANTED, res);
+
+ mRadioManager = (RadioManager)mContext.getSystemService(Context.RADIO_SERVICE);
+ assertNotNull(mRadioManager);
+
+ int status = mRadioManager.listModules(mModules);
+ assertEquals(RadioManager.STATUS_OK, status);
+ assertFalse(mModules.isEmpty());
+ }
+
+ @After
+ public void tearDown() {
+ mRadioManager = null;
+ mModules.clear();
+ if (mRadioTuner != null) {
+ mRadioTuner.close();
+ mRadioTuner = null;
+ }
+ resetCallback();
+ }
+
+ private void openTuner() {
+ openTuner(true);
+ }
+
+ private void resetCallback() {
+ verify(mCallback, atLeast(0)).onMetadataChanged(any());
+ verifyNoMoreInteractions(mCallback);
+ Mockito.reset(mCallback);
+ }
+
+ private void openTuner(boolean withAudio) {
+ assertNull(mRadioTuner);
+
+ // find FM band and build its config
+ mModule = mModules.get(0);
+ for (RadioManager.BandDescriptor band : mModule.getBands()) {
+ int bandType = band.getType();
+ if (bandType == RadioManager.BAND_AM || bandType == RadioManager.BAND_AM_HD) {
+ mAmBandDescriptor = (RadioManager.AmBandDescriptor)band;
+ }
+ if (bandType == RadioManager.BAND_FM || bandType == RadioManager.BAND_FM_HD) {
+ mFmBandDescriptor = (RadioManager.FmBandDescriptor)band;
+ }
+ }
+ assertNotNull(mAmBandDescriptor);
+ assertNotNull(mFmBandDescriptor);
+ mAmBandConfig = new RadioManager.AmBandConfig.Builder(mAmBandDescriptor).build();
+ mFmBandConfig = new RadioManager.FmBandConfig.Builder(mFmBandDescriptor).build();
+
+ mRadioTuner = mRadioManager.openTuner(mModule.getId(),
+ mFmBandConfig, withAudio, mCallback, null);
+ assertNotNull(mRadioTuner);
+ verify(mCallback, timeout(kConfigCallbackTimeoutMs)).onConfigurationChanged(any());
+ resetCallback();
+
+ boolean isAntennaConnected = mRadioTuner.isAntennaConnected();
+ assertTrue(isAntennaConnected);
+ }
+
+ @Test
+ public void testOpenTuner() {
+ openTuner();
+ }
+
+ @Test
+ public void testReopenTuner() throws Throwable {
+ openTuner();
+ mRadioTuner.close();
+ mRadioTuner = null;
+ Thread.sleep(100); // TODO(b/36122635): force reopen
+ openTuner();
+ }
+
+ @Test
+ public void testDoubleClose() {
+ openTuner();
+ mRadioTuner.close();
+ mRadioTuner.close();
+ }
+
+ @Test
+ public void testUseAfterClose() {
+ openTuner();
+ mRadioTuner.close();
+ int ret = mRadioTuner.cancel();
+ assertEquals(RadioManager.STATUS_INVALID_OPERATION, ret);
+ }
+
+ @Test
+ public void testSetAndGetConfiguration() {
+ openTuner();
+
+ // set
+ int ret = mRadioTuner.setConfiguration(mAmBandConfig);
+ assertEquals(RadioManager.STATUS_OK, ret);
+ verify(mCallback, timeout(kConfigCallbackTimeoutMs)).onConfigurationChanged(any());
+
+ // get
+ RadioManager.BandConfig[] config = new RadioManager.BandConfig[1];
+ ret = mRadioTuner.getConfiguration(config);
+ assertEquals(RadioManager.STATUS_OK, ret);
+
+ assertEquals(mAmBandConfig, config[0]);
+ }
+
+ @Test
+ public void testSetBadConfiguration() throws Throwable {
+ openTuner();
+
+ // set bad config
+ Constructor<RadioManager.AmBandConfig> configConstr =
+ RadioManager.AmBandConfig.class.getDeclaredConstructor(
+ int.class, int.class, int.class, int.class, int.class, boolean.class);
+ configConstr.setAccessible(true);
+ RadioManager.AmBandConfig badConfig = configConstr.newInstance(
+ 0 /*region*/, RadioManager.BAND_AM /*type*/,
+ 10000 /*lowerLimit*/, 1 /*upperLimit*/, 100 /*spacing*/, false /*stereo*/);
+ int ret = mRadioTuner.setConfiguration(badConfig);
+ assertEquals(RadioManager.STATUS_BAD_VALUE, ret);
+ verify(mCallback, never()).onConfigurationChanged(any());
+
+ // set null config
+ ret = mRadioTuner.setConfiguration(null);
+ assertEquals(RadioManager.STATUS_BAD_VALUE, ret);
+ verify(mCallback, never()).onConfigurationChanged(any());
+
+ // setting good config should recover
+ ret = mRadioTuner.setConfiguration(mAmBandConfig);
+ assertEquals(RadioManager.STATUS_OK, ret);
+ verify(mCallback, timeout(kConfigCallbackTimeoutMs)).onConfigurationChanged(any());
+ }
+
+ @Test
+ public void testMute() {
+ openTuner();
+
+ boolean isMuted = mRadioTuner.getMute();
+ assertFalse(isMuted);
+
+ int ret = mRadioTuner.setMute(true);
+ assertEquals(RadioManager.STATUS_OK, ret);
+ isMuted = mRadioTuner.getMute();
+ assertTrue(isMuted);
+
+ ret = mRadioTuner.setMute(false);
+ assertEquals(RadioManager.STATUS_OK, ret);
+ isMuted = mRadioTuner.getMute();
+ assertFalse(isMuted);
+ }
+
+ @Test
+ public void testMuteNoAudio() {
+ openTuner(false);
+
+ int ret = mRadioTuner.setMute(false);
+ assertEquals(RadioManager.STATUS_ERROR, ret);
+
+ boolean isMuted = mRadioTuner.getMute();
+ assertTrue(isMuted);
+ }
+
+ @Test
+ public void testStep() {
+ openTuner();
+
+ int ret = mRadioTuner.step(RadioTuner.DIRECTION_DOWN, true);
+ assertEquals(RadioManager.STATUS_OK, ret);
+ verify(mCallback, timeout(kTuneCallbackTimeoutMs)).onProgramInfoChanged(any());
+
+ resetCallback();
+
+ ret = mRadioTuner.step(RadioTuner.DIRECTION_UP, false);
+ assertEquals(RadioManager.STATUS_OK, ret);
+ verify(mCallback, timeout(kTuneCallbackTimeoutMs)).onProgramInfoChanged(any());
+ }
+
+ @Test
+ public void testTuneAndGetPI() {
+ openTuner();
+
+ int channel = mFmBandConfig.getLowerLimit() + mFmBandConfig.getSpacing();
+
+ // test tune
+ int ret = mRadioTuner.tune(channel, 0);
+ assertEquals(RadioManager.STATUS_OK, ret);
+ ArgumentCaptor<RadioManager.ProgramInfo> infoc =
+ ArgumentCaptor.forClass(RadioManager.ProgramInfo.class);
+ verify(mCallback, timeout(kTuneCallbackTimeoutMs))
+ .onProgramInfoChanged(infoc.capture());
+ assertEquals(channel, infoc.getValue().getChannel());
+
+ // test getProgramInformation
+ RadioManager.ProgramInfo[] info = new RadioManager.ProgramInfo[1];
+ ret = mRadioTuner.getProgramInformation(info);
+ assertEquals(RadioManager.STATUS_OK, ret);
+ assertNotNull(info[0]);
+ assertEquals(channel, info[0].getChannel());
+ }
+
+ @Test
+ public void testDummyCancel() {
+ openTuner();
+
+ int ret = mRadioTuner.cancel();
+ assertEquals(RadioManager.STATUS_OK, ret);
+ }
+
+ @Test
+ public void testLateCancel() {
+ openTuner();
+
+ int ret = mRadioTuner.step(RadioTuner.DIRECTION_DOWN, false);
+ assertEquals(RadioManager.STATUS_OK, ret);
+ verify(mCallback, timeout(kTuneCallbackTimeoutMs)).onProgramInfoChanged(any());
+
+ int cancelRet = mRadioTuner.cancel();
+ assertEquals(RadioManager.STATUS_OK, cancelRet);
+ }
+
+ @Test
+ public void testScanAndCancel() {
+ openTuner();
+
+ /* There is a possible race condition between scan and cancel commands - the scan may finish
+ * before cancel command is issued. Thus we accept both outcomes in this test.
+ */
+ int scanRet = mRadioTuner.scan(RadioTuner.DIRECTION_DOWN, true);
+ int cancelRet = mRadioTuner.cancel();
+
+ assertEquals(RadioManager.STATUS_OK, scanRet);
+ assertEquals(RadioManager.STATUS_OK, cancelRet);
+
+ verify(mCallback, after(kCancelTimeoutMs).atMost(1)).onError(RadioTuner.ERROR_CANCELLED);
+ verify(mCallback, atMost(1)).onProgramInfoChanged(any());
+ }
+
+ @Test
+ public void testStartBackgroundScan() {
+ openTuner();
+
+ boolean ret = mRadioTuner.startBackgroundScan();
+ boolean isSupported = mModule.isBackgroundScanningSupported();
+ assertEquals(isSupported, ret);
+ }
+
+ @Test
+ public void testGetProgramList() {
+ openTuner();
+
+ try {
+ List<RadioManager.ProgramInfo> list = mRadioTuner.getProgramList(null);
+ assertNotNull(list);
+ } catch (IllegalStateException e) {
+ // the list may or may not be ready at this point
+ Log.i(TAG, "Background list is not ready");
+ }
+ }
+
+ @Test
+ public void testTuneFromProgramList() {
+ openTuner();
+
+ List<RadioManager.ProgramInfo> list;
+
+ try {
+ list = mRadioTuner.getProgramList(null);
+ assertNotNull(list);
+ } catch (IllegalStateException e) {
+ Log.i(TAG, "Background list is not ready, trying to fix it");
+
+ boolean success = mRadioTuner.startBackgroundScan();
+ assertTrue(success);
+ verify(mCallback, timeout(kFullScanTimeoutMs)).onBackgroundScanComplete();
+
+ list = mRadioTuner.getProgramList(null);
+ assertNotNull(list);
+ }
+
+ if (list.isEmpty()) {
+ Log.i(TAG, "Program list is empty, can't test tune");
+ return;
+ }
+
+ ProgramSelector sel = list.get(0).getSelector();
+ mRadioTuner.tune(sel);
+ ArgumentCaptor<RadioManager.ProgramInfo> infoc =
+ ArgumentCaptor.forClass(RadioManager.ProgramInfo.class);
+ verify(mCallback, timeout(kTuneCallbackTimeoutMs)).onProgramInfoChanged(infoc.capture());
+ assertEquals(sel, infoc.getValue().getSelector());
+ }
+
+ @Test
+ public void testForcedAnalog() {
+ openTuner();
+
+ boolean isSupported = true;
+ boolean isForced;
+ try {
+ isForced = mRadioTuner.isAnalogForced();
+ assertFalse(isForced);
+ } catch (IllegalStateException ex) {
+ Log.i(TAG, "Forced analog switch is not supported by this tuner");
+ isSupported = false;
+ }
+
+ if (isSupported) {
+ mRadioTuner.setAnalogForced(true);
+ isForced = mRadioTuner.isAnalogForced();
+ assertTrue(isForced);
+
+ mRadioTuner.setAnalogForced(false);
+ isForced = mRadioTuner.isAnalogForced();
+ assertFalse(isForced);
+ } else {
+ assertThrows(IllegalStateException.class, () -> mRadioTuner.setAnalogForced(true));
+ }
+ }
+}
diff --git a/core/tests/coretests/README b/core/tests/coretests/README
index aced441..ea282a0 100644
--- a/core/tests/coretests/README
+++ b/core/tests/coretests/README
@@ -28,7 +28,7 @@
Next, install the resulting APK and run tests as you would normal JUnit tests:
- adb install out/target/product/.../data/app/FrameworksCoreTests/FrameworksCoreTests.apk
+ adb install -r ${ANDROID_PRODUCT_OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk
adb shell am instrument -w \
com.android.frameworks.coretests/android.support.test.runner.AndroidJUnitRunner
diff --git a/core/tests/coretests/apks/install_multi_package/Android.mk b/core/tests/coretests/apks/install_multi_package/Android.mk
new file mode 100644
index 0000000..2813dad2
--- /dev/null
+++ b/core/tests/coretests/apks/install_multi_package/Android.mk
@@ -0,0 +1,12 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-subdir-java-files)
+
+LOCAL_PACKAGE_NAME := install_multi_package
+
+include $(FrameworkCoreTests_BUILD_PACKAGE)
+#include $(BUILD_PACKAGE)
+
diff --git a/core/tests/coretests/apks/install_multi_package/AndroidManifest.xml b/core/tests/coretests/apks/install_multi_package/AndroidManifest.xml
new file mode 100644
index 0000000..5164cae
--- /dev/null
+++ b/core/tests/coretests/apks/install_multi_package/AndroidManifest.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<manifest
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.frameworks.coretests.install_multi_package">
+
+<!--
+ This manifest is has child packages with components.
+-->
+
+ <uses-feature
+ android:name="com.android.frameworks.coretests.nonexistent" />
+ <uses-configuration
+ android:reqFiveWayNav="false" />
+
+ <instrumentation
+ android:name="android.test.InstrumentationTestRunner"
+ android:targetPackage="com.android.frameworks.coretests"
+ android:label="Frameworks Core Tests" />
+
+ <permission
+ android:label="test permission"
+ android:name="test_permission"
+ android:protectionLevel="normal" />
+ <uses-permission android:name="android.permission.INTERNET" />
+
+<!--
+ NOTE: This declares a child package, application, then another child
+ package, to test potential bugs that are order-dependent. Also, each
+ one varies the order.
+-->
+
+ <package package="com.android.frameworks.coretests.install_multi_package.first_child">
+ <uses-permission android:name="android.permission.NFC" />
+ <!-- NOTE: A declared permission is ignored since the tag is not whitelisted. -->
+ <permission
+ android:label="test permission"
+ android:name="first_child_permission"
+ android:protectionLevel="signature" />
+ <application
+ android:hasCode="true">
+ <activity
+ android:name="com.android.frameworks.coretests.FirstChildTestActivity">
+ </activity>
+ <provider
+ android:name="com.android.frameworks.coretests.FirstChildTestProvider"
+ android:authorities="com.android.frameworks.coretests.testprovider" />
+ <receiver
+ android:name="com.android.frameworks.coretests.FirstChildTestReceiver" />
+ <service
+ android:name="com.android.frameworks.coretests.FirstChildTestService" />
+ </application>
+ </package>
+
+ <application
+ android:hasCode="true">
+ <service
+ android:name="com.android.frameworks.coretests.TestService" />
+ <activity
+ android:name="com.android.frameworks.coretests.TestActivity">
+ </activity>
+ <provider
+ android:name="com.android.frameworks.coretests.TestProvider"
+ android:authorities="com.android.frameworks.coretests.testprovider" />
+ <receiver
+ android:name="com.android.frameworks.coretests.TestReceiver" />
+ </application>
+
+ <package package="com.android.frameworks.coretests.blah.second_child">
+ <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+ <uses-permission-sdk-23 android:name="android.permission.READ_CONTACTS" />
+ <!-- NOTE: A declared permission is ignored since the tag is not whitelisted. -->
+ <permission
+ android:label="test permission"
+ android:name="second_child_permission"
+ android:protectionLevel="dangerous" />
+ <application
+ android:hasCode="true">
+ <receiver
+ android:name="com.android.frameworks.coretests.SecondChildTestReceiver" />
+ <service
+ android:name="com.android.frameworks.coretests.SecondChildTestService" />
+ <activity
+ android:name="com.android.frameworks.coretests.SecondChildTestActivity">
+ </activity>
+ <provider
+ android:name="com.android.frameworks.coretests.SecondChildTestProvider"
+ android:authorities="com.android.frameworks.coretests.testprovider" />
+ </application>
+ </package>
+</manifest>
diff --git a/core/tests/coretests/apks/install_multi_package/src/com/android/frameworks/coretests/FirstChildTestActivity.java b/core/tests/coretests/apks/install_multi_package/src/com/android/frameworks/coretests/FirstChildTestActivity.java
new file mode 100644
index 0000000..57afcb0
--- /dev/null
+++ b/core/tests/coretests/apks/install_multi_package/src/com/android/frameworks/coretests/FirstChildTestActivity.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.android.frameworks.coretests;
+
+import android.app.Activity;
+
+public class FirstChildTestActivity extends Activity {
+
+}
diff --git a/core/tests/coretests/apks/install_multi_package/src/com/android/frameworks/coretests/FirstChildTestProvider.java b/core/tests/coretests/apks/install_multi_package/src/com/android/frameworks/coretests/FirstChildTestProvider.java
new file mode 100644
index 0000000..2816865
--- /dev/null
+++ b/core/tests/coretests/apks/install_multi_package/src/com/android/frameworks/coretests/FirstChildTestProvider.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.android.frameworks.coretests;
+
+import android.content.ContentProvider;
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.net.Uri;
+
+public class FirstChildTestProvider extends ContentProvider {
+
+ @Override
+ public boolean onCreate() {
+ return false;
+ }
+
+ @Override
+ public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
+ String sortOrder) {
+ return null;
+ }
+
+ @Override
+ public String getType(Uri uri) {
+ return null;
+ }
+
+ @Override
+ public Uri insert(Uri uri, ContentValues values) {
+ return null;
+ }
+
+ @Override
+ public int delete(Uri uri, String selection, String[] selectionArgs) {
+ return 0;
+ }
+
+ @Override
+ public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+ return 0;
+ }
+}
diff --git a/core/tests/coretests/apks/install_multi_package/src/com/android/frameworks/coretests/FirstChildTestReceiver.java b/core/tests/coretests/apks/install_multi_package/src/com/android/frameworks/coretests/FirstChildTestReceiver.java
new file mode 100644
index 0000000..ffe84b7
--- /dev/null
+++ b/core/tests/coretests/apks/install_multi_package/src/com/android/frameworks/coretests/FirstChildTestReceiver.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.android.frameworks.coretests;
+
+import android.content.ContentProvider;
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.net.Uri;
+
+public class FirstChildTestReceiver extends ContentProvider {
+
+ @Override
+ public boolean onCreate() {
+ return false;
+ }
+
+ @Override
+ public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
+ String sortOrder) {
+ return null;
+ }
+
+ @Override
+ public String getType(Uri uri) {
+ return null;
+ }
+
+ @Override
+ public Uri insert(Uri uri, ContentValues values) {
+ return null;
+ }
+
+ @Override
+ public int delete(Uri uri, String selection, String[] selectionArgs) {
+ return 0;
+ }
+
+ @Override
+ public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+ return 0;
+ }
+}
diff --git a/core/tests/coretests/apks/install_multi_package/src/com/android/frameworks/coretests/FirstChildTestService.java b/core/tests/coretests/apks/install_multi_package/src/com/android/frameworks/coretests/FirstChildTestService.java
new file mode 100644
index 0000000..faa6e9c
--- /dev/null
+++ b/core/tests/coretests/apks/install_multi_package/src/com/android/frameworks/coretests/FirstChildTestService.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.android.frameworks.coretests;
+
+import android.app.Service;
+import android.content.Intent;
+import android.os.IBinder;
+
+public class FirstChildTestService extends Service {
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ return null;
+ }
+}
diff --git a/core/tests/coretests/apks/install_multi_package/src/com/android/frameworks/coretests/SecondChildTestActivity.java b/core/tests/coretests/apks/install_multi_package/src/com/android/frameworks/coretests/SecondChildTestActivity.java
new file mode 100644
index 0000000..e89f264
--- /dev/null
+++ b/core/tests/coretests/apks/install_multi_package/src/com/android/frameworks/coretests/SecondChildTestActivity.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.android.frameworks.coretests;
+
+import android.app.Activity;
+
+public class SecondChildTestActivity extends Activity {
+
+}
diff --git a/core/tests/coretests/apks/install_multi_package/src/com/android/frameworks/coretests/SecondChildTestProvider.java b/core/tests/coretests/apks/install_multi_package/src/com/android/frameworks/coretests/SecondChildTestProvider.java
new file mode 100644
index 0000000..2bd40a5
--- /dev/null
+++ b/core/tests/coretests/apks/install_multi_package/src/com/android/frameworks/coretests/SecondChildTestProvider.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.android.frameworks.coretests;
+
+import android.content.ContentProvider;
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.net.Uri;
+
+public class SecondChildTestProvider extends ContentProvider {
+
+ @Override
+ public boolean onCreate() {
+ return false;
+ }
+
+ @Override
+ public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
+ String sortOrder) {
+ return null;
+ }
+
+ @Override
+ public String getType(Uri uri) {
+ return null;
+ }
+
+ @Override
+ public Uri insert(Uri uri, ContentValues values) {
+ return null;
+ }
+
+ @Override
+ public int delete(Uri uri, String selection, String[] selectionArgs) {
+ return 0;
+ }
+
+ @Override
+ public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+ return 0;
+ }
+}
diff --git a/core/tests/coretests/apks/install_multi_package/src/com/android/frameworks/coretests/SecondChildTestReceiver.java b/core/tests/coretests/apks/install_multi_package/src/com/android/frameworks/coretests/SecondChildTestReceiver.java
new file mode 100644
index 0000000..a6c4ddc
--- /dev/null
+++ b/core/tests/coretests/apks/install_multi_package/src/com/android/frameworks/coretests/SecondChildTestReceiver.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.android.frameworks.coretests;
+
+import android.content.ContentProvider;
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.net.Uri;
+
+public class SecondChildTestReceiver extends ContentProvider {
+
+ @Override
+ public boolean onCreate() {
+ return false;
+ }
+
+ @Override
+ public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
+ String sortOrder) {
+ return null;
+ }
+
+ @Override
+ public String getType(Uri uri) {
+ return null;
+ }
+
+ @Override
+ public Uri insert(Uri uri, ContentValues values) {
+ return null;
+ }
+
+ @Override
+ public int delete(Uri uri, String selection, String[] selectionArgs) {
+ return 0;
+ }
+
+ @Override
+ public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+ return 0;
+ }
+}
diff --git a/core/tests/coretests/apks/install_multi_package/src/com/android/frameworks/coretests/SecondChildTestService.java b/core/tests/coretests/apks/install_multi_package/src/com/android/frameworks/coretests/SecondChildTestService.java
new file mode 100644
index 0000000..1e721aa
--- /dev/null
+++ b/core/tests/coretests/apks/install_multi_package/src/com/android/frameworks/coretests/SecondChildTestService.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.android.frameworks.coretests;
+
+import android.app.Service;
+import android.content.Intent;
+import android.os.IBinder;
+
+public class SecondChildTestService extends Service {
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ return null;
+ }
+}
diff --git a/core/tests/coretests/apks/install_multi_package/src/com/android/frameworks/coretests/TestActivity.java b/core/tests/coretests/apks/install_multi_package/src/com/android/frameworks/coretests/TestActivity.java
new file mode 100644
index 0000000..10d0551
--- /dev/null
+++ b/core/tests/coretests/apks/install_multi_package/src/com/android/frameworks/coretests/TestActivity.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.android.frameworks.coretests;
+
+import android.app.Activity;
+
+public class TestActivity extends Activity {
+
+}
diff --git a/core/tests/coretests/apks/install_multi_package/src/com/android/frameworks/coretests/TestProvider.java b/core/tests/coretests/apks/install_multi_package/src/com/android/frameworks/coretests/TestProvider.java
new file mode 100644
index 0000000..59f9f10
--- /dev/null
+++ b/core/tests/coretests/apks/install_multi_package/src/com/android/frameworks/coretests/TestProvider.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.android.frameworks.coretests;
+
+import android.content.ContentProvider;
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.net.Uri;
+
+public class TestProvider extends ContentProvider {
+
+ @Override
+ public boolean onCreate() {
+ return false;
+ }
+
+ @Override
+ public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
+ String sortOrder) {
+ return null;
+ }
+
+ @Override
+ public String getType(Uri uri) {
+ return null;
+ }
+
+ @Override
+ public Uri insert(Uri uri, ContentValues values) {
+ return null;
+ }
+
+ @Override
+ public int delete(Uri uri, String selection, String[] selectionArgs) {
+ return 0;
+ }
+
+ @Override
+ public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+ return 0;
+ }
+}
diff --git a/core/tests/coretests/apks/install_multi_package/src/com/android/frameworks/coretests/TestReceiver.java b/core/tests/coretests/apks/install_multi_package/src/com/android/frameworks/coretests/TestReceiver.java
new file mode 100644
index 0000000..21f6263
--- /dev/null
+++ b/core/tests/coretests/apks/install_multi_package/src/com/android/frameworks/coretests/TestReceiver.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.android.frameworks.coretests;
+
+import android.content.ContentProvider;
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.net.Uri;
+
+public class TestReceiver extends ContentProvider {
+
+ @Override
+ public boolean onCreate() {
+ return false;
+ }
+
+ @Override
+ public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
+ String sortOrder) {
+ return null;
+ }
+
+ @Override
+ public String getType(Uri uri) {
+ return null;
+ }
+
+ @Override
+ public Uri insert(Uri uri, ContentValues values) {
+ return null;
+ }
+
+ @Override
+ public int delete(Uri uri, String selection, String[] selectionArgs) {
+ return 0;
+ }
+
+ @Override
+ public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+ return 0;
+ }
+}
diff --git a/core/tests/coretests/apks/install_multi_package/src/com/android/frameworks/coretests/TestService.java b/core/tests/coretests/apks/install_multi_package/src/com/android/frameworks/coretests/TestService.java
new file mode 100644
index 0000000..b330e75
--- /dev/null
+++ b/core/tests/coretests/apks/install_multi_package/src/com/android/frameworks/coretests/TestService.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.android.frameworks.coretests;
+
+import android.app.Service;
+import android.content.Intent;
+import android.os.IBinder;
+
+public class TestService extends Service {
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ return null;
+ }
+}
diff --git a/core/tests/coretests/assets/fonts/a3em.ttf b/core/tests/coretests/assets/fonts/a3em.ttf
new file mode 100644
index 0000000..a601ce2
--- /dev/null
+++ b/core/tests/coretests/assets/fonts/a3em.ttf
Binary files differ
diff --git a/core/tests/coretests/assets/fonts/a3em.ttx b/core/tests/coretests/assets/fonts/a3em.ttx
new file mode 100644
index 0000000..d3b9e16
--- /dev/null
+++ b/core/tests/coretests/assets/fonts/a3em.ttx
@@ -0,0 +1,187 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.0">
+
+ <GlyphOrder>
+ <GlyphID id="0" name=".notdef"/>
+ <GlyphID id="1" name="1em"/>
+ <GlyphID id="2" name="3em"/>
+ </GlyphOrder>
+
+ <head>
+ <tableVersion value="1.0"/>
+ <fontRevision value="1.0"/>
+ <checkSumAdjustment value="0x640cdb2f"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Fri Mar 17 07:26:00 2017"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="7"/>
+ <fontDirectionHint value="2"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="1.0"/>
+ <ascent value="1000"/>
+ <descent value="-200"/>
+ <lineGap value="0"/>
+ <caretSlopeRise value="1"/>
+ <caretSlopeRun value="0"/>
+ <caretOffset value="0"/>
+ <reserved0 value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <metricDataFormat value="0"/>
+ </hhea>
+
+ <maxp>
+ <tableVersion value="0x10000"/>
+ <maxZones value="0"/>
+ <maxTwilightPoints value="0"/>
+ <maxStorage value="0"/>
+ <maxFunctionDefs value="0"/>
+ <maxInstructionDefs value="0"/>
+ <maxStackElements value="0"/>
+ <maxSizeOfInstructions value="0"/>
+ <maxComponentElements value="0"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="3"/>
+ <xAvgCharWidth value="594"/>
+ <usWeightClass value="400"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00001000"/>
+ <ySubscriptXSize value="650"/>
+ <ySubscriptYSize value="600"/>
+ <ySubscriptXOffset value="0"/>
+ <ySubscriptYOffset value="75"/>
+ <ySuperscriptXSize value="650"/>
+ <ySuperscriptYSize value="600"/>
+ <ySuperscriptXOffset value="0"/>
+ <ySuperscriptYOffset value="350"/>
+ <yStrikeoutSize value="50"/>
+ <yStrikeoutPosition value="300"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="0"/>
+ <bSerifStyle value="0"/>
+ <bWeight value="5"/>
+ <bProportion value="0"/>
+ <bContrast value="0"/>
+ <bStrokeVariation value="0"/>
+ <bArmStyle value="0"/>
+ <bLetterForm value="0"/>
+ <bMidline value="0"/>
+ <bXHeight value="0"/>
+ </panose>
+ <ulUnicodeRange1 value="00000000 00000000 00000000 00000001"/>
+ <ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+ <achVendID value="UKWN"/>
+ <fsSelection value="00000000 01000000"/>
+ <usFirstCharIndex value="32"/>
+ <usLastCharIndex value="122"/>
+ <sTypoAscender value="800"/>
+ <sTypoDescender value="-200"/>
+ <sTypoLineGap value="200"/>
+ <usWinAscent value="1000"/>
+ <usWinDescent value="200"/>
+ <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="500"/>
+ <sCapHeight value="700"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="0"/>
+ </OS_2>
+
+ <hmtx>
+ <mtx name=".notdef" width="500" lsb="93"/>
+ <mtx name="1em" width="1000" lsb="93"/>
+ <mtx name="3em" width="3000" lsb="93"/>
+ </hmtx>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="3" platEncID="10" language="0">
+ <map code="0x0061" name="3em" />
+ <map code="0x0062" name="1em" />
+ <map code="0x0063" name="1em" />
+ <map code="0x0064" name="1em" />
+ <map code="0x0065" name="1em" />
+ </cmap_format_4>
+ </cmap>
+
+ <loca>
+ <!-- The 'loca' table will be calculated by the compiler -->
+ </loca>
+
+ <glyf>
+ <TTGlyph name=".notdef" xMin="0" yMin="0" xMax="0" yMax="0" />
+ <TTGlyph name="1em" xMin="0" yMin="0" xMax="0" yMax="0" />
+ <TTGlyph name="3em" xMin="0" yMin="0" xMax="0" yMax="0" />
+ </glyf>
+
+ <name>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright (C) 2017 The Android Open Source Project
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ Sample Font
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ Sample Font
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ SampleFont-Regular
+ </namerecord>
+ <namerecord nameID="13" platformID="3" platEncID="1" langID="0x409">
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ 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.
+ </namerecord>
+ <namerecord nameID="14" platformID="3" platEncID="1" langID="0x409">
+ http://www.apache.org/licenses/LICENSE-2.0
+ </namerecord>
+ </name>
+
+ <post>
+ <formatType value="3.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-75"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ </post>
+
+</ttFont>
diff --git a/core/tests/coretests/assets/fonts/all2em.ttf b/core/tests/coretests/assets/fonts/all2em.ttf
new file mode 100644
index 0000000..482f755
--- /dev/null
+++ b/core/tests/coretests/assets/fonts/all2em.ttf
Binary files differ
diff --git a/core/tests/coretests/assets/fonts/all2em.ttx b/core/tests/coretests/assets/fonts/all2em.ttx
new file mode 100644
index 0000000..fe95ff0
--- /dev/null
+++ b/core/tests/coretests/assets/fonts/all2em.ttx
@@ -0,0 +1,184 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.0">
+
+ <GlyphOrder>
+ <GlyphID id="0" name=".notdef"/>
+ <GlyphID id="1" name="2em"/>
+ </GlyphOrder>
+
+ <head>
+ <tableVersion value="1.0"/>
+ <fontRevision value="1.0"/>
+ <checkSumAdjustment value="0x640cdb2f"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Fri Mar 17 07:26:00 2017"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="7"/>
+ <fontDirectionHint value="2"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="1.0"/>
+ <ascent value="1000"/>
+ <descent value="-200"/>
+ <lineGap value="0"/>
+ <caretSlopeRise value="1"/>
+ <caretSlopeRun value="0"/>
+ <caretOffset value="0"/>
+ <reserved0 value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <metricDataFormat value="0"/>
+ </hhea>
+
+ <maxp>
+ <tableVersion value="0x10000"/>
+ <maxZones value="0"/>
+ <maxTwilightPoints value="0"/>
+ <maxStorage value="0"/>
+ <maxFunctionDefs value="0"/>
+ <maxInstructionDefs value="0"/>
+ <maxStackElements value="0"/>
+ <maxSizeOfInstructions value="0"/>
+ <maxComponentElements value="0"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="3"/>
+ <xAvgCharWidth value="594"/>
+ <usWeightClass value="400"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00001000"/>
+ <ySubscriptXSize value="650"/>
+ <ySubscriptYSize value="600"/>
+ <ySubscriptXOffset value="0"/>
+ <ySubscriptYOffset value="75"/>
+ <ySuperscriptXSize value="650"/>
+ <ySuperscriptYSize value="600"/>
+ <ySuperscriptXOffset value="0"/>
+ <ySuperscriptYOffset value="350"/>
+ <yStrikeoutSize value="50"/>
+ <yStrikeoutPosition value="300"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="0"/>
+ <bSerifStyle value="0"/>
+ <bWeight value="5"/>
+ <bProportion value="0"/>
+ <bContrast value="0"/>
+ <bStrokeVariation value="0"/>
+ <bArmStyle value="0"/>
+ <bLetterForm value="0"/>
+ <bMidline value="0"/>
+ <bXHeight value="0"/>
+ </panose>
+ <ulUnicodeRange1 value="00000000 00000000 00000000 00000001"/>
+ <ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+ <achVendID value="UKWN"/>
+ <fsSelection value="00000000 01000000"/>
+ <usFirstCharIndex value="32"/>
+ <usLastCharIndex value="122"/>
+ <sTypoAscender value="800"/>
+ <sTypoDescender value="-200"/>
+ <sTypoLineGap value="200"/>
+ <usWinAscent value="1000"/>
+ <usWinDescent value="200"/>
+ <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="500"/>
+ <sCapHeight value="700"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="0"/>
+ </OS_2>
+
+ <hmtx>
+ <mtx name=".notdef" width="500" lsb="93"/>
+ <mtx name="2em" width="1000" lsb="93"/>
+ </hmtx>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="3" platEncID="10" language="0">
+ <map code="0x0061" name="2em" />
+ <map code="0x0062" name="2em" />
+ <map code="0x0063" name="2em" />
+ <map code="0x0064" name="2em" />
+ <map code="0x0065" name="2em" />
+ </cmap_format_4>
+ </cmap>
+
+ <loca>
+ <!-- The 'loca' table will be calculated by the compiler -->
+ </loca>
+
+ <glyf>
+ <TTGlyph name=".notdef" xMin="0" yMin="0" xMax="0" yMax="0" />
+ <TTGlyph name="2em" xMin="0" yMin="0" xMax="0" yMax="0" />
+ </glyf>
+
+ <name>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright (C) 2017 The Android Open Source Project
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ Sample Font
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ Sample Font
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ SampleFont-Regular
+ </namerecord>
+ <namerecord nameID="13" platformID="3" platEncID="1" langID="0x409">
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ 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.
+ </namerecord>
+ <namerecord nameID="14" platformID="3" platEncID="1" langID="0x409">
+ http://www.apache.org/licenses/LICENSE-2.0
+ </namerecord>
+ </name>
+
+ <post>
+ <formatType value="3.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-75"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ </post>
+
+</ttFont>
diff --git a/core/tests/coretests/assets/fonts/b3em.ttf b/core/tests/coretests/assets/fonts/b3em.ttf
new file mode 100644
index 0000000..63948a2
--- /dev/null
+++ b/core/tests/coretests/assets/fonts/b3em.ttf
Binary files differ
diff --git a/core/tests/coretests/assets/fonts/b3em.ttx b/core/tests/coretests/assets/fonts/b3em.ttx
new file mode 100644
index 0000000..b5a77ef
--- /dev/null
+++ b/core/tests/coretests/assets/fonts/b3em.ttx
@@ -0,0 +1,187 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.0">
+
+ <GlyphOrder>
+ <GlyphID id="0" name=".notdef"/>
+ <GlyphID id="1" name="1em"/>
+ <GlyphID id="2" name="3em"/>
+ </GlyphOrder>
+
+ <head>
+ <tableVersion value="1.0"/>
+ <fontRevision value="1.0"/>
+ <checkSumAdjustment value="0x640cdb2f"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Fri Mar 17 07:26:00 2017"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="7"/>
+ <fontDirectionHint value="2"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="1.0"/>
+ <ascent value="1000"/>
+ <descent value="-200"/>
+ <lineGap value="0"/>
+ <caretSlopeRise value="1"/>
+ <caretSlopeRun value="0"/>
+ <caretOffset value="0"/>
+ <reserved0 value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <metricDataFormat value="0"/>
+ </hhea>
+
+ <maxp>
+ <tableVersion value="0x10000"/>
+ <maxZones value="0"/>
+ <maxTwilightPoints value="0"/>
+ <maxStorage value="0"/>
+ <maxFunctionDefs value="0"/>
+ <maxInstructionDefs value="0"/>
+ <maxStackElements value="0"/>
+ <maxSizeOfInstructions value="0"/>
+ <maxComponentElements value="0"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="3"/>
+ <xAvgCharWidth value="594"/>
+ <usWeightClass value="400"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00001000"/>
+ <ySubscriptXSize value="650"/>
+ <ySubscriptYSize value="600"/>
+ <ySubscriptXOffset value="0"/>
+ <ySubscriptYOffset value="75"/>
+ <ySuperscriptXSize value="650"/>
+ <ySuperscriptYSize value="600"/>
+ <ySuperscriptXOffset value="0"/>
+ <ySuperscriptYOffset value="350"/>
+ <yStrikeoutSize value="50"/>
+ <yStrikeoutPosition value="300"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="0"/>
+ <bSerifStyle value="0"/>
+ <bWeight value="5"/>
+ <bProportion value="0"/>
+ <bContrast value="0"/>
+ <bStrokeVariation value="0"/>
+ <bArmStyle value="0"/>
+ <bLetterForm value="0"/>
+ <bMidline value="0"/>
+ <bXHeight value="0"/>
+ </panose>
+ <ulUnicodeRange1 value="00000000 00000000 00000000 00000001"/>
+ <ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+ <achVendID value="UKWN"/>
+ <fsSelection value="00000000 01000000"/>
+ <usFirstCharIndex value="32"/>
+ <usLastCharIndex value="122"/>
+ <sTypoAscender value="800"/>
+ <sTypoDescender value="-200"/>
+ <sTypoLineGap value="200"/>
+ <usWinAscent value="1000"/>
+ <usWinDescent value="200"/>
+ <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="500"/>
+ <sCapHeight value="700"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="0"/>
+ </OS_2>
+
+ <hmtx>
+ <mtx name=".notdef" width="500" lsb="93"/>
+ <mtx name="1em" width="1000" lsb="93"/>
+ <mtx name="3em" width="3000" lsb="93"/>
+ </hmtx>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="3" platEncID="10" language="0">
+ <map code="0x0061" name="1em" />
+ <map code="0x0062" name="3em" />
+ <map code="0x0063" name="1em" />
+ <map code="0x0064" name="1em" />
+ <map code="0x0065" name="1em" />
+ </cmap_format_4>
+ </cmap>
+
+ <loca>
+ <!-- The 'loca' table will be calculated by the compiler -->
+ </loca>
+
+ <glyf>
+ <TTGlyph name=".notdef" xMin="0" yMin="0" xMax="0" yMax="0" />
+ <TTGlyph name="1em" xMin="0" yMin="0" xMax="0" yMax="0" />
+ <TTGlyph name="3em" xMin="0" yMin="0" xMax="0" yMax="0" />
+ </glyf>
+
+ <name>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright (C) 2017 The Android Open Source Project
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ Sample Font
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ Sample Font
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ SampleFont-Regular
+ </namerecord>
+ <namerecord nameID="13" platformID="3" platEncID="1" langID="0x409">
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ 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.
+ </namerecord>
+ <namerecord nameID="14" platformID="3" platEncID="1" langID="0x409">
+ http://www.apache.org/licenses/LICENSE-2.0
+ </namerecord>
+ </name>
+
+ <post>
+ <formatType value="3.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-75"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ </post>
+
+</ttFont>
diff --git a/core/tests/coretests/assets/fonts/c3em.ttf b/core/tests/coretests/assets/fonts/c3em.ttf
new file mode 100644
index 0000000..badc3e2
--- /dev/null
+++ b/core/tests/coretests/assets/fonts/c3em.ttf
Binary files differ
diff --git a/core/tests/coretests/assets/fonts/c3em.ttx b/core/tests/coretests/assets/fonts/c3em.ttx
new file mode 100644
index 0000000..f5ed8e5
--- /dev/null
+++ b/core/tests/coretests/assets/fonts/c3em.ttx
@@ -0,0 +1,187 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.0">
+
+ <GlyphOrder>
+ <GlyphID id="0" name=".notdef"/>
+ <GlyphID id="1" name="1em"/>
+ <GlyphID id="2" name="3em"/>
+ </GlyphOrder>
+
+ <head>
+ <tableVersion value="1.0"/>
+ <fontRevision value="1.0"/>
+ <checkSumAdjustment value="0x640cdb2f"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Fri Mar 17 07:26:00 2017"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="7"/>
+ <fontDirectionHint value="2"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="1.0"/>
+ <ascent value="1000"/>
+ <descent value="-200"/>
+ <lineGap value="0"/>
+ <caretSlopeRise value="1"/>
+ <caretSlopeRun value="0"/>
+ <caretOffset value="0"/>
+ <reserved0 value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <metricDataFormat value="0"/>
+ </hhea>
+
+ <maxp>
+ <tableVersion value="0x10000"/>
+ <maxZones value="0"/>
+ <maxTwilightPoints value="0"/>
+ <maxStorage value="0"/>
+ <maxFunctionDefs value="0"/>
+ <maxInstructionDefs value="0"/>
+ <maxStackElements value="0"/>
+ <maxSizeOfInstructions value="0"/>
+ <maxComponentElements value="0"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="3"/>
+ <xAvgCharWidth value="594"/>
+ <usWeightClass value="400"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00001000"/>
+ <ySubscriptXSize value="650"/>
+ <ySubscriptYSize value="600"/>
+ <ySubscriptXOffset value="0"/>
+ <ySubscriptYOffset value="75"/>
+ <ySuperscriptXSize value="650"/>
+ <ySuperscriptYSize value="600"/>
+ <ySuperscriptXOffset value="0"/>
+ <ySuperscriptYOffset value="350"/>
+ <yStrikeoutSize value="50"/>
+ <yStrikeoutPosition value="300"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="0"/>
+ <bSerifStyle value="0"/>
+ <bWeight value="5"/>
+ <bProportion value="0"/>
+ <bContrast value="0"/>
+ <bStrokeVariation value="0"/>
+ <bArmStyle value="0"/>
+ <bLetterForm value="0"/>
+ <bMidline value="0"/>
+ <bXHeight value="0"/>
+ </panose>
+ <ulUnicodeRange1 value="00000000 00000000 00000000 00000001"/>
+ <ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+ <achVendID value="UKWN"/>
+ <fsSelection value="00000000 01000000"/>
+ <usFirstCharIndex value="32"/>
+ <usLastCharIndex value="122"/>
+ <sTypoAscender value="800"/>
+ <sTypoDescender value="-200"/>
+ <sTypoLineGap value="200"/>
+ <usWinAscent value="1000"/>
+ <usWinDescent value="200"/>
+ <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="500"/>
+ <sCapHeight value="700"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="0"/>
+ </OS_2>
+
+ <hmtx>
+ <mtx name=".notdef" width="500" lsb="93"/>
+ <mtx name="1em" width="1000" lsb="93"/>
+ <mtx name="3em" width="3000" lsb="93"/>
+ </hmtx>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="3" platEncID="10" language="0">
+ <map code="0x0061" name="1em" />
+ <map code="0x0062" name="1em" />
+ <map code="0x0063" name="3em" />
+ <map code="0x0064" name="1em" />
+ <map code="0x0065" name="1em" />
+ </cmap_format_4>
+ </cmap>
+
+ <loca>
+ <!-- The 'loca' table will be calculated by the compiler -->
+ </loca>
+
+ <glyf>
+ <TTGlyph name=".notdef" xMin="0" yMin="0" xMax="0" yMax="0" />
+ <TTGlyph name="1em" xMin="0" yMin="0" xMax="0" yMax="0" />
+ <TTGlyph name="3em" xMin="0" yMin="0" xMax="0" yMax="0" />
+ </glyf>
+
+ <name>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright (C) 2017 The Android Open Source Project
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ Sample Font
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ Sample Font
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ SampleFont-Regular
+ </namerecord>
+ <namerecord nameID="13" platformID="3" platEncID="1" langID="0x409">
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ 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.
+ </namerecord>
+ <namerecord nameID="14" platformID="3" platEncID="1" langID="0x409">
+ http://www.apache.org/licenses/LICENSE-2.0
+ </namerecord>
+ </name>
+
+ <post>
+ <formatType value="3.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-75"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ </post>
+
+</ttFont>
diff --git a/core/tests/coretests/assets/fonts/no_coverage.ttf b/core/tests/coretests/assets/fonts/no_coverage.ttf
new file mode 100644
index 0000000..c884881
--- /dev/null
+++ b/core/tests/coretests/assets/fonts/no_coverage.ttf
Binary files differ
diff --git a/core/tests/coretests/assets/fonts/no_coverage.ttx b/core/tests/coretests/assets/fonts/no_coverage.ttx
new file mode 100644
index 0000000..3be5f86
--- /dev/null
+++ b/core/tests/coretests/assets/fonts/no_coverage.ttx
@@ -0,0 +1,180 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.0">
+
+ <GlyphOrder>
+ <GlyphID id="0" name=".notdef"/>
+ <GlyphID id="1" name="dummy"/>
+ </GlyphOrder>
+
+ <head>
+ <tableVersion value="1.0"/>
+ <fontRevision value="1.0"/>
+ <checkSumAdjustment value="0x640cdb2f"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Fri Mar 17 07:26:00 2017"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="7"/>
+ <fontDirectionHint value="2"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="1.0"/>
+ <ascent value="1000"/>
+ <descent value="-200"/>
+ <lineGap value="0"/>
+ <caretSlopeRise value="1"/>
+ <caretSlopeRun value="0"/>
+ <caretOffset value="0"/>
+ <reserved0 value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <metricDataFormat value="0"/>
+ </hhea>
+
+ <maxp>
+ <tableVersion value="0x10000"/>
+ <maxZones value="0"/>
+ <maxTwilightPoints value="0"/>
+ <maxStorage value="0"/>
+ <maxFunctionDefs value="0"/>
+ <maxInstructionDefs value="0"/>
+ <maxStackElements value="0"/>
+ <maxSizeOfInstructions value="0"/>
+ <maxComponentElements value="0"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="3"/>
+ <xAvgCharWidth value="594"/>
+ <usWeightClass value="400"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00001000"/>
+ <ySubscriptXSize value="650"/>
+ <ySubscriptYSize value="600"/>
+ <ySubscriptXOffset value="0"/>
+ <ySubscriptYOffset value="75"/>
+ <ySuperscriptXSize value="650"/>
+ <ySuperscriptYSize value="600"/>
+ <ySuperscriptXOffset value="0"/>
+ <ySuperscriptYOffset value="350"/>
+ <yStrikeoutSize value="50"/>
+ <yStrikeoutPosition value="300"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="0"/>
+ <bSerifStyle value="0"/>
+ <bWeight value="5"/>
+ <bProportion value="0"/>
+ <bContrast value="0"/>
+ <bStrokeVariation value="0"/>
+ <bArmStyle value="0"/>
+ <bLetterForm value="0"/>
+ <bMidline value="0"/>
+ <bXHeight value="0"/>
+ </panose>
+ <ulUnicodeRange1 value="00000000 00000000 00000000 00000001"/>
+ <ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+ <achVendID value="UKWN"/>
+ <fsSelection value="00000000 01000000"/>
+ <usFirstCharIndex value="32"/>
+ <usLastCharIndex value="122"/>
+ <sTypoAscender value="800"/>
+ <sTypoDescender value="-200"/>
+ <sTypoLineGap value="200"/>
+ <usWinAscent value="1000"/>
+ <usWinDescent value="200"/>
+ <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="500"/>
+ <sCapHeight value="700"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="0"/>
+ </OS_2>
+
+ <hmtx>
+ <mtx name=".notdef" width="500" lsb="93"/>
+ <mtx name="dummy" width="500" lsb="93"/>
+ </hmtx>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="3" platEncID="10" language="0">
+ <map code="0xFFFD" name="dummy" /> <!-- dummy entry -->
+ </cmap_format_4>
+ </cmap>
+
+ <loca>
+ <!-- The 'loca' table will be calculated by the compiler -->
+ </loca>
+
+ <glyf>
+ <TTGlyph name=".notdef" xMin="0" yMin="0" xMax="0" yMax="0" />
+ <TTGlyph name="dummy" xMin="0" yMin="0" xMax="0" yMax="0" />
+ </glyf>
+
+ <name>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright (C) 2017 The Android Open Source Project
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ Sample Font
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ Sample Font
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ SampleFont-Regular
+ </namerecord>
+ <namerecord nameID="13" platformID="3" platEncID="1" langID="0x409">
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ 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.
+ </namerecord>
+ <namerecord nameID="14" platformID="3" platEncID="1" langID="0x409">
+ http://www.apache.org/licenses/LICENSE-2.0
+ </namerecord>
+ </name>
+
+ <post>
+ <formatType value="3.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-75"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ </post>
+
+</ttFont>
diff --git a/core/tests/coretests/assets/fonts/underlineTestFont.ttf b/core/tests/coretests/assets/fonts/underlineTestFont.ttf
new file mode 100644
index 0000000..a46a38e
--- /dev/null
+++ b/core/tests/coretests/assets/fonts/underlineTestFont.ttf
Binary files differ
diff --git a/core/tests/coretests/assets/fonts/underlineTestFont.ttx b/core/tests/coretests/assets/fonts/underlineTestFont.ttx
new file mode 100644
index 0000000..d7376b0
--- /dev/null
+++ b/core/tests/coretests/assets/fonts/underlineTestFont.ttx
@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.9">
+
+ <GlyphOrder>
+ <GlyphID id="0" name=".notdef"/>
+ <GlyphID id="1" name="a"/>
+ </GlyphOrder>
+
+ <head>
+ <tableVersion value="1.0"/>
+ <fontRevision value="1.0"/>
+ <checkSumAdjustment value="0"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Fri Mar 17 07:26:00 2017"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="7"/>
+ <fontDirectionHint value="2"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="1000"/>
+ <descent value="-200"/>
+ <lineGap value="0"/>
+ <caretSlopeRise value="1"/>
+ <caretSlopeRun value="0"/>
+ <caretOffset value="0"/>
+ <reserved0 value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <metricDataFormat value="0"/>
+ </hhea>
+
+ <maxp>
+ <tableVersion value="0x10000"/>
+ <maxZones value="0"/>
+ <maxTwilightPoints value="0"/>
+ <maxStorage value="0"/>
+ <maxFunctionDefs value="0"/>
+ <maxInstructionDefs value="0"/>
+ <maxStackElements value="0"/>
+ <maxSizeOfInstructions value="0"/>
+ <maxComponentElements value="0"/>
+ </maxp>
+
+ <OS_2>
+ <version value="3"/>
+ <xAvgCharWidth value="594"/>
+ <usWeightClass value="400"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00001000"/>
+ <ySubscriptXSize value="650"/>
+ <ySubscriptYSize value="600"/>
+ <ySubscriptXOffset value="0"/>
+ <ySubscriptYOffset value="75"/>
+ <ySuperscriptXSize value="650"/>
+ <ySuperscriptYSize value="600"/>
+ <ySuperscriptXOffset value="0"/>
+ <ySuperscriptYOffset value="350"/>
+ <yStrikeoutSize value="50"/>
+ <yStrikeoutPosition value="300"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="0"/>
+ <bSerifStyle value="0"/>
+ <bWeight value="5"/>
+ <bProportion value="0"/>
+ <bContrast value="0"/>
+ <bStrokeVariation value="0"/>
+ <bArmStyle value="0"/>
+ <bLetterForm value="0"/>
+ <bMidline value="0"/>
+ <bXHeight value="0"/>
+ </panose>
+ <ulUnicodeRange1 value="00000000 00000000 00000000 00000001"/>
+ <ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+ <achVendID value="UKWN"/>
+ <fsSelection value="00000000 01000000"/>
+ <sTypoAscender value="800"/>
+ <sTypoDescender value="-200"/>
+ <sTypoLineGap value="200"/>
+ <usWinAscent value="1000"/>
+ <usWinDescent value="200"/>
+ <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="500"/>
+ <sCapHeight value="700"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="0"/>
+ </OS_2>
+
+ <hmtx>
+ <mtx name=".notdef" width="500" lsb="93"/>
+ <mtx name="a" width="500" lsb="93"/>
+ </hmtx>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="3" platEncID="10" language="0">
+ <map code="0x61" name="a"/><!-- LATIN SMALL LETTER A -->
+ </cmap_format_4>
+ </cmap>
+
+ <loca>
+ <!-- The 'loca' table will be calculated by the compiler -->
+ </loca>
+
+ <glyf>
+ <TTGlyph name=".notdef"/><!-- contains no outline data -->
+
+ <TTGlyph name="a"/><!-- contains no outline data -->
+
+ </glyf>
+
+ <name>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ Sample Font
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ Sample Font
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ SampleFont-Regular
+ </namerecord>
+ </name>
+
+ <post>
+ <formatType value="3.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-200"/>
+ <underlineThickness value="300"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ </post>
+
+</ttFont>
diff --git a/core/tests/coretests/res/layout/activity_editor_cursor_test.xml b/core/tests/coretests/res/layout/activity_editor_cursor_test.xml
new file mode 100644
index 0000000..45a9318
--- /dev/null
+++ b/core/tests/coretests/res/layout/activity_editor_cursor_test.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2017 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
+ -->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <EditText
+ android:id="@+id/edittext"
+ android:layout_width="200px"
+ android:layout_height="wrap_content"
+ android:padding="15px"
+ android:lines="1"
+ android:singleLine="true"
+ android:textSize="30px"/>
+
+</FrameLayout>
diff --git a/core/tests/coretests/src/android/app/DownloadManagerBaseTest.java b/core/tests/coretests/src/android/app/DownloadManagerBaseTest.java
index 42b06f5..68b9b00 100644
--- a/core/tests/coretests/src/android/app/DownloadManagerBaseTest.java
+++ b/core/tests/coretests/src/android/app/DownloadManagerBaseTest.java
@@ -29,13 +29,15 @@
import android.net.wifi.WifiManager;
import android.os.Environment;
import android.os.ParcelFileDescriptor;
-import android.os.UserHandle;
import android.os.ParcelFileDescriptor.AutoCloseInputStream;
import android.os.SystemClock;
+import android.os.UserHandle;
import android.provider.Settings;
import android.test.InstrumentationTestCase;
import android.util.Log;
+import libcore.io.Streams;
+
import com.google.mockwebserver.MockResponse;
import com.google.mockwebserver.MockWebServer;
@@ -54,8 +56,6 @@
import java.util.Set;
import java.util.concurrent.TimeoutException;
-import libcore.io.Streams;
-
/**
* Base class for Instrumented tests for the Download Manager.
*/
@@ -83,9 +83,6 @@
protected static final int WAIT_FOR_DOWNLOAD_POLL_TIME = 1 * 1000; // 1 second
protected static final int MAX_WAIT_FOR_DOWNLOAD_TIME = 30 * 1000; // 30 seconds
- protected static final int DOWNLOAD_TO_SYSTEM_CACHE = 1;
- protected static final int DOWNLOAD_TO_DOWNLOAD_CACHE_DIR = 2;
-
// Just a few popular file types used to return from a download
protected enum DownloadFileType {
PLAINTEXT,
@@ -923,13 +920,13 @@
* @param body The body to return in the response from the server
*/
protected long doStandardEnqueue(byte[] body) throws Exception {
- return enqueueDownloadRequest(body, DOWNLOAD_TO_DOWNLOAD_CACHE_DIR);
+ return enqueueDownloadRequest(body);
}
- protected long enqueueDownloadRequest(byte[] body, int location) throws Exception {
+ protected long enqueueDownloadRequest(byte[] body) throws Exception {
// Prepare the mock server with a standard response
mServer.enqueue(buildResponse(HTTP_OK, body));
- return doEnqueue(location);
+ return doEnqueue();
}
/**
@@ -938,13 +935,13 @@
* @param body The body to return in the response from the server, contained in the file
*/
protected long doStandardEnqueue(File body) throws Exception {
- return enqueueDownloadRequest(body, DOWNLOAD_TO_DOWNLOAD_CACHE_DIR);
+ return enqueueDownloadRequest(body);
}
- protected long enqueueDownloadRequest(File body, int location) throws Exception {
+ protected long enqueueDownloadRequest(File body) throws Exception {
// Prepare the mock server with a standard response
mServer.enqueue(buildResponse(HTTP_OK, body));
- return doEnqueue(location);
+ return doEnqueue();
}
/**
@@ -952,16 +949,12 @@
* doing a standard enqueue request to the server.
*/
protected long doCommonStandardEnqueue() throws Exception {
- return doEnqueue(DOWNLOAD_TO_DOWNLOAD_CACHE_DIR);
+ return doEnqueue();
}
- private long doEnqueue(int location) throws Exception {
+ private long doEnqueue() throws Exception {
Uri uri = getServerUri(DEFAULT_FILENAME);
Request request = new Request(uri).setTitle(DEFAULT_FILENAME);
- if (location == DOWNLOAD_TO_SYSTEM_CACHE) {
- request.setDestinationToSystemCache();
- }
-
return mDownloadManager.enqueue(request);
}
@@ -1026,8 +1019,8 @@
/**
* Helper that does the actual basic download verification.
*/
- protected long doBasicDownload(byte[] blobData, int location) throws Exception {
- long dlRequest = enqueueDownloadRequest(blobData, location);
+ protected long doBasicDownload(byte[] blobData) throws Exception {
+ long dlRequest = enqueueDownloadRequest(blobData);
// wait for the download to complete
waitForDownloadOrTimeout(dlRequest);
diff --git a/core/tests/coretests/src/android/app/DownloadManagerFunctionalTest.java b/core/tests/coretests/src/android/app/DownloadManagerFunctionalTest.java
index d1a5d28..c1d4be0 100644
--- a/core/tests/coretests/src/android/app/DownloadManagerFunctionalTest.java
+++ b/core/tests/coretests/src/android/app/DownloadManagerFunctionalTest.java
@@ -23,12 +23,13 @@
import android.os.Environment;
import android.os.ParcelFileDescriptor;
import android.test.suitebuilder.annotation.LargeTest;
+
import com.google.mockwebserver.MockResponse;
import java.io.File;
-import java.util.concurrent.TimeoutException;
import java.util.Iterator;
import java.util.Set;
+import java.util.concurrent.TimeoutException;
/**
* Integration tests of the DownloadManager API.
@@ -95,11 +96,11 @@
* Test a basic download of a binary file 500k in size.
*/
@LargeTest
- public void testBinaryDownloadToSystemCache() throws Exception {
+ public void testBinaryDownload() throws Exception {
int fileSize = 1024;
byte[] blobData = generateData(fileSize, DataType.BINARY);
- long dlRequest = doBasicDownload(blobData, DOWNLOAD_TO_SYSTEM_CACHE);
+ long dlRequest = doBasicDownload(blobData);
verifyDownload(dlRequest, blobData);
mDownloadManager.remove(dlRequest);
}
@@ -108,11 +109,11 @@
* Tests the basic downloading of a text file 300000 bytes in size.
*/
@LargeTest
- public void testTextDownloadToSystemCache() throws Exception {
+ public void testTextDownload() throws Exception {
int fileSize = 1024;
byte[] blobData = generateData(fileSize, DataType.TEXT);
- long dlRequest = doBasicDownload(blobData, DOWNLOAD_TO_SYSTEM_CACHE);
+ long dlRequest = doBasicDownload(blobData);
verifyDownload(dlRequest, blobData);
mDownloadManager.remove(dlRequest);
}
@@ -318,7 +319,7 @@
int fileSize = 1024;
byte[] blobData = generateData(fileSize, DataType.BINARY);
- long dlRequest = doBasicDownload(blobData, DOWNLOAD_TO_DOWNLOAD_CACHE_DIR);
+ long dlRequest = doBasicDownload(blobData);
Cursor cursor = mDownloadManager.query(new Query().setFilterById(dlRequest));
try {
assertEquals("The count of downloads with this ID is not 1!", 1, cursor.getCount());
diff --git a/core/tests/coretests/src/android/app/DownloadManagerStressTest.java b/core/tests/coretests/src/android/app/DownloadManagerStressTest.java
index 9fa9131..39d9a8e 100644
--- a/core/tests/coretests/src/android/app/DownloadManagerStressTest.java
+++ b/core/tests/coretests/src/android/app/DownloadManagerStressTest.java
@@ -195,7 +195,7 @@
// try to download 1MB file into /cache - and it should succeed
byte[] blobData = generateData(DOWNLOAD_FILE_SIZE, DataType.TEXT);
- long dlRequest = doBasicDownload(blobData, DOWNLOAD_TO_SYSTEM_CACHE);
+ long dlRequest = doBasicDownload(blobData);
verifyAndCleanupSingleFileDownload(dlRequest, blobData);
} finally {
if (outFile != null) {
diff --git a/core/tests/coretests/src/android/app/timezone/DistroFormatVersionTest.java b/core/tests/coretests/src/android/app/timezone/DistroFormatVersionTest.java
index 9bbcd3d..70a0877 100644
--- a/core/tests/coretests/src/android/app/timezone/DistroFormatVersionTest.java
+++ b/core/tests/coretests/src/android/app/timezone/DistroFormatVersionTest.java
@@ -27,7 +27,6 @@
/**
* Tests for {@link DistroFormatVersion}.
*/
-// TODO(nfuller) Move to CTS once this class is part of the SystemApi. http://b/31008728
public class DistroFormatVersionTest {
@Test
diff --git a/core/tests/coretests/src/android/app/timezone/DistroRulesVersionTest.java b/core/tests/coretests/src/android/app/timezone/DistroRulesVersionTest.java
index 2fbc9a1..eecae46 100644
--- a/core/tests/coretests/src/android/app/timezone/DistroRulesVersionTest.java
+++ b/core/tests/coretests/src/android/app/timezone/DistroRulesVersionTest.java
@@ -27,7 +27,6 @@
/**
* Tests for {@link DistroRulesVersion}.
*/
-// TODO(nfuller) Move to CTS once this class is part of the SystemApi. http://b/31008728
public class DistroRulesVersionTest {
@Test
diff --git a/core/tests/coretests/src/android/app/timezone/RulesStateTest.java b/core/tests/coretests/src/android/app/timezone/RulesStateTest.java
index a9357c9..99abe24 100644
--- a/core/tests/coretests/src/android/app/timezone/RulesStateTest.java
+++ b/core/tests/coretests/src/android/app/timezone/RulesStateTest.java
@@ -29,7 +29,6 @@
/**
* Tests for {@link RulesState}.
*/
-// TODO(nfuller) Move to CTS once this class is part of the SystemApi. http://b/31008728
public class RulesStateTest {
@Test
@@ -107,7 +106,7 @@
"2016a", formatVersion(1, 1), true /* operationInProgress */,
RulesState.STAGED_OPERATION_UNKNOWN, null /* stagedDistroRulesVersion */,
RulesState.DISTRO_STATUS_UNKNOWN, null /* installedDistroRulesVersion */);
- checkParcelableRoundTrip(rulesStateWithNulls);
+ checkParcelableRoundTrip(rulesStateWithUnknowns);
}
private static void checkParcelableRoundTrip(RulesState rulesState) {
@@ -121,55 +120,14 @@
}
@Test
- public void isSystemVersionOlderThan() {
+ public void isSystemVersionNewerThan() {
RulesState rulesState = new RulesState(
"2016b", formatVersion(1, 1), false /* operationInProgress */,
RulesState.STAGED_OPERATION_NONE, null /* stagedDistroRulesVersion */,
RulesState.DISTRO_STATUS_INSTALLED, rulesVersion("2016b", 3));
- assertFalse(rulesState.isSystemVersionOlderThan(rulesVersion("2016a", 1)));
- assertFalse(rulesState.isSystemVersionOlderThan(rulesVersion("2016b", 1)));
- assertTrue(rulesState.isSystemVersionOlderThan(rulesVersion("2016c", 1)));
- }
-
- @Test
- public void isInstalledDistroOlderThan() {
- RulesState operationInProgress = new RulesState(
- "2016b", formatVersion(1, 1), true /* operationInProgress */,
- RulesState.STAGED_OPERATION_UNKNOWN, null /* stagedDistroRulesVersion */,
- RulesState.STAGED_OPERATION_UNKNOWN, null /* installedDistroRulesVersion */);
- try {
- operationInProgress.isInstalledDistroOlderThan(rulesVersion("2016b", 1));
- fail();
- } catch (IllegalStateException expected) {
- }
-
- RulesState nothingInstalled = new RulesState(
- "2016b", formatVersion(1, 1), false /* operationInProgress */,
- RulesState.STAGED_OPERATION_NONE, null /* stagedDistroRulesVersion */,
- RulesState.DISTRO_STATUS_NONE, null /* installedDistroRulesVersion */);
- try {
- nothingInstalled.isInstalledDistroOlderThan(rulesVersion("2016b", 1));
- fail();
- } catch (IllegalStateException expected) {
- }
-
- DistroRulesVersion installedVersion = rulesVersion("2016b", 3);
- RulesState rulesStateWithInstalledVersion = new RulesState(
- "2016b", formatVersion(1, 1), false /* operationInProgress */,
- RulesState.STAGED_OPERATION_NONE, null /* stagedDistroRulesVersion */,
- RulesState.DISTRO_STATUS_INSTALLED, installedVersion);
-
- DistroRulesVersion olderRules = rulesVersion("2016a", 1);
- assertEquals(installedVersion.isOlderThan(olderRules),
- rulesStateWithInstalledVersion.isInstalledDistroOlderThan(olderRules));
-
- DistroRulesVersion sameRules = rulesVersion("2016b", 1);
- assertEquals(installedVersion.isOlderThan(sameRules),
- rulesStateWithInstalledVersion.isInstalledDistroOlderThan(sameRules));
-
- DistroRulesVersion newerRules = rulesVersion("2016c", 1);
- assertEquals(installedVersion.isOlderThan(newerRules),
- rulesStateWithInstalledVersion.isInstalledDistroOlderThan(newerRules));
+ assertTrue(rulesState.isSystemVersionNewerThan(rulesVersion("2016a", 1)));
+ assertFalse(rulesState.isSystemVersionNewerThan(rulesVersion("2016b", 1)));
+ assertFalse(rulesState.isSystemVersionNewerThan(rulesVersion("2016c", 1)));
}
private static void assertEqualsContract(RulesState one, RulesState two) {
diff --git a/core/tests/coretests/src/android/app/timezone/RulesUpdaterContractTest.java b/core/tests/coretests/src/android/app/timezone/RulesUpdaterContractTest.java
index e7a839c..91f8ebc 100644
--- a/core/tests/coretests/src/android/app/timezone/RulesUpdaterContractTest.java
+++ b/core/tests/coretests/src/android/app/timezone/RulesUpdaterContractTest.java
@@ -33,7 +33,6 @@
/**
* Tests for {@link RulesUpdaterContract}.
*/
-// TODO(nfuller) Move to CTS once this class is part of the SystemApi. http://b/31008728
public class RulesUpdaterContractTest {
@Test
diff --git a/core/tests/coretests/src/android/content/pm/PackageBackwardCompatibilityTest.java b/core/tests/coretests/src/android/content/pm/PackageBackwardCompatibilityTest.java
new file mode 100644
index 0000000..4d2a047
--- /dev/null
+++ b/core/tests/coretests/src/android/content/pm/PackageBackwardCompatibilityTest.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.content.pm;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import android.content.pm.PackageParser.Package;
+import android.os.Build;
+import android.support.test.filters.SmallTest;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+import java.util.ArrayList;
+import java.util.Collections;
+
+@SmallTest
+@RunWith(JUnit4.class)
+public class PackageBackwardCompatibilityTest {
+
+ private static final String ORG_APACHE_HTTP_LEGACY = "org.apache.http.legacy";
+
+ private static final String ANDROID_TEST_RUNNER = "android.test.runner";
+
+ private static final String ANDROID_TEST_MOCK = "android.test.mock";
+
+ private Package mPackage;
+
+ private static ArrayList<String> arrayList(String... strings) {
+ ArrayList<String> list = new ArrayList<>();
+ Collections.addAll(list, strings);
+ return list;
+ }
+
+ @Before
+ public void setUp() {
+ mPackage = new Package("org.package.name");
+ mPackage.applicationInfo.targetSdkVersion = Build.VERSION_CODES.CUR_DEVELOPMENT;
+ }
+
+ @Test
+ public void null_usesLibraries() {
+ PackageBackwardCompatibility.modifySharedLibraries(mPackage);
+ assertNull("usesLibraries not updated correctly", mPackage.usesLibraries);
+ }
+
+ @Test
+ public void null_usesOptionalLibraries() {
+ PackageBackwardCompatibility.modifySharedLibraries(mPackage);
+ assertNull("usesOptionalLibraries not updated correctly", mPackage.usesOptionalLibraries);
+ }
+
+ @Test
+ public void remove_org_apache_http_legacy_from_usesLibraries() {
+ mPackage.usesLibraries = arrayList(ORG_APACHE_HTTP_LEGACY);
+ PackageBackwardCompatibility.modifySharedLibraries(mPackage);
+ assertNull("usesLibraries not updated correctly", mPackage.usesLibraries);
+ }
+
+ @Test
+ public void remove_org_apache_http_legacy_from_usesOptionalLibraries() {
+ mPackage.usesOptionalLibraries = arrayList(ORG_APACHE_HTTP_LEGACY);
+ PackageBackwardCompatibility.modifySharedLibraries(mPackage);
+ assertNull("usesOptionalLibraries not updated correctly", mPackage.usesOptionalLibraries);
+ }
+
+ @Test
+ public void android_test_runner_in_usesLibraries() {
+ mPackage.usesLibraries = arrayList(ANDROID_TEST_RUNNER);
+ PackageBackwardCompatibility.modifySharedLibraries(mPackage);
+ assertEquals("usesLibraries not updated correctly",
+ arrayList(ANDROID_TEST_RUNNER, ANDROID_TEST_MOCK),
+ mPackage.usesLibraries);
+ }
+
+ @Test
+ public void android_test_runner_in_usesOptionalLibraries() {
+ mPackage.usesOptionalLibraries = arrayList(ANDROID_TEST_RUNNER);
+ PackageBackwardCompatibility.modifySharedLibraries(mPackage);
+ assertEquals("usesOptionalLibraries not updated correctly",
+ arrayList(ANDROID_TEST_RUNNER, ANDROID_TEST_MOCK),
+ mPackage.usesOptionalLibraries);
+ }
+
+ @Test
+ public void android_test_runner_in_usesLibraries_android_test_mock_in_usesOptionalLibraries() {
+ mPackage.usesLibraries = arrayList(ANDROID_TEST_RUNNER);
+ mPackage.usesOptionalLibraries = arrayList(ANDROID_TEST_MOCK);
+ PackageBackwardCompatibility.modifySharedLibraries(mPackage);
+ assertEquals("usesLibraries not updated correctly",
+ arrayList(ANDROID_TEST_RUNNER),
+ mPackage.usesLibraries);
+ assertEquals("usesOptionalLibraries not updated correctly",
+ arrayList(ANDROID_TEST_MOCK),
+ mPackage.usesOptionalLibraries);
+ }
+}
diff --git a/core/tests/coretests/src/android/content/pm/PackageHelperTests.java b/core/tests/coretests/src/android/content/pm/PackageHelperTests.java
index 5c497b4..55092fa 100644
--- a/core/tests/coretests/src/android/content/pm/PackageHelperTests.java
+++ b/core/tests/coretests/src/android/content/pm/PackageHelperTests.java
@@ -34,6 +34,7 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
+import java.util.UUID;
import static android.net.TrafficStats.MB_IN_BYTES;
import static android.os.storage.VolumeInfo.STATE_MOUNTED;
@@ -90,14 +91,20 @@
File internalFile = new File(sInternalVolPath);
File adoptedFile = new File(sAdoptedVolPath);
File publicFile = new File(sPublicVolPath);
+ UUID internalUuid = UUID.randomUUID();
+ UUID adoptedUuid = UUID.randomUUID();
+ UUID publicUuid = UUID.randomUUID();
Mockito.when(storageManager.getStorageBytesUntilLow(internalFile)).thenReturn(sInternalSize);
Mockito.when(storageManager.getStorageBytesUntilLow(adoptedFile)).thenReturn(sAdoptedSize);
Mockito.when(storageManager.getStorageBytesUntilLow(publicFile)).thenReturn(sPublicSize);
- Mockito.when(storageManager.getAllocatableBytes(Mockito.eq(internalFile), Mockito.anyInt()))
+ Mockito.when(storageManager.getUuidForPath(Mockito.eq(internalFile))).thenReturn(internalUuid);
+ Mockito.when(storageManager.getUuidForPath(Mockito.eq(adoptedFile))).thenReturn(adoptedUuid);
+ Mockito.when(storageManager.getUuidForPath(Mockito.eq(publicFile))).thenReturn(publicUuid);
+ Mockito.when(storageManager.getAllocatableBytes(Mockito.eq(internalUuid), Mockito.anyInt()))
.thenReturn(sInternalSize);
- Mockito.when(storageManager.getAllocatableBytes(Mockito.eq(adoptedFile), Mockito.anyInt()))
+ Mockito.when(storageManager.getAllocatableBytes(Mockito.eq(adoptedUuid), Mockito.anyInt()))
.thenReturn(sAdoptedSize);
- Mockito.when(storageManager.getAllocatableBytes(Mockito.eq(publicFile), Mockito.anyInt()))
+ Mockito.when(storageManager.getAllocatableBytes(Mockito.eq(publicUuid), Mockito.anyInt()))
.thenReturn(sPublicSize);
return storageManager;
}
diff --git a/core/tests/coretests/src/android/content/pm/PackageManagerTests.java b/core/tests/coretests/src/android/content/pm/PackageManagerTests.java
index 423d45ea..0a89b74 100644
--- a/core/tests/coretests/src/android/content/pm/PackageManagerTests.java
+++ b/core/tests/coretests/src/android/content/pm/PackageManagerTests.java
@@ -25,11 +25,14 @@
import static android.system.OsConstants.S_IXGRP;
import static android.system.OsConstants.S_IXOTH;
-import android.app.PackageInstallObserver;
import android.content.BroadcastReceiver;
import android.content.Context;
+import android.content.IIntentReceiver;
+import android.content.IIntentSender;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.IntentSender;
+import android.content.pm.PackageInstaller.SessionParams;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.PackageParser.PackageParserException;
import android.content.res.Resources;
@@ -46,7 +49,6 @@
import android.os.ServiceManager;
import android.os.StatFs;
import android.os.SystemClock;
-import android.os.UserManager;
import android.os.storage.IStorageManager;
import android.os.storage.StorageListener;
import android.os.storage.StorageManager;
@@ -67,9 +69,13 @@
import dalvik.system.VMRuntime;
+import libcore.io.IoUtils;
+
import java.io.File;
+import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
@@ -77,6 +83,7 @@
import java.util.List;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.TimeUnit;
public class PackageManagerTests extends AndroidTestCase {
@@ -130,29 +137,7 @@
super.tearDown();
}
- private class TestInstallObserver extends PackageInstallObserver {
- public int returnCode;
-
- private boolean doneFlag = false;
-
- @Override
- public void onPackageInstalled(String basePackageName, int returnCode, String msg,
- Bundle extras) {
- Log.d(TAG, "onPackageInstalled: code=" + returnCode + ", msg=" + msg + ", extras="
- + extras);
- synchronized (this) {
- this.returnCode = returnCode;
- doneFlag = true;
- notifyAll();
- }
- }
-
- public boolean isDone() {
- return doneFlag;
- }
- }
-
- abstract class GenericReceiver extends BroadcastReceiver {
+ private abstract static class GenericReceiver extends BroadcastReceiver {
private boolean doneFlag = false;
boolean received = false;
@@ -184,7 +169,7 @@
}
}
- class InstallReceiver extends GenericReceiver {
+ private static class InstallReceiver extends GenericReceiver {
String pkgName;
InstallReceiver(String pkgName) {
@@ -208,100 +193,152 @@
}
}
+ private static class LocalIntentReceiver {
+ private final SynchronousQueue<Intent> mResult = new SynchronousQueue<>();
+
+ private IIntentSender.Stub mLocalSender = new IIntentSender.Stub() {
+ @Override
+ public void send(int code, Intent intent, String resolvedType, IBinder whitelistToken,
+ IIntentReceiver finishedReceiver, String requiredPermission, Bundle options) {
+ try {
+ mResult.offer(intent, 5, TimeUnit.SECONDS);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ };
+
+ public IntentSender getIntentSender() {
+ return new IntentSender((IIntentSender) mLocalSender);
+ }
+
+ public Intent getResult() {
+ try {
+ return mResult.take();
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
private PackageManager getPm() {
return mContext.getPackageManager();
}
- private IPackageManager getIPm() {
- IPackageManager ipm = IPackageManager.Stub.asInterface(
- ServiceManager.getService("package"));
- return ipm;
+ private PackageInstaller getPi() {
+ return getPm().getPackageInstaller();
}
- public void invokeInstallPackage(Uri packageURI, int flags, GenericReceiver receiver,
- boolean shouldSucceed) {
- TestInstallObserver observer = new TestInstallObserver();
- mContext.registerReceiver(receiver, receiver.filter);
+ private void writeSplitToInstallSession(PackageInstaller.Session session, String inPath,
+ String splitName) throws RemoteException {
+ long sizeBytes = 0;
+ final File file = new File(inPath);
+ if (file.isFile()) {
+ sizeBytes = file.length();
+ } else {
+ return;
+ }
+
+ InputStream in = null;
+ OutputStream out = null;
try {
- // Wait on observer
- synchronized (observer) {
- synchronized (receiver) {
- getPm().installPackage(packageURI, observer, flags, null);
- long waitTime = 0;
- while ((!observer.isDone()) && (waitTime < MAX_WAIT_TIME)) {
- try {
- observer.wait(WAIT_TIME_INCR);
- waitTime += WAIT_TIME_INCR;
- } catch (InterruptedException e) {
- Log.i(TAG, "Interrupted during sleep", e);
- }
- }
- if (!observer.isDone()) {
- fail("Timed out waiting for packageInstalled callback");
- }
+ in = new FileInputStream(inPath);
+ out = session.openWrite(splitName, 0, sizeBytes);
- if (shouldSucceed) {
- if (observer.returnCode != PackageManager.INSTALL_SUCCEEDED) {
- fail("Package installation should have succeeded, but got code "
- + observer.returnCode);
- }
- } else {
- if (observer.returnCode == PackageManager.INSTALL_SUCCEEDED) {
- fail("Package installation should fail");
- }
-
- /*
- * We'll never expect get a notification since we
- * shouldn't succeed.
- */
- return;
- }
-
- // Verify we received the broadcast
- waitTime = 0;
- while ((!receiver.isDone()) && (waitTime < MAX_WAIT_TIME)) {
- try {
- receiver.wait(WAIT_TIME_INCR);
- waitTime += WAIT_TIME_INCR;
- } catch (InterruptedException e) {
- Log.i(TAG, "Interrupted during sleep", e);
- }
- }
- if (!receiver.isDone()) {
- fail("Timed out waiting for PACKAGE_ADDED notification");
- }
- }
+ int total = 0;
+ byte[] buffer = new byte[65536];
+ int c;
+ while ((c = in.read(buffer)) != -1) {
+ total += c;
+ out.write(buffer, 0, c);
}
+ session.fsync(out);
+ } catch (IOException e) {
+ fail("Error: failed to write; " + e.getMessage());
} finally {
- mContext.unregisterReceiver(receiver);
+ IoUtils.closeQuietly(out);
+ IoUtils.closeQuietly(in);
+ IoUtils.closeQuietly(session);
}
}
- public void invokeInstallPackageFail(Uri packageURI, int flags, int expectedResult) {
- TestInstallObserver observer = new TestInstallObserver();
- try {
- // Wait on observer
- synchronized (observer) {
- getPm().installPackage(packageURI, observer, flags, null);
+ private void invokeInstallPackage(Uri packageUri, int flags, GenericReceiver receiver,
+ boolean shouldSucceed) {
+ mContext.registerReceiver(receiver, receiver.filter);
+ synchronized (receiver) {
+ final String inPath = packageUri.getPath();
+ PackageInstaller.Session session = null;
+ try {
+ final SessionParams sessionParams =
+ new SessionParams(SessionParams.MODE_FULL_INSTALL);
+ sessionParams.installFlags = flags;
+ final int sessionId = getPi().createSession(sessionParams);
+ session = getPi().openSession(sessionId);
+ writeSplitToInstallSession(session, inPath, "base.apk");
+ final LocalIntentReceiver localReceiver = new LocalIntentReceiver();
+ session.commit(localReceiver.getIntentSender());
+ final Intent result = localReceiver.getResult();
+ final int status = result.getIntExtra(PackageInstaller.EXTRA_STATUS,
+ PackageInstaller.STATUS_FAILURE);
+ if (shouldSucceed) {
+ if (status != PackageInstaller.STATUS_SUCCESS) {
+ fail("Installation should have succeeded, but got code " + status);
+ }
+ } else {
+ if (status == PackageInstaller.STATUS_SUCCESS) {
+ fail("Installation should have failed");
+ }
+ // We'll never get a broadcast since the package failed to install
+ return;
+ }
+ // Verify we received the broadcast
long waitTime = 0;
- while ((!observer.isDone()) && (waitTime < MAX_WAIT_TIME)) {
+ while ((!receiver.isDone()) && (waitTime < MAX_WAIT_TIME)) {
try {
- observer.wait(WAIT_TIME_INCR);
+ receiver.wait(WAIT_TIME_INCR);
waitTime += WAIT_TIME_INCR;
} catch (InterruptedException e) {
Log.i(TAG, "Interrupted during sleep", e);
}
}
- if (!observer.isDone()) {
- fail("Timed out waiting for packageInstalled callback");
+ if (!receiver.isDone()) {
+ fail("Timed out waiting for PACKAGE_ADDED notification");
}
- assertEquals(expectedResult, observer.returnCode);
+ } catch (IllegalArgumentException | IOException | RemoteException e) {
+ Log.w(TAG, "Failed to install package; path=" + inPath, e);
+ fail("Failed to install package; path=" + inPath + ", e=" + e);
+ } finally {
+ IoUtils.closeQuietly(session);
+ mContext.unregisterReceiver(receiver);
}
- } finally {
}
}
- Uri getInstallablePackage(int fileResId, File outFile) {
+ private void invokeInstallPackageFail(Uri packageUri, int flags, int expectedResult) {
+ final String inPath = packageUri.getPath();
+ PackageInstaller.Session session = null;
+ try {
+ final SessionParams sessionParams =
+ new SessionParams(SessionParams.MODE_FULL_INSTALL);
+ sessionParams.installFlags = flags;
+ final int sessionId = getPi().createSession(sessionParams);
+ session = getPi().openSession(sessionId);
+ writeSplitToInstallSession(session, inPath, "base.apk");
+ final LocalIntentReceiver localReceiver = new LocalIntentReceiver();
+ session.commit(localReceiver.getIntentSender());
+ final Intent result = localReceiver.getResult();
+ final int status = result.getIntExtra(PackageInstaller.EXTRA_STATUS,
+ PackageInstaller.STATUS_SUCCESS);
+ assertEquals(expectedResult, status);
+ } catch (IllegalArgumentException | IOException | RemoteException e) {
+ Log.w(TAG, "Failed to install package; path=" + inPath, e);
+ fail("Failed to install package; path=" + inPath + ", e=" + e);
+ } finally {
+ IoUtils.closeQuietly(session);
+ }
+ }
+
+ private Uri getInstallablePackage(int fileResId, File outFile) {
Resources res = mContext.getResources();
InputStream is = null;
try {
@@ -430,28 +467,17 @@
int rLoc = getInstallLoc(flags, expInstallLocation, pkgLen);
if (rLoc == INSTALL_LOC_INT) {
- if ((flags & PackageManager.INSTALL_FORWARD_LOCK) != 0) {
- assertTrue("The application should be installed forward locked",
- (info.privateFlags & ApplicationInfo.PRIVATE_FLAG_FORWARD_LOCK) != 0);
- assertStartsWith("The APK path should point to the ASEC",
- SECURE_CONTAINERS_PREFIX, srcPath);
- assertStartsWith("The public APK path should point to the ASEC",
- SECURE_CONTAINERS_PREFIX, publicSrcPath);
- assertStartsWith("The native library path should point to the ASEC",
- SECURE_CONTAINERS_PREFIX, info.nativeLibraryDir);
- } else {
- assertFalse(
- (info.privateFlags & ApplicationInfo.PRIVATE_FLAG_FORWARD_LOCK) != 0);
- assertEquals(appInstallPath, srcPath);
- assertEquals(appInstallPath, publicSrcPath);
- assertStartsWith("Native library should point to shared lib directory",
- expectedLibPath, info.nativeLibraryDir);
- assertDirOwnerGroupPermsIfExists(
- "Native library directory should be owned by system:system and 0755",
- Process.SYSTEM_UID, Process.SYSTEM_UID,
- S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH,
- info.nativeLibraryDir);
- }
+ assertFalse(
+ (info.privateFlags & ApplicationInfo.PRIVATE_FLAG_FORWARD_LOCK) != 0);
+ assertEquals(appInstallPath, srcPath);
+ assertEquals(appInstallPath, publicSrcPath);
+ assertStartsWith("Native library should point to shared lib directory",
+ expectedLibPath, info.nativeLibraryDir);
+ assertDirOwnerGroupPermsIfExists(
+ "Native library directory should be owned by system:system and 0755",
+ Process.SYSTEM_UID, Process.SYSTEM_UID,
+ S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH,
+ info.nativeLibraryDir);
assertFalse((info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0);
// Make sure the native library dir is not a symlink
@@ -465,13 +491,8 @@
}
}
} else if (rLoc == INSTALL_LOC_SD) {
- if ((flags & PackageManager.INSTALL_FORWARD_LOCK) != 0) {
- assertTrue("The application should be installed forward locked",
- (info.privateFlags & ApplicationInfo.PRIVATE_FLAG_FORWARD_LOCK) != 0);
- } else {
- assertFalse("The application should not be installed forward locked",
- (info.privateFlags & ApplicationInfo.PRIVATE_FLAG_FORWARD_LOCK) != 0);
- }
+ assertFalse("The application should not be installed forward locked",
+ (info.privateFlags & ApplicationInfo.PRIVATE_FLAG_FORWARD_LOCK) != 0);
assertTrue("Application flags (" + info.flags
+ ") should contain FLAG_EXTERNAL_STORAGE",
(info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0);
@@ -598,7 +619,8 @@
}
}
- private InstallParams sampleInstallFromRawResource(int flags, boolean cleanUp) throws Exception {
+ private InstallParams sampleInstallFromRawResource(int flags, boolean cleanUp)
+ throws Exception {
return installFromRawResource("install.apk", R.raw.install, flags, cleanUp, false, -1,
PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
}
@@ -721,7 +743,7 @@
PackageManager.MATCH_UNINSTALLED_PACKAGES);
GenericReceiver receiver = new DeleteReceiver(pkg.packageName);
invokeDeletePackage(pkg.packageName, 0, receiver);
- } catch (NameNotFoundException e) {
+ } catch (IllegalArgumentException | NameNotFoundException e) {
}
}
try {
@@ -761,11 +783,6 @@
}
@LargeTest
- public void testInstallFwdLockedInternal() throws Exception {
- sampleInstallFromRawResource(PackageManager.INSTALL_FORWARD_LOCK, true);
- }
-
- @LargeTest
public void testInstallSdcard() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
@@ -869,11 +886,6 @@
}
@LargeTest
- public void testReplaceFailFwdLockedInternal() throws Exception {
- sampleReplaceFromRawResource(PackageManager.INSTALL_FORWARD_LOCK);
- }
-
- @LargeTest
public void testReplaceFailSdcard() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
@@ -889,12 +901,6 @@
}
@LargeTest
- public void testReplaceFwdLockedInternal() throws Exception {
- sampleReplaceFromRawResource(PackageManager.INSTALL_REPLACE_EXISTING
- | PackageManager.INSTALL_FORWARD_LOCK);
- }
-
- @LargeTest
public void testReplaceSdcard() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
@@ -984,10 +990,11 @@
mContext.registerReceiver(receiver, receiver.filter);
try {
- DeleteObserver observer = new DeleteObserver(pkgName);
-
- getPm().deletePackage(pkgName, observer, flags | PackageManager.DELETE_ALL_USERS);
- observer.waitForCompletion(MAX_WAIT_TIME);
+ final LocalIntentReceiver localReceiver = new LocalIntentReceiver();
+ getPi().uninstall(pkgName,
+ flags | PackageManager.DELETE_ALL_USERS,
+ localReceiver.getIntentSender());
+ localReceiver.getResult();
assertUninstalled(info);
@@ -1050,11 +1057,6 @@
}
@LargeTest
- public void testDeleteFwdLockedInternal() throws Exception {
- deleteFromRawResource(PackageManager.INSTALL_FORWARD_LOCK, 0);
- }
-
- @LargeTest
public void testDeleteSdcard() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
@@ -1070,11 +1072,6 @@
}
@LargeTest
- public void testDeleteFwdLockedInternalRetainData() throws Exception {
- deleteFromRawResource(PackageManager.INSTALL_FORWARD_LOCK, PackageManager.DELETE_KEEP_DATA);
- }
-
- @LargeTest
public void testDeleteSdcardRetainData() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
@@ -1342,9 +1339,11 @@
final ApplicationInfo info = getPm().getApplicationInfo(pkgName,
PackageManager.MATCH_UNINSTALLED_PACKAGES);
if (info != null) {
- DeleteObserver observer = new DeleteObserver(pkgName);
- getPm().deletePackage(pkgName, observer, PackageManager.DELETE_ALL_USERS);
- observer.waitForCompletion(MAX_WAIT_TIME);
+ final LocalIntentReceiver localReceiver = new LocalIntentReceiver();
+ getPi().uninstall(pkgName,
+ PackageManager.DELETE_ALL_USERS,
+ localReceiver.getIntentSender());
+ localReceiver.getResult();
assertUninstalled(info);
}
} catch (IllegalArgumentException | NameNotFoundException e) {
@@ -1380,31 +1379,6 @@
0, true, false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
}
- @LargeTest
- public void testManifestInstallLocationFwdLockedFlagSdcard() throws Exception {
- // Do not run on devices with emulated external storage.
- if (Environment.isExternalStorageEmulated()) {
- return;
- }
-
- installFromRawResource("install.apk", R.raw.install_loc_unspecified,
- PackageManager.INSTALL_FORWARD_LOCK |
- PackageManager.INSTALL_EXTERNAL, true, false, -1,
- PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
- }
-
- @LargeTest
- public void testManifestInstallLocationFwdLockedSdcard() throws Exception {
- // Do not run on devices with emulated external storage.
- if (Environment.isExternalStorageEmulated()) {
- return;
- }
-
- installFromRawResource("install.apk", R.raw.install_loc_sdcard,
- PackageManager.INSTALL_FORWARD_LOCK, true, false, -1,
- PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
- }
-
/*
* Install a package on internal flash via PackageManager install flag. Replace
* the package via flag to install on sdcard. Make sure the new flag overrides
@@ -1704,20 +1678,6 @@
}
@LargeTest
- public void testMoveAppForwardLocked() throws Exception {
- // Do not run on devices with emulated external storage.
- if (Environment.isExternalStorageEmulated()) {
- return;
- }
-
- int installFlags = PackageManager.INSTALL_FORWARD_LOCK;
- int moveFlags = PackageManager.MOVE_EXTERNAL_MEDIA;
- boolean fail = false;
- int result = PackageManager.MOVE_SUCCEEDED;
- sampleMoveFromRawResource(installFlags, moveFlags, fail, result);
- }
-
- @LargeTest
public void testMoveAppFailInternalToExternalDelete() throws Exception {
// Do not run on devices with emulated external storage.
if (Environment.isExternalStorageEmulated()) {
@@ -1771,7 +1731,7 @@
// Try to install and make sure an error code is returned.
installFromRawResource("install.apk", R.raw.install,
PackageManager.INSTALL_EXTERNAL, false,
- true, PackageManager.INSTALL_FAILED_MEDIA_UNAVAILABLE,
+ true, PackageInstaller.STATUS_FAILURE_STORAGE,
PackageInfo.INSTALL_LOCATION_AUTO);
} finally {
// Restore original media state
@@ -1844,63 +1804,6 @@
}
/*
- * Install an app forward-locked.
- */
- @LargeTest
- public void testFlagF() throws Exception {
- sampleInstallFromRawResource(PackageManager.INSTALL_FORWARD_LOCK, true);
- }
-
- /*
- * Install an app with both internal and external flags set. should fail
- */
- @LargeTest
- public void testFlagIE() throws Exception {
- installFromRawResource("install.apk", R.raw.install,
- PackageManager.INSTALL_EXTERNAL | PackageManager.INSTALL_INTERNAL,
- false,
- true, PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION,
- PackageInfo.INSTALL_LOCATION_AUTO);
- }
-
- /*
- * Install an app with both internal and forward-lock flags set.
- */
- @LargeTest
- public void testFlagIF() throws Exception {
- sampleInstallFromRawResource(PackageManager.INSTALL_FORWARD_LOCK
- | PackageManager.INSTALL_INTERNAL, true);
- }
-
- /*
- * Install an app with both external and forward-lock flags set.
- */
- @LargeTest
- public void testFlagEF() throws Exception {
- // Do not run on devices with emulated external storage.
- if (Environment.isExternalStorageEmulated()) {
- return;
- }
-
- sampleInstallFromRawResource(PackageManager.INSTALL_FORWARD_LOCK
- | PackageManager.INSTALL_EXTERNAL, true);
- }
-
- /*
- * Install an app with both internal and external flags set with forward
- * lock. Should fail.
- */
- @LargeTest
- public void testFlagIEF() throws Exception {
- installFromRawResource("install.apk", R.raw.install,
- PackageManager.INSTALL_FORWARD_LOCK | PackageManager.INSTALL_INTERNAL |
- PackageManager.INSTALL_EXTERNAL,
- false,
- true, PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION,
- PackageInfo.INSTALL_LOCATION_AUTO);
- }
-
- /*
* Install an app with both internal and manifest option set.
* should install on internal.
*/
@@ -1991,55 +1894,6 @@
}
/*
- * Install an app with fwd locked flag set and install location set to
- * internal. should install internally.
- */
- @LargeTest
- public void testFlagFManifestI() throws Exception {
- installFromRawResource("install.apk", R.raw.install_loc_internal,
- PackageManager.INSTALL_FORWARD_LOCK,
- true,
- false, -1,
- PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
- }
-
- /*
- * Install an app with fwd locked flag set and install location set to
- * preferExternal. Should install externally.
- */
- @LargeTest
- public void testFlagFManifestE() throws Exception {
- // Do not run on devices with emulated external storage.
- if (Environment.isExternalStorageEmulated()) {
- return;
- }
-
- installFromRawResource("install.apk", R.raw.install_loc_sdcard,
- PackageManager.INSTALL_FORWARD_LOCK,
- true,
- false, -1,
- PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
- }
-
- /*
- * Install an app with fwd locked flag set and install location set to auto.
- * should install externally.
- */
- @LargeTest
- public void testFlagFManifestA() throws Exception {
- // Do not run on devices with emulated external storage.
- if (Environment.isExternalStorageEmulated()) {
- return;
- }
-
- installFromRawResource("install.apk", R.raw.install_loc_auto,
- PackageManager.INSTALL_FORWARD_LOCK,
- true,
- false, -1,
- PackageInfo.INSTALL_LOCATION_AUTO);
- }
-
- /*
* The following test functions verify install location for existing apps.
* ie existing app can be installed internally or externally. If install
* flag is explicitly set it should override current location. If manifest location
@@ -2134,48 +1988,6 @@
-1);
}
- @Suppress
- @LargeTest
- public void testFlagFExistingI() throws Exception {
- int iFlags = PackageManager.INSTALL_INTERNAL;
- int rFlags = PackageManager.INSTALL_FORWARD_LOCK | PackageManager.INSTALL_REPLACE_EXISTING;
- // First install.
- installFromRawResource("install.apk", R.raw.install,
- iFlags,
- false,
- false, -1,
- -1);
- // Replace now
- installFromRawResource("install.apk", R.raw.install,
- rFlags,
- true,
- false, -1,
- -1);
- }
-
- @LargeTest
- public void testFlagFExistingE() throws Exception {
- // Do not run on devices with emulated external storage.
- if (Environment.isExternalStorageEmulated()) {
- return;
- }
-
- int iFlags = PackageManager.INSTALL_EXTERNAL;
- int rFlags = PackageManager.INSTALL_FORWARD_LOCK | PackageManager.INSTALL_REPLACE_EXISTING;
- // First install.
- installFromRawResource("install.apk", R.raw.install,
- iFlags,
- false,
- false, -1,
- -1);
- // Replace now
- installFromRawResource("install.apk", R.raw.install,
- rFlags,
- true,
- false, -1,
- -1);
- }
-
/*
* The following set of tests verify the installation of apps with
* install location attribute set to internalOnly, preferExternal and auto.
@@ -2905,7 +2717,7 @@
@LargeTest
public void testReplaceMatchNoCerts1() throws Exception {
replaceCerts(APP1_CERT1_CERT2, APP1_CERT3, true, true,
- PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE);
+ PackageInstaller.STATUS_FAILURE_CONFLICT);
}
/*
@@ -2915,7 +2727,7 @@
@LargeTest
public void testReplaceMatchNoCerts2() throws Exception {
replaceCerts(APP1_CERT1_CERT2, APP1_CERT3_CERT4, true, true,
- PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE);
+ PackageInstaller.STATUS_FAILURE_CONFLICT);
}
/*
@@ -2925,7 +2737,7 @@
@LargeTest
public void testReplaceMatchSomeCerts1() throws Exception {
replaceCerts(APP1_CERT1_CERT2, APP1_CERT1, true, true,
- PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE);
+ PackageInstaller.STATUS_FAILURE_CONFLICT);
}
/*
@@ -2935,7 +2747,7 @@
@LargeTest
public void testReplaceMatchSomeCerts2() throws Exception {
replaceCerts(APP1_CERT1_CERT2, APP1_CERT2, true, true,
- PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE);
+ PackageInstaller.STATUS_FAILURE_CONFLICT);
}
/*
@@ -2945,7 +2757,7 @@
@LargeTest
public void testReplaceMatchMoreCerts() throws Exception {
replaceCerts(APP1_CERT1, APP1_CERT1_CERT2, true, true,
- PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE);
+ PackageInstaller.STATUS_FAILURE_CONFLICT);
}
/*
@@ -2956,7 +2768,7 @@
@LargeTest
public void testReplaceMatchMoreCertsReplaceSomeCerts() throws Exception {
InstallParams ip = replaceCerts(APP1_CERT1, APP1_CERT1_CERT2, false, true,
- PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE);
+ PackageInstaller.STATUS_FAILURE_CONFLICT);
try {
int rFlags = PackageManager.INSTALL_REPLACE_EXISTING;
installFromRawResource("install.apk", APP1_CERT1, rFlags, false,
@@ -2996,7 +2808,7 @@
*/
public void testUpgradeKSWithWrongKey() throws Exception {
replaceCerts(R.raw.keyset_sa_ua, R.raw.keyset_sb_ua, true, true,
- PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE);
+ PackageInstaller.STATUS_FAILURE_CONFLICT);
}
/*
@@ -3005,7 +2817,7 @@
*/
public void testUpgradeKSWithWrongSigningKey() throws Exception {
replaceCerts(R.raw.keyset_sa_ub, R.raw.keyset_sa_ub, true, true,
- PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE);
+ PackageInstaller.STATUS_FAILURE_CONFLICT);
}
/*
@@ -3037,7 +2849,7 @@
*/
public void testMultipleUpgradeKSWithSigningKey() throws Exception {
replaceCerts(R.raw.keyset_sau_ub, R.raw.keyset_sa_ua, true, true,
- PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE);
+ PackageInstaller.STATUS_FAILURE_CONFLICT);
}
/*
@@ -3471,7 +3283,12 @@
int rawResId = apk2;
Uri packageURI = getInstallablePackage(rawResId, outFile);
PackageParser.Package pkg = parsePackage(packageURI);
- getPm().deletePackage(pkg.packageName, null, PackageManager.DELETE_ALL_USERS);
+ try {
+ getPi().uninstall(pkg.packageName,
+ PackageManager.DELETE_ALL_USERS,
+ null /*statusReceiver*/);
+ } catch (IllegalArgumentException ignore) {
+ }
// Check signatures now
int match = mContext.getPackageManager().checkSignatures(
ip.pkg.packageName, pkg.packageName);
@@ -3487,7 +3304,7 @@
String apk1Name = "install1.apk";
installFromRawResource(apk1Name, apk1, 0, false,
- true, PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES,
+ true, PackageInstaller.STATUS_FAILURE_INVALID,
PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
}
@@ -3557,7 +3374,7 @@
int apk1 = SHARED1_CERT1;
int apk2 = SHARED2_CERT2;
boolean fail = true;
- int retCode = PackageManager.INSTALL_FAILED_SHARED_USER_INCOMPATIBLE;
+ int retCode = PackageInstaller.STATUS_FAILURE_CONFLICT;
int expMatchResult = -1;
checkSharedSignatures(apk1, apk2, true, fail, retCode, expMatchResult);
}
@@ -3571,7 +3388,7 @@
int apk1 = SHARED1_CERT1_CERT2;
int apk2 = SHARED2_CERT1;
boolean fail = true;
- int retCode = PackageManager.INSTALL_FAILED_SHARED_USER_INCOMPATIBLE;
+ int retCode = PackageInstaller.STATUS_FAILURE_CONFLICT;
int expMatchResult = -1;
checkSharedSignatures(apk1, apk2, true, fail, retCode, expMatchResult);
}
@@ -3585,7 +3402,7 @@
int apk1 = SHARED1_CERT1_CERT2;
int apk2 = SHARED2_CERT2;
boolean fail = true;
- int retCode = PackageManager.INSTALL_FAILED_SHARED_USER_INCOMPATIBLE;
+ int retCode = PackageInstaller.STATUS_FAILURE_CONFLICT;
int expMatchResult = -1;
checkSharedSignatures(apk1, apk2, true, fail, retCode, expMatchResult);
}
@@ -3604,7 +3421,11 @@
PackageManager pm = mContext.getPackageManager();
// Delete app2
PackageParser.Package pkg = getParsedPackage(apk2Name, apk2);
- getPm().deletePackage(pkg.packageName, null, PackageManager.DELETE_ALL_USERS);
+ try {
+ getPi().uninstall(
+ pkg.packageName, PackageManager.DELETE_ALL_USERS, null /*statusReceiver*/);
+ } catch (IllegalArgumentException ignore) {
+ }
// Check signatures now
int match = mContext.getPackageManager().checkSignatures(
ip1.pkg.packageName, pkg.packageName);
@@ -3640,7 +3461,7 @@
int apk2 = SHARED2_CERT1_CERT2;
int rapk1 = SHARED1_CERT1;
boolean fail = true;
- int retCode = PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE;
+ int retCode = PackageInstaller.STATUS_FAILURE_CONFLICT;
checkSharedSignatures(apk1, apk2, false, false, -1, PackageManager.SIGNATURE_MATCH);
installFromRawResource("install.apk", rapk1, PackageManager.INSTALL_REPLACE_EXISTING, true,
fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
@@ -3652,7 +3473,7 @@
int apk2 = SHARED2_CERT1_CERT2;
int rapk2 = SHARED2_CERT1;
boolean fail = true;
- int retCode = PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE;
+ int retCode = PackageInstaller.STATUS_FAILURE_CONFLICT;
checkSharedSignatures(apk1, apk2, false, false, -1, PackageManager.SIGNATURE_MATCH);
installFromRawResource("install.apk", rapk2, PackageManager.INSTALL_REPLACE_EXISTING, true,
fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
@@ -3664,7 +3485,7 @@
int apk2 = SHARED2_CERT1;
int rapk1 = SHARED1_CERT2;
boolean fail = true;
- int retCode = PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE;
+ int retCode = PackageInstaller.STATUS_FAILURE_CONFLICT;
checkSharedSignatures(apk1, apk2, false, false, -1, PackageManager.SIGNATURE_MATCH);
installFromRawResource("install.apk", rapk1, PackageManager.INSTALL_REPLACE_EXISTING, true,
fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
@@ -3676,7 +3497,7 @@
int apk2 = SHARED2_CERT1;
int rapk2 = SHARED2_CERT2;
boolean fail = true;
- int retCode = PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE;
+ int retCode = PackageInstaller.STATUS_FAILURE_CONFLICT;
checkSharedSignatures(apk1, apk2, false, false, -1, PackageManager.SIGNATURE_MATCH);
installFromRawResource("install.apk", rapk2, PackageManager.INSTALL_REPLACE_EXISTING, true,
fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
@@ -3688,7 +3509,7 @@
int apk2 = SHARED2_CERT1;
int rapk1 = SHARED1_CERT1_CERT2;
boolean fail = true;
- int retCode = PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE;
+ int retCode = PackageInstaller.STATUS_FAILURE_CONFLICT;
checkSharedSignatures(apk1, apk2, false, false, -1, PackageManager.SIGNATURE_MATCH);
installFromRawResource("install.apk", rapk1, PackageManager.INSTALL_REPLACE_EXISTING, true,
fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
@@ -3700,7 +3521,7 @@
int apk2 = SHARED2_CERT1;
int rapk2 = SHARED2_CERT1_CERT2;
boolean fail = true;
- int retCode = PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE;
+ int retCode = PackageInstaller.STATUS_FAILURE_CONFLICT;
checkSharedSignatures(apk1, apk2, false, false, -1, PackageManager.SIGNATURE_MATCH);
installFromRawResource("install.apk", rapk2, PackageManager.INSTALL_REPLACE_EXISTING, true,
fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
@@ -3724,7 +3545,7 @@
@LargeTest
public void testInstallNonexistentFile() throws Exception {
- int retCode = PackageManager.INSTALL_FAILED_INVALID_URI;
+ int retCode = PackageInstaller.STATUS_FAILURE_INVALID;
File invalidFile = new File("/nonexistent-file.apk");
invokeInstallPackageFail(Uri.fromFile(invalidFile), 0, retCode);
}
@@ -3845,7 +3666,7 @@
@Suppress
public void testInstall_BadDex_CleanUp() throws Exception {
- int retCode = PackageManager.INSTALL_FAILED_DEXOPT;
+ int retCode = PackageInstaller.STATUS_FAILURE_INVALID;
installFromRawResource("install.apk", R.raw.install_bad_dex, 0, true, true, retCode,
PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
}
diff --git a/core/tests/coretests/src/android/content/pm/PackageParserTest.java b/core/tests/coretests/src/android/content/pm/PackageParserTest.java
index b9bd193..73c153f 100644
--- a/core/tests/coretests/src/android/content/pm/PackageParserTest.java
+++ b/core/tests/coretests/src/android/content/pm/PackageParserTest.java
@@ -19,14 +19,27 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import android.content.Context;
+import android.content.pm.PackageParser.Component;
+import android.content.pm.PackageParser.Package;
+import android.content.pm.PackageParser.Permission;
import android.os.Build;
+import android.os.FileUtils;
+import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
+import com.android.frameworks.coretests.R;
+
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.io.File;
+import java.io.InputStream;
+import java.util.Arrays;
+
@SmallTest
@RunWith(AndroidJUnit4.class)
public class PackageParserTest {
@@ -257,4 +270,117 @@
PackageParser.getActivityConfigChanges(configChanges, recreateOnConfigChanges);
assertEquals(0x0083, finalConfigChanges); // Should be 10000011.
}
+
+ /**
+ * Attempts to parse a package.
+ *
+ * APKs are put into coretests/apks/packageparser_*.
+ *
+ * @param apkName temporary file name to store apk extracted from resources
+ * @param apkResourceId identifier of the apk as a resource
+ */
+ Package parsePackage(String apkFileName, int apkResourceId) throws Exception {
+ // Copy the resource to a file.
+ Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ File outFile = new File(context.getFilesDir(), apkFileName);
+ try {
+ InputStream is = context.getResources().openRawResource(apkResourceId);
+ assertTrue(FileUtils.copyToFile(is, outFile));
+ return new PackageParser().parsePackage(outFile, 0 /* flags */);
+ } finally {
+ outFile.delete();
+ }
+ }
+
+ /**
+ * Asserts basic properties about a component.
+ */
+ private void assertComponent(String className, String packageName, int numIntents,
+ Component<?> component) {
+ assertEquals(className, component.className);
+ assertEquals(packageName, component.owner.packageName);
+ assertEquals(numIntents, component.intents.size());
+ }
+
+ /**
+ * Asserts four regularly-named components of each type: one Activity, one Service, one
+ * Provider, and one Receiver.
+ * @param template templated string with %s subbed with Activity, Service, Provider, Receiver
+ */
+ private void assertOneComponentOfEachType(String template, Package p) {
+ String packageName = p.packageName;
+
+ assertEquals(1, p.activities.size());
+ assertComponent(String.format(template, "Activity"),
+ packageName, 0 /* intents */, p.activities.get(0));
+ assertEquals(1, p.services.size());
+ assertComponent(String.format(template, "Service"),
+ packageName, 0 /* intents */, p.services.get(0));
+ assertEquals(1, p.providers.size());
+ assertComponent(String.format(template, "Provider"),
+ packageName, 0 /* intents */, p.providers.get(0));
+ assertEquals(1, p.receivers.size());
+ assertComponent(String.format(template, "Receiver"),
+ packageName, 0 /* intents */, p.receivers.get(0));
+ }
+
+ private void assertPermission(String name, String packageName, int protectionLevel,
+ Permission permission) {
+ assertEquals(packageName, permission.owner.packageName);
+ assertEquals(name, permission.info.name);
+ assertEquals(protectionLevel, permission.info.protectionLevel);
+ }
+
+ @Test
+ public void testPackageWithComponents() throws Exception {
+ Package p = parsePackage(
+ "install_complete_package_info.apk", R.raw.install_complete_package_info);
+ String packageName = "com.android.frameworks.coretests.install_complete_package_info";
+
+ assertEquals(packageName, p.packageName);
+ assertEquals(1, p.permissions.size());
+ assertPermission(
+ "com.android.frameworks.coretests.install_complete_package_info.test_permission",
+ packageName, PermissionInfo.PROTECTION_NORMAL, p.permissions.get(0));
+
+ assertOneComponentOfEachType("com.android.frameworks.coretests.Test%s", p);
+ }
+
+ @Test
+ public void testMultiPackageComponents() throws Exception {
+ String parentName = "com.android.frameworks.coretests.install_multi_package";
+ String firstChildName =
+ "com.android.frameworks.coretests.install_multi_package.first_child";
+ String secondChildName = // NOTE: intentionally inconsistent!
+ "com.android.frameworks.coretests.blah.second_child";
+
+ Package parent = parsePackage("install_multi_package.apk", R.raw.install_multi_package);
+ assertEquals(parentName, parent.packageName);
+ assertEquals(2, parent.childPackages.size());
+ assertOneComponentOfEachType("com.android.frameworks.coretests.Test%s", parent);
+ assertEquals(1, parent.permissions.size());
+ assertPermission(parentName + ".test_permission", parentName,
+ PermissionInfo.PROTECTION_NORMAL, parent.permissions.get(0));
+ assertEquals(Arrays.asList("android.permission.INTERNET"),
+ parent.requestedPermissions);
+
+ Package firstChild = parent.childPackages.get(0);
+ assertEquals(firstChildName, firstChild.packageName);
+ assertOneComponentOfEachType(
+ "com.android.frameworks.coretests.FirstChildTest%s", firstChild);
+ assertEquals(0, firstChild.permissions.size()); // Child APKs cannot declare permissions.
+ assertEquals(Arrays.asList("android.permission.NFC"),
+ firstChild.requestedPermissions);
+
+ Package secondChild = parent.childPackages.get(1);
+ assertEquals(secondChildName, secondChild.packageName);
+ assertOneComponentOfEachType(
+ "com.android.frameworks.coretests.SecondChildTest%s", secondChild);
+ assertEquals(0, secondChild.permissions.size()); // Child APKs cannot declare permissions.
+ assertEquals(
+ Arrays.asList(
+ "android.permission.ACCESS_NETWORK_STATE",
+ "android.permission.READ_CONTACTS"),
+ secondChild.requestedPermissions);
+ }
}
diff --git a/core/tests/coretests/src/android/database/DatabaseGeneralTest.java b/core/tests/coretests/src/android/database/DatabaseGeneralTest.java
index c7cb43d..7800f4a 100644
--- a/core/tests/coretests/src/android/database/DatabaseGeneralTest.java
+++ b/core/tests/coretests/src/android/database/DatabaseGeneralTest.java
@@ -18,11 +18,12 @@
import static android.database.DatabaseUtils.InsertHelper.TABLE_INFO_PRAGMA_COLUMNNAME_INDEX;
import static android.database.DatabaseUtils.InsertHelper.TABLE_INFO_PRAGMA_DEFAULT_INDEX;
+
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteDebug;
import android.database.sqlite.SQLiteException;
-import android.os.Handler;
import android.os.Parcel;
import android.test.AndroidTestCase;
import android.test.PerformanceTestCase;
@@ -40,6 +41,9 @@
import java.util.List;
import java.util.Locale;
+/**
+ * Usage: bit FrameworksCoreTests:android.database.DatabaseGeneralTest
+ */
public class DatabaseGeneralTest extends AndroidTestCase implements PerformanceTestCase {
private static final String TAG = "DatabaseGeneralTest";
@@ -68,7 +72,7 @@
@Override
protected void tearDown() throws Exception {
mDatabase.close();
- mDatabaseFile.delete();
+ SQLiteDatabase.deleteDatabase(mDatabaseFile);
super.tearDown();
}
@@ -1044,6 +1048,52 @@
}
}
+ @SmallTest
+ public void testOpenDatabaseLookasideConfig() {
+ // First check that lookaside is active
+ verifyLookasideStats(false);
+ // Reopen test db with lookaside disabled
+ mDatabase.close();
+ SQLiteDatabase.OpenParams params = new SQLiteDatabase.OpenParams.Builder()
+ .setLookasideConfig(0, 0).build();
+ mDatabase = SQLiteDatabase.openDatabase(mDatabaseFile.getPath(), params);
+ verifyLookasideStats(true);
+ }
+
+ @SmallTest
+ public void testOpenParamsSetLookasideConfigValidation() {
+ try {
+ SQLiteDatabase.OpenParams params = new SQLiteDatabase.OpenParams.Builder()
+ .setLookasideConfig(-1, 0).build();
+ fail("Negative slot size should be rejected");
+ } catch (IllegalArgumentException expected) {
+ }
+ try {
+ SQLiteDatabase.OpenParams params = new SQLiteDatabase.OpenParams.Builder()
+ .setLookasideConfig(0, -10).build();
+ fail("Negative slot count should be rejected");
+ } catch (IllegalArgumentException expected) {
+ }
+ }
+
+ void verifyLookasideStats(boolean expectDisabled) {
+ boolean dbStatFound = false;
+ SQLiteDebug.PagerStats info = SQLiteDebug.getDatabaseInfo();
+ for (SQLiteDebug.DbStats dbStat : info.dbStats) {
+ if (dbStat.dbName.endsWith(mDatabaseFile.getName())) {
+ dbStatFound = true;
+ Log.i(TAG, "Lookaside for " + dbStat.dbName + " " + dbStat.lookaside);
+ if (expectDisabled) {
+ assertTrue("lookaside slots count should be zero", dbStat.lookaside == 0);
+ } else {
+ assertTrue("lookaside slots count should be greater than zero",
+ dbStat.lookaside > 0);
+ }
+ }
+ }
+ assertTrue("No dbstat found for " + mDatabaseFile.getName(), dbStatFound);
+ }
+
@LargeTest
public void testDefaultDatabaseErrorHandler() {
DefaultDatabaseErrorHandler errorHandler = new DefaultDatabaseErrorHandler();
diff --git a/core/tests/coretests/src/android/database/DatabasePerformanceTests.java b/core/tests/coretests/src/android/database/DatabasePerformanceTests.java
deleted file mode 100644
index d0e739b..0000000
--- a/core/tests/coretests/src/android/database/DatabasePerformanceTests.java
+++ /dev/null
@@ -1,1354 +0,0 @@
-/*
- * Copyright (C) 2007 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.database;
-
-import junit.framework.Assert;
-
-import android.content.ContentValues;
-import android.content.Context;
-import android.database.Cursor;
-import android.database.sqlite.SQLiteDatabase;
-import android.provider.Contacts;
-import android.provider.Contacts.People;
-import android.test.PerformanceTestCase;
-import android.test.TestCase;
-
-import java.io.File;
-import java.util.Random;
-
-/**
- * Database Performance Tests
- *
- */
-
-@SuppressWarnings("deprecation")
-public class DatabasePerformanceTests {
-
- public static String[] children() {
- return new String[] {
- ContactReadingTest1.class.getName(),
- Perf1Test.class.getName(),
- Perf2Test.class.getName(),
- Perf3Test.class.getName(),
- Perf4Test.class.getName(),
- Perf5Test.class.getName(),
- Perf6Test.class.getName(),
- Perf7Test.class.getName(),
- Perf8Test.class.getName(),
- Perf9Test.class.getName(),
- Perf10Test.class.getName(),
- Perf11Test.class.getName(),
- Perf12Test.class.getName(),
- Perf13Test.class.getName(),
- Perf14Test.class.getName(),
- Perf15Test.class.getName(),
- Perf16Test.class.getName(),
- Perf17Test.class.getName(),
- Perf18Test.class.getName(),
- Perf19Test.class.getName(),
- Perf20Test.class.getName(),
- Perf21Test.class.getName(),
- Perf22Test.class.getName(),
- Perf23Test.class.getName(),
- Perf24Test.class.getName(),
- Perf25Test.class.getName(),
- Perf26Test.class.getName(),
- Perf27Test.class.getName(),
- Perf28Test.class.getName(),
- Perf29Test.class.getName(),
- Perf30Test.class.getName(),
- Perf31Test.class.getName(),
- };
- }
-
- public static abstract class PerformanceBase implements TestCase,
- PerformanceTestCase {
- protected static final int CURRENT_DATABASE_VERSION = 42;
- protected SQLiteDatabase mDatabase;
- protected File mDatabaseFile;
- protected Context mContext;
-
- public void setUp(Context c) {
- mContext = c;
- mDatabaseFile = new File("/tmp", "perf_database_test.db");
- if (mDatabaseFile.exists()) {
- mDatabaseFile.delete();
- }
- mDatabase = SQLiteDatabase.openOrCreateDatabase(mDatabaseFile.getPath(), null);
- Assert.assertTrue(mDatabase != null);
- mDatabase.setVersion(CURRENT_DATABASE_VERSION);
- }
-
- public void tearDown() {
- mDatabase.close();
- mDatabaseFile.delete();
- }
-
- public boolean isPerformanceOnly() {
- return true;
- }
-
- // These test can only be run once.
- public int startPerformance(Intermediates intermediates) {
- return 0;
- }
-
- public void run() {
- }
-
- public String numberName(int number) {
- String result = "";
-
- if (number >= 1000) {
- result += numberName((number / 1000)) + " thousand";
- number = (number % 1000);
-
- if (number > 0) result += " ";
- }
-
- if (number >= 100) {
- result += ONES[(number / 100)] + " hundred";
- number = (number % 100);
-
- if (number > 0) result += " ";
- }
-
- if (number >= 20) {
- result += TENS[(number / 10)];
- number = (number % 10);
-
- if (number > 0) result += " ";
- }
-
- if (number > 0) {
- result += ONES[number];
- }
-
- return result;
- }
- }
-
- /**
- * Test reading all contact data.
- */
- public static class ContactReadingTest1 implements TestCase, PerformanceTestCase {
- private static final String[] PEOPLE_PROJECTION = new String[] {
- Contacts.People._ID, // 0
- Contacts.People.PRIMARY_PHONE_ID, // 1
- Contacts.People.TYPE, // 2
- Contacts.People.NUMBER, // 3
- Contacts.People.LABEL, // 4
- Contacts.People.NAME, // 5
- Contacts.People.PRESENCE_STATUS, // 6
- };
-
- private Cursor mCursor;
-
- public void setUp(Context c) {
- mCursor = c.getContentResolver().query(People.CONTENT_URI, PEOPLE_PROJECTION, null,
- null, People.DEFAULT_SORT_ORDER);
- }
-
- public void tearDown() {
- mCursor.close();
- }
-
- public boolean isPerformanceOnly() {
- return true;
- }
-
- public int startPerformance(Intermediates intermediates) {
- // This test can only be run once.
- return 0;
- }
-
- public void run() {
- while (mCursor.moveToNext()) {
- // Read out all of the data
- mCursor.getLong(0);
- mCursor.getLong(1);
- mCursor.getLong(2);
- mCursor.getString(3);
- mCursor.getString(4);
- mCursor.getString(5);
- mCursor.getLong(6);
- }
- }
- }
-
- /**
- * Test 1000 inserts
- */
-
- public static class Perf1Test extends PerformanceBase {
- private static final int SIZE = 1000;
-
- private String[] statements = new String[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- statements[i] =
- "INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')";
- }
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.execSQL(statements[i]);
- }
- }
- }
-
- /**
- * Test 1000 inserts into and indexed table
- */
-
- public static class Perf2Test extends PerformanceBase {
- private static final int SIZE = 1000;
-
- private String[] statements = new String[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- statements[i] =
- "INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')";
- }
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
- mDatabase.execSQL("CREATE INDEX i1c ON t1(c)");
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.execSQL(statements[i]);
- }
- }
- }
-
- /**
- * 100 SELECTs without an index
- */
-
- public static class Perf3Test extends PerformanceBase {
- private static final int SIZE = 100;
- private static final String[] COLUMNS = {"count(*)", "avg(b)"};
-
- private String[] where = new String[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- for (int i = 0; i < SIZE; i++) {
- int lower = i * 100;
- int upper = (i + 10) * 100;
- where[i] = "b >= " + lower + " AND b < " + upper;
- }
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase
- .query("t1", COLUMNS, where[i], null, null, null, null);
- }
- }
- }
-
- /**
- * 100 SELECTs on a string comparison
- */
-
- public static class Perf4Test extends PerformanceBase {
- private static final int SIZE = 100;
- private static final String[] COLUMNS = {"count(*)", "avg(b)"};
-
- private String[] where = new String[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- for (int i = 0; i < SIZE; i++) {
- where[i] = "c LIKE '" + numberName(i) + "'";
- }
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase
- .query("t1", COLUMNS, where[i], null, null, null, null);
- }
- }
- }
-
- /**
- * 100 SELECTs with an index
- */
-
- public static class Perf5Test extends PerformanceBase {
- private static final int SIZE = 100;
- private static final String[] COLUMNS = {"count(*)", "avg(b)"};
-
- private String[] where = new String[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
- mDatabase.execSQL("CREATE INDEX i1b ON t1(b)");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- for (int i = 0; i < SIZE; i++) {
- int lower = i * 100;
- int upper = (i + 10) * 100;
- where[i] = "b >= " + lower + " AND b < " + upper;
- }
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase
- .query("t1", COLUMNS, where[i], null, null, null, null);
- }
- }
- }
-
- /**
- * INNER JOIN without an index
- */
-
- public static class Perf6Test extends PerformanceBase {
- private static final int SIZE = 100;
- private static final String[] COLUMNS = {"t1.a"};
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
- mDatabase
- .execSQL("CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100))");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t2 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
- }
-
- @Override
- public void run() {
- mDatabase.query("t1 INNER JOIN t2 ON t1.b = t2.b", COLUMNS, null,
- null, null, null, null);
- }
- }
-
- /**
- * INNER JOIN without an index on one side
- */
-
- public static class Perf7Test extends PerformanceBase {
- private static final int SIZE = 100;
- private static final String[] COLUMNS = {"t1.a"};
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
- mDatabase
- .execSQL("CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100))");
-
- mDatabase.execSQL("CREATE INDEX i1b ON t1(b)");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t2 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
- }
-
- @Override
- public void run() {
- mDatabase.query("t1 INNER JOIN t2 ON t1.b = t2.b", COLUMNS, null,
- null, null, null, null);
- }
- }
-
- /**
- * INNER JOIN without an index on one side
- */
-
- public static class Perf8Test extends PerformanceBase {
- private static final int SIZE = 100;
- private static final String[] COLUMNS = {"t1.a"};
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
- mDatabase
- .execSQL("CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100))");
-
- mDatabase.execSQL("CREATE INDEX i1b ON t1(b)");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t2 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
- }
-
- @Override
- public void run() {
- mDatabase.query("t1 INNER JOIN t2 ON t1.c = t2.c", COLUMNS, null,
- null, null, null, null);
- }
- }
-
- /**
- * 100 SELECTs with subqueries. Subquery is using an index
- */
-
- public static class Perf9Test extends PerformanceBase {
- private static final int SIZE = 100;
- private static final String[] COLUMNS = {"t1.a"};
-
- private String[] where = new String[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
- mDatabase
- .execSQL("CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100))");
-
- mDatabase.execSQL("CREATE INDEX i2b ON t2(b)");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t2 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- for (int i = 0; i < SIZE; i++) {
- int lower = i * 100;
- int upper = (i + 10) * 100;
- where[i] =
- "t1.b IN (SELECT t2.b FROM t2 WHERE t2.b >= " + lower
- + " AND t2.b < " + upper + ")";
- }
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase
- .query("t1", COLUMNS, where[i], null, null, null, null);
- }
- }
- }
-
- /**
- * 100 SELECTs on string comparison with Index
- */
-
- public static class Perf10Test extends PerformanceBase {
- private static final int SIZE = 100;
- private static final String[] COLUMNS = {"count(*)", "avg(b)"};
-
- private String[] where = new String[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
- mDatabase.execSQL("CREATE INDEX i3c ON t1(c)");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- for (int i = 0; i < SIZE; i++) {
- where[i] = "c LIKE '" + numberName(i) + "'";
- }
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase
- .query("t1", COLUMNS, where[i], null, null, null, null);
- }
- }
- }
-
- /**
- * 100 SELECTs on integer
- */
-
- public static class Perf11Test extends PerformanceBase {
- private static final int SIZE = 100;
- private static final String[] COLUMNS = {"b"};
-
- private String[] where = new String[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.query("t1", COLUMNS, null, null, null, null, null);
- }
- }
- }
-
- /**
- * 100 SELECTs on String
- */
-
- public static class Perf12Test extends PerformanceBase {
- private static final int SIZE = 100;
- private static final String[] COLUMNS = {"c"};
-
- private String[] where = new String[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.query("t1", COLUMNS, null, null, null, null, null);
- }
- }
- }
-
- /**
- * 100 SELECTs on integer with index
- */
-
- public static class Perf13Test extends PerformanceBase {
- private static final int SIZE = 100;
- private static final String[] COLUMNS = {"b"};
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
- mDatabase.execSQL("CREATE INDEX i1b on t1(b)");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.query("t1", COLUMNS, null, null, null, null, null);
- }
- }
- }
-
- /**
- * 100 SELECTs on String with index
- */
-
- public static class Perf14Test extends PerformanceBase {
- private static final int SIZE = 100;
- private static final String[] COLUMNS = {"c"};
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
- mDatabase.execSQL("CREATE INDEX i1c ON t1(c)");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.query("t1", COLUMNS, null, null, null, null, null);
- }
- }
- }
-
- /**
- * 100 SELECTs on String with starts with
- */
-
- public static class Perf15Test extends PerformanceBase {
- private static final int SIZE = 100;
- private static final String[] COLUMNS = {"c"};
- private String[] where = new String[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
- mDatabase.execSQL("CREATE INDEX i1c ON t1(c)");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- where[i] = "c LIKE '" + numberName(r).substring(0, 1) + "*'";
-
- }
-
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase
- .query("t1", COLUMNS, where[i], null, null, null, null);
- }
- }
- }
-
- /**
- * 1000 Deletes on an indexed table
- */
-
- public static class Perf16Test extends PerformanceBase {
- private static final int SIZE = 1000;
- private static final String[] COLUMNS = {"c"};
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
- mDatabase.execSQL("CREATE INDEX i3c ON t1(c)");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.delete("t1", null, null);
- }
- }
- }
-
- /**
- * 1000 Deletes
- */
-
- public static class Perf17Test extends PerformanceBase {
- private static final int SIZE = 1000;
- private static final String[] COLUMNS = {"c"};
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.delete("t1", null, null);
- }
- }
- }
-
- /**
- * 1000 DELETE's without an index with where clause
- */
-
- public static class Perf18Test extends PerformanceBase {
- private static final int SIZE = 1000;
- private String[] where = new String[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- for (int i = 0; i < SIZE; i++) {
- int lower = i * 100;
- int upper = (i + 10) * 100;
- where[i] = "b >= " + lower + " AND b < " + upper;
- }
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.delete("t1", where[i], null);
- }
- }
- }
-
- /**
- * 1000 DELETE's with an index with where clause
- */
-
- public static class Perf19Test extends PerformanceBase {
- private static final int SIZE = 1000;
- private String[] where = new String[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
- mDatabase.execSQL("CREATE INDEX i1b ON t1(b)");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- for (int i = 0; i < SIZE; i++) {
- int lower = i * 100;
- int upper = (i + 10) * 100;
- where[i] = "b >= " + lower + " AND b < " + upper;
- }
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.delete("t1", where[i], null);
- }
- }
- }
-
- /**
- * 1000 update's with an index with where clause
- */
-
- public static class Perf20Test extends PerformanceBase {
- private static final int SIZE = 1000;
- private String[] where = new String[SIZE];
- ContentValues[] mValues = new ContentValues[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
- mDatabase.execSQL("CREATE INDEX i1b ON t1(b)");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- for (int i = 0; i < SIZE; i++) {
-
- int lower = i * 100;
- int upper = (i + 10) * 100;
- where[i] = "b >= " + lower + " AND b < " + upper;
- ContentValues b = new ContentValues(1);
- b.put("b", upper);
- mValues[i] = b;
-
- }
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.update("t1", mValues[i], where[i], null);
- }
- }
- }
-
- /**
- * 1000 update's without an index with where clause
- */
-
- public static class Perf21Test extends PerformanceBase {
- private static final int SIZE = 1000;
- private String[] where = new String[SIZE];
- ContentValues[] mValues = new ContentValues[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
- + numberName(r) + "')");
- }
-
- for (int i = 0; i < SIZE; i++) {
-
- int lower = i * 100;
- int upper = (i + 10) * 100;
- where[i] = "b >= " + lower + " AND b < " + upper;
- ContentValues b = new ContentValues(1);
- b.put("b", upper);
- mValues[i] = b;
- }
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.update("t1", mValues[i], where[i], null);
- }
- }
- }
-
- /**
- * 10000 inserts for an integer
- */
-
- public static class Perf22Test extends PerformanceBase {
- private static final int SIZE = 10000;
- ContentValues[] mValues = new ContentValues[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER)");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- ContentValues b = new ContentValues(1);
- b.put("a", r);
- mValues[i] = b;
- }
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.insert("t1", null, mValues[i]);
- }
- }
- }
-
- /**
- * 10000 inserts for an integer -indexed table
- */
-
- public static class Perf23Test extends PerformanceBase {
- private static final int SIZE = 10000;
- ContentValues[] mValues = new ContentValues[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a INTEGER)");
- mDatabase.execSQL("CREATE INDEX i1a ON t1(a)");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- ContentValues b = new ContentValues(1);
- b.put("a", r);
- mValues[i] = b;
- }
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.insert("t1", null, mValues[i]);
- }
- }
- }
-
- /**
- * 10000 inserts for a String
- */
-
- public static class Perf24Test extends PerformanceBase {
- private static final int SIZE = 10000;
- ContentValues[] mValues = new ContentValues[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a VARCHAR(100))");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- ContentValues b = new ContentValues(1);
- b.put("a", numberName(r));
- mValues[i] = b;
- }
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.insert("t1", null, mValues[i]);
- }
- }
- }
-
- /**
- * 10000 inserts for a String - indexed table
- */
-
- public static class Perf25Test extends PerformanceBase {
- private static final int SIZE = 10000;
- ContentValues[] mValues = new ContentValues[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t1(a VARCHAR(100))");
- mDatabase.execSQL("CREATE INDEX i1a ON t1(a)");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- ContentValues b = new ContentValues(1);
- b.put("a", numberName(r));
- mValues[i] = b;
- }
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.insert("t1", null, mValues[i]);
- }
- }
- }
-
-
- /**
- * 10000 selects for a String -starts with
- */
-
- public static class Perf26Test extends PerformanceBase {
- private static final int SIZE = 10000;
- private static final String[] COLUMNS = {"t3.a"};
- private String[] where = new String[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t3(a VARCHAR(100))");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t3 VALUES('"
- + numberName(r) + "')");
- }
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- where[i] = "a LIKE '" + numberName(r).substring(0, 1) + "*'";
-
- }
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.query("t3", COLUMNS, where[i], null, null, null, null);
- }
- }
- }
-
- /**
- * 10000 selects for a String - indexed table -starts with
- */
-
- public static class Perf27Test extends PerformanceBase {
- private static final int SIZE = 10000;
- private static final String[] COLUMNS = {"t3.a"};
- private String[] where = new String[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t3(a VARCHAR(100))");
- mDatabase.execSQL("CREATE INDEX i3a ON t3(a)");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t3 VALUES('"
- + numberName(r) + "')");
- }
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- where[i] = "a LIKE '" + numberName(r).substring(0, 1) + "*'";
-
- }
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.query("t3", COLUMNS, where[i], null, null, null, null);
- }
- }
- }
-
- /**
- * 10000 selects for an integer -
- */
-
- public static class Perf28Test extends PerformanceBase {
- private static final int SIZE = 10000;
- private static final String[] COLUMNS = {"t4.a"};
- private String[] where = new String[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t4(a INTEGER)");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t4 VALUES(" + r + ")");
- int lower = i * 100;
- int upper = (i + 10) * 100;
- where[i] = "a >= " + lower + " AND a < " + upper;
- }
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.query("t4", COLUMNS, where[i], null, null, null, null);
- }
- }
- }
-
- /**
- * 10000 selects for an integer -indexed table
- */
-
- public static class Perf29Test extends PerformanceBase {
- private static final int SIZE = 10000;
- private static final String[] COLUMNS = {"t4.a"};
- private String[] where = new String[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t4(a INTEGER)");
- mDatabase.execSQL("CREATE INDEX i4a ON t4(a)");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t4 VALUES(" + r + ")");
-
- int lower = i * 100;
- int upper = (i + 10) * 100;
- where[i] = "a >= " + lower + " AND a < " + upper;
- }
-
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.query("t4", COLUMNS, where[i], null, null, null, null);
- }
- }
- }
-
-
- /**
- * 10000 selects for a String - contains 'e'
- */
-
- public static class Perf30Test extends PerformanceBase {
- private static final int SIZE = 10000;
- private static final String[] COLUMNS = {"t3.a"};
- private String[] where = new String[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t3(a VARCHAR(100))");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t3 VALUES('"
- + numberName(r) + "')");
- }
-
- for (int i = 0; i < SIZE; i++) {
- where[i] = "a LIKE '*e*'";
-
- }
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.query("t3", COLUMNS, where[i], null, null, null, null);
- }
- }
- }
-
- /**
- * 10000 selects for a String - contains 'e'-indexed table
- */
-
- public static class Perf31Test extends PerformanceBase {
- private static final int SIZE = 10000;
- private static final String[] COLUMNS = {"t3.a"};
- private String[] where = new String[SIZE];
-
- @Override
- public void setUp(Context c) {
- super.setUp(c);
- Random random = new Random(42);
-
- mDatabase
- .execSQL("CREATE TABLE t3(a VARCHAR(100))");
- mDatabase.execSQL("CREATE INDEX i3a ON t3(a)");
-
- for (int i = 0; i < SIZE; i++) {
- int r = random.nextInt(100000);
- mDatabase.execSQL("INSERT INTO t3 VALUES('"
- + numberName(r) + "')");
- }
-
- for (int i = 0; i < SIZE; i++) {
- where[i] = "a LIKE '*e*'";
-
- }
-
- }
-
- @Override
- public void run() {
- for (int i = 0; i < SIZE; i++) {
- mDatabase.query("t3", COLUMNS, where[i], null, null, null, null);
- }
- }
- }
-
- public static final String[] ONES =
- {"zero", "one", "two", "three", "four", "five", "six", "seven",
- "eight", "nine", "ten", "eleven", "twelve", "thirteen",
- "fourteen", "fifteen", "sixteen", "seventeen", "eighteen",
- "nineteen"};
-
- public static final String[] TENS =
- {"", "ten", "twenty", "thirty", "forty", "fifty", "sixty",
- "seventy", "eighty", "ninety"};
-}
diff --git a/core/tests/coretests/src/android/database/SQLiteOpenHelperTest.java b/core/tests/coretests/src/android/database/SQLiteOpenHelperTest.java
new file mode 100644
index 0000000..75eeb93
--- /dev/null
+++ b/core/tests/coretests/src/android/database/SQLiteOpenHelperTest.java
@@ -0,0 +1,171 @@
+/*
+ * Copyright (C) 2017 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.database;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import android.content.Context;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteDatabaseConfiguration;
+import android.database.sqlite.SQLiteDebug;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.util.Log;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Tests for {@link SQLiteOpenHelper}
+ *
+ * <p>Run with: bit FrameworksCoreTests:android.database.SQLiteOpenHelperTest
+ */
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class SQLiteOpenHelperTest {
+ private static final String TAG = "SQLiteOpenHelperTest";
+
+ private TestHelper mTestHelper;
+ private Context mContext;
+ private List<SQLiteOpenHelper> mHelpersToClose;
+
+ private static class TestHelper extends SQLiteOpenHelper {
+ TestHelper(Context context) { // In-memory
+ super(context, null, null, 1);
+ }
+
+ TestHelper(Context context, String name) {
+ super(context, name, null, 1);
+ }
+
+ @Override
+ public void onCreate(SQLiteDatabase db) {
+ }
+
+ @Override
+ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+ }
+ }
+
+ @Before
+ public void setup() {
+ mContext = InstrumentationRegistry.getContext();
+ mTestHelper = new TestHelper(mContext, "openhelper_test");
+ mHelpersToClose = new ArrayList<>();
+ mHelpersToClose.add(mTestHelper);
+ }
+
+ @After
+ public void teardown() {
+ for (SQLiteOpenHelper helper : mHelpersToClose) {
+ try {
+ helper.close();
+ if (mTestHelper.getDatabaseName() != null) {
+ SQLiteDatabase.deleteDatabase(
+ mContext.getDatabasePath(mTestHelper.getDatabaseName()));
+ }
+ } catch (RuntimeException ex) {
+ Log.w(TAG, "Error occured when closing db helper " + helper, ex);
+ }
+ }
+ }
+
+ @Test
+ public void testLookasideDefault() throws Exception {
+ assertNotNull(mTestHelper.getWritableDatabase());
+ verifyLookasideStats(false);
+ }
+
+ @Test
+ public void testLookasideDisabled() throws Exception {
+ mTestHelper.setLookasideConfig(0, 0);
+ assertNotNull(mTestHelper.getWritableDatabase());
+ verifyLookasideStats(true);
+ }
+
+ @Test
+ public void testInMemoryLookasideDisabled() throws Exception {
+ TestHelper memHelper = new TestHelper(mContext);
+ mHelpersToClose.add(memHelper);
+ memHelper.setLookasideConfig(0, 0);
+ assertNotNull(memHelper.getWritableDatabase());
+ verifyLookasideStats(SQLiteDatabaseConfiguration.MEMORY_DB_PATH, true);
+ }
+
+ @Test
+ public void testInMemoryLookasideDefault() throws Exception {
+ TestHelper memHelper = new TestHelper(mContext);
+ mHelpersToClose.add(memHelper);
+ assertNotNull(memHelper.getWritableDatabase());
+ verifyLookasideStats(SQLiteDatabaseConfiguration.MEMORY_DB_PATH, false);
+ }
+
+ @Test
+ public void testSetLookasideConfigValidation() {
+ try {
+ mTestHelper.setLookasideConfig(-1, 0);
+ fail("Negative slot size should be rejected");
+ } catch (IllegalArgumentException expected) {
+ }
+ try {
+ mTestHelper.setLookasideConfig(0, -10);
+ fail("Negative slot count should be rejected");
+ } catch (IllegalArgumentException expected) {
+ }
+ try {
+ mTestHelper.setLookasideConfig(1, 0);
+ fail("Illegal config should be rejected");
+ } catch (IllegalArgumentException expected) {
+ }
+ try {
+ mTestHelper.setLookasideConfig(0, 1);
+ fail("Illegal config should be rejected");
+ } catch (IllegalArgumentException expected) {
+ }
+ }
+
+ private void verifyLookasideStats(boolean expectDisabled) {
+ verifyLookasideStats(mTestHelper.getDatabaseName(), expectDisabled);
+ }
+
+ private static void verifyLookasideStats(String dbName, boolean expectDisabled) {
+ boolean dbStatFound = false;
+ SQLiteDebug.PagerStats info = SQLiteDebug.getDatabaseInfo();
+ for (SQLiteDebug.DbStats dbStat : info.dbStats) {
+ if (dbStat.dbName.endsWith(dbName)) {
+ dbStatFound = true;
+ Log.i(TAG, "Lookaside for " + dbStat.dbName + " " + dbStat.lookaside);
+ if (expectDisabled) {
+ assertTrue("lookaside slots count should be zero", dbStat.lookaside == 0);
+ } else {
+ assertTrue("lookaside slots count should be greater than zero",
+ dbStat.lookaside > 0);
+ }
+ }
+ }
+ assertTrue("No dbstat found for " + dbName, dbStatFound);
+ }
+}
diff --git a/core/tests/coretests/src/android/database/run_newdb_perf_test.sh b/core/tests/coretests/src/android/database/run_newdb_perf_test.sh
new file mode 100755
index 0000000..10a62e6
--- /dev/null
+++ b/core/tests/coretests/src/android/database/run_newdb_perf_test.sh
@@ -0,0 +1,28 @@
+#!/bin/bash -
+# Copyright (C) 2017 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.
+
+make -j44 FrameworksCoreTests
+adb install -r -g ${ANDROID_PRODUCT_OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk
+adb logcat -c
+
+echo "Running benchmark 5 times"
+for i in {1..5}
+do
+ adb shell am instrument -e class 'android.database.NewDatabasePerformanceTestSuite' -w 'com.android.frameworks.coretests/android.support.test.runner.AndroidJUnitRunner'
+done
+
+adb logcat -d > /tmp/testlogcat.txt
+
+python frameworks/base/core/tests/coretests/src/android/database/process_newdb_perf_test_logs.py /tmp/testlogcat.txt
\ No newline at end of file
diff --git a/core/tests/coretests/src/android/database/sqlite/SQLiteConnectionPoolTest.java b/core/tests/coretests/src/android/database/sqlite/SQLiteConnectionPoolTest.java
new file mode 100644
index 0000000..ed14a53
--- /dev/null
+++ b/core/tests/coretests/src/android/database/sqlite/SQLiteConnectionPoolTest.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2017 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.database.sqlite;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import android.content.Context;
+import android.os.HandlerThread;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.util.Log;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.File;
+
+/**
+ * Tests for {@link SQLiteConnectionPool}
+ *
+ * <p>Run with: bit FrameworksCoreTests:android.database.sqlite.SQLiteConnectionPoolTest
+ */
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class SQLiteConnectionPoolTest {
+ private static final String TAG = "SQLiteConnectionPoolTest";
+
+ private Context mContext;
+ private File mTestDatabase;
+ private SQLiteDatabaseConfiguration mTestConf;
+
+
+ @Before
+ public void setup() {
+ mContext = InstrumentationRegistry.getContext();
+ SQLiteDatabase db = SQLiteDatabase
+ .openOrCreateDatabase(mContext.getDatabasePath("pool_test"), null);
+ mTestDatabase = new File(db.getPath());
+ Log.i(TAG, "setup: created " + mTestDatabase);
+ db.close();
+ mTestConf = new SQLiteDatabaseConfiguration(mTestDatabase.getPath(), 0);
+ }
+
+ @After
+ public void teardown() {
+ if (mTestDatabase != null) {
+ Log.i(TAG, "teardown: deleting " + mTestDatabase);
+ SQLiteDatabase.deleteDatabase(mTestDatabase);
+ }
+ }
+
+ @Test
+ public void testCloseIdleConnections() throws InterruptedException {
+ HandlerThread thread = new HandlerThread("test-close-idle-connections-thread");
+ Log.i(TAG, "Starting " + thread.getName());
+ thread.start();
+ SQLiteConnectionPool pool = SQLiteConnectionPool.open(mTestConf);
+ pool.setupIdleConnectionHandler(thread.getLooper(), 100);
+ SQLiteConnection c1 = pool.acquireConnection("pragma user_version", 0, null);
+ assertEquals("First connection should be returned", 0, c1.getConnectionId());
+ pool.releaseConnection(c1);
+ SQLiteConnection c2 = pool.acquireConnection("pragma user_version", 0, null);
+ assertTrue("Returned connection should be the same", c1 == c2);
+ pool.releaseConnection(c2);
+ Thread.sleep(200);
+ SQLiteConnection c3 = pool.acquireConnection("pragma user_version", 0, null);
+ assertTrue("New connection should be returned", c1 != c3);
+ assertEquals("New connection should be returned", 1, c3.getConnectionId());
+ pool.releaseConnection(c3);
+ pool.close();
+ thread.quit();
+ }
+}
diff --git a/core/tests/coretests/src/android/graphics/PaintTest.java b/core/tests/coretests/src/android/graphics/PaintTest.java
index 5811ca0..2f28606 100644
--- a/core/tests/coretests/src/android/graphics/PaintTest.java
+++ b/core/tests/coretests/src/android/graphics/PaintTest.java
@@ -16,6 +16,8 @@
package android.graphics;
+import static org.junit.Assert.assertNotEquals;
+
import android.graphics.Paint;
import android.test.InstrumentationTestCase;
import android.test.suitebuilder.annotation.SmallTest;
@@ -148,7 +150,10 @@
" U+" + Integer.toHexString(vs) + ")";
final String testString =
codePointsToString(new int[] {testCase.mBaseCodepoint, vs});
- if (testCase.mVariationSelectors.contains(vs)) {
+ if (vs == 0xFE0E // U+FE0E is the text presentation emoji. hasGlyph is expected to
+ // return true for that variation selector if the font has the base
+ // glyph.
+ || testCase.mVariationSelectors.contains(vs)) {
assertTrue(signature + " is expected to be true", p.hasGlyph(testString));
} else {
assertFalse(signature + " is expected to be false", p.hasGlyph(testString));
@@ -365,4 +370,31 @@
p.setWordSpacing(-2.0f);
assertEquals(-2.0f, p.getWordSpacing());
}
+
+ public void testGetUnderlinePositionAndThickness() {
+ final Typeface fontTypeface = Typeface.createFromAsset(
+ getInstrumentation().getContext().getAssets(), "fonts/underlineTestFont.ttf");
+ final Paint p = new Paint();
+ final int textSize = 100;
+ p.setTextSize(textSize);
+
+ final float origPosition = p.getUnderlinePosition();
+ final float origThickness = p.getUnderlineThickness();
+
+ p.setTypeface(fontTypeface);
+ assertNotEquals(origPosition, p.getUnderlinePosition());
+ assertNotEquals(origThickness, p.getUnderlineThickness());
+
+ // -200 (underlinePosition in 'post' table, negative means below the baseline)
+ // ÷ 1000 (unitsPerEm in 'head' table)
+ // × 100 (text size)
+ // × -1 (negated, since we consider below the baseline positive)
+ // = 20
+ assertEquals(20.0f, p.getUnderlinePosition(), 0.5f);
+ // 300 (underlineThickness in 'post' table)
+ // ÷ 1000 (unitsPerEm in 'head' table)
+ // × 100 (text size)
+ // = 30
+ assertEquals(30.0f, p.getUnderlineThickness(), 0.5f);
+ }
}
diff --git a/core/tests/coretests/src/android/graphics/TypefaceSystemFallbackTest.java b/core/tests/coretests/src/android/graphics/TypefaceSystemFallbackTest.java
new file mode 100644
index 0000000..ca4f7d4
--- /dev/null
+++ b/core/tests/coretests/src/android/graphics/TypefaceSystemFallbackTest.java
@@ -0,0 +1,469 @@
+/*
+ * Copyright (C) 2017 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.graphics;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import android.content.Context;
+import android.content.res.AssetManager;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.util.ArrayMap;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.nio.file.StandardCopyOption;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class TypefaceSystemFallbackTest {
+ private static final String SYSTEM_FONT_DIR = "/system/fonts/";
+ private static final String SYSTEM_FONTS_XML = "/system/etc/fonts.xml";
+
+ private static final String[] TEST_FONT_FILES = {
+ "a3em.ttf", // Supports "a","b","c". The width of "a" is 3em, others are 1em.
+ "b3em.ttf", // Supports "a","b","c". The width of "b" is 3em, others are 1em.
+ "c3em.ttf", // Supports "a","b","c". The width of "c" is 3em, others are 1em.
+ "all2em.ttf", // Supports "a,","b","c". All of them have the same width of 2em.
+ "no_coverage.ttf", // This font doesn't support any characters.
+ };
+ private static final String TEST_FONTS_XML;
+ private static final String TEST_FONT_DIR;
+
+ private static final float GLYPH_1EM_WIDTH;
+ private static final float GLYPH_2EM_WIDTH;
+ private static final float GLYPH_3EM_WIDTH;
+
+ static {
+ final Context targetCtx = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ final File cacheDir = new File(targetCtx.getCacheDir(), "TypefaceSystemFallbackTest");
+ if (!cacheDir.isDirectory()) {
+ cacheDir.mkdirs();
+ }
+ TEST_FONT_DIR = cacheDir.getAbsolutePath() + "/";
+ TEST_FONTS_XML = new File(cacheDir, "fonts.xml").getAbsolutePath();
+
+ final AssetManager am =
+ InstrumentationRegistry.getInstrumentation().getContext().getAssets();
+ final Paint paint = new Paint();
+ paint.setTypeface(new Typeface.Builder(am, "fonts/a3em.ttf").build());
+ GLYPH_3EM_WIDTH = paint.measureText("a");
+ GLYPH_1EM_WIDTH = paint.measureText("b");
+
+ paint.setTypeface(new Typeface.Builder(am, "fonts/all2em.ttf").build());
+ GLYPH_2EM_WIDTH = paint.measureText("a");
+ }
+
+ @Before
+ public void setUp() {
+ final AssetManager am =
+ InstrumentationRegistry.getInstrumentation().getContext().getAssets();
+ for (final String fontFile : TEST_FONT_FILES) {
+ final String sourceInAsset = "fonts/" + fontFile;
+ final File outInCache = new File(TEST_FONT_DIR, fontFile);
+ try (InputStream is = am.open(sourceInAsset)) {
+ Files.copy(is, outInCache.toPath(), StandardCopyOption.REPLACE_EXISTING);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ @After
+ public void tearDown() {
+ for (final String fontFile : TEST_FONT_FILES) {
+ final File outInCache = new File(TEST_FONT_DIR, fontFile);
+ outInCache.delete();
+ }
+ }
+
+ private static void buildSystemFallback(String xml,
+ ArrayMap<String, Typeface> fontMap, ArrayMap<String, FontFamily[]> fallbackMap) {
+ try (FileOutputStream fos = new FileOutputStream(TEST_FONTS_XML)) {
+ fos.write(xml.getBytes(Charset.forName("UTF-8")));
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ Typeface.buildSystemFallback(TEST_FONTS_XML, TEST_FONT_DIR, fontMap, fallbackMap);
+ }
+
+ @Test
+ public void testBuildSystemFallback() {
+ final ArrayMap<String, Typeface> fontMap = new ArrayMap<>();
+ final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>();
+
+ Typeface.buildSystemFallback(SYSTEM_FONTS_XML, SYSTEM_FONT_DIR, fontMap, fallbackMap);
+
+ assertFalse(fontMap.isEmpty());
+ assertFalse(fallbackMap.isEmpty());
+ }
+
+ @Test
+ public void testBuildSystemFallback_NonExistentFontShouldBeIgnored() {
+ final String xml = "<?xml version='1.0' encoding='UTF-8'?>"
+ + "<familyset version='22'>"
+ + " <family name='sans-serif'>"
+ + " <font weight='400' style='normal'>a3em.ttf</font>"
+ + " <font weight='400' style='normal'>NoSuchFont.ttf</font>"
+ + " </family>"
+ + " <family name='NoSuchFont'>"
+ + " <font weight='400' style='normal'>NoSuchFont.ttf</font>"
+ + " </family>"
+ + " <family>"
+ + " <font weight='400' style='normal'>NoSuchFont.ttf</font>"
+ + " </family>"
+ + "</familyset>";
+ final ArrayMap<String, Typeface> fontMap = new ArrayMap<>();
+ final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>();
+
+ buildSystemFallback(xml, fontMap, fallbackMap);
+
+ assertEquals(1, fontMap.size());
+ assertTrue(fontMap.containsKey("sans-serif"));
+ assertEquals(1, fallbackMap.size());
+ assertTrue(fallbackMap.containsKey("sans-serif"));
+ }
+
+ @Test
+ public void testBuildSystemFallback_NamedFamily() {
+ final String xml = "<?xml version='1.0' encoding='UTF-8'?>"
+ + "<familyset version='22'>"
+ + " <family name='sans-serif'>"
+ + " <font weight='400' style='normal'>a3em.ttf</font>"
+ + " </family>"
+ + " <family name='test'>"
+ + " <font weight='400' style='normal'>b3em.ttf</font>"
+ + " </family>"
+ + " <family name='test2'>"
+ + " <font weight='400' style='normal'>c3em.ttf</font>"
+ + " </family>"
+ + " <family>"
+ + " <font weight='400' style='normal'>all2em.ttf</font>"
+ + " </family>"
+ + "</familyset>";
+ final ArrayMap<String, Typeface> fontMap = new ArrayMap<>();
+ final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>();
+
+ buildSystemFallback(xml, fontMap, fallbackMap);
+
+ final Paint paint = new Paint();
+
+ final Typeface sansSerifTypeface = fontMap.get("sans-serif");
+ assertNotNull(sansSerifTypeface);
+ paint.setTypeface(sansSerifTypeface);
+ assertEquals(GLYPH_3EM_WIDTH, paint.measureText("a"), 0.0f);
+ assertEquals(GLYPH_1EM_WIDTH, paint.measureText("b"), 0.0f);
+ assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f);
+
+ final Typeface testTypeface = fontMap.get("test");
+ assertNotNull(testTypeface);
+ paint.setTypeface(testTypeface);
+ assertEquals(GLYPH_1EM_WIDTH, paint.measureText("a"), 0.0f);
+ assertEquals(GLYPH_3EM_WIDTH, paint.measureText("b"), 0.0f);
+ assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f);
+
+ final Typeface test2Typeface = fontMap.get("test2");
+ assertNotNull(test2Typeface);
+ paint.setTypeface(test2Typeface);
+ assertEquals(GLYPH_1EM_WIDTH, paint.measureText("a"), 0.0f);
+ assertEquals(GLYPH_1EM_WIDTH, paint.measureText("b"), 0.0f);
+ assertEquals(GLYPH_3EM_WIDTH, paint.measureText("c"), 0.0f);
+ }
+
+ @Test
+ public void testBuildSystemFallback_defaultFallback() {
+ final String xml = "<?xml version='1.0' encoding='UTF-8'?>"
+ + "<familyset version='22'>"
+ + " <family name='sans-serif'>"
+ + " <font weight='400' style='normal'>no_coverage.ttf</font>"
+ + " </family>"
+ + " <family name='test'>"
+ + " <font weight='400' style='normal'>no_coverage.ttf</font>"
+ + " </family>"
+ + " <family>"
+ + " <font weight='400' style='normal'>a3em.ttf</font>"
+ + " </family>"
+ + " <family>"
+ + " <font weight='400' style='normal'>all2em.ttf</font>"
+ + " </family>"
+ + "</familyset>";
+ final ArrayMap<String, Typeface> fontMap = new ArrayMap<>();
+ final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>();
+
+ buildSystemFallback(xml, fontMap, fallbackMap);
+
+ final Paint paint = new Paint();
+
+ final Typeface sansSerifTypeface = fontMap.get("sans-serif");
+ assertNotNull(sansSerifTypeface);
+ paint.setTypeface(sansSerifTypeface);
+ assertEquals(GLYPH_3EM_WIDTH, paint.measureText("a"), 0.0f);
+ assertEquals(GLYPH_1EM_WIDTH, paint.measureText("b"), 0.0f);
+ assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f);
+
+ final Typeface testTypeface = fontMap.get("test");
+ assertNotNull(testTypeface);
+ paint.setTypeface(testTypeface);
+ assertEquals(GLYPH_3EM_WIDTH, paint.measureText("a"), 0.0f);
+ assertEquals(GLYPH_1EM_WIDTH, paint.measureText("b"), 0.0f);
+ assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f);
+ }
+
+ @Test
+ public void testBuildSystemFallback_namedFallbackFamily() {
+ final String xml = "<?xml version='1.0' encoding='UTF-8'?>"
+ + "<familyset version='22'>"
+ + " <family name='sans-serif'>"
+ + " <font weight='400' style='normal'>no_coverage.ttf</font>"
+ + " </family>"
+ + " <family name='test'>"
+ + " <font weight='400' style='normal'>no_coverage.ttf</font>"
+ + " </family>"
+ + " <family name='test2'>"
+ + " <font weight='400' style='normal'>no_coverage.ttf</font>"
+ + " </family>"
+ + " <family>"
+ + " <font weight='400' style='normal' fallbackFor='test'>a3em.ttf</font>"
+ + " </family>"
+ + " <family>"
+ + " <font weight='400' style='normal' fallbackFor='test2'>b3em.ttf</font>"
+ + " </family>"
+ + " <family>"
+ + " <font weight='400' style='normal'>all2em.ttf</font>"
+ + " </family>"
+ + "</familyset>";
+ final ArrayMap<String, Typeface> fontMap = new ArrayMap<>();
+ final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>();
+
+ buildSystemFallback(xml, fontMap, fallbackMap);
+
+ final Paint paint = new Paint();
+
+ final Typeface sansSerifTypeface = fontMap.get("sans-serif");
+ assertNotNull(sansSerifTypeface);
+ paint.setTypeface(sansSerifTypeface);
+ assertEquals(GLYPH_2EM_WIDTH, paint.measureText("a"), 0.0f);
+ assertEquals(GLYPH_2EM_WIDTH, paint.measureText("b"), 0.0f);
+ assertEquals(GLYPH_2EM_WIDTH, paint.measureText("c"), 0.0f);
+
+ final Typeface testTypeface = fontMap.get("test");
+ assertNotNull(testTypeface);
+ paint.setTypeface(testTypeface);
+ assertEquals(GLYPH_3EM_WIDTH, paint.measureText("a"), 0.0f);
+ assertEquals(GLYPH_1EM_WIDTH, paint.measureText("b"), 0.0f);
+ assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f);
+
+ final Typeface test2Typeface = fontMap.get("test2");
+ assertNotNull(test2Typeface);
+ paint.setTypeface(test2Typeface);
+ assertEquals(GLYPH_1EM_WIDTH, paint.measureText("a"), 0.0f);
+ assertEquals(GLYPH_3EM_WIDTH, paint.measureText("b"), 0.0f);
+ assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f);
+ }
+
+ @Test
+ public void testBuildSystemFallback_namedFallbackFamily2() {
+ final String xml = "<?xml version='1.0' encoding='UTF-8'?>"
+ + "<familyset version='22'>"
+ + " <family name='sans-serif'>"
+ + " <font weight='400' style='normal'>no_coverage.ttf</font>"
+ + " </family>"
+ + " <family name='test'>"
+ + " <font weight='400' style='normal'>no_coverage.ttf</font>"
+ + " </family>"
+ + " <family name='test2'>"
+ + " <font weight='400' style='normal'>no_coverage.ttf</font>"
+ + " </family>"
+ + " <family>"
+ + " <font weight='400' style='normal' fallbackFor='test'>a3em.ttf</font>"
+ + " <font weight='400' style='normal'>b3em.ttf</font>"
+ + " </family>"
+ + " <family>"
+ + " <font weight='400' style='normal'>all2em.ttf</font>"
+ + " </family>"
+ + "</familyset>";
+ final ArrayMap<String, Typeface> fontMap = new ArrayMap<>();
+ final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>();
+
+ buildSystemFallback(xml, fontMap, fallbackMap);
+
+ final Paint paint = new Paint();
+
+ final Typeface sansSerifTypeface = fontMap.get("sans-serif");
+ assertNotNull(sansSerifTypeface);
+ paint.setTypeface(sansSerifTypeface);
+ assertEquals(GLYPH_1EM_WIDTH, paint.measureText("a"), 0.0f);
+ assertEquals(GLYPH_3EM_WIDTH, paint.measureText("b"), 0.0f);
+ assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f);
+
+ final Typeface testTypeface = fontMap.get("test");
+ assertNotNull(testTypeface);
+ paint.setTypeface(testTypeface);
+ assertEquals(GLYPH_3EM_WIDTH, paint.measureText("a"), 0.0f);
+ assertEquals(GLYPH_1EM_WIDTH, paint.measureText("b"), 0.0f);
+ assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f);
+
+ final Typeface test2Typeface = fontMap.get("test2");
+ assertNotNull(test2Typeface);
+ paint.setTypeface(test2Typeface);
+ assertEquals(GLYPH_1EM_WIDTH, paint.measureText("a"), 0.0f);
+ assertEquals(GLYPH_3EM_WIDTH, paint.measureText("b"), 0.0f);
+ assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f);
+ }
+
+ @Test
+ public void testBuildSystemFallback_ImplicitSansSerifFallback() {
+ final String xml = "<?xml version='1.0' encoding='UTF-8'?>"
+ + "<familyset version='22'>"
+ + " <family name='sans-serif'>"
+ + " <font weight='400' style='normal'>a3em.ttf</font>"
+ + " </family>"
+ + " <family name='test'>"
+ + " <font weight='400' style='normal'>no_coverage.ttf</font>"
+ + " </family>"
+ + " <family name='test2'>"
+ + " <font weight='400' style='normal'>no_coverage.ttf</font>"
+ + " </family>"
+ + " <family>"
+ + " <font weight='400' style='normal'>all2em.ttf</font>"
+ + " </family>"
+ + "</familyset>";
+ final ArrayMap<String, Typeface> fontMap = new ArrayMap<>();
+ final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>();
+
+ buildSystemFallback(xml, fontMap, fallbackMap);
+
+ final Paint paint = new Paint();
+
+ final Typeface testTypeface = fontMap.get("test");
+ assertNotNull(testTypeface);
+ paint.setTypeface(testTypeface);
+ assertEquals(GLYPH_3EM_WIDTH, paint.measureText("a"), 0.0f);
+ assertEquals(GLYPH_1EM_WIDTH, paint.measureText("b"), 0.0f);
+ assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f);
+
+ final Typeface test2Typeface = fontMap.get("test2");
+ assertNotNull(test2Typeface);
+ paint.setTypeface(test2Typeface);
+ assertEquals(GLYPH_3EM_WIDTH, paint.measureText("a"), 0.0f);
+ assertEquals(GLYPH_1EM_WIDTH, paint.measureText("b"), 0.0f);
+ assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f);
+ }
+
+ @Test
+ public void testBuildSystemFallback_ElegantFallback() {
+ final String xml = "<?xml version='1.0' encoding='UTF-8'?>"
+ + "<familyset version='22'>"
+ + " <family name='sans-serif'>"
+ + " <font weight='400' style='normal'>no_coverage.ttf</font>"
+ + " </family>"
+ + " <family name='serif'>"
+ + " <font weight='400' style='normal'>no_coverage.ttf</font>"
+ + " </family>"
+ + " <family variant='elegant'>"
+ + " <font weight='400' style='normal'>a3em.ttf</font>"
+ + " </family>"
+ + " <family variant='compact'>"
+ + " <font weight='400' style='normal'>b3em.ttf</font>"
+ + " </family>"
+ + "</familyset>";
+ final ArrayMap<String, Typeface> fontMap = new ArrayMap<>();
+ final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>();
+
+ buildSystemFallback(xml, fontMap, fallbackMap);
+
+ final Paint paint = new Paint();
+
+ final Typeface testTypeface = fontMap.get("serif");
+ assertNotNull(testTypeface);
+ paint.setTypeface(testTypeface);
+ paint.setElegantTextHeight(true);
+ assertEquals(GLYPH_3EM_WIDTH, paint.measureText("a"), 0.0f);
+ assertEquals(GLYPH_1EM_WIDTH, paint.measureText("b"), 0.0f);
+ assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f);
+
+ paint.setElegantTextHeight(false);
+ assertEquals(GLYPH_1EM_WIDTH, paint.measureText("a"), 0.0f);
+ assertEquals(GLYPH_3EM_WIDTH, paint.measureText("b"), 0.0f);
+ assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f);
+ }
+
+ @Test
+ public void testBuildSystemFallback_ElegantFallback_customFallback() {
+ final String xml = "<?xml version='1.0' encoding='UTF-8'?>"
+ + "<familyset version='22'>"
+ + " <family name='sans-serif'>"
+ + " <font weight='400' style='normal'>no_coverage.ttf</font>"
+ + " </family>"
+ + " <family name='serif'>"
+ + " <font weight='400' style='normal'>no_coverage.ttf</font>"
+ + " </family>"
+ + " <family variant='elegant'>"
+ + " <font weight='400' style='normal'>a3em.ttf</font>"
+ + " <font weight='400' style='normal' fallbackFor='serif'>b3em.ttf</font>"
+ + " </family>"
+ + " <family variant='compact'>"
+ + " <font weight='400' style='normal'>c3em.ttf</font>"
+ + " </family>"
+ + "</familyset>";
+ final ArrayMap<String, Typeface> fontMap = new ArrayMap<>();
+ final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>();
+
+ buildSystemFallback(xml, fontMap, fallbackMap);
+
+ final Paint paint = new Paint();
+
+ Typeface testTypeface = fontMap.get("serif");
+ assertNotNull(testTypeface);
+ paint.setTypeface(testTypeface);
+ paint.setElegantTextHeight(true);
+ assertEquals(GLYPH_1EM_WIDTH, paint.measureText("a"), 0.0f);
+ assertEquals(GLYPH_3EM_WIDTH, paint.measureText("b"), 0.0f);
+ assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f);
+
+ paint.setElegantTextHeight(false);
+ assertEquals(GLYPH_1EM_WIDTH, paint.measureText("a"), 0.0f);
+ assertEquals(GLYPH_1EM_WIDTH, paint.measureText("b"), 0.0f);
+ assertEquals(GLYPH_3EM_WIDTH, paint.measureText("c"), 0.0f);
+
+ testTypeface = fontMap.get("sans-serif");
+ assertNotNull(testTypeface);
+ paint.setTypeface(testTypeface);
+ paint.setElegantTextHeight(true);
+ assertEquals(GLYPH_3EM_WIDTH, paint.measureText("a"), 0.0f);
+ assertEquals(GLYPH_1EM_WIDTH, paint.measureText("b"), 0.0f);
+ assertEquals(GLYPH_1EM_WIDTH, paint.measureText("c"), 0.0f);
+
+ paint.setElegantTextHeight(false);
+ assertEquals(GLYPH_1EM_WIDTH, paint.measureText("a"), 0.0f);
+ assertEquals(GLYPH_1EM_WIDTH, paint.measureText("b"), 0.0f);
+ assertEquals(GLYPH_3EM_WIDTH, paint.measureText("c"), 0.0f);
+ }
+}
diff --git a/core/tests/coretests/src/android/net/SSLSessionCacheTest.java b/core/tests/coretests/src/android/net/SSLSessionCacheTest.java
index ec130e0..11d066b 100644
--- a/core/tests/coretests/src/android/net/SSLSessionCacheTest.java
+++ b/core/tests/coretests/src/android/net/SSLSessionCacheTest.java
@@ -44,12 +44,9 @@
try {
SSLSessionCache.install(new SSLSessionCache(mock), ctx);
- clientCtx.getSession("www.foogle.com", 443);
- Mockito.verify(mock).getSessionData(Mockito.anyString(), Mockito.anyInt());
} finally {
// Restore cacheless behaviour.
SSLSessionCache.install(null, ctx);
- clientCtx.getSession("www.foogle.com", 443);
Mockito.verifyNoMoreInteractions(mock);
}
}
diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
index a979ac8..e292c9d 100644
--- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java
+++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
@@ -26,6 +26,7 @@
import static java.lang.reflect.Modifier.isPublic;
import static java.lang.reflect.Modifier.isStatic;
+import android.platform.test.annotations.Presubmit;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
@@ -37,6 +38,7 @@
import java.util.Set;
/** Tests that ensure appropriate settings are backed up. */
+@Presubmit
@RunWith(AndroidJUnit4.class)
@SmallTest
public class SettingsBackupTest {
@@ -98,6 +100,7 @@
Settings.Global.ALLOW_USER_SWITCHING_WHEN_SYSTEM_USER_LOCKED,
Settings.Global.ALWAYS_FINISH_ACTIVITIES,
Settings.Global.ANIMATOR_DURATION_SCALE,
+ Settings.Global.ANOMALY_DETECTION_CONSTANTS,
Settings.Global.APN_DB_UPDATE_CONTENT_URL,
Settings.Global.APN_DB_UPDATE_METADATA_URL,
Settings.Global.APP_IDLE_CONSTANTS,
@@ -117,7 +120,6 @@
Settings.Global.BLUETOOTH_INTEROPERABILITY_LIST,
Settings.Global.BLUETOOTH_MAP_CLIENT_PRIORITY_PREFIX,
Settings.Global.BLUETOOTH_MAP_PRIORITY_PREFIX,
- Settings.Global.BLUETOOTH_ON, // Candidate for backup?
Settings.Global.BLUETOOTH_PAN_PRIORITY_PREFIX,
Settings.Global.BLUETOOTH_PBAP_CLIENT_PRIORITY_PREFIX,
Settings.Global.BLUETOOTH_SAP_PRIORITY_PREFIX,
@@ -156,6 +158,7 @@
Settings.Global.DEBUG_VIEW_ATTRIBUTES,
Settings.Global.DEFAULT_DNS_SERVER,
Settings.Global.DEFAULT_INSTALL_LOCATION,
+ Settings.Global.DEFAULT_RESTRICT_BACKGROUND_DATA,
Settings.Global.DESK_DOCK_SOUND,
Settings.Global.DESK_UNDOCK_SOUND,
Settings.Global.DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT,
@@ -166,6 +169,7 @@
Settings.Global.DEVICE_IDLE_CONSTANTS,
Settings.Global.DEVICE_IDLE_CONSTANTS_WATCH,
Settings.Global.BATTERY_SAVER_CONSTANTS,
+ Settings.Global.DEFAULT_SM_DP_PLUS,
Settings.Global.DEVICE_NAME,
Settings.Global.DEVICE_POLICY_CONSTANTS,
Settings.Global.DEVICE_PROVISIONED,
@@ -190,6 +194,7 @@
Settings.Global.ENABLE_ACCESSIBILITY_GLOBAL_GESTURE_ENABLED,
Settings.Global.ENABLE_CACHE_QUOTA_CALCULATION,
Settings.Global.ENABLE_CELLULAR_ON_BOOT,
+ Settings.Global.ENABLE_DELETION_HELPER_NO_THRESHOLD_TOGGLE,
Settings.Global.ENABLE_DISKSTATS_LOGGING,
Settings.Global.ENABLE_EPHEMERAL_FEATURE,
Settings.Global.ENHANCED_4G_MODE_ENABLED,
@@ -213,6 +218,7 @@
Settings.Global.HTTP_PROXY,
Settings.Global.INET_CONDITION_DEBOUNCE_DOWN_DELAY,
Settings.Global.INET_CONDITION_DEBOUNCE_UP_DELAY,
+ Settings.Global.INSTANT_APP_DEXOPT_ENABLED,
Settings.Global.INTENT_FIREWALL_UPDATE_CONTENT_URL,
Settings.Global.INTENT_FIREWALL_UPDATE_METADATA_URL,
Settings.Global.JOB_SCHEDULER_CONSTANTS,
@@ -331,6 +337,7 @@
Settings.Global.TCP_DEFAULT_INIT_RWND,
Settings.Global.TETHER_DUN_APN,
Settings.Global.TETHER_DUN_REQUIRED,
+ Settings.Global.TETHER_OFFLOAD_DISABLED,
Settings.Global.TETHER_SUPPORTED,
Settings.Global.THEATER_MODE_ON,
Settings.Global.TRANSITION_ANIMATION_SCALE,
@@ -432,6 +439,7 @@
Settings.Secure.DOZE_PULSE_ON_LONG_PRESS,
Settings.Secure.EMERGENCY_ASSISTANCE_APPLICATION,
Settings.Secure.ENABLED_NOTIFICATION_ASSISTANT,
+ Settings.Secure.ENABLED_NOTIFICATION_LISTENERS,
Settings.Secure.ENABLED_NOTIFICATION_POLICY_ACCESS_PACKAGES,
Settings.Secure.ENABLED_PRINT_SERVICES,
Settings.Secure.IMMERSIVE_MODE_CONFIRMATIONS,
@@ -486,6 +494,7 @@
Settings.Secure.TRUST_AGENTS_INITIALIZED,
Settings.Secure.TV_INPUT_CUSTOM_LABELS,
Settings.Secure.TV_INPUT_HIDDEN_INPUTS,
+ Settings.Secure.TV_USER_SETUP_COMPLETE,
Settings.Secure.UI_NIGHT_MODE, // candidate?
Settings.Secure.UNKNOWN_SOURCES_DEFAULT_REVERSED,
Settings.Secure.UNSAFE_VOLUME_MUSIC_ACTIVE_MS,
diff --git a/core/tests/coretests/src/android/text/StaticLayoutTest.java b/core/tests/coretests/src/android/text/StaticLayoutTest.java
index 74a6cc6..fb60e38 100644
--- a/core/tests/coretests/src/android/text/StaticLayoutTest.java
+++ b/core/tests/coretests/src/android/text/StaticLayoutTest.java
@@ -22,10 +22,12 @@
import static org.junit.Assert.assertTrue;
import android.graphics.Paint.FontMetricsInt;
+import android.os.LocaleList;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.text.Layout.Alignment;
import android.text.method.EditorState;
+import android.text.style.LocaleSpan;
import android.util.Log;
import org.junit.Before;
@@ -35,6 +37,7 @@
import java.text.Normalizer;
import java.util.ArrayList;
import java.util.List;
+import java.util.Locale;
/**
* Tests StaticLayout vertical metrics behavior.
@@ -671,4 +674,76 @@
assertEquals(testLabel, 4, layout.getOffsetToRightOf(5));
}
}
+
+ @Test
+ public void testLocaleSpanAffectsHyphenation() {
+ TextPaint paint = new TextPaint();
+ paint.setTextLocale(Locale.US);
+ // Private use language, with no hyphenation rules.
+ final Locale privateLocale = Locale.forLanguageTag("qaa");
+
+ final String longWord = "philanthropic";
+ final float wordWidth = paint.measureText(longWord);
+ // Wide enough that words get hyphenated by default.
+ final int paraWidth = Math.round(wordWidth * 1.8f);
+ final String sentence = longWord + " " + longWord + " " + longWord + " " + longWord + " "
+ + longWord + " " + longWord;
+
+ final int numEnglishLines = StaticLayout.Builder
+ .obtain(sentence, 0, sentence.length(), paint, paraWidth)
+ .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_FULL)
+ .setBreakStrategy(Layout.BREAK_STRATEGY_HIGH_QUALITY)
+ .build()
+ .getLineCount();
+
+ {
+ final SpannableString text = new SpannableString(sentence);
+ text.setSpan(new LocaleSpan(privateLocale), 0, text.length(),
+ Spanned.SPAN_INCLUSIVE_INCLUSIVE);
+ final int numPrivateLocaleLines = StaticLayout.Builder
+ .obtain(text, 0, text.length(), paint, paraWidth)
+ .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_FULL)
+ .setBreakStrategy(Layout.BREAK_STRATEGY_HIGH_QUALITY)
+ .build()
+ .getLineCount();
+
+ // Since the paragraph set to English gets hyphenated, the number of lines would be
+ // smaller than the number of lines when there is a span setting a language that
+ // doesn't get hyphenated.
+ assertTrue(numEnglishLines < numPrivateLocaleLines);
+ }
+ {
+ // Same as the above test, except that the locale span now uses a locale list starting
+ // with the private non-hyphenating locale.
+ final SpannableString text = new SpannableString(sentence);
+ final LocaleList locales = new LocaleList(privateLocale, Locale.US);
+ text.setSpan(new LocaleSpan(locales), 0, text.length(),
+ Spanned.SPAN_INCLUSIVE_INCLUSIVE);
+ final int numPrivateLocaleLines = StaticLayout.Builder
+ .obtain(text, 0, text.length(), paint, paraWidth)
+ .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_FULL)
+ .setBreakStrategy(Layout.BREAK_STRATEGY_HIGH_QUALITY)
+ .build()
+ .getLineCount();
+
+ assertTrue(numEnglishLines < numPrivateLocaleLines);
+ }
+ {
+ final SpannableString text = new SpannableString(sentence);
+ // Apply the private LocaleSpan only to the first word, which is not getting hyphenated
+ // anyway.
+ text.setSpan(new LocaleSpan(privateLocale), 0, longWord.length(),
+ Spanned.SPAN_INCLUSIVE_INCLUSIVE);
+ final int numPrivateLocaleLines = StaticLayout.Builder
+ .obtain(text, 0, text.length(), paint, paraWidth)
+ .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_FULL)
+ .setBreakStrategy(Layout.BREAK_STRATEGY_HIGH_QUALITY)
+ .build()
+ .getLineCount();
+
+ // Since the first word is not hyphenated anyway (there's enough width), the LocaleSpan
+ // should not affect the layout.
+ assertEquals(numEnglishLines, numPrivateLocaleLines);
+ }
+ }
}
diff --git a/core/tests/coretests/src/android/text/TextUtilsTest.java b/core/tests/coretests/src/android/text/TextUtilsTest.java
index 312c4fb..472b3e2 100644
--- a/core/tests/coretests/src/android/text/TextUtilsTest.java
+++ b/core/tests/coretests/src/android/text/TextUtilsTest.java
@@ -20,26 +20,28 @@
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
-import android.support.test.runner.AndroidJUnit4;
-import com.google.android.collect.Lists;
-
import android.os.Parcel;
import android.support.test.filters.LargeTest;
import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
import android.test.MoreAsserts;
import android.text.style.StyleSpan;
import android.text.util.Rfc822Token;
import android.text.util.Rfc822Tokenizer;
import android.view.View;
+import com.google.android.collect.Lists;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
-import org.junit.Test;
-import org.junit.runner.RunWith;
/**
* TextUtilsTest tests {@link TextUtils}.
@@ -361,14 +363,23 @@
@Test
public void testCharSequenceCreator() {
Parcel p = Parcel.obtain();
- TextUtils.writeToParcel(null, p, 0);
- CharSequence text = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(p);
- assertNull("null CharSequence should generate null from parcel", text);
+ CharSequence text;
+ try {
+ TextUtils.writeToParcel(null, p, 0);
+ text = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(p);
+ assertNull("null CharSequence should generate null from parcel", text);
+ } finally {
+ p.recycle();
+ }
p = Parcel.obtain();
- TextUtils.writeToParcel("test", p, 0);
- p.setDataPosition(0);
- text = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(p);
- assertEquals("conversion to/from parcel failed", "test", text);
+ try {
+ TextUtils.writeToParcel("test", p, 0);
+ p.setDataPosition(0);
+ text = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(p);
+ assertEquals("conversion to/from parcel failed", "test", text);
+ } finally {
+ p.recycle();
+ }
}
@Test
@@ -376,10 +387,14 @@
Parcel p;
CharSequence text;
p = Parcel.obtain();
- TextUtils.writeToParcel(null, p, 0);
- p.setDataPosition(0);
- text = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(p);
- assertNull("null CharSequence should generate null from parcel", text);
+ try {
+ TextUtils.writeToParcel(null, p, 0);
+ p.setDataPosition(0);
+ text = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(p);
+ assertNull("null CharSequence should generate null from parcel", text);
+ } finally {
+ p.recycle();
+ }
}
@Test
@@ -387,10 +402,14 @@
Parcel p;
CharSequence text;
p = Parcel.obtain();
- TextUtils.writeToParcel(new SpannableString("test"), p, 0);
- p.setDataPosition(0);
- text = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(p);
- assertEquals("conversion to/from parcel failed", "test", text.toString());
+ try {
+ TextUtils.writeToParcel(new SpannableString("test"), p, 0);
+ p.setDataPosition(0);
+ text = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(p);
+ assertEquals("conversion to/from parcel failed", "test", text.toString());
+ } finally {
+ p.recycle();
+ }
}
@Test
@@ -398,10 +417,14 @@
Parcel p;
CharSequence text;
p = Parcel.obtain();
- TextUtils.writeToParcel("test", p, 0);
- p.setDataPosition(0);
- text = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(p);
- assertEquals("conversion to/from parcel failed", "test", text.toString());
+ try {
+ TextUtils.writeToParcel("test", p, 0);
+ p.setDataPosition(0);
+ text = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(p);
+ assertEquals("conversion to/from parcel failed", "test", text.toString());
+ } finally {
+ p.recycle();
+ }
}
/**
@@ -580,4 +603,84 @@
assertEquals(View.LAYOUT_DIRECTION_RTL,
TextUtils.getLayoutDirectionFromLocale(Locale.forLanguageTag("tr-Arab")));
}
+
+ @Test
+ public void testToUpperCase() {
+ {
+ final CharSequence result = TextUtils.toUpperCase(null, "abc", false);
+ assertEquals(StringBuilder.class, result.getClass());
+ assertEquals("ABC", result.toString());
+ }
+ {
+ final SpannableString str = new SpannableString("abc");
+ Object span = new Object();
+ str.setSpan(span, 1, 2, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
+
+ final CharSequence result = TextUtils.toUpperCase(null, str, true /* copySpans */);
+ assertEquals(SpannableStringBuilder.class, result.getClass());
+ assertEquals("ABC", result.toString());
+ final Spanned spanned = (Spanned) result;
+ final Object[] resultSpans = spanned.getSpans(0, result.length(), Object.class);
+ assertEquals(1, resultSpans.length);
+ assertSame(span, resultSpans[0]);
+ assertEquals(1, spanned.getSpanStart(span));
+ assertEquals(2, spanned.getSpanEnd(span));
+ assertEquals(Spanned.SPAN_INCLUSIVE_INCLUSIVE, spanned.getSpanFlags(span));
+ }
+ {
+ final Locale turkish = new Locale("tr", "TR");
+ final CharSequence result = TextUtils.toUpperCase(turkish, "i", false);
+ assertEquals(StringBuilder.class, result.getClass());
+ assertEquals("İ", result.toString());
+ }
+ {
+ final String str = "ABC";
+ assertSame(str, TextUtils.toUpperCase(null, str, false));
+ }
+ {
+ final SpannableString str = new SpannableString("ABC");
+ str.setSpan(new Object(), 1, 2, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
+ assertSame(str, TextUtils.toUpperCase(null, str, true /* copySpans */));
+ }
+ }
+
+ // Copied from cts/tests/tests/widget/src/android/widget/cts/TextViewTest.java and modified
+ // for the TextUtils.toUpperCase method.
+ @Test
+ public void testToUpperCase_SpansArePreserved() {
+ final Locale greek = new Locale("el", "GR");
+ final String lowerString = "ι\u0301ριδα"; // ίριδα with first letter decomposed
+ final String upperString = "ΙΡΙΔΑ"; // uppercased
+ // expected lowercase to uppercase index map
+ final int[] indexMap = {0, 1, 1, 2, 3, 4, 5};
+ final int flags = Spanned.SPAN_INCLUSIVE_INCLUSIVE;
+
+ final Spannable source = new SpannableString(lowerString);
+ source.setSpan(new Object(), 0, 1, flags);
+ source.setSpan(new Object(), 1, 2, flags);
+ source.setSpan(new Object(), 2, 3, flags);
+ source.setSpan(new Object(), 3, 4, flags);
+ source.setSpan(new Object(), 4, 5, flags);
+ source.setSpan(new Object(), 5, 6, flags);
+ source.setSpan(new Object(), 0, 2, flags);
+ source.setSpan(new Object(), 1, 3, flags);
+ source.setSpan(new Object(), 2, 4, flags);
+ source.setSpan(new Object(), 0, 6, flags);
+ final Object[] sourceSpans = source.getSpans(0, source.length(), Object.class);
+
+ final CharSequence uppercase = TextUtils.toUpperCase(greek, source, true /* copySpans */);
+ assertEquals(SpannableStringBuilder.class, uppercase.getClass());
+ final Spanned result = (Spanned) uppercase;
+
+ assertEquals(upperString, result.toString());
+ final Object[] resultSpans = result.getSpans(0, result.length(), Object.class);
+ assertEquals(sourceSpans.length, resultSpans.length);
+ for (int i = 0; i < sourceSpans.length; i++) {
+ assertSame(sourceSpans[i], resultSpans[i]);
+ final Object span = sourceSpans[i];
+ assertEquals(indexMap[source.getSpanStart(span)], result.getSpanStart(span));
+ assertEquals(indexMap[source.getSpanEnd(span)], result.getSpanEnd(span));
+ assertEquals(source.getSpanFlags(span), result.getSpanFlags(span));
+ }
+ }
}
diff --git a/core/tests/coretests/src/android/text/format/FormatterTest.java b/core/tests/coretests/src/android/text/format/FormatterTest.java
index a4ce911..ff75c29 100644
--- a/core/tests/coretests/src/android/text/format/FormatterTest.java
+++ b/core/tests/coretests/src/android/text/format/FormatterTest.java
@@ -26,12 +26,13 @@
import android.support.test.runner.AndroidJUnit4;
import android.text.format.Formatter.BytesResult;
-import java.util.Locale;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.util.Locale;
+
@SmallTest
@RunWith(AndroidJUnit4.class)
public class FormatterTest {
@@ -54,7 +55,7 @@
@Test
public void testFormatBytes() {
- setLocale(Locale.ENGLISH);
+ setLocale(Locale.US);
checkFormatBytes(0, true, "0", 0);
checkFormatBytes(0, false, "0", 0);
@@ -99,6 +100,95 @@
checkFormatBytes(9123000, false, "9,12", 9120000);
}
+ private static final long SECOND = 1000;
+ private static final long MINUTE = 60 * SECOND;
+ private static final long HOUR = 60 * MINUTE;
+ private static final long DAY = 24 * HOUR;
+
+ @Test
+ public void testFormatShortElapsedTime() {
+ setLocale(Locale.US);
+ assertEquals("3 days", Formatter.formatShortElapsedTime(mContext, 2 * DAY + 12 * HOUR));
+ assertEquals("2 days", Formatter.formatShortElapsedTime(mContext, 2 * DAY + 11 * HOUR));
+ assertEquals("2 days", Formatter.formatShortElapsedTime(mContext, 2 * DAY));
+ assertEquals("1 day, 23 hr",
+ Formatter.formatShortElapsedTime(mContext, 1 * DAY + 23 * HOUR + 59 * MINUTE));
+ assertEquals("1 day, 0 hr",
+ Formatter.formatShortElapsedTime(mContext, 1 * DAY + 59 * MINUTE));
+ assertEquals("1 day, 0 hr", Formatter.formatShortElapsedTime(mContext, 1 * DAY));
+ assertEquals("24 hr", Formatter.formatShortElapsedTime(mContext, 23 * HOUR + 30 * MINUTE));
+ assertEquals("3 hr", Formatter.formatShortElapsedTime(mContext, 2 * HOUR + 30 * MINUTE));
+ assertEquals("2 hr", Formatter.formatShortElapsedTime(mContext, 2 * HOUR));
+ assertEquals("1 hr, 0 min", Formatter.formatShortElapsedTime(mContext, 1 * HOUR));
+ assertEquals("60 min",
+ Formatter.formatShortElapsedTime(mContext, 59 * MINUTE + 30 * SECOND));
+ assertEquals("59 min",
+ Formatter.formatShortElapsedTime(mContext, 59 * MINUTE));
+ assertEquals("3 min", Formatter.formatShortElapsedTime(mContext, 2 * MINUTE + 30 * SECOND));
+ assertEquals("2 min", Formatter.formatShortElapsedTime(mContext, 2 * MINUTE));
+ assertEquals("1 min, 59 sec",
+ Formatter.formatShortElapsedTime(mContext, 1 * MINUTE + 59 * SECOND + 999));
+ assertEquals("1 min, 0 sec", Formatter.formatShortElapsedTime(mContext, 1 * MINUTE));
+ assertEquals("59 sec", Formatter.formatShortElapsedTime(mContext, 59 * SECOND + 999));
+ assertEquals("1 sec", Formatter.formatShortElapsedTime(mContext, 1 * SECOND));
+ assertEquals("0 sec", Formatter.formatShortElapsedTime(mContext, 1));
+ assertEquals("0 sec", Formatter.formatShortElapsedTime(mContext, 0));
+
+ // Make sure it works on different locales.
+ setLocale(Locale.FRANCE);
+ assertEquals("2 j", Formatter.formatShortElapsedTime(mContext, 2 * DAY));
+ }
+
+ @Test
+ public void testFormatShortElapsedTimeRoundingUpToMinutes() {
+ setLocale(Locale.US);
+ assertEquals("3 days", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 2 * DAY + 12 * HOUR));
+ assertEquals("2 days", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 2 * DAY + 11 * HOUR));
+ assertEquals("2 days", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 2 * DAY));
+ assertEquals("1 day, 23 hr", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 1 * DAY + 23 * HOUR + 59 * MINUTE));
+ assertEquals("1 day, 0 hr", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 1 * DAY + 59 * MINUTE));
+ assertEquals("1 day, 0 hr", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 1 * DAY));
+ assertEquals("24 hr", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 23 * HOUR + 30 * MINUTE));
+ assertEquals("3 hr", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 2 * HOUR + 30 * MINUTE));
+ assertEquals("2 hr", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 2 * HOUR));
+ assertEquals("1 hr, 0 min", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 1 * HOUR));
+ assertEquals("1 hr, 0 min", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 59 * MINUTE + 30 * SECOND));
+ assertEquals("59 min", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 59 * MINUTE));
+ assertEquals("3 min", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 2 * MINUTE + 30 * SECOND));
+ assertEquals("2 min", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 2 * MINUTE));
+ assertEquals("2 min", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 1 * MINUTE + 59 * SECOND + 999));
+ assertEquals("1 min", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 1 * MINUTE));
+ assertEquals("1 min", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 59 * SECOND + 999));
+ assertEquals("1 min", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 1 * SECOND));
+ assertEquals("1 min", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 1));
+ assertEquals("0 min", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 0));
+
+ // Make sure it works on different locales.
+ setLocale(new Locale("ru", "RU"));
+ assertEquals("1 мин", Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, 1 * SECOND));
+ }
+
private void checkFormatBytes(long bytes, boolean useShort,
String expectedString, long expectedRounded) {
BytesResult r = Formatter.formatBytes(mContext.getResources(), bytes,
diff --git a/core/tests/coretests/src/android/text/util/LinkifyTest.java b/core/tests/coretests/src/android/text/util/LinkifyTest.java
index 73ff046..be3a0be 100644
--- a/core/tests/coretests/src/android/text/util/LinkifyTest.java
+++ b/core/tests/coretests/src/android/text/util/LinkifyTest.java
@@ -80,7 +80,7 @@
tv = new TextView(createUsEnglishContext());
tv.setAutoLinkMask(Linkify.ALL);
- tv.setText("Hey, foo@google.com, call 415-555-1212.");
+ tv.setText("Hey, foo@google.com, call +1-415-555-1212.");
assertTrue(tv.getMovementMethod() instanceof LinkMovementMethod);
assertTrue(tv.getUrls().length == 2);
@@ -93,7 +93,7 @@
tv = new TextView(createUsEnglishContext());
tv.setAutoLinkMask(Linkify.ALL);
tv.setLinksClickable(false);
- tv.setText("Hey, foo@google.com, call 415-555-1212.");
+ tv.setText("Hey, foo@google.com, call +1-415-555-1212.");
assertFalse(tv.getMovementMethod() instanceof LinkMovementMethod);
assertTrue(tv.getUrls().length == 2);
diff --git a/core/tests/coretests/src/android/util/RecurrenceRuleTest.java b/core/tests/coretests/src/android/util/RecurrenceRuleTest.java
new file mode 100644
index 0000000..42b6048
--- /dev/null
+++ b/core/tests/coretests/src/android/util/RecurrenceRuleTest.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 2017 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.util;
+
+import android.support.test.filters.SmallTest;
+
+import junit.framework.TestCase;
+
+import java.time.Clock;
+import java.time.Instant;
+import java.time.Period;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.util.Iterator;
+
+@SmallTest
+public class RecurrenceRuleTest extends TestCase {
+
+ static Clock sOriginalClock;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ sOriginalClock = RecurrenceRule.sClock;
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ RecurrenceRule.sClock = sOriginalClock;
+ }
+
+ private void setClock(Instant instant) {
+ RecurrenceRule.sClock = Clock.fixed(instant, ZoneId.systemDefault());
+ }
+
+ public void testSimpleMonth() throws Exception {
+ setClock(Instant.parse("2015-11-20T10:15:30.00Z"));
+ final RecurrenceRule r = new RecurrenceRule(
+ ZonedDateTime.parse("2010-11-14T00:00:00.000Z"),
+ null,
+ Period.ofMonths(1));
+
+ assertTrue(r.isMonthly());
+
+ final Iterator<Pair<ZonedDateTime, ZonedDateTime>> it = r.cycleIterator();
+ assertTrue(it.hasNext());
+ assertEquals(Pair.create(
+ ZonedDateTime.parse("2015-11-14T00:00:00.00Z"),
+ ZonedDateTime.parse("2015-12-14T00:00:00.00Z")), it.next());
+ assertTrue(it.hasNext());
+ assertEquals(Pair.create(
+ ZonedDateTime.parse("2015-10-14T00:00:00.00Z"),
+ ZonedDateTime.parse("2015-11-14T00:00:00.00Z")), it.next());
+ }
+
+ public void testSimpleDays() throws Exception {
+ setClock(Instant.parse("2015-01-01T10:15:30.00Z"));
+ final RecurrenceRule r = new RecurrenceRule(
+ ZonedDateTime.parse("2010-11-14T00:11:00.000Z"),
+ ZonedDateTime.parse("2010-11-20T00:11:00.000Z"),
+ Period.ofDays(3));
+
+ assertFalse(r.isMonthly());
+
+ final Iterator<Pair<ZonedDateTime, ZonedDateTime>> it = r.cycleIterator();
+ assertTrue(it.hasNext());
+ assertEquals(Pair.create(
+ ZonedDateTime.parse("2010-11-17T00:11:00.00Z"),
+ ZonedDateTime.parse("2010-11-20T00:11:00.00Z")), it.next());
+ assertTrue(it.hasNext());
+ assertEquals(Pair.create(
+ ZonedDateTime.parse("2010-11-14T00:11:00.00Z"),
+ ZonedDateTime.parse("2010-11-17T00:11:00.00Z")), it.next());
+ assertFalse(it.hasNext());
+ }
+
+ public void testNotRecurring() throws Exception {
+ setClock(Instant.parse("2015-01-01T10:15:30.00Z"));
+ final RecurrenceRule r = new RecurrenceRule(
+ ZonedDateTime.parse("2010-11-14T00:11:00.000Z"),
+ ZonedDateTime.parse("2010-11-20T00:11:00.000Z"),
+ null);
+
+ assertFalse(r.isMonthly());
+
+ final Iterator<Pair<ZonedDateTime, ZonedDateTime>> it = r.cycleIterator();
+ assertTrue(it.hasNext());
+ assertEquals(Pair.create(
+ ZonedDateTime.parse("2010-11-14T00:11:00.000Z"),
+ ZonedDateTime.parse("2010-11-20T00:11:00.000Z")), it.next());
+ assertFalse(it.hasNext());
+ }
+
+ public void testNever() throws Exception {
+ setClock(Instant.parse("2015-01-01T10:15:30.00Z"));
+ final RecurrenceRule r = RecurrenceRule.buildNever();
+
+ assertFalse(r.isMonthly());
+
+ final Iterator<Pair<ZonedDateTime, ZonedDateTime>> it = r.cycleIterator();
+ assertFalse(it.hasNext());
+ }
+
+ public void testSane() throws Exception {
+ final RecurrenceRule r = new RecurrenceRule(
+ ZonedDateTime.parse("1980-01-31T00:00:00.000Z"),
+ ZonedDateTime.parse("2030-01-31T00:00:00.000Z"),
+ Period.ofMonths(1));
+
+ final Iterator<Pair<ZonedDateTime, ZonedDateTime>> it = r.cycleIterator();
+ ZonedDateTime lastStart = null;
+ int months = 0;
+ while (it.hasNext()) {
+ final Pair<ZonedDateTime, ZonedDateTime> cycle = it.next();
+
+ // Make sure cycle has reasonable length
+ final long length = cycle.second.toEpochSecond() - cycle.first.toEpochSecond();
+ assertTrue(cycle + " must be more than 4 weeks", length >= 2419200);
+ assertTrue(cycle + " must be less than 5 weeks", length <= 3024000);
+
+ // Make sure we have no gaps
+ if (lastStart != null) {
+ assertEquals(lastStart, cycle.second);
+ }
+ lastStart = cycle.first;
+ months++;
+ }
+
+ assertEquals(600, months);
+ }
+}
diff --git a/core/tests/coretests/src/android/util/SparseLongArrayTest.java b/core/tests/coretests/src/android/util/SparseLongArrayTest.java
new file mode 100644
index 0000000..5a5e893
--- /dev/null
+++ b/core/tests/coretests/src/android/util/SparseLongArrayTest.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2007 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.util;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import android.support.annotation.NonNull;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Random;
+
+/**
+ * Internal tests for {@link SparseLongArray}.
+ */
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class SparseLongArrayTest {
+
+ private static final int TEST_SIZE = 1000;
+
+ private SparseLongArray mSparseLongArray;
+ private int[] mKeys;
+ private long[] mValues;
+ private Random mRandom;
+
+ private static boolean isSame(@NonNull SparseLongArray array1,
+ @NonNull SparseLongArray array2) {
+ if (array1.size() != array2.size()) {
+ return false;
+ }
+ for (int i = 0; i < array1.size(); i++) {
+ if (array1.keyAt(i) != array2.keyAt(i) || array1.valueAt(i) != array2.valueAt(i)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private void assertRemoved(int startIndex, int endIndex) {
+ for (int i = 0; i < TEST_SIZE; i++) {
+ if (i >= startIndex && i <= endIndex) {
+ assertEquals("Entry not removed", Long.MIN_VALUE,
+ mSparseLongArray.get(mKeys[i], Long.MIN_VALUE));
+ } else {
+ assertEquals("Untouched entry corrupted", mValues[i],
+ mSparseLongArray.get(mKeys[i]));
+ }
+ }
+ }
+
+ /**
+ * Generates a sorted array of distinct and random keys
+ *
+ * @param size the number of keys to return in the array. Should be < (2^31)/1000.
+ * @return the array of keys
+ */
+ private int[] generateRandomKeys(int size) {
+ final int[] keys = new int[size];
+ keys[0] = -1 * mRandom.nextInt(size * 500);
+ for (int i = 1; i < size; i++) {
+ keys[i] = keys[i - 1] + 1 + mRandom.nextInt(1000);
+ assertTrue(keys[i] > keys[i - 1]);
+ }
+ return keys;
+ }
+
+ @Before
+ public void setUp() {
+ mSparseLongArray = new SparseLongArray();
+ mRandom = new Random(12345);
+ mKeys = generateRandomKeys(TEST_SIZE);
+ mValues = new long[TEST_SIZE];
+ for (int i = 0; i < TEST_SIZE; i++) {
+ mValues[i] = i + 1;
+ mSparseLongArray.put(mKeys[i], mValues[i]);
+ }
+ }
+
+ @Test
+ public void testRemoveAtRange_removeHead() {
+ mSparseLongArray.removeAtRange(0, 100);
+ assertEquals(TEST_SIZE - 100, mSparseLongArray.size());
+ assertRemoved(0, 99);
+ }
+
+ @Test
+ public void testRemoveAtRange_removeTail() {
+ mSparseLongArray.removeAtRange(TEST_SIZE - 200, 200);
+ assertEquals(TEST_SIZE - 200, mSparseLongArray.size());
+ assertRemoved(TEST_SIZE - 200, TEST_SIZE - 1);
+ }
+
+ @Test
+ public void testRemoveAtRange_removeOverflow() {
+ mSparseLongArray.removeAtRange(TEST_SIZE - 100, 200);
+ assertEquals(TEST_SIZE - 100, mSparseLongArray.size());
+ assertRemoved(TEST_SIZE - 100, TEST_SIZE - 1);
+ }
+
+ @Test
+ public void testRemoveAtRange_removeEverything() {
+ mSparseLongArray.removeAtRange(0, TEST_SIZE);
+ assertEquals(0, mSparseLongArray.size());
+ assertRemoved(0, TEST_SIZE - 1);
+ }
+
+ @Test
+ public void testRemoveAtRange_removeMiddle() {
+ mSparseLongArray.removeAtRange(200, 200);
+ assertEquals(TEST_SIZE - 200, mSparseLongArray.size());
+ assertRemoved(200, 399);
+ }
+
+ @Test
+ public void testRemoveAtRange_removeSingle() {
+ mSparseLongArray.removeAtRange(300, 1);
+ assertEquals(TEST_SIZE - 1, mSparseLongArray.size());
+ assertRemoved(300, 300);
+ }
+
+ @Test
+ public void testRemoveAtRange_compareRemoveAt() {
+ final SparseLongArray sparseLongArray2 = mSparseLongArray.clone();
+ assertTrue(isSame(mSparseLongArray, sparseLongArray2));
+
+ final int startIndex = 101;
+ final int endIndex = 200;
+ mSparseLongArray.removeAtRange(startIndex, endIndex - startIndex + 1);
+ for (int i = endIndex; i >= startIndex; i--) {
+ sparseLongArray2.removeAt(i);
+ }
+ assertEquals(TEST_SIZE - (endIndex - startIndex + 1), mSparseLongArray.size());
+ assertRemoved(startIndex, endIndex);
+ assertTrue(isSame(sparseLongArray2, mSparseLongArray));
+ }
+}
diff --git a/core/tests/coretests/src/android/view/PinchZoomAction.java b/core/tests/coretests/src/android/view/PinchZoomAction.java
index 78a4b31..97fe980 100644
--- a/core/tests/coretests/src/android/view/PinchZoomAction.java
+++ b/core/tests/coretests/src/android/view/PinchZoomAction.java
@@ -16,23 +16,23 @@
package android.view;
-import static android.support.test.espresso.core.deps.guava.base.Preconditions.checkNotNull;
import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom;
import static android.support.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
import static org.hamcrest.Matchers.allOf;
import android.os.SystemClock;
import android.support.test.espresso.InjectEventSecurityException;
import android.support.test.espresso.PerformException;
-import android.support.test.espresso.ViewAction;
-import android.support.test.espresso.action.MotionEvents;
-import android.support.test.espresso.action.Swiper;
import android.support.test.espresso.UiController;
+import android.support.test.espresso.ViewAction;
+import android.support.test.espresso.action.Swiper;
import android.support.test.espresso.util.HumanReadables;
import android.view.MotionEvent;
import android.view.View;
-import android.view.ViewConfiguration;
-import javax.annotation.Nullable;
+
import org.hamcrest.Matcher;
/**
diff --git a/core/tests/coretests/src/android/widget/EditorCursorTest.java b/core/tests/coretests/src/android/widget/EditorCursorTest.java
index 6d650ff..9186827b 100644
--- a/core/tests/coretests/src/android/widget/EditorCursorTest.java
+++ b/core/tests/coretests/src/android/widget/EditorCursorTest.java
@@ -16,71 +16,68 @@
package android.widget;
-import android.test.ActivityInstrumentationTestCase2;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.view.Choreographer;
-import android.view.ViewGroup;
-
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.action.ViewActions.click;
import static android.widget.espresso.TextViewAssertions.hasInsertionPointerOnLeft;
import static android.widget.espresso.TextViewAssertions.hasInsertionPointerOnRight;
+
+import static junit.framework.Assert.fail;
+
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.isEmptyString;
import static org.hamcrest.Matchers.nullValue;
import static org.hamcrest.Matchers.sameInstance;
-public class EditorCursorTest extends ActivityInstrumentationTestCase2<TextViewActivity> {
+import android.app.Activity;
+import android.app.Instrumentation;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.MediumTest;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+import com.android.frameworks.coretests.R;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+@RunWith(AndroidJUnit4.class)
+@MediumTest
+public class EditorCursorTest {
private final static String LTR_STRING = "aaaaaaaaaaaaaaaaaaaaaa";
private final static String LTR_HINT = "hint";
private final static String RTL_STRING = "مرحبا الروبوت مرحبا الروبوت مرحبا الروبوت";
private final static String RTL_HINT = "الروبوت";
private final static int CURSOR_BLINK_MS = 500;
+ @Rule
+ public ActivityTestRule<TextViewActivity> mActivityRule = new ActivityTestRule<>(
+ TextViewActivity.class);
+
+ private Instrumentation mInstrumentation;
+ private Activity mActivity;
private EditText mEditText;
- public EditorCursorTest() {
- super(TextViewActivity.class);
- }
+ @Before
+ public void setUp() throws Throwable {
+ mActivity = mActivityRule.getActivity();
+ mInstrumentation = InstrumentationRegistry.getInstrumentation();
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- mEditText = new EditText(getActivity());
- mEditText.setTextSize(30);
- mEditText.setSingleLine(true);
- mEditText.setLines(1);
- mEditText.setPadding(15, 15, 15, 15);
- ViewGroup.LayoutParams editTextLayoutParams = new ViewGroup.LayoutParams(200,
- ViewGroup.LayoutParams.WRAP_CONTENT);
-
- mEditText.setLayoutParams(editTextLayoutParams);
-
- final FrameLayout layout = new FrameLayout(getActivity());
- ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.MATCH_PARENT);
- layout.setLayoutParams(layoutParams);
- layout.addView(mEditText);
-
- getActivity().runOnUiThread(new Runnable() {
- @Override
- public void run() {
- getActivity().setContentView(layout);
- }
+ mActivityRule.runOnUiThread(() -> {
+ mActivity.setContentView(R.layout.activity_editor_cursor_test);
+ mEditText = mActivity.findViewById(R.id.edittext);
});
- getInstrumentation().waitForIdleSync();
+ mInstrumentation.waitForIdleSync();
onView(sameInstance(mEditText)).perform(click());
}
- @SmallTest
- public void testCursorIsInViewBoundariesWhenOnRightForLtr() {
+ @Test
+ public void testCursorIsInViewBoundariesWhenOnRightForLtr() throws Throwable {
// Asserts that when an EditText has LTR text, and cursor is at the end (right),
// cursor is drawn to the right edge of the view
setEditTextText(LTR_STRING, LTR_STRING.length());
@@ -88,8 +85,8 @@
onView(sameInstance(mEditText)).check(hasInsertionPointerOnRight());
}
- @SmallTest
- public void testCursorIsInViewBoundariesWhenOnLeftForLtr() {
+ @Test
+ public void testCursorIsInViewBoundariesWhenOnLeftForLtr() throws Throwable {
// Asserts that when an EditText has LTR text, and cursor is at the beginning,
// cursor is drawn to the left edge of the view
setEditTextText(LTR_STRING, 0);
@@ -97,8 +94,8 @@
onView(sameInstance(mEditText)).check(hasInsertionPointerOnLeft());
}
- @SmallTest
- public void testCursorIsInViewBoundariesWhenOnRightForRtl() {
+ @Test
+ public void testCursorIsInViewBoundariesWhenOnRightForRtl() throws Throwable {
// Asserts that when an EditText has RTL text, and cursor is at the end,
// cursor is drawn to the left edge of the view
setEditTextText(RTL_STRING, 0);
@@ -106,8 +103,8 @@
onView(sameInstance(mEditText)).check(hasInsertionPointerOnRight());
}
- @SmallTest
- public void testCursorIsInViewBoundariesWhenOnLeftForRtl() {
+ @Test
+ public void testCursorIsInViewBoundariesWhenOnLeftForRtl() throws Throwable {
// Asserts that when an EditText has RTL text, and cursor is at the beginning,
// cursor is drawn to the right edge of the view
setEditTextText(RTL_STRING, RTL_STRING.length());
@@ -116,8 +113,8 @@
}
/* Tests for cursor positioning with hint */
- @SmallTest
- public void testCursorIsOnLeft_withFirstStrongLtrAlgorithm() {
+ @Test
+ public void testCursorIsOnLeft_withFirstStrongLtrAlgorithm() throws Throwable {
setEditTextHint(null, TextView.TEXT_DIRECTION_FIRST_STRONG_LTR, 0);
assertThat(mEditText.getText().toString(), isEmptyString());
assertThat(mEditText.getHint(), nullValue());
@@ -135,8 +132,8 @@
onView(sameInstance(mEditText)).check(hasInsertionPointerOnLeft());
}
- @SmallTest
- public void testCursorIsOnRight_withFirstStrongRtlAlgorithm() {
+ @Test
+ public void testCursorIsOnRight_withFirstStrongRtlAlgorithm() throws Throwable {
setEditTextHint(null, TextView.TEXT_DIRECTION_FIRST_STRONG_RTL, 0);
assertThat(mEditText.getText().toString(), isEmptyString());
assertThat(mEditText.getHint(), nullValue());
@@ -154,8 +151,8 @@
onView(sameInstance(mEditText)).check(hasInsertionPointerOnRight());
}
- @SmallTest
- public void testCursorIsOnLeft_withLtrAlgorithm() {
+ @Test
+ public void testCursorIsOnLeft_withLtrAlgorithm() throws Throwable {
setEditTextHint(null, TextView.TEXT_DIRECTION_LTR, 0);
assertThat(mEditText.getText().toString(), isEmptyString());
assertThat(mEditText.getHint(), nullValue());
@@ -173,8 +170,8 @@
onView(sameInstance(mEditText)).check(hasInsertionPointerOnLeft());
}
- @SmallTest
- public void testCursorIsOnRight_withRtlAlgorithm() {
+ @Test
+ public void testCursorIsOnRight_withRtlAlgorithm() throws Throwable {
setEditTextHint(null, TextView.TEXT_DIRECTION_RTL, 0);
assertThat(mEditText.getText().toString(), isEmptyString());
assertThat(mEditText.getHint(), nullValue());
@@ -193,27 +190,19 @@
}
private void setEditTextProperties(final String text, final String hint,
- final Integer textDirection, final Integer selection) {
- getActivity().runOnUiThread(new Runnable() {
- @Override
- public void run() {
- if (textDirection != null) mEditText.setTextDirection(textDirection);
- if (text != null) mEditText.setText(text);
- if (hint != null) mEditText.setHint(hint);
- if (selection != null) mEditText.setSelection(selection);
- }
+ final Integer textDirection, final Integer selection) throws Throwable {
+ mActivityRule.runOnUiThread(() -> {
+ if (textDirection != null) mEditText.setTextDirection(textDirection);
+ if (text != null) mEditText.setText(text);
+ if (hint != null) mEditText.setHint(hint);
+ if (selection != null) mEditText.setSelection(selection);
});
- getInstrumentation().waitForIdleSync();
+ mInstrumentation.waitForIdleSync();
// wait for cursor to be drawn. updateCursorPositions function is called during draw() and
// only when cursor is visible during blink.
final CountDownLatch latch = new CountDownLatch(1);
- mEditText.postOnAnimationDelayed(new Runnable() {
- @Override
- public void run() {
- latch.countDown();
- }
- }, CURSOR_BLINK_MS);
+ mEditText.postOnAnimationDelayed(latch::countDown, CURSOR_BLINK_MS);
try {
assertThat("Problem while waiting for the cursor to blink",
latch.await(10, TimeUnit.SECONDS), equalTo(true));
@@ -222,11 +211,12 @@
}
}
- private void setEditTextHint(final String hint, final int textDirection, final int selection) {
+ private void setEditTextHint(final String hint, final int textDirection, final int selection)
+ throws Throwable {
setEditTextProperties(null, hint, textDirection, selection);
}
- private void setEditTextText(final String text, final Integer selection) {
+ private void setEditTextText(final String text, final Integer selection) throws Throwable {
setEditTextProperties(text, null, null, selection);
}
}
diff --git a/core/tests/coretests/src/android/widget/TextViewActivityMouseTest.java b/core/tests/coretests/src/android/widget/TextViewActivityMouseTest.java
index edb749b95..9124c94 100644
--- a/core/tests/coretests/src/android/widget/TextViewActivityMouseTest.java
+++ b/core/tests/coretests/src/android/widget/TextViewActivityMouseTest.java
@@ -17,58 +17,71 @@
package android.widget;
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.Espresso.pressBack;
+import static android.support.test.espresso.action.ViewActions.replaceText;
+import static android.support.test.espresso.action.ViewActions.typeText;
+import static android.support.test.espresso.assertion.ViewAssertions.matches;
+import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
+import static android.support.test.espresso.matcher.ViewMatchers.withId;
+import static android.support.test.espresso.matcher.ViewMatchers.withText;
import static android.widget.espresso.ContextMenuUtils.assertContextMenuContainsItemDisabled;
import static android.widget.espresso.ContextMenuUtils.assertContextMenuContainsItemEnabled;
import static android.widget.espresso.ContextMenuUtils.assertContextMenuIsNotDisplayed;
import static android.widget.espresso.DragHandleUtils.assertNoSelectionHandles;
import static android.widget.espresso.DragHandleUtils.onHandleView;
+import static android.widget.espresso.TextViewActions.mouseClick;
import static android.widget.espresso.TextViewActions.mouseClickOnTextAtIndex;
-import static android.widget.espresso.TextViewActions.mouseDoubleClickOnTextAtIndex;
-import static android.widget.espresso.TextViewActions.mouseLongClickOnTextAtIndex;
import static android.widget.espresso.TextViewActions.mouseDoubleClickAndDragOnText;
+import static android.widget.espresso.TextViewActions.mouseDoubleClickOnTextAtIndex;
import static android.widget.espresso.TextViewActions.mouseDragOnText;
import static android.widget.espresso.TextViewActions.mouseLongClickAndDragOnText;
+import static android.widget.espresso.TextViewActions.mouseLongClickOnTextAtIndex;
import static android.widget.espresso.TextViewActions.mouseTripleClickAndDragOnText;
import static android.widget.espresso.TextViewActions.mouseTripleClickOnTextAtIndex;
import static android.widget.espresso.TextViewAssertions.hasInsertionPointerAtIndex;
import static android.widget.espresso.TextViewAssertions.hasSelection;
-import static android.support.test.espresso.Espresso.onView;
-import static android.support.test.espresso.Espresso.pressBack;
-import static android.support.test.espresso.action.ViewActions.click;
-import static android.support.test.espresso.action.ViewActions.replaceText;
-import static android.support.test.espresso.action.ViewActions.typeTextIntoFocusedView;
-import static android.support.test.espresso.assertion.ViewAssertions.matches;
-import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
-import static android.support.test.espresso.matcher.ViewMatchers.withId;
-import static android.support.test.espresso.matcher.ViewMatchers.withText;
+import android.app.Activity;
+import android.support.test.filters.MediumTest;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+import android.view.MotionEvent;
+import android.view.textclassifier.TextClassificationManager;
+import android.view.textclassifier.TextClassifier;
import com.android.frameworks.coretests.R;
-import android.test.ActivityInstrumentationTestCase2;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.view.MotionEvent;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
/**
* Tests mouse interaction of the TextView widget from an Activity
*/
-public class TextViewActivityMouseTest extends ActivityInstrumentationTestCase2<TextViewActivity>{
+@RunWith(AndroidJUnit4.class)
+@MediumTest
+public class TextViewActivityMouseTest {
- public TextViewActivityMouseTest() {
- super(TextViewActivity.class);
+ @Rule
+ public ActivityTestRule<TextViewActivity> mActivityRule = new ActivityTestRule<>(
+ TextViewActivity.class);
+
+ private Activity mActivity;
+
+ @Before
+ public void setUp() {
+ mActivity = mActivityRule.getActivity();
+ mActivity.getSystemService(TextClassificationManager.class)
+ .setTextClassifier(TextClassifier.NO_OP);
}
- @Override
- public void setUp() throws Exception {
- super.setUp();
- getActivity();
- }
-
- @SmallTest
- public void testSelectTextByDrag() throws Exception {
+ @Test
+ public void testSelectTextByDrag() {
final String helloWorld = "Hello world!";
- onView(withId(R.id.textview)).perform(click());
- onView(withId(R.id.textview)).perform(typeTextIntoFocusedView(helloWorld));
+ onView(withId(R.id.textview)).perform(mouseClick());
+ onView(withId(R.id.textview)).perform(replaceText(helloWorld));
assertNoSelectionHandles();
@@ -88,22 +101,22 @@
assertNoSelectionHandles();
}
- @SmallTest
- public void testSelectTextByDrag_reverse() throws Exception {
+ @Test
+ public void testSelectTextByDrag_reverse() {
final String helloWorld = "Hello world!";
- onView(withId(R.id.textview)).perform(click());
- onView(withId(R.id.textview)).perform(typeTextIntoFocusedView(helloWorld));
+ onView(withId(R.id.textview)).perform(mouseClick());
+ onView(withId(R.id.textview)).perform(replaceText(helloWorld));
onView(withId(R.id.textview)).perform(
mouseDragOnText( helloWorld.indexOf("ld!"), helloWorld.indexOf("llo")));
onView(withId(R.id.textview)).check(hasSelection("llo wor"));
}
- @SmallTest
- public void testContextMenu() throws Exception {
+ @Test
+ public void testContextMenu() {
final String text = "abc def ghi.";
- onView(withId(R.id.textview)).perform(click());
- onView(withId(R.id.textview)).perform(typeTextIntoFocusedView(text));
+ onView(withId(R.id.textview)).perform(mouseClick());
+ onView(withId(R.id.textview)).perform(replaceText(text));
assertContextMenuIsNotDisplayed();
@@ -111,9 +124,26 @@
mouseClickOnTextAtIndex(text.indexOf("d"), MotionEvent.BUTTON_SECONDARY));
assertContextMenuContainsItemDisabled(
- getActivity().getString(com.android.internal.R.string.copy));
+ mActivity.getString(com.android.internal.R.string.copy));
+ assertContextMenuContainsItemDisabled(
+ mActivity.getString(com.android.internal.R.string.undo));
+
+ // Hide context menu.
+ pressBack();
+ assertContextMenuIsNotDisplayed();
+
+ // type something to enable Undo
+ onView(withId(R.id.textview)).perform(
+ mouseClickOnTextAtIndex(text.indexOf(".")));
+ onView(withId(R.id.textview)).perform(typeText(" "));
+
+ onView(withId(R.id.textview)).perform(
+ mouseClickOnTextAtIndex(text.indexOf("d"), MotionEvent.BUTTON_SECONDARY));
+
+ assertContextMenuContainsItemDisabled(
+ mActivity.getString(com.android.internal.R.string.copy));
assertContextMenuContainsItemEnabled(
- getActivity().getString(com.android.internal.R.string.undo));
+ mActivity.getString(com.android.internal.R.string.undo));
// Hide context menu.
pressBack();
@@ -125,9 +155,9 @@
mouseClickOnTextAtIndex(text.indexOf("d"), MotionEvent.BUTTON_SECONDARY));
assertContextMenuContainsItemEnabled(
- getActivity().getString(com.android.internal.R.string.copy));
+ mActivity.getString(com.android.internal.R.string.copy));
assertContextMenuContainsItemEnabled(
- getActivity().getString(com.android.internal.R.string.undo));
+ mActivity.getString(com.android.internal.R.string.undo));
// Hide context menu.
pressBack();
@@ -137,9 +167,9 @@
onView(withId(R.id.textview)).perform(
mouseClickOnTextAtIndex(text.indexOf("i"), MotionEvent.BUTTON_SECONDARY));
assertContextMenuContainsItemDisabled(
- getActivity().getString(com.android.internal.R.string.copy));
+ mActivity.getString(com.android.internal.R.string.copy));
assertContextMenuContainsItemEnabled(
- getActivity().getString(com.android.internal.R.string.undo));
+ mActivity.getString(com.android.internal.R.string.undo));
// Hide context menu.
pressBack();
@@ -150,11 +180,11 @@
// TODO: Add tests for suggestions
}
- @SmallTest
- public void testDragAndDrop() throws Exception {
+ @Test
+ public void testDragAndDrop() {
final String text = "abc def ghi.";
- onView(withId(R.id.textview)).perform(click());
- onView(withId(R.id.textview)).perform(typeTextIntoFocusedView(text));
+ onView(withId(R.id.textview)).perform(mouseClick());
+ onView(withId(R.id.textview)).perform(replaceText(text));
onView(withId(R.id.textview)).perform(
mouseDragOnText(text.indexOf("d"), text.indexOf("f") + 1));
@@ -167,11 +197,11 @@
onView(withId(R.id.textview)).check(hasInsertionPointerAtIndex("abc ghi.def".length()));
}
- @SmallTest
- public void testDragAndDrop_longClick() throws Exception {
+ @Test
+ public void testDragAndDrop_longClick() {
final String text = "abc def ghi.";
- onView(withId(R.id.textview)).perform(click());
- onView(withId(R.id.textview)).perform(typeTextIntoFocusedView(text));
+ onView(withId(R.id.textview)).perform(mouseClick());
+ onView(withId(R.id.textview)).perform(replaceText(text));
onView(withId(R.id.textview)).perform(
mouseDragOnText(text.indexOf("d"), text.indexOf("f") + 1));
@@ -184,11 +214,11 @@
onView(withId(R.id.textview)).check(hasInsertionPointerAtIndex("abc ghi.def".length()));
}
- @SmallTest
- public void testSelectTextByLongClick() throws Exception {
+ @Test
+ public void testSelectTextByLongClick() {
final String helloWorld = "Hello world!";
- onView(withId(R.id.textview)).perform(click());
- onView(withId(R.id.textview)).perform(typeTextIntoFocusedView(helloWorld));
+ onView(withId(R.id.textview)).perform(mouseClick());
+ onView(withId(R.id.textview)).perform(replaceText(helloWorld));
onView(withId(R.id.textview)).perform(mouseLongClickOnTextAtIndex(0));
onView(withId(R.id.textview)).check(hasSelection("Hello"));
@@ -209,14 +239,15 @@
onView(withId(R.id.textview)).check(hasSelection("!"));
}
- @SmallTest
- public void testSelectTextByDoubleClick() throws Exception {
- final String helloWorld = "Hello world!";
- onView(withId(R.id.textview)).perform(click());
- onView(withId(R.id.textview)).perform(typeTextIntoFocusedView(helloWorld));
+ @Test
+ public void testSelectTextByDoubleClick() {
+ final String helloWorld = "hello world!";
- onView(withId(R.id.textview)).perform(mouseDoubleClickOnTextAtIndex(0));
- onView(withId(R.id.textview)).check(hasSelection("Hello"));
+ onView(withId(R.id.textview)).perform(mouseClick());
+ onView(withId(R.id.textview)).perform(replaceText(helloWorld));
+
+ onView(withId(R.id.textview)).perform(mouseDoubleClickOnTextAtIndex(1));
+ onView(withId(R.id.textview)).check(hasSelection("hello"));
onView(withId(R.id.textview)).perform(mouseDoubleClickOnTextAtIndex(
helloWorld.indexOf("world")));
@@ -224,7 +255,7 @@
onView(withId(R.id.textview)).perform(mouseDoubleClickOnTextAtIndex(
helloWorld.indexOf("llo")));
- onView(withId(R.id.textview)).check(hasSelection("Hello"));
+ onView(withId(R.id.textview)).check(hasSelection("hello"));
onView(withId(R.id.textview)).perform(mouseDoubleClickOnTextAtIndex(
helloWorld.indexOf("rld")));
@@ -234,52 +265,52 @@
onView(withId(R.id.textview)).check(hasSelection("!"));
}
- @SmallTest
- public void testSelectTextByDoubleClickAndDrag() throws Exception {
+ @Test
+ public void testSelectTextByDoubleClickAndDrag() {
final String text = "abcd efg hijk lmn";
- onView(withId(R.id.textview)).perform(click());
- onView(withId(R.id.textview)).perform(typeTextIntoFocusedView(text));
+ onView(withId(R.id.textview)).perform(mouseClick());
+ onView(withId(R.id.textview)).perform(replaceText(text));
onView(withId(R.id.textview)).perform(
mouseDoubleClickAndDragOnText(text.indexOf("f"), text.indexOf("j")));
onView(withId(R.id.textview)).check(hasSelection("efg hijk"));
}
- @SmallTest
- public void testSelectTextByDoubleClickAndDrag_reverse() throws Exception {
+ @Test
+ public void testSelectTextByDoubleClickAndDrag_reverse() {
final String text = "abcd efg hijk lmn";
- onView(withId(R.id.textview)).perform(click());
- onView(withId(R.id.textview)).perform(typeTextIntoFocusedView(text));
+ onView(withId(R.id.textview)).perform(mouseClick());
+ onView(withId(R.id.textview)).perform(replaceText(text));
onView(withId(R.id.textview)).perform(
mouseDoubleClickAndDragOnText(text.indexOf("j"), text.indexOf("f")));
onView(withId(R.id.textview)).check(hasSelection("efg hijk"));
}
- @SmallTest
- public void testSelectTextByLongPressAndDrag() throws Exception {
+ @Test
+ public void testSelectTextByLongPressAndDrag() {
final String text = "abcd efg hijk lmn";
- onView(withId(R.id.textview)).perform(click());
- onView(withId(R.id.textview)).perform(typeTextIntoFocusedView(text));
+ onView(withId(R.id.textview)).perform(mouseClick());
+ onView(withId(R.id.textview)).perform(replaceText(text));
onView(withId(R.id.textview)).perform(
mouseLongClickAndDragOnText(text.indexOf("f"), text.indexOf("j")));
onView(withId(R.id.textview)).check(hasSelection("efg hijk"));
}
- @SmallTest
- public void testSelectTextByLongPressAndDrag_reverse() throws Exception {
+ @Test
+ public void testSelectTextByLongPressAndDrag_reverse() {
final String text = "abcd efg hijk lmn";
- onView(withId(R.id.textview)).perform(click());
- onView(withId(R.id.textview)).perform(typeTextIntoFocusedView(text));
+ onView(withId(R.id.textview)).perform(mouseClick());
+ onView(withId(R.id.textview)).perform(replaceText(text));
onView(withId(R.id.textview)).perform(
mouseLongClickAndDragOnText(text.indexOf("j"), text.indexOf("f")));
onView(withId(R.id.textview)).check(hasSelection("efg hijk"));
}
- @SmallTest
- public void testSelectTextByTripleClick() throws Exception {
+ @Test
+ public void testSelectTextByTripleClick() {
final StringBuilder builder = new StringBuilder();
builder.append("First paragraph.\n");
builder.append("Second paragraph.");
@@ -290,7 +321,7 @@
builder.append("Third paragraph.");
final String text = builder.toString();
- onView(withId(R.id.textview)).perform(click());
+ onView(withId(R.id.textview)).perform(mouseClick());
onView(withId(R.id.textview)).perform(replaceText(text));
onView(withId(R.id.textview)).perform(
@@ -312,8 +343,8 @@
text.substring(text.indexOf("Second"), text.indexOf("Third"))));
}
- @SmallTest
- public void testSelectTextByTripleClickAndDrag() throws Exception {
+ @Test
+ public void testSelectTextByTripleClickAndDrag() {
final StringBuilder builder = new StringBuilder();
builder.append("First paragraph.\n");
builder.append("Second paragraph.");
@@ -324,7 +355,7 @@
builder.append("Third paragraph.");
final String text = builder.toString();
- onView(withId(R.id.textview)).perform(click());
+ onView(withId(R.id.textview)).perform(mouseClick());
onView(withId(R.id.textview)).perform(replaceText(text));
onView(withId(R.id.textview)).perform(
@@ -341,8 +372,8 @@
onView(withId(R.id.textview)).check(hasSelection(text));
}
- @SmallTest
- public void testSelectTextByTripleClickAndDrag_reverse() throws Exception {
+ @Test
+ public void testSelectTextByTripleClickAndDrag_reverse() {
final StringBuilder builder = new StringBuilder();
builder.append("First paragraph.\n");
builder.append("Second paragraph.");
@@ -353,7 +384,7 @@
builder.append("Third paragraph.");
final String text = builder.toString();
- onView(withId(R.id.textview)).perform(click());
+ onView(withId(R.id.textview)).perform(mouseClick());
onView(withId(R.id.textview)).perform(replaceText(text));
onView(withId(R.id.textview)).perform(
diff --git a/core/tests/coretests/src/android/widget/TextViewActivityTest.java b/core/tests/coretests/src/android/widget/TextViewActivityTest.java
index 5a7bca4..56c72d2 100644
--- a/core/tests/coretests/src/android/widget/TextViewActivityTest.java
+++ b/core/tests/coretests/src/android/widget/TextViewActivityTest.java
@@ -16,26 +16,6 @@
package android.widget;
-import static android.widget.espresso.CustomViewActions.longPressAtRelativeCoordinates;
-import static android.widget.espresso.DragHandleUtils.assertNoSelectionHandles;
-import static android.widget.espresso.DragHandleUtils.onHandleView;
-import static android.widget.espresso.TextViewActions.clickOnTextAtIndex;
-import static android.widget.espresso.TextViewActions.doubleTapAndDragOnText;
-import static android.widget.espresso.TextViewActions.doubleClickOnTextAtIndex;
-import static android.widget.espresso.TextViewActions.dragHandle;
-import static android.widget.espresso.TextViewActions.Handle;
-import static android.widget.espresso.TextViewActions.longPressAndDragOnText;
-import static android.widget.espresso.TextViewActions.longPressOnTextAtIndex;
-import static android.widget.espresso.TextViewAssertions.hasInsertionPointerAtIndex;
-import static android.widget.espresso.TextViewAssertions.hasSelection;
-import static android.widget.espresso.TextViewAssertions.doesNotHaveStyledText;
-import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarItemIndex;
-import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarIsDisplayed;
-import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarIsNotDisplayed;
-import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarContainsItem;
-import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarDoesNotContainItem;
-import static android.widget.espresso.FloatingToolbarEspressoUtils.clickFloatingToolbarItem;
-import static android.widget.espresso.FloatingToolbarEspressoUtils.sleepForFloatingToolbarPopup;
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.action.ViewActions.click;
import static android.support.test.espresso.action.ViewActions.longClick;
@@ -45,48 +25,84 @@
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
+import static android.widget.espresso.CustomViewActions.longPressAtRelativeCoordinates;
+import static android.widget.espresso.DragHandleUtils.assertNoSelectionHandles;
+import static android.widget.espresso.DragHandleUtils.onHandleView;
+import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarContainsItem;
+import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarDoesNotContainItem;
+import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarIsDisplayed;
+import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarIsNotDisplayed;
+import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarItemIndex;
+import static android.widget.espresso.FloatingToolbarEspressoUtils.clickFloatingToolbarItem;
+import static android.widget.espresso.FloatingToolbarEspressoUtils.sleepForFloatingToolbarPopup;
+import static android.widget.espresso.TextViewActions.Handle;
+import static android.widget.espresso.TextViewActions.clickOnTextAtIndex;
+import static android.widget.espresso.TextViewActions.doubleClickOnTextAtIndex;
+import static android.widget.espresso.TextViewActions.doubleTapAndDragOnText;
+import static android.widget.espresso.TextViewActions.dragHandle;
+import static android.widget.espresso.TextViewActions.longPressAndDragOnText;
+import static android.widget.espresso.TextViewActions.longPressOnTextAtIndex;
+import static android.widget.espresso.TextViewAssertions.doesNotHaveStyledText;
+import static android.widget.espresso.TextViewAssertions.hasInsertionPointerAtIndex;
+import static android.widget.espresso.TextViewAssertions.hasSelection;
+
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+
import static org.hamcrest.Matchers.anyOf;
import static org.hamcrest.Matchers.is;
+import android.app.Activity;
+import android.app.Instrumentation;
import android.content.ClipData;
import android.content.ClipboardManager;
-import android.support.test.espresso.NoMatchingViewException;
-import android.support.test.espresso.ViewAssertion;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.espresso.action.EspressoKey;
+import android.support.test.filters.MediumTest;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+import android.text.InputType;
+import android.text.Selection;
+import android.text.Spannable;
import android.view.ActionMode;
+import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.textclassifier.TextClassificationManager;
import android.view.textclassifier.TextClassifier;
import android.widget.espresso.CustomViewActions.RelativeCoordinatesProvider;
-import android.support.test.espresso.action.EspressoKey;
-import android.test.ActivityInstrumentationTestCase2;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.text.Selection;
-import android.text.Spannable;
-import android.text.InputType;
-import android.view.KeyEvent;
-
import com.android.frameworks.coretests.R;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
/**
* Tests the TextView widget from an Activity
*/
+@RunWith(AndroidJUnit4.class)
@MediumTest
-public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextViewActivity>{
+public class TextViewActivityTest {
- public TextViewActivityTest() {
- super(TextViewActivity.class);
- }
+ @Rule
+ public ActivityTestRule<TextViewActivity> mActivityRule = new ActivityTestRule<>(
+ TextViewActivity.class);
- @Override
- public void setUp() throws Exception {
- super.setUp();
- getActivity().getSystemService(TextClassificationManager.class)
+ private Activity mActivity;
+ private Instrumentation mInstrumentation;
+
+ @Before
+ public void setUp() {
+ mActivity = mActivityRule.getActivity();
+ mInstrumentation = InstrumentationRegistry.getInstrumentation();
+ mActivity.getSystemService(TextClassificationManager.class)
.setTextClassifier(TextClassifier.NO_OP);
}
- public void testTypedTextIsOnScreen() throws Exception {
+ @Test
+ public void testTypedTextIsOnScreen() {
final String helloWorld = "Hello world!";
// We use replaceText instead of typeTextIntoFocusedView to input text to avoid
// unintentional interactions with software keyboard.
@@ -94,8 +110,8 @@
onView(withId(R.id.textview)).check(matches(withText(helloWorld)));
}
-
- public void testPositionCursorAtTextAtIndex() throws Exception {
+ @Test
+ public void testPositionCursorAtTextAtIndex() {
final String helloWorld = "Hello world!";
onView(withId(R.id.textview)).perform(replaceText(helloWorld));
onView(withId(R.id.textview)).perform(clickOnTextAtIndex(helloWorld.indexOf("world")));
@@ -105,7 +121,8 @@
onView(withId(R.id.textview)).check(matches(withText("Hello orld!")));
}
- public void testPositionCursorAtTextAtIndex_arabic() throws Exception {
+ @Test
+ public void testPositionCursorAtTextAtIndex_arabic() {
// Arabic text. The expected cursorable boundary is
// | \u0623 \u064F | \u067A | \u0633 \u0652 |
final String text = "\u0623\u064F\u067A\u0633\u0652";
@@ -125,7 +142,8 @@
onView(withId(R.id.textview)).check(hasInsertionPointerAtIndex(5));
}
- public void testPositionCursorAtTextAtIndex_devanagari() throws Exception {
+ @Test
+ public void testPositionCursorAtTextAtIndex_devanagari() {
// Devanagari text. The expected cursorable boundary is | \u0915 \u093E |
final String text = "\u0915\u093E";
onView(withId(R.id.textview)).perform(replaceText(text));
@@ -138,7 +156,8 @@
onView(withId(R.id.textview)).check(hasInsertionPointerAtIndex(2));
}
- public void testLongPressToSelect() throws Exception {
+ @Test
+ public void testLongPressToSelect() {
final String helloWorld = "Hello Kirk!";
onView(withId(R.id.textview)).perform(click());
onView(withId(R.id.textview)).perform(replaceText(helloWorld));
@@ -148,7 +167,8 @@
onView(withId(R.id.textview)).check(hasSelection("Kirk"));
}
- public void testLongPressEmptySpace() throws Exception {
+ @Test
+ public void testLongPressEmptySpace() {
final String helloWorld = "Hello big round sun!";
onView(withId(R.id.textview)).perform(replaceText(helloWorld));
// Move cursor somewhere else
@@ -161,7 +181,8 @@
onView(withId(R.id.textview)).check(hasInsertionPointerAtIndex(helloWorld.length()));
}
- public void testLongPressAndDragToSelect() throws Exception {
+ @Test
+ public void testLongPressAndDragToSelect() {
final String helloWorld = "Hello little handsome boy!";
onView(withId(R.id.textview)).perform(replaceText(helloWorld));
onView(withId(R.id.textview)).perform(
@@ -170,7 +191,8 @@
onView(withId(R.id.textview)).check(hasSelection("little handsome"));
}
- public void testLongPressAndDragToSelect_emoji() throws Exception {
+ @Test
+ public void testLongPressAndDragToSelect_emoji() {
final String text = "\uD83D\uDE00\uD83D\uDE01\uD83D\uDE02\uD83D\uDE03";
onView(withId(R.id.textview)).perform(replaceText(text));
@@ -183,7 +205,8 @@
onView(withId(R.id.textview)).check(hasSelection("\uD83D\uDE01"));
}
- public void testDragAndDrop() throws Exception {
+ @Test
+ public void testDragAndDrop() {
final String text = "abc def ghi.";
onView(withId(R.id.textview)).perform(replaceText(text));
onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf("e")));
@@ -203,7 +226,8 @@
onView(withId(R.id.textview)).check(matches(withText(text)));
}
- public void testDoubleTapToSelect() throws Exception {
+ @Test
+ public void testDoubleTapToSelect() {
final String helloWorld = "Hello SuetYi!";
onView(withId(R.id.textview)).perform(replaceText(helloWorld));
@@ -213,16 +237,18 @@
onView(withId(R.id.textview)).check(hasSelection("SuetYi"));
}
- public void testDoubleTapAndDragToSelect() throws Exception {
- final String helloWorld = "Hello young beautiful girl!";
+ @Test
+ public void testDoubleTapAndDragToSelect() {
+ final String helloWorld = "Hello young beautiful person!";
onView(withId(R.id.textview)).perform(replaceText(helloWorld));
- onView(withId(R.id.textview)).perform(
- doubleTapAndDragOnText(helloWorld.indexOf("young"), helloWorld.indexOf(" girl!")));
+ onView(withId(R.id.textview)).perform(doubleTapAndDragOnText(helloWorld.indexOf("young"),
+ helloWorld.indexOf(" person!")));
onView(withId(R.id.textview)).check(hasSelection("young beautiful"));
}
- public void testDoubleTapAndDragToSelect_multiLine() throws Exception {
+ @Test
+ public void testDoubleTapAndDragToSelect_multiLine() {
final String helloWorld = "abcd\n" + "efg\n" + "hijklm\n" + "nop";
onView(withId(R.id.textview)).perform(replaceText(helloWorld));
onView(withId(R.id.textview)).perform(
@@ -230,7 +256,8 @@
onView(withId(R.id.textview)).check(hasSelection("abcd\nefg\nhijklm"));
}
- public void testSelectBackwordsByTouch() throws Exception {
+ @Test
+ public void testSelectBackwordsByTouch() {
final String helloWorld = "Hello king of the Jungle!";
onView(withId(R.id.textview)).perform(replaceText(helloWorld));
onView(withId(R.id.textview)).perform(
@@ -239,7 +266,8 @@
onView(withId(R.id.textview)).check(hasSelection("king of the"));
}
- public void testToolbarAppearsAfterSelection() throws Exception {
+ @Test
+ public void testToolbarAppearsAfterSelection() {
final String text = "Toolbar appears after selection.";
assertFloatingToolbarIsNotDisplayed();
onView(withId(R.id.textview)).perform(replaceText(text));
@@ -255,34 +283,32 @@
assertFloatingToolbarIsNotDisplayed();
}
+ @Test
public void testToolbarAppearsAfterSelection_withFirstStringLtrAlgorithmAndRtlHint()
- throws Exception {
+ throws Throwable {
// after the hint layout change, the floating toolbar was not visible in the case below
// this test tests that the floating toolbar is displayed on the screen and is visible to
// user.
- final TextView textView = (TextView) getActivity().findViewById(R.id.textview);
- textView.post(new Runnable() {
- @Override
- public void run() {
- textView.setTextDirection(TextView.TEXT_DIRECTION_FIRST_STRONG_LTR);
- textView.setInputType(InputType.TYPE_CLASS_TEXT);
- textView.setSingleLine(true);
- textView.setHint("الروبوت");
- }
+ mActivityRule.runOnUiThread(() -> {
+ final TextView textView = mActivity.findViewById(R.id.textview);
+ textView.setTextDirection(TextView.TEXT_DIRECTION_FIRST_STRONG_LTR);
+ textView.setInputType(InputType.TYPE_CLASS_TEXT);
+ textView.setSingleLine(true);
+ textView.setHint("الروبوت");
});
- getInstrumentation().waitForIdleSync();
+ mInstrumentation.waitForIdleSync();
onView(withId(R.id.textview)).perform(replaceText("test"));
onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(1));
- clickFloatingToolbarItem(
- getActivity().getString(com.android.internal.R.string.cut));
+ clickFloatingToolbarItem(mActivity.getString(com.android.internal.R.string.cut));
onView(withId(R.id.textview)).perform(longClick());
sleepForFloatingToolbarPopup();
assertFloatingToolbarIsDisplayed();
}
- public void testToolbarAndInsertionHandle() throws Exception {
+ @Test
+ public void testToolbarAndInsertionHandle() {
final String text = "text";
onView(withId(R.id.textview)).perform(replaceText(text));
onView(withId(R.id.textview)).perform(clickOnTextAtIndex(text.length()));
@@ -293,14 +319,15 @@
assertFloatingToolbarIsDisplayed();
assertFloatingToolbarContainsItem(
- getActivity().getString(com.android.internal.R.string.selectAll));
+ mActivity.getString(com.android.internal.R.string.selectAll));
assertFloatingToolbarDoesNotContainItem(
- getActivity().getString(com.android.internal.R.string.copy));
+ mActivity.getString(com.android.internal.R.string.copy));
assertFloatingToolbarDoesNotContainItem(
- getActivity().getString(com.android.internal.R.string.cut));
+ mActivity.getString(com.android.internal.R.string.cut));
}
- public void testToolbarAndSelectionHandle() throws Exception {
+ @Test
+ public void testToolbarAndSelectionHandle() {
final String text = "abcd efg hijk";
onView(withId(R.id.textview)).perform(replaceText(text));
@@ -309,13 +336,13 @@
assertFloatingToolbarIsDisplayed();
assertFloatingToolbarContainsItem(
- getActivity().getString(com.android.internal.R.string.selectAll));
+ mActivity.getString(com.android.internal.R.string.selectAll));
assertFloatingToolbarContainsItem(
- getActivity().getString(com.android.internal.R.string.copy));
+ mActivity.getString(com.android.internal.R.string.copy));
assertFloatingToolbarContainsItem(
- getActivity().getString(com.android.internal.R.string.cut));
+ mActivity.getString(com.android.internal.R.string.cut));
- final TextView textView = (TextView) getActivity().findViewById(R.id.textview);
+ final TextView textView = mActivity.findViewById(R.id.textview);
onHandleView(com.android.internal.R.id.selection_start_handle)
.perform(dragHandle(textView, Handle.SELECTION_START, text.indexOf('a')));
sleepForFloatingToolbarPopup();
@@ -327,21 +354,22 @@
assertFloatingToolbarIsDisplayed();
assertFloatingToolbarDoesNotContainItem(
- getActivity().getString(com.android.internal.R.string.selectAll));
+ mActivity.getString(com.android.internal.R.string.selectAll));
assertFloatingToolbarContainsItem(
- getActivity().getString(com.android.internal.R.string.copy));
+ mActivity.getString(com.android.internal.R.string.copy));
assertFloatingToolbarContainsItem(
- getActivity().getString(com.android.internal.R.string.cut));
+ mActivity.getString(com.android.internal.R.string.cut));
}
- public void testInsertionHandle() throws Exception {
+ @Test
+ public void testInsertionHandle() {
final String text = "abcd efg hijk ";
onView(withId(R.id.textview)).perform(replaceText(text));
onView(withId(R.id.textview)).perform(clickOnTextAtIndex(text.length()));
onView(withId(R.id.textview)).check(hasInsertionPointerAtIndex(text.length()));
- final TextView textView = (TextView) getActivity().findViewById(R.id.textview);
+ final TextView textView = mActivity.findViewById(R.id.textview);
onHandleView(com.android.internal.R.id.insertion_handle)
.perform(dragHandle(textView, Handle.INSERTION, text.indexOf('a')));
@@ -352,14 +380,15 @@
onView(withId(R.id.textview)).check(hasInsertionPointerAtIndex(text.indexOf("f")));
}
- public void testInsertionHandle_multiLine() throws Exception {
+ @Test
+ public void testInsertionHandle_multiLine() {
final String text = "abcd\n" + "efg\n" + "hijk\n";
onView(withId(R.id.textview)).perform(replaceText(text));
onView(withId(R.id.textview)).perform(clickOnTextAtIndex(text.length()));
onView(withId(R.id.textview)).check(hasInsertionPointerAtIndex(text.length()));
- final TextView textView = (TextView) getActivity().findViewById(R.id.textview);
+ final TextView textView = mActivity.findViewById(R.id.textview);
onHandleView(com.android.internal.R.id.insertion_handle)
.perform(dragHandle(textView, Handle.INSERTION, text.indexOf('a')));
@@ -370,7 +399,8 @@
onView(withId(R.id.textview)).check(hasInsertionPointerAtIndex(text.indexOf("f")));
}
- public void testSelectionHandles() throws Exception {
+ @Test
+ public void testSelectionHandles() {
final String text = "abcd efg hijk lmn";
onView(withId(R.id.textview)).perform(replaceText(text));
@@ -383,7 +413,7 @@
onHandleView(com.android.internal.R.id.selection_end_handle)
.check(matches(isDisplayed()));
- final TextView textView = (TextView) getActivity().findViewById(R.id.textview);
+ final TextView textView = mActivity.findViewById(R.id.textview);
onHandleView(com.android.internal.R.id.selection_start_handle)
.perform(dragHandle(textView, Handle.SELECTION_START, text.indexOf('a')));
onView(withId(R.id.textview)).check(hasSelection("abcd efg"));
@@ -393,7 +423,8 @@
onView(withId(R.id.textview)).check(hasSelection("abcd efg hijk"));
}
- public void testSelectionHandles_bidi() throws Exception {
+ @Test
+ public void testSelectionHandles_bidi() {
final String text = "abc \u0621\u0622\u0623 def";
onView(withId(R.id.textview)).perform(replaceText(text));
@@ -408,7 +439,7 @@
onView(withId(R.id.textview)).check(hasSelection("\u0621\u0622\u0623"));
- final TextView textView = (TextView) getActivity().findViewById(R.id.textview);
+ final TextView textView = mActivity.findViewById(R.id.textview);
onHandleView(com.android.internal.R.id.selection_start_handle)
.perform(dragHandle(textView, Handle.SELECTION_START, text.indexOf('f')));
onView(withId(R.id.textview)).check(hasSelection("\u0621\u0622\u0623"));
@@ -436,12 +467,13 @@
onView(withId(R.id.textview)).check(hasSelection("abc \u0621\u0622\u0623 def"));
}
- public void testSelectionHandles_multiLine() throws Exception {
+ @Test
+ public void testSelectionHandles_multiLine() {
final String text = "abcd\n" + "efg\n" + "hijk\n" + "lmn\n" + "opqr";
onView(withId(R.id.textview)).perform(replaceText(text));
onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf('i')));
- final TextView textView = (TextView) getActivity().findViewById(R.id.textview);
+ final TextView textView = mActivity.findViewById(R.id.textview);
onHandleView(com.android.internal.R.id.selection_start_handle)
.perform(dragHandle(textView, Handle.SELECTION_START, text.indexOf('e')));
onView(withId(R.id.textview)).check(hasSelection("efg\nhijk"));
@@ -459,7 +491,8 @@
onView(withId(R.id.textview)).check(hasSelection("abcd\nefg\nhijk\nlmn\nopqr"));
}
- public void testSelectionHandles_multiLine_rtl() throws Exception {
+ @Test
+ public void testSelectionHandles_multiLine_rtl() {
// Arabic text.
final String text = "\u062A\u062B\u062C\n" + "\u062D\u062E\u062F\n"
+ "\u0630\u0631\u0632\n" + "\u0633\u0634\u0635\n" + "\u0636\u0637\u0638\n"
@@ -467,7 +500,7 @@
onView(withId(R.id.textview)).perform(replaceText(text));
onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf('\u0634')));
- final TextView textView = (TextView)getActivity().findViewById(R.id.textview);
+ final TextView textView = mActivity.findViewById(R.id.textview);
onHandleView(com.android.internal.R.id.selection_start_handle)
.perform(dragHandle(textView, Handle.SELECTION_START, text.indexOf('\u062E')));
onView(withId(R.id.textview)).check(hasSelection(
@@ -488,13 +521,13 @@
onView(withId(R.id.textview)).check(hasSelection(text));
}
-
- public void testSelectionHandles_doesNotPassAnotherHandle() throws Exception {
+ @Test
+ public void testSelectionHandles_doesNotPassAnotherHandle() {
final String text = "abcd efg hijk lmn";
onView(withId(R.id.textview)).perform(replaceText(text));
onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf('f')));
- final TextView textView = (TextView) getActivity().findViewById(R.id.textview);
+ final TextView textView = mActivity.findViewById(R.id.textview);
onHandleView(com.android.internal.R.id.selection_start_handle)
.perform(dragHandle(textView, Handle.SELECTION_START, text.indexOf('l')));
onView(withId(R.id.textview)).check(hasSelection("g"));
@@ -505,12 +538,13 @@
onView(withId(R.id.textview)).check(hasSelection("e"));
}
- public void testSelectionHandles_doesNotPassAnotherHandle_multiLine() throws Exception {
+ @Test
+ public void testSelectionHandles_doesNotPassAnotherHandle_multiLine() {
final String text = "abcd\n" + "efg\n" + "hijk\n" + "lmn\n" + "opqr";
onView(withId(R.id.textview)).perform(replaceText(text));
onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf('i')));
- final TextView textView = (TextView) getActivity().findViewById(R.id.textview);
+ final TextView textView = mActivity.findViewById(R.id.textview);
onHandleView(com.android.internal.R.id.selection_start_handle)
.perform(dragHandle(textView, Handle.SELECTION_START, text.indexOf('r') + 1));
onView(withId(R.id.textview)).check(hasSelection("k"));
@@ -521,12 +555,13 @@
onView(withId(R.id.textview)).check(hasSelection("h"));
}
- public void testSelectionHandles_snapToWordBoundary() throws Exception {
+ @Test
+ public void testSelectionHandles_snapToWordBoundary() {
final String text = "abcd efg hijk lmn opqr";
onView(withId(R.id.textview)).perform(replaceText(text));
onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf('i')));
- final TextView textView = (TextView) getActivity().findViewById(R.id.textview);
+ final TextView textView = mActivity.findViewById(R.id.textview);
onHandleView(com.android.internal.R.id.selection_start_handle)
.perform(dragHandle(textView, Handle.SELECTION_START, text.indexOf('f')));
@@ -573,12 +608,13 @@
onView(withId(R.id.textview)).check(hasSelection("hijk lmn opq"));
}
- public void testSelectionHandles_snapToWordBoundary_multiLine() throws Exception {
+ @Test
+ public void testSelectionHandles_snapToWordBoundary_multiLine() {
final String text = "abcd efg\n" + "hijk lmn\n" + "opqr stu";
onView(withId(R.id.textview)).perform(replaceText(text));
onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf('m')));
- final TextView textView = (TextView) getActivity().findViewById(R.id.textview);
+ final TextView textView = mActivity.findViewById(R.id.textview);
onHandleView(com.android.internal.R.id.selection_start_handle)
.perform(dragHandle(textView, Handle.SELECTION_START, text.indexOf('c')));
@@ -607,14 +643,16 @@
onView(withId(R.id.textview)).check(hasSelection("hijk"));
}
- public void testSetSelectionAndActionMode() throws Exception {
+ @Test
+ public void testSetSelectionAndActionMode() throws Throwable {
final String text = "abc def";
onView(withId(R.id.textview)).perform(replaceText(text));
- final TextView textView = (TextView) getActivity().findViewById(R.id.textview);
+ final TextView textView = mActivity.findViewById(R.id.textview);
assertFloatingToolbarIsNotDisplayed();
- textView.post(() -> Selection.setSelection((Spannable) textView.getText(), 0, 3));
- getInstrumentation().waitForIdleSync();
+ mActivityRule.runOnUiThread(
+ () -> Selection.setSelection((Spannable) textView.getText(), 0, 3));
+ mInstrumentation.waitForIdleSync();
sleepForFloatingToolbarPopup();
// Don't automatically start action mode.
assertFloatingToolbarIsNotDisplayed();
@@ -624,25 +662,29 @@
sleepForFloatingToolbarPopup();
assertFloatingToolbarIsDisplayed();
// Changing the selection range by API should not interrupt the selection action mode.
- textView.post(() -> Selection.setSelection((Spannable) textView.getText(), 0, 3));
- getInstrumentation().waitForIdleSync();
+ mActivityRule.runOnUiThread(
+ () -> Selection.setSelection((Spannable) textView.getText(), 0, 3));
+ mInstrumentation.waitForIdleSync();
sleepForFloatingToolbarPopup();
assertFloatingToolbarIsDisplayed();
assertFloatingToolbarContainsItem(
- getActivity().getString(com.android.internal.R.string.selectAll));
+ mActivity.getString(com.android.internal.R.string.selectAll));
// Make sure that "Select All" is no longer included when the entire text is selected by
// API.
- textView.post(
+ mActivityRule.runOnUiThread(
() -> Selection.setSelection((Spannable) textView.getText(), 0, text.length()));
- getInstrumentation().waitForIdleSync();
+ mInstrumentation.waitForIdleSync();
+
sleepForFloatingToolbarPopup();
assertFloatingToolbarIsDisplayed();
assertFloatingToolbarDoesNotContainItem(
- getActivity().getString(com.android.internal.R.string.selectAll));
+ mActivity.getString(com.android.internal.R.string.selectAll));
// Make sure that shrinking the selection range to cursor (an empty range) by API
// terminates selection action mode and does not trigger the insertion action mode.
- textView.post(() -> Selection.setSelection((Spannable) textView.getText(), 0));
- getInstrumentation().waitForIdleSync();
+ mActivityRule.runOnUiThread(
+ () -> Selection.setSelection((Spannable) textView.getText(), 0));
+ mInstrumentation.waitForIdleSync();
+
sleepForFloatingToolbarPopup();
assertFloatingToolbarIsNotDisplayed();
// Make sure that user click can trigger the insertion action mode.
@@ -652,28 +694,32 @@
assertFloatingToolbarIsDisplayed();
// Make sure that an existing insertion action mode keeps alive after the insertion point is
// moved by API.
- textView.post(() -> Selection.setSelection((Spannable) textView.getText(), 0));
- getInstrumentation().waitForIdleSync();
+ mActivityRule.runOnUiThread(
+ () -> Selection.setSelection((Spannable) textView.getText(), 0));
+ mInstrumentation.waitForIdleSync();
+
sleepForFloatingToolbarPopup();
assertFloatingToolbarIsDisplayed();
assertFloatingToolbarDoesNotContainItem(
- getActivity().getString(com.android.internal.R.string.copy));
+ mActivity.getString(com.android.internal.R.string.copy));
// Make sure that selection action mode is started after selection is created by API when
// insertion action mode is active.
- textView.post(
+ mActivityRule.runOnUiThread(
() -> Selection.setSelection((Spannable) textView.getText(), 1, text.length()));
- getInstrumentation().waitForIdleSync();
+ mInstrumentation.waitForIdleSync();
+
sleepForFloatingToolbarPopup();
assertFloatingToolbarIsDisplayed();
assertFloatingToolbarContainsItem(
- getActivity().getString(com.android.internal.R.string.copy));
+ mActivity.getString(com.android.internal.R.string.copy));
}
- public void testTransientState() throws Exception {
+ @Test
+ public void testTransientState() throws Throwable {
final String text = "abc def";
onView(withId(R.id.textview)).perform(replaceText(text));
- final TextView textView = (TextView) getActivity().findViewById(R.id.textview);
+ final TextView textView = mActivity.findViewById(R.id.textview);
assertFalse(textView.hasTransientState());
onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf('b')));
@@ -682,22 +728,24 @@
onView(withId(R.id.textview)).perform(clickOnTextAtIndex(text.indexOf('d')));
// hasTransientState should return false as the selection has been cleared.
assertFalse(textView.hasTransientState());
- textView.post(
+ mActivityRule.runOnUiThread(
() -> Selection.setSelection((Spannable) textView.getText(), 0, text.length()));
- getInstrumentation().waitForIdleSync();
+ mInstrumentation.waitForIdleSync();
+
// hasTransientState should return false when selection is created by API.
assertFalse(textView.hasTransientState());
}
- public void testResetMenuItemTitle() throws Exception {
- getActivity().getSystemService(TextClassificationManager.class).setTextClassifier(null);
- final TextView textView = (TextView) getActivity().findViewById(R.id.textview);
+ @Test
+ public void testResetMenuItemTitle() throws Throwable {
+ mActivity.getSystemService(TextClassificationManager.class).setTextClassifier(null);
+ final TextView textView = mActivity.findViewById(R.id.textview);
final int itemId = 1;
final String title1 = " AFIGBO";
final int index = title1.indexOf('I');
final String title2 = title1.substring(index);
final String[] title = new String[]{title1};
- textView.post(() -> textView.setCustomSelectionActionModeCallback(
+ mActivityRule.runOnUiThread(() -> textView.setCustomSelectionActionModeCallback(
new ActionMode.Callback() {
@Override
public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
@@ -720,6 +768,8 @@
public void onDestroyActionMode(ActionMode actionMode) {
}
}));
+ mInstrumentation.waitForIdleSync();
+
onView(withId(R.id.textview)).perform(replaceText(title1));
onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(index));
sleepForFloatingToolbarPopup();
@@ -734,10 +784,11 @@
assertFloatingToolbarContainsItem(title2);
}
- public void testAssistItemIsAtIndexZero() throws Exception {
- getActivity().getSystemService(TextClassificationManager.class).setTextClassifier(null);
- final TextView textView = (TextView) getActivity().findViewById(R.id.textview);
- textView.post(() -> textView.setCustomSelectionActionModeCallback(
+ @Test
+ public void testAssistItemIsAtIndexZero() throws Throwable {
+ useSystemDefaultTextClassifier();
+ final TextView textView = mActivity.findViewById(R.id.textview);
+ mActivityRule.runOnUiThread(() -> textView.setCustomSelectionActionModeCallback(
new ActionMode.Callback() {
@Override
public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
@@ -761,6 +812,7 @@
public void onDestroyActionMode(ActionMode actionMode) {
}
}));
+ mInstrumentation.waitForIdleSync();
final String text = "droid@android.com";
onView(withId(R.id.textview)).perform(replaceText(text));
@@ -769,20 +821,39 @@
assertFloatingToolbarItemIndex(android.R.id.textAssist, 0);
}
- public void testPastePlainText_menuAction() throws Exception {
+ @Test
+ public void testNoAssistItemForPasswordField() throws Throwable {
+ useSystemDefaultTextClassifier();
+ final TextView textView = mActivity.findViewById(R.id.textview);
+ mActivityRule.runOnUiThread(() -> {
+ textView.setInputType(
+ InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
+ });
+ mInstrumentation.waitForIdleSync();
+ final String password = "afigbo@android.com";
+
+ onView(withId(R.id.textview)).perform(replaceText(password));
+ onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(password.indexOf('@')));
+ sleepForFloatingToolbarPopup();
+ assertFloatingToolbarDoesNotContainItem(android.R.id.textAssist);
+ }
+
+ @Test
+ public void testPastePlainText_menuAction() {
initializeClipboardWithText(TextStyle.STYLED);
onView(withId(R.id.textview)).perform(replaceText(""));
onView(withId(R.id.textview)).perform(longClick());
sleepForFloatingToolbarPopup();
clickFloatingToolbarItem(
- getActivity().getString(com.android.internal.R.string.paste_as_plain_text));
- getInstrumentation().waitForIdleSync();
+ mActivity.getString(com.android.internal.R.string.paste_as_plain_text));
+ mInstrumentation.waitForIdleSync();
onView(withId(R.id.textview)).check(matches(withText("styledtext")));
onView(withId(R.id.textview)).check(doesNotHaveStyledText());
}
+ @Test
public void testPastePlainText_noMenuItemForPlainText() {
initializeClipboardWithText(TextStyle.PLAIN);
@@ -791,7 +862,11 @@
sleepForFloatingToolbarPopup();
assertFloatingToolbarDoesNotContainItem(
- getActivity().getString(com.android.internal.R.string.paste_as_plain_text));
+ mActivity.getString(com.android.internal.R.string.paste_as_plain_text));
+ }
+
+ private void useSystemDefaultTextClassifier() {
+ mActivity.getSystemService(TextClassificationManager.class).setTextClassifier(null);
}
private void initializeClipboardWithText(TextStyle textStyle) {
@@ -806,9 +881,9 @@
default:
throw new IllegalArgumentException("Invalid text style");
}
- getActivity().getWindow().getDecorView().post(() ->
- getActivity().getSystemService(ClipboardManager.class).setPrimaryClip( clip));
- getInstrumentation().waitForIdleSync();
+ mActivity.getWindow().getDecorView().post(() ->
+ mActivity.getSystemService(ClipboardManager.class).setPrimaryClip(clip));
+ mInstrumentation.waitForIdleSync();
}
private enum TextStyle {
diff --git a/core/tests/coretests/src/android/widget/TextViewPerformanceTest.java b/core/tests/coretests/src/android/widget/TextViewPerformanceTest.java
index c25df7c..cf173fb 100644
--- a/core/tests/coretests/src/android/widget/TextViewPerformanceTest.java
+++ b/core/tests/coretests/src/android/widget/TextViewPerformanceTest.java
@@ -20,15 +20,20 @@
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.SmallTest;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.MediumTest;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
import android.text.SpannedString;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.TextView;
-public class TextViewPerformanceTest extends AndroidTestCase {
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class TextViewPerformanceTest {
private String mString = "The quick brown fox";
private Canvas mCanvas;
@@ -36,16 +41,16 @@
private Paint mPaint;
private PerformanceLabelView mLabelView;
- @Override
- protected void setUp() throws Exception {
- super.setUp();
-
+ @Before
+ public void setUp() {
Bitmap mBitmap = Bitmap.createBitmap(320, 240, Bitmap.Config.RGB_565);
mCanvas = new Canvas(mBitmap);
ViewGroup.LayoutParams p = new ViewGroup.LayoutParams(320, 240);
- mLabelView = new PerformanceLabelView(mContext);
+ final Context context = InstrumentationRegistry.getContext();
+
+ mLabelView = new PerformanceLabelView(context);
mLabelView.setText(mString);
mLabelView.measure(View.MeasureSpec.AT_MOST | 320, View.MeasureSpec.AT_MOST | 240);
mLabelView.mySetFrame(320, 240);
@@ -54,7 +59,7 @@
mPaint = new Paint();
mCanvas.save();
- mTextView = new PerformanceTextView(mContext);
+ mTextView = new PerformanceTextView(context);
mTextView.setLayoutParams(p);
mTextView.setText(mString);
mTextView.mySetFrame(320, 240);
@@ -62,7 +67,8 @@
}
@MediumTest
- public void testDrawTextViewLine() throws Exception {
+ @Test
+ public void testDrawTextViewLine() {
mTextView.myDraw(mCanvas);
mTextView.myDraw(mCanvas);
mTextView.myDraw(mCanvas);
@@ -76,7 +82,8 @@
}
@SmallTest
- public void testSpan() throws Exception {
+ @Test
+ public void testSpan() {
CharSequence charSeq = new SpannedString(mString);
mTextView.setText(charSeq);
@@ -93,12 +100,14 @@
}
@SmallTest
- public void testCanvasDrawText() throws Exception {
+ @Test
+ public void testCanvasDrawText() {
mCanvas.drawText(mString, 30, 30, mPaint);
}
@SmallTest
- public void testLabelViewDraw() throws Exception {
+ @Test
+ public void testLabelViewDraw() {
mLabelView.myDraw(mCanvas);
}
diff --git a/core/tests/coretests/src/android/widget/TextViewTest.java b/core/tests/coretests/src/android/widget/TextViewTest.java
index 8989462..1a1244f 100644
--- a/core/tests/coretests/src/android/widget/TextViewTest.java
+++ b/core/tests/coretests/src/android/widget/TextViewTest.java
@@ -16,41 +16,57 @@
package android.widget;
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertNotNull;
+import static junit.framework.Assert.assertTrue;
+
import android.app.Activity;
+import android.app.Instrumentation;
import android.content.Intent;
import android.graphics.Paint;
import android.platform.test.annotations.Presubmit;
-import android.test.ActivityInstrumentationTestCase2;
-import android.test.suitebuilder.annotation.SmallTest;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.annotation.UiThreadTest;
+import android.support.test.filters.MediumTest;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
import android.text.GetChars;
import android.text.Layout;
import android.text.Selection;
import android.text.Spannable;
-import android.util.Log;
import android.view.View;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
import java.util.Locale;
/**
* TextViewTest tests {@link TextView}.
*/
-public class TextViewTest extends ActivityInstrumentationTestCase2<TextViewActivity> {
- private static final String TAG = "TextViewTest";
+@RunWith(AndroidJUnit4.class)
+@MediumTest
+public class TextViewTest {
+ @Rule
+ public ActivityTestRule<TextViewActivity> mActivityRule = new ActivityTestRule<>(
+ TextViewActivity.class);
+ private Instrumentation mInstrumentation;
+ private Activity mActivity;
private TextView mTextView;
- public TextViewTest() {
- super(TextViewActivity.class);
+ @Before
+ public void setup() {
+ mActivity = mActivityRule.getActivity();
+ mInstrumentation = InstrumentationRegistry.getInstrumentation();
}
- @SmallTest
@Presubmit
- public void testArray() throws Exception {
- getActivity().runOnUiThread(new Runnable() {
- @Override
- public void run() {
- mTextView = new TextView(getActivity());
- }
- });
- getInstrumentation().waitForIdleSync();
+ @UiThreadTest
+ @Test
+ public void testArray() {
+ mTextView = new TextView(mActivity);
char[] c = new char[] { 'H', 'e', 'l', 'l', 'o', ' ',
'W', 'o', 'r', 'l', 'd', '!' };
@@ -78,15 +94,10 @@
assertEquals('\0', c2[5]);
}
- @SmallTest
- public void testProcessTextActivityResultNonEditable() {
- getActivity().runOnUiThread(new Runnable() {
- @Override
- public void run() {
- mTextView = new TextView(getActivity());
- }
- });
- getInstrumentation().waitForIdleSync();
+ @Test
+ public void testProcessTextActivityResultNonEditable() throws Throwable {
+ mActivityRule.runOnUiThread(() -> mTextView = new TextView(mActivity));
+ mInstrumentation.waitForIdleSync();
CharSequence originalText = "This is some text.";
mTextView.setText(originalText, TextView.BufferType.SPANNABLE);
assertEquals(originalText, mTextView.getText().toString());
@@ -94,30 +105,23 @@
Selection.setSelection((Spannable) mTextView.getText(), 0, mTextView.getText().length());
// We need to run this in the UI thread, as it will create a Toast.
- getActivity().runOnUiThread(new Runnable() {
- @Override
- public void run() {
- CharSequence newText = "Text is replaced.";
- Intent data = new Intent();
- data.putExtra(Intent.EXTRA_PROCESS_TEXT, newText);
- mTextView.onActivityResult(TextView.PROCESS_TEXT_REQUEST_CODE, Activity.RESULT_OK, data);
- }
+ mActivityRule.runOnUiThread(() -> {
+ CharSequence newText = "Text is replaced.";
+ Intent data = new Intent();
+ data.putExtra(Intent.EXTRA_PROCESS_TEXT, newText);
+ mTextView.onActivityResult(TextView.PROCESS_TEXT_REQUEST_CODE, Activity.RESULT_OK,
+ data);
});
- getInstrumentation().waitForIdleSync();
+ mInstrumentation.waitForIdleSync();
// This is a TextView, which can't be modified. Hence no change should have been made.
assertEquals(originalText, mTextView.getText().toString());
}
- @SmallTest
- public void testProcessTextActivityResultEditable() {
- getActivity().runOnUiThread(new Runnable() {
- @Override
- public void run() {
- mTextView = new EditText(getActivity());
- }
- });
- getInstrumentation().waitForIdleSync();
+ @Test
+ public void testProcessTextActivityResultEditable() throws Throwable {
+ mActivityRule.runOnUiThread(() -> mTextView = new EditText(mActivity));
+ mInstrumentation.waitForIdleSync();
CharSequence originalText = "This is some text.";
mTextView.setText(originalText, TextView.BufferType.SPANNABLE);
assertEquals(originalText, mTextView.getText().toString());
@@ -132,15 +136,10 @@
assertEquals(newText, mTextView.getText().toString());
}
- @SmallTest
- public void testProcessTextActivityResultCancel() {
- getActivity().runOnUiThread(new Runnable() {
- @Override
- public void run() {
- mTextView = new EditText(getActivity());
- }
- });
- getInstrumentation().waitForIdleSync();
+ @Test
+ public void testProcessTextActivityResultCancel() throws Throwable {
+ mActivityRule.runOnUiThread(() -> mTextView = new EditText(mActivity));
+ mInstrumentation.waitForIdleSync();
CharSequence originalText = "This is some text.";
mTextView.setText(originalText, TextView.BufferType.SPANNABLE);
assertEquals(originalText, mTextView.getText().toString());
@@ -156,15 +155,10 @@
assertEquals(originalText, mTextView.getText().toString());
}
- @SmallTest
- public void testProcessTextActivityNoData() {
- getActivity().runOnUiThread(new Runnable() {
- @Override
- public void run() {
- mTextView = new EditText(getActivity());
- }
- });
- getInstrumentation().waitForIdleSync();
+ @Test
+ public void testProcessTextActivityNoData() throws Throwable {
+ mActivityRule.runOnUiThread(() -> mTextView = new EditText(mActivity));
+ mInstrumentation.waitForIdleSync();
CharSequence originalText = "This is some text.";
mTextView.setText(originalText, TextView.BufferType.SPANNABLE);
assertEquals(originalText, mTextView.getText().toString());
@@ -176,13 +170,14 @@
assertEquals(originalText, mTextView.getText().toString());
}
- @SmallTest
+ @Test
+ @UiThreadTest
public void testHyphenationWidth() {
- TextView textView = new TextView(getActivity());
- textView.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_FULL);
- textView.setTextLocale(Locale.US);
+ mTextView = new TextView(mActivity);
+ mTextView.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_FULL);
+ mTextView.setTextLocale(Locale.US);
- Paint paint = textView.getPaint();
+ Paint paint = mTextView.getPaint();
String word = "thisissuperlonglongword";
float wordWidth = paint.measureText(word, 0, word.length());
@@ -192,17 +187,17 @@
sb.append(word);
sb.append(" ");
}
- textView.setText(sb.toString());
+ mTextView.setText(sb.toString());
int width = (int)(wordWidth * 0.7);
int height = 4096; // enough for all text.
- textView.measure(
+ mTextView.measure(
View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY),
View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.EXACTLY));
- textView.layout(0, 0, width, height);
+ mTextView.layout(0, 0, width, height);
- Layout layout = textView.getLayout();
+ Layout layout = mTextView.getLayout();
assertNotNull(layout);
int lineCount = layout.getLineCount();
diff --git a/core/tests/coretests/src/android/widget/espresso/FloatingToolbarEspressoUtils.java b/core/tests/coretests/src/android/widget/espresso/FloatingToolbarEspressoUtils.java
index 5206c9b..3825e3f 100644
--- a/core/tests/coretests/src/android/widget/espresso/FloatingToolbarEspressoUtils.java
+++ b/core/tests/coretests/src/android/widget/espresso/FloatingToolbarEspressoUtils.java
@@ -23,29 +23,31 @@
import static android.support.test.espresso.matcher.ViewMatchers.hasDescendant;
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.isRoot;
-import static android.support.test.espresso.matcher.ViewMatchers.withTagValue;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
+import static android.support.test.espresso.matcher.ViewMatchers.withTagValue;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
+
import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.is;
-import android.view.MenuItem;
-import android.view.ViewGroup;
-import java.util.ArrayList;
-import java.util.List;
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeMatcher;
-
import android.support.test.espresso.NoMatchingRootException;
import android.support.test.espresso.NoMatchingViewException;
import android.support.test.espresso.UiController;
import android.support.test.espresso.ViewAction;
import android.support.test.espresso.ViewInteraction;
+import android.view.MenuItem;
import android.view.View;
+import android.view.ViewGroup;
import com.android.internal.widget.FloatingToolbar;
+import org.hamcrest.Description;
+import org.hamcrest.Matcher;
+import org.hamcrest.TypeSafeMatcher;
+
+import java.util.ArrayList;
+import java.util.List;
+
/**
* Espresso utility methods for the floating toolbar.
*/
@@ -177,6 +179,39 @@
}
/**
+ * Asserts that the floating toolbar does not contain a menu item with the specified id.
+ *
+ * @param menuItemId id of the menu item
+ * @throws AssertionError if the assertion fails
+ */
+ public static void assertFloatingToolbarDoesNotContainItem(final int menuItemId) {
+ onFloatingToolBar().check(matches(new TypeSafeMatcher<View>() {
+ @Override
+ public boolean matchesSafely(View view) {
+ return !hasMenuItemWithSpecifiedId(view);
+ }
+
+ @Override
+ public void describeTo(Description description) {}
+
+ private boolean hasMenuItemWithSpecifiedId(View view) {
+ if (view.getTag() instanceof MenuItem
+ && ((MenuItem) view.getTag()).getItemId() == menuItemId) {
+ return true;
+ } else if (view instanceof ViewGroup) {
+ ViewGroup viewGroup = (ViewGroup) view;
+ for (int i = 0; i < viewGroup.getChildCount(); i++) {
+ if (hasMenuItemWithSpecifiedId(viewGroup.getChildAt(i))) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+ }));
+ }
+
+ /**
* Click specified item on the floating tool bar.
*
* @param itemLabel label of the item.
diff --git a/core/tests/coretests/src/android/widget/espresso/MouseClickAction.java b/core/tests/coretests/src/android/widget/espresso/MouseClickAction.java
index bec4180..b50d6f4 100644
--- a/core/tests/coretests/src/android/widget/espresso/MouseClickAction.java
+++ b/core/tests/coretests/src/android/widget/espresso/MouseClickAction.java
@@ -16,8 +16,6 @@
package android.widget.espresso;
-import org.hamcrest.Matcher;
-
import android.support.test.espresso.UiController;
import android.support.test.espresso.ViewAction;
import android.support.test.espresso.action.CoordinatesProvider;
@@ -25,10 +23,13 @@
import android.support.test.espresso.action.MotionEvents.DownResultHolder;
import android.support.test.espresso.action.Press;
import android.support.test.espresso.action.Tapper;
+import android.view.InputDevice;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
+import org.hamcrest.Matcher;
+
/**
* ViewAction for performing an click on View by a mouse.
*/
@@ -41,8 +42,9 @@
TRIPLE {
@Override
public Tapper.Status sendTap(UiController uiController, float[] coordinates,
- float[] precision) {
- Tapper.Status stat = sendSingleTap(uiController, coordinates, precision);
+ float[] precision, int inputDevice, int buttonState) {
+ Tapper.Status stat = sendSingleTap(uiController, coordinates, precision,
+ inputDevice, buttonState);
boolean warning = false;
if (stat == Tapper.Status.FAILURE) {
return Tapper.Status.FAILURE;
@@ -55,7 +57,8 @@
if (0 < doubleTapMinimumTimeout) {
uiController.loopMainThreadForAtLeast(doubleTapMinimumTimeout);
}
- stat = sendSingleTap(uiController, coordinates, precision);
+ stat = sendSingleTap(uiController, coordinates, precision, inputDevice,
+ buttonState);
if (stat == Tapper.Status.FAILURE) {
return Tapper.Status.FAILURE;
} else if (stat == Tapper.Status.WARNING) {
@@ -69,11 +72,19 @@
return Tapper.Status.SUCCESS;
}
}
+
+ @Override
+ public Tapper.Status sendTap(UiController uiController, float[] coordinates,
+ float[] precision) {
+ return sendTap(uiController, coordinates, precision, InputDevice.SOURCE_UNKNOWN,
+ MotionEvent.BUTTON_PRIMARY);
+ }
};
private static Tapper.Status sendSingleTap(UiController uiController,
- float[] coordinates, float[] precision) {
- DownResultHolder res = MotionEvents.sendDown(uiController, coordinates, precision);
+ float[] coordinates, float[] precision, int inputDevice, int buttonState) {
+ DownResultHolder res = MotionEvents.sendDown(uiController, coordinates, precision,
+ inputDevice, buttonState);
try {
if (!MotionEvents.sendUp(uiController, res.down)) {
MotionEvents.sendCancel(uiController, res.down);
diff --git a/core/tests/coretests/src/android/widget/espresso/TextViewActions.java b/core/tests/coretests/src/android/widget/espresso/TextViewActions.java
index 335d021..b4c547e 100644
--- a/core/tests/coretests/src/android/widget/espresso/TextViewActions.java
+++ b/core/tests/coretests/src/android/widget/espresso/TextViewActions.java
@@ -17,10 +17,12 @@
package android.widget.espresso;
import static android.support.test.espresso.action.ViewActions.actionWithAssertions;
+
import android.graphics.Rect;
import android.support.test.espresso.PerformException;
import android.support.test.espresso.ViewAction;
import android.support.test.espresso.action.CoordinatesProvider;
+import android.support.test.espresso.action.GeneralLocation;
import android.support.test.espresso.action.Press;
import android.support.test.espresso.action.Tap;
import android.support.test.espresso.util.HumanReadables;
@@ -53,6 +55,20 @@
new ViewClickAction(Tap.SINGLE, new TextCoordinates(index), Press.FINGER));
}
+
+ /**
+ * Returns an action that single-clicks by mouse on the View.<br>
+ * <br>
+ * View constraints:
+ * <ul>
+ * <li>must be a View displayed on screen
+ * <ul>
+ */
+ public static ViewAction mouseClick() {
+ return actionWithAssertions(new MouseClickAction(Tap.SINGLE, GeneralLocation.VISIBLE_CENTER,
+ MotionEvent.BUTTON_PRIMARY));
+ }
+
/**
* Returns an action that clicks by mouse on text at an index on the TextView.<br>
* <br>
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java
index c21c3be..eff6ad9 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java
@@ -280,7 +280,7 @@
// Stop timer
curr = 1000 * (clocks.realtime = clocks.uptime = 161);
- bi.noteJobFinishLocked(jobName, UID);
+ bi.noteJobFinishLocked(jobName, UID, 0);
// Move to background
curr = 1000 * (clocks.realtime = clocks.uptime = 202);
@@ -296,7 +296,7 @@
// Stop timer
curr = 1000 * (clocks.realtime = clocks.uptime = 409);
- bi.noteJobFinishLocked(jobName, UID);
+ bi.noteJobFinishLocked(jobName, UID, 0);
// Test
curr = 1000 * (clocks.realtime = clocks.uptime = 657);
@@ -319,7 +319,7 @@
final String jobName2 = "second_job";
bi.noteJobStartLocked(jobName2, UID);
assertEquals(2, bi.getUidStats().get(UID).getJobStats().size());
- bi.noteJobFinishLocked(jobName2, UID);
+ bi.noteJobFinishLocked(jobName2, UID, 0);
}
@SmallTest
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java
index ed54f53..7769e69 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java
@@ -25,8 +25,22 @@
import junit.framework.TestCase;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
/**
* Test various BatteryStatsImpl noteStart methods.
+ *
+ * Build/Install/Run: bit FrameworksCoreTests:com.android.internal.os.BatteryStatsNoteTest
+ *
+ * Alternatively,
+ * Build: m FrameworksCoreTests
+ * Install: adb install -r \
+ * ${ANDROID_PRODUCT_OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk
+ * Run: adb shell am instrument -e class com.android.internal.os.BatteryStatsNoteTest -w \
+ * com.android.frameworks.coretests/android.support.test.runner.AndroidJUnitRunner
*/
public class BatteryStatsNoteTest extends TestCase{
private static final int UID = 10500;
@@ -84,4 +98,95 @@
assertEquals(220_000, actualTime);
assertEquals(120_000, bgTime);
}
+
+
+ /** Test BatteryStatsImpl.noteUidProcessStateLocked. */
+ @SmallTest
+ public void testNoteUidProcessStateLocked() throws Exception {
+ final MockClocks clocks = new MockClocks();
+ MockBatteryStatsImpl bi = new MockBatteryStatsImpl(clocks);
+
+ // map of ActivityManager process states and how long to simulate run time in each state
+ Map<Integer, Integer> stateRuntimeMap = new HashMap<Integer, Integer>();
+ stateRuntimeMap.put(ActivityManager.PROCESS_STATE_TOP, 1111);
+ stateRuntimeMap.put(ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE, 1234);
+ stateRuntimeMap.put(ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 2468);
+ stateRuntimeMap.put(ActivityManager.PROCESS_STATE_TOP_SLEEPING, 7531);
+ stateRuntimeMap.put(ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND, 4455);
+ stateRuntimeMap.put(ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND, 1337);
+ stateRuntimeMap.put(ActivityManager.PROCESS_STATE_BACKUP, 90210);
+ stateRuntimeMap.put(ActivityManager.PROCESS_STATE_HEAVY_WEIGHT, 911);
+ stateRuntimeMap.put(ActivityManager.PROCESS_STATE_SERVICE, 404);
+ stateRuntimeMap.put(ActivityManager.PROCESS_STATE_RECEIVER, 31459);
+ stateRuntimeMap.put(ActivityManager.PROCESS_STATE_HOME, 1123);
+ stateRuntimeMap.put(ActivityManager.PROCESS_STATE_LAST_ACTIVITY, 5813);
+ stateRuntimeMap.put(ActivityManager.PROCESS_STATE_CACHED_ACTIVITY, 867);
+ stateRuntimeMap.put(ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT, 5309);
+ stateRuntimeMap.put(ActivityManager.PROCESS_STATE_CACHED_EMPTY, 42);
+
+ bi.updateTimeBasesLocked(true, false, 0, 0);
+
+ for (Map.Entry<Integer, Integer> entry : stateRuntimeMap.entrySet()) {
+ bi.noteUidProcessStateLocked(UID, entry.getKey());
+ clocks.realtime += entry.getValue();
+ clocks.uptime = clocks.realtime;
+ }
+
+ long actualRunTimeUs;
+ long expectedRunTimeMs;
+ long elapsedTimeUs = clocks.realtime * 1000;
+ BatteryStats.Uid uid = bi.getUidStats().get(UID);
+
+ // compare runtime of process states to the Uid process states they map to
+ actualRunTimeUs = uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_TOP, elapsedTimeUs,
+ STATS_SINCE_CHARGED);
+ expectedRunTimeMs = stateRuntimeMap.get(ActivityManager.PROCESS_STATE_TOP);
+ assertEquals(expectedRunTimeMs * 1000, actualRunTimeUs);
+
+
+ actualRunTimeUs = uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_FOREGROUND_SERVICE,
+ elapsedTimeUs, STATS_SINCE_CHARGED);
+ expectedRunTimeMs = stateRuntimeMap.get(
+ ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE)
+ + stateRuntimeMap.get(ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
+ assertEquals(expectedRunTimeMs * 1000, actualRunTimeUs);
+
+
+ actualRunTimeUs = uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_TOP_SLEEPING,
+ elapsedTimeUs, STATS_SINCE_CHARGED);
+ expectedRunTimeMs = stateRuntimeMap.get(ActivityManager.PROCESS_STATE_TOP_SLEEPING);
+ assertEquals(expectedRunTimeMs * 1000, actualRunTimeUs);
+
+
+ actualRunTimeUs = uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_FOREGROUND,
+ elapsedTimeUs, STATS_SINCE_CHARGED);
+ expectedRunTimeMs = stateRuntimeMap.get(ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND);
+ assertEquals(expectedRunTimeMs * 1000, actualRunTimeUs);
+
+
+ actualRunTimeUs = uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_BACKGROUND,
+ elapsedTimeUs, STATS_SINCE_CHARGED);
+ expectedRunTimeMs = stateRuntimeMap.get(ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND)
+ + stateRuntimeMap.get(ActivityManager.PROCESS_STATE_BACKUP)
+ + stateRuntimeMap.get(ActivityManager.PROCESS_STATE_HEAVY_WEIGHT)
+ + stateRuntimeMap.get(ActivityManager.PROCESS_STATE_SERVICE)
+ + stateRuntimeMap.get(ActivityManager.PROCESS_STATE_RECEIVER);
+ assertEquals(expectedRunTimeMs * 1000, actualRunTimeUs);
+
+
+ actualRunTimeUs = uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_CACHED,
+ elapsedTimeUs, STATS_SINCE_CHARGED);
+ expectedRunTimeMs = stateRuntimeMap.get(ActivityManager.PROCESS_STATE_HOME)
+ + stateRuntimeMap.get(ActivityManager.PROCESS_STATE_LAST_ACTIVITY)
+ + stateRuntimeMap.get(ActivityManager.PROCESS_STATE_CACHED_ACTIVITY)
+ + stateRuntimeMap.get(ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT)
+ + stateRuntimeMap.get(ActivityManager.PROCESS_STATE_CACHED_EMPTY);
+ assertEquals(expectedRunTimeMs * 1000, actualRunTimeUs);
+
+ // Special check for foreground service timer
+ actualRunTimeUs = uid.getForegroundServiceTimer().getTotalTimeLocked(elapsedTimeUs,
+ STATS_SINCE_CHARGED);
+ expectedRunTimeMs = stateRuntimeMap.get(ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
+ assertEquals(expectedRunTimeMs * 1000, actualRunTimeUs);
+ }
}
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsUserLifecycleTests.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsUserLifecycleTests.java
new file mode 100644
index 0000000..450473d
--- /dev/null
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsUserLifecycleTests.java
@@ -0,0 +1,167 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.os;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeTrue;
+
+import android.app.ActivityManager;
+import android.app.IActivityManager;
+import android.app.IStopUserCallback;
+import android.content.Context;
+import android.content.pm.UserInfo;
+import android.os.RemoteException;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.LargeTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.test.uiautomator.UiDevice;
+import android.util.ArraySet;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+@LargeTest
+@RunWith(AndroidJUnit4.class)
+public class BatteryStatsUserLifecycleTests {
+
+ private static final long POLL_INTERVAL_MS = 500;
+ private static final long USER_REMOVE_TIMEOUT_MS = 5_000;
+ private static final long STOP_USER_TIMEOUT_MS = 10_000;
+ private static final long BATTERYSTATS_POLLING_TIMEOUT_MS = 5_000;
+
+ private static final String CPU_DATA_TAG = "cpu";
+ private static final String CPU_FREQ_DATA_TAG = "ctf";
+
+ private int mTestUserId = UserHandle.USER_NULL;
+ private Context mContext;
+ private UserManager mUm;
+ private IActivityManager mIam;
+
+ @BeforeClass
+ public static void setUpOnce() {
+ assumeTrue(UserManager.getMaxSupportedUsers() > 1);
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ mContext = InstrumentationRegistry.getTargetContext();
+ mUm = UserManager.get(mContext);
+ mIam = ActivityManager.getService();
+ final UserInfo user = mUm.createUser("Test_user_" + System.currentTimeMillis() / 1000, 0);
+ assertNotNull("Unable to create test user", user);
+ mTestUserId = user.id;
+ batteryOnScreenOff();
+ }
+
+ @Test
+ public void testNoCpuDataForRemovedUser() throws Exception {
+ mIam.startUserInBackground(mTestUserId);
+ waitUntilTrue("No uids for started user " + mTestUserId,
+ () -> getNumberOfUidsInBatteryStats() > 0, BATTERYSTATS_POLLING_TIMEOUT_MS);
+
+ CountDownLatch stopUserLatch = new CountDownLatch(1);
+ mIam.stopUser(mTestUserId, true, new IStopUserCallback.Stub() {
+ @Override
+ public void userStopped(int userId) throws RemoteException {
+ stopUserLatch.countDown();
+ }
+
+ @Override
+ public void userStopAborted(int userId) throws RemoteException {
+ }
+ });
+ assertTrue("User " + mTestUserId + " could not be stopped",
+ stopUserLatch.await(STOP_USER_TIMEOUT_MS, TimeUnit.MILLISECONDS));
+
+ mUm.removeUser(mTestUserId);
+ waitUntilTrue("Unable to remove user " + mTestUserId, () -> {
+ for (UserInfo user : mUm.getUsers()) {
+ if (user.id == mTestUserId) {
+ return false;
+ }
+ }
+ return true;
+ }, USER_REMOVE_TIMEOUT_MS);
+ waitUntilTrue("Uids still found for removed user " + mTestUserId,
+ () -> getNumberOfUidsInBatteryStats() == 0, BATTERYSTATS_POLLING_TIMEOUT_MS);
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ batteryOffScreenOn();
+ if (mTestUserId != UserHandle.USER_NULL) {
+ mUm.removeUser(mTestUserId);
+ }
+ }
+
+ private int getNumberOfUidsInBatteryStats() throws Exception {
+ ArraySet<Integer> uids = new ArraySet<>();
+ final String dumpsys = executeShellCommand("dumpsys batterystats --checkin");
+ for (String line : dumpsys.split("\n")) {
+ final String[] parts = line.trim().split(",");
+ if (parts.length < 5 ||
+ (!parts[3].equals(CPU_DATA_TAG) && !parts[3].equals(CPU_FREQ_DATA_TAG))) {
+ continue;
+ }
+ try {
+ final int uid = Integer.parseInt(parts[1]);
+ if (UserHandle.getUserId(uid) == mTestUserId) {
+ uids.add(uid);
+ }
+ } catch (NumberFormatException nexc) {
+ // ignore
+ }
+ }
+ return uids.size();
+ }
+
+ protected void batteryOnScreenOff() throws Exception {
+ executeShellCommand("dumpsys battery unplug");
+ executeShellCommand("dumpsys batterystats enable pretend-screen-off");
+ }
+
+ protected void batteryOffScreenOn() throws Exception {
+ executeShellCommand("dumpsys battery reset");
+ executeShellCommand("dumpsys batterystats disable pretend-screen-off");
+ }
+
+ private String executeShellCommand(String cmd) throws Exception {
+ return UiDevice.getInstance(
+ InstrumentationRegistry.getInstrumentation()).executeShellCommand(cmd);
+ }
+
+ private void waitUntilTrue(String message, Condition condition, long timeout) throws Exception {
+ final long deadLine = System.currentTimeMillis() + timeout;
+ while (System.currentTimeMillis() <= deadLine && !condition.isTrue()) {
+ Thread.sleep(POLL_INTERVAL_MS);
+ }
+ assertTrue(message, condition.isTrue());
+ }
+
+ private interface Condition {
+ boolean isTrue() throws Exception;
+ }
+}
diff --git a/core/tests/coretests/src/com/android/internal/os/KernelUidCpuFreqTimeReaderTest.java b/core/tests/coretests/src/com/android/internal/os/KernelUidCpuFreqTimeReaderTest.java
index 620acae..7ab9569 100644
--- a/core/tests/coretests/src/com/android/internal/os/KernelUidCpuFreqTimeReaderTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/KernelUidCpuFreqTimeReaderTest.java
@@ -98,6 +98,14 @@
}
verifyNoMoreInteractions(mCallback);
+ // Verify that there won't be a callback if the proc file values didn't change.
+ Mockito.reset(mCallback, mBufferedReader);
+ when(mBufferedReader.readLine())
+ .thenReturn(getFreqsLine(freqs), getUidTimesLines(uids, newTimes1));
+ mKernelUidCpuFreqTimeReader.readDelta(mBufferedReader, mCallback);
+ verify(mCallback).onCpuFreqs(freqs);
+ verifyNoMoreInteractions(mCallback);
+
// Verify that calling with a null callback doesn't result in any crashes
Mockito.reset(mCallback, mBufferedReader);
final long[][] newTimes2 = new long[uids.length][freqs.length];
@@ -130,6 +138,91 @@
verifyNoMoreInteractions(mCallback);
}
+ @Test
+ public void testReadDelta_malformedData() throws Exception {
+ final long[] freqs = {1, 12, 123, 1234, 12345, 123456};
+ final int[] uids = {1, 22, 333, 4444, 5555};
+ final long[][] times = new long[uids.length][freqs.length];
+ for (int i = 0; i < uids.length; ++i) {
+ for (int j = 0; j < freqs.length; ++j) {
+ times[i][j] = uids[i] * freqs[j] * 10;
+ }
+ }
+ when(mBufferedReader.readLine())
+ .thenReturn(getFreqsLine(freqs), getUidTimesLines(uids, times));
+ mKernelUidCpuFreqTimeReader.readDelta(mBufferedReader, mCallback);
+ verify(mCallback).onCpuFreqs(freqs);
+ for (int i = 0; i < uids.length; ++i) {
+ verify(mCallback).onUidCpuFreqTime(uids[i], times[i]);
+ }
+ verifyNoMoreInteractions(mCallback);
+
+ // Verify that there is no callback if any value in the proc file is -ve.
+ Mockito.reset(mCallback, mBufferedReader);
+ final long[][] newTimes1 = new long[uids.length][freqs.length];
+ for (int i = 0; i < uids.length; ++i) {
+ for (int j = 0; j < freqs.length; ++j) {
+ newTimes1[i][j] = (times[i][j] + uids[i] + freqs[j]) * 10;
+ }
+ }
+ newTimes1[uids.length - 1][freqs.length - 1] *= -1;
+ when(mBufferedReader.readLine())
+ .thenReturn(getFreqsLine(freqs), getUidTimesLines(uids, newTimes1));
+ mKernelUidCpuFreqTimeReader.readDelta(mBufferedReader, mCallback);
+ verify(mCallback).onCpuFreqs(freqs);
+ for (int i = 0; i < uids.length; ++i) {
+ if (i == uids.length - 1) {
+ continue;
+ }
+ verify(mCallback).onUidCpuFreqTime(uids[i], subtract(newTimes1[i], times[i]));
+ }
+ verifyNoMoreInteractions(mCallback);
+
+ // Verify that the internal state was not modified when the proc file had -ve value.
+ Mockito.reset(mCallback, mBufferedReader);
+ for (int i = 0; i < freqs.length; ++i) {
+ newTimes1[uids.length - 1][i] = times[uids.length - 1][i];
+ }
+ when(mBufferedReader.readLine())
+ .thenReturn(getFreqsLine(freqs), getUidTimesLines(uids, newTimes1));
+ mKernelUidCpuFreqTimeReader.readDelta(mBufferedReader, mCallback);
+ verify(mCallback).onCpuFreqs(freqs);
+ verifyNoMoreInteractions(mCallback);
+
+ // Verify that there is no callback if the values in the proc file are decreased.
+ Mockito.reset(mCallback, mBufferedReader);
+ final long[][] newTimes2 = new long[uids.length][freqs.length];
+ for (int i = 0; i < uids.length; ++i) {
+ for (int j = 0; j < freqs.length; ++j) {
+ newTimes2[i][j] = (newTimes1[i][j] + uids[i] * freqs[j]) * 10;
+ }
+ }
+ newTimes2[uids.length - 1][freqs.length - 1] =
+ newTimes1[uids.length - 1][freqs.length - 1] - 222;
+ when(mBufferedReader.readLine())
+ .thenReturn(getFreqsLine(freqs), getUidTimesLines(uids, newTimes2));
+ mKernelUidCpuFreqTimeReader.readDelta(mBufferedReader, mCallback);
+ verify(mCallback).onCpuFreqs(freqs);
+ for (int i = 0; i < uids.length; ++i) {
+ if (i == uids.length - 1) {
+ continue;
+ }
+ verify(mCallback).onUidCpuFreqTime(uids[i], subtract(newTimes2[i], newTimes1[i]));
+ }
+ verifyNoMoreInteractions(mCallback);
+
+ // Verify that the internal state was not modified when the proc file had decreasing values.
+ Mockito.reset(mCallback, mBufferedReader);
+ for (int i = 0; i < freqs.length; ++i) {
+ newTimes2[uids.length - 1][i] = newTimes1[uids.length - 1][i];
+ }
+ when(mBufferedReader.readLine())
+ .thenReturn(getFreqsLine(freqs), getUidTimesLines(uids, newTimes2));
+ mKernelUidCpuFreqTimeReader.readDelta(mBufferedReader, mCallback);
+ verify(mCallback).onCpuFreqs(freqs);
+ verifyNoMoreInteractions(mCallback);
+ }
+
private long[] subtract(long[] a1, long[] a2) {
long[] val = new long[a1.length];
for (int i = 0; i < val.length; ++i) {
diff --git a/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterArrayTest.java b/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterArrayTest.java
index 4a23f40..27aec56 100644
--- a/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterArrayTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterArrayTest.java
@@ -114,7 +114,7 @@
public void testOnTimeStarted() {
initializeCounterArrayWithDefaultValues();
mCounterArray.onTimeStarted(0, 0, 0);
- assertArrayEquals(PLUGGED_COUNTS, mCounterArray.mCounts, "Unexpected counts");
+ assertArrayEquals(COUNTS, mCounterArray.mCounts, "Unexpected counts");
assertArrayEquals(LOADED_COUNTS, mCounterArray.mLoadedCounts, "Unexpected loadedCounts");
assertArrayEquals(PLUGGED_COUNTS, mCounterArray.mPluggedCounts, "Unexpected pluggedCounts");
assertArrayEquals(PLUGGED_COUNTS, mCounterArray.mUnpluggedCounts,
@@ -150,6 +150,7 @@
@Test
public void testAddCountLocked() {
final long[] deltas = {123, 234, 345, 456};
+ when(mTimeBase.isRunning()).thenReturn(true);
mCounterArray.addCountLocked(deltas);
assertArrayEquals(deltas, mCounterArray.mCounts, "Unexpected counts");
assertArrayEquals(null, mCounterArray.mLoadedCounts, "Unexpected loadedCounts");
diff --git a/core/tests/coretests/src/com/android/internal/widget/MessagingLinearLayoutTest.java b/core/tests/coretests/src/com/android/internal/widget/MessagingLinearLayoutTest.java
index 20fd4d3..dfe8511 100644
--- a/core/tests/coretests/src/com/android/internal/widget/MessagingLinearLayoutTest.java
+++ b/core/tests/coretests/src/com/android/internal/widget/MessagingLinearLayoutTest.java
@@ -22,12 +22,12 @@
import android.content.Context;
import android.support.test.InstrumentationRegistry;
-import android.support.test.espresso.core.deps.guava.base.Function;
import android.support.test.filters.SmallTest;
import android.view.LayoutInflater;
import android.view.View.MeasureSpec;
import com.android.frameworks.coretests.R;
+import com.google.common.base.Function;
import org.junit.Before;
import org.junit.Test;
diff --git a/core/tests/utiltests/Android.mk b/core/tests/utiltests/Android.mk
index f2e02e3..233d070 100644
--- a/core/tests/utiltests/Android.mk
+++ b/core/tests/utiltests/Android.mk
@@ -18,7 +18,6 @@
android-support-test \
frameworks-base-testutils \
mockito-target-minus-junit4 \
- legacy-android-tests
LOCAL_JAVA_LIBRARIES := android.test.runner
diff --git a/core/tests/utiltests/AndroidManifest.xml b/core/tests/utiltests/AndroidManifest.xml
index d6384e7..8db81ca 100644
--- a/core/tests/utiltests/AndroidManifest.xml
+++ b/core/tests/utiltests/AndroidManifest.xml
@@ -30,7 +30,6 @@
<uses-permission android:name="android.permission.MANAGE_NETWORK_POLICY" />
<uses-permission android:name="android.permission.READ_NETWORK_USAGE_HISTORY" />
- <uses-permission android:name="android.permission.MODIFY_NETWORK_ACCOUNTING" />
<uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.MANAGE_USERS" />
diff --git a/core/tests/utiltests/res/drawable/image.jpg b/core/tests/utiltests/res/drawable/image.jpg
new file mode 100644
index 0000000..bef1fb1
--- /dev/null
+++ b/core/tests/utiltests/res/drawable/image.jpg
Binary files differ
diff --git a/core/tests/utiltests/res/drawable/png.png b/core/tests/utiltests/res/drawable/png.png
new file mode 100644
index 0000000..b13c865
--- /dev/null
+++ b/core/tests/utiltests/res/drawable/png.png
Binary files differ
diff --git a/core/tests/utiltests/src/android/util/MetadataReaderTest.java b/core/tests/utiltests/src/android/util/MetadataReaderTest.java
new file mode 100644
index 0000000..193fb50
--- /dev/null
+++ b/core/tests/utiltests/src/android/util/MetadataReaderTest.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2017 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.util;
+
+import android.media.ExifInterface;
+import android.os.Bundle;
+import android.provider.DocumentsContract;
+import android.provider.MetadataReader;
+
+import libcore.io.IoUtils;
+
+import junit.framework.TestCase;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+
+public class MetadataReaderTest extends TestCase {
+
+ private InputStream mInputStream;
+ private Bundle mData;
+
+ @Before
+ protected void setUp() throws Exception {
+ mInputStream = getClass().getClassLoader().getResourceAsStream("res/drawable/image.jpg");
+ mData = new Bundle();
+ }
+
+ @After
+ protected void tearDown() throws Exception {
+ IoUtils.closeQuietly(mInputStream);
+ }
+
+ @Test
+ public void testGetMetadata() throws IOException {
+ MetadataReader.getMetadata(mData, mInputStream, "image/jpg", null);
+ Bundle exif = mData.getBundle(DocumentsContract.METADATA_EXIF);
+ assertEquals("3036", String.valueOf(exif.getInt(ExifInterface.TAG_IMAGE_WIDTH)));
+ assertEquals("4048", String.valueOf(exif.getInt(ExifInterface.TAG_IMAGE_LENGTH)));
+ assertEquals("2017:07:17 19:19:28", exif.getString(ExifInterface.TAG_DATETIME));
+ assertEquals(0.0, exif.getDouble(ExifInterface.TAG_GPS_LATITUDE));
+ assertEquals(0.0, exif.getDouble(ExifInterface.TAG_GPS_LONGITUDE));
+ assertEquals("Google", exif.getString(ExifInterface.TAG_MAKE));
+ assertEquals("Pixel", exif.getString(ExifInterface.TAG_MODEL));
+ assertEquals(mData.getStringArray(DocumentsContract.METADATA_TYPES)[0],
+ DocumentsContract.METADATA_EXIF);
+ }
+
+ @Test
+ public void testGetMetadata_JpegOneTag() throws IOException {
+ String[] tags = {ExifInterface.TAG_MAKE};
+ MetadataReader.getMetadata(mData, mInputStream, "image/jpg", tags);
+ assertEquals("Google",
+ mData.getBundle(DocumentsContract.METADATA_EXIF).getString(tags[0]));
+ }
+
+ @Test
+ public void testGetMetadata_JpegNoResults() throws IOException {
+ String[] tags = {ExifInterface.TAG_SPECTRAL_SENSITIVITY};
+ assertEquals(0, mData.size());
+ MetadataReader.getMetadata(mData, mInputStream, "image/jpg", tags);
+ assertEquals(1, mData.size());
+ assertEquals(mData.getStringArray(DocumentsContract.METADATA_TYPES).length, 0);
+ }
+
+ @Test
+ public void testGetMetadata_BadFile() {
+ try {
+ InputStream stream = new FileInputStream("badString");
+ MetadataReader.getMetadata(mData, stream, "image/jpg", null);
+ } catch (IOException e) {
+ assertEquals(FileNotFoundException.class, e.getClass());
+ }
+ }
+
+ @Test
+ public void testGetMetadata_UnsupportedMimeType() throws IOException {
+ MetadataReader.getMetadata(mData, mInputStream, "no/metadata", null);
+ assertEquals(1, mData.size());
+ }
+
+ @Test
+ public void testGetMetadata_NoTags() throws IOException {
+ MetadataReader.getMetadata(mData, mInputStream, "image/jpg", new String[0]);
+ assertEquals(1, mData.size());
+ }
+
+ @Test
+ public void testGetMetadata_Png() throws IOException {
+ InputStream pngStream = getClass().getClassLoader().getResourceAsStream("res/drawable/png.png");
+ MetadataReader.getMetadata(mData, pngStream, "image/png", null);
+ assertEquals(1, mData.size());
+
+ }
+
+}
diff --git a/core/tests/utiltests/src/android/util/RemoteIntArray.java b/core/tests/utiltests/src/android/util/RemoteIntArray.java
index 7dc3400..11d0888 100644
--- a/core/tests/utiltests/src/android/util/RemoteIntArray.java
+++ b/core/tests/utiltests/src/android/util/RemoteIntArray.java
@@ -32,7 +32,7 @@
final class RemoteIntArray implements ServiceConnection, Closeable {
private static final long BIND_REMOTE_SERVICE_TIMEOUT =
- ("eng".equals(Build.TYPE)) ? 120000 : 10000;
+ Build.IS_ENG ? 120000 : 10000;
private final Object mLock = new Object();
diff --git a/data/etc/platform.xml b/data/etc/platform.xml
index 19d2a31..26741fe 100644
--- a/data/etc/platform.xml
+++ b/data/etc/platform.xml
@@ -93,7 +93,7 @@
</permission>
<!-- Group that can modify how network statistics are accounted -->
- <permission name="android.permission.MODIFY_NETWORK_ACCOUNTING">
+ <permission name="android.permission.UPDATE_DEVICE_STATS">
<group gid="net_bw_acct" />
</permission>
@@ -107,7 +107,7 @@
<group gid="audio" />
</permission>
- <permission name="android.permission.ACCESS_FM_RADIO" >
+ <permission name="android.permission.ACCESS_BROADCAST_RADIO" >
<!-- /dev/fm is gid media, not audio -->
<group gid="media" />
</permission>
@@ -163,6 +163,8 @@
<!-- This is a list of all the libraries available for application
code to link against. -->
+ <library name="android.test.mock"
+ file="/system/framework/android.test.mock.jar" />
<library name="android.test.runner"
file="/system/framework/android.test.runner.jar" />
<library name="javax.obex"
diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml
index 92b6aa3..1f55232 100644
--- a/data/etc/privapp-permissions-platform.xml
+++ b/data/etc/privapp-permissions-platform.xml
@@ -147,6 +147,7 @@
<permission name="android.permission.MANAGE_USERS"/>
<permission name="android.permission.MODIFY_PHONE_STATE"/>
<permission name="android.permission.PERFORM_CDMA_PROVISIONING"/>
+ <permission name="android.permission.READ_NETWORK_USAGE_HISTORY"/>
<permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
<permission name="android.permission.READ_SEARCH_INDEXABLES"/>
<permission name="android.permission.REBOOT"/>
@@ -185,7 +186,6 @@
<permission name="android.permission.ACCESS_CACHE_FILESYSTEM"/>
<permission name="android.permission.CLEAR_APP_CACHE"/>
<permission name="android.permission.CONNECTIVITY_INTERNAL"/>
- <permission name="android.permission.MODIFY_NETWORK_ACCOUNTING"/>
<permission name="android.permission.UPDATE_APP_OPS_STATS"/>
<permission name="android.permission.UPDATE_DEVICE_STATS"/>
</privapp-permissions>
@@ -265,6 +265,7 @@
<permission name="android.permission.DELETE_CACHE_FILES"/>
<permission name="android.permission.DELETE_PACKAGES"/>
<permission name="android.permission.DUMP"/>
+ <permission name="android.permission.ACTIVITY_EMBEDDING"/>
<permission name="android.permission.FORCE_STOP_PACKAGES"/>
<permission name="android.permission.GET_APP_OPS_STATS"/>
<permission name="android.permission.INSTALL_LOCATION_PROVIDER"/>
diff --git a/drm/jni/android_drm_DrmManagerClient.cpp b/drm/jni/android_drm_DrmManagerClient.cpp
index 63fe8ac..52ea8e3 100644
--- a/drm/jni/android_drm_DrmManagerClient.cpp
+++ b/drm/jni/android_drm_DrmManagerClient.cpp
@@ -19,8 +19,8 @@
#include <utils/Log.h>
#include <jni.h>
-#include <JNIHelp.h>
-#include <ScopedLocalRef.h>
+#include <nativehelper/JNIHelp.h>
+#include <nativehelper/ScopedLocalRef.h>
#include <android_runtime/AndroidRuntime.h>
#include <drm/DrmInfo.h>
diff --git a/graphics/java/android/graphics/Bitmap.java b/graphics/java/android/graphics/Bitmap.java
index d586db4..57c7549 100644
--- a/graphics/java/android/graphics/Bitmap.java
+++ b/graphics/java/android/graphics/Bitmap.java
@@ -21,6 +21,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.Size;
+import android.content.res.ResourcesImpl;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.StrictMode;
@@ -82,6 +83,12 @@
private static volatile int sDefaultDensity = -1;
+ /** @hide Used only when ResourcesImpl.TRACE_FOR_DETAILED_PRELOAD is true. */
+ public static volatile int sPreloadTracingNumInstantiatedBitmaps;
+
+ /** @hide Used only when ResourcesImpl.TRACE_FOR_DETAILED_PRELOAD is true. */
+ public static volatile long sPreloadTracingTotalBitmapsSize;
+
/**
* For backwards compatibility, allows the app layer to change the default
* density when running old apps.
@@ -128,6 +135,11 @@
NativeAllocationRegistry registry = new NativeAllocationRegistry(
Bitmap.class.getClassLoader(), nativeGetNativeFinalizer(), nativeSize);
registry.registerNativeAllocation(this, nativeBitmap);
+
+ if (ResourcesImpl.TRACE_FOR_DETAILED_PRELOAD) {
+ sPreloadTracingNumInstantiatedBitmaps++;
+ sPreloadTracingTotalBitmapsSize += nativeSize;
+ }
}
/**
diff --git a/graphics/java/android/graphics/FontListParser.java b/graphics/java/android/graphics/FontListParser.java
index 7c07a30..80a9324 100644
--- a/graphics/java/android/graphics/FontListParser.java
+++ b/graphics/java/android/graphics/FontListParser.java
@@ -111,6 +111,7 @@
String weightStr = parser.getAttributeValue(null, "weight");
int weight = weightStr == null ? 400 : Integer.parseInt(weightStr);
boolean isItalic = "italic".equals(parser.getAttributeValue(null, "style"));
+ String fallbackFor = parser.getAttributeValue(null, "fallbackFor");
StringBuilder filename = new StringBuilder();
while (parser.next() != XmlPullParser.END_TAG) {
if (parser.getEventType() == XmlPullParser.TEXT) {
@@ -126,7 +127,7 @@
}
String sanitizedName = FILENAME_WHITESPACE_PATTERN.matcher(filename).replaceAll("");
return new FontConfig.Font(sanitizedName, index,
- axes.toArray(new FontVariationAxis[axes.size()]), weight, isItalic);
+ axes.toArray(new FontVariationAxis[axes.size()]), weight, isItalic, fallbackFor);
}
private static FontVariationAxis readAxis(XmlPullParser parser)
diff --git a/graphics/java/android/graphics/LeakyTypefaceStorage.java b/graphics/java/android/graphics/LeakyTypefaceStorage.java
new file mode 100644
index 0000000..618e60d
--- /dev/null
+++ b/graphics/java/android/graphics/LeakyTypefaceStorage.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2017 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.graphics;
+
+import com.android.internal.annotations.GuardedBy;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.os.Parcel;
+import android.os.Process;
+import android.util.ArrayMap;
+
+import java.util.ArrayList;
+
+/**
+ * This class is used for Parceling Typeface object.
+ * Note: Typeface object can not be passed over the process boundary.
+ *
+ * @hide
+ */
+public class LeakyTypefaceStorage {
+ private static final Object sLock = new Object();
+
+ @GuardedBy("sLock")
+ private static final ArrayList<Typeface> sStorage = new ArrayList<>();
+ @GuardedBy("sLock")
+ private static final ArrayMap<Typeface, Integer> sTypefaceMap = new ArrayMap<>();
+
+ /**
+ * Write typeface to parcel.
+ *
+ * You can't transfer Typeface to a different process. {@link readTypefaceFromParcel} will
+ * return {@code null} if the {@link readTypefaceFromParcel} is called in a different process.
+ *
+ * @param typeface A {@link Typeface} to be written.
+ * @param parcel A {@link Parcel} object.
+ */
+ public static void writeTypefaceToParcel(@Nullable Typeface typeface, @NonNull Parcel parcel) {
+ parcel.writeInt(Process.myPid());
+ synchronized (sLock) {
+ final int id;
+ final Integer i = sTypefaceMap.get(typeface);
+ if (i != null) {
+ id = i.intValue();
+ } else {
+ id = sStorage.size();
+ sStorage.add(typeface);
+ sTypefaceMap.put(typeface, id);
+ }
+ parcel.writeInt(id);
+ }
+ }
+
+ /**
+ * Read typeface from parcel.
+ *
+ * If the {@link Typeface} was created in another process, this method returns null.
+ *
+ * @param parcel A {@link Parcel} object
+ * @return A {@link Typeface} object.
+ */
+ public static @Nullable Typeface readTypefaceFromParcel(@NonNull Parcel parcel) {
+ final int pid = parcel.readInt();
+ final int typefaceId = parcel.readInt();
+ if (pid != Process.myPid()) {
+ return null; // The Typeface was created and written in another process.
+ }
+ synchronized (sLock) {
+ return sStorage.get(typefaceId);
+ }
+ }
+}
diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java
index e1eb69a..aa9227c 100644
--- a/graphics/java/android/graphics/Paint.java
+++ b/graphics/java/android/graphics/Paint.java
@@ -822,18 +822,14 @@
* @hide
*/
public float getUnderlinePosition() {
- // kStdUnderline_Offset = 1/9, defined in SkTextFormatParams.h
- // TODO: replace with position from post and MVAR tables (b/62353930).
- return (1.0f / 9.0f) * getTextSize();
+ return nGetUnderlinePosition(mNativePaint, mNativeTypeface);
}
/**
* @hide
*/
public float getUnderlineThickness() {
- // kStdUnderline_Thickness = 1/18, defined in SkTextFormatParams.h
- // TODO: replace with thickness from post and MVAR tables (b/62353930).
- return (1.0f / 18.0f) * getTextSize();
+ return nGetUnderlineThickness(mNativePaint, mNativeTypeface);
}
/**
@@ -856,6 +852,23 @@
}
/**
+ * Distance from top of the strike-through line to the baseline. Negative values mean above the
+ * baseline. This method returns where the strike-through line should be drawn independent of if
+ * the strikeThruText bit is set at the moment.
+ * @hide
+ */
+ public float getStrikeThruPosition() {
+ return nGetStrikeThruPosition(mNativePaint, mNativeTypeface);
+ }
+
+ /**
+ * @hide
+ */
+ public float getStrikeThruThickness() {
+ return nGetStrikeThruThickness(mNativePaint, mNativeTypeface);
+ }
+
+ /**
* Helper for setFlags(), setting or clearing the STRIKE_THRU_TEXT_FLAG bit
*
* @param strikeThruText true to set the strikeThruText bit in the paint's
@@ -2997,5 +3010,13 @@
@CriticalNative
private static native float nDescent(long paintPtr, long typefacePtr);
@CriticalNative
+ private static native float nGetUnderlinePosition(long paintPtr, long typefacePtr);
+ @CriticalNative
+ private static native float nGetUnderlineThickness(long paintPtr, long typefacePtr);
+ @CriticalNative
+ private static native float nGetStrikeThruPosition(long paintPtr, long typefacePtr);
+ @CriticalNative
+ private static native float nGetStrikeThruThickness(long paintPtr, long typefacePtr);
+ @CriticalNative
private static native void nSetTextSize(long paintPtr, float textSize);
}
diff --git a/graphics/java/android/graphics/Typeface.java b/graphics/java/android/graphics/Typeface.java
index c4b56c3..1d8b583 100644
--- a/graphics/java/android/graphics/Typeface.java
+++ b/graphics/java/android/graphics/Typeface.java
@@ -38,6 +38,7 @@
import android.provider.FontRequest;
import android.provider.FontsContract;
import android.text.FontConfig;
+import android.util.ArrayMap;
import android.util.Base64;
import android.util.Log;
import android.util.LongSparseArray;
@@ -45,6 +46,7 @@
import android.util.SparseArray;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.Preconditions;
import libcore.io.IoUtils;
@@ -105,12 +107,10 @@
private static final LruCache<String, Typeface> sDynamicTypefaceCache = new LruCache<>(16);
static Typeface sDefaultTypeface;
- static Map<String, Typeface> sSystemFontMap;
- static FontFamily[] sFallbackFonts;
+ static final Map<String, Typeface> sSystemFontMap;
+ static final Map<String, FontFamily[]> sSystemFallbackMap;
private static final Object sLock = new Object();
- static final String FONTS_CONFIG = "fonts.xml";
-
/**
* @hide
*/
@@ -129,6 +129,7 @@
// Must be the same as the C++ constant in core/jni/android/graphics/FontFamily.cpp
/** @hide */
public static final int RESOLVE_BY_FONT_TABLE = -1;
+ private static final String DEFAULT_FAMILY = "sans-serif";
// Style value for building typeface.
private static final int STYLE_NORMAL = 0;
@@ -163,28 +164,27 @@
*/
@Nullable
public static Typeface createFromResources(AssetManager mgr, String path, int cookie) {
- if (sFallbackFonts != null) {
- synchronized (sDynamicTypefaceCache) {
- final String key = Builder.createAssetUid(
- mgr, path, 0 /* ttcIndex */, null /* axes */,
- RESOLVE_BY_FONT_TABLE /* weight */, RESOLVE_BY_FONT_TABLE /* italic */);
- Typeface typeface = sDynamicTypefaceCache.get(key);
- if (typeface != null) return typeface;
+ synchronized (sDynamicTypefaceCache) {
+ final String key = Builder.createAssetUid(
+ mgr, path, 0 /* ttcIndex */, null /* axes */,
+ RESOLVE_BY_FONT_TABLE /* weight */, RESOLVE_BY_FONT_TABLE /* italic */,
+ DEFAULT_FAMILY);
+ Typeface typeface = sDynamicTypefaceCache.get(key);
+ if (typeface != null) return typeface;
- FontFamily fontFamily = new FontFamily();
- // TODO: introduce ttc index and variation settings to resource type font.
- if (fontFamily.addFontFromAssetManager(mgr, path, cookie, false /* isAsset */,
- 0 /* ttcIndex */, RESOLVE_BY_FONT_TABLE /* weight */,
- RESOLVE_BY_FONT_TABLE /* italic */, null /* axes */)) {
- if (!fontFamily.freeze()) {
- return null;
- }
- FontFamily[] families = {fontFamily};
- typeface = createFromFamiliesWithDefault(families,
- RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE);
- sDynamicTypefaceCache.put(key, typeface);
- return typeface;
+ FontFamily fontFamily = new FontFamily();
+ // TODO: introduce ttc index and variation settings to resource type font.
+ if (fontFamily.addFontFromAssetManager(mgr, path, cookie, false /* isAsset */,
+ 0 /* ttcIndex */, RESOLVE_BY_FONT_TABLE /* weight */,
+ RESOLVE_BY_FONT_TABLE /* italic */, null /* axes */)) {
+ if (!fontFamily.freeze()) {
+ return null;
}
+ FontFamily[] families = {fontFamily};
+ typeface = createFromFamiliesWithDefault(families, DEFAULT_FAMILY,
+ RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE);
+ sDynamicTypefaceCache.put(key, typeface);
+ return typeface;
}
}
return null;
@@ -197,61 +197,57 @@
@Nullable
public static Typeface createFromResources(
FamilyResourceEntry entry, AssetManager mgr, String path) {
- if (sFallbackFonts != null) {
- if (entry instanceof ProviderResourceEntry) {
- final ProviderResourceEntry providerEntry = (ProviderResourceEntry) entry;
- // Downloadable font
- List<List<String>> givenCerts = providerEntry.getCerts();
- List<List<byte[]>> certs = new ArrayList<>();
- if (givenCerts != null) {
- for (int i = 0; i < givenCerts.size(); i++) {
- List<String> certSet = givenCerts.get(i);
- List<byte[]> byteArraySet = new ArrayList<>();
- for (int j = 0; j < certSet.size(); j++) {
- byteArraySet.add(Base64.decode(certSet.get(j), Base64.DEFAULT));
- }
- certs.add(byteArraySet);
+ if (entry instanceof ProviderResourceEntry) {
+ final ProviderResourceEntry providerEntry = (ProviderResourceEntry) entry;
+ // Downloadable font
+ List<List<String>> givenCerts = providerEntry.getCerts();
+ List<List<byte[]>> certs = new ArrayList<>();
+ if (givenCerts != null) {
+ for (int i = 0; i < givenCerts.size(); i++) {
+ List<String> certSet = givenCerts.get(i);
+ List<byte[]> byteArraySet = new ArrayList<>();
+ for (int j = 0; j < certSet.size(); j++) {
+ byteArraySet.add(Base64.decode(certSet.get(j), Base64.DEFAULT));
}
- }
- // Downloaded font and it wasn't cached, request it again and return a
- // default font instead (nothing we can do now).
- FontRequest request = new FontRequest(providerEntry.getAuthority(),
- providerEntry.getPackage(), providerEntry.getQuery(), certs);
- Typeface typeface = FontsContract.getFontSync(request);
- return typeface == null ? DEFAULT : typeface;
- }
-
- Typeface typeface = findFromCache(mgr, path);
- if (typeface != null) return typeface;
-
- // family is FontFamilyFilesResourceEntry
- final FontFamilyFilesResourceEntry filesEntry =
- (FontFamilyFilesResourceEntry) entry;
-
- FontFamily fontFamily = new FontFamily();
- for (final FontFileResourceEntry fontFile : filesEntry.getEntries()) {
- // TODO: Add ttc and variation font support. (b/37853920)
- if (!fontFamily.addFontFromAssetManager(mgr, fontFile.getFileName(),
- 0 /* resourceCookie */, false /* isAsset */, 0 /* ttcIndex */,
- fontFile.getWeight(), fontFile.getItalic(), null /* axes */)) {
- return null;
+ certs.add(byteArraySet);
}
}
- if (!fontFamily.freeze()) {
+ // Downloaded font and it wasn't cached, request it again and return a
+ // default font instead (nothing we can do now).
+ FontRequest request = new FontRequest(providerEntry.getAuthority(),
+ providerEntry.getPackage(), providerEntry.getQuery(), certs);
+ Typeface typeface = FontsContract.getFontSync(request);
+ return typeface == null ? DEFAULT : typeface;
+ }
+
+ Typeface typeface = findFromCache(mgr, path);
+ if (typeface != null) return typeface;
+
+ // family is FontFamilyFilesResourceEntry
+ final FontFamilyFilesResourceEntry filesEntry = (FontFamilyFilesResourceEntry) entry;
+
+ FontFamily fontFamily = new FontFamily();
+ for (final FontFileResourceEntry fontFile : filesEntry.getEntries()) {
+ // TODO: Add ttc and variation font support. (b/37853920)
+ if (!fontFamily.addFontFromAssetManager(mgr, fontFile.getFileName(),
+ 0 /* resourceCookie */, false /* isAsset */, 0 /* ttcIndex */,
+ fontFile.getWeight(), fontFile.getItalic(), null /* axes */)) {
return null;
}
- FontFamily[] familyChain = { fontFamily };
- typeface = createFromFamiliesWithDefault(familyChain,
- RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE);
- synchronized (sDynamicTypefaceCache) {
- final String key = Builder.createAssetUid(mgr, path, 0 /* ttcIndex */,
- null /* axes */, RESOLVE_BY_FONT_TABLE /* weight */,
- RESOLVE_BY_FONT_TABLE /* italic */);
- sDynamicTypefaceCache.put(key, typeface);
- }
- return typeface;
}
- return null;
+ if (!fontFamily.freeze()) {
+ return null;
+ }
+ FontFamily[] familyChain = { fontFamily };
+ typeface = createFromFamiliesWithDefault(familyChain, DEFAULT_FAMILY,
+ RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE);
+ synchronized (sDynamicTypefaceCache) {
+ final String key = Builder.createAssetUid(mgr, path, 0 /* ttcIndex */,
+ null /* axes */, RESOLVE_BY_FONT_TABLE /* weight */,
+ RESOLVE_BY_FONT_TABLE /* italic */, DEFAULT_FAMILY);
+ sDynamicTypefaceCache.put(key, typeface);
+ }
+ return typeface;
}
/**
@@ -261,7 +257,8 @@
public static Typeface findFromCache(AssetManager mgr, String path) {
synchronized (sDynamicTypefaceCache) {
final String key = Builder.createAssetUid(mgr, path, 0 /* ttcIndex */, null /* axes */,
- RESOLVE_BY_FONT_TABLE /* weight */, RESOLVE_BY_FONT_TABLE /* italic */);
+ RESOLVE_BY_FONT_TABLE /* weight */, RESOLVE_BY_FONT_TABLE /* italic */,
+ DEFAULT_FAMILY);
Typeface typeface = sDynamicTypefaceCache.get(key);
if (typeface != null) {
return typeface;
@@ -498,7 +495,7 @@
* @return Unique id for a given AssetManager and asset path.
*/
private static String createAssetUid(final AssetManager mgr, String path, int ttcIndex,
- @Nullable FontVariationAxis[] axes, int weight, int italic) {
+ @Nullable FontVariationAxis[] axes, int weight, int italic, String fallback) {
final SparseArray<String> pkgs = mgr.getAssignedPackageIdentifiers();
final StringBuilder builder = new StringBuilder();
final int size = pkgs.size();
@@ -513,7 +510,11 @@
builder.append(Integer.toString(weight));
builder.append("-");
builder.append(Integer.toString(italic));
- builder.append("-");
+ // Family name may contain hyphen. Use double hyphen for avoiding key conflicts before
+ // and after appending falblack name.
+ builder.append("--");
+ builder.append(fallback);
+ builder.append("--");
if (axes != null) {
for (FontVariationAxis axis : axes) {
builder.append(axis.getTag());
@@ -593,13 +594,15 @@
return resolveFallbackTypeface();
}
FontFamily[] families = { fontFamily };
- return createFromFamiliesWithDefault(families, mWeight, mItalic);
+ return createFromFamiliesWithDefault(families, mFallbackFamilyName, mWeight,
+ mItalic);
} catch (IOException e) {
return resolveFallbackTypeface();
}
} else if (mAssetManager != null) { // Builder is created with asset manager.
final String key = createAssetUid(
- mAssetManager, mPath, mTtcIndex, mAxes, mWeight, mItalic);
+ mAssetManager, mPath, mTtcIndex, mAxes, mWeight, mItalic,
+ mFallbackFamilyName);
synchronized (sLock) {
Typeface typeface = sDynamicTypefaceCache.get(key);
if (typeface != null) return typeface;
@@ -613,7 +616,8 @@
return resolveFallbackTypeface();
}
FontFamily[] families = { fontFamily };
- typeface = createFromFamiliesWithDefault(families, mWeight, mItalic);
+ typeface = createFromFamiliesWithDefault(families, mFallbackFamilyName,
+ mWeight, mItalic);
sDynamicTypefaceCache.put(key, typeface);
return typeface;
}
@@ -627,7 +631,8 @@
return resolveFallbackTypeface();
}
FontFamily[] families = { fontFamily };
- return createFromFamiliesWithDefault(families, mWeight, mItalic);
+ return createFromFamiliesWithDefault(families, mFallbackFamilyName, mWeight,
+ mItalic);
} else if (mFonts != null) {
final FontFamily fontFamily = new FontFamily();
boolean atLeastOneFont = false;
@@ -653,7 +658,8 @@
}
fontFamily.freeze();
FontFamily[] families = { fontFamily };
- return createFromFamiliesWithDefault(families, mWeight, mItalic);
+ return createFromFamiliesWithDefault(families, mFallbackFamilyName, mWeight,
+ mItalic);
}
// Must not reach here.
@@ -673,10 +679,7 @@
* @return The best matching typeface.
*/
public static Typeface create(String familyName, int style) {
- if (sSystemFontMap != null) {
- return create(sSystemFontMap.get(familyName), style);
- }
- return null;
+ return create(sSystemFontMap.get(familyName), style);
}
/**
@@ -751,34 +754,33 @@
if (path == null) {
throw new NullPointerException(); // for backward compatibility
}
- if (sFallbackFonts != null) {
- synchronized (sLock) {
- Typeface typeface = new Builder(mgr, path).build();
- if (typeface != null) return typeface;
+ synchronized (sLock) {
+ Typeface typeface = new Builder(mgr, path).build();
+ if (typeface != null) return typeface;
- final String key = Builder.createAssetUid(mgr, path, 0 /* ttcIndex */,
- null /* axes */, RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE);
- typeface = sDynamicTypefaceCache.get(key);
- if (typeface != null) return typeface;
+ final String key = Builder.createAssetUid(mgr, path, 0 /* ttcIndex */,
+ null /* axes */, RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE,
+ DEFAULT_FAMILY);
+ typeface = sDynamicTypefaceCache.get(key);
+ if (typeface != null) return typeface;
- final FontFamily fontFamily = new FontFamily();
- if (fontFamily.addFontFromAssetManager(mgr, path, 0, true /* isAsset */,
- 0 /* ttc index */, RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE,
- null /* axes */)) {
- // Due to backward compatibility, even if the font is not supported by our font
- // stack, we need to place the empty font at the first place. The typeface with
- // empty font behaves different from default typeface especially in fallback
- // font selection.
- fontFamily.allowUnsupportedFont();
- fontFamily.freeze();
- final FontFamily[] families = { fontFamily };
- typeface = createFromFamiliesWithDefault(families, RESOLVE_BY_FONT_TABLE,
- RESOLVE_BY_FONT_TABLE);
- sDynamicTypefaceCache.put(key, typeface);
- return typeface;
- } else {
- fontFamily.abortCreation();
- }
+ final FontFamily fontFamily = new FontFamily();
+ if (fontFamily.addFontFromAssetManager(mgr, path, 0, true /* isAsset */,
+ 0 /* ttc index */, RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE,
+ null /* axes */)) {
+ // Due to backward compatibility, even if the font is not supported by our font
+ // stack, we need to place the empty font at the first place. The typeface with
+ // empty font behaves different from default typeface especially in fallback
+ // font selection.
+ fontFamily.allowUnsupportedFont();
+ fontFamily.freeze();
+ final FontFamily[] families = { fontFamily };
+ typeface = createFromFamiliesWithDefault(families, DEFAULT_FAMILY,
+ RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE);
+ sDynamicTypefaceCache.put(key, typeface);
+ return typeface;
+ } else {
+ fontFamily.abortCreation();
}
}
throw new RuntimeException("Font asset not found " + path);
@@ -815,22 +817,20 @@
* @return The new typeface.
*/
public static Typeface createFromFile(@Nullable String path) {
- if (sFallbackFonts != null) {
- final FontFamily fontFamily = new FontFamily();
- if (fontFamily.addFont(path, 0 /* ttcIndex */, null /* axes */,
- RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE)) {
- // Due to backward compatibility, even if the font is not supported by our font
- // stack, we need to place the empty font at the first place. The typeface with
- // empty font behaves different from default typeface especially in fallback font
- // selection.
- fontFamily.allowUnsupportedFont();
- fontFamily.freeze();
- FontFamily[] families = { fontFamily };
- return createFromFamiliesWithDefault(families, RESOLVE_BY_FONT_TABLE,
- RESOLVE_BY_FONT_TABLE);
- } else {
- fontFamily.abortCreation();
- }
+ final FontFamily fontFamily = new FontFamily();
+ if (fontFamily.addFont(path, 0 /* ttcIndex */, null /* axes */,
+ RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE)) {
+ // Due to backward compatibility, even if the font is not supported by our font
+ // stack, we need to place the empty font at the first place. The typeface with
+ // empty font behaves different from default typeface especially in fallback font
+ // selection.
+ fontFamily.allowUnsupportedFont();
+ fontFamily.freeze();
+ FontFamily[] families = { fontFamily };
+ return createFromFamiliesWithDefault(families, DEFAULT_FAMILY,
+ RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE);
+ } else {
+ fontFamily.abortCreation();
}
throw new RuntimeException("Font not found " + path);
}
@@ -852,6 +852,8 @@
/**
* Create a new typeface from an array of font families, including
* also the font families in the fallback list.
+ * @param fallbackName the family name. If given families don't support characters, the
+ * characters will be rendered with this family.
* @param weight the weight for this family. {@link RESOLVE_BY_FONT_TABLE} can be used. In that
* case, the table information in the first family's font is used. If the first
* family has multiple fonts, the closest to the regular weight and upright font
@@ -863,13 +865,17 @@
* @param families array of font families
*/
private static Typeface createFromFamiliesWithDefault(FontFamily[] families,
- int weight, int italic) {
- long[] ptrArray = new long[families.length + sFallbackFonts.length];
+ String fallbackName, int weight, int italic) {
+ FontFamily[] fallback = sSystemFallbackMap.get(fallbackName);
+ if (fallback == null) {
+ fallback = sSystemFallbackMap.get(DEFAULT_FAMILY);
+ }
+ long[] ptrArray = new long[families.length + fallback.length];
for (int i = 0; i < families.length; i++) {
ptrArray[i] = families[i].mNativePtr;
}
- for (int i = 0; i < sFallbackFonts.length; i++) {
- ptrArray[i + families.length] = sFallbackFonts[i].mNativePtr;
+ for (int i = 0; i < fallback.length; i++) {
+ ptrArray[i + families.length] = fallback[i].mNativePtr;
}
return new Typeface(nativeCreateFromArray(ptrArray, weight, italic));
}
@@ -885,113 +891,189 @@
mWeight = nativeGetWeight(ni);
}
- private static FontFamily makeFamilyFromParsed(FontConfig.Family family,
- Map<String, ByteBuffer> bufferForPath) {
- FontFamily fontFamily = new FontFamily(family.getLanguage(), family.getVariant());
- for (FontConfig.Font font : family.getFonts()) {
- String fullPathName = "/system/fonts/" + font.getFontName();
- ByteBuffer fontBuffer = bufferForPath.get(fullPathName);
- if (fontBuffer == null) {
- try (FileInputStream file = new FileInputStream(fullPathName)) {
- FileChannel fileChannel = file.getChannel();
- long fontSize = fileChannel.size();
- fontBuffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, fontSize);
- bufferForPath.put(fullPathName, fontBuffer);
- } catch (IOException e) {
- Log.e(TAG, "Error mapping font file " + fullPathName);
+ private static @Nullable ByteBuffer mmap(String fullPath) {
+ try (FileInputStream file = new FileInputStream(fullPath)) {
+ final FileChannel fileChannel = file.getChannel();
+ final long fontSize = fileChannel.size();
+ return fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, fontSize);
+ } catch (IOException e) {
+ Log.e(TAG, "Error mapping font file " + fullPath);
+ return null;
+ }
+ }
+
+ private static @Nullable FontFamily createFontFamily(
+ String familyName, List<FontConfig.Font> fonts, String languageTag, int variant,
+ Map<String, ByteBuffer> cache, String fontDir) {
+ final FontFamily family = new FontFamily(languageTag, variant);
+ for (int i = 0; i < fonts.size(); i++) {
+ final FontConfig.Font font = fonts.get(i);
+ final String fullPath = fontDir + font.getFontName();
+ ByteBuffer buffer = cache.get(fullPath);
+ if (buffer == null) {
+ if (cache.containsKey(fullPath)) {
+ continue; // Already failed to mmap. Skip it.
+ }
+ buffer = mmap(fullPath);
+ cache.put(fullPath, buffer);
+ if (buffer == null) {
continue;
}
}
- if (!fontFamily.addFontFromBuffer(fontBuffer, font.getTtcIndex(), font.getAxes(),
+ if (!family.addFontFromBuffer(buffer, font.getTtcIndex(), font.getAxes(),
font.getWeight(), font.isItalic() ? STYLE_ITALIC : STYLE_NORMAL)) {
- Log.e(TAG, "Error creating font " + fullPathName + "#" + font.getTtcIndex());
+ Log.e(TAG, "Error creating font " + fullPath + "#" + font.getTtcIndex());
}
}
- if (!fontFamily.freeze()) {
- // Treat as system error since reaching here means that a system pre-installed font
- // can't be used by our font stack.
- Log.e(TAG, "Unable to load Family: " + family.getName() + ":" + family.getLanguage());
+ if (!family.freeze()) {
+ Log.e(TAG, "Unable to load Family: " + familyName + " : " + languageTag);
return null;
}
- return fontFamily;
+ return family;
}
- /*
- * (non-Javadoc)
+ private static void pushFamilyToFallback(FontConfig.Family xmlFamily,
+ ArrayMap<String, ArrayList<FontFamily>> fallbackMap,
+ Map<String, ByteBuffer> cache,
+ String fontDir) {
+
+ final String languageTag = xmlFamily.getLanguage();
+ final int variant = xmlFamily.getVariant();
+
+ final ArrayList<FontConfig.Font> defaultFonts = new ArrayList<>();
+ final ArrayMap<String, ArrayList<FontConfig.Font>> specificFallbackFonts = new ArrayMap<>();
+
+ // Collect default fallback and specific fallback fonts.
+ for (final FontConfig.Font font : xmlFamily.getFonts()) {
+ final String fallbackName = font.getFallbackFor();
+ if (fallbackName == null) {
+ defaultFonts.add(font);
+ } else {
+ ArrayList<FontConfig.Font> fallback = specificFallbackFonts.get(fallbackName);
+ if (fallback == null) {
+ fallback = new ArrayList<>();
+ specificFallbackFonts.put(fallbackName, fallback);
+ }
+ fallback.add(font);
+ }
+ }
+
+ final FontFamily defaultFamily = defaultFonts.isEmpty() ? null : createFontFamily(
+ xmlFamily.getName(), defaultFonts, languageTag, variant, cache, fontDir);
+
+ // Insert family into fallback map.
+ for (int i = 0; i < fallbackMap.size(); i++) {
+ final ArrayList<FontConfig.Font> fallback =
+ specificFallbackFonts.get(fallbackMap.keyAt(i));
+ if (fallback == null) {
+ if (defaultFamily != null) {
+ fallbackMap.valueAt(i).add(defaultFamily);
+ }
+ } else {
+ final FontFamily family = createFontFamily(
+ xmlFamily.getName(), fallback, languageTag, variant, cache, fontDir);
+ if (family != null) {
+ fallbackMap.valueAt(i).add(family);
+ }
+ }
+ }
+ }
+
+ /**
+ * Build the system fallback from xml file.
*
- * This should only be called once, from the static class initializer block.
+ * @param xmlPath A full path string to the fonts.xml file.
+ * @param fontDir A full path string to the system font directory. This must end with
+ * slash('/').
+ * @param fontMap An output system font map. Caller must pass empty map.
+ * @param fallbackMap An output system fallback map. Caller must pass empty map.
+ * @hide
*/
- private static void init() {
- // Load font config and initialize Minikin state
- File systemFontConfigLocation = getSystemFontConfigLocation();
- File configFilename = new File(systemFontConfigLocation, FONTS_CONFIG);
+ @VisibleForTesting
+ public static void buildSystemFallback(String xmlPath, String fontDir,
+ ArrayMap<String, Typeface> fontMap, ArrayMap<String, FontFamily[]> fallbackMap) {
try {
- FileInputStream fontsIn = new FileInputStream(configFilename);
- FontConfig fontConfig = FontListParser.parse(fontsIn);
+ final FileInputStream fontsIn = new FileInputStream(xmlPath);
+ final FontConfig fontConfig = FontListParser.parse(fontsIn);
- Map<String, ByteBuffer> bufferForPath = new HashMap<String, ByteBuffer>();
+ final HashMap<String, ByteBuffer> bufferCache = new HashMap<String, ByteBuffer>();
+ final FontConfig.Family[] xmlFamilies = fontConfig.getFamilies();
- List<FontFamily> familyList = new ArrayList<FontFamily>();
- // Note that the default typeface is always present in the fallback list;
- // this is an enhancement from pre-Minikin behavior.
- for (int i = 0; i < fontConfig.getFamilies().length; i++) {
- FontConfig.Family f = fontConfig.getFamilies()[i];
- if (i == 0 || f.getName() == null) {
- FontFamily family = makeFamilyFromParsed(f, bufferForPath);
- if (family != null) {
- familyList.add(family);
- }
+ final ArrayMap<String, ArrayList<FontFamily>> fallbackListMap = new ArrayMap<>();
+ // First traverse families which have a 'name' attribute to create fallback map.
+ for (final FontConfig.Family xmlFamily : xmlFamilies) {
+ final String familyName = xmlFamily.getName();
+ if (familyName == null) {
+ continue;
+ }
+ final FontFamily family = createFontFamily(
+ xmlFamily.getName(), Arrays.asList(xmlFamily.getFonts()),
+ xmlFamily.getLanguage(), xmlFamily.getVariant(), bufferCache, fontDir);
+ if (family == null) {
+ continue;
+ }
+ final ArrayList<FontFamily> fallback = new ArrayList<>();
+ fallback.add(family);
+ fallbackListMap.put(familyName, fallback);
+ }
+
+ // Then, add fallback fonts to the each fallback map.
+ for (int i = 0; i < xmlFamilies.length; i++) {
+ final FontConfig.Family xmlFamily = xmlFamilies[i];
+ // The first family (usually the sans-serif family) is always placed immediately
+ // after the primary family in the fallback.
+ if (i == 0 || xmlFamily.getName() == null) {
+ pushFamilyToFallback(xmlFamily, fallbackListMap, bufferCache, fontDir);
}
}
- sFallbackFonts = familyList.toArray(new FontFamily[familyList.size()]);
- setDefault(Typeface.createFromFamilies(sFallbackFonts));
- Map<String, Typeface> systemFonts = new HashMap<String, Typeface>();
- for (int i = 0; i < fontConfig.getFamilies().length; i++) {
- Typeface typeface;
- FontConfig.Family f = fontConfig.getFamilies()[i];
- if (f.getName() != null) {
- if (i == 0) {
- // The first entry is the default typeface; no sense in
- // duplicating the corresponding FontFamily.
- typeface = sDefaultTypeface;
- } else {
- FontFamily fontFamily = makeFamilyFromParsed(f, bufferForPath);
- if (fontFamily == null) {
- continue;
- }
- FontFamily[] families = { fontFamily };
- typeface = Typeface.createFromFamiliesWithDefault(families,
- RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE);
- }
- systemFonts.put(f.getName(), typeface);
+ // Build the font map and fallback map.
+ for (int i = 0; i < fallbackListMap.size(); i++) {
+ final String fallbackName = fallbackListMap.keyAt(i);
+ final List<FontFamily> familyList = fallbackListMap.valueAt(i);
+ final FontFamily[] families = familyList.toArray(new FontFamily[familyList.size()]);
+
+ fallbackMap.put(fallbackName, families);
+ final long[] ptrArray = new long[families.length];
+ for (int j = 0; j < families.length; j++) {
+ ptrArray[j] = families[j].mNativePtr;
}
+ fontMap.put(fallbackName, new Typeface(nativeCreateFromArray(
+ ptrArray, RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE)));
}
- for (FontConfig.Alias alias : fontConfig.getAliases()) {
- Typeface base = systemFonts.get(alias.getToName());
+
+ // Insert alias to font maps.
+ for (final FontConfig.Alias alias : fontConfig.getAliases()) {
+ Typeface base = fontMap.get(alias.getToName());
Typeface newFace = base;
int weight = alias.getWeight();
if (weight != 400) {
newFace = new Typeface(nativeCreateWeightAlias(base.native_instance, weight));
}
- systemFonts.put(alias.getName(), newFace);
+ fontMap.put(alias.getName(), newFace);
}
- sSystemFontMap = systemFonts;
-
} catch (RuntimeException e) {
Log.w(TAG, "Didn't create default family (most likely, non-Minikin build)", e);
// TODO: normal in non-Minikin case, remove or make error when Minikin-only
} catch (FileNotFoundException e) {
- Log.e(TAG, "Error opening " + configFilename, e);
+ Log.e(TAG, "Error opening " + xmlPath, e);
} catch (IOException e) {
- Log.e(TAG, "Error reading " + configFilename, e);
+ Log.e(TAG, "Error reading " + xmlPath, e);
} catch (XmlPullParserException e) {
- Log.e(TAG, "XML parse exception for " + configFilename, e);
+ Log.e(TAG, "XML parse exception for " + xmlPath, e);
}
}
static {
- init();
+ final ArrayMap<String, Typeface> systemFontMap = new ArrayMap<>();
+ final ArrayMap<String, FontFamily[]> systemFallbackMap = new ArrayMap<>();
+ buildSystemFallback("/system/etc/fonts.xml", "/system/fonts/", systemFontMap,
+ systemFallbackMap);
+ sSystemFontMap = Collections.unmodifiableMap(systemFontMap);
+ sSystemFallbackMap = Collections.unmodifiableMap(systemFallbackMap);
+
+ setDefault(sSystemFontMap.get(DEFAULT_FAMILY));
+
// Set up defaults and typefaces exposed in public API
DEFAULT = create((String) null, 0);
DEFAULT_BOLD = create((String) null, Typeface.BOLD);
@@ -1008,10 +1090,6 @@
}
- private static File getSystemFontConfigLocation() {
- return new File("/system/etc/");
- }
-
@Override
protected void finalize() throws Throwable {
try {
diff --git a/keystore/tests/Android.mk b/keystore/tests/Android.mk
deleted file mode 100644
index a740b13..0000000
--- a/keystore/tests/Android.mk
+++ /dev/null
@@ -1,16 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-# We only want this apk build for tests.
-LOCAL_MODULE_TAGS := tests
-LOCAL_CERTIFICATE := platform
-
-LOCAL_JAVA_LIBRARIES := android.test.runner bouncycastle conscrypt
-LOCAL_STATIC_JAVA_LIBRARIES := junit legacy-android-test
-
-# Include all test java files.
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_PACKAGE_NAME := KeyStoreTests
-
-include $(BUILD_PACKAGE)
diff --git a/keystore/tests/AndroidManifest.xml b/keystore/tests/AndroidManifest.xml
deleted file mode 100644
index 415442f..0000000
--- a/keystore/tests/AndroidManifest.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="android.security.tests"
- android:sharedUserId="android.uid.system">
-
- <application>
- <uses-library android:name="android.test.runner" />
- </application>
-
- <instrumentation android:name="android.test.InstrumentationTestRunner"
- android:targetPackage="android.security.tests"
- android:label="KeyStore Tests">
- </instrumentation>
-</manifest>
diff --git a/keystore/tests/src/android/security/KeyPairGeneratorSpecTest.java b/keystore/tests/src/android/security/KeyPairGeneratorSpecTest.java
deleted file mode 100644
index bc8dd13..0000000
--- a/keystore/tests/src/android/security/KeyPairGeneratorSpecTest.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.security;
-
-import android.test.AndroidTestCase;
-
-import java.math.BigInteger;
-import java.util.Date;
-
-import javax.security.auth.x500.X500Principal;
-
-public class KeyPairGeneratorSpecTest extends AndroidTestCase {
- private static final String TEST_ALIAS_1 = "test1";
-
- private static final X500Principal TEST_DN_1 = new X500Principal("CN=test1");
-
- private static final long NOW_MILLIS = System.currentTimeMillis();
-
- private static final BigInteger SERIAL_1 = BigInteger.ONE;
-
- /* We have to round this off because X509v3 doesn't store milliseconds. */
- private static final Date NOW = new Date(NOW_MILLIS - (NOW_MILLIS % 1000L));
-
- @SuppressWarnings("deprecation")
- private static final Date NOW_PLUS_10_YEARS = new Date(NOW.getYear() + 10, 0, 1);
-
- public void testConstructor_Success() throws Exception {
- KeyPairGeneratorSpec spec =
- new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, "RSA", 1024, null, TEST_DN_1,
- SERIAL_1, NOW, NOW_PLUS_10_YEARS, 0);
-
- assertEquals("Context should be the one specified", getContext(), spec.getContext());
-
- assertEquals("Alias should be the one specified", TEST_ALIAS_1, spec.getKeystoreAlias());
-
- assertEquals("Key algorithm should be the one specified", "RSA", spec.getKeyType());
-
- assertEquals("Key size should be the one specified", 1024, spec.getKeySize());
-
- assertEquals("subjectDN should be the one specified", TEST_DN_1, spec.getSubjectDN());
-
- assertEquals("startDate should be the one specified", NOW, spec.getStartDate());
-
- assertEquals("endDate should be the one specified", NOW_PLUS_10_YEARS, spec.getEndDate());
- }
-
- public void testBuilder_Success() throws Exception {
- KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(getContext())
- .setAlias(TEST_ALIAS_1)
- .setKeyType("RSA")
- .setKeySize(1024)
- .setSubject(TEST_DN_1)
- .setSerialNumber(SERIAL_1)
- .setStartDate(NOW)
- .setEndDate(NOW_PLUS_10_YEARS)
- .setEncryptionRequired()
- .build();
-
- assertEquals("Context should be the one specified", getContext(), spec.getContext());
-
- assertEquals("Alias should be the one specified", TEST_ALIAS_1, spec.getKeystoreAlias());
-
- assertEquals("Key algorithm should be the one specified", "RSA", spec.getKeyType());
-
- assertEquals("Key size should be the one specified", 1024, spec.getKeySize());
-
- assertEquals("subjectDN should be the one specified", TEST_DN_1, spec.getSubjectDN());
-
- assertEquals("startDate should be the one specified", NOW, spec.getStartDate());
-
- assertEquals("endDate should be the one specified", NOW_PLUS_10_YEARS, spec.getEndDate());
-
- assertEquals("encryption flag should be on", KeyStore.FLAG_ENCRYPTED, spec.getFlags());
- }
-
- public void testConstructor_NullContext_Failure() throws Exception {
- try {
- new KeyPairGeneratorSpec(null, TEST_ALIAS_1, "RSA", 1024, null, TEST_DN_1, SERIAL_1, NOW,
- NOW_PLUS_10_YEARS, 0);
- fail("Should throw IllegalArgumentException when context is null");
- } catch (IllegalArgumentException success) {
- }
- }
-
- public void testConstructor_NullKeystoreAlias_Failure() throws Exception {
- try {
- new KeyPairGeneratorSpec(getContext(), null, "RSA", 1024, null, TEST_DN_1, SERIAL_1, NOW,
- NOW_PLUS_10_YEARS, 0);
- fail("Should throw IllegalArgumentException when keystoreAlias is null");
- } catch (IllegalArgumentException success) {
- }
- }
-
- public void testConstructor_NullSubjectDN_Failure() throws Exception {
- try {
- new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, "RSA", 1024, null, null, SERIAL_1, NOW,
- NOW_PLUS_10_YEARS, 0);
- fail("Should throw IllegalArgumentException when subjectDN is null");
- } catch (IllegalArgumentException success) {
- }
- }
-
- public void testConstructor_NullSerial_Failure() throws Exception {
- try {
- new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, "RSA", 1024, null, TEST_DN_1, null, NOW,
- NOW_PLUS_10_YEARS, 0);
- fail("Should throw IllegalArgumentException when startDate is null");
- } catch (IllegalArgumentException success) {
- }
- }
-
- public void testConstructor_NullStartDate_Failure() throws Exception {
- try {
- new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, "RSA", 1024, null, TEST_DN_1, SERIAL_1,
- null, NOW_PLUS_10_YEARS, 0);
- fail("Should throw IllegalArgumentException when startDate is null");
- } catch (IllegalArgumentException success) {
- }
- }
-
- public void testConstructor_NullEndDate_Failure() throws Exception {
- try {
- new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, "RSA", 1024, null, TEST_DN_1, SERIAL_1,
- NOW, null, 0);
- fail("Should throw IllegalArgumentException when keystoreAlias is null");
- } catch (IllegalArgumentException success) {
- }
- }
-
- public void testConstructor_EndBeforeStart_Failure() throws Exception {
- try {
- new KeyPairGeneratorSpec(getContext(), TEST_ALIAS_1, "RSA", 1024, null, TEST_DN_1, SERIAL_1,
- NOW_PLUS_10_YEARS, NOW, 0);
- fail("Should throw IllegalArgumentException when end is before start");
- } catch (IllegalArgumentException success) {
- }
- }
-}
diff --git a/keystore/tests/src/android/security/KeyStoreTest.java b/keystore/tests/src/android/security/KeyStoreTest.java
deleted file mode 100644
index 1d5bf12..0000000
--- a/keystore/tests/src/android/security/KeyStoreTest.java
+++ /dev/null
@@ -1,974 +0,0 @@
-/*
- * Copyright (C) 2009 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.security;
-
-import android.app.Activity;
-import android.os.Binder;
-import android.os.IBinder;
-import android.os.Process;
-import android.security.keymaster.ExportResult;
-import android.security.keymaster.KeyCharacteristics;
-import android.security.keymaster.KeymasterArguments;
-import android.security.keymaster.KeymasterBlob;
-import android.security.keymaster.KeymasterDefs;
-import android.security.keymaster.OperationResult;
-import android.test.ActivityUnitTestCase;
-import android.test.AssertionFailedError;
-import android.test.MoreAsserts;
-import android.test.suitebuilder.annotation.MediumTest;
-import com.android.org.conscrypt.NativeConstants;
-import java.nio.charset.StandardCharsets;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.security.spec.RSAKeyGenParameterSpec;
-
-/**
- * Junit / Instrumentation test case for KeyStore class
- *
- * Running the test suite:
- *
- * runtest keystore-unit
- *
- * Or this individual test case:
- *
- * runtest --path frameworks/base/keystore/tests/src/android/security/KeyStoreTest.java
- */
-@MediumTest
-public class KeyStoreTest extends ActivityUnitTestCase<Activity> {
- private static final String TEST_PASSWD = "12345678";
- private static final String TEST_PASSWD2 = "87654321";
- private static final String TEST_KEYNAME = "test-key";
- private static final String TEST_KEYNAME1 = "test-key.1";
- private static final String TEST_KEYNAME2 = "test-key\02";
- private static final byte[] TEST_KEYVALUE = "test value".getBytes(StandardCharsets.UTF_8);
-
- // "Hello, World" in Chinese
- private static final String TEST_I18N_KEY = "\u4F60\u597D, \u4E16\u754C";
- private static final byte[] TEST_I18N_VALUE = TEST_I18N_KEY.getBytes(StandardCharsets.UTF_8);
-
- // Test vector data for signatures
- private static final int RSA_KEY_SIZE = 1024;
- private static final byte[] TEST_DATA = new byte[RSA_KEY_SIZE / 8];
- static {
- for (int i = 0; i < TEST_DATA.length; i++) {
- TEST_DATA[i] = (byte) i;
- }
- }
-
- private KeyStore mKeyStore = null;
-
- public KeyStoreTest() {
- super(Activity.class);
- }
-
- private static final byte[] PRIVKEY_BYTES = hexToBytes(
- "308204BE020100300D06092A864886F70D0101010500048204A8308204A4020100028201" +
- "0100E0473E8AB8F2284FEB9E742FF9748FA118ED98633C92F52AEB7A2EBE0D3BE60329BE" +
- "766AD10EB6A515D0D2CFD9BEA7930F0C306537899F7958CD3E85B01F8818524D312584A9" +
- "4B251E3625B54141EDBFEE198808E1BB97FC7CB49B9EAAAF68E9C98D7D0EDC53BBC0FA00" +
- "34356D6305FBBCC3C7001405386ABBC873CB0F3EF7425F3D33DF7B315AE036D2A0B66AFD" +
- "47503B169BF36E3B5162515B715FDA83DEAF2C58AEB9ABFB3097C3CC9DD9DBE5EF296C17" +
- "6139028E8A671E63056D45F40188D2C4133490845DE52C2534E9C6B2478C07BDAE928823" +
- "B62D066C7770F9F63F3DBA247F530844747BE7AAA85D853B8BD244ACEC3DE3C89AB46453" +
- "AB4D24C3AC6902030100010282010037784776A5F17698F5AC960DFB83A1B67564E648BD" +
- "0597CF8AB8087186F2669C27A9ECBDD480F0197A80D07309E6C6A96F925331E57F8B4AC6" +
- "F4D45EDA45A23269C09FC428C07A4E6EDF738A15DEC97FABD2F2BB47A14F20EA72FCFE4C" +
- "36E01ADA77BD137CD8D4DA10BB162E94A4662971F175F985FA188F056CB97EE2816F43AB" +
- "9D3747612486CDA8C16196C30818A995EC85D38467791267B3BF21F273710A6925862576" +
- "841C5B6712C12D4BD20A2F3299ADB7C135DA5E9515ABDA76E7CAF2A3BE80551D073B78BF" +
- "1162C48AD2B7F4743A0238EE4D252F7D5E7E6533CCAE64CCB39360075A2FD1E034EC3AE5" +
- "CE9C408CCBF0E25E4114021687B3DD4754AE8102818100F541884BC3737B2922D4119EF4" +
- "5E2DEE2CD4CBB75F45505A157AA5009F99C73A2DF0724AC46024306332EA898177634546" +
- "5DC6DF1E0A6F140AFF3B7396E6A8994AC5DAA96873472FE37749D14EB3E075E629DBEB35" +
- "83338A6F3649D0A2654A7A42FD9AB6BFA4AC4D481D390BB229B064BDC311CC1BE1B63189" +
- "DA7C40CDECF2B102818100EA1A742DDB881CEDB7288C87E38D868DD7A409D15A43F445D5" +
- "377A0B5731DDBFCA2DAF28A8E13CD5C0AFCEC3347D74A39E235A3CD9633F274DE2B94F92" +
- "DF43833911D9E9F1CF58F27DE2E08FF45964C720D3EC2139DC7CAFC912953CDECB2F355A" +
- "2E2C35A50FAD754CB3B23166424BA3B6E3112A2B898C38C5C15EDB238693390281805182" +
- "8F1EC6FD996029901BAF1D7E337BA5F0AF27E984EAD895ACE62BD7DF4EE45A224089F2CC" +
- "151AF3CD173FCE0474BCB04F386A2CDCC0E0036BA2419F54579262D47100BE931984A3EF" +
- "A05BECF141574DC079B3A95C4A83E6C43F3214D6DF32D512DE198085E531E616B83FD7DD" +
- "9D1F4E2607C3333D07C55D107D1D3893587102818100DB4FB50F50DE8EDB53FF34C80931" +
- "88A0512867DA2CCA04897759E587C244010DAF8664D59E8083D16C164789301F67A9F078" +
- "060D834A2ADBD367575B68A8A842C2B02A89B3F31FCCEC8A22FE395795C5C6C7422B4E5D" +
- "74A1E9A8F30E7759B9FC2D639C1F15673E84E93A5EF1506F4315383C38D45CBD1B14048F" +
- "4721DC82326102818100D8114593AF415FB612DBF1923710D54D07486205A76A3B431949" +
- "68C0DFF1F11EF0F61A4A337D5FD3741BBC9640E447B8B6B6C47C3AC1204357D3B0C55BA9" +
- "286BDA73F629296F5FA9146D8976357D3C751E75148696A40B74685C82CE30902D639D72" +
- "4FF24D5E2E9407EE34EDED2E3B4DF65AA9BCFEB6DF28D07BA6903F165768");
-
- private static final byte[] AES256_BYTES = hexToBytes(
- "0CC175B9C0F1B6A831C399E269772661CEC520EA51EA0A47E87295FA3245A605");
-
- private static byte[] hexToBytes(String s) {
- int len = s.length();
- byte[] data = new byte[len / 2];
- for (int i = 0; i < len; i += 2) {
- data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(
- s.charAt(i + 1), 16));
- }
- return data;
- }
-
- @Override
- protected void setUp() throws Exception {
- mKeyStore = KeyStore.getInstance();
- if (mKeyStore.state() != KeyStore.State.UNINITIALIZED) {
- mKeyStore.reset();
- }
- assertEquals("KeyStore should be in an uninitialized state",
- KeyStore.State.UNINITIALIZED, mKeyStore.state());
- super.setUp();
- }
-
- @Override
- protected void tearDown() throws Exception {
- mKeyStore.reset();
- super.tearDown();
- }
-
- public void testState() throws Exception {
- assertEquals(KeyStore.State.UNINITIALIZED, mKeyStore.state());
- }
-
- public void testPassword() throws Exception {
- assertTrue(mKeyStore.onUserPasswordChanged(TEST_PASSWD));
- assertEquals(KeyStore.State.UNLOCKED, mKeyStore.state());
- }
-
- public void testGet() throws Exception {
- assertNull(mKeyStore.get(TEST_KEYNAME));
- mKeyStore.onUserPasswordChanged(TEST_PASSWD);
- assertNull(mKeyStore.get(TEST_KEYNAME));
- assertTrue(mKeyStore.put(TEST_KEYNAME, TEST_KEYVALUE, KeyStore.UID_SELF,
- KeyStore.FLAG_ENCRYPTED));
- assertTrue(Arrays.equals(TEST_KEYVALUE, mKeyStore.get(TEST_KEYNAME)));
- }
-
- public void testPut() throws Exception {
- assertNull(mKeyStore.get(TEST_KEYNAME));
- assertFalse(mKeyStore.put(TEST_KEYNAME, TEST_KEYVALUE, KeyStore.UID_SELF,
- KeyStore.FLAG_ENCRYPTED));
- assertFalse(mKeyStore.contains(TEST_KEYNAME));
- mKeyStore.onUserPasswordChanged(TEST_PASSWD);
- assertTrue(mKeyStore.put(TEST_KEYNAME, TEST_KEYVALUE, KeyStore.UID_SELF,
- KeyStore.FLAG_ENCRYPTED));
- assertTrue(Arrays.equals(TEST_KEYVALUE, mKeyStore.get(TEST_KEYNAME)));
- }
-
- public void testPut_grantedUid_Wifi() throws Exception {
- assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.WIFI_UID));
- assertFalse(mKeyStore.put(TEST_KEYNAME, TEST_KEYVALUE, Process.WIFI_UID,
- KeyStore.FLAG_ENCRYPTED));
- assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.WIFI_UID));
- mKeyStore.onUserPasswordChanged(TEST_PASSWD);
- assertTrue(mKeyStore.put(TEST_KEYNAME, TEST_KEYVALUE, Process.WIFI_UID,
- KeyStore.FLAG_ENCRYPTED));
- assertTrue(mKeyStore.contains(TEST_KEYNAME, Process.WIFI_UID));
- }
-
- public void testPut_ungrantedUid_Bluetooth() throws Exception {
- assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.BLUETOOTH_UID));
- assertFalse(mKeyStore.put(TEST_KEYNAME, TEST_KEYVALUE, Process.BLUETOOTH_UID,
- KeyStore.FLAG_ENCRYPTED));
- assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.BLUETOOTH_UID));
- mKeyStore.onUserPasswordChanged(TEST_PASSWD);
- assertFalse(mKeyStore.put(TEST_KEYNAME, TEST_KEYVALUE, Process.BLUETOOTH_UID,
- KeyStore.FLAG_ENCRYPTED));
- assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.BLUETOOTH_UID));
- }
-
- public void testI18n() throws Exception {
- assertFalse(mKeyStore.put(TEST_I18N_KEY, TEST_I18N_VALUE, KeyStore.UID_SELF,
- KeyStore.FLAG_ENCRYPTED));
- assertFalse(mKeyStore.contains(TEST_I18N_KEY));
- mKeyStore.onUserPasswordChanged(TEST_I18N_KEY);
- assertTrue(mKeyStore.put(TEST_I18N_KEY, TEST_I18N_VALUE, KeyStore.UID_SELF,
- KeyStore.FLAG_ENCRYPTED));
- assertTrue(mKeyStore.contains(TEST_I18N_KEY));
- }
-
- public void testDelete() throws Exception {
- assertFalse(mKeyStore.delete(TEST_KEYNAME));
- mKeyStore.onUserPasswordChanged(TEST_PASSWD);
- assertFalse(mKeyStore.delete(TEST_KEYNAME));
-
- assertTrue(mKeyStore.put(TEST_KEYNAME, TEST_KEYVALUE, KeyStore.UID_SELF,
- KeyStore.FLAG_ENCRYPTED));
- assertTrue(Arrays.equals(TEST_KEYVALUE, mKeyStore.get(TEST_KEYNAME)));
- assertTrue(mKeyStore.delete(TEST_KEYNAME));
- assertNull(mKeyStore.get(TEST_KEYNAME));
- }
-
- public void testDelete_grantedUid_Wifi() throws Exception {
- assertFalse(mKeyStore.delete(TEST_KEYNAME, Process.WIFI_UID));
- mKeyStore.onUserPasswordChanged(TEST_PASSWD);
- assertFalse(mKeyStore.delete(TEST_KEYNAME, Process.WIFI_UID));
-
- assertTrue(mKeyStore.put(TEST_KEYNAME, TEST_KEYVALUE, Process.WIFI_UID,
- KeyStore.FLAG_ENCRYPTED));
- assertTrue(mKeyStore.contains(TEST_KEYNAME, Process.WIFI_UID));
- assertTrue(mKeyStore.delete(TEST_KEYNAME, Process.WIFI_UID));
- assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.WIFI_UID));
- }
-
- public void testDelete_ungrantedUid_Bluetooth() throws Exception {
- assertFalse(mKeyStore.delete(TEST_KEYNAME, Process.BLUETOOTH_UID));
- mKeyStore.onUserPasswordChanged(TEST_PASSWD);
- assertFalse(mKeyStore.delete(TEST_KEYNAME, Process.BLUETOOTH_UID));
-
- assertFalse(mKeyStore.put(TEST_KEYNAME, TEST_KEYVALUE, Process.BLUETOOTH_UID,
- KeyStore.FLAG_ENCRYPTED));
- assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.BLUETOOTH_UID));
- assertFalse(mKeyStore.delete(TEST_KEYNAME, Process.BLUETOOTH_UID));
- assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.BLUETOOTH_UID));
- }
-
- public void testContains() throws Exception {
- assertFalse(mKeyStore.contains(TEST_KEYNAME));
-
- assertTrue(mKeyStore.onUserPasswordChanged(TEST_PASSWD));
- assertFalse(mKeyStore.contains(TEST_KEYNAME));
-
- assertTrue(mKeyStore.put(TEST_KEYNAME, TEST_KEYVALUE, KeyStore.UID_SELF,
- KeyStore.FLAG_ENCRYPTED));
- assertTrue(mKeyStore.contains(TEST_KEYNAME));
- }
-
- public void testContains_grantedUid_Wifi() throws Exception {
- assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.WIFI_UID));
-
- assertTrue(mKeyStore.onUserPasswordChanged(TEST_PASSWD));
- assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.WIFI_UID));
-
- assertTrue(mKeyStore.put(TEST_KEYNAME, TEST_KEYVALUE, Process.WIFI_UID,
- KeyStore.FLAG_ENCRYPTED));
- assertTrue(mKeyStore.contains(TEST_KEYNAME, Process.WIFI_UID));
- }
-
- public void testContains_grantedUid_Bluetooth() throws Exception {
- assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.BLUETOOTH_UID));
-
- assertTrue(mKeyStore.onUserPasswordChanged(TEST_PASSWD));
- assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.BLUETOOTH_UID));
-
- assertFalse(mKeyStore.put(TEST_KEYNAME, TEST_KEYVALUE, Process.BLUETOOTH_UID,
- KeyStore.FLAG_ENCRYPTED));
- assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.BLUETOOTH_UID));
- }
-
- public void testList() throws Exception {
- String[] emptyResult = mKeyStore.list(TEST_KEYNAME);
- assertNotNull(emptyResult);
- assertEquals(0, emptyResult.length);
-
- mKeyStore.onUserPasswordChanged(TEST_PASSWD);
- mKeyStore.put(TEST_KEYNAME1, TEST_KEYVALUE, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED);
- mKeyStore.put(TEST_KEYNAME2, TEST_KEYVALUE, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED);
-
- String[] results = mKeyStore.list(TEST_KEYNAME);
- assertEquals(new HashSet(Arrays.asList(TEST_KEYNAME1.substring(TEST_KEYNAME.length()),
- TEST_KEYNAME2.substring(TEST_KEYNAME.length()))),
- new HashSet(Arrays.asList(results)));
- }
-
- public void testList_ungrantedUid_Bluetooth() throws Exception {
- String[] results1 = mKeyStore.list(TEST_KEYNAME, Process.BLUETOOTH_UID);
- assertEquals(0, results1.length);
-
- mKeyStore.onUserPasswordChanged(TEST_PASSWD);
- mKeyStore.put(TEST_KEYNAME1, TEST_KEYVALUE, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED);
- mKeyStore.put(TEST_KEYNAME2, TEST_KEYVALUE, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED);
-
- String[] results2 = mKeyStore.list(TEST_KEYNAME, Process.BLUETOOTH_UID);
- assertEquals(0, results2.length);
- }
-
- public void testList_grantedUid_Wifi() throws Exception {
- String[] results1 = mKeyStore.list(TEST_KEYNAME, Process.WIFI_UID);
- assertNotNull(results1);
- assertEquals(0, results1.length);
-
- mKeyStore.onUserPasswordChanged(TEST_PASSWD);
- mKeyStore.put(TEST_KEYNAME1, TEST_KEYVALUE, Process.WIFI_UID, KeyStore.FLAG_ENCRYPTED);
- mKeyStore.put(TEST_KEYNAME2, TEST_KEYVALUE, Process.WIFI_UID, KeyStore.FLAG_ENCRYPTED);
-
- String[] results2 = mKeyStore.list(TEST_KEYNAME, Process.WIFI_UID);
- assertEquals(new HashSet(Arrays.asList(TEST_KEYNAME1.substring(TEST_KEYNAME.length()),
- TEST_KEYNAME2.substring(TEST_KEYNAME.length()))),
- new HashSet(Arrays.asList(results2)));
- }
-
- public void testList_grantedUid_Vpn() throws Exception {
- String[] results1 = mKeyStore.list(TEST_KEYNAME, Process.VPN_UID);
- assertNotNull(results1);
- assertEquals(0, results1.length);
-
- mKeyStore.onUserPasswordChanged(TEST_PASSWD);
- mKeyStore.put(TEST_KEYNAME1, TEST_KEYVALUE, Process.VPN_UID, KeyStore.FLAG_ENCRYPTED);
- mKeyStore.put(TEST_KEYNAME2, TEST_KEYVALUE, Process.VPN_UID, KeyStore.FLAG_ENCRYPTED);
-
- String[] results2 = mKeyStore.list(TEST_KEYNAME, Process.VPN_UID);
- assertEquals(new HashSet(Arrays.asList(TEST_KEYNAME1.substring(TEST_KEYNAME.length()),
- TEST_KEYNAME2.substring(TEST_KEYNAME.length()))),
- new HashSet(Arrays.asList(results2)));
- }
-
- public void testLock() throws Exception {
- assertFalse(mKeyStore.lock());
-
- mKeyStore.onUserPasswordChanged(TEST_PASSWD);
- assertEquals(KeyStore.State.UNLOCKED, mKeyStore.state());
-
- assertTrue(mKeyStore.lock());
- assertEquals(KeyStore.State.LOCKED, mKeyStore.state());
- }
-
- public void testUnlock() throws Exception {
- mKeyStore.onUserPasswordChanged(TEST_PASSWD);
- assertEquals(KeyStore.State.UNLOCKED, mKeyStore.state());
- mKeyStore.lock();
-
- assertFalse(mKeyStore.unlock(TEST_PASSWD2));
- assertTrue(mKeyStore.unlock(TEST_PASSWD));
- }
-
- public void testIsEmpty() throws Exception {
- assertTrue(mKeyStore.isEmpty());
- mKeyStore.onUserPasswordChanged(TEST_PASSWD);
- assertTrue(mKeyStore.isEmpty());
- mKeyStore.put(TEST_KEYNAME, TEST_KEYVALUE, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED);
- assertFalse(mKeyStore.isEmpty());
- mKeyStore.reset();
- assertTrue(mKeyStore.isEmpty());
- }
-
- public void testGenerate_NotInitialized_Fail() throws Exception {
- assertFalse("Should fail when keystore is not initialized",
- mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeConstants.EVP_PKEY_RSA,
- RSA_KEY_SIZE, KeyStore.FLAG_ENCRYPTED, null));
- }
-
- public void testGenerate_Locked_Fail() throws Exception {
- mKeyStore.onUserPasswordChanged(TEST_PASSWD);
- mKeyStore.lock();
- assertFalse("Should fail when keystore is locked",
- mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeConstants.EVP_PKEY_RSA,
- RSA_KEY_SIZE, KeyStore.FLAG_ENCRYPTED, null));
- }
-
- public void testGenerate_Success() throws Exception {
- assertTrue(mKeyStore.onUserPasswordChanged(TEST_PASSWD));
-
- assertTrue("Should be able to generate key when unlocked",
- mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeConstants.EVP_PKEY_RSA,
- RSA_KEY_SIZE, KeyStore.FLAG_ENCRYPTED, null));
- assertTrue(mKeyStore.contains(TEST_KEYNAME));
- assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.WIFI_UID));
- }
-
- public void testGenerate_grantedUid_Wifi_Success() throws Exception {
- assertTrue(mKeyStore.onUserPasswordChanged(TEST_PASSWD));
-
- assertTrue("Should be able to generate key when unlocked",
- mKeyStore.generate(TEST_KEYNAME, Process.WIFI_UID, NativeConstants.EVP_PKEY_RSA,
- RSA_KEY_SIZE, KeyStore.FLAG_ENCRYPTED, null));
- assertTrue(mKeyStore.contains(TEST_KEYNAME, Process.WIFI_UID));
- assertFalse(mKeyStore.contains(TEST_KEYNAME));
- }
-
- public void testGenerate_ungrantedUid_Bluetooth_Failure() throws Exception {
- assertTrue(mKeyStore.onUserPasswordChanged(TEST_PASSWD));
-
- assertFalse(mKeyStore.generate(TEST_KEYNAME, Process.BLUETOOTH_UID,
- NativeConstants.EVP_PKEY_RSA, RSA_KEY_SIZE, KeyStore.FLAG_ENCRYPTED, null));
- assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.BLUETOOTH_UID));
- assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.WIFI_UID));
- assertFalse(mKeyStore.contains(TEST_KEYNAME));
- }
-
- public void testImport_Success() throws Exception {
- assertTrue(mKeyStore.onUserPasswordChanged(TEST_PASSWD));
-
- assertTrue("Should be able to import key when unlocked", mKeyStore.importKey(TEST_KEYNAME,
- PRIVKEY_BYTES, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
- assertTrue(mKeyStore.contains(TEST_KEYNAME));
- assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.WIFI_UID));
- }
-
- public void testImport_grantedUid_Wifi_Success() throws Exception {
- assertTrue(mKeyStore.onUserPasswordChanged(TEST_PASSWD));
-
- assertTrue("Should be able to import key when unlocked", mKeyStore.importKey(TEST_KEYNAME,
- PRIVKEY_BYTES, Process.WIFI_UID, KeyStore.FLAG_ENCRYPTED));
- assertTrue(mKeyStore.contains(TEST_KEYNAME, Process.WIFI_UID));
- assertFalse(mKeyStore.contains(TEST_KEYNAME));
- }
-
- public void testImport_ungrantedUid_Bluetooth_Failure() throws Exception {
- assertTrue(mKeyStore.onUserPasswordChanged(TEST_PASSWD));
-
- assertFalse(mKeyStore.importKey(TEST_KEYNAME, PRIVKEY_BYTES, Process.BLUETOOTH_UID,
- KeyStore.FLAG_ENCRYPTED));
- assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.BLUETOOTH_UID));
- assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.WIFI_UID));
- assertFalse(mKeyStore.contains(TEST_KEYNAME));
- }
-
- public void testImport_Failure_BadEncoding() throws Exception {
- mKeyStore.onUserPasswordChanged(TEST_PASSWD);
-
- assertFalse("Invalid DER-encoded key should not be imported", mKeyStore.importKey(
- TEST_KEYNAME, TEST_DATA, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
- assertFalse(mKeyStore.contains(TEST_KEYNAME));
- assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.WIFI_UID));
- }
-
- public void testSign_Success() throws Exception {
- mKeyStore.onUserPasswordChanged(TEST_PASSWD);
-
- assertTrue(mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeConstants.EVP_PKEY_RSA,
- RSA_KEY_SIZE, KeyStore.FLAG_ENCRYPTED, null));
- assertTrue(mKeyStore.contains(TEST_KEYNAME));
- final byte[] signature = mKeyStore.sign(TEST_KEYNAME, TEST_DATA);
-
- assertNotNull("Signature should not be null", signature);
- }
-
- public void testVerify_Success() throws Exception {
- mKeyStore.onUserPasswordChanged(TEST_PASSWD);
-
- assertTrue(mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeConstants.EVP_PKEY_RSA,
- RSA_KEY_SIZE, KeyStore.FLAG_ENCRYPTED, null));
- assertTrue(mKeyStore.contains(TEST_KEYNAME));
- final byte[] signature = mKeyStore.sign(TEST_KEYNAME, TEST_DATA);
-
- assertNotNull("Signature should not be null", signature);
-
- assertTrue("Signature should verify with same data",
- mKeyStore.verify(TEST_KEYNAME, TEST_DATA, signature));
- }
-
- public void testSign_NotInitialized_Failure() throws Exception {
- assertNull("Should not be able to sign without first initializing the keystore",
- mKeyStore.sign(TEST_KEYNAME, TEST_DATA));
- }
-
- public void testSign_NotGenerated_Failure() throws Exception {
- mKeyStore.onUserPasswordChanged(TEST_PASSWD);
-
- assertNull("Should not be able to sign without first generating keys",
- mKeyStore.sign(TEST_KEYNAME, TEST_DATA));
- }
-
- public void testGrant_Generated_Success() throws Exception {
- assertTrue("Password should work for keystore",
- mKeyStore.onUserPasswordChanged(TEST_PASSWD));
-
- assertTrue("Should be able to generate key for testcase",
- mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeConstants.EVP_PKEY_RSA,
- RSA_KEY_SIZE, KeyStore.FLAG_ENCRYPTED, null));
-
- assertNotNull("Should be able to grant key to other user",
- mKeyStore.grant(TEST_KEYNAME, 0));
- }
-
- public void testGrant_Imported_Success() throws Exception {
- assertTrue("Password should work for keystore", mKeyStore.onUserPasswordChanged(TEST_PASSWD));
-
- assertTrue("Should be able to import key for testcase", mKeyStore.importKey(TEST_KEYNAME,
- PRIVKEY_BYTES, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-
- assertNotNull("Should be able to grant key to other user", mKeyStore.grant(TEST_KEYNAME, 0));
- }
-
- public void testGrant_NoKey_Failure() throws Exception {
- assertTrue("Should be able to unlock keystore for test",
- mKeyStore.onUserPasswordChanged(TEST_PASSWD));
-
- assertNull("Should not be able to grant without first initializing the keystore",
- mKeyStore.grant(TEST_KEYNAME, 0));
- }
-
- public void testGrant_NotInitialized_Failure() throws Exception {
- assertNull("Should not be able to grant without first initializing the keystore",
- mKeyStore.grant(TEST_KEYNAME, 0));
- }
-
- public void testUngrant_Generated_Success() throws Exception {
- assertTrue("Password should work for keystore",
- mKeyStore.onUserPasswordChanged(TEST_PASSWD));
-
- assertTrue("Should be able to generate key for testcase",
- mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeConstants.EVP_PKEY_RSA,
- RSA_KEY_SIZE, KeyStore.FLAG_ENCRYPTED, null));
-
- assertNotNull("Should be able to grant key to other user",
- mKeyStore.grant(TEST_KEYNAME, 0));
-
- assertTrue("Should be able to ungrant key to other user",
- mKeyStore.ungrant(TEST_KEYNAME, 0));
- }
-
- public void testUngrant_Imported_Success() throws Exception {
- assertTrue("Password should work for keystore",
- mKeyStore.onUserPasswordChanged(TEST_PASSWD));
-
- assertTrue("Should be able to import key for testcase", mKeyStore.importKey(TEST_KEYNAME,
- PRIVKEY_BYTES, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-
- assertNotNull("Should be able to grant key to other user",
- mKeyStore.grant(TEST_KEYNAME, 0));
-
- assertTrue("Should be able to ungrant key to other user",
- mKeyStore.ungrant(TEST_KEYNAME, 0));
- }
-
- public void testUngrant_NotInitialized_Failure() throws Exception {
- assertFalse("Should fail to ungrant key when keystore not initialized",
- mKeyStore.ungrant(TEST_KEYNAME, 0));
- }
-
- public void testUngrant_NoGrant_Failure() throws Exception {
- assertTrue("Password should work for keystore",
- mKeyStore.onUserPasswordChanged(TEST_PASSWD));
-
- assertTrue("Should be able to generate key for testcase",
- mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeConstants.EVP_PKEY_RSA,
- RSA_KEY_SIZE, KeyStore.FLAG_ENCRYPTED, null));
-
- assertFalse("Should not be able to revoke not existent grant",
- mKeyStore.ungrant(TEST_KEYNAME, 0));
- }
-
- public void testUngrant_DoubleUngrant_Failure() throws Exception {
- assertTrue("Password should work for keystore",
- mKeyStore.onUserPasswordChanged(TEST_PASSWD));
-
- assertTrue("Should be able to generate key for testcase",
- mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeConstants.EVP_PKEY_RSA,
- RSA_KEY_SIZE, KeyStore.FLAG_ENCRYPTED, null));
-
- assertNotNull("Should be able to grant key to other user",
- mKeyStore.grant(TEST_KEYNAME, 0));
-
- assertTrue("Should be able to ungrant key to other user",
- mKeyStore.ungrant(TEST_KEYNAME, 0));
-
- assertFalse("Should fail to ungrant key to other user second time",
- mKeyStore.ungrant(TEST_KEYNAME, 0));
- }
-
- public void testUngrant_DoubleGrantUngrant_Failure() throws Exception {
- assertTrue("Password should work for keystore",
- mKeyStore.onUserPasswordChanged(TEST_PASSWD));
-
- assertTrue("Should be able to generate key for testcase",
- mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeConstants.EVP_PKEY_RSA,
- RSA_KEY_SIZE, KeyStore.FLAG_ENCRYPTED, null));
-
- assertNotNull("Should be able to grant key to other user",
- mKeyStore.grant(TEST_KEYNAME, 0));
-
- assertNotNull("Should be able to grant key to other user a second time",
- mKeyStore.grant(TEST_KEYNAME, 0));
-
- assertTrue("Should be able to ungrant key to other user",
- mKeyStore.ungrant(TEST_KEYNAME, 0));
-
- assertFalse("Should fail to ungrant key to other user second time",
- mKeyStore.ungrant(TEST_KEYNAME, 0));
- }
-
- public void testDuplicate_grantedUid_Wifi_Success() throws Exception {
- assertTrue(mKeyStore.onUserPasswordChanged(TEST_PASSWD));
-
- assertFalse(mKeyStore.contains(TEST_KEYNAME));
-
- assertTrue(mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeConstants.EVP_PKEY_RSA,
- RSA_KEY_SIZE, KeyStore.FLAG_ENCRYPTED, null));
-
- assertTrue(mKeyStore.contains(TEST_KEYNAME));
- assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.WIFI_UID));
-
- // source doesn't exist
- assertFalse(mKeyStore.duplicate(TEST_KEYNAME1, -1, TEST_KEYNAME1, Process.WIFI_UID));
- assertFalse(mKeyStore.contains(TEST_KEYNAME1, Process.WIFI_UID));
-
- // Copy from current UID to granted UID
- assertTrue(mKeyStore.duplicate(TEST_KEYNAME, -1, TEST_KEYNAME1, Process.WIFI_UID));
- assertTrue(mKeyStore.contains(TEST_KEYNAME));
- assertFalse(mKeyStore.contains(TEST_KEYNAME1));
- assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.WIFI_UID));
- assertTrue(mKeyStore.contains(TEST_KEYNAME1, Process.WIFI_UID));
- assertFalse(mKeyStore.duplicate(TEST_KEYNAME, -1, TEST_KEYNAME1, Process.WIFI_UID));
-
- // Copy from granted UID to same granted UID
- assertTrue(mKeyStore.duplicate(TEST_KEYNAME1, Process.WIFI_UID, TEST_KEYNAME2,
- Process.WIFI_UID));
- assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.WIFI_UID));
- assertTrue(mKeyStore.contains(TEST_KEYNAME1, Process.WIFI_UID));
- assertTrue(mKeyStore.contains(TEST_KEYNAME2, Process.WIFI_UID));
- assertFalse(mKeyStore.duplicate(TEST_KEYNAME1, Process.WIFI_UID, TEST_KEYNAME2,
- Process.WIFI_UID));
-
- assertTrue(mKeyStore.duplicate(TEST_KEYNAME, -1, TEST_KEYNAME2, -1));
- assertTrue(mKeyStore.contains(TEST_KEYNAME));
- assertFalse(mKeyStore.contains(TEST_KEYNAME1));
- assertTrue(mKeyStore.contains(TEST_KEYNAME2));
- assertFalse(mKeyStore.duplicate(TEST_KEYNAME, -1, TEST_KEYNAME2, -1));
- }
-
- public void testDuplicate_ungrantedUid_Bluetooth_Failure() throws Exception {
- assertTrue(mKeyStore.onUserPasswordChanged(TEST_PASSWD));
-
- assertFalse(mKeyStore.contains(TEST_KEYNAME));
-
- assertTrue(mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeConstants.EVP_PKEY_RSA,
- RSA_KEY_SIZE, KeyStore.FLAG_ENCRYPTED, null));
-
- assertTrue(mKeyStore.contains(TEST_KEYNAME));
- assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.BLUETOOTH_UID));
-
- assertFalse(mKeyStore.duplicate(TEST_KEYNAME, -1, TEST_KEYNAME2, Process.BLUETOOTH_UID));
- assertFalse(mKeyStore.duplicate(TEST_KEYNAME, Process.BLUETOOTH_UID, TEST_KEYNAME2,
- Process.BLUETOOTH_UID));
-
- assertTrue(mKeyStore.contains(TEST_KEYNAME));
- assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.BLUETOOTH_UID));
- }
-
- /**
- * The amount of time to allow before and after expected time for variance
- * in timing tests.
- */
- private static final long SLOP_TIME_MILLIS = 15000L;
-
- public void testGetmtime_Success() throws Exception {
- assertTrue("Password should work for keystore",
- mKeyStore.onUserPasswordChanged(TEST_PASSWD));
-
- assertTrue("Should be able to import key when unlocked", mKeyStore.importKey(TEST_KEYNAME,
- PRIVKEY_BYTES, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-
- long now = System.currentTimeMillis();
- long actual = mKeyStore.getmtime(TEST_KEYNAME);
-
- long expectedAfter = now - SLOP_TIME_MILLIS;
- long expectedBefore = now + SLOP_TIME_MILLIS;
-
- assertLessThan("Time should be close to current time", expectedBefore, actual);
- assertGreaterThan("Time should be close to current time", expectedAfter, actual);
- }
-
- private static void assertLessThan(String explanation, long expectedBefore, long actual) {
- if (actual >= expectedBefore) {
- throw new AssertionFailedError(explanation + ": actual=" + actual
- + ", expected before: " + expectedBefore);
- }
- }
-
- private static void assertGreaterThan(String explanation, long expectedAfter, long actual) {
- if (actual <= expectedAfter) {
- throw new AssertionFailedError(explanation + ": actual=" + actual
- + ", expected after: " + expectedAfter);
- }
- }
-
- public void testGetmtime_NonExist_Failure() throws Exception {
- assertTrue("Password should work for keystore",
- mKeyStore.onUserPasswordChanged(TEST_PASSWD));
-
- assertTrue("Should be able to import key when unlocked", mKeyStore.importKey(TEST_KEYNAME,
- PRIVKEY_BYTES, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-
- assertEquals("-1 should be returned for non-existent key",
- -1L, mKeyStore.getmtime(TEST_KEYNAME2));
- }
-
- private KeyCharacteristics generateRsaKey(String name) throws Exception {
- KeymasterArguments args = new KeymasterArguments();
- args.addEnum(KeymasterDefs.KM_TAG_PURPOSE, KeymasterDefs.KM_PURPOSE_ENCRYPT);
- args.addEnum(KeymasterDefs.KM_TAG_PURPOSE, KeymasterDefs.KM_PURPOSE_DECRYPT);
- args.addEnum(KeymasterDefs.KM_TAG_ALGORITHM, KeymasterDefs.KM_ALGORITHM_RSA);
- args.addEnum(KeymasterDefs.KM_TAG_PADDING, KeymasterDefs.KM_PAD_NONE);
- args.addBoolean(KeymasterDefs.KM_TAG_NO_AUTH_REQUIRED);
- args.addUnsignedInt(KeymasterDefs.KM_TAG_KEY_SIZE, 2048);
- args.addUnsignedLong(KeymasterDefs.KM_TAG_RSA_PUBLIC_EXPONENT, RSAKeyGenParameterSpec.F4);
-
- KeyCharacteristics outCharacteristics = new KeyCharacteristics();
- int result = mKeyStore.generateKey(name, args, null, 0, outCharacteristics);
- assertEquals("generateRsaKey should succeed", KeyStore.NO_ERROR, result);
- return outCharacteristics;
- }
-
- public void testGenerateKey() throws Exception {
- generateRsaKey("test");
- mKeyStore.delete("test");
- }
-
- public void testGenerateRsaWithEntropy() throws Exception {
- byte[] entropy = new byte[] {1,2,3,4,5};
- String name = "test";
- KeymasterArguments args = new KeymasterArguments();
- args.addEnum(KeymasterDefs.KM_TAG_PURPOSE, KeymasterDefs.KM_PURPOSE_ENCRYPT);
- args.addEnum(KeymasterDefs.KM_TAG_PURPOSE, KeymasterDefs.KM_PURPOSE_DECRYPT);
- args.addEnum(KeymasterDefs.KM_TAG_ALGORITHM, KeymasterDefs.KM_ALGORITHM_RSA);
- args.addEnum(KeymasterDefs.KM_TAG_PADDING, KeymasterDefs.KM_PAD_NONE);
- args.addBoolean(KeymasterDefs.KM_TAG_NO_AUTH_REQUIRED);
- args.addUnsignedInt(KeymasterDefs.KM_TAG_KEY_SIZE, 2048);
- args.addUnsignedLong(KeymasterDefs.KM_TAG_RSA_PUBLIC_EXPONENT, RSAKeyGenParameterSpec.F4);
-
- KeyCharacteristics outCharacteristics = new KeyCharacteristics();
- int result = mKeyStore.generateKey(name, args, entropy, 0, outCharacteristics);
- assertEquals("generateKey should succeed", KeyStore.NO_ERROR, result);
- }
-
- public void testGenerateAndDelete() throws Exception {
- generateRsaKey("test");
- assertTrue("delete should succeed", mKeyStore.delete("test"));
- }
-
- public void testGetKeyCharacteristicsSuccess() throws Exception {
- mKeyStore.onUserPasswordChanged(TEST_PASSWD);
- String name = "test";
- KeyCharacteristics gen = generateRsaKey(name);
- KeyCharacteristics call = new KeyCharacteristics();
- int result = mKeyStore.getKeyCharacteristics(name, null, null, call);
- assertEquals("getKeyCharacteristics should succeed", KeyStore.NO_ERROR, result);
- mKeyStore.delete("test");
- }
-
- public void testAppId() throws Exception {
- String name = "test";
- byte[] id = new byte[] {0x01, 0x02, 0x03};
- KeymasterArguments args = new KeymasterArguments();
- args.addEnum(KeymasterDefs.KM_TAG_PURPOSE, KeymasterDefs.KM_PURPOSE_ENCRYPT);
- args.addEnum(KeymasterDefs.KM_TAG_PURPOSE, KeymasterDefs.KM_PURPOSE_DECRYPT);
- args.addEnum(KeymasterDefs.KM_TAG_ALGORITHM, KeymasterDefs.KM_ALGORITHM_RSA);
- args.addEnum(KeymasterDefs.KM_TAG_PADDING, KeymasterDefs.KM_PAD_NONE);
- args.addUnsignedInt(KeymasterDefs.KM_TAG_KEY_SIZE, 2048);
- args.addEnum(KeymasterDefs.KM_TAG_BLOCK_MODE, KeymasterDefs.KM_MODE_ECB);
- args.addBoolean(KeymasterDefs.KM_TAG_NO_AUTH_REQUIRED);
- args.addBytes(KeymasterDefs.KM_TAG_APPLICATION_ID, id);
- args.addUnsignedLong(KeymasterDefs.KM_TAG_RSA_PUBLIC_EXPONENT, RSAKeyGenParameterSpec.F4);
-
- KeyCharacteristics outCharacteristics = new KeyCharacteristics();
- int result = mKeyStore.generateKey(name, args, null, 0, outCharacteristics);
- assertEquals("generateRsaKey should succeed", KeyStore.NO_ERROR, result);
- assertEquals("getKeyCharacteristics should fail without application ID",
- KeymasterDefs.KM_ERROR_INVALID_KEY_BLOB,
- mKeyStore.getKeyCharacteristics(name, null, null, outCharacteristics));
- assertEquals("getKeyCharacteristics should succeed with application ID",
- KeyStore.NO_ERROR,
- mKeyStore.getKeyCharacteristics(name, new KeymasterBlob(id), null,
- outCharacteristics));
- }
-
-
- public void testExportRsa() throws Exception {
- String name = "test";
- generateRsaKey(name);
- ExportResult result = mKeyStore.exportKey(name, KeymasterDefs.KM_KEY_FORMAT_X509, null,
- null);
- assertEquals("Export success", KeyStore.NO_ERROR, result.resultCode);
- // TODO: Verify we have an RSA public key that's well formed.
- }
-
- public void testAesGcmEncryptSuccess() throws Exception {
- String name = "test";
- KeymasterArguments args = new KeymasterArguments();
- args.addEnum(KeymasterDefs.KM_TAG_PURPOSE, KeymasterDefs.KM_PURPOSE_ENCRYPT);
- args.addEnum(KeymasterDefs.KM_TAG_PURPOSE, KeymasterDefs.KM_PURPOSE_DECRYPT);
- args.addEnum(KeymasterDefs.KM_TAG_ALGORITHM, KeymasterDefs.KM_ALGORITHM_AES);
- args.addEnum(KeymasterDefs.KM_TAG_PADDING, KeymasterDefs.KM_PAD_NONE);
- args.addUnsignedInt(KeymasterDefs.KM_TAG_KEY_SIZE, 256);
- args.addEnum(KeymasterDefs.KM_TAG_BLOCK_MODE, KeymasterDefs.KM_MODE_GCM);
- args.addBoolean(KeymasterDefs.KM_TAG_NO_AUTH_REQUIRED);
-
- KeyCharacteristics outCharacteristics = new KeyCharacteristics();
- int rc = mKeyStore.generateKey(name, args, null, 0, outCharacteristics);
- assertEquals("Generate should succeed", KeyStore.NO_ERROR, rc);
-
- args = new KeymasterArguments();
- args.addEnum(KeymasterDefs.KM_TAG_ALGORITHM, KeymasterDefs.KM_ALGORITHM_AES);
- args.addEnum(KeymasterDefs.KM_TAG_BLOCK_MODE, KeymasterDefs.KM_MODE_GCM);
- args.addEnum(KeymasterDefs.KM_TAG_PADDING, KeymasterDefs.KM_PAD_NONE);
- args.addUnsignedInt(KeymasterDefs.KM_TAG_MAC_LENGTH, 128);
- OperationResult result = mKeyStore.begin(name, KeymasterDefs.KM_PURPOSE_ENCRYPT,
- true, args, null);
- IBinder token = result.token;
- assertEquals("Begin should succeed", KeyStore.NO_ERROR, result.resultCode);
- result = mKeyStore.update(token, null, new byte[] {0x01, 0x02, 0x03, 0x04});
- assertEquals("Update should succeed", KeyStore.NO_ERROR, result.resultCode);
- assertEquals("Finish should succeed", KeyStore.NO_ERROR,
- mKeyStore.finish(token, null, null).resultCode);
- // TODO: Assert that an AEAD tag was returned by finish
- }
-
- public void testBadToken() throws Exception {
- IBinder token = new Binder();
- OperationResult result = mKeyStore.update(token, null, new byte[] {0x01});
- assertEquals("Update with invalid token should fail",
- KeymasterDefs.KM_ERROR_INVALID_OPERATION_HANDLE, result.resultCode);
- }
-
- private int importAesKey(String name, byte[] key, int size, int mode) {
- KeymasterArguments args = new KeymasterArguments();
- args.addEnum(KeymasterDefs.KM_TAG_PURPOSE, KeymasterDefs.KM_PURPOSE_ENCRYPT);
- args.addEnum(KeymasterDefs.KM_TAG_PURPOSE, KeymasterDefs.KM_PURPOSE_DECRYPT);
- args.addEnum(KeymasterDefs.KM_TAG_ALGORITHM, KeymasterDefs.KM_ALGORITHM_AES);
- args.addEnum(KeymasterDefs.KM_TAG_PADDING, KeymasterDefs.KM_PAD_NONE);
- args.addEnum(KeymasterDefs.KM_TAG_BLOCK_MODE, mode);
- args.addUnsignedInt(KeymasterDefs.KM_TAG_KEY_SIZE, size);
- args.addBoolean(KeymasterDefs.KM_TAG_NO_AUTH_REQUIRED);
- return mKeyStore.importKey(name, args, KeymasterDefs.KM_KEY_FORMAT_RAW, key, 0,
- new KeyCharacteristics());
- }
- private byte[] doOperation(String name, int purpose, byte[] in, KeymasterArguments beginArgs) {
- OperationResult result = mKeyStore.begin(name, purpose,
- true, beginArgs, null);
- assertEquals("Begin should succeed", KeyStore.NO_ERROR, result.resultCode);
- IBinder token = result.token;
- result = mKeyStore.update(token, null, in);
- assertEquals("Update should succeed", KeyStore.NO_ERROR, result.resultCode);
- assertEquals("All data should be consumed", in.length, result.inputConsumed);
- assertEquals("Finish should succeed", KeyStore.NO_ERROR,
- mKeyStore.finish(token, null, null).resultCode);
- return result.output;
- }
-
- public void testImportAes() throws Exception {
- int result = importAesKey("aes", AES256_BYTES, 256, KeymasterDefs.KM_MODE_ECB);
- assertEquals("import should succeed", KeyStore.NO_ERROR, result);
- mKeyStore.delete("aes");
- }
-
- public void testAes256Ecb() throws Exception {
- byte[] key =
- hexToBytes("603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4");
- String name = "aes";
- assertEquals(KeyStore.NO_ERROR, importAesKey(name, key, 256, KeymasterDefs.KM_MODE_ECB));
- byte[][] testVectors = new byte[][] {
- hexToBytes("6bc1bee22e409f96e93d7e117393172a"),
- hexToBytes("ae2d8a571e03ac9c9eb76fac45af8e51"),
- hexToBytes("30c81c46a35ce411e5fbc1191a0a52ef"),
- hexToBytes("f69f2445df4f9b17ad2b417be66c3710")};
- byte[][] cipherVectors = new byte[][] {
- hexToBytes("f3eed1bdb5d2a03c064b5a7e3db181f8"),
- hexToBytes("591ccb10d410ed26dc5ba74a31362870"),
- hexToBytes("b6ed21b99ca6f4f9f153e7b1beafed1d"),
- hexToBytes("23304b7a39f9f3ff067d8d8f9e24ecc7")};
- KeymasterArguments beginArgs = new KeymasterArguments();
- beginArgs.addEnum(KeymasterDefs.KM_TAG_ALGORITHM, KeymasterDefs.KM_ALGORITHM_AES);
- beginArgs.addEnum(KeymasterDefs.KM_TAG_BLOCK_MODE, KeymasterDefs.KM_MODE_ECB);
- beginArgs.addEnum(KeymasterDefs.KM_TAG_PADDING, KeymasterDefs.KM_PAD_NONE);
- for (int i = 0; i < testVectors.length; i++) {
- byte[] cipherText = doOperation(name, KeymasterDefs.KM_PURPOSE_ENCRYPT, testVectors[i],
- beginArgs);
- MoreAsserts.assertEquals(cipherVectors[i], cipherText);
- }
- for (int i = 0; i < testVectors.length; i++) {
- byte[] plainText = doOperation(name, KeymasterDefs.KM_PURPOSE_DECRYPT,
- cipherVectors[i], beginArgs);
- MoreAsserts.assertEquals(testVectors[i], plainText);
- }
- }
-
- // This is a very implementation specific test and should be thrown out eventually, however it
- // is nice for now to test that keystore is properly pruning operations.
- public void testOperationPruning() throws Exception {
- String name = "test";
- KeymasterArguments args = new KeymasterArguments();
- args.addEnum(KeymasterDefs.KM_TAG_PURPOSE, KeymasterDefs.KM_PURPOSE_ENCRYPT);
- args.addEnum(KeymasterDefs.KM_TAG_PURPOSE, KeymasterDefs.KM_PURPOSE_DECRYPT);
- args.addEnum(KeymasterDefs.KM_TAG_ALGORITHM, KeymasterDefs.KM_ALGORITHM_AES);
- args.addEnum(KeymasterDefs.KM_TAG_PADDING, KeymasterDefs.KM_PAD_NONE);
- args.addUnsignedInt(KeymasterDefs.KM_TAG_KEY_SIZE, 256);
- args.addEnum(KeymasterDefs.KM_TAG_BLOCK_MODE, KeymasterDefs.KM_MODE_CTR);
- args.addBoolean(KeymasterDefs.KM_TAG_NO_AUTH_REQUIRED);
-
- KeyCharacteristics outCharacteristics = new KeyCharacteristics();
- int rc = mKeyStore.generateKey(name, args, null, 0, outCharacteristics);
- assertEquals("Generate should succeed", KeyStore.NO_ERROR, rc);
-
- args = new KeymasterArguments();
- args.addEnum(KeymasterDefs.KM_TAG_ALGORITHM, KeymasterDefs.KM_ALGORITHM_AES);
- args.addEnum(KeymasterDefs.KM_TAG_BLOCK_MODE, KeymasterDefs.KM_MODE_CTR);
- args.addEnum(KeymasterDefs.KM_TAG_PADDING, KeymasterDefs.KM_PAD_NONE);
- OperationResult result = mKeyStore.begin(name, KeymasterDefs.KM_PURPOSE_ENCRYPT,
- true, args, null);
- assertEquals("Begin should succeed", KeyStore.NO_ERROR, result.resultCode);
- IBinder first = result.token;
- // Implementation detail: softkeymaster supports 16 concurrent operations
- for (int i = 0; i < 16; i++) {
- result = mKeyStore.begin(name, KeymasterDefs.KM_PURPOSE_ENCRYPT, true, args, null);
- assertEquals("Begin should succeed", KeyStore.NO_ERROR, result.resultCode);
- }
- // At this point the first operation should be pruned.
- assertEquals("Operation should be pruned", KeymasterDefs.KM_ERROR_INVALID_OPERATION_HANDLE,
- mKeyStore.update(first, null, new byte[] {0x01}).resultCode);
- }
-
- public void testAuthNeeded() throws Exception {
- String name = "test";
- KeymasterArguments args = new KeymasterArguments();
- args.addEnum(KeymasterDefs.KM_TAG_PURPOSE, KeymasterDefs.KM_PURPOSE_ENCRYPT);
- args.addEnum(KeymasterDefs.KM_TAG_PURPOSE, KeymasterDefs.KM_PURPOSE_DECRYPT);
- args.addEnum(KeymasterDefs.KM_TAG_ALGORITHM, KeymasterDefs.KM_ALGORITHM_AES);
- args.addEnum(KeymasterDefs.KM_TAG_PADDING, KeymasterDefs.KM_PAD_PKCS7);
- args.addUnsignedInt(KeymasterDefs.KM_TAG_KEY_SIZE, 256);
- args.addEnum(KeymasterDefs.KM_TAG_BLOCK_MODE, KeymasterDefs.KM_MODE_ECB);
- args.addEnum(KeymasterDefs.KM_TAG_USER_AUTH_TYPE, 1);
-
- KeyCharacteristics outCharacteristics = new KeyCharacteristics();
- int rc = mKeyStore.generateKey(name, args, null, 0, outCharacteristics);
- assertEquals("Generate should succeed", KeyStore.NO_ERROR, rc);
- OperationResult result = mKeyStore.begin(name, KeymasterDefs.KM_PURPOSE_ENCRYPT,
- true, args, null);
- assertEquals("Begin should expect authorization", KeyStore.OP_AUTH_NEEDED,
- result.resultCode);
- IBinder token = result.token;
- result = mKeyStore.update(token, null, new byte[] {0x01, 0x02, 0x03, 0x04});
- assertEquals("Update should require authorization",
- KeymasterDefs.KM_ERROR_KEY_USER_NOT_AUTHENTICATED, result.resultCode);
- }
-
- public void testPasswordRemovalEncryptedEntry() throws Exception {
- mKeyStore.onUserPasswordChanged("test");
- assertTrue(mKeyStore.put(TEST_KEYNAME, TEST_KEYVALUE, KeyStore.UID_SELF,
- KeyStore.FLAG_ENCRYPTED));
- assertTrue(mKeyStore.contains(TEST_KEYNAME));
- assertTrue(Arrays.equals(TEST_KEYVALUE, mKeyStore.get(TEST_KEYNAME)));
- mKeyStore.onUserPasswordChanged("");
- // Removing the password should have deleted all entries using FLAG_ENCRYPTED
- assertNull(mKeyStore.get(TEST_KEYNAME));
- assertFalse(mKeyStore.contains(TEST_KEYNAME));
- }
-
- public void testPasswordRemovalUnencryptedEntry() throws Exception {
- mKeyStore.onUserPasswordChanged("test");
- assertTrue(mKeyStore.put(TEST_KEYNAME, TEST_KEYVALUE, KeyStore.UID_SELF,
- KeyStore.FLAG_NONE));
- assertTrue(mKeyStore.contains(TEST_KEYNAME));
- assertTrue(Arrays.equals(TEST_KEYVALUE, mKeyStore.get(TEST_KEYNAME)));
- mKeyStore.onUserPasswordChanged("");
- // Removing the password should not delete unencrypted entries.
- assertTrue(mKeyStore.contains(TEST_KEYNAME));
- assertTrue(Arrays.equals(TEST_KEYVALUE, mKeyStore.get(TEST_KEYNAME)));
- }
-}
diff --git a/keystore/tests/src/android/security/SystemKeyStoreTest.java b/keystore/tests/src/android/security/SystemKeyStoreTest.java
deleted file mode 100644
index ecf7cbc..0000000
--- a/keystore/tests/src/android/security/SystemKeyStoreTest.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (C) 2010 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.security;
-
-import android.app.Activity;
-import android.security.SystemKeyStore;
-import android.test.ActivityUnitTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-
-/**
- * Junit / Instrumentation test case for KeyStore class
- *
- * Running the test suite:
- *
- * runtest keystore-unit
- *
- * Or this individual test case:
- *
- * runtest --path frameworks/base/keystore/tests/src/android/security/SystemKeyStoreTest.java
- */
-@MediumTest
-public class SystemKeyStoreTest extends ActivityUnitTestCase<Activity> {
-
- private static final String keyName = "TestKey";
- private static final String keyName2 = "TestKey2";
- private SystemKeyStore mSysKeyStore = null;
-
- public SystemKeyStoreTest() {
- super(Activity.class);
- }
-
- @Override
- protected void setUp() throws Exception {
- mSysKeyStore = SystemKeyStore.getInstance();
- try {
- mSysKeyStore.deleteKey(keyName);
- mSysKeyStore.deleteKey(keyName2);
- } catch (Exception e) { }
- super.setUp();
- }
-
- @Override
- protected void tearDown() throws Exception {
- try {
- mSysKeyStore.deleteKey(keyName);
- mSysKeyStore.deleteKey(keyName2);
- } catch (Exception e) { }
- super.tearDown();
- }
-
- public void testBasicAccess() throws Exception {
- try {
- byte[] newKey = mSysKeyStore.generateNewKey(128, "AES", keyName);
- assertNotNull(newKey);
- byte[] recKey = mSysKeyStore.retrieveKey(keyName);
- assertEquals(newKey.length, recKey.length);
- for (int i = 0; i < newKey.length; i++) {
- assertEquals(newKey[i], recKey[i]);
- }
- mSysKeyStore.deleteKey(keyName);
- byte[] nullKey = mSysKeyStore.retrieveKey(keyName);
- assertNull(nullKey);
-
- String newKeyStr = mSysKeyStore.generateNewKeyHexString(128, "AES", keyName2);
- assertNotNull(newKeyStr);
- String recKeyStr = mSysKeyStore.retrieveKeyHexString(keyName2);
- assertEquals(newKeyStr, recKeyStr);
-
- mSysKeyStore.deleteKey(keyName2);
- String nullKey2 = mSysKeyStore.retrieveKeyHexString(keyName2);
- assertNull(nullKey2);
- } catch (Exception e) {
- fail();
- }
- }
-}
diff --git a/keystore/tests/src/android/security/keystore/AndroidKeyPairGeneratorTest.java b/keystore/tests/src/android/security/keystore/AndroidKeyPairGeneratorTest.java
deleted file mode 100644
index 1af0b7d..0000000
--- a/keystore/tests/src/android/security/keystore/AndroidKeyPairGeneratorTest.java
+++ /dev/null
@@ -1,432 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.security.keystore;
-
-import android.security.Credentials;
-import android.security.KeyPairGeneratorSpec;
-import android.security.KeyStore;
-import android.security.keymaster.ExportResult;
-import android.security.keymaster.KeymasterDefs;
-import android.test.AndroidTestCase;
-
-import java.io.ByteArrayInputStream;
-import java.math.BigInteger;
-import java.security.KeyPair;
-import java.security.KeyPairGenerator;
-import java.security.PrivateKey;
-import java.security.PublicKey;
-import java.security.SecureRandom;
-import java.security.cert.Certificate;
-import java.security.cert.CertificateFactory;
-import java.security.cert.X509Certificate;
-import java.security.interfaces.ECKey;
-import java.security.interfaces.ECPublicKey;
-import java.security.interfaces.RSAKey;
-import java.security.interfaces.RSAPublicKey;
-import java.security.spec.AlgorithmParameterSpec;
-import java.security.spec.RSAKeyGenParameterSpec;
-import java.text.SimpleDateFormat;
-import java.util.Arrays;
-import java.util.Date;
-
-import javax.security.auth.x500.X500Principal;
-
-public class AndroidKeyPairGeneratorTest extends AndroidTestCase {
- private android.security.KeyStore mAndroidKeyStore;
-
- private java.security.KeyPairGenerator mGenerator;
-
- private static final String TEST_ALIAS_1 = "test1";
-
- private static final String TEST_ALIAS_2 = "test2";
-
- private static final X500Principal TEST_DN_1 = new X500Principal("CN=test1");
-
- private static final X500Principal TEST_DN_2 = new X500Principal("CN=test2");
-
- private static final BigInteger TEST_SERIAL_1 = BigInteger.ONE;
-
- private static final BigInteger TEST_SERIAL_2 = BigInteger.valueOf(2L);
-
- private static final long NOW_MILLIS = System.currentTimeMillis();
-
- /* We have to round this off because X509v3 doesn't store milliseconds. */
- private static final Date NOW = new Date(NOW_MILLIS - (NOW_MILLIS % 1000L));
-
- @SuppressWarnings("deprecation")
- private static final Date NOW_PLUS_10_YEARS = new Date(NOW.getYear() + 10, 0, 1);
-
- @Override
- protected void setUp() throws Exception {
- mAndroidKeyStore = android.security.KeyStore.getInstance();
-
- assertTrue(mAndroidKeyStore.reset());
-
- assertFalse(mAndroidKeyStore.isUnlocked());
-
- mGenerator = java.security.KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
- }
-
- private void setupPassword() {
- assertTrue(mAndroidKeyStore.onUserPasswordChanged("1111"));
- assertTrue(mAndroidKeyStore.isUnlocked());
-
- String[] aliases = mAndroidKeyStore.list("");
- assertNotNull(aliases);
- assertEquals(0, aliases.length);
- }
-
- public void testKeyPairGenerator_Initialize_Params_Encrypted_Success() throws Exception {
- setupPassword();
-
- mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
- .setAlias(TEST_ALIAS_1)
- .setSubject(TEST_DN_1)
- .setSerialNumber(TEST_SERIAL_1)
- .setStartDate(NOW)
- .setEndDate(NOW_PLUS_10_YEARS)
- .setEncryptionRequired()
- .build());
- }
-
- public void testKeyPairGenerator_Initialize_KeySize_Encrypted_Failure() throws Exception {
- setupPassword();
-
- try {
- mGenerator.initialize(1024);
- fail("KeyPairGenerator should not support setting the key size");
- } catch (IllegalArgumentException success) {
- }
- }
-
- public void testKeyPairGenerator_Initialize_KeySizeAndSecureRandom_Encrypted_Failure()
- throws Exception {
- setupPassword();
-
- try {
- mGenerator.initialize(1024, new SecureRandom());
- fail("KeyPairGenerator should not support setting the key size");
- } catch (IllegalArgumentException success) {
- }
- }
-
- public void testKeyPairGenerator_Initialize_ParamsAndSecureRandom_Encrypted_Failure()
- throws Exception {
- setupPassword();
-
- mGenerator.initialize(
- new KeyPairGeneratorSpec.Builder(getContext())
- .setAlias(TEST_ALIAS_1)
- .setKeyType("RSA")
- .setKeySize(1024)
- .setSubject(TEST_DN_1)
- .setSerialNumber(TEST_SERIAL_1)
- .setStartDate(NOW)
- .setEndDate(NOW_PLUS_10_YEARS)
- .setEncryptionRequired()
- .build(),
- new SecureRandom());
- }
-
- public void testKeyPairGenerator_GenerateKeyPair_Encrypted_Success() throws Exception {
- setupPassword();
-
- mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
- .setAlias(TEST_ALIAS_1)
- .setSubject(TEST_DN_1)
- .setSerialNumber(TEST_SERIAL_1)
- .setStartDate(NOW)
- .setEndDate(NOW_PLUS_10_YEARS)
- .setEncryptionRequired()
- .build());
-
- final KeyPair pair = mGenerator.generateKeyPair();
- assertNotNull("The KeyPair returned should not be null", pair);
-
- assertKeyPairCorrect(pair, TEST_ALIAS_1, "RSA", 2048, null, TEST_DN_1, TEST_SERIAL_1, NOW,
- NOW_PLUS_10_YEARS);
- }
-
- public void testKeyPairGenerator_GenerateKeyPair_EC_Unencrypted_Success() throws Exception {
- KeyPairGenerator generator = KeyPairGenerator.getInstance("EC", "AndroidKeyStore");
- generator.initialize(new KeyGenParameterSpec.Builder(
- TEST_ALIAS_1,
- KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY)
- .setCertificateSubject(TEST_DN_1)
- .setCertificateSerialNumber(TEST_SERIAL_1)
- .setCertificateNotBefore(NOW)
- .setCertificateNotAfter(NOW_PLUS_10_YEARS)
- .setDigests(KeyProperties.DIGEST_SHA256)
- .build());
-
- final KeyPair pair = generator.generateKeyPair();
- assertNotNull("The KeyPair returned should not be null", pair);
-
- assertKeyPairCorrect(pair, TEST_ALIAS_1, "EC", 256, null, TEST_DN_1, TEST_SERIAL_1, NOW,
- NOW_PLUS_10_YEARS);
- }
-
- public void testKeyPairGenerator_Legacy_GenerateKeyPair_EC_Unencrypted_Success()
- throws Exception {
- mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
- .setAlias(TEST_ALIAS_1)
- .setKeyType("EC")
- .setSubject(TEST_DN_1)
- .setSerialNumber(TEST_SERIAL_1)
- .setStartDate(NOW)
- .setEndDate(NOW_PLUS_10_YEARS)
- .build());
-
- final KeyPair pair = mGenerator.generateKeyPair();
- assertNotNull("The KeyPair returned should not be null", pair);
-
- assertKeyPairCorrect(pair, TEST_ALIAS_1, "EC", 256, null, TEST_DN_1, TEST_SERIAL_1, NOW,
- NOW_PLUS_10_YEARS);
- }
-
- public void testKeyPairGenerator_GenerateKeyPair_EC_P521_Unencrypted_Success() throws Exception {
- mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
- .setAlias(TEST_ALIAS_1)
- .setKeyType("EC")
- .setKeySize(521)
- .setSubject(TEST_DN_1)
- .setSerialNumber(TEST_SERIAL_1)
- .setStartDate(NOW)
- .setEndDate(NOW_PLUS_10_YEARS)
- .build());
-
- final KeyPair pair = mGenerator.generateKeyPair();
- assertNotNull("The KeyPair returned should not be null", pair);
-
- assertKeyPairCorrect(pair, TEST_ALIAS_1, "EC", 521, null, TEST_DN_1, TEST_SERIAL_1, NOW,
- NOW_PLUS_10_YEARS);
- }
-
- public void testKeyPairGenerator_GenerateKeyPair_RSA_Unencrypted_Success() throws Exception {
- mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
- .setAlias(TEST_ALIAS_1)
- .setSubject(TEST_DN_1)
- .setSerialNumber(TEST_SERIAL_1)
- .setStartDate(NOW)
- .setEndDate(NOW_PLUS_10_YEARS)
- .build());
-
- final KeyPair pair = mGenerator.generateKeyPair();
- assertNotNull("The KeyPair returned should not be null", pair);
-
- assertKeyPairCorrect(pair, TEST_ALIAS_1, "RSA", 2048, null, TEST_DN_1, TEST_SERIAL_1, NOW,
- NOW_PLUS_10_YEARS);
- }
-
- public void testKeyPairGenerator_GenerateKeyPair_RSA_WithParams_Unencrypted_Success()
- throws Exception {
- AlgorithmParameterSpec spec = new RSAKeyGenParameterSpec(1024, BigInteger.valueOf(3L));
- mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
- .setAlias(TEST_ALIAS_1)
- .setKeySize(1024)
- .setAlgorithmParameterSpec(spec)
- .setSubject(TEST_DN_1)
- .setSerialNumber(TEST_SERIAL_1)
- .setStartDate(NOW)
- .setEndDate(NOW_PLUS_10_YEARS)
- .build());
-
- final KeyPair pair = mGenerator.generateKeyPair();
- assertNotNull("The KeyPair returned should not be null", pair);
-
- assertKeyPairCorrect(pair, TEST_ALIAS_1, "RSA", 1024, spec, TEST_DN_1, TEST_SERIAL_1, NOW,
- NOW_PLUS_10_YEARS);
- }
-
- public void testKeyPairGenerator_GenerateKeyPair_Replaced_Success() throws Exception {
- // Generate the first key
- {
- mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
- .setAlias(TEST_ALIAS_1)
- .setSubject(TEST_DN_1)
- .setSerialNumber(TEST_SERIAL_1)
- .setStartDate(NOW)
- .setEndDate(NOW_PLUS_10_YEARS)
- .build());
- final KeyPair pair1 = mGenerator.generateKeyPair();
- assertNotNull("The KeyPair returned should not be null", pair1);
- assertKeyPairCorrect(pair1, TEST_ALIAS_1, "RSA", 2048, null, TEST_DN_1, TEST_SERIAL_1,
- NOW, NOW_PLUS_10_YEARS);
- }
-
- // Replace the original key
- {
- mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
- .setAlias(TEST_ALIAS_2)
- .setSubject(TEST_DN_2)
- .setSerialNumber(TEST_SERIAL_2)
- .setStartDate(NOW)
- .setEndDate(NOW_PLUS_10_YEARS)
- .build());
- final KeyPair pair2 = mGenerator.generateKeyPair();
- assertNotNull("The KeyPair returned should not be null", pair2);
- assertKeyPairCorrect(pair2, TEST_ALIAS_2, "RSA", 2048, null, TEST_DN_2, TEST_SERIAL_2,
- NOW, NOW_PLUS_10_YEARS);
- }
- }
-
- public void testKeyPairGenerator_GenerateKeyPair_Replaced_UnencryptedToEncrypted_Success()
- throws Exception {
- // Generate the first key
- {
- mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
- .setAlias(TEST_ALIAS_1)
- .setSubject(TEST_DN_1)
- .setSerialNumber(TEST_SERIAL_1)
- .setStartDate(NOW)
- .setEndDate(NOW_PLUS_10_YEARS)
- .build());
- final KeyPair pair1 = mGenerator.generateKeyPair();
- assertNotNull("The KeyPair returned should not be null", pair1);
- assertKeyPairCorrect(pair1, TEST_ALIAS_1, "RSA", 2048, null, TEST_DN_1, TEST_SERIAL_1,
- NOW, NOW_PLUS_10_YEARS);
- }
-
- // Attempt to replace previous key
- {
- mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
- .setAlias(TEST_ALIAS_1)
- .setSubject(TEST_DN_2)
- .setSerialNumber(TEST_SERIAL_2)
- .setStartDate(NOW)
- .setEndDate(NOW_PLUS_10_YEARS)
- .setEncryptionRequired()
- .build());
- try {
- mGenerator.generateKeyPair();
- fail("Should not be able to generate encrypted key while not initialized");
- } catch (IllegalStateException expected) {
- }
-
- assertTrue(mAndroidKeyStore.onUserPasswordChanged("1111"));
- assertTrue(mAndroidKeyStore.isUnlocked());
-
- final KeyPair pair2 = mGenerator.generateKeyPair();
- assertNotNull("The KeyPair returned should not be null", pair2);
- assertKeyPairCorrect(pair2, TEST_ALIAS_1, "RSA", 2048, null, TEST_DN_2, TEST_SERIAL_2,
- NOW, NOW_PLUS_10_YEARS);
- }
- }
-
- private void assertKeyPairCorrect(KeyPair pair, String alias, String keyType, int keySize,
- AlgorithmParameterSpec spec, X500Principal dn, BigInteger serial, Date start, Date end)
- throws Exception {
- final PublicKey pubKey = pair.getPublic();
- assertNotNull("The PublicKey for the KeyPair should be not null", pubKey);
- assertEquals(keyType, pubKey.getAlgorithm());
-
- if ("EC".equalsIgnoreCase(keyType)) {
- assertEquals("Curve should be what was specified during initialization", keySize,
- ((ECPublicKey) pubKey).getParams().getCurve().getField().getFieldSize());
- } else if ("RSA".equalsIgnoreCase(keyType)) {
- RSAPublicKey rsaPubKey = (RSAPublicKey) pubKey;
- assertEquals("Modulus size should be what is specified during initialization",
- (keySize + 7) & ~7, (rsaPubKey.getModulus().bitLength() + 7) & ~7);
- if (spec != null) {
- RSAKeyGenParameterSpec params = (RSAKeyGenParameterSpec) spec;
- assertEquals((keySize + 7) & ~7, (params.getKeysize() + 7) & ~7);
- assertEquals(params.getPublicExponent(), rsaPubKey.getPublicExponent());
- }
- }
-
- final PrivateKey privKey = pair.getPrivate();
- assertNotNull("The PrivateKey for the KeyPair should be not null", privKey);
- assertEquals(keyType, privKey.getAlgorithm());
-
- if ("EC".equalsIgnoreCase(keyType)) {
- assertTrue("EC private key must be instanceof ECKey: " + privKey.getClass().getName(),
- privKey instanceof ECKey);
- assertEquals("Private and public key must have the same EC parameters",
- ((ECKey) pubKey).getParams(), ((ECKey) privKey).getParams());
- } else if ("RSA".equalsIgnoreCase(keyType)) {
- assertTrue("RSA private key must be instance of RSAKey: "
- + privKey.getClass().getName(),
- privKey instanceof RSAKey);
- assertEquals("Private and public key must have the same RSA modulus",
- ((RSAKey) pubKey).getModulus(), ((RSAKey) privKey).getModulus());
- }
-
- final byte[] userCertBytes = mAndroidKeyStore.get(Credentials.USER_CERTIFICATE + alias);
- assertNotNull("The user certificate should exist for the generated entry", userCertBytes);
-
- final CertificateFactory cf = CertificateFactory.getInstance("X.509");
- final Certificate userCert =
- cf.generateCertificate(new ByteArrayInputStream(userCertBytes));
-
- assertTrue("Certificate should be in X.509 format", userCert instanceof X509Certificate);
-
- final X509Certificate x509userCert = (X509Certificate) userCert;
-
- assertEquals(
- "Public key used to sign certificate should have the same algorithm as in KeyPair",
- pubKey.getAlgorithm(), x509userCert.getPublicKey().getAlgorithm());
-
- assertEquals("PublicKey used to sign certificate should match one returned in KeyPair",
- pubKey,
- AndroidKeyStoreProvider.getAndroidKeyStorePublicKey(
- Credentials.USER_PRIVATE_KEY + alias,
- KeyStore.UID_SELF,
- x509userCert.getPublicKey().getAlgorithm(),
- x509userCert.getPublicKey().getEncoded()));
-
- assertEquals("The Subject DN should be the one passed into the params", dn,
- x509userCert.getSubjectDN());
-
- assertEquals("The Issuer DN should be the same as the Subject DN", dn,
- x509userCert.getIssuerDN());
-
- assertEquals("The Serial should be the one passed into the params", serial,
- x509userCert.getSerialNumber());
-
- assertDateEquals("The notBefore date should be the one passed into the params", start,
- x509userCert.getNotBefore());
-
- assertDateEquals("The notAfter date should be the one passed into the params", end,
- x509userCert.getNotAfter());
-
- // Assert that the cert's signature verifies using the public key from generated KeyPair
- x509userCert.verify(pubKey);
- // Assert that the cert's signature verifies using the public key from the cert itself.
- x509userCert.verify(x509userCert.getPublicKey());
-
- final byte[] caCerts = mAndroidKeyStore.get(Credentials.CA_CERTIFICATE + alias);
- assertNull("A list of CA certificates should not exist for the generated entry", caCerts);
-
- ExportResult exportResult = mAndroidKeyStore.exportKey(
- Credentials.USER_PRIVATE_KEY + alias, KeymasterDefs.KM_KEY_FORMAT_X509, null, null);
- assertEquals(KeyStore.NO_ERROR, exportResult.resultCode);
- final byte[] pubKeyBytes = exportResult.exportData;
- assertNotNull("The keystore should return the public key for the generated key",
- pubKeyBytes);
- assertTrue("Public key X.509 format should be as expected",
- Arrays.equals(pubKey.getEncoded(), pubKeyBytes));
- }
-
- private static void assertDateEquals(String message, Date date1, Date date2) throws Exception {
- SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm:ss");
-
- String result1 = formatter.format(date1);
- String result2 = formatter.format(date2);
-
- assertEquals(message, result1, result2);
- }
-}
diff --git a/keystore/tests/src/android/security/keystore/AndroidKeyStoreTest.java b/keystore/tests/src/android/security/keystore/AndroidKeyStoreTest.java
deleted file mode 100644
index aa718dc..0000000
--- a/keystore/tests/src/android/security/keystore/AndroidKeyStoreTest.java
+++ /dev/null
@@ -1,2210 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.security.keystore;
-
-import com.android.org.bouncycastle.x509.X509V3CertificateGenerator;
-
-import com.android.org.conscrypt.NativeConstants;
-
-import android.security.Credentials;
-import android.security.KeyStore;
-import android.security.KeyStoreParameter;
-import android.test.AndroidTestCase;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.OutputStream;
-import java.math.BigInteger;
-import java.security.Key;
-import java.security.KeyFactory;
-import java.security.KeyPair;
-import java.security.KeyStore.Entry;
-import java.security.KeyStore.PrivateKeyEntry;
-import java.security.KeyStore.TrustedCertificateEntry;
-import java.security.KeyStoreException;
-import java.security.PrivateKey;
-import java.security.PublicKey;
-import java.security.cert.Certificate;
-import java.security.cert.CertificateFactory;
-import java.security.cert.X509Certificate;
-import java.security.interfaces.ECKey;
-import java.security.interfaces.RSAKey;
-import java.security.spec.PKCS8EncodedKeySpec;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Date;
-import java.util.Enumeration;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import javax.crypto.Cipher;
-import javax.crypto.SecretKey;
-import javax.crypto.spec.SecretKeySpec;
-import javax.security.auth.x500.X500Principal;
-
-public class AndroidKeyStoreTest extends AndroidTestCase {
- private android.security.KeyStore mAndroidKeyStore;
-
- private java.security.KeyStore mKeyStore;
-
- private static final String TEST_ALIAS_1 = "test1";
-
- private static final String TEST_ALIAS_2 = "test2";
-
- private static final String TEST_ALIAS_3 = "test3";
-
- private static final X500Principal TEST_DN_1 = new X500Principal("CN=test1");
-
- private static final X500Principal TEST_DN_2 = new X500Principal("CN=test2");
-
- private static final BigInteger TEST_SERIAL_1 = BigInteger.ONE;
-
- private static final BigInteger TEST_SERIAL_2 = BigInteger.valueOf(2L);
-
- private static final long NOW_MILLIS = System.currentTimeMillis();
-
- /* We have to round this off because X509v3 doesn't store milliseconds. */
- private static final Date NOW = new Date(NOW_MILLIS - (NOW_MILLIS % 1000L));
-
- @SuppressWarnings("deprecation")
- private static final Date NOW_PLUS_10_YEARS = new Date(NOW.getYear() + 10, 0, 1);
-
- /*
- * The keys and certificates below are generated with:
- *
- * openssl req -new -x509 -days 3650 -extensions v3_ca -keyout cakey.pem -out cacert.pem
- * openssl req -newkey rsa:1024 -keyout userkey.pem -nodes -days 3650 -out userkey.req
- * mkdir -p demoCA/newcerts
- * touch demoCA/index.txt
- * echo "01" > demoCA/serial
- * openssl ca -out usercert.pem -in userkey.req -cert cacert.pem -keyfile cakey.pem -days 3650
- */
-
- /**
- * Generated from above and converted with:
- *
- * openssl x509 -outform d -in cacert.pem | xxd -i | sed 's/0x/(byte) 0x/g'
- */
- private static final byte[] FAKE_RSA_CA_1 = {
- (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0xce, (byte) 0x30, (byte) 0x82,
- (byte) 0x02, (byte) 0x37, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01,
- (byte) 0x02, (byte) 0x02, (byte) 0x09, (byte) 0x00, (byte) 0xe1, (byte) 0x6a,
- (byte) 0xa2, (byte) 0xf4, (byte) 0x2e, (byte) 0x55, (byte) 0x48, (byte) 0x0a,
- (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86,
- (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01,
- (byte) 0x05, (byte) 0x05, (byte) 0x00, (byte) 0x30, (byte) 0x4f, (byte) 0x31,
- (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55,
- (byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x55, (byte) 0x53,
- (byte) 0x31, (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03,
- (byte) 0x55, (byte) 0x04, (byte) 0x08, (byte) 0x13, (byte) 0x02, (byte) 0x43,
- (byte) 0x41, (byte) 0x31, (byte) 0x16, (byte) 0x30, (byte) 0x14, (byte) 0x06,
- (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x07, (byte) 0x13, (byte) 0x0d,
- (byte) 0x4d, (byte) 0x6f, (byte) 0x75, (byte) 0x6e, (byte) 0x74, (byte) 0x61,
- (byte) 0x69, (byte) 0x6e, (byte) 0x20, (byte) 0x56, (byte) 0x69, (byte) 0x65,
- (byte) 0x77, (byte) 0x31, (byte) 0x1b, (byte) 0x30, (byte) 0x19, (byte) 0x06,
- (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a, (byte) 0x13, (byte) 0x12,
- (byte) 0x41, (byte) 0x6e, (byte) 0x64, (byte) 0x72, (byte) 0x6f, (byte) 0x69,
- (byte) 0x64, (byte) 0x20, (byte) 0x54, (byte) 0x65, (byte) 0x73, (byte) 0x74,
- (byte) 0x20, (byte) 0x43, (byte) 0x61, (byte) 0x73, (byte) 0x65, (byte) 0x73,
- (byte) 0x30, (byte) 0x1e, (byte) 0x17, (byte) 0x0d, (byte) 0x31, (byte) 0x32,
- (byte) 0x30, (byte) 0x38, (byte) 0x31, (byte) 0x34, (byte) 0x31, (byte) 0x36,
- (byte) 0x35, (byte) 0x35, (byte) 0x34, (byte) 0x34, (byte) 0x5a, (byte) 0x17,
- (byte) 0x0d, (byte) 0x32, (byte) 0x32, (byte) 0x30, (byte) 0x38, (byte) 0x31,
- (byte) 0x32, (byte) 0x31, (byte) 0x36, (byte) 0x35, (byte) 0x35, (byte) 0x34,
- (byte) 0x34, (byte) 0x5a, (byte) 0x30, (byte) 0x4f, (byte) 0x31, (byte) 0x0b,
- (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
- (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x55, (byte) 0x53, (byte) 0x31,
- (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55,
- (byte) 0x04, (byte) 0x08, (byte) 0x13, (byte) 0x02, (byte) 0x43, (byte) 0x41,
- (byte) 0x31, (byte) 0x16, (byte) 0x30, (byte) 0x14, (byte) 0x06, (byte) 0x03,
- (byte) 0x55, (byte) 0x04, (byte) 0x07, (byte) 0x13, (byte) 0x0d, (byte) 0x4d,
- (byte) 0x6f, (byte) 0x75, (byte) 0x6e, (byte) 0x74, (byte) 0x61, (byte) 0x69,
- (byte) 0x6e, (byte) 0x20, (byte) 0x56, (byte) 0x69, (byte) 0x65, (byte) 0x77,
- (byte) 0x31, (byte) 0x1b, (byte) 0x30, (byte) 0x19, (byte) 0x06, (byte) 0x03,
- (byte) 0x55, (byte) 0x04, (byte) 0x0a, (byte) 0x13, (byte) 0x12, (byte) 0x41,
- (byte) 0x6e, (byte) 0x64, (byte) 0x72, (byte) 0x6f, (byte) 0x69, (byte) 0x64,
- (byte) 0x20, (byte) 0x54, (byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x20,
- (byte) 0x43, (byte) 0x61, (byte) 0x73, (byte) 0x65, (byte) 0x73, (byte) 0x30,
- (byte) 0x81, (byte) 0x9f, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09,
- (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d,
- (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x00, (byte) 0x03,
- (byte) 0x81, (byte) 0x8d, (byte) 0x00, (byte) 0x30, (byte) 0x81, (byte) 0x89,
- (byte) 0x02, (byte) 0x81, (byte) 0x81, (byte) 0x00, (byte) 0xa3, (byte) 0x72,
- (byte) 0xab, (byte) 0xd0, (byte) 0xe4, (byte) 0xad, (byte) 0x2f, (byte) 0xe7,
- (byte) 0xe2, (byte) 0x79, (byte) 0x07, (byte) 0x36, (byte) 0x3d, (byte) 0x0c,
- (byte) 0x8d, (byte) 0x42, (byte) 0x9a, (byte) 0x0a, (byte) 0x33, (byte) 0x64,
- (byte) 0xb3, (byte) 0xcd, (byte) 0xb2, (byte) 0xd7, (byte) 0x3a, (byte) 0x42,
- (byte) 0x06, (byte) 0x77, (byte) 0x45, (byte) 0x29, (byte) 0xe9, (byte) 0xcb,
- (byte) 0xb7, (byte) 0x4a, (byte) 0xd6, (byte) 0xee, (byte) 0xad, (byte) 0x01,
- (byte) 0x91, (byte) 0x9b, (byte) 0x0c, (byte) 0x59, (byte) 0xa1, (byte) 0x03,
- (byte) 0xfa, (byte) 0xf0, (byte) 0x5a, (byte) 0x7c, (byte) 0x4f, (byte) 0xf7,
- (byte) 0x8d, (byte) 0x36, (byte) 0x0f, (byte) 0x1f, (byte) 0x45, (byte) 0x7d,
- (byte) 0x1b, (byte) 0x31, (byte) 0xa1, (byte) 0x35, (byte) 0x0b, (byte) 0x00,
- (byte) 0xed, (byte) 0x7a, (byte) 0xb6, (byte) 0xc8, (byte) 0x4e, (byte) 0xa9,
- (byte) 0x86, (byte) 0x4c, (byte) 0x7b, (byte) 0x99, (byte) 0x57, (byte) 0x41,
- (byte) 0x12, (byte) 0xef, (byte) 0x6b, (byte) 0xbc, (byte) 0x3d, (byte) 0x60,
- (byte) 0xf2, (byte) 0x99, (byte) 0x1a, (byte) 0xcd, (byte) 0xed, (byte) 0x56,
- (byte) 0xa4, (byte) 0xe5, (byte) 0x36, (byte) 0x9f, (byte) 0x24, (byte) 0x1f,
- (byte) 0xdc, (byte) 0x89, (byte) 0x40, (byte) 0xc8, (byte) 0x99, (byte) 0x92,
- (byte) 0xab, (byte) 0x4a, (byte) 0xb5, (byte) 0x61, (byte) 0x45, (byte) 0x62,
- (byte) 0xff, (byte) 0xa3, (byte) 0x45, (byte) 0x65, (byte) 0xaf, (byte) 0xf6,
- (byte) 0x27, (byte) 0x30, (byte) 0x51, (byte) 0x0e, (byte) 0x0e, (byte) 0xeb,
- (byte) 0x79, (byte) 0x0c, (byte) 0xbe, (byte) 0xb3, (byte) 0x0a, (byte) 0x6f,
- (byte) 0x29, (byte) 0x06, (byte) 0xdc, (byte) 0x2f, (byte) 0x6b, (byte) 0x51,
- (byte) 0x02, (byte) 0x03, (byte) 0x01, (byte) 0x00, (byte) 0x01, (byte) 0xa3,
- (byte) 0x81, (byte) 0xb1, (byte) 0x30, (byte) 0x81, (byte) 0xae, (byte) 0x30,
- (byte) 0x1d, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x0e,
- (byte) 0x04, (byte) 0x16, (byte) 0x04, (byte) 0x14, (byte) 0x33, (byte) 0x05,
- (byte) 0xee, (byte) 0xfe, (byte) 0x6f, (byte) 0x60, (byte) 0xc7, (byte) 0xf9,
- (byte) 0xa9, (byte) 0xd2, (byte) 0x73, (byte) 0x5c, (byte) 0x8f, (byte) 0x6d,
- (byte) 0xa2, (byte) 0x2f, (byte) 0x97, (byte) 0x8e, (byte) 0x5d, (byte) 0x51,
- (byte) 0x30, (byte) 0x7f, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d,
- (byte) 0x23, (byte) 0x04, (byte) 0x78, (byte) 0x30, (byte) 0x76, (byte) 0x80,
- (byte) 0x14, (byte) 0x33, (byte) 0x05, (byte) 0xee, (byte) 0xfe, (byte) 0x6f,
- (byte) 0x60, (byte) 0xc7, (byte) 0xf9, (byte) 0xa9, (byte) 0xd2, (byte) 0x73,
- (byte) 0x5c, (byte) 0x8f, (byte) 0x6d, (byte) 0xa2, (byte) 0x2f, (byte) 0x97,
- (byte) 0x8e, (byte) 0x5d, (byte) 0x51, (byte) 0xa1, (byte) 0x53, (byte) 0xa4,
- (byte) 0x51, (byte) 0x30, (byte) 0x4f, (byte) 0x31, (byte) 0x0b, (byte) 0x30,
- (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x06,
- (byte) 0x13, (byte) 0x02, (byte) 0x55, (byte) 0x53, (byte) 0x31, (byte) 0x0b,
- (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
- (byte) 0x08, (byte) 0x13, (byte) 0x02, (byte) 0x43, (byte) 0x41, (byte) 0x31,
- (byte) 0x16, (byte) 0x30, (byte) 0x14, (byte) 0x06, (byte) 0x03, (byte) 0x55,
- (byte) 0x04, (byte) 0x07, (byte) 0x13, (byte) 0x0d, (byte) 0x4d, (byte) 0x6f,
- (byte) 0x75, (byte) 0x6e, (byte) 0x74, (byte) 0x61, (byte) 0x69, (byte) 0x6e,
- (byte) 0x20, (byte) 0x56, (byte) 0x69, (byte) 0x65, (byte) 0x77, (byte) 0x31,
- (byte) 0x1b, (byte) 0x30, (byte) 0x19, (byte) 0x06, (byte) 0x03, (byte) 0x55,
- (byte) 0x04, (byte) 0x0a, (byte) 0x13, (byte) 0x12, (byte) 0x41, (byte) 0x6e,
- (byte) 0x64, (byte) 0x72, (byte) 0x6f, (byte) 0x69, (byte) 0x64, (byte) 0x20,
- (byte) 0x54, (byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x20, (byte) 0x43,
- (byte) 0x61, (byte) 0x73, (byte) 0x65, (byte) 0x73, (byte) 0x82, (byte) 0x09,
- (byte) 0x00, (byte) 0xe1, (byte) 0x6a, (byte) 0xa2, (byte) 0xf4, (byte) 0x2e,
- (byte) 0x55, (byte) 0x48, (byte) 0x0a, (byte) 0x30, (byte) 0x0c, (byte) 0x06,
- (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x13, (byte) 0x04, (byte) 0x05,
- (byte) 0x30, (byte) 0x03, (byte) 0x01, (byte) 0x01, (byte) 0xff, (byte) 0x30,
- (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86, (byte) 0x48,
- (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x05,
- (byte) 0x05, (byte) 0x00, (byte) 0x03, (byte) 0x81, (byte) 0x81, (byte) 0x00,
- (byte) 0x8c, (byte) 0x30, (byte) 0x42, (byte) 0xfa, (byte) 0xeb, (byte) 0x1a,
- (byte) 0x26, (byte) 0xeb, (byte) 0xda, (byte) 0x56, (byte) 0x32, (byte) 0xf2,
- (byte) 0x9d, (byte) 0xa5, (byte) 0x24, (byte) 0xd8, (byte) 0x3a, (byte) 0xda,
- (byte) 0x30, (byte) 0xa6, (byte) 0x8b, (byte) 0x46, (byte) 0xfe, (byte) 0xfe,
- (byte) 0xdb, (byte) 0xf1, (byte) 0xe6, (byte) 0xe1, (byte) 0x7c, (byte) 0x1b,
- (byte) 0xe7, (byte) 0x77, (byte) 0x00, (byte) 0xa1, (byte) 0x1c, (byte) 0x19,
- (byte) 0x17, (byte) 0x73, (byte) 0xb0, (byte) 0xf0, (byte) 0x9d, (byte) 0xf3,
- (byte) 0x4f, (byte) 0xb6, (byte) 0xbc, (byte) 0xc7, (byte) 0x47, (byte) 0x85,
- (byte) 0x2a, (byte) 0x4a, (byte) 0xa1, (byte) 0xa5, (byte) 0x58, (byte) 0xf5,
- (byte) 0xc5, (byte) 0x1a, (byte) 0x51, (byte) 0xb1, (byte) 0x04, (byte) 0x80,
- (byte) 0xee, (byte) 0x3a, (byte) 0xec, (byte) 0x2f, (byte) 0xe1, (byte) 0xfd,
- (byte) 0x58, (byte) 0xeb, (byte) 0xed, (byte) 0x82, (byte) 0x9e, (byte) 0x38,
- (byte) 0xa3, (byte) 0x24, (byte) 0x75, (byte) 0xf7, (byte) 0x3e, (byte) 0xc2,
- (byte) 0xc5, (byte) 0x27, (byte) 0xeb, (byte) 0x6f, (byte) 0x7b, (byte) 0x50,
- (byte) 0xda, (byte) 0x43, (byte) 0xdc, (byte) 0x3b, (byte) 0x0b, (byte) 0x6f,
- (byte) 0x78, (byte) 0x8f, (byte) 0xb0, (byte) 0x66, (byte) 0xe1, (byte) 0x12,
- (byte) 0x87, (byte) 0x5f, (byte) 0x97, (byte) 0x7b, (byte) 0xca, (byte) 0x14,
- (byte) 0x79, (byte) 0xf7, (byte) 0xe8, (byte) 0x6c, (byte) 0x72, (byte) 0xdb,
- (byte) 0x91, (byte) 0x65, (byte) 0x17, (byte) 0x54, (byte) 0xe0, (byte) 0x74,
- (byte) 0x1d, (byte) 0xac, (byte) 0x47, (byte) 0x04, (byte) 0x12, (byte) 0xe0,
- (byte) 0xc3, (byte) 0x66, (byte) 0x19, (byte) 0x05, (byte) 0x2e, (byte) 0x7e,
- (byte) 0xf1, (byte) 0x61
- };
-
- /**
- * Generated from above and converted with:
- *
- * openssl pkcs8 -topk8 -outform d -in userkey.pem -nocrypt | xxd -i | sed 's/0x/(byte) 0x/g'
- */
- private static final byte[] FAKE_RSA_KEY_1 = new byte[] {
- (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x78, (byte) 0x02, (byte) 0x01,
- (byte) 0x00, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a,
- (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01,
- (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x00, (byte) 0x04, (byte) 0x82,
- (byte) 0x02, (byte) 0x62, (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x5e,
- (byte) 0x02, (byte) 0x01, (byte) 0x00, (byte) 0x02, (byte) 0x81, (byte) 0x81,
- (byte) 0x00, (byte) 0xce, (byte) 0x29, (byte) 0xeb, (byte) 0xf6, (byte) 0x5b,
- (byte) 0x25, (byte) 0xdc, (byte) 0xa1, (byte) 0xa6, (byte) 0x2c, (byte) 0x66,
- (byte) 0xcb, (byte) 0x20, (byte) 0x90, (byte) 0x27, (byte) 0x86, (byte) 0x8a,
- (byte) 0x44, (byte) 0x71, (byte) 0x50, (byte) 0xda, (byte) 0xd3, (byte) 0x02,
- (byte) 0x77, (byte) 0x55, (byte) 0xe9, (byte) 0xe8, (byte) 0x08, (byte) 0xf3,
- (byte) 0x36, (byte) 0x9a, (byte) 0xae, (byte) 0xab, (byte) 0x04, (byte) 0x6d,
- (byte) 0x00, (byte) 0x99, (byte) 0xbf, (byte) 0x7d, (byte) 0x0f, (byte) 0x67,
- (byte) 0x8b, (byte) 0x1d, (byte) 0xd4, (byte) 0x2b, (byte) 0x7c, (byte) 0xcb,
- (byte) 0xcd, (byte) 0x33, (byte) 0xc7, (byte) 0x84, (byte) 0x30, (byte) 0xe2,
- (byte) 0x45, (byte) 0x21, (byte) 0xb3, (byte) 0x75, (byte) 0xf5, (byte) 0x79,
- (byte) 0x02, (byte) 0xda, (byte) 0x50, (byte) 0xa3, (byte) 0x8b, (byte) 0xce,
- (byte) 0xc3, (byte) 0x8e, (byte) 0x0f, (byte) 0x25, (byte) 0xeb, (byte) 0x08,
- (byte) 0x2c, (byte) 0xdd, (byte) 0x1c, (byte) 0xcf, (byte) 0xff, (byte) 0x3b,
- (byte) 0xde, (byte) 0xb6, (byte) 0xaa, (byte) 0x2a, (byte) 0xa9, (byte) 0xc4,
- (byte) 0x8a, (byte) 0x24, (byte) 0x24, (byte) 0xe6, (byte) 0x29, (byte) 0x0d,
- (byte) 0x98, (byte) 0x4c, (byte) 0x32, (byte) 0xa1, (byte) 0x7b, (byte) 0x23,
- (byte) 0x2b, (byte) 0x42, (byte) 0x30, (byte) 0xee, (byte) 0x78, (byte) 0x08,
- (byte) 0x47, (byte) 0xad, (byte) 0xf2, (byte) 0x96, (byte) 0xd5, (byte) 0xf1,
- (byte) 0x62, (byte) 0x42, (byte) 0x2d, (byte) 0x35, (byte) 0x19, (byte) 0xb4,
- (byte) 0x3c, (byte) 0xc9, (byte) 0xc3, (byte) 0x5f, (byte) 0x03, (byte) 0x16,
- (byte) 0x3a, (byte) 0x23, (byte) 0xac, (byte) 0xcb, (byte) 0xce, (byte) 0x9e,
- (byte) 0x51, (byte) 0x2e, (byte) 0x6d, (byte) 0x02, (byte) 0x03, (byte) 0x01,
- (byte) 0x00, (byte) 0x01, (byte) 0x02, (byte) 0x81, (byte) 0x80, (byte) 0x16,
- (byte) 0x59, (byte) 0xc3, (byte) 0x24, (byte) 0x1d, (byte) 0x33, (byte) 0x98,
- (byte) 0x9c, (byte) 0xc9, (byte) 0xc8, (byte) 0x2c, (byte) 0x88, (byte) 0xbf,
- (byte) 0x0a, (byte) 0x01, (byte) 0xce, (byte) 0xfb, (byte) 0x34, (byte) 0x7a,
- (byte) 0x58, (byte) 0x7a, (byte) 0xb0, (byte) 0xbf, (byte) 0xa6, (byte) 0xb2,
- (byte) 0x60, (byte) 0xbe, (byte) 0x70, (byte) 0x21, (byte) 0xf5, (byte) 0xfc,
- (byte) 0x85, (byte) 0x0d, (byte) 0x33, (byte) 0x58, (byte) 0xa1, (byte) 0xe5,
- (byte) 0x09, (byte) 0x36, (byte) 0x84, (byte) 0xb2, (byte) 0x04, (byte) 0x0a,
- (byte) 0x02, (byte) 0xd3, (byte) 0x88, (byte) 0x1f, (byte) 0x0c, (byte) 0x2b,
- (byte) 0x1d, (byte) 0xe9, (byte) 0x3d, (byte) 0xe7, (byte) 0x79, (byte) 0xf9,
- (byte) 0x32, (byte) 0x5c, (byte) 0x8a, (byte) 0x75, (byte) 0x49, (byte) 0x12,
- (byte) 0xe4, (byte) 0x05, (byte) 0x26, (byte) 0xd4, (byte) 0x2e, (byte) 0x9e,
- (byte) 0x1f, (byte) 0xcc, (byte) 0x54, (byte) 0xad, (byte) 0x33, (byte) 0x8d,
- (byte) 0x99, (byte) 0x00, (byte) 0xdc, (byte) 0xf5, (byte) 0xb4, (byte) 0xa2,
- (byte) 0x2f, (byte) 0xba, (byte) 0xe5, (byte) 0x62, (byte) 0x30, (byte) 0x6d,
- (byte) 0xe6, (byte) 0x3d, (byte) 0xeb, (byte) 0x24, (byte) 0xc2, (byte) 0xdc,
- (byte) 0x5f, (byte) 0xb7, (byte) 0x16, (byte) 0x35, (byte) 0xa3, (byte) 0x98,
- (byte) 0x98, (byte) 0xa8, (byte) 0xef, (byte) 0xe8, (byte) 0xc4, (byte) 0x96,
- (byte) 0x6d, (byte) 0x38, (byte) 0xab, (byte) 0x26, (byte) 0x6d, (byte) 0x30,
- (byte) 0xc2, (byte) 0xa0, (byte) 0x44, (byte) 0xe4, (byte) 0xff, (byte) 0x7e,
- (byte) 0xbe, (byte) 0x7c, (byte) 0x33, (byte) 0xa5, (byte) 0x10, (byte) 0xad,
- (byte) 0xd7, (byte) 0x1e, (byte) 0x13, (byte) 0x20, (byte) 0xb3, (byte) 0x1f,
- (byte) 0x41, (byte) 0x02, (byte) 0x41, (byte) 0x00, (byte) 0xf1, (byte) 0x89,
- (byte) 0x07, (byte) 0x0f, (byte) 0xe8, (byte) 0xcf, (byte) 0xab, (byte) 0x13,
- (byte) 0x2a, (byte) 0x8f, (byte) 0x88, (byte) 0x80, (byte) 0x11, (byte) 0x9a,
- (byte) 0x79, (byte) 0xb6, (byte) 0x59, (byte) 0x3a, (byte) 0x50, (byte) 0x6e,
- (byte) 0x57, (byte) 0x37, (byte) 0xab, (byte) 0x2a, (byte) 0xd2, (byte) 0xaa,
- (byte) 0xd9, (byte) 0x72, (byte) 0x73, (byte) 0xff, (byte) 0x8b, (byte) 0x47,
- (byte) 0x76, (byte) 0xdd, (byte) 0xdc, (byte) 0xf5, (byte) 0x97, (byte) 0x44,
- (byte) 0x3a, (byte) 0x78, (byte) 0xbe, (byte) 0x17, (byte) 0xb4, (byte) 0x22,
- (byte) 0x6f, (byte) 0xe5, (byte) 0x23, (byte) 0x70, (byte) 0x1d, (byte) 0x10,
- (byte) 0x5d, (byte) 0xba, (byte) 0x16, (byte) 0x81, (byte) 0xf1, (byte) 0x45,
- (byte) 0xce, (byte) 0x30, (byte) 0xb4, (byte) 0xab, (byte) 0x80, (byte) 0xe4,
- (byte) 0x98, (byte) 0x31, (byte) 0x02, (byte) 0x41, (byte) 0x00, (byte) 0xda,
- (byte) 0x82, (byte) 0x9d, (byte) 0x3f, (byte) 0xca, (byte) 0x2f, (byte) 0xe1,
- (byte) 0xd4, (byte) 0x86, (byte) 0x77, (byte) 0x48, (byte) 0xa6, (byte) 0xab,
- (byte) 0xab, (byte) 0x1c, (byte) 0x42, (byte) 0x5c, (byte) 0xd5, (byte) 0xc7,
- (byte) 0x46, (byte) 0x59, (byte) 0x91, (byte) 0x3f, (byte) 0xfc, (byte) 0xcc,
- (byte) 0xec, (byte) 0xc2, (byte) 0x40, (byte) 0x12, (byte) 0x2c, (byte) 0x8d,
- (byte) 0x1f, (byte) 0xa2, (byte) 0x18, (byte) 0x88, (byte) 0xee, (byte) 0x82,
- (byte) 0x4a, (byte) 0x5a, (byte) 0x5e, (byte) 0x88, (byte) 0x20, (byte) 0xe3,
- (byte) 0x7b, (byte) 0xe0, (byte) 0xd8, (byte) 0x3a, (byte) 0x52, (byte) 0x9a,
- (byte) 0x26, (byte) 0x6a, (byte) 0x04, (byte) 0xec, (byte) 0xe8, (byte) 0xb9,
- (byte) 0x48, (byte) 0x40, (byte) 0xe1, (byte) 0xe1, (byte) 0x83, (byte) 0xa6,
- (byte) 0x67, (byte) 0xa6, (byte) 0xfd, (byte) 0x02, (byte) 0x41, (byte) 0x00,
- (byte) 0x89, (byte) 0x72, (byte) 0x3e, (byte) 0xb0, (byte) 0x90, (byte) 0xfd,
- (byte) 0x4c, (byte) 0x0e, (byte) 0xd6, (byte) 0x13, (byte) 0x63, (byte) 0xcb,
- (byte) 0xed, (byte) 0x38, (byte) 0x88, (byte) 0xb6, (byte) 0x79, (byte) 0xc4,
- (byte) 0x33, (byte) 0x6c, (byte) 0xf6, (byte) 0xf8, (byte) 0xd8, (byte) 0xd0,
- (byte) 0xbf, (byte) 0x9d, (byte) 0x35, (byte) 0xac, (byte) 0x69, (byte) 0xd2,
- (byte) 0x2b, (byte) 0xc1, (byte) 0xf9, (byte) 0x24, (byte) 0x7b, (byte) 0xce,
- (byte) 0xcd, (byte) 0xcb, (byte) 0xa7, (byte) 0xb2, (byte) 0x7a, (byte) 0x0a,
- (byte) 0x27, (byte) 0x19, (byte) 0xc9, (byte) 0xaf, (byte) 0x0d, (byte) 0x21,
- (byte) 0x89, (byte) 0x88, (byte) 0x7c, (byte) 0xad, (byte) 0x9e, (byte) 0x8d,
- (byte) 0x47, (byte) 0x6d, (byte) 0x3f, (byte) 0xce, (byte) 0x7b, (byte) 0xa1,
- (byte) 0x74, (byte) 0xf1, (byte) 0xa0, (byte) 0xa1, (byte) 0x02, (byte) 0x41,
- (byte) 0x00, (byte) 0xd9, (byte) 0xa8, (byte) 0xf5, (byte) 0xfe, (byte) 0xce,
- (byte) 0xe6, (byte) 0x77, (byte) 0x6b, (byte) 0xfe, (byte) 0x2d, (byte) 0xe0,
- (byte) 0x1e, (byte) 0xb6, (byte) 0x2e, (byte) 0x12, (byte) 0x4e, (byte) 0x40,
- (byte) 0xaf, (byte) 0x6a, (byte) 0x7b, (byte) 0x37, (byte) 0x49, (byte) 0x2a,
- (byte) 0x96, (byte) 0x25, (byte) 0x83, (byte) 0x49, (byte) 0xd4, (byte) 0x0c,
- (byte) 0xc6, (byte) 0x78, (byte) 0x25, (byte) 0x24, (byte) 0x90, (byte) 0x90,
- (byte) 0x06, (byte) 0x15, (byte) 0x9e, (byte) 0xfe, (byte) 0xf9, (byte) 0xdf,
- (byte) 0x5b, (byte) 0xf3, (byte) 0x7e, (byte) 0x38, (byte) 0x70, (byte) 0xeb,
- (byte) 0x57, (byte) 0xd0, (byte) 0xd9, (byte) 0xa7, (byte) 0x0e, (byte) 0x14,
- (byte) 0xf7, (byte) 0x95, (byte) 0x68, (byte) 0xd5, (byte) 0xc8, (byte) 0xab,
- (byte) 0x9d, (byte) 0x3a, (byte) 0x2b, (byte) 0x51, (byte) 0xf9, (byte) 0x02,
- (byte) 0x41, (byte) 0x00, (byte) 0x96, (byte) 0xdf, (byte) 0xe9, (byte) 0x67,
- (byte) 0x6c, (byte) 0xdc, (byte) 0x90, (byte) 0x14, (byte) 0xb4, (byte) 0x1d,
- (byte) 0x22, (byte) 0x33, (byte) 0x4a, (byte) 0x31, (byte) 0xc1, (byte) 0x9d,
- (byte) 0x2e, (byte) 0xff, (byte) 0x9a, (byte) 0x2a, (byte) 0x95, (byte) 0x4b,
- (byte) 0x27, (byte) 0x74, (byte) 0xcb, (byte) 0x21, (byte) 0xc3, (byte) 0xd2,
- (byte) 0x0b, (byte) 0xb2, (byte) 0x46, (byte) 0x87, (byte) 0xf8, (byte) 0x28,
- (byte) 0x01, (byte) 0x8b, (byte) 0xd8, (byte) 0xb9, (byte) 0x4b, (byte) 0xcd,
- (byte) 0x9a, (byte) 0x96, (byte) 0x41, (byte) 0x0e, (byte) 0x36, (byte) 0x6d,
- (byte) 0x40, (byte) 0x42, (byte) 0xbc, (byte) 0xd9, (byte) 0xd3, (byte) 0x7b,
- (byte) 0xbc, (byte) 0xa7, (byte) 0x92, (byte) 0x90, (byte) 0xdd, (byte) 0xa1,
- (byte) 0x9c, (byte) 0xce, (byte) 0xa1, (byte) 0x87, (byte) 0x11, (byte) 0x51
- };
-
- /**
- * Generated from above and converted with:
- *
- * openssl x509 -outform d -in usercert.pem | xxd -i | sed 's/0x/(byte) 0x/g'
- */
- private static final byte[] FAKE_RSA_USER_1 = new byte[] {
- (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x95, (byte) 0x30, (byte) 0x82,
- (byte) 0x01, (byte) 0xfe, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01,
- (byte) 0x02, (byte) 0x02, (byte) 0x01, (byte) 0x01, (byte) 0x30, (byte) 0x0d,
- (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86,
- (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x05,
- (byte) 0x00, (byte) 0x30, (byte) 0x4f, (byte) 0x31, (byte) 0x0b, (byte) 0x30,
- (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x06,
- (byte) 0x13, (byte) 0x02, (byte) 0x55, (byte) 0x53, (byte) 0x31, (byte) 0x0b,
- (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
- (byte) 0x08, (byte) 0x13, (byte) 0x02, (byte) 0x43, (byte) 0x41, (byte) 0x31,
- (byte) 0x16, (byte) 0x30, (byte) 0x14, (byte) 0x06, (byte) 0x03, (byte) 0x55,
- (byte) 0x04, (byte) 0x07, (byte) 0x13, (byte) 0x0d, (byte) 0x4d, (byte) 0x6f,
- (byte) 0x75, (byte) 0x6e, (byte) 0x74, (byte) 0x61, (byte) 0x69, (byte) 0x6e,
- (byte) 0x20, (byte) 0x56, (byte) 0x69, (byte) 0x65, (byte) 0x77, (byte) 0x31,
- (byte) 0x1b, (byte) 0x30, (byte) 0x19, (byte) 0x06, (byte) 0x03, (byte) 0x55,
- (byte) 0x04, (byte) 0x0a, (byte) 0x13, (byte) 0x12, (byte) 0x41, (byte) 0x6e,
- (byte) 0x64, (byte) 0x72, (byte) 0x6f, (byte) 0x69, (byte) 0x64, (byte) 0x20,
- (byte) 0x54, (byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x20, (byte) 0x43,
- (byte) 0x61, (byte) 0x73, (byte) 0x65, (byte) 0x73, (byte) 0x30, (byte) 0x1e,
- (byte) 0x17, (byte) 0x0d, (byte) 0x31, (byte) 0x32, (byte) 0x30, (byte) 0x38,
- (byte) 0x31, (byte) 0x34, (byte) 0x32, (byte) 0x33, (byte) 0x32, (byte) 0x35,
- (byte) 0x34, (byte) 0x38, (byte) 0x5a, (byte) 0x17, (byte) 0x0d, (byte) 0x32,
- (byte) 0x32, (byte) 0x30, (byte) 0x38, (byte) 0x31, (byte) 0x32, (byte) 0x32,
- (byte) 0x33, (byte) 0x32, (byte) 0x35, (byte) 0x34, (byte) 0x38, (byte) 0x5a,
- (byte) 0x30, (byte) 0x55, (byte) 0x31, (byte) 0x0b, (byte) 0x30, (byte) 0x09,
- (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x06, (byte) 0x13,
- (byte) 0x02, (byte) 0x55, (byte) 0x53, (byte) 0x31, (byte) 0x0b, (byte) 0x30,
- (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x08,
- (byte) 0x13, (byte) 0x02, (byte) 0x43, (byte) 0x41, (byte) 0x31, (byte) 0x1b,
- (byte) 0x30, (byte) 0x19, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
- (byte) 0x0a, (byte) 0x13, (byte) 0x12, (byte) 0x41, (byte) 0x6e, (byte) 0x64,
- (byte) 0x72, (byte) 0x6f, (byte) 0x69, (byte) 0x64, (byte) 0x20, (byte) 0x54,
- (byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x20, (byte) 0x43, (byte) 0x61,
- (byte) 0x73, (byte) 0x65, (byte) 0x73, (byte) 0x31, (byte) 0x1c, (byte) 0x30,
- (byte) 0x1a, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x03,
- (byte) 0x13, (byte) 0x13, (byte) 0x73, (byte) 0x65, (byte) 0x72, (byte) 0x76,
- (byte) 0x65, (byte) 0x72, (byte) 0x31, (byte) 0x2e, (byte) 0x65, (byte) 0x78,
- (byte) 0x61, (byte) 0x6d, (byte) 0x70, (byte) 0x6c, (byte) 0x65, (byte) 0x2e,
- (byte) 0x63, (byte) 0x6f, (byte) 0x6d, (byte) 0x30, (byte) 0x81, (byte) 0x9f,
- (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86,
- (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01,
- (byte) 0x01, (byte) 0x05, (byte) 0x00, (byte) 0x03, (byte) 0x81, (byte) 0x8d,
- (byte) 0x00, (byte) 0x30, (byte) 0x81, (byte) 0x89, (byte) 0x02, (byte) 0x81,
- (byte) 0x81, (byte) 0x00, (byte) 0xce, (byte) 0x29, (byte) 0xeb, (byte) 0xf6,
- (byte) 0x5b, (byte) 0x25, (byte) 0xdc, (byte) 0xa1, (byte) 0xa6, (byte) 0x2c,
- (byte) 0x66, (byte) 0xcb, (byte) 0x20, (byte) 0x90, (byte) 0x27, (byte) 0x86,
- (byte) 0x8a, (byte) 0x44, (byte) 0x71, (byte) 0x50, (byte) 0xda, (byte) 0xd3,
- (byte) 0x02, (byte) 0x77, (byte) 0x55, (byte) 0xe9, (byte) 0xe8, (byte) 0x08,
- (byte) 0xf3, (byte) 0x36, (byte) 0x9a, (byte) 0xae, (byte) 0xab, (byte) 0x04,
- (byte) 0x6d, (byte) 0x00, (byte) 0x99, (byte) 0xbf, (byte) 0x7d, (byte) 0x0f,
- (byte) 0x67, (byte) 0x8b, (byte) 0x1d, (byte) 0xd4, (byte) 0x2b, (byte) 0x7c,
- (byte) 0xcb, (byte) 0xcd, (byte) 0x33, (byte) 0xc7, (byte) 0x84, (byte) 0x30,
- (byte) 0xe2, (byte) 0x45, (byte) 0x21, (byte) 0xb3, (byte) 0x75, (byte) 0xf5,
- (byte) 0x79, (byte) 0x02, (byte) 0xda, (byte) 0x50, (byte) 0xa3, (byte) 0x8b,
- (byte) 0xce, (byte) 0xc3, (byte) 0x8e, (byte) 0x0f, (byte) 0x25, (byte) 0xeb,
- (byte) 0x08, (byte) 0x2c, (byte) 0xdd, (byte) 0x1c, (byte) 0xcf, (byte) 0xff,
- (byte) 0x3b, (byte) 0xde, (byte) 0xb6, (byte) 0xaa, (byte) 0x2a, (byte) 0xa9,
- (byte) 0xc4, (byte) 0x8a, (byte) 0x24, (byte) 0x24, (byte) 0xe6, (byte) 0x29,
- (byte) 0x0d, (byte) 0x98, (byte) 0x4c, (byte) 0x32, (byte) 0xa1, (byte) 0x7b,
- (byte) 0x23, (byte) 0x2b, (byte) 0x42, (byte) 0x30, (byte) 0xee, (byte) 0x78,
- (byte) 0x08, (byte) 0x47, (byte) 0xad, (byte) 0xf2, (byte) 0x96, (byte) 0xd5,
- (byte) 0xf1, (byte) 0x62, (byte) 0x42, (byte) 0x2d, (byte) 0x35, (byte) 0x19,
- (byte) 0xb4, (byte) 0x3c, (byte) 0xc9, (byte) 0xc3, (byte) 0x5f, (byte) 0x03,
- (byte) 0x16, (byte) 0x3a, (byte) 0x23, (byte) 0xac, (byte) 0xcb, (byte) 0xce,
- (byte) 0x9e, (byte) 0x51, (byte) 0x2e, (byte) 0x6d, (byte) 0x02, (byte) 0x03,
- (byte) 0x01, (byte) 0x00, (byte) 0x01, (byte) 0xa3, (byte) 0x7b, (byte) 0x30,
- (byte) 0x79, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55,
- (byte) 0x1d, (byte) 0x13, (byte) 0x04, (byte) 0x02, (byte) 0x30, (byte) 0x00,
- (byte) 0x30, (byte) 0x2c, (byte) 0x06, (byte) 0x09, (byte) 0x60, (byte) 0x86,
- (byte) 0x48, (byte) 0x01, (byte) 0x86, (byte) 0xf8, (byte) 0x42, (byte) 0x01,
- (byte) 0x0d, (byte) 0x04, (byte) 0x1f, (byte) 0x16, (byte) 0x1d, (byte) 0x4f,
- (byte) 0x70, (byte) 0x65, (byte) 0x6e, (byte) 0x53, (byte) 0x53, (byte) 0x4c,
- (byte) 0x20, (byte) 0x47, (byte) 0x65, (byte) 0x6e, (byte) 0x65, (byte) 0x72,
- (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x64, (byte) 0x20, (byte) 0x43,
- (byte) 0x65, (byte) 0x72, (byte) 0x74, (byte) 0x69, (byte) 0x66, (byte) 0x69,
- (byte) 0x63, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x30, (byte) 0x1d,
- (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x0e, (byte) 0x04,
- (byte) 0x16, (byte) 0x04, (byte) 0x14, (byte) 0x32, (byte) 0xa1, (byte) 0x1e,
- (byte) 0x6b, (byte) 0x69, (byte) 0x04, (byte) 0xfe, (byte) 0xb3, (byte) 0xcd,
- (byte) 0xf8, (byte) 0xbb, (byte) 0x14, (byte) 0xcd, (byte) 0xff, (byte) 0xd4,
- (byte) 0x16, (byte) 0xc3, (byte) 0xab, (byte) 0x44, (byte) 0x2f, (byte) 0x30,
- (byte) 0x1f, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x23,
- (byte) 0x04, (byte) 0x18, (byte) 0x30, (byte) 0x16, (byte) 0x80, (byte) 0x14,
- (byte) 0x33, (byte) 0x05, (byte) 0xee, (byte) 0xfe, (byte) 0x6f, (byte) 0x60,
- (byte) 0xc7, (byte) 0xf9, (byte) 0xa9, (byte) 0xd2, (byte) 0x73, (byte) 0x5c,
- (byte) 0x8f, (byte) 0x6d, (byte) 0xa2, (byte) 0x2f, (byte) 0x97, (byte) 0x8e,
- (byte) 0x5d, (byte) 0x51, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09,
- (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d,
- (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x05, (byte) 0x00, (byte) 0x03,
- (byte) 0x81, (byte) 0x81, (byte) 0x00, (byte) 0x46, (byte) 0x42, (byte) 0xef,
- (byte) 0x56, (byte) 0x89, (byte) 0x78, (byte) 0x90, (byte) 0x38, (byte) 0x24,
- (byte) 0x9f, (byte) 0x8c, (byte) 0x7a, (byte) 0xce, (byte) 0x7a, (byte) 0xa5,
- (byte) 0xb5, (byte) 0x1e, (byte) 0x74, (byte) 0x96, (byte) 0x34, (byte) 0x49,
- (byte) 0x8b, (byte) 0xed, (byte) 0x44, (byte) 0xb3, (byte) 0xc9, (byte) 0x05,
- (byte) 0xd7, (byte) 0x48, (byte) 0x55, (byte) 0x52, (byte) 0x59, (byte) 0x15,
- (byte) 0x0b, (byte) 0xaa, (byte) 0x16, (byte) 0x86, (byte) 0xd2, (byte) 0x8e,
- (byte) 0x16, (byte) 0x99, (byte) 0xe8, (byte) 0x5f, (byte) 0x11, (byte) 0x71,
- (byte) 0x42, (byte) 0x55, (byte) 0xd1, (byte) 0xc4, (byte) 0x6f, (byte) 0x2e,
- (byte) 0xa9, (byte) 0x64, (byte) 0x6f, (byte) 0xd8, (byte) 0xfd, (byte) 0x43,
- (byte) 0x13, (byte) 0x24, (byte) 0xaa, (byte) 0x67, (byte) 0xe6, (byte) 0xf5,
- (byte) 0xca, (byte) 0x80, (byte) 0x5e, (byte) 0x3a, (byte) 0x3e, (byte) 0xcc,
- (byte) 0x4f, (byte) 0xba, (byte) 0x87, (byte) 0xe6, (byte) 0xae, (byte) 0xbf,
- (byte) 0x8f, (byte) 0xd5, (byte) 0x28, (byte) 0x38, (byte) 0x58, (byte) 0x30,
- (byte) 0x24, (byte) 0xf6, (byte) 0x53, (byte) 0x5b, (byte) 0x41, (byte) 0x53,
- (byte) 0xe6, (byte) 0x45, (byte) 0xbc, (byte) 0xbe, (byte) 0xe6, (byte) 0xbb,
- (byte) 0x5d, (byte) 0xd8, (byte) 0xa7, (byte) 0xf9, (byte) 0x64, (byte) 0x99,
- (byte) 0x04, (byte) 0x43, (byte) 0x75, (byte) 0xd7, (byte) 0x2d, (byte) 0x32,
- (byte) 0x0a, (byte) 0x94, (byte) 0xaf, (byte) 0x06, (byte) 0x34, (byte) 0xae,
- (byte) 0x46, (byte) 0xbd, (byte) 0xda, (byte) 0x00, (byte) 0x0e, (byte) 0x25,
- (byte) 0xc2, (byte) 0xf7, (byte) 0xc9, (byte) 0xc3, (byte) 0x65, (byte) 0xd2,
- (byte) 0x08, (byte) 0x41, (byte) 0x0a, (byte) 0xf3, (byte) 0x72
- };
-
- /*
- * The keys and certificates below are generated with:
- *
- * openssl req -new -x509 -days 3650 -extensions v3_ca -keyout cakey.pem -out cacert.pem
- * openssl ecparam -name prime256v1 -out ecparam.pem
- * openssl req -newkey ec:ecparam.pem -keyout userkey.pem -nodes -days 3650 -out userkey.req
- * mkdir -p demoCA/newcerts
- * touch demoCA/index.txt
- * echo "01" > demoCA/serial
- * openssl ca -out usercert.pem -in userkey.req -cert cacert.pem -keyfile cakey.pem -days 3650
- */
-
- /**
- * Generated from above and converted with:
- *
- * openssl x509 -outform d -in cacert.pem | xxd -i | sed 's/0x/(byte) 0x/g'
- */
- private static final byte[] FAKE_EC_CA_1 = {
- (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x58, (byte) 0x30, (byte) 0x82,
- (byte) 0x01, (byte) 0xc1, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01,
- (byte) 0x02, (byte) 0x02, (byte) 0x09, (byte) 0x00, (byte) 0xe1, (byte) 0xb2,
- (byte) 0x8c, (byte) 0x04, (byte) 0x95, (byte) 0xeb, (byte) 0x10, (byte) 0xcb,
- (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86,
- (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01,
- (byte) 0x05, (byte) 0x05, (byte) 0x00, (byte) 0x30, (byte) 0x45, (byte) 0x31,
- (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55,
- (byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x55,
- (byte) 0x31, (byte) 0x13, (byte) 0x30, (byte) 0x11, (byte) 0x06, (byte) 0x03,
- (byte) 0x55, (byte) 0x04, (byte) 0x08, (byte) 0x0c, (byte) 0x0a, (byte) 0x53,
- (byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x2d, (byte) 0x53, (byte) 0x74,
- (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x31, (byte) 0x21, (byte) 0x30,
- (byte) 0x1f, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a,
- (byte) 0x0c, (byte) 0x18, (byte) 0x49, (byte) 0x6e, (byte) 0x74, (byte) 0x65,
- (byte) 0x72, (byte) 0x6e, (byte) 0x65, (byte) 0x74, (byte) 0x20, (byte) 0x57,
- (byte) 0x69, (byte) 0x64, (byte) 0x67, (byte) 0x69, (byte) 0x74, (byte) 0x73,
- (byte) 0x20, (byte) 0x50, (byte) 0x74, (byte) 0x79, (byte) 0x20, (byte) 0x4c,
- (byte) 0x74, (byte) 0x64, (byte) 0x30, (byte) 0x1e, (byte) 0x17, (byte) 0x0d,
- (byte) 0x31, (byte) 0x33, (byte) 0x30, (byte) 0x38, (byte) 0x32, (byte) 0x37,
- (byte) 0x31, (byte) 0x36, (byte) 0x32, (byte) 0x38, (byte) 0x32, (byte) 0x38,
- (byte) 0x5a, (byte) 0x17, (byte) 0x0d, (byte) 0x32, (byte) 0x33, (byte) 0x30,
- (byte) 0x38, (byte) 0x32, (byte) 0x35, (byte) 0x31, (byte) 0x36, (byte) 0x32,
- (byte) 0x38, (byte) 0x32, (byte) 0x38, (byte) 0x5a, (byte) 0x30, (byte) 0x45,
- (byte) 0x31, (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03,
- (byte) 0x55, (byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x41,
- (byte) 0x55, (byte) 0x31, (byte) 0x13, (byte) 0x30, (byte) 0x11, (byte) 0x06,
- (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x08, (byte) 0x0c, (byte) 0x0a,
- (byte) 0x53, (byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x2d, (byte) 0x53,
- (byte) 0x74, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x31, (byte) 0x21,
- (byte) 0x30, (byte) 0x1f, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
- (byte) 0x0a, (byte) 0x0c, (byte) 0x18, (byte) 0x49, (byte) 0x6e, (byte) 0x74,
- (byte) 0x65, (byte) 0x72, (byte) 0x6e, (byte) 0x65, (byte) 0x74, (byte) 0x20,
- (byte) 0x57, (byte) 0x69, (byte) 0x64, (byte) 0x67, (byte) 0x69, (byte) 0x74,
- (byte) 0x73, (byte) 0x20, (byte) 0x50, (byte) 0x74, (byte) 0x79, (byte) 0x20,
- (byte) 0x4c, (byte) 0x74, (byte) 0x64, (byte) 0x30, (byte) 0x81, (byte) 0x9f,
- (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86,
- (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01,
- (byte) 0x01, (byte) 0x05, (byte) 0x00, (byte) 0x03, (byte) 0x81, (byte) 0x8d,
- (byte) 0x00, (byte) 0x30, (byte) 0x81, (byte) 0x89, (byte) 0x02, (byte) 0x81,
- (byte) 0x81, (byte) 0x00, (byte) 0xb5, (byte) 0xf6, (byte) 0x08, (byte) 0x0f,
- (byte) 0xc4, (byte) 0x4d, (byte) 0xe4, (byte) 0x0d, (byte) 0x34, (byte) 0x1d,
- (byte) 0xe2, (byte) 0x23, (byte) 0x18, (byte) 0x63, (byte) 0x03, (byte) 0xf7,
- (byte) 0x14, (byte) 0x0e, (byte) 0x98, (byte) 0xcd, (byte) 0x45, (byte) 0x1f,
- (byte) 0xfe, (byte) 0xfb, (byte) 0x09, (byte) 0x3f, (byte) 0x5d, (byte) 0x36,
- (byte) 0x3b, (byte) 0x0f, (byte) 0xf9, (byte) 0x5e, (byte) 0x86, (byte) 0x56,
- (byte) 0x64, (byte) 0xd7, (byte) 0x3f, (byte) 0xae, (byte) 0x33, (byte) 0x09,
- (byte) 0xd3, (byte) 0xdd, (byte) 0x06, (byte) 0x17, (byte) 0x26, (byte) 0xdc,
- (byte) 0xa2, (byte) 0x8c, (byte) 0x3c, (byte) 0x65, (byte) 0xed, (byte) 0x03,
- (byte) 0x82, (byte) 0x78, (byte) 0x9b, (byte) 0xee, (byte) 0xe3, (byte) 0x98,
- (byte) 0x58, (byte) 0xe1, (byte) 0xf1, (byte) 0xa0, (byte) 0x85, (byte) 0xae,
- (byte) 0x63, (byte) 0x84, (byte) 0x41, (byte) 0x46, (byte) 0xa7, (byte) 0x4f,
- (byte) 0xdc, (byte) 0xbb, (byte) 0x1c, (byte) 0x6e, (byte) 0xec, (byte) 0x7b,
- (byte) 0xd5, (byte) 0xab, (byte) 0x3d, (byte) 0x6a, (byte) 0x05, (byte) 0x58,
- (byte) 0x0f, (byte) 0x9b, (byte) 0x6a, (byte) 0x67, (byte) 0x4b, (byte) 0xe9,
- (byte) 0x2a, (byte) 0x6d, (byte) 0x96, (byte) 0x11, (byte) 0x53, (byte) 0x95,
- (byte) 0x78, (byte) 0xaa, (byte) 0xd1, (byte) 0x91, (byte) 0x4a, (byte) 0xf8,
- (byte) 0x54, (byte) 0x52, (byte) 0x6d, (byte) 0xb9, (byte) 0xca, (byte) 0x74,
- (byte) 0x81, (byte) 0xf8, (byte) 0x99, (byte) 0x64, (byte) 0xd1, (byte) 0x4f,
- (byte) 0x01, (byte) 0x38, (byte) 0x4f, (byte) 0x08, (byte) 0x5c, (byte) 0x31,
- (byte) 0xcb, (byte) 0x7c, (byte) 0x5c, (byte) 0x78, (byte) 0x5d, (byte) 0x47,
- (byte) 0xd9, (byte) 0xf0, (byte) 0x1a, (byte) 0xeb, (byte) 0x02, (byte) 0x03,
- (byte) 0x01, (byte) 0x00, (byte) 0x01, (byte) 0xa3, (byte) 0x50, (byte) 0x30,
- (byte) 0x4e, (byte) 0x30, (byte) 0x1d, (byte) 0x06, (byte) 0x03, (byte) 0x55,
- (byte) 0x1d, (byte) 0x0e, (byte) 0x04, (byte) 0x16, (byte) 0x04, (byte) 0x14,
- (byte) 0x5f, (byte) 0x5b, (byte) 0x5e, (byte) 0xac, (byte) 0x29, (byte) 0xfa,
- (byte) 0xa1, (byte) 0x9f, (byte) 0x9e, (byte) 0xad, (byte) 0x46, (byte) 0xe1,
- (byte) 0xbc, (byte) 0x20, (byte) 0x72, (byte) 0xcf, (byte) 0x4a, (byte) 0xd4,
- (byte) 0xfa, (byte) 0xe3, (byte) 0x30, (byte) 0x1f, (byte) 0x06, (byte) 0x03,
- (byte) 0x55, (byte) 0x1d, (byte) 0x23, (byte) 0x04, (byte) 0x18, (byte) 0x30,
- (byte) 0x16, (byte) 0x80, (byte) 0x14, (byte) 0x5f, (byte) 0x5b, (byte) 0x5e,
- (byte) 0xac, (byte) 0x29, (byte) 0xfa, (byte) 0xa1, (byte) 0x9f, (byte) 0x9e,
- (byte) 0xad, (byte) 0x46, (byte) 0xe1, (byte) 0xbc, (byte) 0x20, (byte) 0x72,
- (byte) 0xcf, (byte) 0x4a, (byte) 0xd4, (byte) 0xfa, (byte) 0xe3, (byte) 0x30,
- (byte) 0x0c, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x13,
- (byte) 0x04, (byte) 0x05, (byte) 0x30, (byte) 0x03, (byte) 0x01, (byte) 0x01,
- (byte) 0xff, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a,
- (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01,
- (byte) 0x01, (byte) 0x05, (byte) 0x05, (byte) 0x00, (byte) 0x03, (byte) 0x81,
- (byte) 0x81, (byte) 0x00, (byte) 0xa1, (byte) 0x4a, (byte) 0xe6, (byte) 0xfc,
- (byte) 0x7f, (byte) 0x17, (byte) 0xaa, (byte) 0x65, (byte) 0x4a, (byte) 0x34,
- (byte) 0xde, (byte) 0x69, (byte) 0x67, (byte) 0x54, (byte) 0x4d, (byte) 0xa2,
- (byte) 0xc2, (byte) 0x98, (byte) 0x02, (byte) 0x43, (byte) 0x6a, (byte) 0x0e,
- (byte) 0x0b, (byte) 0x7f, (byte) 0xa4, (byte) 0x46, (byte) 0xaf, (byte) 0xa4,
- (byte) 0x65, (byte) 0xa0, (byte) 0xdb, (byte) 0xf1, (byte) 0x5b, (byte) 0xd5,
- (byte) 0x09, (byte) 0xbc, (byte) 0xee, (byte) 0x37, (byte) 0x51, (byte) 0x19,
- (byte) 0x36, (byte) 0xc0, (byte) 0x90, (byte) 0xd3, (byte) 0x5f, (byte) 0xf3,
- (byte) 0x4f, (byte) 0xb9, (byte) 0x08, (byte) 0x45, (byte) 0x0e, (byte) 0x01,
- (byte) 0x8a, (byte) 0x95, (byte) 0xef, (byte) 0x92, (byte) 0x95, (byte) 0x33,
- (byte) 0x78, (byte) 0xdd, (byte) 0x90, (byte) 0xbb, (byte) 0xf3, (byte) 0x06,
- (byte) 0x75, (byte) 0xd0, (byte) 0x66, (byte) 0xe6, (byte) 0xd0, (byte) 0x18,
- (byte) 0x6e, (byte) 0xeb, (byte) 0x1c, (byte) 0x52, (byte) 0xc3, (byte) 0x2e,
- (byte) 0x57, (byte) 0x7d, (byte) 0xa9, (byte) 0x03, (byte) 0xdb, (byte) 0xf4,
- (byte) 0x57, (byte) 0x5f, (byte) 0x6c, (byte) 0x7e, (byte) 0x00, (byte) 0x0d,
- (byte) 0x8f, (byte) 0xe8, (byte) 0x91, (byte) 0xf7, (byte) 0xae, (byte) 0x24,
- (byte) 0x35, (byte) 0x07, (byte) 0xb5, (byte) 0x48, (byte) 0x2d, (byte) 0x36,
- (byte) 0x30, (byte) 0x5d, (byte) 0xe9, (byte) 0x49, (byte) 0x2d, (byte) 0xd1,
- (byte) 0x5d, (byte) 0xc5, (byte) 0xf4, (byte) 0x33, (byte) 0x77, (byte) 0x3c,
- (byte) 0x71, (byte) 0xad, (byte) 0x90, (byte) 0x65, (byte) 0xa9, (byte) 0xc1,
- (byte) 0x0b, (byte) 0x5c, (byte) 0x62, (byte) 0x55, (byte) 0x50, (byte) 0x6f,
- (byte) 0x9b, (byte) 0xc9, (byte) 0x0d, (byte) 0xee
- };
-
- /**
- * Generated from above and converted with:
- *
- * openssl pkcs8 -topk8 -outform d -in userkey.pem -nocrypt | xxd -i | sed 's/0x/(byte) 0x/g'
- */
- private static final byte[] FAKE_EC_KEY_1 = new byte[] {
- (byte) 0x30, (byte) 0x81, (byte) 0x87, (byte) 0x02, (byte) 0x01, (byte) 0x00,
- (byte) 0x30, (byte) 0x13, (byte) 0x06, (byte) 0x07, (byte) 0x2a, (byte) 0x86,
- (byte) 0x48, (byte) 0xce, (byte) 0x3d, (byte) 0x02, (byte) 0x01, (byte) 0x06,
- (byte) 0x08, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0xce, (byte) 0x3d,
- (byte) 0x03, (byte) 0x01, (byte) 0x07, (byte) 0x04, (byte) 0x6d, (byte) 0x30,
- (byte) 0x6b, (byte) 0x02, (byte) 0x01, (byte) 0x01, (byte) 0x04, (byte) 0x20,
- (byte) 0x3a, (byte) 0x8a, (byte) 0x02, (byte) 0xdc, (byte) 0xde, (byte) 0x70,
- (byte) 0x84, (byte) 0x45, (byte) 0x34, (byte) 0xaf, (byte) 0xbd, (byte) 0xd5,
- (byte) 0x02, (byte) 0x17, (byte) 0x69, (byte) 0x90, (byte) 0x65, (byte) 0x1e,
- (byte) 0x87, (byte) 0xf1, (byte) 0x3d, (byte) 0x17, (byte) 0xb6, (byte) 0xf4,
- (byte) 0x31, (byte) 0x94, (byte) 0x86, (byte) 0x76, (byte) 0x55, (byte) 0xf7,
- (byte) 0xcc, (byte) 0xba, (byte) 0xa1, (byte) 0x44, (byte) 0x03, (byte) 0x42,
- (byte) 0x00, (byte) 0x04, (byte) 0xd9, (byte) 0xcf, (byte) 0xe7, (byte) 0x9b,
- (byte) 0x23, (byte) 0xc8, (byte) 0xa3, (byte) 0xb8, (byte) 0x33, (byte) 0x14,
- (byte) 0xa4, (byte) 0x4d, (byte) 0x75, (byte) 0x90, (byte) 0xf3, (byte) 0xcd,
- (byte) 0x43, (byte) 0xe5, (byte) 0x1b, (byte) 0x05, (byte) 0x1d, (byte) 0xf3,
- (byte) 0xd0, (byte) 0xa3, (byte) 0xb7, (byte) 0x32, (byte) 0x5f, (byte) 0x79,
- (byte) 0xdc, (byte) 0x88, (byte) 0xb8, (byte) 0x4d, (byte) 0xb3, (byte) 0xd1,
- (byte) 0x6d, (byte) 0xf7, (byte) 0x75, (byte) 0xf3, (byte) 0xbf, (byte) 0x50,
- (byte) 0xa1, (byte) 0xbc, (byte) 0x03, (byte) 0x64, (byte) 0x22, (byte) 0xe6,
- (byte) 0x1a, (byte) 0xa1, (byte) 0xe1, (byte) 0x06, (byte) 0x68, (byte) 0x3b,
- (byte) 0xbc, (byte) 0x9f, (byte) 0xd3, (byte) 0xae, (byte) 0x77, (byte) 0x5e,
- (byte) 0x88, (byte) 0x0c, (byte) 0x5e, (byte) 0x0c, (byte) 0xb2, (byte) 0x38
- };
-
- /**
- * Generated from above and converted with:
- *
- * openssl x509 -outform d -in usercert.pem | xxd -i | sed 's/0x/(byte) 0x/g'
- */
- private static final byte[] FAKE_EC_USER_1 = new byte[] {
- (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x51, (byte) 0x30, (byte) 0x82,
- (byte) 0x01, (byte) 0xba, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01,
- (byte) 0x02, (byte) 0x02, (byte) 0x01, (byte) 0x01, (byte) 0x30, (byte) 0x0d,
- (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86,
- (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x05,
- (byte) 0x00, (byte) 0x30, (byte) 0x45, (byte) 0x31, (byte) 0x0b, (byte) 0x30,
- (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x06,
- (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x55, (byte) 0x31, (byte) 0x13,
- (byte) 0x30, (byte) 0x11, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
- (byte) 0x08, (byte) 0x0c, (byte) 0x0a, (byte) 0x53, (byte) 0x6f, (byte) 0x6d,
- (byte) 0x65, (byte) 0x2d, (byte) 0x53, (byte) 0x74, (byte) 0x61, (byte) 0x74,
- (byte) 0x65, (byte) 0x31, (byte) 0x21, (byte) 0x30, (byte) 0x1f, (byte) 0x06,
- (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a, (byte) 0x0c, (byte) 0x18,
- (byte) 0x49, (byte) 0x6e, (byte) 0x74, (byte) 0x65, (byte) 0x72, (byte) 0x6e,
- (byte) 0x65, (byte) 0x74, (byte) 0x20, (byte) 0x57, (byte) 0x69, (byte) 0x64,
- (byte) 0x67, (byte) 0x69, (byte) 0x74, (byte) 0x73, (byte) 0x20, (byte) 0x50,
- (byte) 0x74, (byte) 0x79, (byte) 0x20, (byte) 0x4c, (byte) 0x74, (byte) 0x64,
- (byte) 0x30, (byte) 0x1e, (byte) 0x17, (byte) 0x0d, (byte) 0x31, (byte) 0x33,
- (byte) 0x30, (byte) 0x38, (byte) 0x32, (byte) 0x37, (byte) 0x31, (byte) 0x36,
- (byte) 0x33, (byte) 0x30, (byte) 0x30, (byte) 0x38, (byte) 0x5a, (byte) 0x17,
- (byte) 0x0d, (byte) 0x32, (byte) 0x33, (byte) 0x30, (byte) 0x38, (byte) 0x32,
- (byte) 0x35, (byte) 0x31, (byte) 0x36, (byte) 0x33, (byte) 0x30, (byte) 0x30,
- (byte) 0x38, (byte) 0x5a, (byte) 0x30, (byte) 0x62, (byte) 0x31, (byte) 0x0b,
- (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
- (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x55, (byte) 0x31,
- (byte) 0x13, (byte) 0x30, (byte) 0x11, (byte) 0x06, (byte) 0x03, (byte) 0x55,
- (byte) 0x04, (byte) 0x08, (byte) 0x0c, (byte) 0x0a, (byte) 0x53, (byte) 0x6f,
- (byte) 0x6d, (byte) 0x65, (byte) 0x2d, (byte) 0x53, (byte) 0x74, (byte) 0x61,
- (byte) 0x74, (byte) 0x65, (byte) 0x31, (byte) 0x21, (byte) 0x30, (byte) 0x1f,
- (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a, (byte) 0x0c,
- (byte) 0x18, (byte) 0x49, (byte) 0x6e, (byte) 0x74, (byte) 0x65, (byte) 0x72,
- (byte) 0x6e, (byte) 0x65, (byte) 0x74, (byte) 0x20, (byte) 0x57, (byte) 0x69,
- (byte) 0x64, (byte) 0x67, (byte) 0x69, (byte) 0x74, (byte) 0x73, (byte) 0x20,
- (byte) 0x50, (byte) 0x74, (byte) 0x79, (byte) 0x20, (byte) 0x4c, (byte) 0x74,
- (byte) 0x64, (byte) 0x31, (byte) 0x1b, (byte) 0x30, (byte) 0x19, (byte) 0x06,
- (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x03, (byte) 0x0c, (byte) 0x12,
- (byte) 0x73, (byte) 0x65, (byte) 0x72, (byte) 0x76, (byte) 0x65, (byte) 0x72,
- (byte) 0x2e, (byte) 0x65, (byte) 0x78, (byte) 0x61, (byte) 0x6d, (byte) 0x70,
- (byte) 0x6c, (byte) 0x65, (byte) 0x2e, (byte) 0x63, (byte) 0x6f, (byte) 0x6d,
- (byte) 0x30, (byte) 0x59, (byte) 0x30, (byte) 0x13, (byte) 0x06, (byte) 0x07,
- (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0xce, (byte) 0x3d, (byte) 0x02,
- (byte) 0x01, (byte) 0x06, (byte) 0x08, (byte) 0x2a, (byte) 0x86, (byte) 0x48,
- (byte) 0xce, (byte) 0x3d, (byte) 0x03, (byte) 0x01, (byte) 0x07, (byte) 0x03,
- (byte) 0x42, (byte) 0x00, (byte) 0x04, (byte) 0xd9, (byte) 0xcf, (byte) 0xe7,
- (byte) 0x9b, (byte) 0x23, (byte) 0xc8, (byte) 0xa3, (byte) 0xb8, (byte) 0x33,
- (byte) 0x14, (byte) 0xa4, (byte) 0x4d, (byte) 0x75, (byte) 0x90, (byte) 0xf3,
- (byte) 0xcd, (byte) 0x43, (byte) 0xe5, (byte) 0x1b, (byte) 0x05, (byte) 0x1d,
- (byte) 0xf3, (byte) 0xd0, (byte) 0xa3, (byte) 0xb7, (byte) 0x32, (byte) 0x5f,
- (byte) 0x79, (byte) 0xdc, (byte) 0x88, (byte) 0xb8, (byte) 0x4d, (byte) 0xb3,
- (byte) 0xd1, (byte) 0x6d, (byte) 0xf7, (byte) 0x75, (byte) 0xf3, (byte) 0xbf,
- (byte) 0x50, (byte) 0xa1, (byte) 0xbc, (byte) 0x03, (byte) 0x64, (byte) 0x22,
- (byte) 0xe6, (byte) 0x1a, (byte) 0xa1, (byte) 0xe1, (byte) 0x06, (byte) 0x68,
- (byte) 0x3b, (byte) 0xbc, (byte) 0x9f, (byte) 0xd3, (byte) 0xae, (byte) 0x77,
- (byte) 0x5e, (byte) 0x88, (byte) 0x0c, (byte) 0x5e, (byte) 0x0c, (byte) 0xb2,
- (byte) 0x38, (byte) 0xa3, (byte) 0x7b, (byte) 0x30, (byte) 0x79, (byte) 0x30,
- (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x13,
- (byte) 0x04, (byte) 0x02, (byte) 0x30, (byte) 0x00, (byte) 0x30, (byte) 0x2c,
- (byte) 0x06, (byte) 0x09, (byte) 0x60, (byte) 0x86, (byte) 0x48, (byte) 0x01,
- (byte) 0x86, (byte) 0xf8, (byte) 0x42, (byte) 0x01, (byte) 0x0d, (byte) 0x04,
- (byte) 0x1f, (byte) 0x16, (byte) 0x1d, (byte) 0x4f, (byte) 0x70, (byte) 0x65,
- (byte) 0x6e, (byte) 0x53, (byte) 0x53, (byte) 0x4c, (byte) 0x20, (byte) 0x47,
- (byte) 0x65, (byte) 0x6e, (byte) 0x65, (byte) 0x72, (byte) 0x61, (byte) 0x74,
- (byte) 0x65, (byte) 0x64, (byte) 0x20, (byte) 0x43, (byte) 0x65, (byte) 0x72,
- (byte) 0x74, (byte) 0x69, (byte) 0x66, (byte) 0x69, (byte) 0x63, (byte) 0x61,
- (byte) 0x74, (byte) 0x65, (byte) 0x30, (byte) 0x1d, (byte) 0x06, (byte) 0x03,
- (byte) 0x55, (byte) 0x1d, (byte) 0x0e, (byte) 0x04, (byte) 0x16, (byte) 0x04,
- (byte) 0x14, (byte) 0xd5, (byte) 0xc4, (byte) 0x72, (byte) 0xbd, (byte) 0xd2,
- (byte) 0x4e, (byte) 0x90, (byte) 0x1b, (byte) 0x14, (byte) 0x32, (byte) 0xdb,
- (byte) 0x03, (byte) 0xae, (byte) 0xfa, (byte) 0x27, (byte) 0x7d, (byte) 0x8d,
- (byte) 0xe4, (byte) 0x80, (byte) 0x58, (byte) 0x30, (byte) 0x1f, (byte) 0x06,
- (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x23, (byte) 0x04, (byte) 0x18,
- (byte) 0x30, (byte) 0x16, (byte) 0x80, (byte) 0x14, (byte) 0x5f, (byte) 0x5b,
- (byte) 0x5e, (byte) 0xac, (byte) 0x29, (byte) 0xfa, (byte) 0xa1, (byte) 0x9f,
- (byte) 0x9e, (byte) 0xad, (byte) 0x46, (byte) 0xe1, (byte) 0xbc, (byte) 0x20,
- (byte) 0x72, (byte) 0xcf, (byte) 0x4a, (byte) 0xd4, (byte) 0xfa, (byte) 0xe3,
- (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86,
- (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01,
- (byte) 0x05, (byte) 0x05, (byte) 0x00, (byte) 0x03, (byte) 0x81, (byte) 0x81,
- (byte) 0x00, (byte) 0x43, (byte) 0x99, (byte) 0x9f, (byte) 0x67, (byte) 0x08,
- (byte) 0x43, (byte) 0xd5, (byte) 0x6b, (byte) 0x6f, (byte) 0xd7, (byte) 0x05,
- (byte) 0xd6, (byte) 0x75, (byte) 0x34, (byte) 0x30, (byte) 0xca, (byte) 0x20,
- (byte) 0x47, (byte) 0x61, (byte) 0xa1, (byte) 0x89, (byte) 0xb6, (byte) 0xf1,
- (byte) 0x49, (byte) 0x7b, (byte) 0xd9, (byte) 0xb9, (byte) 0xe8, (byte) 0x1e,
- (byte) 0x29, (byte) 0x74, (byte) 0x0a, (byte) 0x67, (byte) 0xc0, (byte) 0x7d,
- (byte) 0xb8, (byte) 0xe6, (byte) 0x39, (byte) 0xa8, (byte) 0x5e, (byte) 0xc3,
- (byte) 0xb0, (byte) 0xa1, (byte) 0x30, (byte) 0x6a, (byte) 0x1f, (byte) 0x1d,
- (byte) 0xfc, (byte) 0x11, (byte) 0x59, (byte) 0x0b, (byte) 0xb9, (byte) 0xad,
- (byte) 0x3a, (byte) 0x4e, (byte) 0x50, (byte) 0x0a, (byte) 0x61, (byte) 0xdb,
- (byte) 0x75, (byte) 0x6b, (byte) 0xe5, (byte) 0x3f, (byte) 0x8d, (byte) 0xde,
- (byte) 0x28, (byte) 0x68, (byte) 0xb1, (byte) 0x29, (byte) 0x9a, (byte) 0x18,
- (byte) 0x8a, (byte) 0xfc, (byte) 0x3f, (byte) 0x13, (byte) 0x93, (byte) 0x29,
- (byte) 0xed, (byte) 0x22, (byte) 0x7c, (byte) 0xb4, (byte) 0x50, (byte) 0xd5,
- (byte) 0x4d, (byte) 0x32, (byte) 0x4d, (byte) 0x42, (byte) 0x2b, (byte) 0x29,
- (byte) 0x97, (byte) 0x86, (byte) 0xc0, (byte) 0x01, (byte) 0x00, (byte) 0x25,
- (byte) 0xf6, (byte) 0xd3, (byte) 0x2a, (byte) 0xd8, (byte) 0xda, (byte) 0x13,
- (byte) 0x94, (byte) 0x12, (byte) 0x78, (byte) 0x14, (byte) 0x0b, (byte) 0x51,
- (byte) 0xc0, (byte) 0x45, (byte) 0xb4, (byte) 0x02, (byte) 0x37, (byte) 0x98,
- (byte) 0x42, (byte) 0x3c, (byte) 0xcb, (byte) 0x2e, (byte) 0xe4, (byte) 0x38,
- (byte) 0x69, (byte) 0x1b, (byte) 0x72, (byte) 0xf0, (byte) 0xaa, (byte) 0x89,
- (byte) 0x7e, (byte) 0xde, (byte) 0xb2
- };
-
- /**
- * The amount of time to allow before and after expected time for variance
- * in timing tests.
- */
- private static final long SLOP_TIME_MILLIS = 15000L;
-
- @Override
- protected void setUp() throws Exception {
- mAndroidKeyStore = android.security.KeyStore.getInstance();
-
- assertTrue(mAndroidKeyStore.reset());
- assertFalse(mAndroidKeyStore.isUnlocked());
-
- mKeyStore = java.security.KeyStore.getInstance("AndroidKeyStore");
- }
-
- private void setupPassword() {
- assertTrue(mAndroidKeyStore.onUserPasswordChanged("1111"));
- assertTrue(mAndroidKeyStore.isUnlocked());
-
- assertEquals(0, mAndroidKeyStore.list("").length);
- }
-
- private void assertAliases(final String[] expectedAliases) throws KeyStoreException {
- final Enumeration<String> aliases = mKeyStore.aliases();
- int count = 0;
-
- final Set<String> expectedSet = new HashSet<String>();
- expectedSet.addAll(Arrays.asList(expectedAliases));
-
- while (aliases.hasMoreElements()) {
- count++;
- final String alias = aliases.nextElement();
- assertTrue("The alias should be in the expected set", expectedSet.contains(alias));
- expectedSet.remove(alias);
- }
- assertTrue("The expected set and actual set should be exactly equal", expectedSet.isEmpty());
- assertEquals("There should be the correct number of keystore entries",
- expectedAliases.length, count);
- }
-
- public void testKeyStore_Aliases_Encrypted_Success() throws Exception {
- setupPassword();
-
- mKeyStore.load(null, null);
-
- assertAliases(new String[] {});
-
- assertTrue(mAndroidKeyStore.generate(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
- KeyStore.UID_SELF, NativeConstants.EVP_PKEY_RSA, 1024, KeyStore.FLAG_ENCRYPTED,
- null));
-
- assertAliases(new String[] { TEST_ALIAS_1 });
-
- assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_RSA_CA_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-
- assertAliases(new String[] { TEST_ALIAS_1, TEST_ALIAS_2 });
- }
-
- public void testKeyStore_Aliases_NotInitialized_Encrypted_Failure() throws Exception {
- setupPassword();
-
- try {
- mKeyStore.aliases();
- fail("KeyStore should throw exception when not initialized");
- } catch (KeyStoreException success) {
- }
- }
-
- public void testKeyStore_ContainsAliases_PrivateAndCA_Encrypted_Success() throws Exception {
- setupPassword();
-
- mKeyStore.load(null, null);
-
- assertAliases(new String[] {});
-
- assertTrue(mAndroidKeyStore.generate(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
- KeyStore.UID_SELF, NativeConstants.EVP_PKEY_RSA, 1024, KeyStore.FLAG_ENCRYPTED,
- null));
-
- assertTrue("Should contain generated private key", mKeyStore.containsAlias(TEST_ALIAS_1));
-
- assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_RSA_CA_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-
- assertTrue("Should contain added CA certificate", mKeyStore.containsAlias(TEST_ALIAS_2));
-
- assertFalse("Should not contain unadded certificate alias",
- mKeyStore.containsAlias(TEST_ALIAS_3));
- }
-
- public void testKeyStore_ContainsAliases_CAOnly_Encrypted_Success() throws Exception {
- setupPassword();
-
- mKeyStore.load(null, null);
-
- assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_RSA_CA_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-
- assertTrue("Should contain added CA certificate", mKeyStore.containsAlias(TEST_ALIAS_2));
- }
-
- public void testKeyStore_ContainsAliases_NonExistent_Encrypted_Failure() throws Exception {
- setupPassword();
-
- mKeyStore.load(null, null);
-
- assertFalse("Should contain added CA certificate", mKeyStore.containsAlias(TEST_ALIAS_1));
- }
-
- public void testKeyStore_DeleteEntry_Encrypted_Success() throws Exception {
- setupPassword();
-
- mKeyStore.load(null, null);
-
- // TEST_ALIAS_1
- assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
- FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
- assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
- assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-
- // TEST_ALIAS_2
- assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_RSA_CA_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-
- // TEST_ALIAS_3
- assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_3, FAKE_RSA_CA_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-
- assertAliases(new String[] { TEST_ALIAS_1, TEST_ALIAS_2, TEST_ALIAS_3 });
-
- mKeyStore.deleteEntry(TEST_ALIAS_1);
-
- assertAliases(new String[] { TEST_ALIAS_2, TEST_ALIAS_3 });
-
- mKeyStore.deleteEntry(TEST_ALIAS_3);
-
- assertAliases(new String[] { TEST_ALIAS_2 });
-
- mKeyStore.deleteEntry(TEST_ALIAS_2);
-
- assertAliases(new String[] { });
- }
-
- public void testKeyStore_DeleteEntry_EmptyStore_Encrypted_Success() throws Exception {
- setupPassword();
-
- mKeyStore.load(null, null);
-
- // Should not throw when a non-existent entry is requested for delete.
- mKeyStore.deleteEntry(TEST_ALIAS_1);
- }
-
- public void testKeyStore_DeleteEntry_NonExistent_Encrypted_Success() throws Exception {
- setupPassword();
-
- mKeyStore.load(null, null);
-
- // TEST_ALIAS_1
- assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
- FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
- assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
- assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-
- // Should not throw when a non-existent entry is requested for delete.
- mKeyStore.deleteEntry(TEST_ALIAS_2);
- }
-
- public void testKeyStore_GetCertificate_Single_Encrypted_Success() throws Exception {
- setupPassword();
-
- mKeyStore.load(null, null);
-
- assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-
- assertAliases(new String[] { TEST_ALIAS_1 });
-
- assertNull("Certificate should not exist in keystore",
- mKeyStore.getCertificate(TEST_ALIAS_2));
-
- Certificate retrieved = mKeyStore.getCertificate(TEST_ALIAS_1);
-
- assertNotNull("Retrieved certificate should not be null", retrieved);
-
- CertificateFactory f = CertificateFactory.getInstance("X.509");
- Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
-
- assertEquals("Actual and retrieved certificates should be the same", actual, retrieved);
- }
-
- public void testKeyStore_GetCertificate_NonExist_Encrypted_Failure() throws Exception {
- setupPassword();
-
- mKeyStore.load(null, null);
-
- assertNull("Certificate should not exist in keystore",
- mKeyStore.getCertificate(TEST_ALIAS_1));
- }
-
- public void testKeyStore_GetCertificateAlias_CAEntry_Encrypted_Success() throws Exception {
- setupPassword();
-
- mKeyStore.load(null, null);
-
- assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-
- CertificateFactory f = CertificateFactory.getInstance("X.509");
- Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
-
- assertEquals("Stored certificate alias should be found", TEST_ALIAS_1,
- mKeyStore.getCertificateAlias(actual));
- }
-
- public void testKeyStore_GetCertificateAlias_PrivateKeyEntry_Encrypted_Success()
- throws Exception {
- setupPassword();
-
- mKeyStore.load(null, null);
-
- assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
- FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
- assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
- assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-
- CertificateFactory f = CertificateFactory.getInstance("X.509");
- Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
-
- assertEquals("Stored certificate alias should be found", TEST_ALIAS_1,
- mKeyStore.getCertificateAlias(actual));
- }
-
- public void testKeyStore_GetCertificateAlias_CAEntry_WithPrivateKeyUsingCA_Encrypted_Success()
- throws Exception {
- setupPassword();
-
- mKeyStore.load(null, null);
-
- // Insert TrustedCertificateEntry with CA name
- assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_RSA_CA_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-
- // Insert PrivateKeyEntry that uses the same CA
- assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
- FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
- assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
- assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-
- CertificateFactory f = CertificateFactory.getInstance("X.509");
- Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
-
- assertEquals("Stored certificate alias should be found", TEST_ALIAS_2,
- mKeyStore.getCertificateAlias(actual));
- }
-
- public void testKeyStore_GetCertificateAlias_NonExist_Empty_Encrypted_Failure()
- throws Exception {
- setupPassword();
-
- mKeyStore.load(null, null);
-
- CertificateFactory f = CertificateFactory.getInstance("X.509");
- Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
-
- assertNull("Stored certificate alias should not be found",
- mKeyStore.getCertificateAlias(actual));
- }
-
- public void testKeyStore_GetCertificateAlias_NonExist_Encrypted_Failure() throws Exception {
- setupPassword();
-
- mKeyStore.load(null, null);
-
- assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-
- CertificateFactory f = CertificateFactory.getInstance("X.509");
- Certificate userCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
-
- assertNull("Stored certificate alias should be found",
- mKeyStore.getCertificateAlias(userCert));
- }
-
- public void testKeyStore_GetCertificateChain_SingleLength_Encrypted_Success() throws Exception {
- setupPassword();
-
- mKeyStore.load(null, null);
-
- assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
- FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
- assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
- assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-
- CertificateFactory cf = CertificateFactory.getInstance("X.509");
- Certificate[] expected = new Certificate[2];
- expected[0] = cf.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
- expected[1] = cf.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
-
- Certificate[] actual = mKeyStore.getCertificateChain(TEST_ALIAS_1);
-
- assertNotNull("Returned certificate chain should not be null", actual);
- assertEquals("Returned certificate chain should be correct size", expected.length,
- actual.length);
- assertEquals("First certificate should be user certificate", expected[0], actual[0]);
- assertEquals("Second certificate should be CA certificate", expected[1], actual[1]);
-
- // Negative test when keystore is populated.
- assertNull("Stored certificate alias should not be found",
- mKeyStore.getCertificateChain(TEST_ALIAS_2));
- }
-
- public void testKeyStore_GetCertificateChain_NonExist_Encrypted_Failure() throws Exception {
- setupPassword();
-
- mKeyStore.load(null, null);
-
- assertNull("Stored certificate alias should not be found",
- mKeyStore.getCertificateChain(TEST_ALIAS_1));
- }
-
- public void testKeyStore_GetCreationDate_PrivateKeyEntry_Encrypted_Success() throws Exception {
- setupPassword();
-
- mKeyStore.load(null, null);
-
- assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
- FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
- assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
- assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-
- Date now = new Date();
- Date actual = mKeyStore.getCreationDate(TEST_ALIAS_1);
-
- Date expectedAfter = new Date(now.getTime() - SLOP_TIME_MILLIS);
- Date expectedBefore = new Date(now.getTime() + SLOP_TIME_MILLIS);
-
- assertTrue("Time should be close to current time", actual.before(expectedBefore));
- assertTrue("Time should be close to current time", actual.after(expectedAfter));
- }
-
- public void testKeyStore_GetCreationDate_PrivateKeyEntry_Unencrypted_Success() throws Exception {
- mKeyStore.load(null, null);
-
- assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
- FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
- assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
- KeyStore.UID_SELF, KeyStore.FLAG_NONE));
- assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
- KeyStore.UID_SELF, KeyStore.FLAG_NONE));
-
- Date now = new Date();
- Date actual = mKeyStore.getCreationDate(TEST_ALIAS_1);
-
- Date expectedAfter = new Date(now.getTime() - SLOP_TIME_MILLIS);
- Date expectedBefore = new Date(now.getTime() + SLOP_TIME_MILLIS);
-
- assertTrue("Time should be close to current time", actual.before(expectedBefore));
- assertTrue("Time should be close to current time", actual.after(expectedAfter));
- }
-
- public void testKeyStore_GetCreationDate_CAEntry_Encrypted_Success() throws Exception {
- setupPassword();
-
- mKeyStore.load(null, null);
-
- assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-
- Date now = new Date();
- Date actual = mKeyStore.getCreationDate(TEST_ALIAS_1);
- assertNotNull("Certificate should be found", actual);
-
- Date expectedAfter = new Date(now.getTime() - SLOP_TIME_MILLIS);
- Date expectedBefore = new Date(now.getTime() + SLOP_TIME_MILLIS);
-
- assertTrue("Time should be close to current time", actual.before(expectedBefore));
- assertTrue("Time should be close to current time", actual.after(expectedAfter));
- }
-
- public void testKeyStore_GetEntry_NullParams_Encrypted_Success() throws Exception {
- setupPassword();
-
- mKeyStore.load(null, null);
-
- assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
- FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
- assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
- assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-
- Entry entry = mKeyStore.getEntry(TEST_ALIAS_1, null);
- assertNotNull("Entry should exist", entry);
-
- assertTrue("Should be a PrivateKeyEntry", entry instanceof PrivateKeyEntry);
-
- PrivateKeyEntry keyEntry = (PrivateKeyEntry) entry;
-
- assertPrivateKeyEntryEquals(keyEntry, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
- FAKE_RSA_CA_1);
- }
-
- public void testKeyStore_GetEntry_EC_NullParams_Unencrypted_Success() throws Exception {
- mKeyStore.load(null, null);
-
- assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
- FAKE_EC_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
- assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1,
- FAKE_EC_USER_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
- assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_EC_CA_1,
- KeyStore.UID_SELF, KeyStore.FLAG_NONE));
-
- Entry entry = mKeyStore.getEntry(TEST_ALIAS_1, null);
- assertNotNull("Entry should exist", entry);
-
- assertTrue("Should be a PrivateKeyEntry", entry instanceof PrivateKeyEntry);
-
- PrivateKeyEntry keyEntry = (PrivateKeyEntry) entry;
-
- assertPrivateKeyEntryEquals(keyEntry, "EC", FAKE_EC_KEY_1, FAKE_EC_USER_1, FAKE_EC_CA_1);
- }
-
- public void testKeyStore_GetEntry_RSA_NullParams_Unencrypted_Success() throws Exception {
- mKeyStore.load(null, null);
-
- assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
- FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
- assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1,
- FAKE_RSA_USER_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
- assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
- KeyStore.UID_SELF, KeyStore.FLAG_NONE));
-
- Entry entry = mKeyStore.getEntry(TEST_ALIAS_1, null);
- assertNotNull("Entry should exist", entry);
-
- assertTrue("Should be a PrivateKeyEntry", entry instanceof PrivateKeyEntry);
-
- PrivateKeyEntry keyEntry = (PrivateKeyEntry) entry;
-
- assertPrivateKeyEntryEquals(keyEntry, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
- FAKE_RSA_CA_1);
- }
-
- @SuppressWarnings("unchecked")
- private void assertPrivateKeyEntryEquals(PrivateKeyEntry keyEntry, String keyType, byte[] key,
- byte[] cert, byte[] ca) throws Exception {
- KeyFactory keyFact = KeyFactory.getInstance(keyType);
- PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(key));
-
- CertificateFactory certFact = CertificateFactory.getInstance("X.509");
- Certificate expectedCert = certFact.generateCertificate(new ByteArrayInputStream(cert));
-
- final Collection<Certificate> expectedChain;
- if (ca != null) {
- expectedChain = (Collection<Certificate>) certFact
- .generateCertificates(new ByteArrayInputStream(ca));
- } else {
- expectedChain = null;
- }
-
- assertPrivateKeyEntryEquals(keyEntry, expectedKey, expectedCert, expectedChain);
- }
-
- private void assertPrivateKeyEntryEquals(PrivateKeyEntry keyEntry, PrivateKey expectedKey,
- Certificate expectedCert, Collection<Certificate> expectedChain) throws Exception {
- if (expectedKey instanceof ECKey) {
- assertEquals("Returned PrivateKey should be what we inserted",
- ((ECKey) expectedKey).getParams().getCurve(),
- ((ECKey) keyEntry.getCertificate().getPublicKey()).getParams().getCurve());
- } else if (expectedKey instanceof RSAKey) {
- assertEquals("Returned PrivateKey should be what we inserted",
- ((RSAKey) expectedKey).getModulus(),
- ((RSAKey) keyEntry.getPrivateKey()).getModulus());
- }
-
- assertEquals("Returned Certificate should be what we inserted", expectedCert,
- keyEntry.getCertificate());
-
- Certificate[] actualChain = keyEntry.getCertificateChain();
-
- assertEquals("First certificate in chain should be user cert", expectedCert, actualChain[0]);
-
- if (expectedChain == null) {
- assertEquals("Certificate chain should not include CAs", 1, actualChain.length);
- } else {
- int i = 1;
- final Iterator<Certificate> it = expectedChain.iterator();
- while (it.hasNext()) {
- assertEquals("CA chain certificate should equal what we put in", it.next(),
- actualChain[i++]);
- }
- }
- }
-
- public void testKeyStore_GetEntry_Nonexistent_NullParams_Encrypted_Failure() throws Exception {
- setupPassword();
-
- mKeyStore.load(null, null);
-
- assertNull("A non-existent entry should return null",
- mKeyStore.getEntry(TEST_ALIAS_1, null));
- }
-
- public void testKeyStore_GetEntry_Nonexistent_NullParams_Unencrypted_Failure() throws Exception {
- mKeyStore.load(null, null);
-
- assertNull("A non-existent entry should return null",
- mKeyStore.getEntry(TEST_ALIAS_1, null));
- }
-
- public void testKeyStore_GetKey_NoPassword_Encrypted_Success() throws Exception {
- setupPassword();
-
- mKeyStore.load(null, null);
-
- assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
- FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
- assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
- assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-
- Key key = mKeyStore.getKey(TEST_ALIAS_1, null);
- assertNotNull("Key should exist", key);
-
- assertTrue("Should be a PrivateKey", key instanceof PrivateKey);
- assertTrue("Should be a RSAKey", key instanceof RSAKey);
-
- KeyFactory keyFact = KeyFactory.getInstance("RSA");
- PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
-
- assertEquals("Inserted key should be same as retrieved key",
- ((RSAKey) expectedKey).getModulus(), ((RSAKey) key).getModulus());
- }
-
- public void testKeyStore_GetKey_NoPassword_Unencrypted_Success() throws Exception {
- mKeyStore.load(null, null);
-
- assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
- FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
- assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
- KeyStore.UID_SELF, KeyStore.FLAG_NONE));
- assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
- KeyStore.UID_SELF, KeyStore.FLAG_NONE));
-
- Key key = mKeyStore.getKey(TEST_ALIAS_1, null);
- assertNotNull("Key should exist", key);
-
- assertTrue("Should be a PrivateKey", key instanceof PrivateKey);
- assertTrue("Should be a RSAKey", key instanceof RSAKey);
-
- KeyFactory keyFact = KeyFactory.getInstance("RSA");
- PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
-
- assertEquals("Inserted key should be same as retrieved key",
- ((RSAKey) expectedKey).getModulus(), ((RSAKey) key).getModulus());
- }
-
- public void testKeyStore_GetKey_Certificate_Encrypted_Failure() throws Exception {
- setupPassword();
-
- mKeyStore.load(null, null);
-
- assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-
- assertNull("Certificate entries should return null", mKeyStore.getKey(TEST_ALIAS_1, null));
- }
-
- public void testKeyStore_GetKey_NonExistent_Encrypted_Failure() throws Exception {
- setupPassword();
-
- mKeyStore.load(null, null);
-
- assertNull("A non-existent entry should return null", mKeyStore.getKey(TEST_ALIAS_1, null));
- }
-
- public void testKeyStore_GetProvider_Encrypted_Success() throws Exception {
- assertEquals(AndroidKeyStoreProvider.PROVIDER_NAME, mKeyStore.getProvider().getName());
- setupPassword();
- assertEquals(AndroidKeyStoreProvider.PROVIDER_NAME, mKeyStore.getProvider().getName());
- }
-
- public void testKeyStore_GetType_Encrypted_Success() throws Exception {
- assertEquals(AndroidKeyStoreSpi.NAME, mKeyStore.getType());
- setupPassword();
- assertEquals(AndroidKeyStoreSpi.NAME, mKeyStore.getType());
- }
-
- public void testKeyStore_IsCertificateEntry_CA_Encrypted_Success() throws Exception {
- setupPassword();
- mKeyStore.load(null, null);
-
- assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-
- assertTrue("Should return true for CA certificate",
- mKeyStore.isCertificateEntry(TEST_ALIAS_1));
- }
-
- public void testKeyStore_IsCertificateEntry_PrivateKey_Encrypted_Failure() throws Exception {
- setupPassword();
- mKeyStore.load(null, null);
-
- assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
- FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
- assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
- assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-
- assertFalse("Should return false for PrivateKeyEntry",
- mKeyStore.isCertificateEntry(TEST_ALIAS_1));
- }
-
- public void testKeyStore_IsCertificateEntry_NonExist_Encrypted_Failure() throws Exception {
- setupPassword();
- mKeyStore.load(null, null);
-
- assertFalse("Should return false for non-existent entry",
- mKeyStore.isCertificateEntry(TEST_ALIAS_1));
- }
-
- public void testKeyStore_IsCertificateEntry_NonExist_Unencrypted_Failure() throws Exception {
- mKeyStore.load(null, null);
-
- assertFalse("Should return false for non-existent entry",
- mKeyStore.isCertificateEntry(TEST_ALIAS_1));
- }
-
- public void testKeyStore_IsKeyEntry_PrivateKey_Encrypted_Success() throws Exception {
- setupPassword();
- mKeyStore.load(null, null);
-
- assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
- FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
- assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
- assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-
- assertTrue("Should return true for PrivateKeyEntry", mKeyStore.isKeyEntry(TEST_ALIAS_1));
- }
-
- public void testKeyStore_IsKeyEntry_CA_Encrypted_Failure() throws Exception {
- setupPassword();
- mKeyStore.load(null, null);
-
- assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-
- assertFalse("Should return false for CA certificate", mKeyStore.isKeyEntry(TEST_ALIAS_1));
- }
-
- public void testKeyStore_IsKeyEntry_NonExist_Encrypted_Failure() throws Exception {
- setupPassword();
- mKeyStore.load(null, null);
-
- assertFalse("Should return false for non-existent entry",
- mKeyStore.isKeyEntry(TEST_ALIAS_1));
- }
-
- public void testKeyStore_SetCertificate_CA_Encrypted_Success() throws Exception {
- final CertificateFactory f = CertificateFactory.getInstance("X.509");
- final Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
-
- setupPassword();
- mKeyStore.load(null, null);
-
- mKeyStore.setCertificateEntry(TEST_ALIAS_1, actual);
- assertAliases(new String[] { TEST_ALIAS_1 });
-
- Certificate retrieved = mKeyStore.getCertificate(TEST_ALIAS_1);
-
- assertEquals("Retrieved certificate should be the same as the one inserted", actual,
- retrieved);
- }
-
- public void testKeyStore_SetCertificate_CAExists_Overwrite_Encrypted_Success() throws Exception {
- setupPassword();
- mKeyStore.load(null, null);
-
- assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-
- assertAliases(new String[] { TEST_ALIAS_1 });
-
- final CertificateFactory f = CertificateFactory.getInstance("X.509");
- final Certificate cert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
-
- // TODO have separate FAKE_CA for second test
- mKeyStore.setCertificateEntry(TEST_ALIAS_1, cert);
-
- assertAliases(new String[] { TEST_ALIAS_1 });
- }
-
- public void testKeyStore_SetCertificate_PrivateKeyExists_Encrypted_Failure() throws Exception {
- setupPassword();
- mKeyStore.load(null, null);
-
- assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
- FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
- assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
- assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-
- assertAliases(new String[] { TEST_ALIAS_1 });
-
- final CertificateFactory f = CertificateFactory.getInstance("X.509");
- final Certificate cert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
-
- try {
- mKeyStore.setCertificateEntry(TEST_ALIAS_1, cert);
- fail("Should throw when trying to overwrite a PrivateKey entry with a Certificate");
- } catch (KeyStoreException success) {
- }
- }
-
- public void testKeyStore_SetEntry_PrivateKeyEntry_Encrypted_Success() throws Exception {
- setupPassword();
- mKeyStore.load(null, null);
-
- KeyFactory keyFact = KeyFactory.getInstance("RSA");
- PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
-
- final CertificateFactory f = CertificateFactory.getInstance("X.509");
-
- final Certificate[] expectedChain = new Certificate[2];
- expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
- expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
-
- PrivateKeyEntry expected = new PrivateKeyEntry(expectedKey, expectedChain);
-
- mKeyStore.setEntry(TEST_ALIAS_1, expected, null);
-
- Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
- assertNotNull("Retrieved entry should exist", actualEntry);
-
- assertTrue("Retrieved entry should be of type PrivateKeyEntry",
- actualEntry instanceof PrivateKeyEntry);
-
- PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
-
- assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1, FAKE_RSA_CA_1);
- }
-
- public void testKeyStore_SetEntry_PrivateKeyEntry_EC_Unencrypted_Success() throws Exception {
- mKeyStore.load(null, null);
-
- KeyFactory keyFact = KeyFactory.getInstance("EC");
- PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_EC_KEY_1));
-
- final CertificateFactory f = CertificateFactory.getInstance("X.509");
-
- final Certificate[] expectedChain = new Certificate[2];
- expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_EC_USER_1));
- expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_EC_CA_1));
-
- PrivateKeyEntry expected = new PrivateKeyEntry(expectedKey, expectedChain);
-
- mKeyStore.setEntry(TEST_ALIAS_1, expected, null);
-
- Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
- assertNotNull("Retrieved entry should exist", actualEntry);
-
- assertTrue("Retrieved entry should be of type PrivateKeyEntry",
- actualEntry instanceof PrivateKeyEntry);
-
- PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
-
- assertPrivateKeyEntryEquals(actual, "EC", FAKE_EC_KEY_1, FAKE_EC_USER_1, FAKE_EC_CA_1);
- }
-
- public void testKeyStore_SetEntry_PrivateKeyEntry_RSA_Unencrypted_Success() throws Exception {
- mKeyStore.load(null, null);
-
- KeyFactory keyFact = KeyFactory.getInstance("RSA");
- PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
-
- final CertificateFactory f = CertificateFactory.getInstance("X.509");
-
- final Certificate[] expectedChain = new Certificate[2];
- expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
- expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
-
- PrivateKeyEntry expected = new PrivateKeyEntry(expectedKey, expectedChain);
-
- mKeyStore.setEntry(TEST_ALIAS_1, expected, null);
-
- Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
- assertNotNull("Retrieved entry should exist", actualEntry);
-
- assertTrue("Retrieved entry should be of type PrivateKeyEntry",
- actualEntry instanceof PrivateKeyEntry);
-
- PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
-
- assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1, FAKE_RSA_CA_1);
- }
-
- public void testKeyStore_SetEntry_PrivateKeyEntry_Params_Unencrypted_Failure() throws Exception {
- mKeyStore.load(null, null);
-
- KeyFactory keyFact = KeyFactory.getInstance("RSA");
- PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
-
- final CertificateFactory f = CertificateFactory.getInstance("X.509");
-
- final Certificate[] expectedChain = new Certificate[2];
- expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
- expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
-
- PrivateKeyEntry entry = new PrivateKeyEntry(expectedKey, expectedChain);
-
- try {
- mKeyStore.setEntry(TEST_ALIAS_1, entry,
- new KeyStoreParameter.Builder(getContext())
- .setEncryptionRequired(true)
- .build());
- fail("Shouldn't be able to insert encrypted entry when KeyStore uninitialized");
- } catch (KeyStoreException expected) {
- }
-
- assertNull(mKeyStore.getEntry(TEST_ALIAS_1, null));
- }
-
- public void
- testKeyStore_SetEntry_PrivateKeyEntry_Overwrites_PrivateKeyEntry_Encrypted_Success()
- throws Exception {
- setupPassword();
- mKeyStore.load(null, null);
-
- final KeyFactory keyFact = KeyFactory.getInstance("RSA");
- final CertificateFactory f = CertificateFactory.getInstance("X.509");
-
- // Start with PrivateKeyEntry
- {
- PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
-
- final Certificate[] expectedChain = new Certificate[2];
- expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
- expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
-
- PrivateKeyEntry expected = new PrivateKeyEntry(expectedKey, expectedChain);
-
- mKeyStore.setEntry(TEST_ALIAS_1, expected, null);
-
- Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
- assertNotNull("Retrieved entry should exist", actualEntry);
-
- assertTrue("Retrieved entry should be of type PrivateKeyEntry",
- actualEntry instanceof PrivateKeyEntry);
-
- PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
-
- assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
- FAKE_RSA_CA_1);
- }
-
- // TODO make entirely new test vector for the overwrite
- // Replace with PrivateKeyEntry
- {
- PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
-
- final Certificate[] expectedChain = new Certificate[2];
- expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
- expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
-
- PrivateKeyEntry expected = new PrivateKeyEntry(expectedKey, expectedChain);
-
- mKeyStore.setEntry(TEST_ALIAS_1, expected, null);
-
- Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
- assertNotNull("Retrieved entry should exist", actualEntry);
-
- assertTrue("Retrieved entry should be of type PrivateKeyEntry",
- actualEntry instanceof PrivateKeyEntry);
-
- PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
-
- assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
- FAKE_RSA_CA_1);
- }
- }
-
- public void testKeyStore_SetEntry_CAEntry_Overwrites_PrivateKeyEntry_Encrypted_Success()
- throws Exception {
- setupPassword();
- mKeyStore.load(null, null);
-
- final CertificateFactory f = CertificateFactory.getInstance("X.509");
-
- // Start with TrustedCertificateEntry
- {
- final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
-
- TrustedCertificateEntry expectedCertEntry = new TrustedCertificateEntry(caCert);
- mKeyStore.setEntry(TEST_ALIAS_1, expectedCertEntry, null);
-
- Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
- assertNotNull("Retrieved entry should exist", actualEntry);
- assertTrue("Retrieved entry should be of type TrustedCertificateEntry",
- actualEntry instanceof TrustedCertificateEntry);
- TrustedCertificateEntry actualCertEntry = (TrustedCertificateEntry) actualEntry;
- assertEquals("Stored and retrieved certificates should be the same",
- expectedCertEntry.getTrustedCertificate(),
- actualCertEntry.getTrustedCertificate());
- }
-
- // Replace with PrivateKeyEntry
- {
- KeyFactory keyFact = KeyFactory.getInstance("RSA");
- PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
- final Certificate[] expectedChain = new Certificate[2];
- expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
- expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
-
- PrivateKeyEntry expectedPrivEntry = new PrivateKeyEntry(expectedKey, expectedChain);
-
- mKeyStore.setEntry(TEST_ALIAS_1, expectedPrivEntry, null);
-
- Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
- assertNotNull("Retrieved entry should exist", actualEntry);
- assertTrue("Retrieved entry should be of type PrivateKeyEntry",
- actualEntry instanceof PrivateKeyEntry);
-
- PrivateKeyEntry actualPrivEntry = (PrivateKeyEntry) actualEntry;
- assertPrivateKeyEntryEquals(actualPrivEntry, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
- FAKE_RSA_CA_1);
- }
- }
-
- public void testKeyStore_SetEntry_PrivateKeyEntry_Overwrites_CAEntry_Encrypted_Success()
- throws Exception {
- setupPassword();
- mKeyStore.load(null, null);
-
- final CertificateFactory f = CertificateFactory.getInstance("X.509");
-
- final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
-
- // Start with PrivateKeyEntry
- {
- KeyFactory keyFact = KeyFactory.getInstance("RSA");
- PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
- final Certificate[] expectedChain = new Certificate[2];
- expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
- expectedChain[1] = caCert;
-
- PrivateKeyEntry expectedPrivEntry = new PrivateKeyEntry(expectedKey, expectedChain);
-
- mKeyStore.setEntry(TEST_ALIAS_1, expectedPrivEntry, null);
-
- Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
- assertNotNull("Retrieved entry should exist", actualEntry);
- assertTrue("Retrieved entry should be of type PrivateKeyEntry",
- actualEntry instanceof PrivateKeyEntry);
-
- PrivateKeyEntry actualPrivEntry = (PrivateKeyEntry) actualEntry;
- assertPrivateKeyEntryEquals(actualPrivEntry, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
- FAKE_RSA_CA_1);
- }
-
- // Replace with TrustedCertificateEntry
- {
- TrustedCertificateEntry expectedCertEntry = new TrustedCertificateEntry(caCert);
- mKeyStore.setEntry(TEST_ALIAS_1, expectedCertEntry, null);
-
- Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
- assertNotNull("Retrieved entry should exist", actualEntry);
- assertTrue("Retrieved entry should be of type TrustedCertificateEntry",
- actualEntry instanceof TrustedCertificateEntry);
- TrustedCertificateEntry actualCertEntry = (TrustedCertificateEntry) actualEntry;
- assertEquals("Stored and retrieved certificates should be the same",
- expectedCertEntry.getTrustedCertificate(),
- actualCertEntry.getTrustedCertificate());
- }
- }
-
- public
- void
- testKeyStore_SetEntry_PrivateKeyEntry_Overwrites_ShortPrivateKeyEntry_Encrypted_Success()
- throws Exception {
- setupPassword();
- mKeyStore.load(null, null);
-
- final CertificateFactory f = CertificateFactory.getInstance("X.509");
-
- final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
-
- // Start with PrivateKeyEntry
- {
- KeyFactory keyFact = KeyFactory.getInstance("RSA");
- PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
- final Certificate[] expectedChain = new Certificate[2];
- expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
- expectedChain[1] = caCert;
-
- PrivateKeyEntry expectedPrivEntry = new PrivateKeyEntry(expectedKey, expectedChain);
-
- mKeyStore.setEntry(TEST_ALIAS_1, expectedPrivEntry, null);
-
- Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
- assertNotNull("Retrieved entry should exist", actualEntry);
- assertTrue("Retrieved entry should be of type PrivateKeyEntry",
- actualEntry instanceof PrivateKeyEntry);
-
- PrivateKeyEntry actualPrivEntry = (PrivateKeyEntry) actualEntry;
- assertPrivateKeyEntryEquals(actualPrivEntry, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
- FAKE_RSA_CA_1);
- }
-
- // Replace with PrivateKeyEntry that has no chain
- {
- KeyFactory keyFact = KeyFactory.getInstance("RSA");
- PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
- final Certificate[] expectedChain = new Certificate[1];
- expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
-
- PrivateKeyEntry expectedPrivEntry = new PrivateKeyEntry(expectedKey, expectedChain);
-
- mKeyStore.setEntry(TEST_ALIAS_1, expectedPrivEntry, null);
-
- Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
- assertNotNull("Retrieved entry should exist", actualEntry);
- assertTrue("Retrieved entry should be of type PrivateKeyEntry",
- actualEntry instanceof PrivateKeyEntry);
-
- PrivateKeyEntry actualPrivEntry = (PrivateKeyEntry) actualEntry;
- assertPrivateKeyEntryEquals(actualPrivEntry, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
- null);
- }
- }
-
- public void testKeyStore_SetEntry_CAEntry_Overwrites_CAEntry_Encrypted_Success()
- throws Exception {
- setupPassword();
- mKeyStore.load(null, null);
-
- final CertificateFactory f = CertificateFactory.getInstance("X.509");
-
- // Insert TrustedCertificateEntry
- {
- final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
-
- TrustedCertificateEntry expectedCertEntry = new TrustedCertificateEntry(caCert);
- mKeyStore.setEntry(TEST_ALIAS_1, expectedCertEntry, null);
-
- Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
- assertNotNull("Retrieved entry should exist", actualEntry);
- assertTrue("Retrieved entry should be of type TrustedCertificateEntry",
- actualEntry instanceof TrustedCertificateEntry);
- TrustedCertificateEntry actualCertEntry = (TrustedCertificateEntry) actualEntry;
- assertEquals("Stored and retrieved certificates should be the same",
- expectedCertEntry.getTrustedCertificate(),
- actualCertEntry.getTrustedCertificate());
- }
-
- // Replace with TrustedCertificateEntry of USER
- {
- final Certificate userCert = f
- .generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
-
- TrustedCertificateEntry expectedUserEntry = new TrustedCertificateEntry(userCert);
- mKeyStore.setEntry(TEST_ALIAS_1, expectedUserEntry, null);
-
- Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
- assertNotNull("Retrieved entry should exist", actualEntry);
- assertTrue("Retrieved entry should be of type TrustedCertificateEntry",
- actualEntry instanceof TrustedCertificateEntry);
- TrustedCertificateEntry actualUserEntry = (TrustedCertificateEntry) actualEntry;
- assertEquals("Stored and retrieved certificates should be the same",
- expectedUserEntry.getTrustedCertificate(),
- actualUserEntry.getTrustedCertificate());
- }
- }
-
- public void testKeyStore_SetKeyEntry_ProtectedKey_Encrypted_Failure() throws Exception {
- setupPassword();
- mKeyStore.load(null, null);
-
- final CertificateFactory f = CertificateFactory.getInstance("X.509");
-
- final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
-
- KeyFactory keyFact = KeyFactory.getInstance("RSA");
- PrivateKey privKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
- final Certificate[] chain = new Certificate[2];
- chain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
- chain[1] = caCert;
-
- try {
- mKeyStore.setKeyEntry(TEST_ALIAS_1, privKey, "foo".toCharArray(), chain);
- fail("Should fail when a password is specified");
- } catch (KeyStoreException success) {
- }
- }
-
- public void testKeyStore_SetKeyEntry_Encrypted_Success() throws Exception {
- setupPassword();
- mKeyStore.load(null, null);
-
- final CertificateFactory f = CertificateFactory.getInstance("X.509");
-
- final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
-
- KeyFactory keyFact = KeyFactory.getInstance("RSA");
- PrivateKey privKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
- final Certificate[] chain = new Certificate[2];
- chain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
- chain[1] = caCert;
-
- mKeyStore.setKeyEntry(TEST_ALIAS_1, privKey, null, chain);
-
- Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
- assertNotNull("Retrieved entry should exist", actualEntry);
-
- assertTrue("Retrieved entry should be of type PrivateKeyEntry",
- actualEntry instanceof PrivateKeyEntry);
-
- PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
-
- assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1, FAKE_RSA_CA_1);
- }
-
- public void testKeyStore_SetKeyEntry_Replaced_Encrypted_Success() throws Exception {
- setupPassword();
- mKeyStore.load(null, null);
-
- final CertificateFactory f = CertificateFactory.getInstance("X.509");
-
- final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
-
- // Insert initial key
- {
- KeyFactory keyFact = KeyFactory.getInstance("RSA");
- PrivateKey privKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
- final Certificate[] chain = new Certificate[2];
- chain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
- chain[1] = caCert;
-
- mKeyStore.setKeyEntry(TEST_ALIAS_1, privKey, null, chain);
-
- Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
- assertNotNull("Retrieved entry should exist", actualEntry);
-
- assertTrue("Retrieved entry should be of type PrivateKeyEntry",
- actualEntry instanceof PrivateKeyEntry);
-
- PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
-
- assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
- FAKE_RSA_CA_1);
- }
-
- // TODO make a separate key
- // Replace key
- {
- KeyFactory keyFact = KeyFactory.getInstance("RSA");
- PrivateKey privKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
- final Certificate[] chain = new Certificate[2];
- chain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
- chain[1] = caCert;
-
- mKeyStore.setKeyEntry(TEST_ALIAS_1, privKey, null, chain);
-
- Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
- assertNotNull("Retrieved entry should exist", actualEntry);
-
- assertTrue("Retrieved entry should be of type PrivateKeyEntry",
- actualEntry instanceof PrivateKeyEntry);
-
- PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
-
- assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
- FAKE_RSA_CA_1);
- }
- }
-
- @SuppressWarnings("deprecation")
- private static X509Certificate generateCertificate(android.security.KeyStore keyStore,
- String alias, BigInteger serialNumber, X500Principal subjectDN, Date notBefore,
- Date notAfter) throws Exception {
- final String privateKeyAlias = Credentials.USER_PRIVATE_KEY + alias;
-
- KeyPair keyPair = AndroidKeyStoreProvider.loadAndroidKeyStoreKeyPairFromKeystore(
- keyStore, privateKeyAlias, KeyStore.UID_SELF);
-
- final X509V3CertificateGenerator certGen = new X509V3CertificateGenerator();
- certGen.setPublicKey(keyPair.getPublic());
- certGen.setSerialNumber(serialNumber);
- certGen.setSubjectDN(subjectDN);
- certGen.setIssuerDN(subjectDN);
- certGen.setNotBefore(notBefore);
- certGen.setNotAfter(notAfter);
- certGen.setSignatureAlgorithm("sha1WithRSA");
-
- final X509Certificate cert = certGen.generate(keyPair.getPrivate());
-
- return cert;
- }
-
- public void testKeyStore_SetKeyEntry_ReplacedChain_Encrypted_Success() throws Exception {
- setupPassword();
- mKeyStore.load(null, null);
-
- // Create key #1
- {
- final String privateKeyAlias = Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1;
- assertTrue(mAndroidKeyStore.generate(privateKeyAlias, KeyStore.UID_SELF,
- NativeConstants.EVP_PKEY_RSA, 1024, KeyStore.FLAG_ENCRYPTED, null));
-
- Key key = mKeyStore.getKey(TEST_ALIAS_1, null);
-
- assertTrue(key instanceof PrivateKey);
-
- PrivateKey expectedKey = (PrivateKey) key;
-
- X509Certificate expectedCert = generateCertificate(mAndroidKeyStore, TEST_ALIAS_1,
- TEST_SERIAL_1, TEST_DN_1, NOW, NOW_PLUS_10_YEARS);
-
- assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1,
- expectedCert.getEncoded(), KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-
- Entry entry = mKeyStore.getEntry(TEST_ALIAS_1, null);
-
- assertTrue(entry instanceof PrivateKeyEntry);
-
- PrivateKeyEntry keyEntry = (PrivateKeyEntry) entry;
-
- assertPrivateKeyEntryEquals(keyEntry, expectedKey, expectedCert, null);
- }
-
- // Replace key #1 with new chain
- {
- Key key = mKeyStore.getKey(TEST_ALIAS_1, null);
-
- assertTrue(key instanceof PrivateKey);
-
- PrivateKey expectedKey = (PrivateKey) key;
-
- X509Certificate expectedCert = generateCertificate(mAndroidKeyStore, TEST_ALIAS_1,
- TEST_SERIAL_2, TEST_DN_2, NOW, NOW_PLUS_10_YEARS);
-
- mKeyStore.setKeyEntry(TEST_ALIAS_1, expectedKey, null,
- new Certificate[] { expectedCert });
-
- Entry entry = mKeyStore.getEntry(TEST_ALIAS_1, null);
-
- assertTrue(entry instanceof PrivateKeyEntry);
-
- PrivateKeyEntry keyEntry = (PrivateKeyEntry) entry;
-
- assertPrivateKeyEntryEquals(keyEntry, expectedKey, expectedCert, null);
- }
- }
-
- public void testKeyStore_SetKeyEntry_ReplacedChain_DifferentPrivateKey_Encrypted_Failure()
- throws Exception {
- setupPassword();
- mKeyStore.load(null, null);
-
- // Create key #1
- {
- final String privateKeyAlias = Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1;
- assertTrue(mAndroidKeyStore.generate(privateKeyAlias, KeyStore.UID_SELF,
- NativeConstants.EVP_PKEY_RSA, 1024, KeyStore.FLAG_ENCRYPTED, null));
-
- X509Certificate cert = generateCertificate(mAndroidKeyStore, TEST_ALIAS_1,
- TEST_SERIAL_1, TEST_DN_1, NOW, NOW_PLUS_10_YEARS);
-
- assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1,
- cert.getEncoded(), KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
- }
-
- // Create key #2
- {
- final String privateKeyAlias = Credentials.USER_PRIVATE_KEY + TEST_ALIAS_2;
- assertTrue(mAndroidKeyStore.generate(privateKeyAlias, KeyStore.UID_SELF,
- NativeConstants.EVP_PKEY_RSA, 1024, KeyStore.FLAG_ENCRYPTED, null));
-
- X509Certificate cert = generateCertificate(mAndroidKeyStore, TEST_ALIAS_2,
- TEST_SERIAL_2, TEST_DN_2, NOW, NOW_PLUS_10_YEARS);
-
- assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_2,
- cert.getEncoded(), KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
- }
-
- // Replace key #1 with key #2
- {
- Key key1 = mKeyStore.getKey(TEST_ALIAS_2, null);
-
- X509Certificate cert = generateCertificate(mAndroidKeyStore, TEST_ALIAS_2,
- TEST_SERIAL_2, TEST_DN_2, NOW, NOW_PLUS_10_YEARS);
-
- try {
- mKeyStore.setKeyEntry(TEST_ALIAS_1, key1, null, new Certificate[] { cert });
- fail("Should not allow setting of KeyEntry with wrong PrivaetKey");
- } catch (KeyStoreException success) {
- }
- }
- }
-
- public void testKeyStore_SetKeyEntry_ReplacedChain_UnencryptedToEncrypted_Failure()
- throws Exception {
- mKeyStore.load(null, null);
-
- // Create key #1
- {
- final String privateKeyAlias = Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1;
- assertTrue(mAndroidKeyStore.generate(privateKeyAlias,
- android.security.KeyStore.UID_SELF, NativeConstants.EVP_PKEY_RSA, 1024,
- android.security.KeyStore.FLAG_NONE, null));
-
- X509Certificate cert =
- generateCertificate(mAndroidKeyStore, TEST_ALIAS_1, TEST_SERIAL_1, TEST_DN_1,
- NOW, NOW_PLUS_10_YEARS);
-
- assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1,
- cert.getEncoded(), android.security.KeyStore.UID_SELF,
- android.security.KeyStore.FLAG_NONE));
- }
-
- // Replace with one that requires encryption
- {
- Entry entry = mKeyStore.getEntry(TEST_ALIAS_1, null);
-
- try {
- mKeyStore.setEntry(TEST_ALIAS_1, entry,
- new KeyStoreParameter.Builder(getContext())
- .setEncryptionRequired(true)
- .build());
- fail("Should not allow setting of Entry without unlocked keystore");
- } catch (KeyStoreException success) {
- }
-
- assertTrue(mAndroidKeyStore.onUserPasswordChanged("1111"));
- assertTrue(mAndroidKeyStore.isUnlocked());
-
- mKeyStore.setEntry(TEST_ALIAS_1, entry,
- new KeyStoreParameter.Builder(getContext())
- .setEncryptionRequired(true)
- .build());
- }
- }
-
- public void testKeyStore_Size_Encrypted_Success() throws Exception {
- setupPassword();
- mKeyStore.load(null, null);
-
- assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-
- assertEquals("The keystore size should match expected", 1, mKeyStore.size());
- assertAliases(new String[] { TEST_ALIAS_1 });
-
- assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_RSA_CA_1,
- KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
-
- assertEquals("The keystore size should match expected", 2, mKeyStore.size());
- assertAliases(new String[] { TEST_ALIAS_1, TEST_ALIAS_2 });
-
- assertTrue(mAndroidKeyStore.generate(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_3,
- KeyStore.UID_SELF, NativeConstants.EVP_PKEY_RSA, 1024, KeyStore.FLAG_ENCRYPTED,
- null));
-
- assertEquals("The keystore size should match expected", 3, mKeyStore.size());
- assertAliases(new String[] { TEST_ALIAS_1, TEST_ALIAS_2, TEST_ALIAS_3 });
-
- assertTrue(mAndroidKeyStore.delete(Credentials.CA_CERTIFICATE + TEST_ALIAS_1));
-
- assertEquals("The keystore size should match expected", 2, mKeyStore.size());
- assertAliases(new String[] { TEST_ALIAS_2, TEST_ALIAS_3 });
-
- assertTrue(mAndroidKeyStore.delete(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_3));
-
- assertEquals("The keystore size should match expected", 1, mKeyStore.size());
- assertAliases(new String[] { TEST_ALIAS_2 });
- }
-
- public void testKeyStore_Store_LoadStoreParam_Encrypted_Failure() throws Exception {
- setupPassword();
- mKeyStore.load(null, null);
-
- try {
- mKeyStore.store(null);
- fail("Should throw UnsupportedOperationException when trying to store");
- } catch (UnsupportedOperationException success) {
- }
- }
-
- public void testKeyStore_Load_InputStreamSupplied_Encrypted_Failure() throws Exception {
- byte[] buf = "FAKE KEYSTORE".getBytes();
- ByteArrayInputStream is = new ByteArrayInputStream(buf);
-
- try {
- mKeyStore.load(is, null);
- fail("Should throw IllegalArgumentException when InputStream is supplied");
- } catch (IllegalArgumentException success) {
- }
- }
-
- public void testKeyStore_Load_PasswordSupplied_Encrypted_Failure() throws Exception {
- try {
- mKeyStore.load(null, "password".toCharArray());
- fail("Should throw IllegalArgumentException when password is supplied");
- } catch (IllegalArgumentException success) {
- }
- }
-
- public void testKeyStore_Store_OutputStream_Encrypted_Failure() throws Exception {
- setupPassword();
- mKeyStore.load(null, null);
-
- OutputStream sink = new ByteArrayOutputStream();
- try {
- mKeyStore.store(sink, null);
- fail("Should throw UnsupportedOperationException when trying to store");
- } catch (UnsupportedOperationException success) {
- }
-
- try {
- mKeyStore.store(sink, "blah".toCharArray());
- fail("Should throw UnsupportedOperationException when trying to store");
- } catch (UnsupportedOperationException success) {
- }
- }
-
- private void setupKey() throws Exception {
- final String privateKeyAlias = Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1;
- assertTrue(mAndroidKeyStore
- .generate(privateKeyAlias, KeyStore.UID_SELF, NativeConstants.EVP_PKEY_RSA, 1024,
- KeyStore.FLAG_ENCRYPTED, null));
-
- X509Certificate cert = generateCertificate(mAndroidKeyStore, TEST_ALIAS_1, TEST_SERIAL_1,
- TEST_DN_1, NOW, NOW_PLUS_10_YEARS);
-
- assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1,
- cert.getEncoded(), KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
- }
-
- public void testKeyStore_KeyOperations_Wrap_Encrypted_Success() throws Exception {
- setupPassword();
- mKeyStore.load(null, null);
-
- setupKey();
-
- // Test key usage
- Entry e = mKeyStore.getEntry(TEST_ALIAS_1, null);
- assertNotNull(e);
- assertTrue(e instanceof PrivateKeyEntry);
-
- PrivateKeyEntry privEntry = (PrivateKeyEntry) e;
- PrivateKey privKey = privEntry.getPrivateKey();
- assertNotNull(privKey);
-
- PublicKey pubKey = privEntry.getCertificate().getPublicKey();
-
- Cipher c = Cipher.getInstance("RSA/ECB/PKCS1Padding");
- c.init(Cipher.WRAP_MODE, pubKey);
-
- byte[] expectedKey = new byte[] {
- 0x00, 0x05, (byte) 0xAA, (byte) 0x0A5, (byte) 0xFF, 0x55, 0x0A
- };
-
- SecretKey expectedSecret = new SecretKeySpec(expectedKey, "AES");
-
- byte[] wrappedExpected = c.wrap(expectedSecret);
-
- c.init(Cipher.UNWRAP_MODE, privKey);
- SecretKey actualSecret = (SecretKey) c.unwrap(wrappedExpected, "AES", Cipher.SECRET_KEY);
-
- assertEquals(Arrays.toString(expectedSecret.getEncoded()),
- Arrays.toString(actualSecret.getEncoded()));
- }
-}
diff --git a/legacy-test/Android.mk b/legacy-test/Android.mk
index 8efda2a..ef2950b 100644
--- a/legacy-test/Android.mk
+++ b/legacy-test/Android.mk
@@ -31,6 +31,110 @@
include $(BUILD_JAVA_LIBRARY)
+# Build the repackaged-legacy-test library
+# ========================================
+# This contains repackaged versions of the classes from legacy-test.
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_MODULE := repackaged-legacy-test
+LOCAL_NO_STANDARD_LIBRARIES := true
+LOCAL_JAVA_LIBRARIES := core-oj core-libart framework
+LOCAL_JARJAR_RULES := $(LOCAL_PATH)/jarjar-rules.txt
+
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# Generate the stub source files for legacy.test.stubs
+# ====================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := \
+ $(call all-java-files-under, src)
+
+LOCAL_JAVA_LIBRARIES := \
+ core-oj \
+ core-libart \
+ framework \
+
+LOCAL_MODULE_CLASS := JAVA_LIBRARIES
+LOCAL_DROIDDOC_SOURCE_PATH := $(LOCAL_PATH)/src
+
+LEGACY_TEST_OUTPUT_API_FILE := $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/legacy.test.stubs_intermediates/api.txt
+LEGACY_TEST_OUTPUT_REMOVED_API_FILE := $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/legacy.test.stubs_intermediates/removed.txt
+
+LEGACY_TEST_API_FILE := $(LOCAL_PATH)/api/legacy-test-current.txt
+LEGACY_TEST_REMOVED_API_FILE := $(LOCAL_PATH)/api/legacy-test-removed.txt
+
+LOCAL_DROIDDOC_OPTIONS:= \
+ -stubpackages android.test:android.test.suitebuilder.annotation:com.android.internal.util:junit.framework \
+ -stubsourceonly \
+ -stubs $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/legacy.test.stubs_intermediates/src \
+ -nodocs \
+ -api $(LEGACY_TEST_OUTPUT_API_FILE) \
+ -removedApi $(LEGACY_TEST_OUTPUT_REMOVED_API_FILE) \
+
+LOCAL_UNINSTALLABLE_MODULE := true
+LOCAL_MODULE := legacy-test-api-stubs-gen
+
+include $(BUILD_DROIDDOC)
+
+# Remember the target that will trigger the code generation.
+legacy_test_api_gen_stamp := $(full_target)
+
+# Add some additional dependencies
+$(LEGACY_TEST_OUTPUT_API_FILE): $(full_target)
+$(LEGACY_TEST_OUTPUT_REMOVED_API_FILE): $(full_target)
+
+# Build the legacy.test.stubs library
+# ===================================
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := legacy.test.stubs
+
+LOCAL_SOURCE_FILES_ALL_GENERATED := true
+
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# Make sure to run droiddoc first to generate the stub source files.
+$(full_classes_compiled_jar) : $(legacy_test_api_gen_stamp)
+$(full_classes_jack) : $(legacy_test_api_gen_stamp)
+
+# Archive a copy of the classes.jar in SDK build.
+$(call dist-for-goals,sdk win_sdk,$(full_classes_jar):legacy.test.stubs.jar)
+
+# Check that the legacy.test.stubs library has not changed
+# ========================================================
+
+# Check that the API we're building hasn't changed from the not-yet-released
+# SDK version.
+$(eval $(call check-api, \
+ check-legacy-test-api-current, \
+ $(LEGACY_TEST_API_FILE), \
+ $(LEGACY_TEST_OUTPUT_API_FILE), \
+ $(LEGACY_TEST_REMOVED_API_FILE), \
+ $(LEGACY_TEST_OUTPUT_REMOVED_API_FILE), \
+ -error 2 -error 3 -error 4 -error 5 -error 6 \
+ -error 7 -error 8 -error 9 -error 10 -error 11 -error 12 -error 13 -error 14 -error 15 \
+ -error 16 -error 17 -error 18 -error 19 -error 20 -error 21 -error 23 -error 24 \
+ -error 25 -error 26 -error 27, \
+ cat $(LOCAL_PATH)/api/apicheck_msg_legacy_test.txt, \
+ check-legacy-test-api, \
+ $(call doc-timestamp-for,legacy-test-api-stubs-gen) \
+ ))
+
+.PHONY: check-legacy-test-api
+checkapi: check-legacy-test-api
+
+.PHONY: update-legacy-test-api
+update-api: update-legacy-test-api
+
+update-legacy-test-api: $(LEGACY_TEST_OUTPUT_API_FILE) | $(ACP)
+ @echo Copying current.txt
+ $(hide) $(ACP) $(LEGACY_TEST_OUTPUT_API_FILE) $(LEGACY_TEST_API_FILE)
+ @echo Copying removed.txt
+ $(hide) $(ACP) $(LEGACY_TEST_OUTPUT_REMOVED_API_FILE) $(LEGACY_TEST_REMOVED_API_FILE)
+
# Build the legacy-android-test library
# =====================================
# This contains the android.test classes that were in Android API level 25,
@@ -48,19 +152,6 @@
include $(BUILD_STATIC_JAVA_LIBRARY)
-# Build the legacy-android-tests library
-# ======================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := \
- $(call all-java-files-under, tests)
-LOCAL_MODULE := legacy-android-tests
-LOCAL_NO_STANDARD_LIBRARIES := true
-LOCAL_JAVA_LIBRARIES := core-oj core-libart framework junit
-LOCAL_STATIC_JAVA_LIBRARIES := legacy-android-test
-
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
ifeq ($(HOST_OS),linux)
# Build the legacy-performance-test-hostdex library
# =================================================
diff --git a/legacy-test/api/apicheck_msg_legacy_test.txt b/legacy-test/api/apicheck_msg_legacy_test.txt
new file mode 100644
index 0000000..ad5f235
--- /dev/null
+++ b/legacy-test/api/apicheck_msg_legacy_test.txt
@@ -0,0 +1,17 @@
+
+******************************
+You have tried to change the API from what has been previously approved.
+
+To make these errors go away, you have two choices:
+ 1) You can add "@hide" javadoc comments to the methods, etc. listed in the
+ errors above.
+
+ 2) You can update legacy-test-current.txt by executing the following command:
+ make update-legacy-test-api
+
+ To submit the revised legacy-test-current.txt to the main Android repository,
+ you will need approval.
+******************************
+
+
+
diff --git a/legacy-test/api/legacy-test-current.txt b/legacy-test/api/legacy-test-current.txt
new file mode 100644
index 0000000..7ebd6aa
--- /dev/null
+++ b/legacy-test/api/legacy-test-current.txt
@@ -0,0 +1,227 @@
+package android.test {
+
+ public deprecated class AndroidTestCase extends junit.framework.TestCase {
+ ctor public AndroidTestCase();
+ method public void assertActivityRequiresPermission(java.lang.String, java.lang.String, java.lang.String);
+ method public void assertReadingContentUriRequiresPermission(android.net.Uri, java.lang.String);
+ method public void assertWritingContentUriRequiresPermission(android.net.Uri, java.lang.String);
+ method public android.content.Context getContext();
+ method protected void scrubClass(java.lang.Class<?>) throws java.lang.IllegalAccessException;
+ method public void setContext(android.content.Context);
+ method public void testAndroidTestCaseSetupProperly();
+ field protected android.content.Context mContext;
+ }
+
+ public abstract deprecated class FlakyTest implements java.lang.annotation.Annotation {
+ }
+
+ public deprecated class InstrumentationTestCase extends junit.framework.TestCase {
+ ctor public InstrumentationTestCase();
+ method public android.app.Instrumentation getInstrumentation();
+ method public deprecated void injectInsrumentation(android.app.Instrumentation);
+ method public void injectInstrumentation(android.app.Instrumentation);
+ method public final <T extends android.app.Activity> T launchActivity(java.lang.String, java.lang.Class<T>, android.os.Bundle);
+ method public final <T extends android.app.Activity> T launchActivityWithIntent(java.lang.String, java.lang.Class<T>, android.content.Intent);
+ method public void runTestOnUiThread(java.lang.Runnable) throws java.lang.Throwable;
+ method public void sendKeys(java.lang.String);
+ method public void sendKeys(int...);
+ method public void sendRepeatedKeys(int...);
+ }
+
+ public deprecated class InstrumentationTestSuite extends junit.framework.TestSuite {
+ ctor public InstrumentationTestSuite(android.app.Instrumentation);
+ ctor public InstrumentationTestSuite(java.lang.String, android.app.Instrumentation);
+ ctor public InstrumentationTestSuite(java.lang.Class, android.app.Instrumentation);
+ method public void addTestSuite(java.lang.Class);
+ }
+
+ public abstract deprecated interface PerformanceTestCase {
+ method public abstract boolean isPerformanceOnly();
+ method public abstract int startPerformance(android.test.PerformanceTestCase.Intermediates);
+ }
+
+ public static abstract interface PerformanceTestCase.Intermediates {
+ method public abstract void addIntermediate(java.lang.String);
+ method public abstract void addIntermediate(java.lang.String, long);
+ method public abstract void finishTiming(boolean);
+ method public abstract void setInternalIterations(int);
+ method public abstract void startTiming(boolean);
+ }
+
+ public abstract deprecated class UiThreadTest implements java.lang.annotation.Annotation {
+ }
+
+}
+
+package android.test.suitebuilder.annotation {
+
+ public abstract deprecated class LargeTest implements java.lang.annotation.Annotation {
+ }
+
+ public abstract deprecated class MediumTest implements java.lang.annotation.Annotation {
+ }
+
+ public abstract deprecated class SmallTest implements java.lang.annotation.Annotation {
+ }
+
+ public abstract deprecated class Smoke implements java.lang.annotation.Annotation {
+ }
+
+ public abstract deprecated class Suppress implements java.lang.annotation.Annotation {
+ }
+
+}
+
+package com.android.internal.util {
+
+ public abstract deprecated interface Predicate<T> {
+ method public abstract boolean apply(T);
+ }
+
+}
+
+package junit.framework {
+
+ public class Assert {
+ ctor protected Assert();
+ method public static void assertEquals(java.lang.String, java.lang.Object, java.lang.Object);
+ method public static void assertEquals(java.lang.Object, java.lang.Object);
+ method public static void assertEquals(java.lang.String, java.lang.String, java.lang.String);
+ method public static void assertEquals(java.lang.String, java.lang.String);
+ method public static void assertEquals(java.lang.String, double, double, double);
+ method public static void assertEquals(double, double, double);
+ method public static void assertEquals(java.lang.String, float, float, float);
+ method public static void assertEquals(float, float, float);
+ method public static void assertEquals(java.lang.String, long, long);
+ method public static void assertEquals(long, long);
+ method public static void assertEquals(java.lang.String, boolean, boolean);
+ method public static void assertEquals(boolean, boolean);
+ method public static void assertEquals(java.lang.String, byte, byte);
+ method public static void assertEquals(byte, byte);
+ method public static void assertEquals(java.lang.String, char, char);
+ method public static void assertEquals(char, char);
+ method public static void assertEquals(java.lang.String, short, short);
+ method public static void assertEquals(short, short);
+ method public static void assertEquals(java.lang.String, int, int);
+ method public static void assertEquals(int, int);
+ method public static void assertFalse(java.lang.String, boolean);
+ method public static void assertFalse(boolean);
+ method public static void assertNotNull(java.lang.Object);
+ method public static void assertNotNull(java.lang.String, java.lang.Object);
+ method public static void assertNotSame(java.lang.String, java.lang.Object, java.lang.Object);
+ method public static void assertNotSame(java.lang.Object, java.lang.Object);
+ method public static void assertNull(java.lang.Object);
+ method public static void assertNull(java.lang.String, java.lang.Object);
+ method public static void assertSame(java.lang.String, java.lang.Object, java.lang.Object);
+ method public static void assertSame(java.lang.Object, java.lang.Object);
+ method public static void assertTrue(java.lang.String, boolean);
+ method public static void assertTrue(boolean);
+ method public static void fail(java.lang.String);
+ method public static void fail();
+ method public static void failNotEquals(java.lang.String, java.lang.Object, java.lang.Object);
+ method public static void failNotSame(java.lang.String, java.lang.Object, java.lang.Object);
+ method public static void failSame(java.lang.String);
+ method public static java.lang.String format(java.lang.String, java.lang.Object, java.lang.Object);
+ }
+
+ public class AssertionFailedError extends java.lang.AssertionError {
+ ctor public AssertionFailedError();
+ ctor public AssertionFailedError(java.lang.String);
+ }
+
+ public class ComparisonFailure extends junit.framework.AssertionFailedError {
+ ctor public ComparisonFailure(java.lang.String, java.lang.String, java.lang.String);
+ method public java.lang.String getActual();
+ method public java.lang.String getExpected();
+ }
+
+ public abstract interface Protectable {
+ method public abstract void protect() throws java.lang.Throwable;
+ }
+
+ public abstract interface Test {
+ method public abstract int countTestCases();
+ method public abstract void run(junit.framework.TestResult);
+ }
+
+ public abstract class TestCase extends junit.framework.Assert implements junit.framework.Test {
+ ctor public TestCase();
+ ctor public TestCase(java.lang.String);
+ method public int countTestCases();
+ method protected junit.framework.TestResult createResult();
+ method public java.lang.String getName();
+ method public junit.framework.TestResult run();
+ method public void run(junit.framework.TestResult);
+ method public void runBare() throws java.lang.Throwable;
+ method protected void runTest() throws java.lang.Throwable;
+ method public void setName(java.lang.String);
+ method protected void setUp() throws java.lang.Exception;
+ method protected void tearDown() throws java.lang.Exception;
+ }
+
+ public class TestFailure {
+ ctor public TestFailure(junit.framework.Test, java.lang.Throwable);
+ method public java.lang.String exceptionMessage();
+ method public junit.framework.Test failedTest();
+ method public boolean isFailure();
+ method public java.lang.Throwable thrownException();
+ method public java.lang.String trace();
+ field protected junit.framework.Test fFailedTest;
+ field protected java.lang.Throwable fThrownException;
+ }
+
+ public abstract interface TestListener {
+ method public abstract void addError(junit.framework.Test, java.lang.Throwable);
+ method public abstract void addFailure(junit.framework.Test, junit.framework.AssertionFailedError);
+ method public abstract void endTest(junit.framework.Test);
+ method public abstract void startTest(junit.framework.Test);
+ }
+
+ public class TestResult {
+ ctor public TestResult();
+ method public synchronized void addError(junit.framework.Test, java.lang.Throwable);
+ method public synchronized void addFailure(junit.framework.Test, junit.framework.AssertionFailedError);
+ method public synchronized void addListener(junit.framework.TestListener);
+ method public void endTest(junit.framework.Test);
+ method public synchronized int errorCount();
+ method public synchronized java.util.Enumeration<junit.framework.TestFailure> errors();
+ method public synchronized int failureCount();
+ method public synchronized java.util.Enumeration<junit.framework.TestFailure> failures();
+ method public synchronized void removeListener(junit.framework.TestListener);
+ method protected void run(junit.framework.TestCase);
+ method public synchronized int runCount();
+ method public void runProtected(junit.framework.Test, junit.framework.Protectable);
+ method public synchronized boolean shouldStop();
+ method public void startTest(junit.framework.Test);
+ method public synchronized void stop();
+ method public synchronized boolean wasSuccessful();
+ field protected java.util.Vector<junit.framework.TestFailure> fErrors;
+ field protected java.util.Vector<junit.framework.TestFailure> fFailures;
+ field protected java.util.Vector<junit.framework.TestListener> fListeners;
+ field protected int fRunTests;
+ }
+
+ public class TestSuite implements junit.framework.Test {
+ ctor public TestSuite();
+ ctor public TestSuite(java.lang.Class<?>);
+ ctor public TestSuite(java.lang.Class<? extends junit.framework.TestCase>, java.lang.String);
+ ctor public TestSuite(java.lang.String);
+ ctor public TestSuite(java.lang.Class<?>...);
+ ctor public TestSuite(java.lang.Class<? extends junit.framework.TestCase>[], java.lang.String);
+ method public void addTest(junit.framework.Test);
+ method public void addTestSuite(java.lang.Class<? extends junit.framework.TestCase>);
+ method public int countTestCases();
+ method public static junit.framework.Test createTest(java.lang.Class<?>, java.lang.String);
+ method public java.lang.String getName();
+ method public static java.lang.reflect.Constructor<?> getTestConstructor(java.lang.Class<?>) throws java.lang.NoSuchMethodException;
+ method public void run(junit.framework.TestResult);
+ method public void runTest(junit.framework.Test, junit.framework.TestResult);
+ method public void setName(java.lang.String);
+ method public junit.framework.Test testAt(int);
+ method public int testCount();
+ method public java.util.Enumeration<junit.framework.Test> tests();
+ method public static junit.framework.Test warning(java.lang.String);
+ }
+
+}
+
diff --git a/legacy-test/api/legacy-test-removed.txt b/legacy-test/api/legacy-test-removed.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/legacy-test/api/legacy-test-removed.txt
diff --git a/legacy-test/jarjar-rules.txt b/legacy-test/jarjar-rules.txt
new file mode 100644
index 0000000..fd8555c
--- /dev/null
+++ b/legacy-test/jarjar-rules.txt
@@ -0,0 +1,3 @@
+rule junit.** repackaged.junit.@1
+rule android.test.** repackaged.android.test.@1
+rule com.android.internal.util.** repackaged.com.android.internal.util.@1
diff --git a/test-runner/src/android/test/suitebuilder/annotation/package.html b/legacy-test/src/android/test/suitebuilder/annotation/package.html
similarity index 100%
rename from test-runner/src/android/test/suitebuilder/annotation/package.html
rename to legacy-test/src/android/test/suitebuilder/annotation/package.html
diff --git a/legacy-test/src/com/android/internal/util/Predicates.java b/legacy-test/src/com/android/internal/util/Predicates.java
deleted file mode 100644
index fe1ff15..0000000
--- a/legacy-test/src/com/android/internal/util/Predicates.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.internal.util;
-
-import java.util.Arrays;
-
-/**
- * Predicates contains static methods for creating the standard set of
- * {@code Predicate} objects.
- *
- * @hide
- */
-public class Predicates {
-
- private Predicates() {
- }
-
- /**
- * Returns a Predicate that evaluates to true iff each of its components
- * evaluates to true. The components are evaluated in order, and evaluation
- * will be "short-circuited" as soon as the answer is determined.
- */
- public static <T> Predicate<T> and(Predicate<? super T>... components) {
- return Predicates.<T>and(Arrays.asList(components));
- }
-
- /**
- * Returns a Predicate that evaluates to true iff each of its components
- * evaluates to true. The components are evaluated in order, and evaluation
- * will be "short-circuited" as soon as the answer is determined. Does not
- * defensively copy the iterable passed in, so future changes to it will alter
- * the behavior of this Predicate. If components is empty, the returned
- * Predicate will always evaluate to true.
- */
- public static <T> Predicate<T> and(Iterable<? extends Predicate<? super T>> components) {
- return new AndPredicate(components);
- }
-
- /**
- * Returns a Predicate that evaluates to true iff any one of its components
- * evaluates to true. The components are evaluated in order, and evaluation
- * will be "short-circuited" as soon as the answer is determined.
- */
- public static <T> Predicate<T> or(Predicate<? super T>... components) {
- return Predicates.<T>or(Arrays.asList(components));
- }
-
- /**
- * Returns a Predicate that evaluates to true iff any one of its components
- * evaluates to true. The components are evaluated in order, and evaluation
- * will be "short-circuited" as soon as the answer is determined. Does not
- * defensively copy the iterable passed in, so future changes to it will alter
- * the behavior of this Predicate. If components is empty, the returned
- * Predicate will always evaluate to false.
- */
- public static <T> Predicate<T> or(Iterable<? extends Predicate<? super T>> components) {
- return new OrPredicate(components);
- }
-
- /**
- * Returns a Predicate that evaluates to true iff the given Predicate
- * evaluates to false.
- */
- public static <T> Predicate<T> not(Predicate<? super T> predicate) {
- return new NotPredicate<T>(predicate);
- }
-
- private static class AndPredicate<T> implements Predicate<T> {
- private final Iterable<? extends Predicate<? super T>> components;
-
- private AndPredicate(Iterable<? extends Predicate<? super T>> components) {
- this.components = components;
- }
-
- public boolean apply(T t) {
- for (Predicate<? super T> predicate : components) {
- if (!predicate.apply(t)) {
- return false;
- }
- }
- return true;
- }
- }
-
- private static class OrPredicate<T> implements Predicate<T> {
- private final Iterable<? extends Predicate<? super T>> components;
-
- private OrPredicate(Iterable<? extends Predicate<? super T>> components) {
- this.components = components;
- }
-
- public boolean apply(T t) {
- for (Predicate<? super T> predicate : components) {
- if (predicate.apply(t)) {
- return true;
- }
- }
- return false;
- }
- }
-
- private static class NotPredicate<T> implements Predicate<T> {
- private final Predicate<? super T> predicate;
-
- private NotPredicate(Predicate<? super T> predicate) {
- this.predicate = predicate;
- }
-
- public boolean apply(T t) {
- return !predicate.apply(t);
- }
- }
-}
diff --git a/legacy-test/tests/com/android/internal/util/PredicatesTest.java b/legacy-test/tests/com/android/internal/util/PredicatesTest.java
deleted file mode 100644
index c46ff05..0000000
--- a/legacy-test/tests/com/android/internal/util/PredicatesTest.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.internal.util;
-
-import junit.framework.TestCase;
-
-import java.util.ArrayList;
-import java.util.Collections;
-
-public class PredicatesTest extends TestCase {
-
- private static final Predicate<Object> TRUE = new Predicate<Object>() {
- public boolean apply(Object o) {
- return true;
- }
- };
-
- private static final Predicate<Object> FALSE = new Predicate<Object>() {
- public boolean apply(Object o) {
- return false;
- }
- };
-
- public void testAndPredicate_AllConditionsTrue() throws Exception {
- assertTrue(Predicates.and(newArrayList(TRUE)).apply(null));
- assertTrue(Predicates.and(newArrayList(TRUE, TRUE)).apply(null));
- }
-
- public void testAndPredicate_AtLeastOneConditionIsFalse() throws Exception {
- assertFalse(Predicates.and(newArrayList(FALSE, TRUE, TRUE)).apply(null));
- assertFalse(Predicates.and(newArrayList(TRUE, FALSE, TRUE)).apply(null));
- assertFalse(Predicates.and(newArrayList(TRUE, TRUE, FALSE)).apply(null));
- }
-
- public void testOrPredicate_AllConditionsTrue() throws Exception {
- assertTrue(Predicates.or(newArrayList(TRUE, TRUE, TRUE)).apply(null));
- }
-
- public void testOrPredicate_AllConditionsFalse() throws Exception {
- assertFalse(Predicates.or(newArrayList(FALSE, FALSE, FALSE)).apply(null));
- }
-
- public void testOrPredicate_AtLeastOneConditionIsTrue() throws Exception {
- assertTrue(Predicates.or(newArrayList(TRUE, FALSE, FALSE)).apply(null));
- assertTrue(Predicates.or(newArrayList(FALSE, TRUE, FALSE)).apply(null));
- assertTrue(Predicates.or(newArrayList(FALSE, FALSE, TRUE)).apply(null));
- }
-
- public void testNotPredicate() throws Exception {
- assertTrue(Predicates.not(FALSE).apply(null));
- assertFalse(Predicates.not(TRUE).apply(null));
- }
-
- private static <E> ArrayList<E> newArrayList(E... elements) {
- ArrayList<E> list = new ArrayList<E>();
- Collections.addAll(list, elements);
- return list;
- }
-
-}
diff --git a/libs/androidfw/ResourceTypes.cpp b/libs/androidfw/ResourceTypes.cpp
index bab8883..0782269 100644
--- a/libs/androidfw/ResourceTypes.cpp
+++ b/libs/androidfw/ResourceTypes.cpp
@@ -3313,13 +3313,14 @@
clearBagCache();
const size_t numTypes = types.size();
for (size_t i = 0; i < numTypes; i++) {
- const TypeList& typeList = types[i];
+ TypeList& typeList = types.editItemAt(i);
const size_t numInnerTypes = typeList.size();
for (size_t j = 0; j < numInnerTypes; j++) {
if (typeList[j]->package->owner == owner) {
delete typeList[j];
}
}
+ typeList.clear();
}
const size_t N = packages.size();
diff --git a/libs/hwui/Android.bp b/libs/hwui/Android.bp
index 303d05f..770a57a 100644
--- a/libs/hwui/Android.bp
+++ b/libs/hwui/Android.bp
@@ -36,6 +36,7 @@
"external/skia/src/effects",
"external/skia/src/image",
"external/skia/src/utils",
+ "external/skia/src/gpu",
],
product_variables: {
@@ -133,6 +134,7 @@
"pipeline/skia/SkiaProfileRenderer.cpp",
"pipeline/skia/SkiaRecordingCanvas.cpp",
"pipeline/skia/SkiaVulkanPipeline.cpp",
+ "pipeline/skia/VectorDrawableAtlas.cpp",
"renderstate/Blend.cpp",
"renderstate/MeshState.cpp",
"renderstate/OffscreenBufferPool.cpp",
@@ -201,6 +203,8 @@
"PathParser.cpp",
"PathTessellator.cpp",
"PixelBuffer.cpp",
+ "ProfileData.cpp",
+ "ProfileDataContainer.cpp",
"ProfileRenderer.cpp",
"Program.cpp",
"ProgramCache.cpp",
@@ -300,7 +304,6 @@
"tests/unit/BakedOpDispatcherTests.cpp",
"tests/unit/BakedOpRendererTests.cpp",
"tests/unit/BakedOpStateTests.cpp",
- "tests/unit/BitmapTests.cpp",
"tests/unit/CacheManagerTests.cpp",
"tests/unit/CanvasContextTests.cpp",
"tests/unit/CanvasStateTests.cpp",
@@ -339,6 +342,7 @@
"tests/unit/TextureCacheTests.cpp",
"tests/unit/TypefaceTests.cpp",
"tests/unit/VectorDrawableTests.cpp",
+ "tests/unit/VectorDrawableAtlasTests.cpp",
],
}
diff --git a/libs/hwui/JankTracker.cpp b/libs/hwui/JankTracker.cpp
index 028d9f7..9d11828 100644
--- a/libs/hwui/JankTracker.cpp
+++ b/libs/hwui/JankTracker.cpp
@@ -34,14 +34,6 @@
namespace android {
namespace uirenderer {
-static const char* JANK_TYPE_NAMES[] = {
- "Missed Vsync",
- "High input latency",
- "Slow UI thread",
- "Slow bitmap uploads",
- "Slow issue draw commands",
-};
-
struct Comparison {
FrameInfoIndex start;
FrameInfoIndex end;
@@ -68,70 +60,13 @@
*/
static const int64_t EXEMPT_FRAMES_FLAGS = FrameInfoFlags::SurfaceCanvas;
-// The bucketing algorithm controls so to speak
-// If a frame is <= to this it goes in bucket 0
-static const uint32_t kBucketMinThreshold = 5;
-// If a frame is > this, start counting in increments of 2ms
-static const uint32_t kBucket2msIntervals = 32;
-// If a frame is > this, start counting in increments of 4ms
-static const uint32_t kBucket4msIntervals = 48;
-
// For testing purposes to try and eliminate test infra overhead we will
// consider any unknown delay of frame start as part of the test infrastructure
// and filter it out of the frame profile data
static FrameInfoIndex sFrameStart = FrameInfoIndex::IntendedVsync;
-// The interval of the slow frame histogram
-static const uint32_t kSlowFrameBucketIntervalMs = 50;
-// The start point of the slow frame bucket in ms
-static const uint32_t kSlowFrameBucketStartMs = 150;
-
-// This will be called every frame, performance sensitive
-// Uses bit twiddling to avoid branching while achieving the packing desired
-static uint32_t frameCountIndexForFrameTime(nsecs_t frameTime) {
- uint32_t index = static_cast<uint32_t>(ns2ms(frameTime));
- // If index > kBucketMinThreshold mask will be 0xFFFFFFFF as a result
- // of negating 1 (twos compliment, yaay) else mask will be 0
- uint32_t mask = -(index > kBucketMinThreshold);
- // If index > threshold, this will essentially perform:
- // amountAboveThreshold = index - threshold;
- // index = threshold + (amountAboveThreshold / 2)
- // However if index is <= this will do nothing. It will underflow, do
- // a right shift by 0 (no-op), then overflow back to the original value
- index = ((index - kBucket4msIntervals) >> (index > kBucket4msIntervals))
- + kBucket4msIntervals;
- index = ((index - kBucket2msIntervals) >> (index > kBucket2msIntervals))
- + kBucket2msIntervals;
- // If index was < minThreshold at the start of all this it's going to
- // be a pretty garbage value right now. However, mask is 0 so we'll end
- // up with the desired result of 0.
- index = (index - kBucketMinThreshold) & mask;
- return index;
-}
-
-// Only called when dumping stats, less performance sensitive
-int32_t JankTracker::frameTimeForFrameCountIndex(uint32_t index) {
- index = index + kBucketMinThreshold;
- if (index > kBucket2msIntervals) {
- index += (index - kBucket2msIntervals);
- }
- if (index > kBucket4msIntervals) {
- // This works because it was already doubled by the above if
- // 1 is added to shift slightly more towards the middle of the bucket
- index += (index - kBucket4msIntervals) + 1;
- }
- return index;
-}
-
-int32_t JankTracker::frameTimeForSlowFrameCountIndex(uint32_t index) {
- return (index * kSlowFrameBucketIntervalMs) + kSlowFrameBucketStartMs;
-}
-
-JankTracker::JankTracker(const DisplayInfo& displayInfo) {
- // By default this will use malloc memory. It may be moved later to ashmem
- // if there is shared space for it and a request comes in to do that.
- mData = new ProfileData;
- reset();
+JankTracker::JankTracker(ProfileDataContainer* globalData, const DisplayInfo& displayInfo) {
+ mGlobalData = globalData;
nsecs_t frameIntervalNanos = static_cast<nsecs_t>(1_s / displayInfo.fps);
#if USE_HWC2
nsecs_t sfOffset = frameIntervalNanos - (displayInfo.presentationDeadline - 1_ms);
@@ -151,82 +86,6 @@
setFrameInterval(frameIntervalNanos);
}
-JankTracker::~JankTracker() {
- freeData();
-}
-
-void JankTracker::freeData() {
- if (mIsMapped) {
- munmap(mData, sizeof(ProfileData));
- } else {
- delete mData;
- }
- mIsMapped = false;
- mData = nullptr;
-}
-
-void JankTracker::rotateStorage() {
- // If we are mapped we want to stop using the ashmem backend and switch to malloc
- // We are expecting a switchStorageToAshmem call to follow this, but it's not guaranteed
- // If we aren't sitting on top of ashmem then just do a reset() as it's functionally
- // equivalent do a free, malloc, reset.
- if (mIsMapped) {
- freeData();
- mData = new ProfileData;
- }
- reset();
-}
-
-void JankTracker::switchStorageToAshmem(int ashmemfd) {
- int regionSize = ashmem_get_size_region(ashmemfd);
- if (regionSize < 0) {
- int err = errno;
- ALOGW("Failed to get ashmem region size from fd %d, err %d %s", ashmemfd, err, strerror(err));
- return;
- }
- if (regionSize < static_cast<int>(sizeof(ProfileData))) {
- ALOGW("Ashmem region is too small! Received %d, required %u",
- regionSize, static_cast<unsigned int>(sizeof(ProfileData)));
- return;
- }
- ProfileData* newData = reinterpret_cast<ProfileData*>(
- mmap(NULL, sizeof(ProfileData), PROT_READ | PROT_WRITE,
- MAP_SHARED, ashmemfd, 0));
- if (newData == MAP_FAILED) {
- int err = errno;
- ALOGW("Failed to move profile data to ashmem fd %d, error = %d",
- ashmemfd, err);
- return;
- }
-
- // The new buffer may have historical data that we want to build on top of
- // But let's make sure we don't overflow Just In Case
- uint32_t divider = 0;
- if (newData->totalFrameCount > (1 << 24)) {
- divider = 4;
- }
- for (size_t i = 0; i < mData->jankTypeCounts.size(); i++) {
- newData->jankTypeCounts[i] >>= divider;
- newData->jankTypeCounts[i] += mData->jankTypeCounts[i];
- }
- for (size_t i = 0; i < mData->frameCounts.size(); i++) {
- newData->frameCounts[i] >>= divider;
- newData->frameCounts[i] += mData->frameCounts[i];
- }
- newData->jankFrameCount >>= divider;
- newData->jankFrameCount += mData->jankFrameCount;
- newData->totalFrameCount >>= divider;
- newData->totalFrameCount += mData->totalFrameCount;
- if (newData->statStartTime > mData->statStartTime
- || newData->statStartTime == 0) {
- newData->statStartTime = mData->statStartTime;
- }
-
- freeData();
- mData = newData;
- mIsMapped = true;
-}
-
void JankTracker::setFrameInterval(nsecs_t frameInterval) {
mFrameInterval = frameInterval;
mThresholds[kMissedVsync] = 1;
@@ -250,8 +109,7 @@
}
-void JankTracker::addFrame(const FrameInfo& frame) {
- mData->totalFrameCount++;
+void JankTracker::finishFrame(const FrameInfo& frame) {
// Fast-path for jank-free frames
int64_t totalDuration = frame.duration(sFrameStart, FrameInfoIndex::FrameCompleted);
if (mDequeueTimeForgiveness
@@ -271,11 +129,11 @@
}
}
LOG_ALWAYS_FATAL_IF(totalDuration <= 0, "Impossible totalDuration %" PRId64, totalDuration);
- uint32_t framebucket = frameCountIndexForFrameTime(totalDuration);
- LOG_ALWAYS_FATAL_IF(framebucket < 0, "framebucket < 0 (%u)", framebucket);
+ mData->reportFrame(totalDuration);
+ (*mGlobalData)->reportFrame(totalDuration);
+
// Keep the fast path as fast as possible.
if (CC_LIKELY(totalDuration < mFrameInterval)) {
- mData->frameCounts[framebucket]++;
return;
}
@@ -284,22 +142,14 @@
return;
}
- if (framebucket <= mData->frameCounts.size()) {
- mData->frameCounts[framebucket]++;
- } else {
- framebucket = (ns2ms(totalDuration) - kSlowFrameBucketStartMs)
- / kSlowFrameBucketIntervalMs;
- framebucket = std::min(framebucket,
- static_cast<uint32_t>(mData->slowFrameCounts.size() - 1));
- mData->slowFrameCounts[framebucket]++;
- }
-
- mData->jankFrameCount++;
+ mData->reportJank();
+ (*mGlobalData)->reportJank();
for (int i = 0; i < NUM_BUCKETS; i++) {
int64_t delta = frame.duration(COMPARISONS[i].start, COMPARISONS[i].end);
if (delta >= mThresholds[i] && delta < IGNORE_EXCEEDING) {
- mData->jankTypeCounts[i]++;
+ mData->reportJankType((JankType) i);
+ (*mGlobalData)->reportJankType((JankType) i);
}
}
}
@@ -320,58 +170,39 @@
if (sFrameStart != FrameInfoIndex::IntendedVsync) {
dprintf(fd, "\nNote: Data has been filtered!");
}
- dprintf(fd, "\nStats since: %" PRIu64 "ns", data->statStartTime);
- dprintf(fd, "\nTotal frames rendered: %u", data->totalFrameCount);
- dprintf(fd, "\nJanky frames: %u (%.2f%%)", data->jankFrameCount,
- (float) data->jankFrameCount / (float) data->totalFrameCount * 100.0f);
- dprintf(fd, "\n50th percentile: %ums", findPercentile(data, 50));
- dprintf(fd, "\n90th percentile: %ums", findPercentile(data, 90));
- dprintf(fd, "\n95th percentile: %ums", findPercentile(data, 95));
- dprintf(fd, "\n99th percentile: %ums", findPercentile(data, 99));
- for (int i = 0; i < NUM_BUCKETS; i++) {
- dprintf(fd, "\nNumber %s: %u", JANK_TYPE_NAMES[i], data->jankTypeCounts[i]);
- }
- dprintf(fd, "\nHISTOGRAM:");
- for (size_t i = 0; i < data->frameCounts.size(); i++) {
- dprintf(fd, " %ums=%u", frameTimeForFrameCountIndex(i),
- data->frameCounts[i]);
- }
- for (size_t i = 0; i < data->slowFrameCounts.size(); i++) {
- dprintf(fd, " %ums=%u", frameTimeForSlowFrameCountIndex(i),
- data->slowFrameCounts[i]);
- }
+ data->dump(fd);
dprintf(fd, "\n");
}
+void JankTracker::dumpFrames(int fd) {
+ FILE* file = fdopen(fd, "a");
+ fprintf(file, "\n\n---PROFILEDATA---\n");
+ for (size_t i = 0; i < static_cast<size_t>(FrameInfoIndex::NumIndexes); i++) {
+ fprintf(file, "%s", FrameInfoNames[i].c_str());
+ fprintf(file, ",");
+ }
+ for (size_t i = 0; i < mFrames.size(); i++) {
+ FrameInfo& frame = mFrames[i];
+ if (frame[FrameInfoIndex::SyncStart] == 0) {
+ continue;
+ }
+ fprintf(file, "\n");
+ for (int i = 0; i < static_cast<int>(FrameInfoIndex::NumIndexes); i++) {
+ fprintf(file, "%" PRId64 ",", frame[i]);
+ }
+ }
+ fprintf(file, "\n---PROFILEDATA---\n\n");
+ fflush(file);
+}
+
void JankTracker::reset() {
- mData->jankTypeCounts.fill(0);
- mData->frameCounts.fill(0);
- mData->slowFrameCounts.fill(0);
- mData->totalFrameCount = 0;
- mData->jankFrameCount = 0;
- mData->statStartTime = systemTime(CLOCK_MONOTONIC);
+ mFrames.clear();
+ mData->reset();
+ (*mGlobalData)->reset();
sFrameStart = Properties::filterOutTestOverhead
? FrameInfoIndex::HandleInputStart
: FrameInfoIndex::IntendedVsync;
}
-uint32_t JankTracker::findPercentile(const ProfileData* data, int percentile) {
- int pos = percentile * data->totalFrameCount / 100;
- int remaining = data->totalFrameCount - pos;
- for (int i = data->slowFrameCounts.size() - 1; i >= 0; i--) {
- remaining -= data->slowFrameCounts[i];
- if (remaining <= 0) {
- return (i * kSlowFrameBucketIntervalMs) + kSlowFrameBucketStartMs;
- }
- }
- for (int i = data->frameCounts.size() - 1; i >= 0; i--) {
- remaining -= data->frameCounts[i];
- if (remaining <= 0) {
- return frameTimeForFrameCountIndex(i);
- }
- }
- return 0;
-}
-
} /* namespace uirenderer */
} /* namespace android */
diff --git a/libs/hwui/JankTracker.h b/libs/hwui/JankTracker.h
index 6ff5d89..e56c079 100644
--- a/libs/hwui/JankTracker.h
+++ b/libs/hwui/JankTracker.h
@@ -17,6 +17,8 @@
#define JANKTRACKER_H_
#include "FrameInfo.h"
+#include "ProfileData.h"
+#include "ProfileDataContainer.h"
#include "renderthread/TimeLord.h"
#include "utils/RingBuffer.h"
@@ -29,31 +31,6 @@
namespace android {
namespace uirenderer {
-enum JankType {
- kMissedVsync = 0,
- kHighInputLatency,
- kSlowUI,
- kSlowSync,
- kSlowRT,
-
- // must be last
- NUM_BUCKETS,
-};
-
-// Try to keep as small as possible, should match ASHMEM_SIZE in
-// GraphicsStatsService.java
-struct ProfileData {
- std::array<uint32_t, NUM_BUCKETS> jankTypeCounts;
- // See comments on kBucket* constants for what this holds
- std::array<uint32_t, 57> frameCounts;
- // Holds a histogram of frame times in 50ms increments from 150ms to 5s
- std::array<uint16_t, 97> slowFrameCounts;
-
- uint32_t totalFrameCount;
- uint32_t jankFrameCount;
- nsecs_t statStartTime;
-};
-
enum class JankTrackerType {
// The default, means there's no description set
Generic,
@@ -72,31 +49,27 @@
// TODO: Replace DrawProfiler with this
class JankTracker {
public:
- explicit JankTracker(const DisplayInfo& displayInfo);
- ~JankTracker();
+ explicit JankTracker(ProfileDataContainer* globalData, const DisplayInfo& displayInfo);
void setDescription(JankTrackerType type, const std::string&& name) {
mDescription.type = type;
mDescription.name = name;
}
- void addFrame(const FrameInfo& frame);
+ FrameInfo* startFrame() { return &mFrames.next(); }
+ void finishFrame(const FrameInfo& frame);
- void dump(int fd) { dumpData(fd, &mDescription, mData); }
+ void dumpStats(int fd) { dumpData(fd, &mDescription, mData.get()); }
+ void dumpFrames(int fd);
void reset();
- void rotateStorage();
- void switchStorageToAshmem(int ashmemfd);
-
- uint32_t findPercentile(int p) { return findPercentile(mData, p); }
- static int32_t frameTimeForFrameCountIndex(uint32_t index);
- static int32_t frameTimeForSlowFrameCountIndex(uint32_t index);
+ // Exposed for FrameInfoVisualizer
+ // TODO: Figure out a better way to handle this
+ RingBuffer<FrameInfo, 120>& frames() { return mFrames; }
private:
- void freeData();
void setFrameInterval(nsecs_t frameIntervalNanos);
- static uint32_t findPercentile(const ProfileData* data, int p);
static void dumpData(int fd, const ProfileDataDescription* description, const ProfileData* data);
std::array<int64_t, NUM_BUCKETS> mThresholds;
@@ -109,9 +82,12 @@
// This is only used if we are in pipelined mode and are using HWC2,
// otherwise it's 0.
nsecs_t mDequeueTimeForgiveness = 0;
- ProfileData* mData;
- bool mIsMapped = false;
+ ProfileDataContainer mData;
+ ProfileDataContainer* mGlobalData;
ProfileDataDescription mDescription;
+
+ // Ring buffer large enough for 2 seconds worth of frames
+ RingBuffer<FrameInfo, 120> mFrames;
};
} /* namespace uirenderer */
diff --git a/libs/hwui/OpenGLReadback.cpp b/libs/hwui/OpenGLReadback.cpp
index 19d5d9d..025503b 100644
--- a/libs/hwui/OpenGLReadback.cpp
+++ b/libs/hwui/OpenGLReadback.cpp
@@ -85,11 +85,6 @@
uint32_t width = graphicBuffer->getWidth();
uint32_t height = graphicBuffer->getHeight();
- // If this is a 90 or 270 degree rotation we need to swap width/height
- // This is a fuzzy way of checking that.
- if (texTransform[Matrix4::kSkewX] >= 0.5f || texTransform[Matrix4::kSkewX] <= -0.5f) {
- std::swap(width, height);
- }
CopyResult copyResult = copyImageInto(sourceImage, texTransform, width, height,
srcRect, bitmap);
@@ -238,6 +233,7 @@
// TODO: We should convert to linear space when the target is RGBA16F
glReadPixels(0, 0, bitmap->width(), bitmap->height(), format,
type, bitmap->getPixels());
+ bitmap->notifyPixelsChanged();
}
// Cleanup
@@ -253,6 +249,12 @@
const Matrix4& imgTransform, int imgWidth, int imgHeight, const Rect& srcRect,
SkBitmap* bitmap) {
+ // If this is a 90 or 270 degree rotation we need to swap width/height
+ // This is a fuzzy way of checking that.
+ if (imgTransform[Matrix4::kSkewX] >= 0.5f || imgTransform[Matrix4::kSkewX] <= -0.5f) {
+ std::swap(imgWidth, imgHeight);
+ }
+
Caches& caches = Caches::getInstance();
GLuint sourceTexId;
// Create a 2D texture to sample from the EGLImage
diff --git a/libs/hwui/ProfileData.cpp b/libs/hwui/ProfileData.cpp
new file mode 100644
index 0000000..a295c5d
--- /dev/null
+++ b/libs/hwui/ProfileData.cpp
@@ -0,0 +1,177 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#include "ProfileData.h"
+
+#include <cinttypes>
+
+namespace android {
+namespace uirenderer {
+
+static const char* JANK_TYPE_NAMES[] = {
+ "Missed Vsync",
+ "High input latency",
+ "Slow UI thread",
+ "Slow bitmap uploads",
+ "Slow issue draw commands",
+};
+
+// The bucketing algorithm controls so to speak
+// If a frame is <= to this it goes in bucket 0
+static const uint32_t kBucketMinThreshold = 5;
+// If a frame is > this, start counting in increments of 2ms
+static const uint32_t kBucket2msIntervals = 32;
+// If a frame is > this, start counting in increments of 4ms
+static const uint32_t kBucket4msIntervals = 48;
+
+// The interval of the slow frame histogram
+static const uint32_t kSlowFrameBucketIntervalMs = 50;
+// The start point of the slow frame bucket in ms
+static const uint32_t kSlowFrameBucketStartMs = 150;
+
+// This will be called every frame, performance sensitive
+// Uses bit twiddling to avoid branching while achieving the packing desired
+static uint32_t frameCountIndexForFrameTime(nsecs_t frameTime) {
+ uint32_t index = static_cast<uint32_t>(ns2ms(frameTime));
+ // If index > kBucketMinThreshold mask will be 0xFFFFFFFF as a result
+ // of negating 1 (twos compliment, yaay) else mask will be 0
+ uint32_t mask = -(index > kBucketMinThreshold);
+ // If index > threshold, this will essentially perform:
+ // amountAboveThreshold = index - threshold;
+ // index = threshold + (amountAboveThreshold / 2)
+ // However if index is <= this will do nothing. It will underflow, do
+ // a right shift by 0 (no-op), then overflow back to the original value
+ index = ((index - kBucket4msIntervals) >> (index > kBucket4msIntervals))
+ + kBucket4msIntervals;
+ index = ((index - kBucket2msIntervals) >> (index > kBucket2msIntervals))
+ + kBucket2msIntervals;
+ // If index was < minThreshold at the start of all this it's going to
+ // be a pretty garbage value right now. However, mask is 0 so we'll end
+ // up with the desired result of 0.
+ index = (index - kBucketMinThreshold) & mask;
+ return index;
+}
+
+// Only called when dumping stats, less performance sensitive
+uint32_t ProfileData::frameTimeForFrameCountIndex(uint32_t index) {
+ index = index + kBucketMinThreshold;
+ if (index > kBucket2msIntervals) {
+ index += (index - kBucket2msIntervals);
+ }
+ if (index > kBucket4msIntervals) {
+ // This works because it was already doubled by the above if
+ // 1 is added to shift slightly more towards the middle of the bucket
+ index += (index - kBucket4msIntervals) + 1;
+ }
+ return index;
+}
+
+uint32_t ProfileData::frameTimeForSlowFrameCountIndex(uint32_t index) {
+ return (index * kSlowFrameBucketIntervalMs) + kSlowFrameBucketStartMs;
+}
+
+void ProfileData::mergeWith(const ProfileData& other) {
+ // Make sure we don't overflow Just In Case
+ uint32_t divider = 0;
+ if (mTotalFrameCount > (1 << 24)) {
+ divider = 4;
+ }
+ for (size_t i = 0; i < other.mJankTypeCounts.size(); i++) {
+ mJankTypeCounts[i] >>= divider;
+ mJankTypeCounts[i] += other.mJankTypeCounts[i];
+ }
+ for (size_t i = 0; i < other.mFrameCounts.size(); i++) {
+ mFrameCounts[i] >>= divider;
+ mFrameCounts[i] += other.mFrameCounts[i];
+ }
+ mJankFrameCount >>= divider;
+ mJankFrameCount += other.mJankFrameCount;
+ mTotalFrameCount >>= divider;
+ mTotalFrameCount += other.mTotalFrameCount;
+ if (mStatStartTime > other.mStatStartTime
+ || mStatStartTime == 0) {
+ mStatStartTime = other.mStatStartTime;
+ }
+}
+
+void ProfileData::dump(int fd) const {
+ dprintf(fd, "\nStats since: %" PRIu64 "ns", mStatStartTime);
+ dprintf(fd, "\nTotal frames rendered: %u", mTotalFrameCount);
+ dprintf(fd, "\nJanky frames: %u (%.2f%%)", mJankFrameCount,
+ (float) mJankFrameCount / (float) mTotalFrameCount * 100.0f);
+ dprintf(fd, "\n50th percentile: %ums", findPercentile(50));
+ dprintf(fd, "\n90th percentile: %ums", findPercentile(90));
+ dprintf(fd, "\n95th percentile: %ums", findPercentile(95));
+ dprintf(fd, "\n99th percentile: %ums", findPercentile(99));
+ for (int i = 0; i < NUM_BUCKETS; i++) {
+ dprintf(fd, "\nNumber %s: %u", JANK_TYPE_NAMES[i], mJankTypeCounts[i]);
+ }
+ dprintf(fd, "\nHISTOGRAM:");
+ histogramForEach([fd](HistogramEntry entry) {
+ dprintf(fd, " %ums=%u", entry.renderTimeMs, entry.frameCount);
+ });
+}
+
+uint32_t ProfileData::findPercentile(int percentile) const {
+ int pos = percentile * mTotalFrameCount / 100;
+ int remaining = mTotalFrameCount - pos;
+ for (int i = mSlowFrameCounts.size() - 1; i >= 0; i--) {
+ remaining -= mSlowFrameCounts[i];
+ if (remaining <= 0) {
+ return (i * kSlowFrameBucketIntervalMs) + kSlowFrameBucketStartMs;
+ }
+ }
+ for (int i = mFrameCounts.size() - 1; i >= 0; i--) {
+ remaining -= mFrameCounts[i];
+ if (remaining <= 0) {
+ return frameTimeForFrameCountIndex(i);
+ }
+ }
+ return 0;
+}
+
+void ProfileData::reset() {
+ mJankTypeCounts.fill(0);
+ mFrameCounts.fill(0);
+ mSlowFrameCounts.fill(0);
+ mTotalFrameCount = 0;
+ mJankFrameCount = 0;
+ mStatStartTime = systemTime(CLOCK_MONOTONIC);
+}
+
+void ProfileData::reportFrame(int64_t duration) {
+ mTotalFrameCount++;
+ uint32_t framebucket = frameCountIndexForFrameTime(duration);
+ if (framebucket <= mFrameCounts.size()) {
+ mFrameCounts[framebucket]++;
+ } else {
+ framebucket = (ns2ms(duration) - kSlowFrameBucketStartMs) / kSlowFrameBucketIntervalMs;
+ framebucket = std::min(framebucket, static_cast<uint32_t>(mSlowFrameCounts.size() - 1));
+ mSlowFrameCounts[framebucket]++;
+ }
+}
+
+void ProfileData::histogramForEach(const std::function<void(HistogramEntry)>& callback) const {
+ for (size_t i = 0; i < mFrameCounts.size(); i++) {
+ callback(HistogramEntry{frameTimeForFrameCountIndex(i), mFrameCounts[i]});
+ }
+ for (size_t i = 0; i < mSlowFrameCounts.size(); i++) {
+ callback(HistogramEntry{frameTimeForSlowFrameCountIndex(i), mSlowFrameCounts[i]});
+ }
+}
+
+} /* namespace uirenderer */
+} /* namespace android */
\ No newline at end of file
diff --git a/libs/hwui/ProfileData.h b/libs/hwui/ProfileData.h
new file mode 100644
index 0000000..d53ee29
--- /dev/null
+++ b/libs/hwui/ProfileData.h
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#pragma once
+
+#include "utils/Macros.h"
+
+#include <utils/Timers.h>
+
+#include <array>
+#include <functional>
+#include <tuple>
+
+namespace android {
+namespace uirenderer {
+
+enum JankType {
+ kMissedVsync = 0,
+ kHighInputLatency,
+ kSlowUI,
+ kSlowSync,
+ kSlowRT,
+
+ // must be last
+ NUM_BUCKETS,
+};
+
+// For testing
+class MockProfileData;
+
+// Try to keep as small as possible, should match ASHMEM_SIZE in
+// GraphicsStatsService.java
+class ProfileData {
+ PREVENT_COPY_AND_ASSIGN(ProfileData);
+
+public:
+ ProfileData() { reset(); }
+
+ void reset();
+ void mergeWith(const ProfileData& other);
+ void dump(int fd) const;
+ uint32_t findPercentile(int percentile) const;
+
+ void reportFrame(int64_t duration);
+ void reportJank() { mJankFrameCount++; }
+ void reportJankType(JankType type) { mJankTypeCounts[static_cast<int>(type)]++; }
+
+ uint32_t totalFrameCount() const { return mTotalFrameCount; }
+ uint32_t jankFrameCount() const { return mJankFrameCount; }
+ nsecs_t statsStartTime() const { return mStatStartTime; }
+ uint32_t jankTypeCount(JankType type) const { return mJankTypeCounts[static_cast<int>(type)]; }
+
+ struct HistogramEntry {
+ uint32_t renderTimeMs;
+ uint32_t frameCount;
+ };
+ void histogramForEach(const std::function<void(HistogramEntry)>& callback) const;
+
+ constexpr static int HistogramSize() {
+ return std::tuple_size<decltype(ProfileData::mFrameCounts)>::value
+ + std::tuple_size<decltype(ProfileData::mSlowFrameCounts)>::value;
+ }
+
+ // Visible for testing
+ static uint32_t frameTimeForFrameCountIndex(uint32_t index);
+ static uint32_t frameTimeForSlowFrameCountIndex(uint32_t index);
+
+private:
+ // Open our guts up to unit tests
+ friend class MockProfileData;
+
+ std::array <uint32_t, NUM_BUCKETS> mJankTypeCounts;
+ // See comments on kBucket* constants for what this holds
+ std::array<uint32_t, 57> mFrameCounts;
+ // Holds a histogram of frame times in 50ms increments from 150ms to 5s
+ std::array<uint16_t, 97> mSlowFrameCounts;
+
+ uint32_t mTotalFrameCount;
+ uint32_t mJankFrameCount;
+ nsecs_t mStatStartTime;
+};
+
+// For testing
+class MockProfileData : public ProfileData {
+public:
+ std::array<uint32_t, NUM_BUCKETS>& editJankTypeCounts() { return mJankTypeCounts; }
+ std::array<uint32_t, 57>& editFrameCounts() { return mFrameCounts; }
+ std::array<uint16_t, 97>& editSlowFrameCounts() { return mSlowFrameCounts; }
+ uint32_t& editTotalFrameCount() { return mTotalFrameCount; }
+ uint32_t& editJankFrameCount() { return mJankFrameCount; }
+ nsecs_t& editStatStartTime() { return mStatStartTime; }
+};
+
+} /* namespace uirenderer */
+} /* namespace android */
+
diff --git a/libs/hwui/ProfileDataContainer.cpp b/libs/hwui/ProfileDataContainer.cpp
new file mode 100644
index 0000000..cbf3eb3
--- /dev/null
+++ b/libs/hwui/ProfileDataContainer.cpp
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#include "ProfileDataContainer.h"
+
+#include <log/log.h>
+#include <cutils/ashmem.h>
+
+#include <sys/mman.h>
+
+namespace android {
+namespace uirenderer {
+
+void ProfileDataContainer::freeData() {
+ if (mIsMapped) {
+ munmap(mData, sizeof(ProfileData));
+ } else {
+ delete mData;
+ }
+ mIsMapped = false;
+ mData = nullptr;
+}
+
+void ProfileDataContainer::rotateStorage() {
+ // If we are mapped we want to stop using the ashmem backend and switch to malloc
+ // We are expecting a switchStorageToAshmem call to follow this, but it's not guaranteed
+ // If we aren't sitting on top of ashmem then just do a reset() as it's functionally
+ // equivalent do a free, malloc, reset.
+ if (mIsMapped) {
+ freeData();
+ mData = new ProfileData;
+ }
+ mData->reset();
+}
+
+void ProfileDataContainer::switchStorageToAshmem(int ashmemfd) {
+ int regionSize = ashmem_get_size_region(ashmemfd);
+ if (regionSize < 0) {
+ int err = errno;
+ ALOGW("Failed to get ashmem region size from fd %d, err %d %s", ashmemfd, err, strerror(err));
+ return;
+ }
+ if (regionSize < static_cast<int>(sizeof(ProfileData))) {
+ ALOGW("Ashmem region is too small! Received %d, required %u",
+ regionSize, static_cast<unsigned int>(sizeof(ProfileData)));
+ return;
+ }
+ ProfileData* newData = reinterpret_cast<ProfileData*>(
+ mmap(NULL, sizeof(ProfileData), PROT_READ | PROT_WRITE,
+ MAP_SHARED, ashmemfd, 0));
+ if (newData == MAP_FAILED) {
+ int err = errno;
+ ALOGW("Failed to move profile data to ashmem fd %d, error = %d",
+ ashmemfd, err);
+ return;
+ }
+
+ newData->mergeWith(*mData);
+ freeData();
+ mData = newData;
+ mIsMapped = true;
+}
+
+} /* namespace uirenderer */
+} /* namespace android */
\ No newline at end of file
diff --git a/libs/hwui/ProfileDataContainer.h b/libs/hwui/ProfileDataContainer.h
new file mode 100644
index 0000000..d2de241
--- /dev/null
+++ b/libs/hwui/ProfileDataContainer.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#pragma once
+
+#include "ProfileData.h"
+#include "utils/Macros.h"
+
+namespace android {
+namespace uirenderer {
+
+class ProfileDataContainer {
+ PREVENT_COPY_AND_ASSIGN(ProfileDataContainer);
+public:
+ explicit ProfileDataContainer() {}
+
+ ~ProfileDataContainer() { freeData(); }
+
+ void rotateStorage();
+ void switchStorageToAshmem(int ashmemfd);
+
+ ProfileData* get() { return mData; }
+ ProfileData* operator->() { return mData; }
+
+private:
+ void freeData();
+
+ // By default this will use malloc memory. It may be moved later to ashmem
+ // if there is shared space for it and a request comes in to do that.
+ ProfileData* mData = new ProfileData;
+ bool mIsMapped = false;
+};
+
+} /* namespace uirenderer */
+} /* namespace android */
\ No newline at end of file
diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp
index 623b496..0a642b6 100644
--- a/libs/hwui/SkiaCanvas.cpp
+++ b/libs/hwui/SkiaCanvas.cpp
@@ -530,33 +530,25 @@
// ----------------------------------------------------------------------------
void SkiaCanvas::drawBitmap(Bitmap& bitmap, float left, float top, const SkPaint* paint) {
- SkBitmap skBitmap;
- bitmap.getSkBitmap(&skBitmap);
- mCanvas->drawBitmap(skBitmap, left, top, paint);
+ mCanvas->drawImage(bitmap.makeImage(), left, top, paint);
}
void SkiaCanvas::drawBitmap(Bitmap& hwuiBitmap, const SkMatrix& matrix, const SkPaint* paint) {
- SkBitmap bitmap;
- hwuiBitmap.getSkBitmap(&bitmap);
SkAutoCanvasRestore acr(mCanvas, true);
mCanvas->concat(matrix);
- mCanvas->drawBitmap(bitmap, 0, 0, paint);
+ mCanvas->drawImage(hwuiBitmap.makeImage(), 0, 0, paint);
}
void SkiaCanvas::drawBitmap(Bitmap& hwuiBitmap, float srcLeft, float srcTop,
float srcRight, float srcBottom, float dstLeft, float dstTop,
float dstRight, float dstBottom, const SkPaint* paint) {
- SkBitmap bitmap;
- hwuiBitmap.getSkBitmap(&bitmap);
SkRect srcRect = SkRect::MakeLTRB(srcLeft, srcTop, srcRight, srcBottom);
SkRect dstRect = SkRect::MakeLTRB(dstLeft, dstTop, dstRight, dstBottom);
- mCanvas->drawBitmapRect(bitmap, srcRect, dstRect, paint);
+ mCanvas->drawImageRect(hwuiBitmap.makeImage(), srcRect, dstRect, paint);
}
void SkiaCanvas::drawBitmapMesh(Bitmap& hwuiBitmap, int meshWidth, int meshHeight,
const float* vertices, const int* colors, const SkPaint* paint) {
- SkBitmap bitmap;
- hwuiBitmap.getSkBitmap(&bitmap);
const int ptCount = (meshWidth + 1) * (meshHeight + 1);
const int indexCount = meshWidth * meshHeight * 6;
uint32_t flags = SkVertices::kHasTexCoords_BuilderFlag;
@@ -573,8 +565,8 @@
// cons up texture coordinates and indices
{
- const SkScalar w = SkIntToScalar(bitmap.width());
- const SkScalar h = SkIntToScalar(bitmap.height());
+ const SkScalar w = SkIntToScalar(hwuiBitmap.width());
+ const SkScalar h = SkIntToScalar(hwuiBitmap.height());
const SkScalar dx = w / meshWidth;
const SkScalar dy = h / meshHeight;
@@ -635,7 +627,7 @@
tmpPaint = *paint;
}
- sk_sp<SkImage> image = SkMakeImageFromRasterBitmap(bitmap, kNever_SkCopyPixelsMode);
+ sk_sp<SkImage> image = hwuiBitmap.makeImage();
tmpPaint.setShader(image->makeShader(SkShader::kClamp_TileMode, SkShader::kClamp_TileMode));
mCanvas->drawVertices(builder.detach(), SkBlendMode::kModulate, tmpPaint);
@@ -644,11 +636,8 @@
void SkiaCanvas::drawNinePatch(Bitmap& hwuiBitmap, const Res_png_9patch& chunk,
float dstLeft, float dstTop, float dstRight, float dstBottom, const SkPaint* paint) {
- SkBitmap bitmap;
- hwuiBitmap.getSkBitmap(&bitmap);
-
SkCanvas::Lattice lattice;
- NinePatchUtils::SetLatticeDivs(&lattice, chunk, bitmap.width(), bitmap.height());
+ NinePatchUtils::SetLatticeDivs(&lattice, chunk, hwuiBitmap.width(), hwuiBitmap.height());
lattice.fFlags = nullptr;
int numFlags = 0;
@@ -665,7 +654,7 @@
lattice.fBounds = nullptr;
SkRect dst = SkRect::MakeLTRB(dstLeft, dstTop, dstRight, dstBottom);
- mCanvas->drawBitmapLattice(bitmap, lattice, dst, paint);
+ mCanvas->drawImageLattice(hwuiBitmap.makeImage().get(), lattice, dst, paint);
}
void SkiaCanvas::drawVectorDrawable(VectorDrawableRoot* vectorDrawable) {
diff --git a/libs/hwui/SkiaCanvasProxy.cpp b/libs/hwui/SkiaCanvasProxy.cpp
index 34dddd1..16a19ca 100644
--- a/libs/hwui/SkiaCanvasProxy.cpp
+++ b/libs/hwui/SkiaCanvasProxy.cpp
@@ -151,7 +151,8 @@
void SkiaCanvasProxy::onDrawImage(const SkImage* image, SkScalar left, SkScalar top,
const SkPaint* paint) {
SkBitmap skiaBitmap;
- if (image->asLegacyBitmap(&skiaBitmap, SkImage::kRO_LegacyBitmapMode)) {
+ SkPixmap pixmap;
+ if (image->peekPixels(&pixmap) && skiaBitmap.installPixels(pixmap)) {
onDrawBitmap(skiaBitmap, left, top, paint);
}
}
@@ -159,7 +160,8 @@
void SkiaCanvasProxy::onDrawImageRect(const SkImage* image, const SkRect* srcPtr, const SkRect& dst,
const SkPaint* paint, SrcRectConstraint constraint) {
SkBitmap skiaBitmap;
- if (image->asLegacyBitmap(&skiaBitmap, SkImage::kRO_LegacyBitmapMode)) {
+ SkPixmap pixmap;
+ if (image->peekPixels(&pixmap) && skiaBitmap.installPixels(pixmap)) {
sk_sp<Bitmap> bitmap = Bitmap::createFrom(skiaBitmap.info(), *skiaBitmap.pixelRef());
SkRect src = (srcPtr) ? *srcPtr : SkRect::MakeWH(image->width(), image->height());
mCanvas->drawBitmap(*bitmap, src.fLeft, src.fTop, src.fRight, src.fBottom,
diff --git a/libs/hwui/Texture.cpp b/libs/hwui/Texture.cpp
index 4ef31d5..b7c1e29 100644
--- a/libs/hwui/Texture.cpp
+++ b/libs/hwui/Texture.cpp
@@ -217,9 +217,8 @@
*outType = GL_UNSIGNED_SHORT_5_6_5;
}
break;
- // ARGB_4444 and Index_8 are both upconverted to RGBA_8888
+ // ARGB_4444 is upconverted to RGBA_8888
case kARGB_4444_SkColorType:
- case kIndex_8_SkColorType:
case kN32_SkColorType:
*outFormat = GL_RGBA;
*outInternalFormat = caches.rgbaInternalFormat(needSRGB);
@@ -270,7 +269,6 @@
bool Texture::hasUnsupportedColorType(const SkImageInfo& info, bool hasLinearBlending) {
return info.colorType() == kARGB_4444_SkColorType
- || info.colorType() == kIndex_8_SkColorType
|| (info.colorType() == kRGB_565_SkColorType
&& hasLinearBlending
&& info.colorSpace()->isSRGB())
@@ -279,11 +277,6 @@
}
void Texture::upload(Bitmap& bitmap) {
- if (!bitmap.readyToDraw()) {
- ALOGE("Cannot generate texture from bitmap");
- return;
- }
-
ATRACE_FORMAT("Upload %ux%u Texture", bitmap.width(), bitmap.height());
// We could also enable mipmapping if both bitmap dimensions are powers
diff --git a/libs/hwui/VectorDrawable.cpp b/libs/hwui/VectorDrawable.cpp
index f6b2912..8a1de02 100644
--- a/libs/hwui/VectorDrawable.cpp
+++ b/libs/hwui/VectorDrawable.cpp
@@ -491,34 +491,103 @@
return *mCache.bitmap;
}
-void Tree::updateCache(sk_sp<SkSurface> surface) {
- if (surface.get()) {
- mCache.surface = surface;
+void Tree::updateCache(sp<skiapipeline::VectorDrawableAtlas>& atlas, GrContext* context) {
+ SkRect dst;
+ sk_sp<SkSurface> surface = mCache.getSurface(&dst);
+ bool canReuseSurface = surface && dst.width() >= mProperties.getScaledWidth()
+ && dst.height() >= mProperties.getScaledHeight();
+ if (!canReuseSurface) {
+ int scaledWidth = SkScalarCeilToInt(mProperties.getScaledWidth());
+ int scaledHeight = SkScalarCeilToInt(mProperties.getScaledHeight());
+ auto atlasEntry = atlas->requestNewEntry(scaledWidth, scaledHeight, context);
+ if (INVALID_ATLAS_KEY != atlasEntry.key) {
+ dst = atlasEntry.rect;
+ surface = atlasEntry.surface;
+ mCache.setAtlas(atlas, atlasEntry.key);
+ } else {
+ //don't draw, if we failed to allocate an offscreen buffer
+ mCache.clear();
+ surface.reset();
+ }
}
- if (surface.get() || mCache.dirty) {
- SkSurface* vdSurface = mCache.surface.get();
- SkCanvas* canvas = vdSurface->getCanvas();
- float scaleX = vdSurface->width() / mProperties.getViewportWidth();
- float scaleY = vdSurface->height() / mProperties.getViewportHeight();
- SkAutoCanvasRestore acr(canvas, true);
- canvas->clear(SK_ColorTRANSPARENT);
- canvas->scale(scaleX, scaleY);
- mRootNode->draw(canvas, false);
+ if (!canReuseSurface || mCache.dirty) {
+ draw(surface.get(), dst);
mCache.dirty = false;
- canvas->flush();
}
}
+void Tree::draw(SkSurface* surface, const SkRect& dst) {
+ if (surface) {
+ SkCanvas* canvas = surface->getCanvas();
+ float scaleX = dst.width() / mProperties.getViewportWidth();
+ float scaleY = dst.height() / mProperties.getViewportHeight();
+ SkAutoCanvasRestore acr(canvas, true);
+ canvas->translate(dst.fLeft, dst.fTop);
+ canvas->clipRect(SkRect::MakeWH(dst.width(), dst.height()));
+ canvas->clear(SK_ColorTRANSPARENT);
+ canvas->scale(scaleX, scaleY);
+ mRootNode->draw(canvas, false);
+ }
+}
+
+void Tree::Cache::setAtlas(sp<skiapipeline::VectorDrawableAtlas> newAtlas,
+ skiapipeline::AtlasKey newAtlasKey) {
+ LOG_ALWAYS_FATAL_IF(newAtlasKey == INVALID_ATLAS_KEY);
+ clear();
+ mAtlas = newAtlas;
+ mAtlasKey = newAtlasKey;
+}
+
+sk_sp<SkSurface> Tree::Cache::getSurface(SkRect* bounds) {
+ sk_sp<SkSurface> surface;
+ sp<skiapipeline::VectorDrawableAtlas> atlas = mAtlas.promote();
+ if (atlas.get() && mAtlasKey != INVALID_ATLAS_KEY) {
+ auto atlasEntry = atlas->getEntry(mAtlasKey);
+ *bounds = atlasEntry.rect;
+ surface = atlasEntry.surface;
+ mAtlasKey = atlasEntry.key;
+ }
+
+ return surface;
+}
+
+void Tree::Cache::clear() {
+ sp<skiapipeline::VectorDrawableAtlas> lockAtlas = mAtlas.promote();
+ if (lockAtlas.get()) {
+ lockAtlas->releaseEntry(mAtlasKey);
+ }
+ mAtlas = nullptr;
+ mAtlasKey = INVALID_ATLAS_KEY;
+}
+
void Tree::draw(SkCanvas* canvas) {
- /*
- * TODO address the following...
- *
- * 1) figure out how to set path's as volatile during animation
- * 2) if mRoot->getPaint() != null either promote to layer (during
- * animation) or cache in SkSurface (for static content)
- */
- canvas->drawImageRect(mCache.surface->makeImageSnapshot().get(),
- mutateProperties()->getBounds(), getPaint());
+ SkRect src;
+ sk_sp<SkSurface> vdSurface = mCache.getSurface(&src);
+ if (vdSurface) {
+ canvas->drawImageRect(vdSurface->makeImageSnapshot().get(), src,
+ mutateProperties()->getBounds(), getPaint());
+ } else {
+ // Handle the case when VectorDrawableAtlas has been destroyed, because of memory pressure.
+ // We render the VD into a temporary standalone buffer and mark the frame as dirty. Next
+ // frame will be cached into the atlas.
+ int scaledWidth = SkScalarCeilToInt(mProperties.getScaledWidth());
+ int scaledHeight = SkScalarCeilToInt(mProperties.getScaledHeight());
+ SkRect src = SkRect::MakeWH(scaledWidth, scaledHeight);
+#ifndef ANDROID_ENABLE_LINEAR_BLENDING
+ sk_sp<SkColorSpace> colorSpace = nullptr;
+#else
+ sk_sp<SkColorSpace> colorSpace = SkColorSpace::MakeSRGB();
+#endif
+ SkImageInfo info = SkImageInfo::MakeN32(scaledWidth, scaledHeight, kPremul_SkAlphaType,
+ colorSpace);
+ sk_sp<SkSurface> surface = SkSurface::MakeRenderTarget(canvas->getGrContext(),
+ SkBudgeted::kYes, info);
+ draw(surface.get(), src);
+ mCache.clear();
+ canvas->drawImageRect(surface->makeImageSnapshot().get(), mutateProperties()->getBounds(),
+ getPaint());
+ markDirty();
+ }
}
void Tree::updateBitmapCache(Bitmap& bitmap, bool useStagingData) {
diff --git a/libs/hwui/VectorDrawable.h b/libs/hwui/VectorDrawable.h
index 22cfe29..efbb695 100644
--- a/libs/hwui/VectorDrawable.h
+++ b/libs/hwui/VectorDrawable.h
@@ -19,6 +19,7 @@
#include "hwui/Canvas.h"
#include "hwui/Bitmap.h"
+#include "renderthread/CacheManager.h"
#include "DisplayList.h"
#include <SkBitmap.h>
@@ -687,35 +688,61 @@
bool getPropertyChangeWillBeConsumed() const { return mWillBeConsumed; }
void setPropertyChangeWillBeConsumed(bool willBeConsumed) { mWillBeConsumed = willBeConsumed; }
- // Returns true if VD cache surface is big enough. This should always be called from RT and it
- // works with Skia pipelines only.
- bool canReuseSurface() {
- SkSurface* surface = mCache.surface.get();
- return surface && surface->width() >= mProperties.getScaledWidth()
- && surface->height() >= mProperties.getScaledHeight();
- }
-
- // Draws VD cache into a canvas. This should always be called from RT and it works with Skia
- // pipelines only.
+ /**
+ * Draws VD cache into a canvas. This should always be called from RT and it works with Skia
+ * pipelines only.
+ */
void draw(SkCanvas* canvas);
- // Draws VD into a GPU backed surface. If canReuseSurface returns false, then "surface" must
- // contain a new surface. This should always be called from RT and it works with Skia pipelines
- // only.
- void updateCache(sk_sp<SkSurface> surface);
+ /**
+ * Draws VD into a GPU backed surface.
+ * This should always be called from RT and it works with Skia pipeline only.
+ */
+ void updateCache(sp<skiapipeline::VectorDrawableAtlas>& atlas, GrContext* context);
private:
- struct Cache {
+ class Cache {
+ public:
sk_sp<Bitmap> bitmap; //used by HWUI pipeline and software
//TODO: use surface instead of bitmap when drawing in software canvas
- sk_sp<SkSurface> surface; //used only by Skia pipelines
bool dirty = true;
+
+ // the rest of the code in Cache is used by Skia pipelines only
+
+ ~Cache() { clear(); }
+
+ /**
+ * Stores a weak pointer to the atlas and a key.
+ */
+ void setAtlas(sp<skiapipeline::VectorDrawableAtlas> atlas,
+ skiapipeline::AtlasKey newAtlasKey);
+
+ /**
+ * Gets a surface and bounds from the atlas.
+ *
+ * @return nullptr if the altas has been deleted.
+ */
+ sk_sp<SkSurface> getSurface(SkRect* bounds);
+
+ /**
+ * Releases atlas key from the atlas, which makes it available for reuse.
+ */
+ void clear();
+ private:
+ wp<skiapipeline::VectorDrawableAtlas> mAtlas;
+ skiapipeline::AtlasKey mAtlasKey = INVALID_ATLAS_KEY;
};
SkPaint* updatePaint(SkPaint* outPaint, TreeProperties* prop);
bool allocateBitmapIfNeeded(Cache& cache, int width, int height);
bool canReuseBitmap(Bitmap*, int width, int height);
void updateBitmapCache(Bitmap& outCache, bool useStagingData);
+
+ /**
+ * Draws the root node into "surface" at a given "dst" position.
+ */
+ void draw(SkSurface* surface, const SkRect& dst);
+
// Cap the bitmap size, such that it won't hurt the performance too much
// and it won't crash due to a very large scale.
// The drawable will look blurry above this size.
diff --git a/libs/hwui/font/CacheTexture.cpp b/libs/hwui/font/CacheTexture.cpp
index e2844ad..73beba9 100644
--- a/libs/hwui/font/CacheTexture.cpp
+++ b/libs/hwui/font/CacheTexture.cpp
@@ -91,6 +91,9 @@
CacheBlock* prevBlock = blockToRemove->mPrev;
if (prevBlock) {
+ // If this doesn't hold, we have a use-after-free below.
+ LOG_ALWAYS_FATAL_IF(head == blockToRemove,
+ "removeBlock: head should not have a previous block");
prevBlock->mNext = nextBlock;
} else {
newHead = nextBlock;
diff --git a/libs/hwui/hwui/Bitmap.cpp b/libs/hwui/hwui/Bitmap.cpp
index 6dde005..75b6d23 100644
--- a/libs/hwui/hwui/Bitmap.cpp
+++ b/libs/hwui/hwui/Bitmap.cpp
@@ -46,10 +46,10 @@
return true;
}
-typedef sk_sp<Bitmap> (*AllocPixeRef)(size_t allocSize, const SkImageInfo& info, size_t rowBytes,
- sk_sp<SkColorTable> ctable);
+typedef sk_sp<Bitmap> (*AllocPixelRef)(size_t allocSize, const SkImageInfo& info,
+ size_t rowBytes);
-static sk_sp<Bitmap> allocateBitmap(SkBitmap* bitmap, sk_sp<SkColorTable> ctable, AllocPixeRef alloc) {
+static sk_sp<Bitmap> allocateBitmap(SkBitmap* bitmap, AllocPixelRef alloc) {
const SkImageInfo& info = bitmap->info();
if (info.colorType() == kUnknown_SkColorType) {
LOG_ALWAYS_FATAL("unknown bitmap configuration");
@@ -65,32 +65,31 @@
return nullptr;
}
- auto wrapper = alloc(size, info, rowBytes, std::move(ctable));
+ auto wrapper = alloc(size, info, rowBytes);
if (wrapper) {
wrapper->getSkBitmap(bitmap);
}
return wrapper;
}
-sk_sp<Bitmap> Bitmap::allocateAshmemBitmap(SkBitmap* bitmap, sk_sp<SkColorTable> ctable) {
- return allocateBitmap(bitmap, std::move(ctable), &Bitmap::allocateAshmemBitmap);
+sk_sp<Bitmap> Bitmap::allocateAshmemBitmap(SkBitmap* bitmap) {
+ return allocateBitmap(bitmap, &Bitmap::allocateAshmemBitmap);
}
-static sk_sp<Bitmap> allocateHeapBitmap(size_t size, const SkImageInfo& info, size_t rowBytes,
- sk_sp<SkColorTable> ctable) {
+static sk_sp<Bitmap> allocateHeapBitmap(size_t size, const SkImageInfo& info, size_t rowBytes) {
void* addr = calloc(size, 1);
if (!addr) {
return nullptr;
}
- return sk_sp<Bitmap>(new Bitmap(addr, size, info, rowBytes, std::move(ctable)));
+ return sk_sp<Bitmap>(new Bitmap(addr, size, info, rowBytes));
}
sk_sp<Bitmap> Bitmap::allocateHardwareBitmap(SkBitmap& bitmap) {
return uirenderer::renderthread::RenderProxy::allocateHardwareBitmap(bitmap);
}
-sk_sp<Bitmap> Bitmap::allocateHeapBitmap(SkBitmap* bitmap, sk_sp<SkColorTable> ctable) {
- return allocateBitmap(bitmap, std::move(ctable), &android::allocateHeapBitmap);
+sk_sp<Bitmap> Bitmap::allocateHeapBitmap(SkBitmap* bitmap) {
+ return allocateBitmap(bitmap, &android::allocateHeapBitmap);
}
sk_sp<Bitmap> Bitmap::allocateHeapBitmap(const SkImageInfo& info) {
@@ -99,11 +98,11 @@
LOG_ALWAYS_FATAL("trying to allocate too large bitmap");
return nullptr;
}
- return android::allocateHeapBitmap(size, info, info.minRowBytes(), nullptr);
+ return android::allocateHeapBitmap(size, info, info.minRowBytes());
}
sk_sp<Bitmap> Bitmap::allocateAshmemBitmap(size_t size, const SkImageInfo& info,
- size_t rowBytes, sk_sp<SkColorTable> ctable) {
+ size_t rowBytes) {
// Create new ashmem region with read/write priv
int fd = ashmem_create_region("bitmap", size);
if (fd < 0) {
@@ -121,7 +120,7 @@
close(fd);
return nullptr;
}
- return sk_sp<Bitmap>(new Bitmap(addr, fd, size, info, rowBytes, std::move(ctable)));
+ return sk_sp<Bitmap>(new Bitmap(addr, fd, size, info, rowBytes));
}
void FreePixelRef(void* addr, void* context) {
@@ -132,7 +131,7 @@
sk_sp<Bitmap> Bitmap::createFrom(const SkImageInfo& info, SkPixelRef& pixelRef) {
pixelRef.ref();
return sk_sp<Bitmap>(new Bitmap((void*) pixelRef.pixels(), (void*) &pixelRef, FreePixelRef,
- info, pixelRef.rowBytes(), sk_ref_sp(pixelRef.colorTable())));
+ info, pixelRef.rowBytes()));
}
sk_sp<Bitmap> Bitmap::createFrom(sp<GraphicBuffer> graphicBuffer) {
@@ -161,11 +160,7 @@
return info.makeAlphaType(alphaType);
}
-void Bitmap::reconfigure(const SkImageInfo& newInfo, size_t rowBytes, sk_sp<SkColorTable> ctable) {
- if (kIndex_8_SkColorType != newInfo.colorType()) {
- ctable = nullptr;
- }
-
+void Bitmap::reconfigure(const SkImageInfo& newInfo, size_t rowBytes) {
mInfo = validateAlpha(newInfo);
// Dirty hack is dirty
@@ -173,20 +168,11 @@
// really hard to work with. Skia really, really wants immutable objects,
// but with the nested-ref-count hackery going on that's just not
// feasible without going insane trying to figure it out
- this->android_only_reset(mInfo.width(), mInfo.height(), rowBytes, std::move(ctable));
+ this->android_only_reset(mInfo.width(), mInfo.height(), rowBytes);
}
-static sk_sp<SkColorTable> sanitize(const SkImageInfo& info, sk_sp<SkColorTable> ctable) {
- if (info.colorType() == kIndex_8_SkColorType) {
- SkASSERT(ctable);
- return ctable;
- }
- return nullptr; // drop the ctable if we're not indexed
-}
-Bitmap::Bitmap(void* address, size_t size, const SkImageInfo& info, size_t rowBytes,
- sk_sp<SkColorTable> ctable)
- : SkPixelRef(info.width(), info.height(), address, rowBytes,
- sanitize(info, std::move(ctable)))
+Bitmap::Bitmap(void* address, size_t size, const SkImageInfo& info, size_t rowBytes)
+ : SkPixelRef(info.width(), info.height(), address, rowBytes)
, mInfo(validateAlpha(info))
, mPixelStorageType(PixelStorageType::Heap) {
mPixelStorage.heap.address = address;
@@ -194,9 +180,8 @@
}
Bitmap::Bitmap(void* address, void* context, FreeFunc freeFunc,
- const SkImageInfo& info, size_t rowBytes, sk_sp<SkColorTable> ctable)
- : SkPixelRef(info.width(), info.height(), address, rowBytes,
- sanitize(info, std::move(ctable)))
+ const SkImageInfo& info, size_t rowBytes)
+ : SkPixelRef(info.width(), info.height(), address, rowBytes)
, mInfo(validateAlpha(info))
, mPixelStorageType(PixelStorageType::External) {
mPixelStorage.external.address = address;
@@ -205,9 +190,8 @@
}
Bitmap::Bitmap(void* address, int fd, size_t mappedSize,
- const SkImageInfo& info, size_t rowBytes, sk_sp<SkColorTable> ctable)
- : SkPixelRef(info.width(), info.height(), address, rowBytes,
- sanitize(info, std::move(ctable)))
+ const SkImageInfo& info, size_t rowBytes)
+ : SkPixelRef(info.width(), info.height(), address, rowBytes)
, mInfo(validateAlpha(info))
, mPixelStorageType(PixelStorageType::Ashmem) {
mPixelStorage.ashmem.address = address;
@@ -217,15 +201,16 @@
Bitmap::Bitmap(GraphicBuffer* buffer, const SkImageInfo& info)
: SkPixelRef(info.width(), info.height(), nullptr,
- bytesPerPixel(buffer->getPixelFormat()) * buffer->getStride(),
- nullptr)
+ bytesPerPixel(buffer->getPixelFormat()) * buffer->getStride())
, mInfo(validateAlpha(info))
, mPixelStorageType(PixelStorageType::Hardware) {
mPixelStorage.hardware.buffer = buffer;
buffer->incStrong(buffer);
setImmutable(); // HW bitmaps are always immutable
if (uirenderer::Properties::isSkiaEnabled()) {
- // TODO: add color correctness for Skia pipeline - pass null color space for now
+ // GraphicBuffer should be in the display color space (Bitmap::createFrom is always
+ // passing SRGB). The code that uploads into a GraphicBuffer should do color conversion if
+ // needed.
mImage = SkImage::MakeFromAHardwareBuffer(reinterpret_cast<AHardwareBuffer*>(buffer),
mInfo.alphaType(), nullptr);
}
@@ -295,7 +280,7 @@
}
void Bitmap::reconfigure(const SkImageInfo& info) {
- reconfigure(info, info.minRowBytes(), nullptr);
+ reconfigure(info, info.minRowBytes());
}
void Bitmap::setAlphaType(SkAlphaType alphaType) {
@@ -310,7 +295,6 @@
outBitmap->setHasHardwareMipMap(mHasHardwareMipMap);
if (isHardware()) {
if (uirenderer::Properties::isSkiaEnabled()) {
- // TODO: add color correctness for Skia pipeline - pass null color space for now
outBitmap->allocPixels(SkImageInfo::Make(info().width(), info().height(),
info().colorType(), info().alphaType(), nullptr));
} else {
@@ -346,7 +330,12 @@
// Note we don't cache in this case, because the raster image holds a pointer to this Bitmap
// internally and ~Bitmap won't be invoked.
// TODO: refactor Bitmap to not derive from SkPixelRef, which would allow caching here.
- image = SkMakeImageFromRasterBitmap(skiaBitmap, kNever_SkCopyPixelsMode);
+ if (uirenderer::Properties::isSkiaEnabled()) {
+ image = SkMakeImageInColorSpace(skiaBitmap, SkColorSpace::MakeSRGB(),
+ skiaBitmap.getGenerationID(), kNever_SkCopyPixelsMode);
+ } else {
+ image = SkMakeImageFromRasterBitmap(skiaBitmap, kNever_SkCopyPixelsMode);
+ }
}
return image;
}
diff --git a/libs/hwui/hwui/Bitmap.h b/libs/hwui/hwui/Bitmap.h
index 364240670..634e764 100644
--- a/libs/hwui/hwui/Bitmap.h
+++ b/libs/hwui/hwui/Bitmap.h
@@ -17,7 +17,6 @@
#include <SkBitmap.h>
#include <SkColorSpace.h>
-#include <SkColorTable.h>
#include <SkImage.h>
#include <SkImageInfo.h>
#include <SkPixelRef.h>
@@ -46,32 +45,31 @@
class ANDROID_API Bitmap : public SkPixelRef {
public:
- static sk_sp<Bitmap> allocateHeapBitmap(SkBitmap* bitmap, sk_sp<SkColorTable> ctable);
+ static sk_sp<Bitmap> allocateHeapBitmap(SkBitmap* bitmap);
static sk_sp<Bitmap> allocateHeapBitmap(const SkImageInfo& info);
static sk_sp<Bitmap> allocateHardwareBitmap(SkBitmap& bitmap);
- static sk_sp<Bitmap> allocateAshmemBitmap(SkBitmap* bitmap, sk_sp<SkColorTable> ctable);
+ static sk_sp<Bitmap> allocateAshmemBitmap(SkBitmap* bitmap);
static sk_sp<Bitmap> allocateAshmemBitmap(size_t allocSize, const SkImageInfo& info,
- size_t rowBytes, sk_sp<SkColorTable> ctable);
+ size_t rowBytes);
static sk_sp<Bitmap> createFrom(sp<GraphicBuffer> graphicBuffer);
static sk_sp<Bitmap> createFrom(const SkImageInfo&, SkPixelRef&);
- Bitmap(void* address, size_t allocSize, const SkImageInfo& info, size_t rowBytes,
- sk_sp<SkColorTable> ctable);
+ Bitmap(void* address, size_t allocSize, const SkImageInfo& info, size_t rowBytes);
Bitmap(void* address, void* context, FreeFunc freeFunc,
- const SkImageInfo& info, size_t rowBytes, sk_sp<SkColorTable> ctable);
+ const SkImageInfo& info, size_t rowBytes);
Bitmap(void* address, int fd, size_t mappedSize, const SkImageInfo& info,
- size_t rowBytes, sk_sp<SkColorTable> ctable);
+ size_t rowBytes);
Bitmap(GraphicBuffer* buffer, const SkImageInfo& info);
int rowBytesAsPixels() const {
return rowBytes() >> SkColorTypeShiftPerPixel(mInfo.colorType());
}
- void reconfigure(const SkImageInfo& info, size_t rowBytes, sk_sp<SkColorTable> ctable);
+ void reconfigure(const SkImageInfo& info, size_t rowBytes);
void reconfigure(const SkImageInfo& info);
void setColorSpace(sk_sp<SkColorSpace> colorSpace);
void setAlphaType(SkAlphaType alphaType);
@@ -92,10 +90,6 @@
void getBounds(SkRect* bounds) const;
- bool readyToDraw() const {
- return this->colorType() != kIndex_8_SkColorType || this->colorTable();
- }
-
bool isHardware() const {
return mPixelStorageType == PixelStorageType::Hardware;
}
diff --git a/libs/hwui/hwui/Canvas.cpp b/libs/hwui/hwui/Canvas.cpp
index 679cb50..e754daf 100644
--- a/libs/hwui/hwui/Canvas.cpp
+++ b/libs/hwui/hwui/Canvas.cpp
@@ -35,6 +35,13 @@
return new uirenderer::RecordingCanvas(width, height);
}
+static inline void drawStroke(SkScalar left, SkScalar right, SkScalar top, SkScalar thickness,
+ const SkPaint& paint, Canvas* canvas) {
+ const SkScalar strokeWidth = fmax(thickness, 1.0f);
+ const SkScalar bottom = top + strokeWidth;
+ canvas->drawRect(left, top, right, bottom, paint);
+}
+
void Canvas::drawTextDecorations(float x, float y, float length, const SkPaint& paint) {
uint32_t flags;
SkDrawFilter* drawFilter = getDrawFilter();
@@ -46,24 +53,28 @@
flags = paint.getFlags();
}
if (flags & (SkPaint::kUnderlineText_ReserveFlag | SkPaint::kStrikeThruText_ReserveFlag)) {
- // Same values used by Skia
- const float kStdStrikeThru_Offset = (-6.0f / 21.0f);
- const float kStdUnderline_Offset = (1.0f / 9.0f);
- const float kStdUnderline_Thickness = (1.0f / 18.0f);
-
- SkScalar left = x;
- SkScalar right = x + length;
- float textSize = paint.getTextSize();
- float strokeWidth = fmax(textSize * kStdUnderline_Thickness, 1.0f);
+ const SkScalar left = x;
+ const SkScalar right = x + length;
if (flags & SkPaint::kUnderlineText_ReserveFlag) {
- SkScalar top = y + textSize * kStdUnderline_Offset - 0.5f * strokeWidth;
- SkScalar bottom = y + textSize * kStdUnderline_Offset + 0.5f * strokeWidth;
- drawRect(left, top, right, bottom, paint);
+ Paint::FontMetrics metrics;
+ paint.getFontMetrics(&metrics);
+ SkScalar position;
+ if (!metrics.hasUnderlinePosition(&position)) {
+ position = paint.getTextSize() * Paint::kStdUnderline_Top;
+ }
+ SkScalar thickness;
+ if (!metrics.hasUnderlineThickness(&thickness)) {
+ thickness = paint.getTextSize() * Paint::kStdUnderline_Thickness;
+ }
+ const SkScalar top = y + position;
+ drawStroke(left, right, top, thickness, paint, this);
}
if (flags & SkPaint::kStrikeThruText_ReserveFlag) {
- SkScalar top = y + textSize * kStdStrikeThru_Offset - 0.5f * strokeWidth;
- SkScalar bottom = y + textSize * kStdStrikeThru_Offset + 0.5f * strokeWidth;
- drawRect(left, top, right, bottom, paint);
+ const float textSize = paint.getTextSize();
+ const float position = textSize * Paint::kStdStrikeThru_Top;
+ const SkScalar thickness = textSize * Paint::kStdStrikeThru_Thickness;
+ const SkScalar top = y + position;
+ drawStroke(left, right, top, thickness, paint, this);
}
}
}
diff --git a/libs/hwui/hwui/Paint.h b/libs/hwui/hwui/Paint.h
index c9b5f00..a5d83a0 100644
--- a/libs/hwui/hwui/Paint.h
+++ b/libs/hwui/hwui/Paint.h
@@ -28,6 +28,19 @@
class ANDROID_API Paint : public SkPaint {
public:
+ // Default values for underlined and strikethrough text,
+ // as defined by Skia in SkTextFormatParams.h.
+ constexpr static float kStdStrikeThru_Offset = (-6.0f / 21.0f);
+ constexpr static float kStdUnderline_Offset = (1.0f / 9.0f);
+ constexpr static float kStdUnderline_Thickness = (1.0f / 18.0f);
+
+ constexpr static float kStdUnderline_Top =
+ kStdUnderline_Offset - 0.5f * kStdUnderline_Thickness;
+
+ constexpr static float kStdStrikeThru_Thickness = kStdUnderline_Thickness;
+ constexpr static float kStdStrikeThru_Top =
+ kStdStrikeThru_Offset - 0.5f * kStdStrikeThru_Thickness;
+
Paint();
Paint(const Paint& paint);
Paint(const SkPaint& paint); // NOLINT(implicit)
diff --git a/libs/hwui/hwui/Typeface.cpp b/libs/hwui/hwui/Typeface.cpp
index f66bb04..d96e376 100644
--- a/libs/hwui/hwui/Typeface.cpp
+++ b/libs/hwui/hwui/Typeface.cpp
@@ -68,7 +68,7 @@
Typeface* gDefaultTypeface = NULL;
Typeface* Typeface::resolveDefault(Typeface* src) {
- LOG_ALWAYS_FATAL_IF(gDefaultTypeface == nullptr);
+ LOG_ALWAYS_FATAL_IF(src == nullptr && gDefaultTypeface == nullptr);
return src == nullptr ? gDefaultTypeface : src;
}
diff --git a/libs/hwui/pipeline/skia/LayerDrawable.cpp b/libs/hwui/pipeline/skia/LayerDrawable.cpp
index 2ebfbcc..4feeb2d 100644
--- a/libs/hwui/pipeline/skia/LayerDrawable.cpp
+++ b/libs/hwui/pipeline/skia/LayerDrawable.cpp
@@ -18,6 +18,7 @@
#include "LayerDrawable.h"
#include "VkLayer.h"
+#include "GrBackendSurface.h"
#include "SkColorFilter.h"
#include "SkSurface.h"
#include "gl/GrGLTypes.h"
@@ -46,13 +47,10 @@
GrGLTextureInfo externalTexture;
externalTexture.fTarget = glLayer->getRenderTarget();
externalTexture.fID = glLayer->getTextureId();
- GrBackendTextureDesc textureDescription;
- textureDescription.fWidth = glLayer->getWidth();
- textureDescription.fHeight = glLayer->getHeight();
- textureDescription.fConfig = kRGBA_8888_GrPixelConfig;
- textureDescription.fOrigin = kTopLeft_GrSurfaceOrigin;
- textureDescription.fTextureHandle = reinterpret_cast<GrBackendObject>(&externalTexture);
- layerImage = SkImage::MakeFromTexture(context, textureDescription);
+ GrBackendTexture backendTexture(glLayer->getWidth(), glLayer->getHeight(),
+ kRGBA_8888_GrPixelConfig, externalTexture);
+ layerImage = SkImage::MakeFromTexture(context, backendTexture, kTopLeft_GrSurfaceOrigin,
+ kPremul_SkAlphaType, nullptr);
} else {
SkASSERT(layer->getApi() == Layer::Api::Vulkan);
VkLayer* vkLayer = static_cast<VkLayer*>(layer);
diff --git a/libs/hwui/pipeline/skia/ReorderBarrierDrawables.cpp b/libs/hwui/pipeline/skia/ReorderBarrierDrawables.cpp
index 975f849..374d364 100644
--- a/libs/hwui/pipeline/skia/ReorderBarrierDrawables.cpp
+++ b/libs/hwui/pipeline/skia/ReorderBarrierDrawables.cpp
@@ -51,8 +51,6 @@
return aZValue < bZValue;
});
- SkASSERT(!mChildren.empty());
-
size_t drawIndex = 0;
const size_t endIndex = mChildren.size();
while (drawIndex < endIndex) {
@@ -76,7 +74,6 @@
void EndReorderBarrierDrawable::onDraw(SkCanvas* canvas) {
auto& zChildren = mStartBarrier->mChildren;
- SkASSERT(!zChildren.empty());
/**
* Draw shadows and (potential) casters mostly in order, but allow the shadows of casters
diff --git a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp
index 6d5ef1d..925db30 100644
--- a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp
+++ b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp
@@ -27,6 +27,8 @@
#include "SkiaProfileRenderer.h"
#include "utils/TraceUtils.h"
+#include <GrBackendSurface.h>
+
#include <cutils/properties.h>
#include <strings.h>
@@ -69,20 +71,17 @@
mEglManager.damageFrame(frame, dirty);
// setup surface for fbo0
- GrBackendRenderTargetDesc renderTargetDesc;
- renderTargetDesc.fWidth = frame.width();
- renderTargetDesc.fHeight = frame.height();
- renderTargetDesc.fConfig = kRGBA_8888_GrPixelConfig;
- renderTargetDesc.fOrigin = kBottomLeft_GrSurfaceOrigin;
- renderTargetDesc.fSampleCnt = 0;
- renderTargetDesc.fStencilBits = STENCIL_BUFFER_SIZE;
- renderTargetDesc.fRenderTargetHandle = 0;
+ GrGLFramebufferInfo fboInfo;
+ fboInfo.fFBOID = 0;
+
+ GrBackendRenderTarget backendRT(frame.width(), frame.height(), 0, STENCIL_BUFFER_SIZE,
+ kRGBA_8888_GrPixelConfig, fboInfo);
SkSurfaceProps props(0, kUnknown_SkPixelGeometry);
SkASSERT(mRenderThread.getGrContext() != nullptr);
sk_sp<SkSurface> surface(SkSurface::MakeFromBackendRenderTarget(
- mRenderThread.getGrContext(), renderTargetDesc, &props));
+ mRenderThread.getGrContext(), backendRT, kBottomLeft_GrSurfaceOrigin, nullptr, &props));
SkiaPipeline::updateLighting(lightGeometry, lightInfo);
renderFrame(*layerUpdateQueue, dirty, renderNodes, opaque, wideColorGamut,
@@ -270,8 +269,7 @@
switch (info.colorType()) {
case kRGBA_8888_SkColorType:
isSupported = true;
- // ARGB_4444 and Index_8 are both upconverted to RGBA_8888
- case kIndex_8_SkColorType:
+ // ARGB_4444 is upconverted to RGBA_8888
case kARGB_4444_SkColorType:
pixelFormat = PIXEL_FORMAT_RGBA_8888;
format = GL_RGBA;
@@ -305,6 +303,13 @@
return nullptr;
}
+ auto colorSpace = info.colorSpace();
+ bool convertToSRGB = false;
+ if (colorSpace && (!colorSpace->isSRGB())) {
+ isSupported = false;
+ convertToSRGB = true;
+ }
+
SkBitmap bitmap;
if (isSupported) {
bitmap = skBitmap;
@@ -312,7 +317,7 @@
bitmap.allocPixels(SkImageInfo::MakeN32(info.width(), info.height(), info.alphaType(),
nullptr));
bitmap.eraseColor(0);
- if (info.colorType() == kRGBA_F16_SkColorType) {
+ if (info.colorType() == kRGBA_F16_SkColorType || convertToSRGB) {
// Drawing RGBA_F16 onto ARGB_8888 is not supported
skBitmap.readPixels(bitmap.info().makeColorSpace(SkColorSpace::MakeSRGB()),
bitmap.getPixels(), bitmap.rowBytes(), 0, 0);
diff --git a/libs/hwui/pipeline/skia/SkiaOpenGLReadback.cpp b/libs/hwui/pipeline/skia/SkiaOpenGLReadback.cpp
index 89697d7..311419d 100644
--- a/libs/hwui/pipeline/skia/SkiaOpenGLReadback.cpp
+++ b/libs/hwui/pipeline/skia/SkiaOpenGLReadback.cpp
@@ -20,6 +20,7 @@
#include "Properties.h"
#include <SkCanvas.h>
#include <SkSurface.h>
+#include <GrBackendSurface.h>
#include <gl/GrGLInterface.h>
#include <gl/GrGLTypes.h>
#include <GLES2/gl2.h>
@@ -53,50 +54,61 @@
externalTexture.fTarget = GL_TEXTURE_EXTERNAL_OES;
externalTexture.fID = sourceTexId;
- GrBackendTextureDesc textureDescription;
- textureDescription.fWidth = imgWidth;
- textureDescription.fHeight = imgHeight;
- textureDescription.fConfig = kRGBA_8888_GrPixelConfig;
- textureDescription.fOrigin = kTopLeft_GrSurfaceOrigin;
- textureDescription.fTextureHandle = reinterpret_cast<GrBackendObject>(&externalTexture);
+ GrBackendTexture backendTexture(imgWidth, imgHeight, kRGBA_8888_GrPixelConfig, externalTexture);
CopyResult copyResult = CopyResult::UnknownError;
- sk_sp<SkImage> image(SkImage::MakeFromAdoptedTexture(grContext.get(), textureDescription));
+ sk_sp<SkImage> image(SkImage::MakeFromAdoptedTexture(grContext.get(), backendTexture,
+ kTopLeft_GrSurfaceOrigin));
if (image) {
- // convert to Skia data structures
- const SkRect bufferRect = SkRect::MakeIWH(imgWidth, imgHeight);
- SkRect skiaSrcRect = srcRect.toSkRect();
SkMatrix textureMatrix;
imgTransform.copyTo(textureMatrix);
- // remove the y-flip applied to the matrix so that we can scale the srcRect.
- // This flip is not needed as we specify the origin of the texture when we
- // wrap it as an SkImage.
+ // remove the y-flip applied to the matrix
SkMatrix yFlip = SkMatrix::MakeScale(1, -1);
yFlip.postTranslate(0,1);
textureMatrix.preConcat(yFlip);
- // copy the entire src if the rect is empty
- if (skiaSrcRect.isEmpty()) {
- skiaSrcRect = bufferRect;
+ // multiply by image size, because textureMatrix maps to [0..1] range
+ textureMatrix[SkMatrix::kMTransX] *= imgWidth;
+ textureMatrix[SkMatrix::kMTransY] *= imgHeight;
+
+ // swap rotation and translation part of the matrix, because we convert from
+ // right-handed Cartesian to left-handed coordinate system.
+ std::swap(textureMatrix[SkMatrix::kMTransX], textureMatrix[SkMatrix::kMTransY]);
+ std::swap(textureMatrix[SkMatrix::kMSkewX], textureMatrix[SkMatrix::kMSkewY]);
+
+ // convert to Skia data structures
+ SkRect skiaSrcRect = srcRect.toSkRect();
+ SkMatrix textureMatrixInv;
+ SkRect skiaDestRect = SkRect::MakeWH(bitmap->width(), bitmap->height());
+ bool srcNotEmpty = false;
+ if (textureMatrix.invert(&textureMatrixInv)) {
+ if (skiaSrcRect.isEmpty()) {
+ skiaSrcRect = SkRect::MakeIWH(imgWidth, imgHeight);
+ srcNotEmpty = !skiaSrcRect.isEmpty();
+ } else {
+ // src and dest rectangles need to be converted into texture coordinates before the
+ // rotation matrix is applied (because drawImageRect preconcat its matrix).
+ textureMatrixInv.mapRect(&skiaSrcRect);
+ srcNotEmpty = skiaSrcRect.intersect(SkRect::MakeIWH(imgWidth, imgHeight));
+ }
+ textureMatrixInv.mapRect(&skiaDestRect);
}
- // since the y-flip has been removed we can simply scale & translate
- // the source rectangle
- textureMatrix.mapRect(&skiaSrcRect);
-
- if (skiaSrcRect.intersect(bufferRect)) {
+ if (srcNotEmpty) {
// we render in an offscreen buffer to scale and to avoid an issue b/62262733
// with reading incorrect data from EGLImage backed SkImage (likely a driver bug)
sk_sp<SkSurface> scaledSurface = SkSurface::MakeRenderTarget(
grContext.get(), SkBudgeted::kYes, bitmap->info());
SkPaint paint;
paint.setBlendMode(SkBlendMode::kSrc);
- scaledSurface->getCanvas()->drawImageRect(image, skiaSrcRect,
- SkRect::MakeWH(bitmap->width(), bitmap->height()), &paint);
+ scaledSurface->getCanvas()->concat(textureMatrix);
+ scaledSurface->getCanvas()->drawImageRect(image, skiaSrcRect, skiaDestRect, &paint);
+
image = scaledSurface->makeImageSnapshot();
if (image->readPixels(bitmap->info(), bitmap->getPixels(), bitmap->rowBytes(), 0, 0)) {
+ bitmap->notifyPixelsChanged();
copyResult = CopyResult::Success;
}
}
diff --git a/libs/hwui/pipeline/skia/SkiaPipeline.cpp b/libs/hwui/pipeline/skia/SkiaPipeline.cpp
index 0bab793..03792e0 100644
--- a/libs/hwui/pipeline/skia/SkiaPipeline.cpp
+++ b/libs/hwui/pipeline/skia/SkiaPipeline.cpp
@@ -95,7 +95,7 @@
SkASSERT(layerNode->getDisplayList()->isSkiaDL());
SkiaDisplayList* displayList = (SkiaDisplayList*)layerNode->getDisplayList();
if (!displayList || displayList->isEmpty()) {
- SkDEBUGF(("%p drawLayers(%s) : missing drawable", this, layerNode->getName()));
+ SkDEBUGF(("%p drawLayers(%s) : missing drawable", layerNode, layerNode->getName()));
return;
}
@@ -183,26 +183,16 @@
};
void SkiaPipeline::renderVectorDrawableCache() {
- //render VectorDrawables into offscreen buffers
- for (auto vd : mVectorDrawables) {
- sk_sp<SkSurface> surface;
- if (!vd->canReuseSurface()) {
-#ifndef ANDROID_ENABLE_LINEAR_BLENDING
- sk_sp<SkColorSpace> colorSpace = nullptr;
-#else
- sk_sp<SkColorSpace> colorSpace = SkColorSpace::MakeSRGB();
-#endif
- int scaledWidth = SkScalarCeilToInt(vd->properties().getScaledWidth());
- int scaledHeight = SkScalarCeilToInt(vd->properties().getScaledHeight());
- SkImageInfo info = SkImageInfo::MakeN32(scaledWidth, scaledHeight,
- kPremul_SkAlphaType, colorSpace);
- SkASSERT(mRenderThread.getGrContext() != nullptr);
- surface = SkSurface::MakeRenderTarget(mRenderThread.getGrContext(), SkBudgeted::kYes,
- info);
+ if (!mVectorDrawables.empty()) {
+ sp<VectorDrawableAtlas> atlas = mRenderThread.cacheManager().acquireVectorDrawableAtlas();
+ auto grContext = mRenderThread.getGrContext();
+ atlas->prepareForDraw(grContext);
+ for (auto vd : mVectorDrawables) {
+ vd->updateCache(atlas, grContext);
}
- vd->updateCache(surface);
+ grContext->flush();
+ mVectorDrawables.clear();
}
- mVectorDrawables.clear();
}
void SkiaPipeline::renderFrame(const LayerUpdateQueue& layers, const SkRect& clip,
diff --git a/libs/hwui/pipeline/skia/VectorDrawableAtlas.cpp b/libs/hwui/pipeline/skia/VectorDrawableAtlas.cpp
new file mode 100644
index 0000000..437653a
--- /dev/null
+++ b/libs/hwui/pipeline/skia/VectorDrawableAtlas.cpp
@@ -0,0 +1,269 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#include "VectorDrawableAtlas.h"
+
+#include <GrRectanizer_pow2.h>
+#include <SkCanvas.h>
+#include <cmath>
+#include "utils/TraceUtils.h"
+#include "renderthread/RenderProxy.h"
+
+namespace android {
+namespace uirenderer {
+namespace skiapipeline {
+
+VectorDrawableAtlas::VectorDrawableAtlas(size_t surfaceArea, StorageMode storageMode)
+ : mWidth((int)std::sqrt(surfaceArea))
+ , mHeight((int)std::sqrt(surfaceArea))
+ , mStorageMode(storageMode) {
+}
+
+void VectorDrawableAtlas::prepareForDraw(GrContext* context) {
+ if (StorageMode::allowSharedSurface == mStorageMode) {
+ if (!mSurface) {
+ mSurface = createSurface(mWidth, mHeight, context);
+ mRectanizer = std::make_unique<GrRectanizerPow2>(mWidth, mHeight);
+ mPixelUsedByVDs = 0;
+ mPixelAllocated = 0;
+ mConsecutiveFailures = 0;
+ mFreeRects.clear();
+ } else {
+ if (isFragmented()) {
+ // Invoke repack outside renderFrame to avoid jank.
+ renderthread::RenderProxy::repackVectorDrawableAtlas();
+ }
+ }
+ }
+}
+
+#define MAX_CONSECUTIVE_FAILURES 5
+#define MAX_UNUSED_RATIO 2.0f
+
+bool VectorDrawableAtlas::isFragmented() {
+ return mConsecutiveFailures > MAX_CONSECUTIVE_FAILURES
+ && mPixelUsedByVDs*MAX_UNUSED_RATIO < mPixelAllocated;
+}
+
+void VectorDrawableAtlas::repackIfNeeded(GrContext* context) {
+ // We repackage when atlas failed to allocate space MAX_CONSECUTIVE_FAILURES consecutive
+ // times and the atlas allocated pixels are at least MAX_UNUSED_RATIO times higher than pixels
+ // used by atlas VDs.
+ if (isFragmented() && mSurface) {
+ repack(context);
+ }
+}
+
+// compare to CacheEntry objects based on VD area.
+bool VectorDrawableAtlas::compareCacheEntry(const CacheEntry& first, const CacheEntry& second)
+{
+ return first.VDrect.width()*first.VDrect.height() < second.VDrect.width()*second.VDrect.height();
+}
+
+void VectorDrawableAtlas::repack(GrContext* context) {
+ ATRACE_CALL();
+ sk_sp<SkSurface> newSurface;
+ SkCanvas* canvas = nullptr;
+ if (StorageMode::allowSharedSurface == mStorageMode) {
+ newSurface = createSurface(mWidth, mHeight, context);
+ if (!newSurface) {
+ return;
+ }
+ canvas = newSurface->getCanvas();
+ canvas->clear(SK_ColorTRANSPARENT);
+ mRectanizer = std::make_unique<GrRectanizerPow2>(mWidth, mHeight);
+ } else {
+ if (!mSurface) {
+ return; //nothing to repack
+ }
+ mRectanizer.reset();
+ }
+ mFreeRects.clear();
+ SkImage* sourceImageAtlas = nullptr;
+ if (mSurface) {
+ sourceImageAtlas = mSurface->makeImageSnapshot().get();
+ }
+
+ // Sort the list by VD size, which allows for the smallest VDs to get first in the atlas.
+ // Sorting is safe, because it does not affect iterator validity.
+ if (mRects.size() <= 100) {
+ mRects.sort(compareCacheEntry);
+ }
+
+ for (CacheEntry& entry : mRects) {
+ SkRect currentVDRect = entry.VDrect;
+ SkImage* sourceImage; //copy either from the atlas or from a standalone surface
+ if (entry.surface) {
+ if (!fitInAtlas(currentVDRect.width(), currentVDRect.height())) {
+ continue; //don't even try to repack huge VD
+ }
+ sourceImage = entry.surface->makeImageSnapshot().get();
+ } else {
+ sourceImage = sourceImageAtlas;
+ }
+ size_t VDRectArea = currentVDRect.width()*currentVDRect.height();
+ SkIPoint16 pos;
+ if (canvas && mRectanizer->addRect(currentVDRect.width(), currentVDRect.height(), &pos)) {
+ SkRect newRect = SkRect::MakeXYWH(pos.fX, pos.fY, currentVDRect.width(),
+ currentVDRect.height());
+ canvas->drawImageRect(sourceImage, currentVDRect, newRect, nullptr);
+ entry.VDrect = newRect;
+ entry.rect = newRect;
+ if (entry.surface) {
+ // A rectangle moved from a standalone surface to the atlas.
+ entry.surface = nullptr;
+ mPixelUsedByVDs += VDRectArea;
+ }
+ } else {
+ // Repack failed for this item. If it is not already, store it in a standalone
+ // surface.
+ if (!entry.surface) {
+ // A rectangle moved from an atlas to a standalone surface.
+ mPixelUsedByVDs -= VDRectArea;
+ SkRect newRect = SkRect::MakeWH(currentVDRect.width(),
+ currentVDRect.height());
+ entry.surface = createSurface(newRect.width(), newRect.height(), context);
+ auto tempCanvas = entry.surface->getCanvas();
+ tempCanvas->clear(SK_ColorTRANSPARENT);
+ tempCanvas->drawImageRect(sourceImageAtlas, currentVDRect, newRect, nullptr);
+ entry.VDrect = newRect;
+ entry.rect = newRect;
+ }
+ }
+ }
+ mPixelAllocated = mPixelUsedByVDs;
+ context->flush();
+ mSurface = newSurface;
+ mConsecutiveFailures = 0;
+}
+
+AtlasEntry VectorDrawableAtlas::requestNewEntry(int width, int height, GrContext* context) {
+ AtlasEntry result;
+ if (width <= 0 || height <= 0) {
+ return result;
+ }
+
+ if (mSurface) {
+ const size_t area = width*height;
+
+ // Use a rectanizer to allocate unused space from the atlas surface.
+ bool notTooBig = fitInAtlas(width, height);
+ SkIPoint16 pos;
+ if (notTooBig && mRectanizer->addRect(width, height, &pos)) {
+ mPixelUsedByVDs += area;
+ mPixelAllocated += area;
+ result.rect = SkRect::MakeXYWH(pos.fX, pos.fY, width, height);
+ result.surface = mSurface;
+ auto eraseIt = mRects.emplace(mRects.end(), result.rect, result.rect, nullptr);
+ CacheEntry* entry = &(*eraseIt);
+ entry->eraseIt = eraseIt;
+ result.key = reinterpret_cast<AtlasKey>(entry);
+ mConsecutiveFailures = 0;
+ return result;
+ }
+
+ // Try to reuse atlas memory from rectangles freed by "releaseEntry".
+ auto freeRectIt = mFreeRects.lower_bound(area);
+ while (freeRectIt != mFreeRects.end()) {
+ SkRect& freeRect = freeRectIt->second;
+ if (freeRect.width() >= width && freeRect.height() >= height) {
+ result.rect = SkRect::MakeXYWH(freeRect.fLeft, freeRect.fTop, width, height);
+ result.surface = mSurface;
+ auto eraseIt = mRects.emplace(mRects.end(), result.rect, freeRect, nullptr);
+ CacheEntry* entry = &(*eraseIt);
+ entry->eraseIt = eraseIt;
+ result.key = reinterpret_cast<AtlasKey>(entry);
+ mPixelUsedByVDs += area;
+ mFreeRects.erase(freeRectIt);
+ mConsecutiveFailures = 0;
+ return result;
+ }
+ freeRectIt++;
+ }
+
+ if (notTooBig && mConsecutiveFailures <= MAX_CONSECUTIVE_FAILURES) {
+ mConsecutiveFailures++;
+ }
+ }
+
+ // Allocate a surface for a rectangle that is too big or if atlas is full.
+ if (nullptr != context) {
+ result.rect = SkRect::MakeWH(width, height);
+ result.surface = createSurface(width, height, context);
+ auto eraseIt = mRects.emplace(mRects.end(), result.rect, result.rect, result.surface);
+ CacheEntry* entry = &(*eraseIt);
+ entry->eraseIt = eraseIt;
+ result.key = reinterpret_cast<AtlasKey>(entry);
+ }
+
+ return result;
+}
+
+AtlasEntry VectorDrawableAtlas::getEntry(AtlasKey atlasKey) {
+ AtlasEntry result;
+ if (INVALID_ATLAS_KEY != atlasKey) {
+ CacheEntry* entry = reinterpret_cast<CacheEntry*>(atlasKey);
+ result.rect = entry->VDrect;
+ result.surface = entry->surface;
+ if (!result.surface) {
+ result.surface = mSurface;
+ }
+ result.key = atlasKey;
+ }
+ return result;
+}
+
+void VectorDrawableAtlas::releaseEntry(AtlasKey atlasKey) {
+ if (INVALID_ATLAS_KEY != atlasKey) {
+ CacheEntry* entry = reinterpret_cast<CacheEntry*>(atlasKey);
+ if (!entry->surface) {
+ // Store freed atlas rectangles in "mFreeRects" and try to reuse them later, when atlas
+ // is full.
+ SkRect& removedRect = entry->rect;
+ size_t rectArea = removedRect.width()*removedRect.height();
+ mFreeRects.emplace(rectArea, removedRect);
+ SkRect& removedVDRect = entry->VDrect;
+ size_t VDRectArea = removedVDRect.width()*removedVDRect.height();
+ mPixelUsedByVDs -= VDRectArea;
+ mConsecutiveFailures = 0;
+ }
+ auto eraseIt = entry->eraseIt;
+ mRects.erase(eraseIt);
+ }
+}
+
+sk_sp<SkSurface> VectorDrawableAtlas::createSurface(int width, int height, GrContext* context) {
+#ifndef ANDROID_ENABLE_LINEAR_BLENDING
+ sk_sp<SkColorSpace> colorSpace = nullptr;
+#else
+ sk_sp<SkColorSpace> colorSpace = SkColorSpace::MakeSRGB();
+#endif
+ SkImageInfo info = SkImageInfo::MakeN32(width, height, kPremul_SkAlphaType, colorSpace);
+ return SkSurface::MakeRenderTarget(context, SkBudgeted::kYes, info);
+}
+
+void VectorDrawableAtlas::setStorageMode(StorageMode mode) {
+ mStorageMode = mode;
+ if (StorageMode::disallowSharedSurface == mStorageMode && mSurface) {
+ mSurface.reset();
+ mRectanizer.reset();
+ mFreeRects.clear();
+ }
+}
+
+} /* namespace skiapipeline */
+} /* namespace uirenderer */
+} /* namespace android */
diff --git a/libs/hwui/pipeline/skia/VectorDrawableAtlas.h b/libs/hwui/pipeline/skia/VectorDrawableAtlas.h
new file mode 100644
index 0000000..496c557
--- /dev/null
+++ b/libs/hwui/pipeline/skia/VectorDrawableAtlas.h
@@ -0,0 +1,198 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#pragma once
+
+#include <map>
+#include <SkSurface.h>
+#include <utils/FatVector.h>
+#include <utils/RefBase.h>
+#include <list>
+
+class GrRectanizer;
+
+namespace android {
+namespace uirenderer {
+namespace skiapipeline {
+
+typedef uintptr_t AtlasKey;
+
+#define INVALID_ATLAS_KEY 0
+
+struct AtlasEntry {
+ sk_sp<SkSurface> surface;
+ SkRect rect;
+ AtlasKey key = INVALID_ATLAS_KEY;
+};
+
+/**
+ * VectorDrawableAtlas provides offscreen buffers used to draw VD and AnimatedVD.
+ * VectorDrawableAtlas can allocate a standalone surface or provide a subrect from a shared surface.
+ * VectorDrawableAtlas is owned by the CacheManager and weak pointers are kept by each
+ * VectorDrawable that is using it. VectorDrawableAtlas and its surface can be deleted at any time,
+ * except during a renderFrame call. VectorDrawable does not contain a pointer to atlas SkSurface
+ * nor any coordinates into the atlas, but instead holds a rectangle "id", which is resolved only
+ * when drawing. This design makes VectorDrawableAtlas free to move the data internally.
+ * At draw time a VectorDrawable may find, that its atlas has been deleted, which will make it
+ * draw in a standalone cache surface not part of an atlas. In this case VD won't use
+ * VectorDrawableAtlas until the next frame.
+ * VectorDrawableAtlas tries to fit VDs in the atlas SkSurface. If there is not enough space in
+ * the atlas, VectorDrawableAtlas creates a standalone surface for each VD.
+ * When a VectorDrawable is deleted, it invokes VectorDrawableAtlas::releaseEntry, which is keeping
+ * track of free spaces and allow to reuse the surface for another VD.
+ */
+ //TODO: Check if not using atlas for AnimatedVD is more efficient.
+ //TODO: For low memory situations, when there are no paint effects in VD, we may render without an
+ //TODO: offscreen surface.
+class VectorDrawableAtlas : public virtual RefBase {
+public:
+ enum class StorageMode {
+ allowSharedSurface,
+ disallowSharedSurface
+ };
+
+ VectorDrawableAtlas(size_t surfaceArea,
+ StorageMode storageMode = StorageMode::allowSharedSurface);
+
+ /**
+ * "prepareForDraw" may allocate a new surface if needed. It may schedule to repack the
+ * atlas at a later time.
+ */
+ void prepareForDraw(GrContext* context);
+
+ /**
+ * Repack the atlas if needed, by moving used rectangles into a new atlas surface.
+ * The goal of repacking is to fix a fragmented atlas.
+ */
+ void repackIfNeeded(GrContext* context);
+
+ /**
+ * Returns true if atlas is fragmented and repack is needed.
+ */
+ bool isFragmented();
+
+ /**
+ * "requestNewEntry" is called by VectorDrawable to allocate a new rectangle area from the atlas
+ * or create a standalone surface if atlas is full.
+ * On success it returns a non-negative unique id, which can be used later with "getEntry" and
+ * "releaseEntry".
+ */
+ AtlasEntry requestNewEntry(int width, int height, GrContext* context);
+
+ /**
+ * "getEntry" extracts coordinates and surface of a previously created rectangle.
+ * "atlasKey" is an unique id created by "requestNewEntry". Passing a non-existing "atlasKey" is
+ * causing an undefined behaviour.
+ * On success it returns a rectangle Id -> may be same or different from "atlasKey" if
+ * implementation decides to move the record internally.
+ */
+ AtlasEntry getEntry(AtlasKey atlasKey);
+
+ /**
+ * "releaseEntry" is invoked when a VectorDrawable is deleted. Passing a non-existing "atlasKey"
+ * is causing an undefined behaviour.
+ */
+ void releaseEntry(AtlasKey atlasKey);
+
+ void setStorageMode(StorageMode mode);
+
+private:
+ struct CacheEntry {
+ CacheEntry(const SkRect& newVDrect, const SkRect& newRect,
+ const sk_sp<SkSurface>& newSurface)
+ : VDrect(newVDrect)
+ , rect(newRect)
+ , surface(newSurface) { }
+
+ /**
+ * size and position of VectorDrawable into the atlas or in "this.surface"
+ */
+ SkRect VDrect;
+
+ /**
+ * rect allocated in atlas surface or "this.surface". It may be bigger than "VDrect"
+ */
+ SkRect rect;
+
+ /**
+ * this surface is used if atlas is full or VD is too big
+ */
+ sk_sp<SkSurface> surface;
+
+ /**
+ * iterator is used to delete self with a constant complexity (without traversing the list)
+ */
+ std::list<CacheEntry>::iterator eraseIt;
+ };
+
+ /**
+ * atlas surface shared by all VDs
+ */
+ sk_sp<SkSurface> mSurface;
+
+ std::unique_ptr<GrRectanizer> mRectanizer;
+ const int mWidth;
+ const int mHeight;
+
+ /**
+ * "mRects" keeps records only for rectangles used by VDs. List has nice properties: constant
+ * complexity to insert and erase and references are not invalidated by insert/erase.
+ */
+ std::list<CacheEntry> mRects;
+
+ /**
+ * Rectangles freed by "releaseEntry" are removed from "mRects" and added to "mFreeRects".
+ * "mFreeRects" is using for an index the rectangle area. There could be more than one free
+ * rectangle with the same area, which is the reason to use "multimap" instead of "map".
+ */
+ std::multimap<size_t, SkRect> mFreeRects;
+
+ /**
+ * area in atlas used by VectorDrawables (area in standalone surface not counted)
+ */
+ int mPixelUsedByVDs = 0;
+
+ /**
+ * area allocated in mRectanizer
+ */
+ int mPixelAllocated = 0;
+
+ /**
+ * Consecutive times we had to allocate standalone surfaces, because atlas was full.
+ */
+ int mConsecutiveFailures = 0;
+
+ /**
+ * mStorageMode allows using a shared surface to store small vector drawables.
+ * Using a shared surface can boost the performance by allowing GL ops to be batched, but may
+ * consume more memory.
+ */
+ StorageMode mStorageMode;
+
+ sk_sp<SkSurface> createSurface(int width, int height, GrContext* context);
+
+ inline bool fitInAtlas(int width, int height) {
+ return 2*width < mWidth && 2*height < mHeight;
+ }
+
+ void repack(GrContext* context);
+
+ static bool compareCacheEntry(const CacheEntry& first, const CacheEntry& second);
+};
+
+} /* namespace skiapipeline */
+} /* namespace uirenderer */
+} /* namespace android */
diff --git a/libs/hwui/renderstate/OffscreenBufferPool.cpp b/libs/hwui/renderstate/OffscreenBufferPool.cpp
index 90b27c8..2dfa6d4 100644
--- a/libs/hwui/renderstate/OffscreenBufferPool.cpp
+++ b/libs/hwui/renderstate/OffscreenBufferPool.cpp
@@ -179,8 +179,9 @@
layer->region.clear();
return layer;
}
+ bool wideColorGamut = layer->wideColorGamut;
putOrDelete(layer);
- return get(renderState, width, height, layer->wideColorGamut);
+ return get(renderState, width, height, wideColorGamut);
}
void OffscreenBufferPool::dump() {
diff --git a/libs/hwui/renderthread/CacheManager.cpp b/libs/hwui/renderthread/CacheManager.cpp
index f0d6b38..55694d0 100644
--- a/libs/hwui/renderthread/CacheManager.cpp
+++ b/libs/hwui/renderthread/CacheManager.cpp
@@ -43,7 +43,8 @@
CacheManager::CacheManager(const DisplayInfo& display)
: mMaxSurfaceArea(display.w * display.h) {
- mVectorDrawableAtlas.reset(new VectorDrawableAtlas);
+ mVectorDrawableAtlas = new skiapipeline::VectorDrawableAtlas(mMaxSurfaceArea/2,
+ skiapipeline::VectorDrawableAtlas::StorageMode::allowSharedSurface);
}
void CacheManager::reset(GrContext* context) {
@@ -61,7 +62,7 @@
void CacheManager::destroy() {
// cleanup any caches here as the GrContext is about to go away...
mGrContext.reset(nullptr);
- mVectorDrawableAtlas.reset(new VectorDrawableAtlas);
+ mVectorDrawableAtlas = new skiapipeline::VectorDrawableAtlas(mMaxSurfaceArea/2);
}
void CacheManager::updateContextCacheSizes() {
@@ -104,7 +105,7 @@
switch (mode) {
case TrimMemoryMode::Complete:
- mVectorDrawableAtlas.reset(new VectorDrawableAtlas);
+ mVectorDrawableAtlas = new skiapipeline::VectorDrawableAtlas(mMaxSurfaceArea/2);
mGrContext->freeGpuResources();
break;
case TrimMemoryMode::UiHidden:
@@ -121,24 +122,14 @@
mGrContext->purgeResourcesNotUsedInMs(std::chrono::seconds(30));
}
-VectorDrawableAtlas* CacheManager::acquireVectorDrawableAtlas() {
+sp<skiapipeline::VectorDrawableAtlas> CacheManager::acquireVectorDrawableAtlas() {
LOG_ALWAYS_FATAL_IF(mVectorDrawableAtlas.get() == nullptr);
LOG_ALWAYS_FATAL_IF(mGrContext == nullptr);
/**
- * TODO LIST:
- * 1) compute the atlas based on the surfaceArea surface
- * 2) identify a way to reuse cache entries
- * 3) add ability to repack the cache?
- * 4) define memory conditions where we clear the cache (e.g. surface->reset())
+ * TODO: define memory conditions where we clear the cache (e.g. surface->reset())
*/
-
- return mVectorDrawableAtlas.release();
-}
-void CacheManager::releaseVectorDrawableAtlas(VectorDrawableAtlas* atlas) {
- LOG_ALWAYS_FATAL_IF(mVectorDrawableAtlas.get() != nullptr);
- mVectorDrawableAtlas.reset(atlas);
- mVectorDrawableAtlas->isNewAtlas = false;
+ return mVectorDrawableAtlas;
}
void CacheManager::dumpMemoryUsage(String8& log, const RenderState* renderState) {
diff --git a/libs/hwui/renderthread/CacheManager.h b/libs/hwui/renderthread/CacheManager.h
index 43d58f2..90362f3 100644
--- a/libs/hwui/renderthread/CacheManager.h
+++ b/libs/hwui/renderthread/CacheManager.h
@@ -22,6 +22,7 @@
#include <ui/DisplayInfo.h>
#include <utils/String8.h>
#include <vector>
+#include "pipeline/skia/VectorDrawableAtlas.h"
namespace android {
@@ -36,11 +37,6 @@
class IRenderPipeline;
class RenderThread;
-struct VectorDrawableAtlas {
- sk_sp<SkSurface> surface;
- bool isNewAtlas = true;
-};
-
class CacheManager {
public:
enum class TrimMemoryMode {
@@ -53,8 +49,7 @@
void trimStaleResources();
void dumpMemoryUsage(String8& log, const RenderState* renderState = nullptr);
- VectorDrawableAtlas* acquireVectorDrawableAtlas();
- void releaseVectorDrawableAtlas(VectorDrawableAtlas*);
+ sp<skiapipeline::VectorDrawableAtlas> acquireVectorDrawableAtlas();
size_t getCacheSize() const { return mMaxResourceBytes; }
size_t getBackgroundCacheSize() const { return mBackgroundResourceBytes; }
@@ -81,7 +76,7 @@
size_t surfaceArea = 0;
};
- std::unique_ptr<VectorDrawableAtlas> mVectorDrawableAtlas;
+ sp<skiapipeline::VectorDrawableAtlas> mVectorDrawableAtlas;
};
} /* namespace renderthread */
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp
index 7799248..5d7f594 100644
--- a/libs/hwui/renderthread/CanvasContext.cpp
+++ b/libs/hwui/renderthread/CanvasContext.cpp
@@ -142,8 +142,8 @@
: mRenderThread(thread)
, mOpaque(!translucent)
, mAnimationContext(contextFactory->createAnimationContext(mRenderThread.timeLord()))
- , mJankTracker(thread.mainDisplayInfo())
- , mProfiler(mFrames)
+ , mJankTracker(&thread.globalProfileData(), thread.mainDisplayInfo())
+ , mProfiler(mJankTracker.frames())
, mContentDrawBounds(0, 0, 0, 0)
, mRenderPipeline(std::move(renderPipeline)) {
rootRenderNode->makeRoot();
@@ -321,7 +321,7 @@
// If the previous frame was dropped we don't need to hold onto it, so
// just keep using the previous frame's structure instead
if (!wasSkipped(mCurrentFrameInfo)) {
- mCurrentFrameInfo = &mFrames.next();
+ mCurrentFrameInfo = mJankTracker.startFrame();
}
mCurrentFrameInfo->importUiThreadInfo(uiFrameInfo);
mCurrentFrameInfo->set(FrameInfoIndex::SyncQueued) = syncQueued;
@@ -485,8 +485,7 @@
}
#endif
- mJankTracker.addFrame(*mCurrentFrameInfo);
- mRenderThread.jankTracker().addFrame(*mCurrentFrameInfo);
+ mJankTracker.finishFrame(*mCurrentFrameInfo);
if (CC_UNLIKELY(mFrameMetricsReporter.get() != nullptr)) {
mFrameMetricsReporter->reportFrameMetrics(mCurrentFrameInfo->data());
}
@@ -625,30 +624,12 @@
}
void CanvasContext::dumpFrames(int fd) {
- mJankTracker.dump(fd);
- FILE* file = fdopen(fd, "a");
- fprintf(file, "\n\n---PROFILEDATA---\n");
- for (size_t i = 0; i < static_cast<size_t>(FrameInfoIndex::NumIndexes); i++) {
- fprintf(file, "%s", FrameInfoNames[i].c_str());
- fprintf(file, ",");
- }
- for (size_t i = 0; i < mFrames.size(); i++) {
- FrameInfo& frame = mFrames[i];
- if (frame[FrameInfoIndex::SyncStart] == 0) {
- continue;
- }
- fprintf(file, "\n");
- for (int i = 0; i < static_cast<int>(FrameInfoIndex::NumIndexes); i++) {
- fprintf(file, "%" PRId64 ",", frame[i]);
- }
- }
- fprintf(file, "\n---PROFILEDATA---\n\n");
- fflush(file);
+ mJankTracker.dumpStats(fd);
+ mJankTracker.dumpFrames(fd);
}
void CanvasContext::resetFrameStats() {
- mFrames.clear();
- mRenderThread.jankTracker().reset();
+ mJankTracker.reset();
}
void CanvasContext::setName(const std::string&& name) {
diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h
index b1f4050..aa6d2f3 100644
--- a/libs/hwui/renderthread/CanvasContext.h
+++ b/libs/hwui/renderthread/CanvasContext.h
@@ -29,7 +29,6 @@
#include "RenderNode.h"
#include "thread/Task.h"
#include "thread/TaskProcessor.h"
-#include "utils/RingBuffer.h"
#include "renderthread/RenderTask.h"
#include "renderthread/RenderThread.h"
@@ -253,8 +252,6 @@
std::vector< sp<RenderNode> > mRenderNodes;
FrameInfo* mCurrentFrameInfo = nullptr;
- // Ring buffer large enough for 2 seconds worth of frames
- RingBuffer<FrameInfo, 120> mFrames;
std::string mName;
JankTracker mJankTracker;
FrameInfoVisualizer mProfiler;
diff --git a/libs/hwui/renderthread/EglManager.cpp b/libs/hwui/renderthread/EglManager.cpp
index d6240e7..16d7736 100644
--- a/libs/hwui/renderthread/EglManager.cpp
+++ b/libs/hwui/renderthread/EglManager.cpp
@@ -79,6 +79,7 @@
bool noConfigContext = false;
bool pixelFormatFloat = false;
bool glColorSpace = false;
+ bool scRGB = false;
} EglExtensions;
EglManager::EglManager(RenderThread& thread)
@@ -113,7 +114,7 @@
// An Adreno driver bug is causing rendering problems for SkiaGL with
// buffer age swap behavior (b/31957043). To temporarily workaround,
// we will use preserved swap behavior.
- if (Properties::useBufferAge && EglExtensions.bufferAge && !Properties::isSkiaEnabled()) {
+ if (Properties::useBufferAge && EglExtensions.bufferAge) {
mSwapBehavior = SwapBehavior::BufferAge;
} else {
mSwapBehavior = SwapBehavior::Preserved;
@@ -161,6 +162,11 @@
EglExtensions.glColorSpace = extensions.has("EGL_KHR_gl_colorspace");
EglExtensions.noConfigContext = extensions.has("EGL_KHR_no_config_context");
EglExtensions.pixelFormatFloat = extensions.has("EGL_EXT_pixel_format_float");
+#ifdef ANDROID_ENABLE_LINEAR_BLENDING
+ EglExtensions.scRGB = extensions.has("EGL_EXT_gl_colorspace_scrgb_linear");
+#else
+ EglExtensions.scRGB = extensions.has("EGL_EXT_gl_colorspace_scrgb");
+#endif
}
bool EglManager::hasEglContext() {
@@ -249,7 +255,7 @@
EGLSurface EglManager::createSurface(EGLNativeWindowType window, bool wideColorGamut) {
initialize();
- wideColorGamut = wideColorGamut && EglExtensions.glColorSpace
+ wideColorGamut = wideColorGamut && EglExtensions.glColorSpace && EglExtensions.scRGB
&& EglExtensions.pixelFormatFloat && EglExtensions.noConfigContext;
// The color space we want to use depends on whether linear blending is turned
@@ -289,9 +295,7 @@
}
#else
if (wideColorGamut) {
- // TODO: this should be using scRGB-nl, not scRGB, we need an extension for this
- // TODO: in the meantime SurfaceFlinger just assumes that scRGB is scRGB-nl
- attribs[1] = EGL_GL_COLORSPACE_SCRGB_LINEAR_EXT;
+ attribs[1] = EGL_GL_COLORSPACE_SCRGB_EXT;
} else {
attribs[1] = EGL_GL_COLORSPACE_LINEAR_KHR;
}
diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp
index 80c2955..7fe966d 100644
--- a/libs/hwui/renderthread/RenderProxy.cpp
+++ b/libs/hwui/renderthread/RenderProxy.cpp
@@ -21,6 +21,7 @@
#include "Properties.h"
#include "Readback.h"
#include "Rect.h"
+#include "pipeline/skia/VectorDrawableAtlas.h"
#include "renderthread/CanvasContext.h"
#include "renderthread/EglManager.h"
#include "renderthread/RenderTask.h"
@@ -427,12 +428,12 @@
if (args->dumpFlags & DumpFlags::FrameStats) {
args->context->dumpFrames(args->fd);
}
+ if (args->dumpFlags & DumpFlags::JankStats) {
+ args->thread->globalProfileData()->dump(args->fd);
+ }
if (args->dumpFlags & DumpFlags::Reset) {
args->context->resetFrameStats();
}
- if (args->dumpFlags & DumpFlags::JankStats) {
- args->thread->jankTracker().dump(args->fd);
- }
return nullptr;
}
@@ -458,7 +459,7 @@
CREATE_BRIDGE2(frameTimePercentile, RenderThread* thread, int percentile) {
return reinterpret_cast<void*>(static_cast<uintptr_t>(
- args->thread->jankTracker().findPercentile(args->percentile)));
+ args->thread->globalProfileData()->findPercentile(args->percentile)));
}
uint32_t RenderProxy::frameTimePercentile(int p) {
@@ -483,7 +484,7 @@
}
CREATE_BRIDGE2(setProcessStatsBuffer, RenderThread* thread, int fd) {
- args->thread->jankTracker().switchStorageToAshmem(args->fd);
+ args->thread->globalProfileData().switchStorageToAshmem(args->fd);
close(args->fd);
return nullptr;
}
@@ -497,7 +498,7 @@
}
CREATE_BRIDGE1(rotateProcessStatsBuffer, RenderThread* thread) {
- args->thread->jankTracker().rotateStorage();
+ args->thread->globalProfileData().rotateStorage();
return nullptr;
}
@@ -718,6 +719,19 @@
mRenderThread.queue(task);
}
+CREATE_BRIDGE1(repackVectorDrawableAtlas, RenderThread* thread) {
+ args->thread->cacheManager().acquireVectorDrawableAtlas()->repackIfNeeded(
+ args->thread->getGrContext());
+ return nullptr;
+}
+
+void RenderProxy::repackVectorDrawableAtlas() {
+ RenderThread& thread = RenderThread::getInstance();
+ SETUP_TASK(repackVectorDrawableAtlas);
+ args->thread = &thread;
+ thread.queue(task);
+}
+
void* RenderProxy::postAndWait(MethodInvokeRenderTask* task) {
void* retval;
task->setReturnPtr(&retval);
diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h
index 31f0ce6..06eaebd 100644
--- a/libs/hwui/renderthread/RenderProxy.h
+++ b/libs/hwui/renderthread/RenderProxy.h
@@ -140,6 +140,9 @@
static void onBitmapDestroyed(uint32_t pixelRefId);
ANDROID_API static void disableVsync();
+
+ static void repackVectorDrawableAtlas();
+
private:
RenderThread& mRenderThread;
CanvasContext* mContext;
diff --git a/libs/hwui/renderthread/RenderThread.cpp b/libs/hwui/renderthread/RenderThread.cpp
index 13af2c4..72a428f 100644
--- a/libs/hwui/renderthread/RenderThread.cpp
+++ b/libs/hwui/renderthread/RenderThread.cpp
@@ -200,13 +200,12 @@
initializeDisplayEventReceiver();
mEglManager = new EglManager(*this);
mRenderState = new RenderState(*this);
- mJankTracker = new JankTracker(mDisplayInfo);
mVkManager = new VulkanManager(*this);
mCacheManager = new CacheManager(mDisplayInfo);
}
void RenderThread::dumpGraphicsMemory(int fd) {
- jankTracker().dump(fd);
+ globalProfileData()->dump(fd);
String8 cachesOutput;
String8 pipeline;
diff --git a/libs/hwui/renderthread/RenderThread.h b/libs/hwui/renderthread/RenderThread.h
index d984257..bef47b3 100644
--- a/libs/hwui/renderthread/RenderThread.h
+++ b/libs/hwui/renderthread/RenderThread.h
@@ -97,7 +97,7 @@
TimeLord& timeLord() { return mTimeLord; }
RenderState& renderState() const { return *mRenderState; }
EglManager& eglManager() const { return *mEglManager; }
- JankTracker& jankTracker() { return *mJankTracker; }
+ ProfileDataContainer& globalProfileData() { return mGlobalProfileData; }
Readback& readback();
const DisplayInfo& mainDisplayInfo() { return mDisplayInfo; }
@@ -160,7 +160,7 @@
RenderState* mRenderState;
EglManager* mEglManager;
- JankTracker* mJankTracker = nullptr;
+ ProfileDataContainer mGlobalProfileData;
Readback* mReadback = nullptr;
sk_sp<GrContext> mGrContext;
diff --git a/libs/hwui/renderthread/VulkanManager.cpp b/libs/hwui/renderthread/VulkanManager.cpp
index a745320..2195143 100644
--- a/libs/hwui/renderthread/VulkanManager.cpp
+++ b/libs/hwui/renderthread/VulkanManager.cpp
@@ -22,6 +22,7 @@
#include "renderstate/RenderState.h"
#include "utils/FatVector.h"
+#include <GrBackendSurface.h>
#include <GrContext.h>
#include <GrTypes.h>
#include <vk/GrVkTypes.h>
@@ -297,13 +298,9 @@
SkSurfaceProps props(0, kUnknown_SkPixelGeometry);
- bool wantSRGB = VK_FORMAT_R8G8B8A8_SRGB == format;
- GrPixelConfig config = wantSRGB ? kSRGBA_8888_GrPixelConfig : kRGBA_8888_GrPixelConfig;
-
// set up initial image layouts and create surfaces
surface->mImageInfos = new VulkanSurface::ImageInfo[surface->mImageCount];
for (uint32_t i = 0; i < surface->mImageCount; ++i) {
- GrBackendRenderTargetDesc desc;
GrVkImageInfo info;
info.fImage = surface->mImages[i];
info.fAlloc = { VK_NULL_HANDLE, 0, 0, 0 };
@@ -312,17 +309,11 @@
info.fFormat = format;
info.fLevelCount = 1;
- desc.fWidth = extent.width;
- desc.fHeight = extent.height;
- desc.fConfig = config;
- desc.fOrigin = kTopLeft_GrSurfaceOrigin;
- desc.fSampleCnt = 0;
- desc.fStencilBits = 0;
- desc.fRenderTargetHandle = (GrBackendObject) &info;
+ GrBackendRenderTarget backendRT(extent.width, extent.height, 0, 0, info);
VulkanSurface::ImageInfo& imageInfo = surface->mImageInfos[i];
imageInfo.mSurface = SkSurface::MakeFromBackendRenderTarget(mRenderThread.getGrContext(),
- desc, &props);
+ backendRT, kTopLeft_GrSurfaceOrigin, nullptr, &props);
}
SkASSERT(mCommandPool != VK_NULL_HANDLE);
diff --git a/libs/hwui/service/GraphicsStatsService.cpp b/libs/hwui/service/GraphicsStatsService.cpp
index 87eaa6a..3a77195 100644
--- a/libs/hwui/service/GraphicsStatsService.cpp
+++ b/libs/hwui/service/GraphicsStatsService.cpp
@@ -38,9 +38,7 @@
constexpr int32_t sHeaderSize = 4;
static_assert(sizeof(sCurrentFileVersion) == sHeaderSize, "Header size is wrong");
-constexpr int sHistogramSize =
- std::tuple_size<decltype(ProfileData::frameCounts)>::value +
- std::tuple_size<decltype(ProfileData::slowFrameCounts)>::value;
+constexpr int sHistogramSize = ProfileData::HistogramSize();
static void mergeProfileDataIntoProto(service::GraphicsStatsProto* proto,
const std::string& package, int versionCode, int64_t startTime, int64_t endTime,
@@ -172,18 +170,18 @@
proto->set_package_name(package);
proto->set_version_code(versionCode);
auto summary = proto->mutable_summary();
- summary->set_total_frames(summary->total_frames() + data->totalFrameCount);
- summary->set_janky_frames(summary->janky_frames() + data->jankFrameCount);
+ summary->set_total_frames(summary->total_frames() + data->totalFrameCount());
+ summary->set_janky_frames(summary->janky_frames() + data->jankFrameCount());
summary->set_missed_vsync_count(
- summary->missed_vsync_count() + data->jankTypeCounts[kMissedVsync]);
+ summary->missed_vsync_count() + data->jankTypeCount(kMissedVsync));
summary->set_high_input_latency_count(
- summary->high_input_latency_count() + data->jankTypeCounts[kHighInputLatency]);
+ summary->high_input_latency_count() + data->jankTypeCount(kHighInputLatency));
summary->set_slow_ui_thread_count(
- summary->slow_ui_thread_count() + data->jankTypeCounts[kSlowUI]);
+ summary->slow_ui_thread_count() + data->jankTypeCount(kSlowUI));
summary->set_slow_bitmap_upload_count(
- summary->slow_bitmap_upload_count() + data->jankTypeCounts[kSlowSync]);
+ summary->slow_bitmap_upload_count() + data->jankTypeCount(kSlowSync));
summary->set_slow_draw_count(
- summary->slow_draw_count() + data->jankTypeCounts[kSlowRT]);
+ summary->slow_draw_count() + data->jankTypeCount(kSlowRT));
bool creatingHistogram = false;
if (proto->histogram_size() == 0) {
@@ -193,33 +191,20 @@
LOG_ALWAYS_FATAL("Histogram size mismatch, proto is %d expected %d",
proto->histogram_size(), sHistogramSize);
}
- for (size_t i = 0; i < data->frameCounts.size(); i++) {
+ int index = 0;
+ data->histogramForEach([&](ProfileData::HistogramEntry entry) {
service::GraphicsStatsHistogramBucketProto* bucket;
- int32_t renderTime = JankTracker::frameTimeForFrameCountIndex(i);
if (creatingHistogram) {
bucket = proto->add_histogram();
- bucket->set_render_millis(renderTime);
+ bucket->set_render_millis(entry.renderTimeMs);
} else {
- bucket = proto->mutable_histogram(i);
- LOG_ALWAYS_FATAL_IF(bucket->render_millis() != renderTime,
- "Frame time mistmatch %d vs. %d", bucket->render_millis(), renderTime);
+ bucket = proto->mutable_histogram(index);
+ LOG_ALWAYS_FATAL_IF(bucket->render_millis() != static_cast<int32_t>(entry.renderTimeMs),
+ "Frame time mistmatch %d vs. %u", bucket->render_millis(), entry.renderTimeMs);
}
- bucket->set_frame_count(bucket->frame_count() + data->frameCounts[i]);
- }
- for (size_t i = 0; i < data->slowFrameCounts.size(); i++) {
- service::GraphicsStatsHistogramBucketProto* bucket;
- int32_t renderTime = JankTracker::frameTimeForSlowFrameCountIndex(i);
- if (creatingHistogram) {
- bucket = proto->add_histogram();
- bucket->set_render_millis(renderTime);
- } else {
- constexpr int offset = std::tuple_size<decltype(ProfileData::frameCounts)>::value;
- bucket = proto->mutable_histogram(offset + i);
- LOG_ALWAYS_FATAL_IF(bucket->render_millis() != renderTime,
- "Frame time mistmatch %d vs. %d", bucket->render_millis(), renderTime);
- }
- bucket->set_frame_count(bucket->frame_count() + data->slowFrameCounts[i]);
- }
+ bucket->set_frame_count(bucket->frame_count() + entry.frameCount);
+ index++;
+ });
}
static int32_t findPercentile(service::GraphicsStatsProto* proto, int percentile) {
diff --git a/libs/hwui/tests/common/BitmapAllocationTestUtils.h b/libs/hwui/tests/common/BitmapAllocationTestUtils.h
index 4892179..2988979 100644
--- a/libs/hwui/tests/common/BitmapAllocationTestUtils.h
+++ b/libs/hwui/tests/common/BitmapAllocationTestUtils.h
@@ -41,7 +41,7 @@
SkBitmap skBitmap;
SkImageInfo info = SkImageInfo::Make(width, height, colorType, kPremul_SkAlphaType);
skBitmap.setInfo(info);
- sk_sp<Bitmap> heapBitmap(Bitmap::allocateHeapBitmap(&skBitmap, nullptr));
+ sk_sp<Bitmap> heapBitmap(Bitmap::allocateHeapBitmap(&skBitmap));
setup(skBitmap);
return Bitmap::allocateHardwareBitmap(skBitmap);
}
@@ -73,4 +73,4 @@
} // namespace test
} // namespace uirenderer
-} // namespace android
\ No newline at end of file
+} // namespace android
diff --git a/libs/hwui/tests/common/LeakChecker.cpp b/libs/hwui/tests/common/LeakChecker.cpp
index d935382..fe38ec9 100644
--- a/libs/hwui/tests/common/LeakChecker.cpp
+++ b/libs/hwui/tests/common/LeakChecker.cpp
@@ -58,9 +58,8 @@
if (merged.num_leaks) {
cout << endl << "Leaked memory!" << endl;
if (!merged.leaks[0].backtrace.num_frames) {
- cout << "Re-run with 'setprop libc.debug.malloc.program hwui_unit_test'"
- << endl << "and 'setprop libc.debug.malloc.options backtrace=8'"
- << " to get backtraces" << endl;
+ cout << "Re-run with 'export LIBC_DEBUG_MALLOC_OPTIONS=backtrace' to get backtraces"
+ << endl;
}
cout << merged.ToString(false);
}
diff --git a/libs/hwui/tests/common/TestUtils.h b/libs/hwui/tests/common/TestUtils.h
index 98d5fb3..f293631 100644
--- a/libs/hwui/tests/common/TestUtils.h
+++ b/libs/hwui/tests/common/TestUtils.h
@@ -189,7 +189,7 @@
static sk_sp<Bitmap> createBitmap(int width, int height, SkBitmap* outBitmap) {
SkImageInfo info = SkImageInfo::Make(width, height, kN32_SkColorType, kPremul_SkAlphaType);
outBitmap->setInfo(info);
- return Bitmap::allocateHeapBitmap(outBitmap, nullptr);
+ return Bitmap::allocateHeapBitmap(outBitmap);
}
static sp<DeferredLayerUpdater> createTextureLayerUpdater(
diff --git a/libs/hwui/tests/unit/BitmapTests.cpp b/libs/hwui/tests/unit/BitmapTests.cpp
deleted file mode 100644
index ed689bd..0000000
--- a/libs/hwui/tests/unit/BitmapTests.cpp
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <gtest/gtest.h>
-
-#include "hwui/Bitmap.h"
-
-#include <SkBitmap.h>
-#include <SkColorTable.h>
-#include <SkImageInfo.h>
-
-#include <tests/common/TestUtils.h>
-
-using namespace android;
-using namespace android::uirenderer;
-
-TEST(Bitmap, colorTableRefCounting) {
- const SkPMColor c[] = { SkPackARGB32(0x80, 0x80, 0, 0) };
- sk_sp<SkColorTable> ctable = SkColorTable::Make(c, SK_ARRAY_COUNT(c));
-
- SkBitmap* bm = new SkBitmap();
- bm->allocPixels(SkImageInfo::Make(1, 1, kIndex_8_SkColorType, kPremul_SkAlphaType),
- ctable);
- sk_sp<Bitmap> bitmap = Bitmap::allocateHeapBitmap(bm, ctable);
- EXPECT_FALSE(ctable->unique());
- delete bm;
- bitmap.reset();
- EXPECT_TRUE(ctable->unique());
-}
-
diff --git a/libs/hwui/tests/unit/GraphicsStatsServiceTests.cpp b/libs/hwui/tests/unit/GraphicsStatsServiceTests.cpp
index f6f7337..fda3a79 100644
--- a/libs/hwui/tests/unit/GraphicsStatsServiceTests.cpp
+++ b/libs/hwui/tests/unit/GraphicsStatsServiceTests.cpp
@@ -61,17 +61,17 @@
TEST(GraphicsStats, saveLoad) {
std::string path = findRootPath() + "/test_saveLoad";
std::string packageName = "com.test.saveLoad";
- ProfileData mockData;
- mockData.jankFrameCount = 20;
- mockData.totalFrameCount = 100;
- mockData.statStartTime = 10000;
+ MockProfileData mockData;
+ mockData.editJankFrameCount() = 20;
+ mockData.editTotalFrameCount() = 100;
+ mockData.editStatStartTime() = 10000;
// Fill with patterned data we can recognize but which won't map to a
// memset or basic for iteration count
- for (size_t i = 0; i < mockData.frameCounts.size(); i++) {
- mockData.frameCounts[i] = ((i % 10) + 1) * 2;
+ for (size_t i = 0; i < mockData.editFrameCounts().size(); i++) {
+ mockData.editFrameCounts()[i] = ((i % 10) + 1) * 2;
}
- for (size_t i = 0; i < mockData.slowFrameCounts.size(); i++) {
- mockData.slowFrameCounts[i] = (i % 5) + 1;
+ for (size_t i = 0; i < mockData.editSlowFrameCounts().size(); i++) {
+ mockData.editSlowFrameCounts()[i] = (i % 5) + 1;
}
GraphicsStatsService::saveBuffer(path, packageName, 5, 3000, 7000, &mockData);
service::GraphicsStatsProto loadedProto;
@@ -87,17 +87,17 @@
ASSERT_TRUE(loadedProto.has_summary());
EXPECT_EQ(20, loadedProto.summary().janky_frames());
EXPECT_EQ(100, loadedProto.summary().total_frames());
- EXPECT_EQ(mockData.frameCounts.size() + mockData.slowFrameCounts.size(),
+ EXPECT_EQ(mockData.editFrameCounts().size() + mockData.editSlowFrameCounts().size(),
(size_t) loadedProto.histogram_size());
for (size_t i = 0; i < (size_t) loadedProto.histogram_size(); i++) {
int expectedCount, expectedBucket;
- if (i < mockData.frameCounts.size()) {
+ if (i < mockData.editFrameCounts().size()) {
expectedCount = ((i % 10) + 1) * 2;
- expectedBucket = JankTracker::frameTimeForFrameCountIndex(i);
+ expectedBucket = ProfileData::frameTimeForFrameCountIndex(i);
} else {
- int temp = i - mockData.frameCounts.size();
+ int temp = i - mockData.editFrameCounts().size();
expectedCount = (temp % 5) + 1;
- expectedBucket = JankTracker::frameTimeForSlowFrameCountIndex(temp);
+ expectedBucket = ProfileData::frameTimeForSlowFrameCountIndex(temp);
}
EXPECT_EQ(expectedCount, loadedProto.histogram().Get(i).frame_count());
EXPECT_EQ(expectedBucket, loadedProto.histogram().Get(i).render_millis());
@@ -107,26 +107,26 @@
TEST(GraphicsStats, merge) {
std::string path = findRootPath() + "/test_merge";
std::string packageName = "com.test.merge";
- ProfileData mockData;
- mockData.jankFrameCount = 20;
- mockData.totalFrameCount = 100;
- mockData.statStartTime = 10000;
+ MockProfileData mockData;
+ mockData.editJankFrameCount() = 20;
+ mockData.editTotalFrameCount() = 100;
+ mockData.editStatStartTime() = 10000;
// Fill with patterned data we can recognize but which won't map to a
// memset or basic for iteration count
- for (size_t i = 0; i < mockData.frameCounts.size(); i++) {
- mockData.frameCounts[i] = ((i % 10) + 1) * 2;
+ for (size_t i = 0; i < mockData.editFrameCounts().size(); i++) {
+ mockData.editFrameCounts()[i] = ((i % 10) + 1) * 2;
}
- for (size_t i = 0; i < mockData.slowFrameCounts.size(); i++) {
- mockData.slowFrameCounts[i] = (i % 5) + 1;
+ for (size_t i = 0; i < mockData.editSlowFrameCounts().size(); i++) {
+ mockData.editSlowFrameCounts()[i] = (i % 5) + 1;
}
GraphicsStatsService::saveBuffer(path, packageName, 5, 3000, 7000, &mockData);
- mockData.jankFrameCount = 50;
- mockData.totalFrameCount = 500;
- for (size_t i = 0; i < mockData.frameCounts.size(); i++) {
- mockData.frameCounts[i] = (i % 5) + 1;
+ mockData.editJankFrameCount() = 50;
+ mockData.editTotalFrameCount() = 500;
+ for (size_t i = 0; i < mockData.editFrameCounts().size(); i++) {
+ mockData.editFrameCounts()[i] = (i % 5) + 1;
}
- for (size_t i = 0; i < mockData.slowFrameCounts.size(); i++) {
- mockData.slowFrameCounts[i] = ((i % 10) + 1) * 2;
+ for (size_t i = 0; i < mockData.editSlowFrameCounts().size(); i++) {
+ mockData.editSlowFrameCounts()[i] = ((i % 10) + 1) * 2;
}
GraphicsStatsService::saveBuffer(path, packageName, 5, 7050, 10000, &mockData);
@@ -143,19 +143,19 @@
ASSERT_TRUE(loadedProto.has_summary());
EXPECT_EQ(20 + 50, loadedProto.summary().janky_frames());
EXPECT_EQ(100 + 500, loadedProto.summary().total_frames());
- EXPECT_EQ(mockData.frameCounts.size() + mockData.slowFrameCounts.size(),
+ EXPECT_EQ(mockData.editFrameCounts().size() + mockData.editSlowFrameCounts().size(),
(size_t) loadedProto.histogram_size());
for (size_t i = 0; i < (size_t) loadedProto.histogram_size(); i++) {
int expectedCount, expectedBucket;
- if (i < mockData.frameCounts.size()) {
+ if (i < mockData.editFrameCounts().size()) {
expectedCount = ((i % 10) + 1) * 2;
expectedCount += (i % 5) + 1;
- expectedBucket = JankTracker::frameTimeForFrameCountIndex(i);
+ expectedBucket = ProfileData::frameTimeForFrameCountIndex(i);
} else {
- int temp = i - mockData.frameCounts.size();
+ int temp = i - mockData.editFrameCounts().size();
expectedCount = (temp % 5) + 1;
expectedCount += ((temp % 10) + 1) * 2;
- expectedBucket = JankTracker::frameTimeForSlowFrameCountIndex(temp);
+ expectedBucket = ProfileData::frameTimeForSlowFrameCountIndex(temp);
}
EXPECT_EQ(expectedCount, loadedProto.histogram().Get(i).frame_count());
EXPECT_EQ(expectedBucket, loadedProto.histogram().Get(i).render_millis());
diff --git a/libs/hwui/tests/unit/SkiaBehaviorTests.cpp b/libs/hwui/tests/unit/SkiaBehaviorTests.cpp
index a3d5079..85b12ba 100644
--- a/libs/hwui/tests/unit/SkiaBehaviorTests.cpp
+++ b/libs/hwui/tests/unit/SkiaBehaviorTests.cpp
@@ -51,8 +51,6 @@
SkShader::TileMode xy[2];
ASSERT_TRUE(s->isABitmap(&bitmap, nullptr, xy))
<< "1x1 bitmap shader must query as bitmap shader";
- EXPECT_EQ(SkShader::kClamp_TileMode, xy[0]);
- EXPECT_EQ(SkShader::kRepeat_TileMode, xy[1]);
EXPECT_EQ(origBitmap.pixelRef(), bitmap.pixelRef());
}
diff --git a/libs/hwui/tests/unit/VectorDrawableAtlasTests.cpp b/libs/hwui/tests/unit/VectorDrawableAtlasTests.cpp
new file mode 100644
index 0000000..17f8176
--- /dev/null
+++ b/libs/hwui/tests/unit/VectorDrawableAtlasTests.cpp
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#include <gtest/gtest.h>
+
+#include "tests/common/TestUtils.h"
+#include <GrRectanizer.h>
+#include "pipeline/skia/VectorDrawableAtlas.h"
+
+using namespace android;
+using namespace android::uirenderer;
+using namespace android::uirenderer::renderthread;
+using namespace android::uirenderer::skiapipeline;
+
+RENDERTHREAD_SKIA_PIPELINE_TEST(VectorDrawableAtlas, addGetRemove) {
+ VectorDrawableAtlas atlas(100*100);
+ atlas.prepareForDraw(renderThread.getGrContext());
+ //create 150 rects 10x10, which won't fit in the atlas (atlas can fit no more than 100 rects)
+ const int MAX_RECTS = 150;
+ AtlasEntry VDRects[MAX_RECTS];
+
+ sk_sp<SkSurface> atlasSurface;
+
+ //check we are able to allocate new rects
+ //check that rects in the atlas do not intersect
+ for (uint32_t i = 0; i < MAX_RECTS; i++) {
+ VDRects[i] = atlas.requestNewEntry(10, 10, renderThread.getGrContext());
+ if (0 == i) {
+ atlasSurface = VDRects[0].surface;
+ }
+ ASSERT_TRUE(VDRects[i].key != INVALID_ATLAS_KEY);
+ ASSERT_TRUE(VDRects[i].surface.get() != nullptr);
+ ASSERT_TRUE(VDRects[i].rect.width() == 10 && VDRects[i].rect.height() == 10);
+
+ //nothing in the atlas should intersect
+ if (atlasSurface.get() == VDRects[i].surface.get()) {
+ for (uint32_t j = 0; j < i; j++) {
+ if (atlasSurface.get() == VDRects[j].surface.get()) {
+ ASSERT_FALSE(VDRects[i].rect.intersect(VDRects[j].rect));
+ }
+ }
+ }
+ }
+
+ //first 1/3 rects should all be in the same surface
+ for (uint32_t i = 1; i < MAX_RECTS/3; i++) {
+ ASSERT_NE(VDRects[i].key, VDRects[0].key);
+ ASSERT_EQ(VDRects[i].surface.get(), atlasSurface.get());
+ }
+
+ //first rect is using atlas and last is a standalone surface
+ ASSERT_NE(VDRects[0].surface.get(), VDRects[MAX_RECTS-1].surface.get());
+
+ //check getEntry returns the same surfaces that we had created
+ for (uint32_t i = 0; i < MAX_RECTS; i++) {
+ auto VDRect = atlas.getEntry(VDRects[i].key);
+ ASSERT_TRUE(VDRect.key != INVALID_ATLAS_KEY);
+ ASSERT_EQ(VDRects[i].key, VDRect.key);
+ ASSERT_EQ(VDRects[i].surface.get(), VDRect.surface.get());
+ ASSERT_EQ(VDRects[i].rect, VDRect.rect);
+ atlas.releaseEntry(VDRect.key);
+ }
+
+ //check that any new rects will be allocated in the atlas, even that rectanizer is full.
+ //rects in the atlas should not intersect.
+ for (uint32_t i = 0; i < MAX_RECTS/3; i++) {
+ VDRects[i] = atlas.requestNewEntry(10, 10, renderThread.getGrContext());
+ ASSERT_TRUE(VDRects[i].key != INVALID_ATLAS_KEY);
+ ASSERT_EQ(VDRects[i].surface.get(), atlasSurface.get());
+ ASSERT_TRUE(VDRects[i].rect.width() == 10 && VDRects[i].rect.height() == 10);
+ for (uint32_t j = 0; j < i; j++) {
+ ASSERT_FALSE(VDRects[i].rect.intersect(VDRects[j].rect));
+ }
+ }
+}
+
+
+RENDERTHREAD_SKIA_PIPELINE_TEST(VectorDrawableAtlas, disallowSharedSurface) {
+ VectorDrawableAtlas atlas(100*100);
+ //don't allow to use a shared surface
+ atlas.setStorageMode(VectorDrawableAtlas::StorageMode::disallowSharedSurface);
+ atlas.prepareForDraw(renderThread.getGrContext());
+ //create 150 rects 10x10, which won't fit in the atlas (atlas can fit no more than 100 rects)
+ const int MAX_RECTS = 150;
+ AtlasEntry VDRects[MAX_RECTS];
+
+ //check we are able to allocate new rects
+ //check that rects in the atlas use unique surfaces
+ for (uint32_t i = 0; i < MAX_RECTS; i++) {
+ VDRects[i] = atlas.requestNewEntry(10, 10, renderThread.getGrContext());
+ ASSERT_TRUE(VDRects[i].key != INVALID_ATLAS_KEY);
+ ASSERT_TRUE(VDRects[i].surface.get() != nullptr);
+ ASSERT_TRUE(VDRects[i].rect.width() == 10 && VDRects[i].rect.height() == 10);
+
+ //nothing in the atlas should use the same surface
+ for (uint32_t j = 0; j < i; j++) {
+ ASSERT_NE(VDRects[i].surface.get(), VDRects[j].surface.get());
+ }
+ }
+}
+
+RENDERTHREAD_SKIA_PIPELINE_TEST(VectorDrawableAtlas, repack) {
+ VectorDrawableAtlas atlas(100*100);
+ ASSERT_FALSE(atlas.isFragmented());
+ atlas.prepareForDraw(renderThread.getGrContext());
+ ASSERT_FALSE(atlas.isFragmented());
+ //create 150 rects 10x10, which won't fit in the atlas (atlas can fit no more than 100 rects)
+ const int MAX_RECTS = 150;
+ AtlasEntry VDRects[MAX_RECTS];
+
+ sk_sp<SkSurface> atlasSurface;
+
+ //fill the atlas with check we are able to allocate new rects
+ for (uint32_t i = 0; i < MAX_RECTS; i++) {
+ VDRects[i] = atlas.requestNewEntry(10, 10, renderThread.getGrContext());
+ if (0 == i) {
+ atlasSurface = VDRects[0].surface;
+ }
+ ASSERT_TRUE(VDRects[i].key != INVALID_ATLAS_KEY);
+ }
+
+ ASSERT_FALSE(atlas.isFragmented());
+
+ //first 1/3 rects should all be in the same surface
+ for (uint32_t i = 1; i < MAX_RECTS/3; i++) {
+ ASSERT_NE(VDRects[i].key, VDRects[0].key);
+ ASSERT_EQ(VDRects[i].surface.get(), atlasSurface.get());
+ }
+
+ //release all entries
+ for (uint32_t i = 0; i < MAX_RECTS; i++) {
+ auto VDRect = atlas.getEntry(VDRects[i].key);
+ ASSERT_TRUE(VDRect.key != INVALID_ATLAS_KEY);
+ atlas.releaseEntry(VDRect.key);
+ }
+
+ ASSERT_FALSE(atlas.isFragmented());
+
+ //allocate 4x4 rects, which will fragment the atlas badly, because each entry occupies a 10x10
+ //area
+ for (uint32_t i = 0; i < 4*MAX_RECTS; i++) {
+ AtlasEntry entry = atlas.requestNewEntry(4, 4, renderThread.getGrContext());
+ ASSERT_TRUE(entry.key != INVALID_ATLAS_KEY);
+ }
+
+ ASSERT_TRUE(atlas.isFragmented());
+
+ atlas.repackIfNeeded(renderThread.getGrContext());
+
+ ASSERT_FALSE(atlas.isFragmented());
+}
\ No newline at end of file
diff --git a/lowpan/Android.mk b/lowpan/Android.mk
deleted file mode 100644
index 9e9164f..0000000
--- a/lowpan/Android.mk
+++ /dev/null
@@ -1,31 +0,0 @@
-#
-# Copyright (C) 2017 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.
-#
-
-LOCAL_PATH := $(call my-dir)
-
-ifneq (,$(findstring lowpan/java,$(FRAMEWORKS_BASE_SUBDIRS)))
-include $(CLEAR_VARS)
-LOCAL_MODULE := libandroid_net_lowpan
-LOCAL_MODULE_TAGS := optional
-LOCAL_SHARED_LIBRARIES += libbase
-LOCAL_SHARED_LIBRARIES += libbinder
-LOCAL_SHARED_LIBRARIES += libutils
-LOCAL_AIDL_INCLUDES += frameworks/native/aidl/binder
-LOCAL_AIDL_INCLUDES += frameworks/base/lowpan/java
-LOCAL_AIDL_INCLUDES += frameworks/base/core/java
-LOCAL_SRC_FILES += $(call all-Iaidl-files-under, java/android/net/lowpan)
-include $(BUILD_SHARED_LIBRARY)
-endif
diff --git a/lowpan/java/android/net/lowpan/ILowpanInterface.aidl b/lowpan/java/android/net/lowpan/ILowpanInterface.aidl
index 647fcc1..603dc3c 100644
--- a/lowpan/java/android/net/lowpan/ILowpanInterface.aidl
+++ b/lowpan/java/android/net/lowpan/ILowpanInterface.aidl
@@ -16,65 +16,39 @@
package android.net.lowpan;
+import android.net.IpPrefix;
+import android.net.lowpan.ILowpanEnergyScanCallback;
import android.net.lowpan.ILowpanInterfaceListener;
import android.net.lowpan.ILowpanNetScanCallback;
-import android.net.lowpan.ILowpanEnergyScanCallback;
-import android.os.PersistableBundle;
-import android.net.IpPrefix;
+import android.net.lowpan.LowpanBeaconInfo;
+import android.net.lowpan.LowpanChannelInfo;
+import android.net.lowpan.LowpanCredential;
+import android.net.lowpan.LowpanIdentity;
+import android.net.lowpan.LowpanProvision;
/** {@hide} */
interface ILowpanInterface {
- //////////////////////////////////////////////////////////////////////////
- // Permission String Constants
-
- /* These are here for the sake of C++ interface implementations. */
+ // These are here for the sake of C++ interface implementations.
const String PERM_ACCESS_LOWPAN_STATE = "android.permission.ACCESS_LOWPAN_STATE";
const String PERM_CHANGE_LOWPAN_STATE = "android.permission.CHANGE_LOWPAN_STATE";
const String PERM_READ_LOWPAN_CREDENTIAL = "android.permission.READ_LOWPAN_CREDENTIAL";
- //////////////////////////////////////////////////////////////////////////
- // Property Key Constants
-
- const String KEY_INTERFACE_ENABLED = "android.net.lowpan.property.INTERFACE_ENABLED";
- const String KEY_INTERFACE_UP = "android.net.lowpan.property.INTERFACE_UP";
- const String KEY_INTERFACE_COMMISSIONED = "android.net.lowpan.property.INTERFACE_COMMISSIONED";
- const String KEY_INTERFACE_CONNECTED = "android.net.lowpan.property.INTERFACE_CONNECTED";
- const String KEY_INTERFACE_STATE = "android.net.lowpan.property.INTERFACE_STATE";
-
- const String KEY_NETWORK_NAME = "android.net.lowpan.property.NETWORK_NAME";
- const String KEY_NETWORK_TYPE = "android.net.lowpan.property.NETWORK_TYPE";
- const String KEY_NETWORK_PANID = "android.net.lowpan.property.NETWORK_PANID";
- const String KEY_NETWORK_XPANID = "android.net.lowpan.property.NETWORK_XPANID";
- const String KEY_NETWORK_ROLE = "android.net.lowpan.property.NETWORK_ROLE";
- const String KEY_NETWORK_MASTER_KEY = "android.net.lowpan.property.NETWORK_MASTER_KEY";
- const String KEY_NETWORK_MASTER_KEY_INDEX
- = "android.net.lowpan.property.NETWORK_MASTER_KEY_INDEX";
-
- const String KEY_SUPPORTED_CHANNELS = "android.net.lowpan.property.SUPPORTED_CHANNELS";
- const String KEY_CHANNEL = "android.net.lowpan.property.CHANNEL";
+ /**
+ * Channel mask key.
+ * Used for setting a channel mask when starting a scan.
+ * Type: int[]
+ * */
const String KEY_CHANNEL_MASK = "android.net.lowpan.property.CHANNEL_MASK";
+
+ /**
+ * Max Transmit Power Key.
+ * Used for setting the maximum transmit power when starting a network scan.
+ * Type: Integer
+ * */
const String KEY_MAX_TX_POWER = "android.net.lowpan.property.MAX_TX_POWER";
- const String KEY_RSSI = "android.net.lowpan.property.RSSI";
- const String KEY_LQI = "android.net.lowpan.property.LQI";
- const String KEY_LINK_ADDRESS_ARRAY = "android.net.lowpan.property.LINK_ADDRESS_ARRAY";
- const String KEY_ROUTE_INFO_ARRAY = "android.net.lowpan.property.ROUTE_INFO_ARRAY";
-
- const String KEY_BEACON_ADDRESS = "android.net.lowpan.property.BEACON_ORIGIN_ADDRESS";
- const String KEY_BEACON_CAN_ASSIST = "android.net.lowpan.property.BEACON_CAN_ASSIST";
-
- const String DRIVER_VERSION = "android.net.lowpan.property.DRIVER_VERSION";
- const String NCP_VERSION = "android.net.lowpan.property.NCP_VERSION";
-
- /** @hide */
- const String KEY_EXTENDED_ADDRESS = "android.net.lowpan.property.EXTENDED_ADDRESS";
-
- /** @hide */
- const String KEY_MAC_ADDRESS = "android.net.lowpan.property.MAC_ADDRESS";
-
- //////////////////////////////////////////////////////////////////////////
// Interface States
const String STATE_OFFLINE = "offline";
@@ -83,58 +57,87 @@
const String STATE_ATTACHED = "attached";
const String STATE_FAULT = "fault";
- //////////////////////////////////////////////////////////////////////////
// Device Roles
const String ROLE_END_DEVICE = "end-device";
const String ROLE_ROUTER = "router";
const String ROLE_SLEEPY_END_DEVICE = "sleepy-end-device";
const String ROLE_SLEEPY_ROUTER = "sleepy-router";
- const String ROLE_UNKNOWN = "unknown";
+ const String ROLE_LEADER = "leader";
+ const String ROLE_COORDINATOR = "coordinator";
+ const String ROLE_DETACHED = "detached";
- //////////////////////////////////////////////////////////////////////////
+ const String NETWORK_TYPE_UNKNOWN = "unknown";
+
+ /**
+ * Network type for Thread 1.x networks.
+ *
+ * @see android.net.lowpan.LowpanIdentity#getType
+ * @see #getLowpanIdentity
+ */
+ const String NETWORK_TYPE_THREAD_V1 = "org.threadgroup.thread.v1";
+
// Service-Specific Error Code Constants
const int ERROR_UNSPECIFIED = 1;
const int ERROR_INVALID_ARGUMENT = 2;
const int ERROR_DISABLED = 3;
const int ERROR_WRONG_STATE = 4;
- const int ERROR_INVALID_TYPE = 5;
- const int ERROR_INVALID_VALUE = 6;
- const int ERROR_TIMEOUT = 7;
- const int ERROR_IO_FAILURE = 8;
- const int ERROR_BUSY = 9;
- const int ERROR_ALREADY = 10;
- const int ERROR_CANCELED = 11;
- const int ERROR_CREDENTIAL_NEEDED = 12;
- const int ERROR_FEATURE_NOT_SUPPORTED = 14;
- const int ERROR_PROPERTY_NOT_FOUND = 16;
- const int ERROR_JOIN_FAILED_UNKNOWN = 18;
- const int ERROR_JOIN_FAILED_AT_SCAN = 19;
- const int ERROR_JOIN_FAILED_AT_AUTH = 20;
- const int ERROR_FORM_FAILED_AT_SCAN = 21;
- const int ERROR_NCP_PROBLEM = 27;
- const int ERROR_PERMISSION_DENIED = 28;
+ const int ERROR_TIMEOUT = 5;
+ const int ERROR_IO_FAILURE = 6;
+ const int ERROR_NCP_PROBLEM = 7;
+ const int ERROR_BUSY = 8;
+ const int ERROR_ALREADY = 9;
+ const int ERROR_CANCELED = 10;
+ const int ERROR_FEATURE_NOT_SUPPORTED = 11;
+ const int ERROR_JOIN_FAILED_UNKNOWN = 12;
+ const int ERROR_JOIN_FAILED_AT_SCAN = 13;
+ const int ERROR_JOIN_FAILED_AT_AUTH = 14;
+ const int ERROR_FORM_FAILED_AT_SCAN = 15;
- //////////////////////////////////////////////////////////////////////////
// Methods
@utf8InCpp String getName();
- void join(in Map parameters);
- void form(in Map parameters);
+ @utf8InCpp String getNcpVersion();
+ @utf8InCpp String getDriverVersion();
+ LowpanChannelInfo[] getSupportedChannels();
+ @utf8InCpp String[] getSupportedNetworkTypes();
+ byte[] getMacAddress();
+
+ boolean isEnabled();
+ void setEnabled(boolean enabled);
+
+ boolean isUp();
+ boolean isCommissioned();
+ boolean isConnected();
+ @utf8InCpp String getState();
+
+ @utf8InCpp String getRole();
+ @utf8InCpp String getPartitionId();
+ byte[] getExtendedAddress();
+
+ LowpanIdentity getLowpanIdentity();
+ LowpanCredential getLowpanCredential();
+
+ @utf8InCpp String[] getLinkAddresses();
+ IpPrefix[] getLinkNetworks();
+
+ void join(in LowpanProvision provision);
+ void form(in LowpanProvision provision);
+ void attach(in LowpanProvision provision);
void leave();
void reset();
+ void startCommissioningSession(in LowpanBeaconInfo beaconInfo);
+ void closeCommissioningSession();
+ oneway void sendToCommissioner(in byte[] packet);
+
void beginLowPower();
- void pollForData();
+ oneway void pollForData();
oneway void onHostWake();
- @utf8InCpp String[] getPropertyKeys();
- Map getProperties(in @utf8InCpp String[] keys);
- void setProperties(in Map properties);
-
void addListener(ILowpanInterfaceListener listener);
oneway void removeListener(ILowpanInterfaceListener listener);
@@ -149,6 +152,4 @@
void addExternalRoute(in IpPrefix prefix, int flags);
oneway void removeExternalRoute(in IpPrefix prefix);
-
- @utf8InCpp String getPropertyAsString(@utf8InCpp String key);
}
diff --git a/lowpan/java/android/net/lowpan/ILowpanInterfaceListener.aidl b/lowpan/java/android/net/lowpan/ILowpanInterfaceListener.aidl
index c99d732..5e4049a 100644
--- a/lowpan/java/android/net/lowpan/ILowpanInterfaceListener.aidl
+++ b/lowpan/java/android/net/lowpan/ILowpanInterfaceListener.aidl
@@ -16,7 +16,30 @@
package android.net.lowpan;
+import android.net.IpPrefix;
+import android.net.lowpan.LowpanIdentity;
+
/** {@hide} */
interface ILowpanInterfaceListener {
- oneway void onPropertiesChanged(in Map properties);
+ oneway void onEnabledChanged(boolean value);
+
+ oneway void onConnectedChanged(boolean value);
+
+ oneway void onUpChanged(boolean value);
+
+ oneway void onRoleChanged(@utf8InCpp String value);
+
+ oneway void onStateChanged(@utf8InCpp String value);
+
+ oneway void onLowpanIdentityChanged(in LowpanIdentity value);
+
+ oneway void onLinkNetworkAdded(in IpPrefix value);
+
+ oneway void onLinkNetworkRemoved(in IpPrefix value);
+
+ oneway void onLinkAddressAdded(@utf8InCpp String value);
+
+ oneway void onLinkAddressRemoved(@utf8InCpp String value);
+
+ oneway void onReceiveFromCommissioner(in byte[] packet);
}
diff --git a/lowpan/java/android/net/lowpan/ILowpanManager.aidl b/lowpan/java/android/net/lowpan/ILowpanManager.aidl
index 5a8d7dc..326aa65 100644
--- a/lowpan/java/android/net/lowpan/ILowpanManager.aidl
+++ b/lowpan/java/android/net/lowpan/ILowpanManager.aidl
@@ -21,6 +21,7 @@
/** {@hide} */
interface ILowpanManager {
+ /* Keep this in sync with Context.LOWPAN_SERVICE */
const String LOWPAN_SERVICE_NAME = "lowpan";
ILowpanInterface getInterface(@utf8InCpp String name);
diff --git a/lowpan/java/android/net/lowpan/ILowpanNetScanCallback.aidl b/lowpan/java/android/net/lowpan/ILowpanNetScanCallback.aidl
index c20a6f8..9743fce 100644
--- a/lowpan/java/android/net/lowpan/ILowpanNetScanCallback.aidl
+++ b/lowpan/java/android/net/lowpan/ILowpanNetScanCallback.aidl
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2016 The Android Open Source Project
+ * Copyright (C) 2017 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.
@@ -16,8 +16,10 @@
package android.net.lowpan;
+import android.net.lowpan.LowpanBeaconInfo;
+
/** {@hide} */
interface ILowpanNetScanCallback {
- oneway void onNetScanBeacon(in Map parameters);
+ oneway void onNetScanBeacon(in LowpanBeaconInfo beacon);
oneway void onNetScanFinished();
}
diff --git a/lowpan/java/android/net/lowpan/InterfaceDisabledException.java b/lowpan/java/android/net/lowpan/InterfaceDisabledException.java
new file mode 100644
index 0000000..e917d45
--- /dev/null
+++ b/lowpan/java/android/net/lowpan/InterfaceDisabledException.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2017 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.net.lowpan;
+
+/**
+ * Exception indicating this operation requires the interface to be enabled.
+ *
+ * @see LowpanInterface
+ * @hide
+ */
+// @SystemApi
+public class InterfaceDisabledException extends LowpanException {
+
+ public InterfaceDisabledException() {}
+
+ public InterfaceDisabledException(String message) {
+ super(message);
+ }
+
+ public InterfaceDisabledException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ protected InterfaceDisabledException(Exception cause) {
+ super(cause);
+ }
+}
diff --git a/lowpan/java/android/net/lowpan/JoinFailedAtAuthException.java b/lowpan/java/android/net/lowpan/JoinFailedAtAuthException.java
new file mode 100644
index 0000000..7aceb71
--- /dev/null
+++ b/lowpan/java/android/net/lowpan/JoinFailedAtAuthException.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2017 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.net.lowpan;
+
+/**
+ * Exception indicating the join operation was unable to find the given network.
+ *
+ * @see LowpanInterface
+ * @hide
+ */
+// @SystemApi
+public class JoinFailedAtAuthException extends JoinFailedException {
+
+ public JoinFailedAtAuthException() {}
+
+ public JoinFailedAtAuthException(String message) {
+ super(message);
+ }
+
+ public JoinFailedAtAuthException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public JoinFailedAtAuthException(Exception cause) {
+ super(cause);
+ }
+}
diff --git a/lowpan/java/android/net/lowpan/JoinFailedAtScanException.java b/lowpan/java/android/net/lowpan/JoinFailedAtScanException.java
new file mode 100644
index 0000000..a4346f98
--- /dev/null
+++ b/lowpan/java/android/net/lowpan/JoinFailedAtScanException.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2017 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.net.lowpan;
+
+/**
+ * Exception indicating the join operation was unable to find the given network.
+ *
+ * @see LowpanInterface
+ * @hide
+ */
+// @SystemApi
+public class JoinFailedAtScanException extends JoinFailedException {
+
+ public JoinFailedAtScanException() {}
+
+ public JoinFailedAtScanException(String message) {
+ super(message);
+ }
+
+ public JoinFailedAtScanException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public JoinFailedAtScanException(Exception cause) {
+ super(cause);
+ }
+}
diff --git a/lowpan/java/android/net/lowpan/JoinFailedException.java b/lowpan/java/android/net/lowpan/JoinFailedException.java
new file mode 100644
index 0000000..e51d382
--- /dev/null
+++ b/lowpan/java/android/net/lowpan/JoinFailedException.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2017 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.net.lowpan;
+
+/**
+ * Exception indicating the join operation has failed.
+ *
+ * @see LowpanInterface
+ * @hide
+ */
+// @SystemApi
+public class JoinFailedException extends LowpanException {
+
+ public JoinFailedException() {}
+
+ public JoinFailedException(String message) {
+ super(message);
+ }
+
+ public JoinFailedException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ protected JoinFailedException(Exception cause) {
+ super(cause);
+ }
+}
diff --git a/lowpan/java/android/net/lowpan/LowpanBeaconInfo.aidl b/lowpan/java/android/net/lowpan/LowpanBeaconInfo.aidl
new file mode 100644
index 0000000..9464fea
--- /dev/null
+++ b/lowpan/java/android/net/lowpan/LowpanBeaconInfo.aidl
@@ -0,0 +1,19 @@
+/**
+ * Copyright (C) 2017 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.net.lowpan;
+
+parcelable LowpanBeaconInfo cpp_header "android/net/lowpan/LowpanBeaconInfo.h";
diff --git a/lowpan/java/android/net/lowpan/LowpanBeaconInfo.java b/lowpan/java/android/net/lowpan/LowpanBeaconInfo.java
index b344527..345a4c5 100644
--- a/lowpan/java/android/net/lowpan/LowpanBeaconInfo.java
+++ b/lowpan/java/android/net/lowpan/LowpanBeaconInfo.java
@@ -16,9 +16,12 @@
package android.net.lowpan;
+import android.os.Parcel;
+import android.os.Parcelable;
import com.android.internal.util.HexDump;
+import java.util.Arrays;
import java.util.Collection;
-import java.util.Map;
+import java.util.Objects;
import java.util.TreeSet;
/**
@@ -26,71 +29,94 @@
*
* @hide
*/
-//@SystemApi
-public class LowpanBeaconInfo extends LowpanIdentity {
+// @SystemApi
+public class LowpanBeaconInfo implements Parcelable {
+ public static final int UNKNOWN_RSSI = Integer.MAX_VALUE;
+ public static final int UNKNOWN_LQI = 0;
- private int mRssi = UNKNOWN;
- private int mLqi = UNKNOWN;
+ private LowpanIdentity mIdentity;
+ private int mRssi = UNKNOWN_RSSI;
+ private int mLqi = UNKNOWN_LQI;
private byte[] mBeaconAddress = null;
private final TreeSet<Integer> mFlags = new TreeSet<>();
public static final int FLAG_CAN_ASSIST = 1;
- static class Builder extends LowpanIdentity.Builder {
- private final LowpanBeaconInfo identity = new LowpanBeaconInfo();
+ /** @hide */
+ public static class Builder {
+ final LowpanIdentity.Builder mIdentityBuilder = new LowpanIdentity.Builder();
+ final LowpanBeaconInfo mBeaconInfo = new LowpanBeaconInfo();
+
+ public Builder setLowpanIdentity(LowpanIdentity x) {
+ mIdentityBuilder.setLowpanIdentity(x);
+ return this;
+ }
+
+ public Builder setName(String x) {
+ mIdentityBuilder.setName(x);
+ return this;
+ }
+
+ public Builder setXpanid(byte x[]) {
+ mIdentityBuilder.setXpanid(x);
+ return this;
+ }
+
+ public Builder setPanid(int x) {
+ mIdentityBuilder.setPanid(x);
+ return this;
+ }
+
+ public Builder setChannel(int x) {
+ mIdentityBuilder.setChannel(x);
+ return this;
+ }
+
+ public Builder setType(String x) {
+ mIdentityBuilder.setType(x);
+ return this;
+ }
public Builder setRssi(int x) {
- identity.mRssi = x;
+ mBeaconInfo.mRssi = x;
return this;
}
public Builder setLqi(int x) {
- identity.mLqi = x;
+ mBeaconInfo.mLqi = x;
return this;
}
public Builder setBeaconAddress(byte x[]) {
- identity.mBeaconAddress = x.clone();
+ mBeaconInfo.mBeaconAddress = (x != null ? x.clone() : null);
return this;
}
public Builder setFlag(int x) {
- identity.mFlags.add(x);
+ mBeaconInfo.mFlags.add(x);
return this;
}
public Builder setFlags(Collection<Integer> x) {
- identity.mFlags.addAll(x);
- return this;
- }
-
- /** @hide */
- Builder updateFromMap(Map map) {
- if (map.containsKey(LowpanProperties.KEY_RSSI.getName())) {
- setRssi(LowpanProperties.KEY_RSSI.getFromMap(map));
- }
- if (map.containsKey(LowpanProperties.KEY_LQI.getName())) {
- setLqi(LowpanProperties.KEY_LQI.getFromMap(map));
- }
- if (map.containsKey(LowpanProperties.KEY_BEACON_ADDRESS.getName())) {
- setBeaconAddress(LowpanProperties.KEY_BEACON_ADDRESS.getFromMap(map));
- }
- identity.mFlags.clear();
- if (map.containsKey(LowpanProperties.KEY_BEACON_CAN_ASSIST.getName())
- && LowpanProperties.KEY_BEACON_CAN_ASSIST.getFromMap(map).booleanValue()) {
- setFlag(FLAG_CAN_ASSIST);
- }
- super.updateFromMap(map);
+ mBeaconInfo.mFlags.addAll(x);
return this;
}
public LowpanBeaconInfo build() {
- return identity;
+ mBeaconInfo.mIdentity = mIdentityBuilder.build();
+ if (mBeaconInfo.mBeaconAddress == null) {
+ mBeaconInfo.mBeaconAddress = new byte[0];
+ }
+ return mBeaconInfo;
}
}
private LowpanBeaconInfo() {}
+ public LowpanIdentity getLowpanIdentity() {
+ return mIdentity;
+ }
+
public int getRssi() {
return mRssi;
}
@@ -104,7 +130,7 @@
}
public Collection<Integer> getFlags() {
- return mFlags.clone();
+ return (Collection<Integer>) mFlags.clone();
}
public boolean isFlagSet(int flag) {
@@ -112,26 +138,21 @@
}
@Override
- void addToMap(Map<String, Object> parameters) {
- super.addToMap(parameters);
- }
-
- @Override
public String toString() {
StringBuffer sb = new StringBuffer();
- sb.append(super.toString());
+ sb.append(mIdentity.toString());
- if (mRssi != UNKNOWN) {
- sb.append(", RSSI: ").append(mRssi);
+ if (mRssi != UNKNOWN_RSSI) {
+ sb.append(", RSSI:").append(mRssi).append("dBm");
}
- if (mLqi != UNKNOWN) {
- sb.append(", LQI: ").append(mLqi);
+ if (mLqi != UNKNOWN_LQI) {
+ sb.append(", LQI:").append(mLqi);
}
- if (mBeaconAddress != null) {
- sb.append(", BeaconAddress: ").append(HexDump.toHexString(mBeaconAddress));
+ if (mBeaconAddress.length > 0) {
+ sb.append(", BeaconAddress:").append(HexDump.toHexString(mBeaconAddress));
}
for (Integer flag : mFlags) {
@@ -147,4 +168,67 @@
return sb.toString();
}
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mIdentity, mRssi, mLqi, Arrays.hashCode(mBeaconAddress), mFlags);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof LowpanBeaconInfo)) {
+ return false;
+ }
+ LowpanBeaconInfo rhs = (LowpanBeaconInfo) obj;
+ return mIdentity.equals(rhs.mIdentity)
+ && Arrays.equals(mBeaconAddress, rhs.mBeaconAddress)
+ && mRssi == rhs.mRssi
+ && mLqi == rhs.mLqi
+ && mFlags.equals(rhs.mFlags);
+ }
+
+ /** Implement the Parcelable interface. */
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ /** Implement the Parcelable interface. */
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ mIdentity.writeToParcel(dest, flags);
+ dest.writeInt(mRssi);
+ dest.writeInt(mLqi);
+ dest.writeByteArray(mBeaconAddress);
+
+ dest.writeInt(mFlags.size());
+ for (Integer val : mFlags) {
+ dest.writeInt(val);
+ }
+ }
+
+ /** Implement the Parcelable interface. */
+ public static final Creator<LowpanBeaconInfo> CREATOR =
+ new Creator<LowpanBeaconInfo>() {
+ public LowpanBeaconInfo createFromParcel(Parcel in) {
+ Builder builder = new Builder();
+
+ builder.setLowpanIdentity(LowpanIdentity.CREATOR.createFromParcel(in));
+
+ builder.setRssi(in.readInt());
+ builder.setLqi(in.readInt());
+
+ builder.setBeaconAddress(in.createByteArray());
+
+ for (int i = in.readInt(); i > 0; i--) {
+ builder.setFlag(in.readInt());
+ }
+
+ return builder.build();
+ }
+
+ public LowpanBeaconInfo[] newArray(int size) {
+ return new LowpanBeaconInfo[size];
+ }
+ };
}
diff --git a/lowpan/java/android/net/lowpan/LowpanChannelInfo.aidl b/lowpan/java/android/net/lowpan/LowpanChannelInfo.aidl
new file mode 100644
index 0000000..0676deb
--- /dev/null
+++ b/lowpan/java/android/net/lowpan/LowpanChannelInfo.aidl
@@ -0,0 +1,19 @@
+/**
+ * Copyright (C) 2017 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.net.lowpan;
+
+parcelable LowpanChannelInfo cpp_header "android/net/lowpan/LowpanChannelInfo.h";
diff --git a/lowpan/java/android/net/lowpan/LowpanChannelInfo.java b/lowpan/java/android/net/lowpan/LowpanChannelInfo.java
index 50afe6d..52b1c6d 100644
--- a/lowpan/java/android/net/lowpan/LowpanChannelInfo.java
+++ b/lowpan/java/android/net/lowpan/LowpanChannelInfo.java
@@ -16,25 +16,66 @@
package android.net.lowpan;
+import android.os.Parcel;
+import android.os.Parcelable;
+import java.util.Objects;
-/** Provides detailed information about a given channel. */
-//@SystemApi
-public class LowpanChannelInfo {
+/**
+ * Provides detailed information about a given channel.
+ *
+ * @hide
+ */
+// @SystemApi
+public class LowpanChannelInfo implements Parcelable {
public static final int UNKNOWN_POWER = Integer.MAX_VALUE;
+ public static final float UNKNOWN_FREQUENCY = 0.0f;
+ public static final float UNKNOWN_BANDWIDTH = 0.0f;
- //////////////////////////////////////////////////////////////////////////
- // Instance Variables
-
- private String mName = null;
private int mIndex = 0;
- private boolean mIsMaskedByRegulatoryDomain = false;
- private float mSpectrumCenterFrequency = 0.0f;
- private float mSpectrumBandwidth = 0.0f;
+ private String mName = null;
+ private float mSpectrumCenterFrequency = UNKNOWN_FREQUENCY;
+ private float mSpectrumBandwidth = UNKNOWN_BANDWIDTH;
private int mMaxTransmitPower = UNKNOWN_POWER;
+ private boolean mIsMaskedByRegulatoryDomain = false;
- //////////////////////////////////////////////////////////////////////////
- // Public Getters and Setters
+ /** @hide */
+ public static LowpanChannelInfo getChannelInfoForIeee802154Page0(int index) {
+ LowpanChannelInfo info = new LowpanChannelInfo();
+
+ if (index < 0) {
+ info = null;
+
+ } else if (index == 0) {
+ info.mSpectrumCenterFrequency = 868300000.0f;
+ info.mSpectrumBandwidth = 600000.0f;
+
+ } else if (index < 11) {
+ info.mSpectrumCenterFrequency = 906000000.0f - (2000000.0f * 1) + 2000000.0f * (index);
+ info.mSpectrumBandwidth = 0; // Unknown
+
+ } else if (index < 26) {
+ info.mSpectrumCenterFrequency =
+ 2405000000.0f - (5000000.0f * 11) + 5000000.0f * (index);
+ info.mSpectrumBandwidth = 2000000.0f;
+
+ } else {
+ info = null;
+ }
+
+ info.mName = Integer.toString(index);
+
+ return info;
+ }
+
+ private LowpanChannelInfo() {}
+
+ private LowpanChannelInfo(int index, String name, float cf, float bw) {
+ mIndex = index;
+ mName = name;
+ mSpectrumCenterFrequency = cf;
+ mSpectrumBandwidth = bw;
+ }
public String getName() {
return mName;
@@ -66,22 +107,110 @@
sb.append("Channel ").append(mIndex);
- if (mName != null) {
+ if (mName != null && !mName.equals(Integer.toString(mIndex))) {
sb.append(" (").append(mName).append(")");
}
if (mSpectrumCenterFrequency > 0.0f) {
- sb.append(", SpectrumCenterFrequency: ").append(mSpectrumCenterFrequency).append("Hz");
+ if (mSpectrumCenterFrequency > 1000000000.0f) {
+ sb.append(", SpectrumCenterFrequency: ")
+ .append(mSpectrumCenterFrequency / 1000000000.0f)
+ .append("GHz");
+ } else if (mSpectrumCenterFrequency > 1000000.0f) {
+ sb.append(", SpectrumCenterFrequency: ")
+ .append(mSpectrumCenterFrequency / 1000000.0f)
+ .append("MHz");
+ } else {
+ sb.append(", SpectrumCenterFrequency: ")
+ .append(mSpectrumCenterFrequency / 1000.0f)
+ .append("kHz");
+ }
}
if (mSpectrumBandwidth > 0.0f) {
- sb.append(", SpectrumBandwidth: ").append(mSpectrumBandwidth).append("Hz");
+ if (mSpectrumBandwidth > 1000000000.0f) {
+ sb.append(", SpectrumBandwidth: ")
+ .append(mSpectrumBandwidth / 1000000000.0f)
+ .append("GHz");
+ } else if (mSpectrumBandwidth > 1000000.0f) {
+ sb.append(", SpectrumBandwidth: ")
+ .append(mSpectrumBandwidth / 1000000.0f)
+ .append("MHz");
+ } else {
+ sb.append(", SpectrumBandwidth: ")
+ .append(mSpectrumBandwidth / 1000.0f)
+ .append("kHz");
+ }
}
if (mMaxTransmitPower != UNKNOWN_POWER) {
- sb.append(", MaxTransmitPower: ").append(mMaxTransmitPower);
+ sb.append(", MaxTransmitPower: ").append(mMaxTransmitPower).append("dBm");
}
return sb.toString();
}
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof LowpanChannelInfo)) {
+ return false;
+ }
+ LowpanChannelInfo rhs = (LowpanChannelInfo) obj;
+ return Objects.equals(mName, rhs.mName)
+ && mIndex == rhs.mIndex
+ && mIsMaskedByRegulatoryDomain == rhs.mIsMaskedByRegulatoryDomain
+ && mSpectrumCenterFrequency == rhs.mSpectrumCenterFrequency
+ && mSpectrumBandwidth == rhs.mSpectrumBandwidth
+ && mMaxTransmitPower == rhs.mMaxTransmitPower;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(
+ mName,
+ mIndex,
+ mIsMaskedByRegulatoryDomain,
+ mSpectrumCenterFrequency,
+ mSpectrumBandwidth,
+ mMaxTransmitPower);
+ }
+
+ /** Implement the Parcelable interface. */
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ /** Implement the Parcelable interface. */
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeInt(mIndex);
+ dest.writeString(mName);
+ dest.writeFloat(mSpectrumCenterFrequency);
+ dest.writeFloat(mSpectrumBandwidth);
+ dest.writeInt(mMaxTransmitPower);
+ dest.writeBoolean(mIsMaskedByRegulatoryDomain);
+ }
+
+ /** Implement the Parcelable interface. */
+ public static final Creator<LowpanChannelInfo> CREATOR =
+ new Creator<LowpanChannelInfo>() {
+
+ public LowpanChannelInfo createFromParcel(Parcel in) {
+ LowpanChannelInfo info = new LowpanChannelInfo();
+
+ info.mIndex = in.readInt();
+ info.mName = in.readString();
+ info.mSpectrumCenterFrequency = in.readFloat();
+ info.mSpectrumBandwidth = in.readFloat();
+ info.mMaxTransmitPower = in.readInt();
+ info.mIsMaskedByRegulatoryDomain = in.readBoolean();
+
+ return info;
+ }
+
+ public LowpanChannelInfo[] newArray(int size) {
+ return new LowpanChannelInfo[size];
+ }
+ };
}
diff --git a/lowpan/java/android/net/lowpan/LowpanCommissioningSession.java b/lowpan/java/android/net/lowpan/LowpanCommissioningSession.java
index 9cad00c..8f75e8d 100644
--- a/lowpan/java/android/net/lowpan/LowpanCommissioningSession.java
+++ b/lowpan/java/android/net/lowpan/LowpanCommissioningSession.java
@@ -18,9 +18,11 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.net.Network;
+import android.net.IpPrefix;
+import android.os.DeadObjectException;
import android.os.Handler;
-import java.net.InetSocketAddress;
+import android.os.Looper;
+import android.os.RemoteException;
/**
* Commissioning Session.
@@ -30,44 +32,192 @@
*
* @hide
*/
-//@SystemApi
-public abstract class LowpanCommissioningSession {
- public LowpanCommissioningSession() {}
+// @SystemApi
+public class LowpanCommissioningSession {
+
+ private final ILowpanInterface mBinder;
+ private final LowpanBeaconInfo mBeaconInfo;
+ private final ILowpanInterfaceListener mInternalCallback = new InternalCallback();
+ private final Looper mLooper;
+ private Handler mHandler;
+ private Callback mCallback = null;
+ private volatile boolean mIsClosed = false;
/**
* Callback base class for {@link LowpanCommissioningSession}
*
* @hide
*/
- //@SystemApi
- public class Callback {
+ // @SystemApi
+ public abstract static class Callback {
public void onReceiveFromCommissioner(@NonNull byte[] packet) {};
public void onClosed() {};
}
+ private class InternalCallback extends ILowpanInterfaceListener.Stub {
+ @Override
+ public void onStateChanged(String value) {
+ if (!mIsClosed) {
+ switch (value) {
+ case ILowpanInterface.STATE_OFFLINE:
+ case ILowpanInterface.STATE_FAULT:
+ synchronized (LowpanCommissioningSession.this) {
+ lockedCleanup();
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onReceiveFromCommissioner(byte[] packet) {
+ mHandler.post(
+ () -> {
+ synchronized (LowpanCommissioningSession.this) {
+ if (!mIsClosed && (mCallback != null)) {
+ mCallback.onReceiveFromCommissioner(packet);
+ }
+ }
+ });
+ }
+
+ // We ignore all other callbacks.
+ @Override
+ public void onEnabledChanged(boolean value) {}
+
+ @Override
+ public void onConnectedChanged(boolean value) {}
+
+ @Override
+ public void onUpChanged(boolean value) {}
+
+ @Override
+ public void onRoleChanged(String value) {}
+
+ @Override
+ public void onLowpanIdentityChanged(LowpanIdentity value) {}
+
+ @Override
+ public void onLinkNetworkAdded(IpPrefix value) {}
+
+ @Override
+ public void onLinkNetworkRemoved(IpPrefix value) {}
+
+ @Override
+ public void onLinkAddressAdded(String value) {}
+
+ @Override
+ public void onLinkAddressRemoved(String value) {}
+ }
+
+ LowpanCommissioningSession(
+ ILowpanInterface binder, LowpanBeaconInfo beaconInfo, Looper looper) {
+ mBinder = binder;
+ mBeaconInfo = beaconInfo;
+ mLooper = looper;
+
+ if (mLooper != null) {
+ mHandler = new Handler(mLooper);
+ } else {
+ mHandler = new Handler();
+ }
+
+ try {
+ mBinder.addListener(mInternalCallback);
+
+ } catch (RemoteException x) {
+ throw x.rethrowAsRuntimeException();
+ }
+ }
+
+ private void lockedCleanup() {
+ // Note: this method is only called from synchronized contexts.
+
+ if (!mIsClosed) {
+ try {
+ mBinder.removeListener(mInternalCallback);
+
+ } catch (DeadObjectException x) {
+ /* We don't care if we receive a DOE at this point.
+ * DOE is as good as success as far as we are concerned.
+ */
+
+ } catch (RemoteException x) {
+ throw x.rethrowAsRuntimeException();
+ }
+
+ if (mCallback != null) {
+ mHandler.post(() -> mCallback.onClosed());
+ }
+ }
+
+ mCallback = null;
+ mIsClosed = true;
+ }
+
/** TODO: doc */
@NonNull
- public abstract LowpanBeaconInfo getBeaconInfo();
+ public LowpanBeaconInfo getBeaconInfo() {
+ return mBeaconInfo;
+ }
/** TODO: doc */
- public abstract void sendToCommissioner(@NonNull byte[] packet);
+ public void sendToCommissioner(@NonNull byte[] packet) {
+ if (!mIsClosed) {
+ try {
+ mBinder.sendToCommissioner(packet);
+
+ } catch (DeadObjectException x) {
+ /* This method is a best-effort delivery.
+ * We don't care if we receive a DOE at this point.
+ */
+
+ } catch (RemoteException x) {
+ throw x.rethrowAsRuntimeException();
+ }
+ }
+ }
/** TODO: doc */
- public abstract void setCallback(@Nullable Callback cb, @Nullable Handler handler);
+ public synchronized void setCallback(@Nullable Callback cb, @Nullable Handler handler) {
+ if (!mIsClosed) {
+ /* This class can be created with or without a default looper.
+ * Also, this method can be called with or without a specific
+ * handler. If a handler is specified, it is to always be used.
+ * Otherwise, if there was a Looper specified when this object
+ * was created, we create a new handle based on that looper.
+ * Otherwise we just create a default handler object. Since we
+ * don't really know how the previous handler was created, we
+ * end up always replacing it here. This isn't a huge problem
+ * because this method should be called infrequently.
+ */
+ if (handler != null) {
+ mHandler = handler;
+ } else if (mLooper != null) {
+ mHandler = new Handler(mLooper);
+ } else {
+ mHandler = new Handler();
+ }
+ mCallback = cb;
+ }
+ }
/** TODO: doc */
- public abstract void close();
+ public synchronized void close() {
+ if (!mIsClosed) {
+ try {
+ mBinder.closeCommissioningSession();
- /**
- * This method is largely for Nest Weave, as an alternative to {@link #sendToCommissioner()}
- * and @{link Callback#onReceiveFromCommissioner()}.
- *
- * <p>When used with the Network instance obtained from getNetwork(), the caller can use the
- * given InetSocketAddress to communicate with the commissioner using a UDP (or, under certain
- * circumstances, TCP) socket.
- */
- public abstract @Nullable InetSocketAddress getInetSocketAddress();
+ lockedCleanup();
- public abstract @Nullable Network getNetwork();
+ } catch (DeadObjectException x) {
+ /* We don't care if we receive a DOE at this point.
+ * DOE is as good as success as far as we are concerned.
+ */
+
+ } catch (RemoteException x) {
+ throw x.rethrowAsRuntimeException();
+ }
+ }
+ }
}
diff --git a/lowpan/java/android/net/lowpan/LowpanCredential.aidl b/lowpan/java/android/net/lowpan/LowpanCredential.aidl
new file mode 100644
index 0000000..af0c2d6
--- /dev/null
+++ b/lowpan/java/android/net/lowpan/LowpanCredential.aidl
@@ -0,0 +1,19 @@
+/**
+ * Copyright (C) 2017 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.net.lowpan;
+
+parcelable LowpanCredential cpp_header "android/net/lowpan/LowpanCredential.h";
diff --git a/lowpan/java/android/net/lowpan/LowpanCredential.java b/lowpan/java/android/net/lowpan/LowpanCredential.java
index dea4d78..e9126f9 100644
--- a/lowpan/java/android/net/lowpan/LowpanCredential.java
+++ b/lowpan/java/android/net/lowpan/LowpanCredential.java
@@ -16,16 +16,19 @@
package android.net.lowpan;
-
-import java.util.Map;
+import android.os.Parcel;
+import android.os.Parcelable;
+import com.android.internal.util.HexDump;
+import java.util.Arrays;
+import java.util.Objects;
/**
* Describes a credential for a LoWPAN network.
*
* @hide
*/
-//@SystemApi
-public class LowpanCredential {
+// @SystemApi
+public class LowpanCredential implements Parcelable {
public static final int UNSPECIFIED_KEY_INDEX = 0;
@@ -50,18 +53,18 @@
return new LowpanCredential(masterKey, keyIndex);
}
- public void setMasterKey(byte[] masterKey) {
+ void setMasterKey(byte[] masterKey) {
if (masterKey != null) {
masterKey = masterKey.clone();
}
mMasterKey = masterKey;
}
- public void setMasterKeyIndex(int keyIndex) {
+ void setMasterKeyIndex(int keyIndex) {
mMasterKeyIndex = keyIndex;
}
- public void setMasterKey(byte[] masterKey, int keyIndex) {
+ void setMasterKey(byte[] masterKey, int keyIndex) {
setMasterKey(masterKey);
setMasterKeyIndex(keyIndex);
}
@@ -81,13 +84,89 @@
return mMasterKey != null;
}
- void addToMap(Map<String, Object> parameters) throws LowpanException {
+ public String toSensitiveString() {
+ StringBuffer sb = new StringBuffer();
+
+ sb.append("<LowpanCredential");
+
if (isMasterKey()) {
- LowpanProperties.KEY_NETWORK_MASTER_KEY.putInMap(parameters, getMasterKey());
- LowpanProperties.KEY_NETWORK_MASTER_KEY_INDEX.putInMap(
- parameters, getMasterKeyIndex());
+ sb.append(" MasterKey:").append(HexDump.toHexString(mMasterKey));
+ if (mMasterKeyIndex != UNSPECIFIED_KEY_INDEX) {
+ sb.append(", Index:").append(mMasterKeyIndex);
+ }
} else {
- throw new LowpanException("Unsupported Network Credential");
+ sb.append(" empty");
}
+
+ sb.append(">");
+
+ return sb.toString();
}
+
+ @Override
+ public String toString() {
+ StringBuffer sb = new StringBuffer();
+
+ sb.append("<LowpanCredential");
+
+ if (isMasterKey()) {
+ // We don't print out the contents of the key here,
+ // we only do that in toSensitiveString.
+ sb.append(" MasterKey");
+ if (mMasterKeyIndex != UNSPECIFIED_KEY_INDEX) {
+ sb.append(", Index:").append(mMasterKeyIndex);
+ }
+ } else {
+ sb.append(" empty");
+ }
+
+ sb.append(">");
+
+ return sb.toString();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof LowpanCredential)) {
+ return false;
+ }
+ LowpanCredential rhs = (LowpanCredential) obj;
+ return Arrays.equals(mMasterKey, rhs.mMasterKey) && mMasterKeyIndex == rhs.mMasterKeyIndex;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(Arrays.hashCode(mMasterKey), mMasterKeyIndex);
+ }
+
+ /** Implement the Parcelable interface. */
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ /** Implement the Parcelable interface. */
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeByteArray(mMasterKey);
+ dest.writeInt(mMasterKeyIndex);
+ }
+
+ /** Implement the Parcelable interface. */
+ public static final Creator<LowpanCredential> CREATOR =
+ new Creator<LowpanCredential>() {
+
+ public LowpanCredential createFromParcel(Parcel in) {
+ LowpanCredential credential = new LowpanCredential();
+
+ credential.mMasterKey = in.createByteArray();
+ credential.mMasterKeyIndex = in.readInt();
+
+ return credential;
+ }
+
+ public LowpanCredential[] newArray(int size) {
+ return new LowpanCredential[size];
+ }
+ };
}
diff --git a/lowpan/java/android/net/lowpan/LowpanEnergyScanResult.java b/lowpan/java/android/net/lowpan/LowpanEnergyScanResult.java
index c680687..da87752 100644
--- a/lowpan/java/android/net/lowpan/LowpanEnergyScanResult.java
+++ b/lowpan/java/android/net/lowpan/LowpanEnergyScanResult.java
@@ -16,20 +16,19 @@
package android.net.lowpan;
-
/**
* Describes the result from one channel of an energy scan.
*
* @hide
*/
-//@SystemApi
+// @SystemApi
public class LowpanEnergyScanResult {
public static final int UNKNOWN = Integer.MAX_VALUE;
private int mChannel = UNKNOWN;
private int mMaxRssi = UNKNOWN;
- public LowpanEnergyScanResult() {}
+ LowpanEnergyScanResult() {}
public int getChannel() {
return mChannel;
@@ -39,11 +38,11 @@
return mMaxRssi;
}
- public void setChannel(int x) {
+ void setChannel(int x) {
mChannel = x;
}
- public void setMaxRssi(int x) {
+ void setMaxRssi(int x) {
mMaxRssi = x;
}
diff --git a/lowpan/java/android/net/lowpan/LowpanException.java b/lowpan/java/android/net/lowpan/LowpanException.java
index 8ff37f9..5dfce48 100644
--- a/lowpan/java/android/net/lowpan/LowpanException.java
+++ b/lowpan/java/android/net/lowpan/LowpanException.java
@@ -16,8 +16,6 @@
package android.net.lowpan;
-import android.os.DeadObjectException;
-import android.os.RemoteException;
import android.os.ServiceSpecificException;
import android.util.AndroidException;
@@ -28,263 +26,67 @@
* @see LowpanInterface
* @hide
*/
-//@SystemApi
+// @SystemApi
public class LowpanException extends AndroidException {
- // Make the eclipse warning about serializable exceptions go away
- private static final long serialVersionUID = 0x31863cbe562b0e11l; // randomly generated
-
- public static final int LOWPAN_ERROR = 1;
- public static final int LOWPAN_CREDENTIAL_NEEDED = 2;
- public static final int LOWPAN_DEAD = 3;
- public static final int LOWPAN_DISABLED = 4;
- public static final int LOWPAN_WRONG_STATE = 5;
- public static final int LOWPAN_BUSY = 7;
- public static final int LOWPAN_NCP_PROBLEM = 8;
- public static final int LOWPAN_ALREADY = 9;
- public static final int LOWPAN_CANCELED = 10;
- public static final int LOWPAN_FEATURE_NOT_SUPPORTED = 12;
- public static final int LOWPAN_PROPERTY_NOT_FOUND = 13;
- public static final int LOWPAN_JOIN_FAILED_UNKNOWN = 14;
- public static final int LOWPAN_JOIN_FAILED_AT_SCAN = 15;
- public static final int LOWPAN_JOIN_FAILED_AT_AUTH = 16;
- public static final int LOWPAN_FORM_FAILED_AT_SCAN = 17;
-
- /**
- * Convert ServiceSpecificExceptions and Binder RemoteExceptions from LoWPAN binder interfaces
- * into the correct public exceptions.
- *
- * @hide
- */
- public static void throwAsPublicException(Throwable t) throws LowpanException {
- if (t instanceof ServiceSpecificException) {
- ServiceSpecificException e = (ServiceSpecificException) t;
- int reason;
- switch (e.errorCode) {
- case ILowpanInterface.ERROR_INVALID_ARGUMENT:
- case ILowpanInterface.ERROR_INVALID_TYPE:
- case ILowpanInterface.ERROR_INVALID_VALUE:
- throw new IllegalArgumentException(e.getMessage(), e);
-
- case ILowpanInterface.ERROR_PERMISSION_DENIED:
- throw new SecurityException(e.getMessage(), e);
-
- case ILowpanInterface.ERROR_DISABLED:
- reason = LowpanException.LOWPAN_DISABLED;
- break;
-
- case ILowpanInterface.ERROR_WRONG_STATE:
- reason = LowpanException.LOWPAN_WRONG_STATE;
- break;
-
- case ILowpanInterface.ERROR_BUSY:
- reason = LowpanException.LOWPAN_BUSY;
- break;
-
- case ILowpanInterface.ERROR_ALREADY:
- reason = LowpanException.LOWPAN_ALREADY;
- break;
-
- case ILowpanInterface.ERROR_CANCELED:
- reason = LowpanException.LOWPAN_CANCELED;
- break;
-
- case ILowpanInterface.ERROR_CREDENTIAL_NEEDED:
- reason = LowpanException.LOWPAN_CREDENTIAL_NEEDED;
- break;
-
- case ILowpanInterface.ERROR_FEATURE_NOT_SUPPORTED:
- reason = LowpanException.LOWPAN_FEATURE_NOT_SUPPORTED;
- break;
-
- case ILowpanInterface.ERROR_PROPERTY_NOT_FOUND:
- reason = LowpanException.LOWPAN_PROPERTY_NOT_FOUND;
- break;
-
- case ILowpanInterface.ERROR_JOIN_FAILED_UNKNOWN:
- reason = LowpanException.LOWPAN_JOIN_FAILED_UNKNOWN;
- break;
-
- case ILowpanInterface.ERROR_JOIN_FAILED_AT_SCAN:
- reason = LowpanException.LOWPAN_JOIN_FAILED_AT_SCAN;
- break;
-
- case ILowpanInterface.ERROR_JOIN_FAILED_AT_AUTH:
- reason = LowpanException.LOWPAN_JOIN_FAILED_AT_AUTH;
- break;
-
- case ILowpanInterface.ERROR_FORM_FAILED_AT_SCAN:
- reason = LowpanException.LOWPAN_FORM_FAILED_AT_SCAN;
- break;
-
- case ILowpanInterface.ERROR_TIMEOUT:
- case ILowpanInterface.ERROR_NCP_PROBLEM:
- reason = LowpanException.LOWPAN_NCP_PROBLEM;
- break;
- case ILowpanInterface.ERROR_UNSPECIFIED:
- default:
- reason = LOWPAN_ERROR;
- break;
- }
- throw new LowpanException(reason, e.getMessage(), e);
- } else if (t instanceof DeadObjectException) {
- throw new LowpanException(LOWPAN_DEAD, t);
- } else if (t instanceof RemoteException) {
- throw new UnsupportedOperationException(
- "An unknown RemoteException was thrown" + " which should never happen.", t);
- } else if (t instanceof RuntimeException) {
- RuntimeException e = (RuntimeException) t;
- throw e;
- }
- }
-
- private final int mReason;
-
- public final int getReason() {
- return mReason;
- }
-
- public LowpanException(int problem) {
- super(getDefaultMessage(problem));
- mReason = problem;
- }
+ public LowpanException() {}
public LowpanException(String message) {
- super(getCombinedMessage(LOWPAN_ERROR, message));
- mReason = LOWPAN_ERROR;
+ super(message);
}
- public LowpanException(int problem, String message, Throwable cause) {
- super(getCombinedMessage(problem, message), cause);
- mReason = problem;
+ public LowpanException(String message, Throwable cause) {
+ super(message, cause);
}
- public LowpanException(int problem, Throwable cause) {
- super(getDefaultMessage(problem), cause);
- mReason = problem;
+ public LowpanException(Exception cause) {
+ super(cause);
}
- /** @hide */
- public static String getDefaultMessage(int problem) {
- String problemString;
+ /* This method returns LowpanException so that the caller
+ * can add "throw" before the invocation of this method.
+ * This might seem superfluous, but it is actually to
+ * help provide a hint to the java compiler that this
+ * function will not return.
+ */
+ static LowpanException rethrowFromServiceSpecificException(ServiceSpecificException e)
+ throws LowpanException {
+ switch (e.errorCode) {
+ case ILowpanInterface.ERROR_DISABLED:
+ throw new InterfaceDisabledException(e);
- // TODO: Does this need localization?
+ case ILowpanInterface.ERROR_WRONG_STATE:
+ throw new WrongStateException(e);
- switch (problem) {
- case LOWPAN_DEAD:
- problemString = "LoWPAN interface is no longer alive";
- break;
- case LOWPAN_DISABLED:
- problemString = "LoWPAN interface is disabled";
- break;
- case LOWPAN_WRONG_STATE:
- problemString = "LoWPAN interface in wrong state to perfom requested action";
- break;
- case LOWPAN_BUSY:
- problemString =
- "LoWPAN interface was unable to perform the requestion action because it was busy";
- break;
- case LOWPAN_NCP_PROBLEM:
- problemString =
- "The Network Co-Processor associated with this interface has experienced a problem";
- break;
- case LOWPAN_ALREADY:
- problemString = "The LoWPAN interface is already in the given state";
- break;
- case LOWPAN_CANCELED:
- problemString = "This operation was canceled";
- break;
- case LOWPAN_CREDENTIAL_NEEDED:
- problemString = "Additional credentials are required to complete this operation";
- break;
- case LOWPAN_FEATURE_NOT_SUPPORTED:
- problemString =
- "A dependent feature required to perform the given action is not currently supported";
- break;
- case LOWPAN_PROPERTY_NOT_FOUND:
- problemString = "The given property was not found";
- break;
- case LOWPAN_JOIN_FAILED_UNKNOWN:
- problemString = "The join operation failed for an unspecified reason";
- break;
- case LOWPAN_JOIN_FAILED_AT_SCAN:
- problemString =
- "The join operation failed because it could not communicate with any peers";
- break;
- case LOWPAN_JOIN_FAILED_AT_AUTH:
- problemString =
- "The join operation failed because the credentials were not accepted by any peers";
- break;
- case LOWPAN_FORM_FAILED_AT_SCAN:
- problemString = "Network form failed";
- break;
- case LOWPAN_ERROR:
+ case ILowpanInterface.ERROR_CANCELED:
+ throw new OperationCanceledException(e);
+
+ case ILowpanInterface.ERROR_JOIN_FAILED_UNKNOWN:
+ throw new JoinFailedException(e);
+
+ case ILowpanInterface.ERROR_JOIN_FAILED_AT_SCAN:
+ throw new JoinFailedAtScanException(e);
+
+ case ILowpanInterface.ERROR_JOIN_FAILED_AT_AUTH:
+ throw new JoinFailedAtAuthException(e);
+
+ case ILowpanInterface.ERROR_FORM_FAILED_AT_SCAN:
+ throw new NetworkAlreadyExistsException(e);
+
+ case ILowpanInterface.ERROR_FEATURE_NOT_SUPPORTED:
+ throw new LowpanException(
+ e.getMessage() != null ? e.getMessage() : "Feature not supported", e);
+
+ case ILowpanInterface.ERROR_NCP_PROBLEM:
+ throw new LowpanRuntimeException(
+ e.getMessage() != null ? e.getMessage() : "NCP problem", e);
+
+ case ILowpanInterface.ERROR_INVALID_ARGUMENT:
+ throw new LowpanRuntimeException(
+ e.getMessage() != null ? e.getMessage() : "Invalid argument", e);
+
+ case ILowpanInterface.ERROR_UNSPECIFIED:
default:
- problemString = "The requested LoWPAN operation failed";
- break;
+ throw new LowpanRuntimeException(e);
}
-
- return problemString;
- }
-
- private static String getCombinedMessage(int problem, String message) {
- String problemString = getProblemString(problem);
- return String.format("%s (%d): %s", problemString, problem, message);
- }
-
- private static String getProblemString(int problem) {
- String problemString;
-
- switch (problem) {
- case LOWPAN_ERROR:
- problemString = "LOWPAN_ERROR";
- break;
- case LOWPAN_DEAD:
- problemString = "LOWPAN_DEAD";
- break;
- case LOWPAN_DISABLED:
- problemString = "LOWPAN_DISABLED";
- break;
- case LOWPAN_WRONG_STATE:
- problemString = "LOWPAN_WRONG_STATE";
- break;
- case LOWPAN_BUSY:
- problemString = "LOWPAN_BUSY";
- break;
- case LOWPAN_NCP_PROBLEM:
- problemString = "LOWPAN_NCP_PROBLEM";
- break;
- case LOWPAN_ALREADY:
- problemString = "LOWPAN_ALREADY";
- break;
- case LOWPAN_CANCELED:
- problemString = "LOWPAN_CANCELED";
- break;
- case LOWPAN_CREDENTIAL_NEEDED:
- problemString = "LOWPAN_CREDENTIAL_NEEDED";
- break;
- case LOWPAN_FEATURE_NOT_SUPPORTED:
- problemString = "LOWPAN_FEATURE_NOT_SUPPORTED";
- break;
- case LOWPAN_PROPERTY_NOT_FOUND:
- problemString = "LOWPAN_PROPERTY_NOT_FOUND";
- break;
- case LOWPAN_JOIN_FAILED_UNKNOWN:
- problemString = "LOWPAN_JOIN_FAILED_UNKNOWN";
- break;
- case LOWPAN_JOIN_FAILED_AT_SCAN:
- problemString = "LOWPAN_JOIN_FAILED_AT_SCAN";
- break;
- case LOWPAN_JOIN_FAILED_AT_AUTH:
- problemString = "LOWPAN_JOIN_FAILED_AT_AUTH";
- break;
- case LOWPAN_FORM_FAILED_AT_SCAN:
- problemString = "LOWPAN_FORM_FAILED_AT_SCAN";
- break;
- default:
- problemString = "LOWPAN_ERROR_CODE_" + problem;
- break;
- }
-
- return problemString;
}
}
diff --git a/lowpan/java/android/net/lowpan/LowpanIdentity.aidl b/lowpan/java/android/net/lowpan/LowpanIdentity.aidl
new file mode 100644
index 0000000..fcef98f
--- /dev/null
+++ b/lowpan/java/android/net/lowpan/LowpanIdentity.aidl
@@ -0,0 +1,19 @@
+/**
+ * Copyright (C) 2017 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.net.lowpan;
+
+parcelable LowpanIdentity cpp_header "android/net/lowpan/LowpanIdentity.h";
diff --git a/lowpan/java/android/net/lowpan/LowpanIdentity.java b/lowpan/java/android/net/lowpan/LowpanIdentity.java
index 2e7b560..6cb1f98 100644
--- a/lowpan/java/android/net/lowpan/LowpanIdentity.java
+++ b/lowpan/java/android/net/lowpan/LowpanIdentity.java
@@ -16,108 +16,146 @@
package android.net.lowpan;
+import android.annotation.NonNull;
+import android.icu.text.StringPrep;
+import android.icu.text.StringPrepParseException;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.util.Log;
import com.android.internal.util.HexDump;
-import java.util.Map;
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+import java.util.Objects;
/**
* Describes an instance of a LoWPAN network.
*
* @hide
*/
-//@SystemApi
-public class LowpanIdentity {
+// @SystemApi
+public class LowpanIdentity implements Parcelable {
+ private static final String TAG = LowpanIdentity.class.getSimpleName();
- //////////////////////////////////////////////////////////////////////////
// Constants
-
- /** @hide */
- public static final int TYPE_ZIGBEE = 1;
-
- /** @hide */
- public static final int TYPE_ZIGBEE_IP = 2;
-
- /** @hide */
- public static final int TYPE_THREAD = 3;
-
- public static final int UNKNOWN = Integer.MAX_VALUE;
-
- //////////////////////////////////////////////////////////////////////////
+ public static final int UNSPECIFIED_CHANNEL = -1;
+ public static final int UNSPECIFIED_PANID = 0xFFFFFFFF;
// Builder
/** @hide */
- //@SystemApi
+ // @SystemApi
public static class Builder {
- private final LowpanIdentity identity = new LowpanIdentity();
+ private static final StringPrep stringPrep =
+ StringPrep.getInstance(StringPrep.RFC3920_RESOURCEPREP);
- public Builder setName(String x) {
- identity.mName = x;
+ final LowpanIdentity mIdentity = new LowpanIdentity();
+
+ private static String escape(@NonNull byte[] bytes) {
+ StringBuffer sb = new StringBuffer();
+ for (byte b : bytes) {
+ if (b >= 32 && b <= 126) {
+ sb.append((char) b);
+ } else {
+ sb.append(String.format("\\0x%02x", b & 0xFF));
+ }
+ }
+ return sb.toString();
+ }
+
+ public Builder setLowpanIdentity(@NonNull LowpanIdentity x) {
+ Objects.requireNonNull(x);
+ setRawName(x.getRawName());
+ setXpanid(x.getXpanid());
+ setPanid(x.getPanid());
+ setChannel(x.getChannel());
+ setType(x.getType());
+ return this;
+ }
+
+ public Builder setName(@NonNull String name) {
+ Objects.requireNonNull(name);
+ try {
+ mIdentity.mName = stringPrep.prepare(name, StringPrep.DEFAULT);
+ mIdentity.mRawName = mIdentity.mName.getBytes(StandardCharsets.UTF_8);
+ mIdentity.mIsNameValid = true;
+ } catch (StringPrepParseException x) {
+ Log.w(TAG, x.toString());
+ setRawName(name.getBytes(StandardCharsets.UTF_8));
+ }
+ return this;
+ }
+
+ public Builder setRawName(@NonNull byte[] name) {
+ Objects.requireNonNull(name);
+ mIdentity.mRawName = name.clone();
+ mIdentity.mName = new String(name, StandardCharsets.UTF_8);
+ try {
+ String nameCheck = stringPrep.prepare(mIdentity.mName, StringPrep.DEFAULT);
+ mIdentity.mIsNameValid =
+ Arrays.equals(nameCheck.getBytes(StandardCharsets.UTF_8), name);
+ } catch (StringPrepParseException x) {
+ Log.w(TAG, x.toString());
+ mIdentity.mIsNameValid = false;
+ }
+
+ // Non-normal names must be rendered differently to avoid confusion.
+ if (!mIdentity.mIsNameValid) {
+ mIdentity.mName = "«" + escape(name) + "»";
+ }
+
return this;
}
public Builder setXpanid(byte x[]) {
- identity.mXpanid = x.clone();
+ mIdentity.mXpanid = (x != null ? x.clone() : null);
return this;
}
public Builder setPanid(int x) {
- identity.mPanid = x;
+ mIdentity.mPanid = x;
return this;
}
- /** @hide */
- public Builder setType(int x) {
- identity.mType = x;
+ public Builder setType(@NonNull String x) {
+ mIdentity.mType = x;
return this;
}
public Builder setChannel(int x) {
- identity.mChannel = x;
- return this;
- }
-
- /** @hide */
- Builder updateFromMap(Map map) {
- if (map.containsKey(ILowpanInterface.KEY_NETWORK_NAME)) {
- setName(LowpanProperties.KEY_NETWORK_NAME.getFromMap(map));
- }
- if (map.containsKey(ILowpanInterface.KEY_NETWORK_PANID)) {
- setPanid(LowpanProperties.KEY_NETWORK_PANID.getFromMap(map));
- }
- if (map.containsKey(ILowpanInterface.KEY_NETWORK_XPANID)) {
- setXpanid(LowpanProperties.KEY_NETWORK_XPANID.getFromMap(map));
- }
- if (map.containsKey(ILowpanInterface.KEY_CHANNEL)) {
- setChannel(LowpanProperties.KEY_CHANNEL.getFromMap(map));
- }
- if (map.containsKey(ILowpanInterface.KEY_NETWORK_TYPE)) {
- setType(LowpanProperties.KEY_NETWORK_TYPE.getFromMap(map));
- }
+ mIdentity.mChannel = x;
return this;
}
public LowpanIdentity build() {
- return identity;
+ return mIdentity;
}
}
LowpanIdentity() {}
- //////////////////////////////////////////////////////////////////////////
// Instance Variables
- private String mName = null;
- private byte[] mXpanid = null;
- private int mType = UNKNOWN;
- private int mPanid = UNKNOWN;
- private int mChannel = UNKNOWN;
+ private String mName = "";
+ private boolean mIsNameValid = true;
+ private byte[] mRawName = new byte[0];
+ private String mType = "";
+ private byte[] mXpanid = new byte[0];
+ private int mPanid = UNSPECIFIED_PANID;
+ private int mChannel = UNSPECIFIED_CHANNEL;
- //////////////////////////////////////////////////////////////////////////
- // Public Getters and Setters
+ // Public Getters
public String getName() {
return mName;
}
+ public boolean isNameValid() {
+ return mIsNameValid;
+ }
+
+ public byte[] getRawName() {
+ return mRawName.clone();
+ }
+
public byte[] getXpanid() {
return mXpanid.clone();
}
@@ -126,8 +164,7 @@
return mPanid;
}
- /** @hide */
- public int getType() {
+ public String getType() {
return mType;
}
@@ -135,45 +172,84 @@
return mChannel;
}
- static void addToMap(Map<String, Object> parameters, LowpanIdentity networkInfo) {
- if (networkInfo.getName() != null) {
- LowpanProperties.KEY_NETWORK_NAME.putInMap(parameters, networkInfo.getName());
- }
- if (networkInfo.getPanid() != LowpanIdentity.UNKNOWN) {
- LowpanProperties.KEY_NETWORK_PANID.putInMap(
- parameters, networkInfo.getPanid());
- }
- if (networkInfo.getChannel() != LowpanIdentity.UNKNOWN) {
- LowpanProperties.KEY_CHANNEL.putInMap(
- parameters, networkInfo.getChannel());
- }
- if (networkInfo.getXpanid() != null) {
- LowpanProperties.KEY_NETWORK_XPANID.putInMap(parameters, networkInfo.getXpanid());
- }
- }
-
- void addToMap(Map<String, Object> parameters) {
- addToMap(parameters, this);
- }
-
@Override
public String toString() {
StringBuffer sb = new StringBuffer();
- sb.append("Name: ").append(mName == null ? "<none>" : mName);
+ sb.append("Name:").append(getName());
- if (mXpanid != null) {
- sb.append(", XPANID: ").append(HexDump.toHexString(mXpanid));
+ if (mType.length() > 0) {
+ sb.append(", Type:").append(mType);
}
- if (mPanid != UNKNOWN) {
- sb.append(", PANID: ").append(String.format("0x%04X", mPanid));
+ if (mXpanid.length > 0) {
+ sb.append(", XPANID:").append(HexDump.toHexString(mXpanid));
}
- if (mChannel != UNKNOWN) {
- sb.append(", Channel: ").append(mChannel);
+ if (mPanid != UNSPECIFIED_PANID) {
+ sb.append(", PANID:").append(String.format("0x%04X", mPanid));
+ }
+
+ if (mChannel != UNSPECIFIED_CHANNEL) {
+ sb.append(", Channel:").append(mChannel);
}
return sb.toString();
}
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof LowpanIdentity)) {
+ return false;
+ }
+ LowpanIdentity rhs = (LowpanIdentity) obj;
+ return Arrays.equals(mRawName, rhs.mRawName)
+ && Arrays.equals(mXpanid, rhs.mXpanid)
+ && mType.equals(rhs.mType)
+ && mPanid == rhs.mPanid
+ && mChannel == rhs.mChannel;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(
+ Arrays.hashCode(mRawName), mType, Arrays.hashCode(mXpanid), mPanid, mChannel);
+ }
+
+ /** Implement the Parcelable interface. */
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ /** Implement the Parcelable interface. */
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeByteArray(mRawName);
+ dest.writeString(mType);
+ dest.writeByteArray(mXpanid);
+ dest.writeInt(mPanid);
+ dest.writeInt(mChannel);
+ }
+
+ /** Implement the Parcelable interface. */
+ public static final Creator<LowpanIdentity> CREATOR =
+ new Creator<LowpanIdentity>() {
+
+ public LowpanIdentity createFromParcel(Parcel in) {
+ Builder builder = new Builder();
+
+ builder.setRawName(in.createByteArray());
+ builder.setType(in.readString());
+ builder.setXpanid(in.createByteArray());
+ builder.setPanid(in.readInt());
+ builder.setChannel(in.readInt());
+
+ return builder.build();
+ }
+
+ public LowpanIdentity[] newArray(int size) {
+ return new LowpanIdentity[size];
+ }
+ };
}
diff --git a/lowpan/java/android/net/lowpan/LowpanInterface.java b/lowpan/java/android/net/lowpan/LowpanInterface.java
index cd54819..57e9135 100644
--- a/lowpan/java/android/net/lowpan/LowpanInterface.java
+++ b/lowpan/java/android/net/lowpan/LowpanInterface.java
@@ -18,33 +18,34 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.content.Context;
import android.net.IpPrefix;
+import android.net.LinkAddress;
+import android.os.DeadObjectException;
import android.os.Handler;
-import android.os.IBinder;
+import android.os.Looper;
import android.os.RemoteException;
import android.os.ServiceSpecificException;
import android.util.Log;
import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
/**
* Class for managing a specific Low-power Wireless Personal Area Network (LoWPAN) interface.
*
* @hide
*/
-//@SystemApi
+// @SystemApi
public class LowpanInterface {
private static final String TAG = LowpanInterface.class.getSimpleName();
/** Detached role. The interface is not currently attached to a network. */
- public static final String ROLE_DETACHED = "detached";
+ public static final String ROLE_DETACHED = ILowpanInterface.ROLE_DETACHED;
/** End-device role. End devices do not route traffic for other nodes. */
- public static final String ROLE_END_DEVICE = "end-device";
+ public static final String ROLE_END_DEVICE = ILowpanInterface.ROLE_END_DEVICE;
/** Router role. Routers help route traffic around the mesh network. */
- public static final String ROLE_ROUTER = "router";
+ public static final String ROLE_ROUTER = ILowpanInterface.ROLE_ROUTER;
/**
* Sleepy End-Device role.
@@ -54,7 +55,7 @@
* extraordinarilly low power consumption, but packet latency can be on the order of dozens of
* seconds(depending on how the node is configured).
*/
- public static final String ROLE_SLEEPY_END_DEVICE = "sleepy-end-device";
+ public static final String ROLE_SLEEPY_END_DEVICE = ILowpanInterface.ROLE_SLEEPY_END_DEVICE;
/**
* Sleepy-router role.
@@ -62,13 +63,13 @@
* <p>Routers with this role are nominally asleep, waking up periodically to check in with other
* routers and their children.
*/
- public static final String ROLE_SLEEPY_ROUTER = "sleepy-router";
+ public static final String ROLE_SLEEPY_ROUTER = ILowpanInterface.ROLE_SLEEPY_ROUTER;
/** TODO: doc */
- public static final String ROLE_LEADER = "leader";
+ public static final String ROLE_LEADER = ILowpanInterface.ROLE_LEADER;
/** TODO: doc */
- public static final String ROLE_COORDINATOR = "coordinator";
+ public static final String ROLE_COORDINATOR = ILowpanInterface.ROLE_COORDINATOR;
/**
* Offline state.
@@ -83,7 +84,7 @@
* @see #getState()
* @see #STATE_FAULT
*/
- public static final String STATE_OFFLINE = "offline";
+ public static final String STATE_OFFLINE = ILowpanInterface.STATE_OFFLINE;
/**
* Commissioning state.
@@ -95,7 +96,7 @@
* @see #getState()
* @hide
*/
- public static final String STATE_COMMISSIONING = "commissioning";
+ public static final String STATE_COMMISSIONING = ILowpanInterface.STATE_COMMISSIONING;
/**
* Attaching state.
@@ -113,7 +114,7 @@
* @see #STATE_ATTACHED
* @see #getState()
*/
- public static final String STATE_ATTACHING = "attaching";
+ public static final String STATE_ATTACHING = ILowpanInterface.STATE_ATTACHING;
/**
* Attached state.
@@ -124,7 +125,7 @@
* @see #STATE_ATTACHING
* @see #getState()
*/
- public static final String STATE_ATTACHED = "attached";
+ public static final String STATE_ATTACHED = ILowpanInterface.STATE_ATTACHED;
/**
* Fault state.
@@ -138,7 +139,7 @@
* @see #getState
* @see #STATE_OFFLINE
*/
- public static final String STATE_FAULT = "fault";
+ public static final String STATE_FAULT = ILowpanInterface.STATE_FAULT;
/**
* Network type for Thread 1.x networks.
@@ -147,30 +148,16 @@
* @see #getLowpanIdentity
* @hide
*/
- public static final String NETWORK_TYPE_THREAD = "org.threadgroup.thread.v1";
+ public static final String NETWORK_TYPE_THREAD_V1 = ILowpanInterface.NETWORK_TYPE_THREAD_V1;
- /**
- * Network type for ZigBeeIP 1.x networks.
- *
- * @see android.net.lowpan.LowpanIdentity#getType
- * @see #getLowpanIdentity
- * @hide
- */
- public static final String NETWORK_TYPE_ZIGBEE_IP = "org.zigbee.zigbeeip.v1";
-
- private static final String NETWORK_PROPERTY_KEYS[] = {
- LowpanProperties.KEY_NETWORK_NAME.getName(),
- LowpanProperties.KEY_NETWORK_PANID.getName(),
- LowpanProperties.KEY_NETWORK_XPANID.getName(),
- LowpanProperties.KEY_CHANNEL.getName()
- };
+ public static final String EMPTY_PARTITION_ID = "";
/**
* Callback base class for LowpanInterface
*
* @hide
*/
- //@SystemApi
+ // @SystemApi
public abstract static class Callback {
public void onConnectedChanged(boolean value) {}
@@ -184,137 +171,46 @@
public void onLowpanIdentityChanged(@NonNull LowpanIdentity value) {}
- /** @hide */
- public void onPropertiesChanged(@NonNull Map properties) {}
+ public void onLinkNetworkAdded(IpPrefix prefix) {}
+
+ public void onLinkNetworkRemoved(IpPrefix prefix) {}
+
+ public void onLinkAddressAdded(LinkAddress address) {}
+
+ public void onLinkAddressRemoved(LinkAddress address) {}
}
- private ILowpanInterface mBinder;
+ private final ILowpanInterface mBinder;
+ private final Looper mLooper;
private final HashMap<Integer, ILowpanInterfaceListener> mListenerMap = new HashMap<>();
- /** Map between IBinder identity hashes and LowpanInstance objects. */
- private static final HashMap<Integer, LowpanInterface> sInstanceMap = new HashMap<>();
+ /**
+ * Create a new LowpanInterface instance. Applications will almost always want to use {@link
+ * LowpanManager#getInterface LowpanManager.getInterface()} instead of this.
+ *
+ * @param context the application context
+ * @param service the Binder interface
+ * @param looper the Binder interface
+ * @hide
+ */
+ public LowpanInterface(Context context, ILowpanInterface service, Looper looper) {
+ /* We aren't currently using the context, but if we need
+ * it later on we can easily add it to the class.
+ */
- private LowpanInterface(IBinder binder) {
- mBinder = ILowpanInterface.Stub.asInterface(binder);
+ mBinder = service;
+ mLooper = looper;
}
/**
- * Get the LowpanInterface object associated with this IBinder. Returns null if this IBinder
- * does not implement the appropriate interface.
+ * Returns the ILowpanInterface object associated with this interface.
*
* @hide
*/
- @NonNull
- public static final LowpanInterface from(IBinder binder) {
- Integer hashCode = Integer.valueOf(System.identityHashCode(binder));
- LowpanInterface instance;
-
- synchronized (sInstanceMap) {
- instance = sInstanceMap.get(hashCode);
-
- if (instance == null) {
- instance = new LowpanInterface(binder);
- sInstanceMap.put(hashCode, instance);
- }
- }
-
- return instance;
+ public ILowpanInterface getService() {
+ return mBinder;
}
- /** {@hide} */
- public static final LowpanInterface from(ILowpanInterface iface) {
- return from(iface.asBinder());
- }
-
- /** {@hide} */
- public static final LowpanInterface getInterfaceFromBinder(IBinder binder) {
- return from(binder);
- }
-
- /**
- * Returns the IBinder object associated with this interface.
- *
- * @hide
- */
- public IBinder getBinder() {
- return mBinder.asBinder();
- }
-
- private static void throwAsPublicException(Throwable t) throws LowpanException {
- LowpanException.throwAsPublicException(t);
- }
-
- //////////////////////////////////////////////////////////////////////////
- // Private Property Helpers
-
- void setProperties(Map properties) throws LowpanException {
- try {
- mBinder.setProperties(properties);
-
- } catch (RemoteException x) {
- // Catch and ignore all binder exceptions
- Log.e(TAG, x.toString());
-
- } catch (ServiceSpecificException x) {
- throwAsPublicException(x);
- }
- }
-
- @NonNull
- Map<String, Object> getProperties(String keys[]) throws LowpanException {
- try {
- return mBinder.getProperties(keys);
- } catch (RemoteException x) {
- // Catch and ignore all binder exceptions
- Log.e(TAG, x.toString());
- } catch (ServiceSpecificException x) {
- throwAsPublicException(x);
- }
- return new HashMap();
- }
-
- /** @hide */
- public <T> void setProperty(LowpanProperty<T> key, T value) throws LowpanException {
- HashMap<String, T> prop = new HashMap<>();
- prop.put(key.getName(), value);
- setProperties(prop);
- }
-
- /** @hide */
- @Nullable
- public <T> T getProperty(LowpanProperty<T> key) throws LowpanException {
- Map<String, Object> map = getProperties(new String[] {key.getName()});
- if (map != null && !map.isEmpty()) {
- // We know there is only one value.
- return (T) map.values().iterator().next();
- }
- return null;
- }
-
- @Nullable
- <T> String getPropertyAsString(LowpanProperty<T> key) throws LowpanException {
- try {
- return mBinder.getPropertyAsString(key.getName());
- } catch (RemoteException x) {
- // Catch and ignore all binder exceptions
- Log.e(TAG, x.toString());
- } catch (ServiceSpecificException x) {
- throwAsPublicException(x);
- }
- return null;
- }
-
- int getPropertyAsInt(LowpanProperty<Integer> key) throws LowpanException {
- Integer value = getProperty(key);
- return (value != null) ? value : 0;
- }
-
- boolean getPropertyAsBoolean(LowpanProperty<Boolean> key) throws LowpanException {
- Boolean value = getProperty(key);
- return (value != null) ? value : 0;
- }
-
- //////////////////////////////////////////////////////////////////////////
// Public Actions
/**
@@ -331,13 +227,13 @@
*/
public void form(@NonNull LowpanProvision provision) throws LowpanException {
try {
- Map<String, Object> parameters = new HashMap();
- provision.addToMap(parameters);
- mBinder.form(parameters);
+ mBinder.form(provision);
+
} catch (RemoteException x) {
- throwAsPublicException(x);
+ throw x.rethrowAsRuntimeException();
+
} catch (ServiceSpecificException x) {
- throwAsPublicException(x);
+ throw LowpanException.rethrowFromServiceSpecificException(x);
}
}
@@ -351,13 +247,13 @@
*/
public void join(@NonNull LowpanProvision provision) throws LowpanException {
try {
- Map<String, Object> parameters = new HashMap();
- provision.addToMap(parameters);
- mBinder.join(parameters);
+ mBinder.join(provision);
+
} catch (RemoteException x) {
- throwAsPublicException(x);
+ throw x.rethrowAsRuntimeException();
+
} catch (ServiceSpecificException x) {
- throwAsPublicException(x);
+ throw LowpanException.rethrowFromServiceSpecificException(x);
}
}
@@ -369,13 +265,14 @@
* <p>This method will block execution until the operation has completed.
*/
public void attach(@NonNull LowpanProvision provision) throws LowpanException {
- if (ROLE_DETACHED.equals(getRole())) {
- Map<String, Object> parameters = new HashMap();
- provision.addToMap(parameters);
- setProperties(parameters);
- setUp(true);
- } else {
- throw new LowpanException(LowpanException.LOWPAN_ALREADY);
+ try {
+ mBinder.attach(provision);
+
+ } catch (RemoteException x) {
+ throw x.rethrowAsRuntimeException();
+
+ } catch (ServiceSpecificException x) {
+ throw LowpanException.rethrowFromServiceSpecificException(x);
}
}
@@ -388,10 +285,12 @@
public void leave() throws LowpanException {
try {
mBinder.leave();
+
} catch (RemoteException x) {
- throwAsPublicException(x);
+ throw x.rethrowAsRuntimeException();
+
} catch (ServiceSpecificException x) {
- throwAsPublicException(x);
+ throw LowpanException.rethrowFromServiceSpecificException(x);
}
}
@@ -401,9 +300,17 @@
*/
public @NonNull LowpanCommissioningSession startCommissioningSession(
@NonNull LowpanBeaconInfo beaconInfo) throws LowpanException {
+ try {
+ mBinder.startCommissioningSession(beaconInfo);
- /* TODO: Implement startCommissioningSession */
- throw new LowpanException(LowpanException.LOWPAN_FEATURE_NOT_SUPPORTED);
+ return new LowpanCommissioningSession(mBinder, beaconInfo, mLooper);
+
+ } catch (RemoteException x) {
+ throw x.rethrowAsRuntimeException();
+
+ } catch (ServiceSpecificException x) {
+ throw LowpanException.rethrowFromServiceSpecificException(x);
+ }
}
/**
@@ -417,62 +324,68 @@
public void reset() throws LowpanException {
try {
mBinder.reset();
+
} catch (RemoteException x) {
- throwAsPublicException(x);
+ throw x.rethrowAsRuntimeException();
+
} catch (ServiceSpecificException x) {
- throwAsPublicException(x);
+ throw LowpanException.rethrowFromServiceSpecificException(x);
}
}
- //////////////////////////////////////////////////////////////////////////
// Public Getters and Setters
- /**
- * Returns the name of this network interface.
- *
- * <p>Will return empty string if this interface is no longer viable.
- */
+ /** Returns the name of this network interface. */
@NonNull
public String getName() {
try {
return mBinder.getName();
+
+ } catch (DeadObjectException x) {
+ return "";
+
} catch (RemoteException x) {
- // Catch and ignore all binder exceptions
- // when fetching the name.
- Log.e(TAG, x.toString());
- } catch (ServiceSpecificException x) {
- // Catch and ignore all service-specific exceptions
- // when fetching the name.
- Log.e(TAG, x.toString());
+ throw x.rethrowAsRuntimeException();
}
- return "";
}
- /**
- * Indicates if the interface is enabled or disabled.
- *
- * @see #setEnabled
- * @see android.net.lowpan.LowpanException#LOWPAN_DISABLED
- */
- public boolean isEnabled() {
+ /**
+ * Indicates if the interface is enabled or disabled.
+ *
+ * @see #setEnabled
+ * @see android.net.lowpan.LowpanException#LOWPAN_DISABLED
+ */
+ public boolean isEnabled() {
try {
- return getPropertyAsBoolean(LowpanProperties.KEY_INTERFACE_ENABLED);
- } catch (LowpanException x) {
+ return mBinder.isEnabled();
+
+ } catch (DeadObjectException x) {
return false;
+
+ } catch (RemoteException x) {
+ throw x.rethrowAsRuntimeException();
}
}
- /**
- * Enables or disables the LoWPAN interface. When disabled, the interface is put into a low-power
- * state and all commands that require the NCP to be queried will fail with {@link
- * android.net.lowpan.LowpanException#LOWPAN_DISABLED}.
- *
- * @see #isEnabled
- * @see android.net.lowpan.LowpanException#LOWPAN_DISABLED
- * @hide
- */
- public void setEnabled(boolean enabled) throws LowpanException {
- setProperty(LowpanProperties.KEY_INTERFACE_ENABLED, enabled);
+ /**
+ * Enables or disables the LoWPAN interface. When disabled, the interface is put into a
+ * low-power state and all commands that require the NCP to be queried will fail with {@link
+ * android.net.lowpan.LowpanException#LOWPAN_DISABLED}.
+ *
+ * @see #isEnabled
+ * @see android.net.lowpan.LowpanException#LOWPAN_DISABLED
+ * @hide
+ */
+ public void setEnabled(boolean enabled) throws LowpanException {
+ try {
+ mBinder.setEnabled(enabled);
+
+ } catch (RemoteException x) {
+ throw x.rethrowAsRuntimeException();
+
+ } catch (ServiceSpecificException x) {
+ throw LowpanException.rethrowFromServiceSpecificException(x);
+ }
}
/**
@@ -482,22 +395,14 @@
*/
public boolean isUp() {
try {
- return getPropertyAsBoolean(LowpanProperties.KEY_INTERFACE_UP);
- } catch (LowpanException x) {
- return false;
- }
- }
+ return mBinder.isUp();
- /**
- * Bring up or shut down the network interface.
- *
- * <p>This method brings up or shuts down the network interface, attaching or (gracefully)
- * detaching from the currently configured LoWPAN network as appropriate.
- *
- * @hide
- */
- public void setUp(boolean interfaceUp) throws LowpanException {
- setProperty(LowpanProperties.KEY_INTERFACE_UP, interfaceUp);
+ } catch (DeadObjectException x) {
+ return false;
+
+ } catch (RemoteException x) {
+ throw x.rethrowAsRuntimeException();
+ }
}
/**
@@ -508,9 +413,13 @@
*/
public boolean isConnected() {
try {
- return getPropertyAsBoolean(LowpanProperties.KEY_INTERFACE_CONNECTED);
- } catch (LowpanException x) {
+ return mBinder.isConnected();
+
+ } catch (DeadObjectException x) {
return false;
+
+ } catch (RemoteException x) {
+ throw x.rethrowAsRuntimeException();
}
}
@@ -520,9 +429,13 @@
*/
public boolean isCommissioned() {
try {
- return getPropertyAsBoolean(LowpanProperties.KEY_INTERFACE_COMMISSIONED);
- } catch (LowpanException x) {
+ return mBinder.isCommissioned();
+
+ } catch (DeadObjectException x) {
return false;
+
+ } catch (RemoteException x) {
+ throw x.rethrowAsRuntimeException();
}
}
@@ -542,93 +455,91 @@
*/
public String getState() {
try {
- return getProperty(LowpanProperties.KEY_INTERFACE_STATE);
- } catch (LowpanException x) {
- Log.e(TAG, x.toString());
+ return mBinder.getState();
+
+ } catch (DeadObjectException x) {
return STATE_FAULT;
+
+ } catch (RemoteException x) {
+ throw x.rethrowAsRuntimeException();
+ }
+ }
+
+ /** Get network partition/fragment identifier. */
+ public String getPartitionId() {
+ try {
+ return mBinder.getPartitionId();
+
+ } catch (DeadObjectException x) {
+ return EMPTY_PARTITION_ID;
+
+ } catch (RemoteException x) {
+ throw x.rethrowAsRuntimeException();
}
}
/** TODO: doc */
public LowpanIdentity getLowpanIdentity() {
- LowpanIdentity.Builder builder = new LowpanIdentity.Builder();
try {
- builder.updateFromMap(getProperties(NETWORK_PROPERTY_KEYS));
- } catch (LowpanException x) {
- // We ignore all LoWPAN-specitic exceptions here.
+ return mBinder.getLowpanIdentity();
+
+ } catch (DeadObjectException x) {
+ return new LowpanIdentity();
+
+ } catch (RemoteException x) {
+ throw x.rethrowAsRuntimeException();
}
-
- return builder.build();
- }
-
- /**
- * TODO: doc
- *
- * @hide
- */
- public void setLowpanIdentity(LowpanIdentity network) throws LowpanException {
- Map<String, Object> map = new HashMap();
- LowpanIdentity.addToMap(map, network);
- setProperties(map);
}
/** TODO: doc */
@NonNull
public String getRole() {
- String role = null;
-
try {
- role = getProperty(LowpanProperties.KEY_NETWORK_ROLE);
- } catch (LowpanException x) {
- // We ignore all LoWPAN-specitic exceptions here.
- Log.e(TAG, x.toString());
- }
+ return mBinder.getRole();
- if (role == null) {
- role = ROLE_DETACHED;
- }
+ } catch (DeadObjectException x) {
+ return ROLE_DETACHED;
- return role;
+ } catch (RemoteException x) {
+ throw x.rethrowAsRuntimeException();
+ }
}
/** TODO: doc */
@Nullable
public LowpanCredential getLowpanCredential() {
- LowpanCredential credential = null;
-
try {
- Integer keyIndex = getProperty(LowpanProperties.KEY_NETWORK_MASTER_KEY_INDEX);
+ return mBinder.getLowpanCredential();
- if (keyIndex == null) {
- credential =
- LowpanCredential.createMasterKey(
- getProperty(LowpanProperties.KEY_NETWORK_MASTER_KEY));
- } else {
- credential =
- LowpanCredential.createMasterKey(
- getProperty(LowpanProperties.KEY_NETWORK_MASTER_KEY),
- keyIndex.intValue());
- }
- } catch (LowpanException x) {
- // We ignore all LoWPAN-specitic exceptions here.
- Log.e(TAG, x.toString());
+ } catch (RemoteException x) {
+ throw x.rethrowAsRuntimeException();
}
-
- return credential;
}
- /**
- * TODO: doc
- *
- * @hide
- */
- public void setLowpanCredential(LowpanCredential networkCredential) throws LowpanException {
- Map<String, Object> map = new HashMap();
- networkCredential.addToMap(map);
- setProperties(map);
+ public @NonNull String[] getSupportedNetworkTypes() throws LowpanException {
+ try {
+ return mBinder.getSupportedNetworkTypes();
+
+ } catch (RemoteException x) {
+ throw x.rethrowAsRuntimeException();
+
+ } catch (ServiceSpecificException x) {
+ throw LowpanException.rethrowFromServiceSpecificException(x);
+ }
}
- //////////////////////////////////////////////////////////////////////////
+ public @NonNull LowpanChannelInfo[] getSupportedChannels() throws LowpanException {
+ try {
+ return mBinder.getSupportedChannels();
+
+ } catch (RemoteException x) {
+ throw x.rethrowAsRuntimeException();
+
+ } catch (ServiceSpecificException x) {
+ throw LowpanException.rethrowFromServiceSpecificException(x);
+ }
+ }
+
// Listener Support
/**
@@ -644,58 +555,100 @@
public void registerCallback(@NonNull Callback cb, @Nullable Handler handler) {
ILowpanInterfaceListener.Stub listenerBinder =
new ILowpanInterfaceListener.Stub() {
- public void onPropertiesChanged(Map<String, Object> properties) {
- Runnable runnable =
- new Runnable() {
- @Override
- public void run() {
- for (String key : (Set<String>) properties.keySet()) {
- Object value = properties.get(key);
- switch (key) {
- case ILowpanInterface.KEY_INTERFACE_ENABLED:
- cb.onEnabledChanged(
- ((Boolean) value).booleanValue());
- break;
- case ILowpanInterface.KEY_INTERFACE_UP:
- cb.onUpChanged(
- ((Boolean) value).booleanValue());
- break;
- case ILowpanInterface.KEY_INTERFACE_CONNECTED:
- cb.onConnectedChanged(
- ((Boolean) value).booleanValue());
- break;
- case ILowpanInterface.KEY_INTERFACE_STATE:
- cb.onStateChanged((String) value);
- break;
- case ILowpanInterface.KEY_NETWORK_NAME:
- case ILowpanInterface.KEY_NETWORK_PANID:
- case ILowpanInterface.KEY_NETWORK_XPANID:
- case ILowpanInterface.KEY_CHANNEL:
- cb.onLowpanIdentityChanged(getLowpanIdentity());
- break;
- case ILowpanInterface.KEY_NETWORK_ROLE:
- cb.onRoleChanged(value.toString());
- break;
- }
- }
- cb.onPropertiesChanged(properties);
- }
- };
+ private Handler mHandler;
+ {
if (handler != null) {
- handler.post(runnable);
+ mHandler = handler;
+ } else if (mLooper != null) {
+ mHandler = new Handler(mLooper);
} else {
- runnable.run();
+ mHandler = new Handler();
}
}
+
+ @Override
+ public void onEnabledChanged(boolean value) {
+ mHandler.post(() -> cb.onEnabledChanged(value));
+ }
+
+ @Override
+ public void onConnectedChanged(boolean value) {
+ mHandler.post(() -> cb.onConnectedChanged(value));
+ }
+
+ @Override
+ public void onUpChanged(boolean value) {
+ mHandler.post(() -> cb.onUpChanged(value));
+ }
+
+ @Override
+ public void onRoleChanged(String value) {
+ mHandler.post(() -> cb.onRoleChanged(value));
+ }
+
+ @Override
+ public void onStateChanged(String value) {
+ mHandler.post(() -> cb.onStateChanged(value));
+ }
+
+ @Override
+ public void onLowpanIdentityChanged(LowpanIdentity value) {
+ mHandler.post(() -> cb.onLowpanIdentityChanged(value));
+ }
+
+ @Override
+ public void onLinkNetworkAdded(IpPrefix value) {
+ mHandler.post(() -> cb.onLinkNetworkAdded(value));
+ }
+
+ @Override
+ public void onLinkNetworkRemoved(IpPrefix value) {
+ mHandler.post(() -> cb.onLinkNetworkRemoved(value));
+ }
+
+ @Override
+ public void onLinkAddressAdded(String value) {
+ LinkAddress la;
+ try {
+ la = new LinkAddress(value);
+ } catch (IllegalArgumentException x) {
+ Log.e(
+ TAG,
+ "onLinkAddressAdded: Bad LinkAddress \"" + value + "\", " + x);
+ return;
+ }
+ mHandler.post(() -> cb.onLinkAddressAdded(la));
+ }
+
+ @Override
+ public void onLinkAddressRemoved(String value) {
+ LinkAddress la;
+ try {
+ la = new LinkAddress(value);
+ } catch (IllegalArgumentException x) {
+ Log.e(
+ TAG,
+ "onLinkAddressRemoved: Bad LinkAddress \""
+ + value
+ + "\", "
+ + x);
+ return;
+ }
+ mHandler.post(() -> cb.onLinkAddressRemoved(la));
+ }
+
+ @Override
+ public void onReceiveFromCommissioner(byte[] packet) {
+ // This is only used by the LowpanCommissioningSession.
+ }
};
try {
mBinder.addListener(listenerBinder);
} catch (RemoteException x) {
- // Log and ignore. If this happens, this interface
- // is likely dead anyway.
- Log.e(TAG, x.toString());
+ throw x.rethrowAsRuntimeException();
}
+
synchronized (mListenerMap) {
mListenerMap.put(System.identityHashCode(cb), listenerBinder);
}
@@ -724,39 +677,80 @@
*/
public void unregisterCallback(Callback cb) {
int hashCode = System.identityHashCode(cb);
- ILowpanInterfaceListener listenerBinder = mListenerMap.get(hashCode);
+ synchronized (mListenerMap) {
+ ILowpanInterfaceListener listenerBinder = mListenerMap.get(hashCode);
- if (listenerBinder != null) {
- synchronized (mListenerMap) {
+ if (listenerBinder != null) {
mListenerMap.remove(hashCode);
- }
- try {
- mBinder.removeListener(listenerBinder);
- } catch (RemoteException x) {
- // Catch and ignore all binder exceptions
- Log.e(TAG, x.toString());
+
+ try {
+ mBinder.removeListener(listenerBinder);
+ } catch (DeadObjectException x) {
+ // We ignore a dead object exception because that
+ // pretty clearly means our callback isn't registered.
+ } catch (RemoteException x) {
+ throw x.rethrowAsRuntimeException();
+ }
}
}
}
- //////////////////////////////////////////////////////////////////////////
- // Active and Passive Scanning
+ // Active and Passive Scanning
- /**
- * Creates a new {@link android.net.lowpan.LowpanScanner} object for this interface.
- *
- * <p>This method allocates a new unique object for each call.
- *
- * @see android.net.lowpan.LowpanScanner
- */
- public @NonNull LowpanScanner createScanner() {
+ /**
+ * Creates a new {@link android.net.lowpan.LowpanScanner} object for this interface.
+ *
+ * <p>This method allocates a new unique object for each call.
+ *
+ * @see android.net.lowpan.LowpanScanner
+ */
+ public @NonNull LowpanScanner createScanner() {
return new LowpanScanner(mBinder);
}
- //////////////////////////////////////////////////////////////////////////
// Route Management
/**
+ * Makes a copy of the internal list of LinkAddresses.
+ *
+ * @hide
+ */
+ public LinkAddress[] getLinkAddresses() throws LowpanException {
+ try {
+ String[] linkAddressStrings = mBinder.getLinkAddresses();
+ LinkAddress[] ret = new LinkAddress[linkAddressStrings.length];
+ int i = 0;
+ for (String str : linkAddressStrings) {
+ ret[i++] = new LinkAddress(str);
+ }
+ return ret;
+
+ } catch (RemoteException x) {
+ throw x.rethrowAsRuntimeException();
+
+ } catch (ServiceSpecificException x) {
+ throw LowpanException.rethrowFromServiceSpecificException(x);
+ }
+ }
+
+ /**
+ * Makes a copy of the internal list of networks reachable on via this link.
+ *
+ * @hide
+ */
+ public IpPrefix[] getLinkNetworks() throws LowpanException {
+ try {
+ return mBinder.getLinkNetworks();
+
+ } catch (RemoteException x) {
+ throw x.rethrowAsRuntimeException();
+
+ } catch (ServiceSpecificException x) {
+ throw LowpanException.rethrowFromServiceSpecificException(x);
+ }
+ }
+
+ /**
* Advertise the given IP prefix as an on-mesh prefix.
*
* @hide
@@ -764,10 +758,12 @@
public void addOnMeshPrefix(IpPrefix prefix, int flags) throws LowpanException {
try {
mBinder.addOnMeshPrefix(prefix, flags);
+
} catch (RemoteException x) {
- throwAsPublicException(x);
+ throw x.rethrowAsRuntimeException();
+
} catch (ServiceSpecificException x) {
- throwAsPublicException(x);
+ throw LowpanException.rethrowFromServiceSpecificException(x);
}
}
@@ -780,9 +776,10 @@
public void removeOnMeshPrefix(IpPrefix prefix) {
try {
mBinder.removeOnMeshPrefix(prefix);
+
} catch (RemoteException x) {
- // Catch and ignore all binder exceptions
- Log.e(TAG, x.toString());
+ throw x.rethrowAsRuntimeException();
+
} catch (ServiceSpecificException x) {
// Catch and ignore all service exceptions
Log.e(TAG, x.toString());
@@ -798,10 +795,12 @@
public void addExternalRoute(IpPrefix prefix, int flags) throws LowpanException {
try {
mBinder.addExternalRoute(prefix, flags);
+
} catch (RemoteException x) {
- throwAsPublicException(x);
+ throw x.rethrowAsRuntimeException();
+
} catch (ServiceSpecificException x) {
- throwAsPublicException(x);
+ throw LowpanException.rethrowFromServiceSpecificException(x);
}
}
@@ -813,9 +812,10 @@
public void removeExternalRoute(IpPrefix prefix) {
try {
mBinder.removeExternalRoute(prefix);
+
} catch (RemoteException x) {
- // Catch and ignore all binder exceptions
- Log.e(TAG, x.toString());
+ throw x.rethrowAsRuntimeException();
+
} catch (ServiceSpecificException x) {
// Catch and ignore all service exceptions
Log.e(TAG, x.toString());
diff --git a/lowpan/java/android/net/lowpan/LowpanManager.java b/lowpan/java/android/net/lowpan/LowpanManager.java
index b58608d..2d974ee 100644
--- a/lowpan/java/android/net/lowpan/LowpanManager.java
+++ b/lowpan/java/android/net/lowpan/LowpanManager.java
@@ -19,102 +19,146 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
-import android.os.DeadObjectException;
import android.os.Handler;
import android.os.IBinder;
+import android.os.Looper;
import android.os.RemoteException;
import android.os.ServiceManager;
-import android.util.AndroidException;
-import android.util.Log;
+import java.lang.ref.WeakReference;
import java.util.HashMap;
+import java.util.Map;
+import java.util.WeakHashMap;
/**
* Manager object for looking up LoWPAN interfaces.
*
* @hide
*/
-//@SystemApi
+// @SystemApi
public class LowpanManager {
private static final String TAG = LowpanManager.class.getSimpleName();
- //////////////////////////////////////////////////////////////////////////
- // Public Classes
-
/** @hide */
- //@SystemApi
+ // @SystemApi
public abstract static class Callback {
- public void onInterfaceAdded(LowpanInterface lowpan_interface) {}
+ public void onInterfaceAdded(LowpanInterface lowpanInterface) {}
- public void onInterfaceRemoved(LowpanInterface lowpan_interface) {}
+ public void onInterfaceRemoved(LowpanInterface lowpanInterface) {}
}
- //////////////////////////////////////////////////////////////////////////
- // Instance Variables
+ private final Map<Integer, ILowpanManagerListener> mListenerMap = new HashMap<>();
+ private final Map<String, LowpanInterface> mInterfaceCache = new HashMap<>();
- private ILowpanManager mManager;
- private HashMap<Integer, ILowpanManagerListener> mListenerMap = new HashMap<>();
+ /* This is a WeakHashMap because we don't want to hold onto
+ * a strong reference to ILowpanInterface, so that it can be
+ * garbage collected if it isn't being used anymore. Since
+ * the value class holds onto this specific ILowpanInterface,
+ * we also need to have a weak reference to the value.
+ * This design pattern allows us to skip removal of items
+ * from this Map without leaking memory.
+ */
+ private final Map<ILowpanInterface, WeakReference<LowpanInterface>> mBinderCache =
+ new WeakHashMap<>();
- //////////////////////////////////////////////////////////////////////////
+ private final ILowpanManager mService;
+ private final Context mContext;
+ private final Looper mLooper;
- private static LowpanManager sSingletonInstance;
-
- //////////////////////////////////////////////////////////////////////////
// Static Methods
- /** Returns a reference to the LowpanManager object, allocating it if necessary. */
- public static LowpanManager getManager() {
- return from(null);
- }
-
public static LowpanManager from(Context context) {
- // TODO: Actually get this from the context!
-
- if (sSingletonInstance == null) {
- sSingletonInstance = new LowpanManager();
- }
- return sSingletonInstance;
+ return (LowpanManager) context.getSystemService(Context.LOWPAN_SERVICE);
}
- //////////////////////////////////////////////////////////////////////////
+ /** @hide */
+ public static LowpanManager getManager() {
+ IBinder binder = ServiceManager.getService(Context.LOWPAN_SERVICE);
+
+ if (binder != null) {
+ ILowpanManager service = ILowpanManager.Stub.asInterface(binder);
+ return new LowpanManager(service);
+ }
+
+ return null;
+ }
+
// Constructors
- /**
- * Private LowpanManager constructor. Since we are a singleton, we do not allow external
- * construction.
- */
- private LowpanManager() {}
-
- //////////////////////////////////////////////////////////////////////////
- // Private Methods
-
- /**
- * Returns a reference to the ILowpanManager interface, provided by the LoWPAN Manager Service.
- */
- @Nullable
- private ILowpanManager getILowpanManager() {
- ILowpanManager manager = mManager;
- if (manager == null) {
- IBinder serviceBinder =
- new ServiceManager().getService(ILowpanManager.LOWPAN_SERVICE_NAME);
- mManager = manager = ILowpanManager.Stub.asInterface(serviceBinder);
-
- // Add any listeners
- synchronized (mListenerMap) {
- for (Integer hashObj : mListenerMap.keySet()) {
- try {
- manager.addListener(mListenerMap.get(hashObj));
- } catch (RemoteException x) {
- // Consider any failure here as implying the manager is defunct
- mManager = manager = null;
- }
- }
- }
- }
- return manager;
+ LowpanManager(ILowpanManager service) {
+ mService = service;
+ mContext = null;
+ mLooper = null;
}
- //////////////////////////////////////////////////////////////////////////
- // Public Methods
+ /**
+ * Create a new LowpanManager instance. Applications will almost always want to use {@link
+ * android.content.Context#getSystemService Context.getSystemService()} to retrieve the standard
+ * {@link android.content.Context#LOWPAN_SERVICE Context.LOWPAN_SERVICE}.
+ *
+ * @param context the application context
+ * @param service the Binder interface
+ * @param looper the default Looper to run callbacks on
+ * @hide - hide this because it takes in a parameter of type ILowpanManager, which is a system
+ * private class.
+ */
+ public LowpanManager(Context context, ILowpanManager service, Looper looper) {
+ mContext = context;
+ mService = service;
+ mLooper = looper;
+ }
+
+ /** @hide */
+ @Nullable
+ public LowpanInterface getInterface(@NonNull ILowpanInterface ifaceService) {
+ LowpanInterface iface = null;
+
+ try {
+ synchronized (mBinderCache) {
+ if (mBinderCache.containsKey(ifaceService)) {
+ iface = mBinderCache.get(ifaceService).get();
+ }
+
+ if (iface == null) {
+ String ifaceName = ifaceService.getName();
+
+ iface = new LowpanInterface(mContext, ifaceService, mLooper);
+
+ synchronized (mInterfaceCache) {
+ mInterfaceCache.put(iface.getName(), iface);
+ }
+
+ mBinderCache.put(ifaceService, new WeakReference(iface));
+
+ /* Make sure we remove the object from the
+ * interface cache if the associated service
+ * dies.
+ */
+ ifaceService
+ .asBinder()
+ .linkToDeath(
+ new IBinder.DeathRecipient() {
+ @Override
+ public void binderDied() {
+ synchronized (mInterfaceCache) {
+ LowpanInterface iface =
+ mInterfaceCache.get(ifaceName);
+
+ if ((iface != null)
+ && (iface.getService() == ifaceService)) {
+ mInterfaceCache.remove(ifaceName);
+ }
+ }
+ }
+ },
+ 0);
+ }
+ }
+ } catch (RemoteException x) {
+ throw x.rethrowAsRuntimeException();
+ }
+
+ return iface;
+ }
/**
* Returns a reference to the requested LowpanInterface object. If the given interface doesn't
@@ -122,26 +166,32 @@
*/
@Nullable
public LowpanInterface getInterface(@NonNull String name) {
- LowpanInterface ret = null;
- ILowpanManager manager = getILowpanManager();
+ LowpanInterface iface = null;
- // Maximum number of tries is two. We should only try
- // more than once if our manager has died or there
- // was some sort of AIDL buffer full event.
- for (int i = 0; i < 2 && manager != null; i++) {
- try {
- ILowpanInterface iface = manager.getInterface(name);
- if (iface != null) {
- ret = LowpanInterface.getInterfaceFromBinder(iface.asBinder());
+ try {
+ /* This synchronized block covers both branches of the enclosed
+ * if() statement in order to avoid a race condition. Two threads
+ * calling getInterface() with the same name would race to create
+ * the associated LowpanInterface object, creating two of them.
+ * Having the whole block be synchronized avoids that race.
+ */
+ synchronized (mInterfaceCache) {
+ if (mInterfaceCache.containsKey(name)) {
+ iface = mInterfaceCache.get(name);
+
+ } else {
+ ILowpanInterface ifaceService = mService.getInterface(name);
+
+ if (ifaceService != null) {
+ iface = getInterface(ifaceService);
+ }
}
- break;
- } catch (RemoteException x) {
- // In all of the cases when we get this exception, we reconnect and try again
- mManager = null;
- manager = getILowpanManager();
}
+ } catch (RemoteException x) {
+ throw x.rethrowFromSystemServer();
}
- return ret;
+
+ return iface;
}
/**
@@ -151,7 +201,7 @@
@Nullable
public LowpanInterface getInterface() {
String[] ifaceList = getInterfaceList();
- if (ifaceList != null && ifaceList.length > 0) {
+ if (ifaceList.length > 0) {
return getInterface(ifaceList[0]);
}
return null;
@@ -163,31 +213,11 @@
*/
@NonNull
public String[] getInterfaceList() {
- ILowpanManager manager = getILowpanManager();
-
- if (manager != null) {
- try {
- return manager.getInterfaceList();
-
- } catch (RemoteException x) {
- // In all of the cases when we get this exception, we reconnect and try again
- mManager = null;
- try {
- manager = getILowpanManager();
- if (manager != null) {
- return manager.getInterfaceList();
- }
- } catch (RemoteException ex) {
- // Something weird is going on, so we log it
- // and fall back thru to returning an empty array.
- Log.e(TAG, ex.toString());
- mManager = null;
- }
- }
+ try {
+ return mService.getInterfaceList();
+ } catch (RemoteException x) {
+ throw x.rethrowFromSystemServer();
}
-
- // Return empty list if we have no service.
- return new String[0];
}
/**
@@ -200,55 +230,52 @@
throws LowpanException {
ILowpanManagerListener.Stub listenerBinder =
new ILowpanManagerListener.Stub() {
- public void onInterfaceAdded(ILowpanInterface lowpan_interface) {
- Runnable runnable =
- new Runnable() {
- @Override
- public void run() {
- cb.onInterfaceAdded(
- LowpanInterface.getInterfaceFromBinder(
- lowpan_interface.asBinder()));
- }
- };
+ private Handler mHandler;
+ {
if (handler != null) {
- handler.post(runnable);
+ mHandler = handler;
+ } else if (mLooper != null) {
+ mHandler = new Handler(mLooper);
} else {
- runnable.run();
+ mHandler = new Handler();
}
}
- public void onInterfaceRemoved(ILowpanInterface lowpan_interface) {
+ @Override
+ public void onInterfaceAdded(ILowpanInterface ifaceService) {
Runnable runnable =
- new Runnable() {
- @Override
- public void run() {
- cb.onInterfaceRemoved(
- LowpanInterface.getInterfaceFromBinder(
- lowpan_interface.asBinder()));
+ () -> {
+ LowpanInterface iface = getInterface(ifaceService);
+
+ if (iface != null) {
+ cb.onInterfaceAdded(iface);
}
};
- if (handler != null) {
- handler.post(runnable);
- } else {
- runnable.run();
- }
+ mHandler.post(runnable);
+ }
+
+ @Override
+ public void onInterfaceRemoved(ILowpanInterface ifaceService) {
+ Runnable runnable =
+ () -> {
+ LowpanInterface iface = getInterface(ifaceService);
+
+ if (iface != null) {
+ cb.onInterfaceRemoved(iface);
+ }
+ };
+
+ mHandler.post(runnable);
}
};
- ILowpanManager manager = getILowpanManager();
- if (manager != null) {
- try {
- manager.addListener(listenerBinder);
- } catch (DeadObjectException x) {
- mManager = null;
- // Tickle the ILowpanManager instance, which might
- // get us added back.
- getILowpanManager();
- } catch (Throwable x) {
- LowpanException.throwAsPublicException(x);
- }
+ try {
+ mService.addListener(listenerBinder);
+ } catch (RemoteException x) {
+ throw x.rethrowFromSystemServer();
}
+
synchronized (mListenerMap) {
mListenerMap.put(Integer.valueOf(System.identityHashCode(cb)), listenerBinder);
}
@@ -264,20 +291,23 @@
*
* @hide
*/
- public void unregisterCallback(@NonNull Callback cb) throws AndroidException {
+ public void unregisterCallback(@NonNull Callback cb) {
Integer hashCode = Integer.valueOf(System.identityHashCode(cb));
- ILowpanManagerListener listenerBinder = mListenerMap.get(hashCode);
+ ILowpanManagerListener listenerBinder = null;
+
+ synchronized (mListenerMap) {
+ listenerBinder = mListenerMap.get(hashCode);
+ mListenerMap.remove(hashCode);
+ }
+
if (listenerBinder != null) {
- synchronized (mListenerMap) {
- mListenerMap.remove(hashCode);
+ try {
+ mService.removeListener(listenerBinder);
+ } catch (RemoteException x) {
+ throw x.rethrowFromSystemServer();
}
- if (getILowpanManager() != null) {
- try {
- mManager.removeListener(listenerBinder);
- } catch (DeadObjectException x) {
- mManager = null;
- }
- }
+ } else {
+ throw new RuntimeException("Attempt to unregister an unknown callback");
}
}
}
diff --git a/lowpan/java/android/net/lowpan/LowpanProperties.java b/lowpan/java/android/net/lowpan/LowpanProperties.java
index 0d5acc2..cc45ff85 100644
--- a/lowpan/java/android/net/lowpan/LowpanProperties.java
+++ b/lowpan/java/android/net/lowpan/LowpanProperties.java
@@ -16,83 +16,14 @@
package android.net.lowpan;
-import android.net.LinkAddress;
-import android.net.RouteInfo;
-import java.util.List;
-
/** {@hide} */
public final class LowpanProperties {
- public static final LowpanProperty<Boolean> KEY_INTERFACE_ENABLED =
- new LowpanStandardProperty(
- "android.net.lowpan.property.INTERFACE_ENABLED", Boolean.class);
- public static final LowpanProperty<Boolean> KEY_INTERFACE_COMMISSIONED =
- new LowpanStandardProperty(
- "android.net.lowpan.property.INTERFACE_COMMISSIONED", Boolean.class);
- public static final LowpanProperty<Boolean> KEY_INTERFACE_CONNECTED =
- new LowpanStandardProperty(
- "android.net.lowpan.property.INTERFACE_CONNECTED", Boolean.class);
- public static final LowpanProperty<Boolean> KEY_INTERFACE_UP =
- new LowpanStandardProperty("android.net.lowpan.property.INTERFACE_UP", Boolean.class);
- public static final LowpanProperty<String> KEY_INTERFACE_STATE =
- new LowpanStandardProperty("android.net.lowpan.property.INTERFACE_STATE", String.class);
-
- public static final LowpanProperty<String> KEY_NETWORK_NAME =
- new LowpanStandardProperty("android.net.lowpan.property.NETWORK_NAME", Boolean.class);
- public static final LowpanProperty<Integer> KEY_NETWORK_PANID =
- new LowpanStandardProperty("android.net.lowpan.property.NETWORK_PANID", Integer.class);
- public static final LowpanProperty<byte[]> KEY_NETWORK_XPANID =
- new LowpanStandardProperty("android.net.lowpan.property.NETWORK_XPANID", byte[].class);
- public static final LowpanProperty<byte[]> KEY_NETWORK_MASTER_KEY =
- new LowpanStandardProperty(
- "android.net.lowpan.property.NETWORK_MASTER_KEY", byte[].class);
- public static final LowpanProperty<Integer> KEY_NETWORK_MASTER_KEY_INDEX =
- new LowpanStandardProperty(
- "android.net.lowpan.property.NETWORK_MASTER_KEY_INDEX", Integer.class);
- public static final LowpanProperty<Integer> KEY_NETWORK_TYPE =
- new LowpanStandardProperty("android.net.lowpan.property.NETWORK_TYPE", Integer.class);
- public static final LowpanProperty<String> KEY_NETWORK_ROLE =
- new LowpanStandardProperty("android.net.lowpan.property.NETWORK_ROLE", String.class);
-
- public static final LowpanProperty<Integer> KEY_CHANNEL =
- new LowpanStandardProperty("android.net.lowpan.property.CHANNEL", Integer.class);
public static final LowpanProperty<int[]> KEY_CHANNEL_MASK =
new LowpanStandardProperty("android.net.lowpan.property.CHANNEL_MASK", int[].class);
+
public static final LowpanProperty<Integer> KEY_MAX_TX_POWER =
new LowpanStandardProperty("android.net.lowpan.property.MAX_TX_POWER", Integer.class);
- public static final LowpanProperty<Integer> KEY_RSSI =
- new LowpanStandardProperty("android.net.lowpan.property.RSSI", Integer.class);
-
- public static final LowpanProperty<Integer> KEY_LQI =
- new LowpanStandardProperty("android.net.lowpan.property.LQI", Integer.class);
- public static final LowpanProperty<byte[]> KEY_BEACON_ADDRESS =
- new LowpanStandardProperty("android.net.lowpan.property.BEACON_ADDRESS", byte[].class);
- public static final LowpanProperty<Boolean> KEY_BEACON_CAN_ASSIST =
- new LowpanStandardProperty(
- "android.net.lowpan.property.BEACON_CAN_ASSIST", Boolean.class);
-
- public static final LowpanProperty<String> KEY_DRIVER_VERSION =
- new LowpanStandardProperty("android.net.lowpan.property.DRIVER_VERSION", String.class);
-
- public static final LowpanProperty<String> KEY_NCP_VERSION =
- new LowpanStandardProperty("android.net.lowpan.property.NCP_VERSION", String.class);
-
- public static final LowpanProperty<List<LinkAddress>> KEY_LINK_ADDRESS_ARRAY =
- new LowpanStandardProperty(
- "android.net.lowpan.property.LINK_ADDRESS_ARRAY", LinkAddress[].class);
-
- public static final LowpanProperty<List<RouteInfo>> KEY_ROUTE_INFO_ARRAY =
- new LowpanStandardProperty(
- "android.net.lowpan.property.ROUTE_INFO_ARRAY", RouteInfo[].class);
-
- /** @hide */
- public static final LowpanProperty<byte[]> KEY_EXTENDED_ADDRESS =
- new LowpanStandardProperty(
- "android.net.lowpan.property.EXTENDED_ADDRESS", byte[].class);
-
- /** @hide */
- public static final LowpanProperty<byte[]> KEY_MAC_ADDRESS =
- new LowpanStandardProperty("android.net.lowpan.property.MAC_ADDRESS", byte[].class);
/** @hide */
private LowpanProperties() {}
diff --git a/lowpan/java/android/net/lowpan/LowpanProvision.aidl b/lowpan/java/android/net/lowpan/LowpanProvision.aidl
new file mode 100644
index 0000000..100e9dc
--- /dev/null
+++ b/lowpan/java/android/net/lowpan/LowpanProvision.aidl
@@ -0,0 +1,19 @@
+/**
+ * Copyright (C) 2017 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.net.lowpan;
+
+parcelable LowpanProvision cpp_header "android/net/lowpan/LowpanProvision.h";
diff --git a/lowpan/java/android/net/lowpan/LowpanProvision.java b/lowpan/java/android/net/lowpan/LowpanProvision.java
index ace1f9c..f126003 100644
--- a/lowpan/java/android/net/lowpan/LowpanProvision.java
+++ b/lowpan/java/android/net/lowpan/LowpanProvision.java
@@ -18,21 +18,22 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
-import java.util.Map;
+import android.os.Parcel;
+import android.os.Parcelable;
+import java.util.Objects;
/**
* Describes the information needed to describe a network
*
* @hide
*/
-//@SystemApi
-public class LowpanProvision {
+// @SystemApi
+public class LowpanProvision implements Parcelable {
- //////////////////////////////////////////////////////////////////////////
// Builder
/** @hide */
- //@SystemApi
+ // @SystemApi
public static class Builder {
private final LowpanProvision provision = new LowpanProvision();
@@ -53,13 +54,11 @@
private LowpanProvision() {}
- //////////////////////////////////////////////////////////////////////////
// Instance Variables
private LowpanIdentity mIdentity = new LowpanIdentity();
private LowpanCredential mCredential = null;
- //////////////////////////////////////////////////////////////////////////
// Public Getters and Setters
@NonNull
@@ -72,21 +71,6 @@
return mCredential;
}
- //////////////////////////////////////////////////////////////////////////
- // LoWPAN-Internal Methods
-
- static void addToMap(Map<String, Object> parameters, LowpanProvision provision)
- throws LowpanException {
- provision.mIdentity.addToMap(parameters);
- if (provision.mCredential != null) {
- provision.mCredential.addToMap(parameters);
- }
- }
-
- void addToMap(Map<String, Object> parameters) throws LowpanException {
- addToMap(parameters, this);
- }
-
@Override
public String toString() {
StringBuffer sb = new StringBuffer();
@@ -94,11 +78,72 @@
sb.append("LowpanProvision { identity => ").append(mIdentity.toString());
if (mCredential != null) {
- sb.append(", credential: ").append(mCredential.toString());
+ sb.append(", credential => ").append(mCredential.toString());
}
sb.append("}");
return sb.toString();
}
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mIdentity, mCredential);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof LowpanProvision)) {
+ return false;
+ }
+ LowpanProvision rhs = (LowpanProvision) obj;
+
+ if (!mIdentity.equals(rhs.mIdentity)) {
+ return false;
+ }
+
+ if (!Objects.equals(mCredential, rhs.mCredential)) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /** Implement the Parcelable interface. */
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ /** Implement the Parcelable interface. */
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ mIdentity.writeToParcel(dest, flags);
+ if (mCredential == null) {
+ dest.writeBoolean(false);
+ } else {
+ dest.writeBoolean(true);
+ mCredential.writeToParcel(dest, flags);
+ }
+ }
+
+ /** Implement the Parcelable interface. */
+ public static final Creator<LowpanProvision> CREATOR =
+ new Creator<LowpanProvision>() {
+ public LowpanProvision createFromParcel(Parcel in) {
+ Builder builder = new Builder();
+
+ builder.setLowpanIdentity(LowpanIdentity.CREATOR.createFromParcel(in));
+
+ if (in.readBoolean()) {
+ builder.setLowpanCredential(LowpanCredential.CREATOR.createFromParcel(in));
+ }
+
+ return builder.build();
+ }
+
+ public LowpanProvision[] newArray(int size) {
+ return new LowpanProvision[size];
+ }
+ };
};
diff --git a/lowpan/java/android/net/lowpan/LowpanRuntimeException.java b/lowpan/java/android/net/lowpan/LowpanRuntimeException.java
new file mode 100644
index 0000000..71a5a13
--- /dev/null
+++ b/lowpan/java/android/net/lowpan/LowpanRuntimeException.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2017 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.net.lowpan;
+
+import android.util.AndroidRuntimeException;
+
+/**
+ * Generic runtime exception for LoWPAN operations.
+ *
+ * @hide
+ */
+// @SystemApi
+public class LowpanRuntimeException extends AndroidRuntimeException {
+
+ public LowpanRuntimeException() {}
+
+ public LowpanRuntimeException(String message) {
+ super(message);
+ }
+
+ public LowpanRuntimeException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public LowpanRuntimeException(Exception cause) {
+ super(cause);
+ }
+}
diff --git a/lowpan/java/android/net/lowpan/LowpanScanner.java b/lowpan/java/android/net/lowpan/LowpanScanner.java
index 754f72e3..59156c4 100644
--- a/lowpan/java/android/net/lowpan/LowpanScanner.java
+++ b/lowpan/java/android/net/lowpan/LowpanScanner.java
@@ -21,11 +21,9 @@
import android.os.Handler;
import android.os.RemoteException;
import android.os.ServiceSpecificException;
-import android.util.Log;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
/**
@@ -36,11 +34,10 @@
* @see LowpanInterface
* @hide
*/
-//@SystemApi
+// @SystemApi
public class LowpanScanner {
- private static final String TAG = LowpanInterface.class.getSimpleName();
+ private static final String TAG = LowpanScanner.class.getSimpleName();
- //////////////////////////////////////////////////////////////////////////
// Public Classes
/**
@@ -48,7 +45,7 @@
*
* @hide
*/
- //@SystemApi
+ // @SystemApi
public abstract static class Callback {
public void onNetScanBeacon(LowpanBeaconInfo beacon) {}
@@ -57,16 +54,14 @@
public void onScanFinished() {}
}
- //////////////////////////////////////////////////////////////////////////
// Instance Variables
private ILowpanInterface mBinder;
private Callback mCallback = null;
private Handler mHandler = null;
- private List<Integer> mChannelMask = null;
+ private ArrayList<Integer> mChannelMask = null;
private int mTxPower = Integer.MAX_VALUE;
- //////////////////////////////////////////////////////////////////////////
// Constructors/Accessors and Exception Glue
LowpanScanner(@NonNull ILowpanInterface binder) {
@@ -74,7 +69,7 @@
}
/** Sets an instance of {@link LowpanScanner.Callback} to receive events. */
- public void setCallback(@Nullable Callback cb, @Nullable Handler handler) {
+ public synchronized void setCallback(@Nullable Callback cb, @Nullable Handler handler) {
mCallback = cb;
mHandler = handler;
}
@@ -110,7 +105,7 @@
* @return the current channel mask, or <code>null</code> if no channel mask is currently set.
*/
public @Nullable Collection<Integer> getChannelMask() {
- return mChannelMask.clone();
+ return (Collection<Integer>) mChannelMask.clone();
}
/**
@@ -178,18 +173,20 @@
ILowpanNetScanCallback binderListener =
new ILowpanNetScanCallback.Stub() {
- public void onNetScanBeacon(Map parameters) {
- Callback callback = mCallback;
- Handler handler = mHandler;
+ public void onNetScanBeacon(LowpanBeaconInfo beaconInfo) {
+ Callback callback;
+ Handler handler;
+
+ synchronized (LowpanScanner.this) {
+ callback = mCallback;
+ handler = mHandler;
+ }
if (callback == null) {
return;
}
- Runnable runnable = () -> callback.onNetScanBeacon(
- new LowpanBeaconInfo.Builder()
- .updateFromMap(parameters)
- .build());
+ Runnable runnable = () -> callback.onNetScanBeacon(beaconInfo);
if (handler != null) {
handler.post(runnable);
@@ -199,8 +196,13 @@
}
public void onNetScanFinished() {
- Callback callback = mCallback;
- Handler handler = mHandler;
+ Callback callback;
+ Handler handler;
+
+ synchronized (LowpanScanner.this) {
+ callback = mCallback;
+ handler = mHandler;
+ }
if (callback == null) {
return;
@@ -218,8 +220,12 @@
try {
mBinder.startNetScan(map, binderListener);
- } catch (ServiceSpecificException|RemoteException x) {
- LowpanException.throwAsPublicException(x);
+
+ } catch (RemoteException x) {
+ throw x.rethrowAsRuntimeException();
+
+ } catch (ServiceSpecificException x) {
+ throw LowpanException.rethrowFromServiceSpecificException(x);
}
}
@@ -231,9 +237,9 @@
public void stopNetScan() {
try {
mBinder.stopNetScan();
+
} catch (RemoteException x) {
- // Catch and ignore all binder exceptions
- Log.e(TAG, x.toString());
+ throw x.rethrowAsRuntimeException();
}
}
@@ -257,7 +263,8 @@
return;
}
- Runnable runnable = () -> {
+ Runnable runnable =
+ () -> {
if (callback != null) {
LowpanEnergyScanResult result =
new LowpanEnergyScanResult();
@@ -294,10 +301,12 @@
try {
mBinder.startEnergyScan(map, binderListener);
+
} catch (RemoteException x) {
- LowpanException.throwAsPublicException(x);
+ throw x.rethrowAsRuntimeException();
+
} catch (ServiceSpecificException x) {
- LowpanException.throwAsPublicException(x);
+ throw LowpanException.rethrowFromServiceSpecificException(x);
}
}
@@ -309,9 +318,9 @@
public void stopEnergyScan() {
try {
mBinder.stopEnergyScan();
+
} catch (RemoteException x) {
- // Catch and ignore all binder exceptions
- Log.e(TAG, x.toString());
+ throw x.rethrowAsRuntimeException();
}
}
}
diff --git a/lowpan/java/android/net/lowpan/NetworkAlreadyExistsException.java b/lowpan/java/android/net/lowpan/NetworkAlreadyExistsException.java
new file mode 100644
index 0000000..90ef498
--- /dev/null
+++ b/lowpan/java/android/net/lowpan/NetworkAlreadyExistsException.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2017 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.net.lowpan;
+
+/**
+ * Exception indicating the form operation found a network nearby with the same identity.
+ *
+ * @see LowpanInterface
+ * @hide
+ */
+// @SystemApi
+public class NetworkAlreadyExistsException extends LowpanException {
+
+ public NetworkAlreadyExistsException() {}
+
+ public NetworkAlreadyExistsException(String message) {
+ super(message, null);
+ }
+
+ public NetworkAlreadyExistsException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public NetworkAlreadyExistsException(Exception cause) {
+ super(cause);
+ }
+}
diff --git a/lowpan/java/android/net/lowpan/OperationCanceledException.java b/lowpan/java/android/net/lowpan/OperationCanceledException.java
new file mode 100644
index 0000000..fcafe3a
--- /dev/null
+++ b/lowpan/java/android/net/lowpan/OperationCanceledException.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2017 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.net.lowpan;
+
+/**
+ * Exception indicating this operation was canceled by the driver before it could finish.
+ *
+ * @see LowpanInterface
+ * @hide
+ */
+// @SystemApi
+public class OperationCanceledException extends LowpanException {
+
+ public OperationCanceledException() {}
+
+ public OperationCanceledException(String message) {
+ super(message);
+ }
+
+ public OperationCanceledException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ protected OperationCanceledException(Exception cause) {
+ super(cause);
+ }
+}
diff --git a/lowpan/java/android/net/lowpan/WrongStateException.java b/lowpan/java/android/net/lowpan/WrongStateException.java
new file mode 100644
index 0000000..3565419
--- /dev/null
+++ b/lowpan/java/android/net/lowpan/WrongStateException.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2017 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.net.lowpan;
+
+/**
+ * Exception indicating the interface is the wrong state for an operation.
+ *
+ * @see LowpanInterface
+ * @hide
+ */
+// @SystemApi
+public class WrongStateException extends LowpanException {
+
+ public WrongStateException() {}
+
+ public WrongStateException(String message) {
+ super(message);
+ }
+
+ public WrongStateException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ protected WrongStateException(Exception cause) {
+ super(cause);
+ }
+}
diff --git a/lowpan/tests/Android.mk b/lowpan/tests/Android.mk
new file mode 100644
index 0000000..bb0a944
--- /dev/null
+++ b/lowpan/tests/Android.mk
@@ -0,0 +1,65 @@
+# Copyright (C) 2017 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+# Make test APK
+# ============================================================
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-subdir-java-files)
+
+# This list is generated from the java source files in this module
+# The list is a comma separated list of class names with * matching zero or more characters.
+# Example:
+# Input files: src/com/android/server/lowpan/Test.java src/com/android/server/lowpan/AnotherTest.java
+# Generated exclude list: com.android.server.lowpan.Test*,com.android.server.lowpan.AnotherTest*
+
+# Filter all src files to just java files
+local_java_files := $(filter %.java,$(LOCAL_SRC_FILES))
+# Transform java file names into full class names.
+# This only works if the class name matches the file name and the directory structure
+# matches the package.
+local_classes := $(subst /,.,$(patsubst src/%.java,%,$(local_java_files)))
+# Utility variables to allow replacing a space with a comma
+comma:= ,
+empty:=
+space:= $(empty) $(empty)
+# Convert class name list to jacoco exclude list
+# This appends a * to all classes and replace the space separators with commas.
+# These patterns will match all classes in this module and their inner classes.
+jacoco_exclude := $(subst $(space),$(comma),$(patsubst %,%*,$(local_classes)))
+
+jacoco_include := android.net.lowpan.*
+
+LOCAL_JACK_COVERAGE_INCLUDE_FILTER := $(jacoco_include)
+LOCAL_JACK_COVERAGE_EXCLUDE_FILTER := $(jacoco_exclude)
+
+LOCAL_STATIC_JAVA_LIBRARIES := \
+ android-support-test \
+ guava \
+ mockito-target-minus-junit4 \
+ frameworks-base-testutils \
+
+LOCAL_JAVA_LIBRARIES := \
+ android.test.runner \
+
+LOCAL_PACKAGE_NAME := FrameworksLowpanApiTests
+LOCAL_COMPATIBILITY_SUITE := device-tests
+
+LOCAL_CERTIFICATE := platform
+LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
+include $(BUILD_PACKAGE)
diff --git a/lowpan/tests/AndroidManifest.xml b/lowpan/tests/AndroidManifest.xml
new file mode 100644
index 0000000..a216214
--- /dev/null
+++ b/lowpan/tests/AndroidManifest.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2017 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="android.net.lowpan.test">
+
+ <application>
+ <uses-library android:name="android.test.runner" />
+ <activity android:label="LowpanTestDummyLabel"
+ android:name="LowpanTestDummyName">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER"/>
+ </intent-filter>
+ </activity>
+ </application>
+
+ <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+ android:targetPackage="android.net.lowpan.test"
+ android:label="Frameworks LoWPAN API Tests">
+ </instrumentation>
+
+</manifest>
diff --git a/lowpan/tests/AndroidTest.xml b/lowpan/tests/AndroidTest.xml
new file mode 100644
index 0000000..72ad050
--- /dev/null
+++ b/lowpan/tests/AndroidTest.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+<configuration description="Runs Frameworks LoWPAN API Tests.">
+ <target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup">
+ <option name="test-file-name" value="FrameworksLowpanApiTests.apk" />
+ </target_preparer>
+
+ <option name="test-suite-tag" value="apct" />
+ <option name="test-tag" value="FrameworksLowpanApiTests" />
+ <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
+ <option name="package" value="android.net.lowpan.test" />
+ <option name="runner" value="android.support.test.runner.AndroidJUnitRunner" />
+ </test>
+</configuration>
diff --git a/lowpan/tests/README.md b/lowpan/tests/README.md
new file mode 100644
index 0000000..d0eed95
--- /dev/null
+++ b/lowpan/tests/README.md
@@ -0,0 +1,50 @@
+# LoWPAN Unit Tests
+This package contains unit tests for the android LoWPAN framework System APIs based on the
+[Android Testing Support Library](http://developer.android.com/tools/testing-support-library/index.html).
+The test cases are built using the [JUnit](http://junit.org/) and [Mockito](http://mockito.org/)
+libraries.
+
+## Running Tests
+The easiest way to run tests is simply run
+
+```
+frameworks/base/lowpan/tests/runtests.sh
+```
+
+`runtests.sh` will build the test project and all of its dependencies and push the APK to the
+connected device. It will then run the tests on the device.
+
+To pick up changes in framework/base, you will need to:
+1. rebuild the framework library 'make -j32'
+2. sync over the updated library to the device 'adb sync'
+3. restart framework on the device 'adb shell stop' then 'adb shell start'
+
+To enable syncing data to the device for first time after clean reflash:
+1. adb disable-verity
+2. adb reboot
+3. adb remount
+
+See below for a few example of options to limit which tests are run.
+See the
+[AndroidJUnitRunner Documentation](https://developer.android.com/reference/android/support/test/runner/AndroidJUnitRunner.html)
+for more details on the supported options.
+
+```
+runtests.sh -e package android.net.lowpan
+runtests.sh -e class android.net.lowpan.LowpanManagerTest
+```
+
+If you manually build and push the test APK to the device you can run tests using
+
+```
+adb shell am instrument -w 'android.net.wifi.test/android.support.test.runner.AndroidJUnitRunner'
+```
+
+## Adding Tests
+Tests can be added by adding classes to the src directory. JUnit4 style test cases can
+be written by simply annotating test methods with `org.junit.Test`.
+
+## Debugging Tests
+If you are trying to debug why tests are not doing what you expected, you can add android log
+statements and use logcat to view them. The beginning and end of every tests is automatically logged
+with the tag `TestRunner`.
diff --git a/lowpan/tests/runtests.sh b/lowpan/tests/runtests.sh
new file mode 100755
index 0000000..040f4f0
--- /dev/null
+++ b/lowpan/tests/runtests.sh
@@ -0,0 +1,24 @@
+#!/usr/bin/env bash
+
+if [ -z $ANDROID_BUILD_TOP ]; then
+ echo "You need to source and lunch before you can use this script"
+ exit 1
+fi
+
+echo "Running tests"
+
+set -e # fail early
+
+echo "+ mmma -j32 $ANDROID_BUILD_TOP/frameworks/base/lowpan/tests"
+# NOTE Don't actually run the command above since this shell doesn't inherit functions from the
+# caller.
+make -j32 -C $ANDROID_BUILD_TOP -f build/core/main.mk MODULES-IN-frameworks-base-lowpan-tests
+
+set -x # print commands
+
+adb root
+adb wait-for-device
+
+adb install -r -g "$OUT/data/app/FrameworksLowpanApiTests/FrameworksLowpanApiTests.apk"
+
+adb shell am instrument -w "$@" 'android.net.lowpan.test/android.support.test.runner.AndroidJUnitRunner'
diff --git a/lowpan/tests/src/android/net/lowpan/LowpanInterfaceTest.java b/lowpan/tests/src/android/net/lowpan/LowpanInterfaceTest.java
new file mode 100644
index 0000000..a495d3d
--- /dev/null
+++ b/lowpan/tests/src/android/net/lowpan/LowpanInterfaceTest.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2017 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.net.lowpan;
+
+import static org.mockito.Mockito.*;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.test.TestLooper;
+import android.support.test.runner.AndroidJUnit4;
+import android.test.suitebuilder.annotation.SmallTest;
+import java.util.Map;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+/** Unit tests for android.net.lowpan.LowpanInterface. */
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class LowpanInterfaceTest {
+ private static final String TEST_PACKAGE_NAME = "TestPackage";
+
+ @Mock Context mContext;
+ @Mock ILowpanInterface mLowpanInterfaceService;
+ @Mock IBinder mLowpanInterfaceBinder;
+ @Mock ApplicationInfo mApplicationInfo;
+ @Mock IBinder mAppBinder;
+ @Mock LowpanInterface.Callback mLowpanInterfaceCallback;
+
+ private Handler mHandler;
+ private final TestLooper mTestLooper = new TestLooper();
+ private ILowpanInterfaceListener mInterfaceListener;
+ private LowpanInterface mLowpanInterface;
+ private Map<String, Object> mPropertyMap;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+ when(mContext.getApplicationInfo()).thenReturn(mApplicationInfo);
+ when(mContext.getOpPackageName()).thenReturn(TEST_PACKAGE_NAME);
+ when(mLowpanInterfaceService.getName()).thenReturn("wpan0");
+ when(mLowpanInterfaceService.asBinder()).thenReturn(mLowpanInterfaceBinder);
+
+ mLowpanInterface =
+ new LowpanInterface(mContext, mLowpanInterfaceService, mTestLooper.getLooper());
+ }
+
+ @Test
+ public void testStateChangedCallback() throws Exception {
+ // Register our callback
+ mLowpanInterface.registerCallback(mLowpanInterfaceCallback);
+
+ // Verify a listener was added
+ verify(mLowpanInterfaceService)
+ .addListener(
+ argThat(
+ listener -> {
+ mInterfaceListener = listener;
+ return listener instanceof ILowpanInterfaceListener;
+ }));
+
+ // Change some properties
+ mInterfaceListener.onStateChanged(LowpanInterface.STATE_OFFLINE);
+ mTestLooper.dispatchAll();
+
+ // Verify that the property was changed
+ verify(mLowpanInterfaceCallback)
+ .onStateChanged(
+ argThat(stateString -> stateString.equals(LowpanInterface.STATE_OFFLINE)));
+ }
+}
diff --git a/lowpan/tests/src/android/net/lowpan/LowpanManagerTest.java b/lowpan/tests/src/android/net/lowpan/LowpanManagerTest.java
new file mode 100644
index 0000000..3dd7504
--- /dev/null
+++ b/lowpan/tests/src/android/net/lowpan/LowpanManagerTest.java
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2017 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.net.lowpan;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.*;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.test.TestLooper;
+import android.support.test.runner.AndroidJUnit4;
+import android.test.suitebuilder.annotation.SmallTest;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+/** Unit tests for android.net.lowpan.LowpanManager. */
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class LowpanManagerTest {
+ private static final String TEST_PACKAGE_NAME = "TestPackage";
+
+ @Mock Context mContext;
+ @Mock ILowpanManager mLowpanService;
+ @Mock ILowpanInterface mLowpanInterfaceService;
+ @Mock IBinder mLowpanInterfaceBinder;
+ @Mock ApplicationInfo mApplicationInfo;
+ @Mock IBinder mAppBinder;
+ @Mock LowpanManager.Callback mLowpanManagerCallback;
+
+ private Handler mHandler;
+ private final TestLooper mTestLooper = new TestLooper();
+ private LowpanManager mLowpanManager;
+
+ private ILowpanManagerListener mManagerListener;
+ private LowpanInterface mLowpanInterface;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+ when(mContext.getApplicationInfo()).thenReturn(mApplicationInfo);
+ when(mContext.getOpPackageName()).thenReturn(TEST_PACKAGE_NAME);
+
+ mLowpanManager = new LowpanManager(mContext, mLowpanService, mTestLooper.getLooper());
+ }
+
+ @Test
+ public void testGetEmptyInterfaceList() throws Exception {
+ when(mLowpanService.getInterfaceList()).thenReturn(new String[0]);
+ assertTrue(mLowpanManager.getInterfaceList().length == 0);
+ assertTrue(mLowpanManager.getInterface() == null);
+ }
+
+ @Test
+ public void testGetInterfaceList() throws Exception {
+ when(mLowpanService.getInterfaceList()).thenReturn(new String[] {"wpan0"});
+ when(mLowpanService.getInterface("wpan0")).thenReturn(mLowpanInterfaceService);
+ when(mLowpanInterfaceService.getName()).thenReturn("wpan0");
+ when(mLowpanInterfaceService.asBinder()).thenReturn(mLowpanInterfaceBinder);
+ assertEquals(mLowpanManager.getInterfaceList().length, 1);
+
+ LowpanInterface iface = mLowpanManager.getInterface();
+ assertNotNull(iface);
+ assertEquals(iface.getName(), "wpan0");
+ }
+
+ @Test
+ public void testRegisterCallback() throws Exception {
+ when(mLowpanInterfaceService.getName()).thenReturn("wpan0");
+ when(mLowpanInterfaceService.asBinder()).thenReturn(mLowpanInterfaceBinder);
+
+ // Register our callback
+ mLowpanManager.registerCallback(mLowpanManagerCallback);
+
+ // Verify a listener was added
+ verify(mLowpanService)
+ .addListener(
+ argThat(
+ listener -> {
+ mManagerListener = listener;
+ return listener instanceof ILowpanManagerListener;
+ }));
+
+ // Add an interface
+ mManagerListener.onInterfaceAdded(mLowpanInterfaceService);
+ mTestLooper.dispatchAll();
+
+ // Verify that the interface was added
+ verify(mLowpanManagerCallback)
+ .onInterfaceAdded(
+ argThat(
+ iface -> {
+ mLowpanInterface = iface;
+ return iface instanceof LowpanInterface;
+ }));
+ verifyNoMoreInteractions(mLowpanManagerCallback);
+
+ // This check causes the test to fail with a weird error, but I'm not sure why.
+ assertEquals(mLowpanInterface.getService(), mLowpanInterfaceService);
+
+ // Verify that calling getInterface on the LowpanManager object will yield the same
+ // LowpanInterface object.
+ when(mLowpanService.getInterfaceList()).thenReturn(new String[] {"wpan0"});
+ when(mLowpanService.getInterface("wpan0")).thenReturn(mLowpanInterfaceService);
+ assertEquals(mLowpanManager.getInterface(), mLowpanInterface);
+
+ // Remove the service
+ mManagerListener.onInterfaceRemoved(mLowpanInterfaceService);
+ mTestLooper.dispatchAll();
+
+ // Verify that the interface was removed
+ verify(mLowpanManagerCallback).onInterfaceRemoved(mLowpanInterface);
+ }
+
+ @Test
+ public void testUnregisterCallback() throws Exception {
+ when(mLowpanInterfaceService.getName()).thenReturn("wpan0");
+ when(mLowpanInterfaceService.asBinder()).thenReturn(mLowpanInterfaceBinder);
+
+ // Register our callback
+ mLowpanManager.registerCallback(mLowpanManagerCallback);
+
+ // Verify a listener was added
+ verify(mLowpanService)
+ .addListener(
+ argThat(
+ listener -> {
+ mManagerListener = listener;
+ return listener instanceof ILowpanManagerListener;
+ }));
+
+ // Add an interface
+ mManagerListener.onInterfaceAdded(mLowpanInterfaceService);
+ mTestLooper.dispatchAll();
+
+ // Verify that the interface was added
+ verify(mLowpanManagerCallback)
+ .onInterfaceAdded(
+ argThat(
+ iface -> {
+ mLowpanInterface = iface;
+ return iface instanceof LowpanInterface;
+ }));
+ verifyNoMoreInteractions(mLowpanManagerCallback);
+
+ // Unregister our callback
+ mLowpanManager.unregisterCallback(mLowpanManagerCallback);
+
+ // Verify the listener was removed
+ verify(mLowpanService).removeListener(mManagerListener);
+
+ // Verify that the callback wasn't invoked.
+ verifyNoMoreInteractions(mLowpanManagerCallback);
+ }
+}
diff --git a/media/java/android/media/AudioFormat.java b/media/java/android/media/AudioFormat.java
index 81cc93d..93fc3da 100644
--- a/media/java/android/media/AudioFormat.java
+++ b/media/java/android/media/AudioFormat.java
@@ -267,6 +267,42 @@
**/
public static final int ENCODING_DOLBY_TRUEHD = 14;
+ /** @hide */
+ public static String toLogFriendlyEncoding(int enc) {
+ switch(enc) {
+ case ENCODING_INVALID:
+ return "ENCODING_INVALID";
+ case ENCODING_PCM_16BIT:
+ return "ENCODING_PCM_16BIT";
+ case ENCODING_PCM_8BIT:
+ return "ENCODING_PCM_8BIT";
+ case ENCODING_PCM_FLOAT:
+ return "ENCODING_PCM_FLOAT";
+ case ENCODING_AC3:
+ return "ENCODING_AC3";
+ case ENCODING_E_AC3:
+ return "ENCODING_E_AC3";
+ case ENCODING_DTS:
+ return "ENCODING_DTS";
+ case ENCODING_DTS_HD:
+ return "ENCODING_DTS_HD";
+ case ENCODING_MP3:
+ return "ENCODING_MP3";
+ case ENCODING_AAC_LC:
+ return "ENCODING_AAC_LC";
+ case ENCODING_AAC_HE_V1:
+ return "ENCODING_AAC_HE_V1";
+ case ENCODING_AAC_HE_V2:
+ return "ENCODING_AAC_HE_V2";
+ case ENCODING_IEC61937:
+ return "ENCODING_IEC61937";
+ case ENCODING_DOLBY_TRUEHD:
+ return "ENCODING_DOLBY_TRUEHD";
+ default :
+ return "invalid encoding " + enc;
+ }
+ }
+
/** Invalid audio channel configuration */
/** @deprecated Use {@link #CHANNEL_INVALID} instead. */
@Deprecated public static final int CHANNEL_CONFIGURATION_INVALID = 0;
@@ -693,6 +729,12 @@
return mPropertySetMask;
}
+ /** @hide */
+ public String toLogFriendlyString() {
+ return String.format("%dch %dHz %s",
+ getChannelCount(), mSampleRate, toLogFriendlyEncoding(mEncoding));
+ }
+
/**
* Builder class for {@link AudioFormat} objects.
* Use this class to configure and create an AudioFormat instance. By setting format
diff --git a/media/java/android/media/AudioManagerInternal.java b/media/java/android/media/AudioManagerInternal.java
index 2b5ac5e..0a1de33 100644
--- a/media/java/android/media/AudioManagerInternal.java
+++ b/media/java/android/media/AudioManagerInternal.java
@@ -59,15 +59,4 @@
int getRingerModeAffectedStreams(int streams);
}
-
- /**
- * Disable or restore the ability to play audio for a given UID.
- * When a UID isn't meant to be tracked anymore (e.g. client died), re-enable audio for this UID
- * to prevent disabling audio for future UIDs that would reuse the same value.
- * This operation is asynchronous.
- * @param disable when true, prevents playback of audio streams from the given uid. If false,
- * restores the ability to play, or no-op if playback hadn't been disabled before.
- * @param uid the client UID whose ability to play will be affected.
- */
- public abstract void disableAudioForUid(boolean disable, int uid);
}
diff --git a/media/java/android/media/AudioRecordingConfiguration.java b/media/java/android/media/AudioRecordingConfiguration.java
index 50dbd03..984c554 100644
--- a/media/java/android/media/AudioRecordingConfiguration.java
+++ b/media/java/android/media/AudioRecordingConfiguration.java
@@ -17,10 +17,12 @@
package android.media;
import android.annotation.IntDef;
+import android.annotation.NonNull;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;
+import java.io.PrintWriter;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
@@ -52,18 +54,59 @@
private final AudioFormat mDeviceFormat;
private final AudioFormat mClientFormat;
+ @NonNull private final String mClientPackageName;
+ private final int mClientUid;
+
private final int mPatchHandle;
/**
* @hide
*/
- public AudioRecordingConfiguration(int session, int source, AudioFormat clientFormat,
- AudioFormat devFormat, int patchHandle) {
+ public AudioRecordingConfiguration(int uid, int session, int source, AudioFormat clientFormat,
+ AudioFormat devFormat, int patchHandle, String packageName) {
+ mClientUid = uid;
mSessionId = session;
mClientSource = source;
mClientFormat = clientFormat;
mDeviceFormat = devFormat;
mPatchHandle = patchHandle;
+ mClientPackageName = packageName;
+ }
+
+ /**
+ * @hide
+ * For AudioService dump
+ * @param pw
+ */
+ public void dump(PrintWriter pw) {
+ pw.println(" " + toLogFriendlyString(this));
+ }
+
+ /**
+ * @hide
+ */
+ public static String toLogFriendlyString(AudioRecordingConfiguration arc) {
+ return new String("session:" + arc.mSessionId
+ + " -- source:" + MediaRecorder.toLogFriendlyAudioSource(arc.mClientSource)
+ + " -- uid:" + arc.mClientUid
+ + " -- patch:" + arc.mPatchHandle
+ + " -- pack:" + arc.mClientPackageName
+ + " -- format client=" + arc.mClientFormat.toLogFriendlyString()
+ + ", dev=" + arc.mDeviceFormat.toLogFriendlyString());
+ }
+
+ // Note that this method is called server side, so no "privileged" information is ever sent
+ // to a client that is not supposed to have access to it.
+ /**
+ * @hide
+ * Creates a copy of the recording configuration that is stripped of any data enabling
+ * identification of which application it is associated with ("anonymized").
+ * @param in
+ */
+ public static AudioRecordingConfiguration anonymizedCopy(AudioRecordingConfiguration in) {
+ return new AudioRecordingConfiguration( /*anonymized uid*/ -1,
+ in.mSessionId, in.mClientSource, in.mClientFormat,
+ in.mDeviceFormat, in.mPatchHandle, "" /*empty package name*/);
}
// matches the sources that return false in MediaRecorder.isSystemOnlyAudioSource(source)
@@ -120,6 +163,30 @@
public AudioFormat getClientFormat() { return mClientFormat; }
/**
+ * @pending for SystemApi
+ * Returns the package name of the application performing the recording.
+ * Where there are multiple packages sharing the same user id through the "sharedUserId"
+ * mechanism, only the first one with that id will be returned
+ * (see {@link PackageManager#getPackagesForUid(int)}).
+ * <p>This information is only available if the caller has the
+ * {@link android.Manifest.permission.MODIFY_AUDIO_ROUTING} permission.
+ * <br>When called without the permission, the result is an empty string.
+ * @return the package name
+ */
+ public String getClientPackageName() { return mClientPackageName; }
+
+ /**
+ * @pending for SystemApi
+ * Returns the user id of the application performing the recording.
+ * <p>This information is only available if the caller has the
+ * {@link android.Manifest.permission.MODIFY_AUDIO_ROUTING}
+ * permission.
+ * <br>The result is -1 without the permission.
+ * @return the user id
+ */
+ public int getClientUid() { return mClientUid; }
+
+ /**
* Returns information about the audio input device used for this recording.
* @return the audio recording device or null if this information cannot be retrieved
*/
@@ -185,6 +252,8 @@
mClientFormat.writeToParcel(dest, 0);
mDeviceFormat.writeToParcel(dest, 0);
dest.writeInt(mPatchHandle);
+ dest.writeString(mClientPackageName);
+ dest.writeInt(mClientUid);
}
private AudioRecordingConfiguration(Parcel in) {
@@ -193,6 +262,8 @@
mClientFormat = AudioFormat.CREATOR.createFromParcel(in);
mDeviceFormat = AudioFormat.CREATOR.createFromParcel(in);
mPatchHandle = in.readInt();
+ mClientPackageName = in.readString();
+ mClientUid = in.readInt();
}
@Override
@@ -202,10 +273,12 @@
AudioRecordingConfiguration that = (AudioRecordingConfiguration) o;
- return ((mSessionId == that.mSessionId)
+ return ((mClientUid == that.mClientUid)
+ && (mSessionId == that.mSessionId)
&& (mClientSource == that.mClientSource)
&& (mPatchHandle == that.mPatchHandle)
&& (mClientFormat.equals(that.mClientFormat))
- && (mDeviceFormat.equals(that.mDeviceFormat)));
+ && (mDeviceFormat.equals(that.mDeviceFormat))
+ && (mClientPackageName.equals(that.mClientPackageName)));
}
}
diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java
index ea4d802..bfb81a0 100644
--- a/media/java/android/media/AudioSystem.java
+++ b/media/java/android/media/AudioSystem.java
@@ -287,6 +287,7 @@
/**
* Callback for recording activity notifications events
* @param event
+ * @param uid uid of the client app performing the recording
* @param session
* @param source
* @param recordingFormat an array of ints containing respectively the client and device
@@ -298,9 +299,10 @@
* 4: device channel mask
* 5: device sample rate
* 6: patch handle
+ * @param packName package name of the client app performing the recording. NOT SUPPORTED
*/
- void onRecordingConfigurationChanged(int event, int session, int source,
- int[] recordingFormat);
+ void onRecordingConfigurationChanged(int event, int uid, int session, int source,
+ int[] recordingFormat, String packName);
}
private static AudioRecordingCallback sRecordingCallback;
@@ -318,17 +320,18 @@
* @param session
* @param source
* @param recordingFormat see
- * {@link AudioRecordingCallback#onRecordingConfigurationChanged(int, int, int, int[])} for
- * the description of the record format.
+ * {@link AudioRecordingCallback#onRecordingConfigurationChanged(int, int, int, int, int[])}
+ * for the description of the record format.
*/
- private static void recordingCallbackFromNative(int event, int session, int source,
+ private static void recordingCallbackFromNative(int event, int uid, int session, int source,
int[] recordingFormat) {
AudioRecordingCallback cb = null;
synchronized (AudioSystem.class) {
cb = sRecordingCallback;
}
if (cb != null) {
- cb.onRecordingConfigurationChanged(event, session, source, recordingFormat);
+ // TODO receive package name from native
+ cb.onRecordingConfigurationChanged(event, uid, session, source, recordingFormat, "");
}
}
diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java
index bf5939f..50145f8 100644
--- a/media/java/android/media/AudioTrack.java
+++ b/media/java/android/media/AudioTrack.java
@@ -276,6 +276,9 @@
private static final int AUDIO_OUTPUT_FLAG_FAST = 0x4;
private static final int AUDIO_OUTPUT_FLAG_DEEP_BUFFER = 0x8;
+ // Size of HW_AV_SYNC track AV header.
+ private static final float HEADER_V2_SIZE_BYTES = 20.0f;
+
//--------------------------------------------------------------------------
// Member variables
//--------------------
@@ -364,6 +367,10 @@
* HW_AV_SYNC track audio data bytes remaining to write after current AV sync header
*/
private int mAvSyncBytesRemaining = 0;
+ /**
+ * Offset of the first sample of the audio in byte from start of HW_AV_SYNC track AV header.
+ */
+ private int mOffset = 0;
//--------------------------------
// Used exclusively by native code
@@ -603,6 +610,16 @@
mSampleRate = sampleRate[0];
mSessionId = session[0];
+ if ((mAttributes.getFlags() & AudioAttributes.FLAG_HW_AV_SYNC) != 0) {
+ int frameSizeInBytes;
+ if (AudioFormat.isEncodingLinearFrames(mAudioFormat)) {
+ frameSizeInBytes = mChannelCount * AudioFormat.getBytesPerSample(mAudioFormat);
+ } else {
+ frameSizeInBytes = 1;
+ }
+ mOffset = ((int) Math.ceil(HEADER_V2_SIZE_BYTES / frameSizeInBytes)) * frameSizeInBytes;
+ }
+
if (mDataLoadMode == MODE_STATIC) {
mState = STATE_NO_STATIC_DATA;
} else {
@@ -2520,14 +2537,15 @@
// create timestamp header if none exists
if (mAvSyncHeader == null) {
- mAvSyncHeader = ByteBuffer.allocate(16);
+ mAvSyncHeader = ByteBuffer.allocate(mOffset);
mAvSyncHeader.order(ByteOrder.BIG_ENDIAN);
- mAvSyncHeader.putInt(0x55550001);
+ mAvSyncHeader.putInt(0x55550002);
}
if (mAvSyncBytesRemaining == 0) {
mAvSyncHeader.putInt(4, sizeInBytes);
mAvSyncHeader.putLong(8, timestamp);
+ mAvSyncHeader.putInt(16, mOffset);
mAvSyncHeader.position(0);
mAvSyncBytesRemaining = sizeInBytes;
}
diff --git a/media/java/android/media/ExifInterface.java b/media/java/android/media/ExifInterface.java
index 0a61148..6677178 100644
--- a/media/java/android/media/ExifInterface.java
+++ b/media/java/android/media/ExifInterface.java
@@ -2661,9 +2661,9 @@
}
private void addDefaultValuesForCompatibility() {
- // The value of DATETIME tag has the same value of DATETIME_ORIGINAL tag.
+ // If DATETIME tag has no value, then set the value to DATETIME_ORIGINAL tag's.
String valueOfDateTimeOriginal = getAttribute(TAG_DATETIME_ORIGINAL);
- if (valueOfDateTimeOriginal != null) {
+ if (valueOfDateTimeOriginal != null && getAttribute(TAG_DATETIME) == null) {
mAttributes[IFD_TYPE_PRIMARY].put(TAG_DATETIME,
ExifAttribute.createString(valueOfDateTimeOriginal));
}
diff --git a/media/java/android/media/MediaCas.java b/media/java/android/media/MediaCas.java
index ce50cc8..12352e7 100644
--- a/media/java/android/media/MediaCas.java
+++ b/media/java/android/media/MediaCas.java
@@ -18,21 +18,20 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.hardware.cas.V1_0.*;
import android.media.MediaCasException.*;
import android.os.Handler;
import android.os.HandlerThread;
-import android.os.IBinder;
+import android.os.IHwBinder;
import android.os.Looper;
import android.os.Message;
-import android.os.Parcel;
-import android.os.Parcelable;
import android.os.Process;
import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.os.ServiceSpecificException;
import android.util.Log;
import android.util.Singleton;
+import java.util.ArrayList;
+
/**
* MediaCas can be used to obtain keys for descrambling protected media streams, in
* conjunction with {@link android.media.MediaDescrambler}. The MediaCas APIs are
@@ -95,7 +94,6 @@
*/
public final class MediaCas implements AutoCloseable {
private static final String TAG = "MediaCas";
- private final ParcelableCasData mCasData = new ParcelableCasData();
private ICas mICas;
private EventListener mListener;
private HandlerThread mHandlerThread;
@@ -105,8 +103,10 @@
new Singleton<IMediaCasService>() {
@Override
protected IMediaCasService create() {
- return IMediaCasService.Stub.asInterface(
- ServiceManager.getService("media.cas"));
+ try {
+ return IMediaCasService.getService();
+ } catch (RemoteException e) {}
+ return null;
}
};
@@ -136,14 +136,15 @@
@Override
public void handleMessage(Message msg) {
if (msg.what == MSG_CAS_EVENT) {
- mListener.onEvent(MediaCas.this, msg.arg1, msg.arg2, (byte[]) msg.obj);
+ mListener.onEvent(MediaCas.this, msg.arg1, msg.arg2,
+ toBytes((ArrayList<Byte>) msg.obj));
}
}
}
private final ICasListener.Stub mBinder = new ICasListener.Stub() {
@Override
- public void onEvent(int event, int arg, @Nullable byte[] data)
+ public void onEvent(int event, int arg, @Nullable ArrayList<Byte> data)
throws RemoteException {
mEventHandler.sendMessage(mEventHandler.obtainMessage(
EventHandler.MSG_CAS_EVENT, event, arg, data));
@@ -151,51 +152,6 @@
};
/**
- * Class for parceling byte array data over ICas binder.
- */
- static class ParcelableCasData implements Parcelable {
- private byte[] mData;
- private int mOffset;
- private int mLength;
-
- ParcelableCasData() {
- mData = null;
- mOffset = mLength = 0;
- }
-
- private ParcelableCasData(Parcel in) {
- this();
- }
-
- void set(@NonNull byte[] data, int offset, int length) {
- mData = data;
- mOffset = offset;
- mLength = length;
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeByteArray(mData, mOffset, mLength);
- }
-
- public static final Parcelable.Creator<ParcelableCasData> CREATOR
- = new Parcelable.Creator<ParcelableCasData>() {
- public ParcelableCasData createFromParcel(Parcel in) {
- return new ParcelableCasData(in);
- }
-
- public ParcelableCasData[] newArray(int size) {
- return new ParcelableCasData[size];
- }
- };
- }
-
- /**
* Describe a CAS plugin with its CA_system_ID and string name.
*
* Returned as results of {@link #enumeratePlugins}.
@@ -210,9 +166,9 @@
mName = null;
}
- PluginDescriptor(int CA_system_id, String name) {
- mCASystemId = CA_system_id;
- mName = name;
+ PluginDescriptor(@NonNull HidlCasPluginDescriptor descriptor) {
+ mCASystemId = descriptor.caSystemId;
+ mName = descriptor.name;
}
public int getSystemId() {
@@ -230,13 +186,38 @@
}
}
+ private ArrayList<Byte> toByteArray(@NonNull byte[] data, int offset, int length) {
+ ArrayList<Byte> byteArray = new ArrayList<Byte>(length);
+ for (int i = 0; i < length; i++) {
+ byteArray.add(Byte.valueOf(data[offset + i]));
+ }
+ return byteArray;
+ }
+
+ private ArrayList<Byte> toByteArray(@Nullable byte[] data) {
+ if (data == null) {
+ return new ArrayList<Byte>();
+ }
+ return toByteArray(data, 0, data.length);
+ }
+
+ private byte[] toBytes(@NonNull ArrayList<Byte> byteArray) {
+ byte[] data = null;
+ if (byteArray != null) {
+ data = new byte[byteArray.size()];
+ for (int i = 0; i < data.length; i++) {
+ data[i] = byteArray.get(i);
+ }
+ }
+ return data;
+ }
/**
* Class for an open session with the CA system.
*/
public final class Session implements AutoCloseable {
- final byte[] mSessionId;
+ final ArrayList<Byte> mSessionId;
- Session(@NonNull byte[] sessionId) {
+ Session(@NonNull ArrayList<Byte> sessionId) {
mSessionId = sessionId;
}
@@ -254,9 +235,8 @@
validateInternalStates();
try {
- mICas.setSessionPrivateData(mSessionId, data);
- } catch (ServiceSpecificException e) {
- MediaCasException.throwExceptions(e);
+ MediaCasException.throwExceptionIfNeeded(
+ mICas.setSessionPrivateData(mSessionId, toByteArray(data, 0, data.length)));
} catch (RemoteException e) {
cleanupAndRethrowIllegalState();
}
@@ -279,10 +259,8 @@
validateInternalStates();
try {
- mCasData.set(data, offset, length);
- mICas.processEcm(mSessionId, mCasData);
- } catch (ServiceSpecificException e) {
- MediaCasException.throwExceptions(e);
+ MediaCasException.throwExceptionIfNeeded(
+ mICas.processEcm(mSessionId, toByteArray(data, offset, length)));
} catch (RemoteException e) {
cleanupAndRethrowIllegalState();
}
@@ -314,57 +292,22 @@
validateInternalStates();
try {
- mICas.closeSession(mSessionId);
- } catch (ServiceSpecificException e) {
- MediaCasStateException.throwExceptions(e);
+ MediaCasStateException.throwExceptionIfNeeded(
+ mICas.closeSession(mSessionId));
} catch (RemoteException e) {
cleanupAndRethrowIllegalState();
}
}
}
- Session createFromSessionId(byte[] sessionId) {
- if (sessionId == null || sessionId.length == 0) {
+ Session createFromSessionId(@NonNull ArrayList<Byte> sessionId) {
+ if (sessionId == null || sessionId.size() == 0) {
return null;
}
return new Session(sessionId);
}
/**
- * Class for parceling CAS plugin descriptors over IMediaCasService binder.
- */
- static class ParcelableCasPluginDescriptor
- extends PluginDescriptor implements Parcelable {
-
- private ParcelableCasPluginDescriptor(int CA_system_id, String name) {
- super(CA_system_id, name);
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- Log.w(TAG, "ParcelableCasPluginDescriptor.writeToParcel shouldn't be called!");
- }
-
- public static final Parcelable.Creator<ParcelableCasPluginDescriptor> CREATOR
- = new Parcelable.Creator<ParcelableCasPluginDescriptor>() {
- public ParcelableCasPluginDescriptor createFromParcel(Parcel in) {
- int CA_system_id = in.readInt();
- String name = in.readString();
- return new ParcelableCasPluginDescriptor(CA_system_id, name);
- }
-
- public ParcelableCasPluginDescriptor[] newArray(int size) {
- return new ParcelableCasPluginDescriptor[size];
- }
- };
- }
-
- /**
* Query if a certain CA system is supported on this device.
*
* @param CA_system_id the id of the CA system.
@@ -393,13 +336,14 @@
if (service != null) {
try {
- ParcelableCasPluginDescriptor[] descriptors = service.enumeratePlugins();
- if (descriptors.length == 0) {
+ ArrayList<HidlCasPluginDescriptor> descriptors =
+ service.enumeratePlugins();
+ if (descriptors.size() == 0) {
return null;
}
- PluginDescriptor[] results = new PluginDescriptor[descriptors.length];
+ PluginDescriptor[] results = new PluginDescriptor[descriptors.size()];
for (int i = 0; i < results.length; i++) {
- results[i] = descriptors[i];
+ results[i] = new PluginDescriptor(descriptors.get(i));
}
return results;
} catch (RemoteException e) {
@@ -430,7 +374,7 @@
}
}
- IBinder getBinder() {
+ IHwBinder getBinder() {
validateInternalStates();
return mICas.asBinder();
@@ -497,14 +441,22 @@
validateInternalStates();
try {
- mICas.setPrivateData(data);
- } catch (ServiceSpecificException e) {
- MediaCasException.throwExceptions(e);
+ MediaCasException.throwExceptionIfNeeded(
+ mICas.setPrivateData(toByteArray(data, 0, data.length)));
} catch (RemoteException e) {
cleanupAndRethrowIllegalState();
}
}
+ private class OpenSessionCallback implements ICas.openSessionCallback {
+ public Session mSession;
+ public int mStatus;
+ @Override
+ public void onValues(int status, ArrayList<Byte> sessionId) {
+ mStatus = status;
+ mSession = createFromSessionId(sessionId);
+ }
+ }
/**
* Open a session to descramble one or more streams scrambled by the
* conditional access system.
@@ -519,9 +471,10 @@
validateInternalStates();
try {
- return createFromSessionId(mICas.openSession());
- } catch (ServiceSpecificException e) {
- MediaCasException.throwExceptions(e);
+ OpenSessionCallback cb = new OpenSessionCallback();
+ mICas.openSession(cb);
+ MediaCasException.throwExceptionIfNeeded(cb.mStatus);
+ return cb.mSession;
} catch (RemoteException e) {
cleanupAndRethrowIllegalState();
}
@@ -544,10 +497,8 @@
validateInternalStates();
try {
- mCasData.set(data, offset, length);
- mICas.processEmm(mCasData);
- } catch (ServiceSpecificException e) {
- MediaCasException.throwExceptions(e);
+ MediaCasException.throwExceptionIfNeeded(
+ mICas.processEmm(toByteArray(data, offset, length)));
} catch (RemoteException e) {
cleanupAndRethrowIllegalState();
}
@@ -585,9 +536,8 @@
validateInternalStates();
try {
- mICas.sendEvent(event, arg, data);
- } catch (ServiceSpecificException e) {
- MediaCasException.throwExceptions(e);
+ MediaCasException.throwExceptionIfNeeded(
+ mICas.sendEvent(event, arg, toByteArray(data)));
} catch (RemoteException e) {
cleanupAndRethrowIllegalState();
}
@@ -608,9 +558,8 @@
validateInternalStates();
try {
- mICas.provision(provisionString);
- } catch (ServiceSpecificException e) {
- MediaCasException.throwExceptions(e);
+ MediaCasException.throwExceptionIfNeeded(
+ mICas.provision(provisionString));
} catch (RemoteException e) {
cleanupAndRethrowIllegalState();
}
@@ -631,9 +580,8 @@
validateInternalStates();
try {
- mICas.refreshEntitlements(refreshType, refreshData);
- } catch (ServiceSpecificException e) {
- MediaCasException.throwExceptions(e);
+ MediaCasException.throwExceptionIfNeeded(
+ mICas.refreshEntitlements(refreshType, toByteArray(refreshData)));
} catch (RemoteException e) {
cleanupAndRethrowIllegalState();
}
diff --git a/media/java/android/media/MediaCasException.java b/media/java/android/media/MediaCasException.java
index 485f6ee..35fb104 100644
--- a/media/java/android/media/MediaCasException.java
+++ b/media/java/android/media/MediaCasException.java
@@ -16,60 +16,29 @@
package android.media;
-import android.os.ServiceSpecificException;
+import android.hardware.cas.V1_0.Status;
/**
* Base class for MediaCas exceptions
*/
public class MediaCasException extends Exception {
-
- /** @hide */
- public static final int DRM_ERROR_BASE = -2000;
- /** @hide */
- public static final int ERROR_DRM_UNKNOWN = DRM_ERROR_BASE;
- /** @hide */
- public static final int ERROR_DRM_NO_LICENSE = DRM_ERROR_BASE - 1;
- /** @hide */
- public static final int ERROR_DRM_LICENSE_EXPIRED = DRM_ERROR_BASE - 2;
- /** @hide */
- public static final int ERROR_DRM_SESSION_NOT_OPENED = DRM_ERROR_BASE - 3;
- /** @hide */
- public static final int ERROR_DRM_DECRYPT_UNIT_NOT_INITIALIZED = DRM_ERROR_BASE - 4;
- /** @hide */
- public static final int ERROR_DRM_DECRYPT = DRM_ERROR_BASE - 5;
- /** @hide */
- public static final int ERROR_DRM_CANNOT_HANDLE = DRM_ERROR_BASE - 6;
- /** @hide */
- public static final int ERROR_DRM_TAMPER_DETECTED = DRM_ERROR_BASE - 7;
- /** @hide */
- public static final int ERROR_DRM_NOT_PROVISIONED = DRM_ERROR_BASE - 8;
- /** @hide */
- public static final int ERROR_DRM_DEVICE_REVOKED = DRM_ERROR_BASE - 9;
- /** @hide */
- public static final int ERROR_DRM_RESOURCE_BUSY = DRM_ERROR_BASE - 10;
- /** @hide */
- public static final int ERROR_DRM_INSUFFICIENT_OUTPUT_PROTECTION = DRM_ERROR_BASE - 11;
- /** @hide */
- public static final int ERROR_DRM_LAST_USED_ERRORCODE = DRM_ERROR_BASE - 11;
- /** @hide */
- public static final int ERROR_DRM_VENDOR_MAX = DRM_ERROR_BASE - 500;
- /** @hide */
- public static final int ERROR_DRM_VENDOR_MIN = DRM_ERROR_BASE - 999;
-
- /** @hide */
- public MediaCasException(String detailMessage) {
+ private MediaCasException(String detailMessage) {
super(detailMessage);
}
- static void throwExceptions(ServiceSpecificException e) throws MediaCasException {
- if (e.errorCode == ERROR_DRM_NOT_PROVISIONED) {
- throw new NotProvisionedException(e.getMessage());
- } else if (e.errorCode == ERROR_DRM_RESOURCE_BUSY) {
- throw new ResourceBusyException(e.getMessage());
- } else if (e.errorCode == ERROR_DRM_DEVICE_REVOKED) {
- throw new DeniedByServerException(e.getMessage());
+ static void throwExceptionIfNeeded(int error) throws MediaCasException {
+ if (error == Status.OK) {
+ return;
+ }
+
+ if (error == Status.ERROR_CAS_NOT_PROVISIONED) {
+ throw new NotProvisionedException(null);
+ } else if (error == Status.ERROR_CAS_RESOURCE_BUSY) {
+ throw new ResourceBusyException(null);
+ } else if (error == Status.ERROR_CAS_DEVICE_REVOKED) {
+ throw new DeniedByServerException(null);
} else {
- MediaCasStateException.throwExceptions(e);
+ MediaCasStateException.throwExceptionIfNeeded(error);
}
}
diff --git a/media/java/android/media/MediaCasStateException.java b/media/java/android/media/MediaCasStateException.java
index cf05c29..26c5792 100644
--- a/media/java/android/media/MediaCasStateException.java
+++ b/media/java/android/media/MediaCasStateException.java
@@ -18,9 +18,8 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.os.ServiceSpecificException;
-import static android.media.MediaCasException.*;
+import android.hardware.cas.V1_0.Status;
/**
* Base class for MediaCas runtime exceptions
@@ -29,46 +28,62 @@
private final int mErrorCode;
private final String mDiagnosticInfo;
- /** @hide */
- public MediaCasStateException(int err, @Nullable String msg, @Nullable String diagnosticInfo) {
+ private MediaCasStateException(int err, @Nullable String msg, @Nullable String diagnosticInfo) {
super(msg);
mErrorCode = err;
mDiagnosticInfo = diagnosticInfo;
}
- static void throwExceptions(ServiceSpecificException e) {
+ static void throwExceptionIfNeeded(int err) {
+ throwExceptionIfNeeded(err, null /* msg */);
+ }
+
+ static void throwExceptionIfNeeded(int err, @Nullable String msg) {
+ if (err == Status.OK) {
+ return;
+ }
+ if (err == Status.BAD_VALUE) {
+ throw new IllegalArgumentException();
+ }
+
String diagnosticInfo = "";
- switch (e.errorCode) {
- case ERROR_DRM_UNKNOWN:
+ switch (err) {
+ case Status.ERROR_CAS_UNKNOWN:
diagnosticInfo = "General CAS error";
break;
- case ERROR_DRM_NO_LICENSE:
+ case Status.ERROR_CAS_NO_LICENSE:
diagnosticInfo = "No license";
break;
- case ERROR_DRM_LICENSE_EXPIRED:
+ case Status.ERROR_CAS_LICENSE_EXPIRED:
diagnosticInfo = "License expired";
break;
- case ERROR_DRM_SESSION_NOT_OPENED:
+ case Status.ERROR_CAS_SESSION_NOT_OPENED:
diagnosticInfo = "Session not opened";
break;
- case ERROR_DRM_DECRYPT_UNIT_NOT_INITIALIZED:
- diagnosticInfo = "Not initialized";
- break;
- case ERROR_DRM_DECRYPT:
- diagnosticInfo = "Decrypt error";
- break;
- case ERROR_DRM_CANNOT_HANDLE:
+ case Status.ERROR_CAS_CANNOT_HANDLE:
diagnosticInfo = "Unsupported scheme or data format";
break;
- case ERROR_DRM_TAMPER_DETECTED:
+ case Status.ERROR_CAS_INVALID_STATE:
+ diagnosticInfo = "Invalid CAS state";
+ break;
+ case Status.ERROR_CAS_INSUFFICIENT_OUTPUT_PROTECTION:
+ diagnosticInfo = "Insufficient output protection";
+ break;
+ case Status.ERROR_CAS_TAMPER_DETECTED:
diagnosticInfo = "Tamper detected";
break;
+ case Status.ERROR_CAS_DECRYPT_UNIT_NOT_INITIALIZED:
+ diagnosticInfo = "Not initialized";
+ break;
+ case Status.ERROR_CAS_DECRYPT:
+ diagnosticInfo = "Decrypt error";
+ break;
default:
diagnosticInfo = "Unknown CAS state exception";
break;
}
- throw new MediaCasStateException(e.errorCode, e.getMessage(),
- String.format("%s (err=%d)", diagnosticInfo, e.errorCode));
+ throw new MediaCasStateException(err, msg,
+ String.format("%s (err=%d)", diagnosticInfo, err));
}
/**
diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java
index 9b74656..3d5f6bc 100644
--- a/media/java/android/media/MediaCodec.java
+++ b/media/java/android/media/MediaCodec.java
@@ -26,6 +26,7 @@
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
+import android.os.IHwBinder;
import android.os.Looper;
import android.os.Message;
import android.os.PersistableBundle;
@@ -340,7 +341,8 @@
</tr>
<tr>
<td>FLAC</td>
- <td>Metadata blocks</td>
+ <td>mandatory metadata block (called the STREAMINFO block),<br>
+ optionally followed by any number of other metadata blocks</td>
<td class=NA>Not Used</td>
<td class=NA>Not Used</td>
</tr>
@@ -1902,7 +1904,7 @@
private void configure(
@Nullable MediaFormat format, @Nullable Surface surface,
- @Nullable MediaCrypto crypto, @Nullable IBinder descramblerBinder,
+ @Nullable MediaCrypto crypto, @Nullable IHwBinder descramblerBinder,
@ConfigureFlag int flags) {
if (crypto != null && descramblerBinder != null) {
throw new IllegalArgumentException("Can't use crypto and descrambler together!");
@@ -2017,7 +2019,7 @@
private native final void native_configure(
@Nullable String[] keys, @Nullable Object[] values,
@Nullable Surface surface, @Nullable MediaCrypto crypto,
- @Nullable IBinder descramblerBinder, @ConfigureFlag int flags);
+ @Nullable IHwBinder descramblerBinder, @ConfigureFlag int flags);
/**
* Requests a Surface to use as the input to an encoder, in place of input buffers. This
diff --git a/media/java/android/media/MediaCodecInfo.java b/media/java/android/media/MediaCodecInfo.java
index a19726c..e2642c9 100644
--- a/media/java/android/media/MediaCodecInfo.java
+++ b/media/java/android/media/MediaCodecInfo.java
@@ -2861,6 +2861,8 @@
public static final int AVCProfileHigh10 = 0x10;
public static final int AVCProfileHigh422 = 0x20;
public static final int AVCProfileHigh444 = 0x40;
+ public static final int AVCProfileConstrainedBaseline = 0x10000;
+ public static final int AVCProfileConstrainedHigh = 0x80000;
// from OMX_VIDEO_AVCLEVELTYPE
public static final int AVCLevel1 = 0x01;
diff --git a/media/java/android/media/MediaDescrambler.java b/media/java/android/media/MediaDescrambler.java
index b75b7dd..40c837b 100644
--- a/media/java/android/media/MediaDescrambler.java
+++ b/media/java/android/media/MediaDescrambler.java
@@ -17,10 +17,9 @@
package android.media;
import android.annotation.NonNull;
+import android.hardware.cas.V1_0.*;
import android.media.MediaCasException.UnsupportedCasException;
-import android.os.IBinder;
-import android.os.Parcel;
-import android.os.Parcelable;
+import android.os.IHwBinder;
import android.os.RemoteException;
import android.os.ServiceSpecificException;
import android.util.Log;
@@ -40,7 +39,7 @@
*/
public final class MediaDescrambler implements AutoCloseable {
private static final String TAG = "MediaDescrambler";
- private IDescrambler mIDescrambler;
+ private IDescramblerBase mIDescrambler;
private final void validateInternalStates() {
if (mIDescrambler == null) {
@@ -54,39 +53,6 @@
}
/**
- * Class for parceling descrambling parameters over IDescrambler binder.
- */
- // This class currently is not used by Java binder. descramble() goes through
- // jni to use shared memory. However, the parcelable is still required for AIDL.
- static class DescrambleInfo implements Parcelable {
- private DescrambleInfo() {
- }
-
- private DescrambleInfo(Parcel in) {
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- }
-
- public static final Parcelable.Creator<DescrambleInfo> CREATOR
- = new Parcelable.Creator<DescrambleInfo>() {
- public DescrambleInfo createFromParcel(Parcel in) {
- return new DescrambleInfo(in);
- }
-
- public DescrambleInfo[] newArray(int size) {
- return new DescrambleInfo[size];
- }
- };
- }
-
- /**
* Instantiate a MediaDescrambler.
*
* @param CA_system_id The system id of the scrambling scheme.
@@ -107,7 +73,7 @@
native_setup(mIDescrambler.asBinder());
}
- IBinder getBinder() {
+ IHwBinder getBinder() {
validateInternalStates();
return mIDescrambler.asBinder();
@@ -151,9 +117,8 @@
validateInternalStates();
try {
- mIDescrambler.setMediaCasSession(session.mSessionId);
- } catch (ServiceSpecificException e) {
- MediaCasStateException.throwExceptions(e);
+ MediaCasStateException.throwExceptionIfNeeded(
+ mIDescrambler.setMediaCasSession(session.mSessionId));
} catch (RemoteException e) {
cleanupAndRethrowIllegalState();
}
@@ -210,7 +175,9 @@
srcBuf, srcBuf.position(), srcBuf.limit(),
dstBuf, dstBuf.position(), dstBuf.limit());
} catch (ServiceSpecificException e) {
- MediaCasStateException.throwExceptions(e);
+ MediaCasStateException.throwExceptionIfNeeded(e.errorCode, e.getMessage());
+ } catch (RemoteException e) {
+ cleanupAndRethrowIllegalState();
}
return -1;
}
@@ -234,12 +201,12 @@
}
private static native final void native_init();
- private native final void native_setup(@NonNull IBinder decramblerBinder);
+ private native final void native_setup(@NonNull IHwBinder decramblerBinder);
private native final void native_release();
private native final int native_descramble(
byte key, int numSubSamples, int[] numBytesOfClearData, int[] numBytesOfEncryptedData,
@NonNull ByteBuffer srcBuf, int srcOffset, int srcLimit,
- ByteBuffer dstBuf, int dstOffset, int dstLimit);
+ ByteBuffer dstBuf, int dstOffset, int dstLimit) throws RemoteException;
static {
System.loadLibrary("media_jni");
diff --git a/media/java/android/media/MediaExtractor.java b/media/java/android/media/MediaExtractor.java
index fe461be..2c1b4b3 100644
--- a/media/java/android/media/MediaExtractor.java
+++ b/media/java/android/media/MediaExtractor.java
@@ -26,8 +26,8 @@
import android.media.MediaFormat;
import android.media.MediaHTTPService;
import android.net.Uri;
-import android.os.Bundle;
import android.os.IBinder;
+import android.os.IHwBinder;
import android.os.PersistableBundle;
import com.android.internal.util.Preconditions;
@@ -38,9 +38,8 @@
import java.lang.annotation.RetentionPolicy;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
-import java.util.Collections;
+import java.util.ArrayList;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
import java.util.UUID;
@@ -263,7 +262,7 @@
nativeSetMediaCas(mediaCas.getBinder());
}
- private native final void nativeSetMediaCas(@NonNull IBinder casBinder);
+ private native final void nativeSetMediaCas(@NonNull IHwBinder casBinder);
/**
* Describes the conditional access system used to scramble a track.
@@ -300,6 +299,14 @@
}
}
+ private ArrayList<Byte> toByteArray(@NonNull byte[] data) {
+ ArrayList<Byte> byteArray = new ArrayList<Byte>(data.length);
+ for (int i = 0; i < data.length; i++) {
+ byteArray.add(i, Byte.valueOf(data[i]));
+ }
+ return byteArray;
+ }
+
/**
* Retrieves the information about the conditional access system used to scramble
* a track.
@@ -317,7 +324,7 @@
buf.rewind();
final byte[] sessionId = new byte[buf.remaining()];
buf.get(sessionId);
- session = mMediaCas.createFromSessionId(sessionId);
+ session = mMediaCas.createFromSessionId(toByteArray(sessionId));
}
return new CasInfo(systemId, session);
}
diff --git a/media/java/android/media/MediaRecorder.java b/media/java/android/media/MediaRecorder.java
index 33a7c83..59a124f 100644
--- a/media/java/android/media/MediaRecorder.java
+++ b/media/java/android/media/MediaRecorder.java
@@ -324,6 +324,40 @@
}
}
+ /** @hide */
+ public static final String toLogFriendlyAudioSource(int source) {
+ switch(source) {
+ case AudioSource.DEFAULT:
+ return "DEFAULT";
+ case AudioSource.MIC:
+ return "MIC";
+ case AudioSource.VOICE_UPLINK:
+ return "VOICE_UPLINK";
+ case AudioSource.VOICE_DOWNLINK:
+ return "VOICE_DOWNLINK";
+ case AudioSource.VOICE_CALL:
+ return "VOICE_CALL";
+ case AudioSource.CAMCORDER:
+ return "CAMCORDER";
+ case AudioSource.VOICE_RECOGNITION:
+ return "VOICE_RECOGNITION";
+ case AudioSource.VOICE_COMMUNICATION:
+ return "VOICE_COMMUNICATION";
+ case AudioSource.REMOTE_SUBMIX:
+ return "REMOTE_SUBMIX";
+ case AudioSource.UNPROCESSED:
+ return "UNPROCESSED";
+ case AudioSource.RADIO_TUNER:
+ return "RADIO_TUNER";
+ case AudioSource.HOTWORD:
+ return "HOTWORD";
+ case AudioSource.AUDIO_SOURCE_INVALID:
+ return "AUDIO_SOURCE_INVALID";
+ default:
+ return "unknown source " + source;
+ }
+ }
+
/**
* Defines the video source. These constants are used with
* {@link MediaRecorder#setVideoSource(int)}.
diff --git a/media/java/android/media/MediaRouter.java b/media/java/android/media/MediaRouter.java
index 80a0315..29b88a2 100644
--- a/media/java/android/media/MediaRouter.java
+++ b/media/java/android/media/MediaRouter.java
@@ -1266,7 +1266,9 @@
}
static void dispatchRouteChanged(RouteInfo info, int oldSupportedTypes) {
- Log.v(TAG, "Dispatching route change: " + info);
+ if (DEBUG) {
+ Log.d(TAG, "Dispatching route change: " + info);
+ }
final int newSupportedTypes = info.mSupportedTypes;
for (CallbackInfo cbi : sStatic.mCallbacks) {
// Reconstruct some of the history for callbacks that may not have observed
diff --git a/media/java/android/media/PlaybackParams.java b/media/java/android/media/PlaybackParams.java
index 021dbf2..938a953 100644
--- a/media/java/android/media/PlaybackParams.java
+++ b/media/java/android/media/PlaybackParams.java
@@ -174,7 +174,7 @@
* Sets the pitch factor.
* @param pitch
* @return this <code>PlaybackParams</code> instance.
- * @throws InvalidArgumentException if the pitch is negative
+ * @throws IllegalArgumentException if the pitch is negative.
*/
public PlaybackParams setPitch(float pitch) {
if (pitch < 0.f) {
diff --git a/media/java/android/media/SyncParams.java b/media/java/android/media/SyncParams.java
index 319eacba..9f6bfe1 100644
--- a/media/java/android/media/SyncParams.java
+++ b/media/java/android/media/SyncParams.java
@@ -232,7 +232,7 @@
* the maximum deviation of the playback rate from the playback rate
* set. ({@code abs(actual_rate - set_rate) / set_rate})
* @return this <code>SyncParams</code> instance.
- * @throws InvalidArgumentException if the tolerance is negative, or not less than one
+ * @throws IllegalArgumentException if the tolerance is negative, or not less than one.
*/
public SyncParams setTolerance(float tolerance) {
if (tolerance < 0.f || tolerance >= 1.f) {
diff --git a/media/java/android/media/audiofx/AcousticEchoCanceler.java b/media/java/android/media/audiofx/AcousticEchoCanceler.java
index f5f98ef..3a44df4 100644
--- a/media/java/android/media/audiofx/AcousticEchoCanceler.java
+++ b/media/java/android/media/audiofx/AcousticEchoCanceler.java
@@ -20,7 +20,7 @@
/**
* Acoustic Echo Canceler (AEC).
- * <p>Acoustic Echo Canceler (AEC) is an audio pre-processing which removes the contribution of the
+ * <p>Acoustic Echo Canceler (AEC) is an audio pre-processor which removes the contribution of the
* signal received from the remote party from the captured audio signal.
* <p>AEC is used by voice communication applications (voice chat, video conferencing, SIP calls)
* where the presence of echo with significant delay in the signal received from the remote party
diff --git a/media/java/android/media/audiofx/AutomaticGainControl.java b/media/java/android/media/audiofx/AutomaticGainControl.java
index 4a6b1f3..a76b4de 100644
--- a/media/java/android/media/audiofx/AutomaticGainControl.java
+++ b/media/java/android/media/audiofx/AutomaticGainControl.java
@@ -20,7 +20,7 @@
/**
* Automatic Gain Control (AGC).
- * <p>Automatic Gain Control (AGC) is an audio pre-processing which automatically normalizes the
+ * <p>Automatic Gain Control (AGC) is an audio pre-processor which automatically normalizes the
* output of the captured signal by boosting or lowering input from the microphone to match a preset
* level so that the output signal level is virtually constant.
* AGC can be used by applications where the input signal dynamic range is not important but where
diff --git a/media/java/android/media/audiofx/NoiseSuppressor.java b/media/java/android/media/audiofx/NoiseSuppressor.java
index bca990f..70cc87c 100644
--- a/media/java/android/media/audiofx/NoiseSuppressor.java
+++ b/media/java/android/media/audiofx/NoiseSuppressor.java
@@ -20,7 +20,7 @@
/**
* Noise Suppressor (NS).
- * <p>Noise suppression (NS) is an audio pre-processing which removes background noise from the
+ * <p>Noise suppression (NS) is an audio pre-processor which removes background noise from the
* captured signal. The component of the signal considered as noise can be either stationary
* (car/airplane engine, AC system) or non-stationary (other peoples conversations, car horn) for
* more advanced implementations.
diff --git a/media/java/android/media/audiopolicy/AudioPolicy.java b/media/java/android/media/audiopolicy/AudioPolicy.java
index 61d642f..7e88c27 100644
--- a/media/java/android/media/audiopolicy/AudioPolicy.java
+++ b/media/java/android/media/audiopolicy/AudioPolicy.java
@@ -186,9 +186,9 @@
/**
* Declares whether this policy will grant and deny audio focus through
- * the {@link AudioPolicy.AudioPolicyStatusListener}.
+ * the {@link AudioPolicy.AudioPolicyFocusListener}.
* If set to {@code true}, it is mandatory to set an
- * {@link AudioPolicy.AudioPolicyStatusListener} in order to successfully build
+ * {@link AudioPolicy.AudioPolicyFocusListener} in order to successfully build
* an {@code AudioPolicy} instance.
* @param enforce true if the policy will govern audio focus decisions.
* @return the same Builder instance.
diff --git a/media/java/android/media/session/MediaSessionManager.java b/media/java/android/media/session/MediaSessionManager.java
index e02a4dc..b215825 100644
--- a/media/java/android/media/session/MediaSessionManager.java
+++ b/media/java/android/media/session/MediaSessionManager.java
@@ -546,18 +546,23 @@
private final IActiveSessionsListener.Stub mStub = new IActiveSessionsListener.Stub() {
@Override
public void onActiveSessionsChanged(final List<MediaSession.Token> tokens) {
- if (mHandler != null) {
- mHandler.post(new Runnable() {
+ final Handler handler = mHandler;
+ if (handler != null) {
+ handler.post(new Runnable() {
@Override
public void run() {
- if (mListener != null) {
+ final Context context = mContext;
+ if (context != null) {
ArrayList<MediaController> controllers
= new ArrayList<MediaController>();
int size = tokens.size();
for (int i = 0; i < size; i++) {
- controllers.add(new MediaController(mContext, tokens.get(i)));
+ controllers.add(new MediaController(context, tokens.get(i)));
}
- mListener.onActiveSessionsChanged(controllers);
+ final OnActiveSessionsChangedListener listener = mListener;
+ if (listener != null) {
+ listener.onActiveSessionsChanged(controllers);
+ }
}
}
});
@@ -566,8 +571,8 @@
};
private void release() {
- mContext = null;
mListener = null;
+ mContext = null;
mHandler = null;
}
}
diff --git a/media/java/android/media/tv/TvContract.java b/media/java/android/media/tv/TvContract.java
index 102e02d..48fb5bf 100644
--- a/media/java/android/media/tv/TvContract.java
+++ b/media/java/android/media/tv/TvContract.java
@@ -731,6 +731,13 @@
}
/**
+ * Returns {@code true}, if {@code uri} is a recorded program URI.
+ */
+ public static boolean isRecordedProgramUri(Uri uri) {
+ return isTvUri(uri) && isTwoSegmentUriStartingWith(uri, PATH_RECORDED_PROGRAM);
+ }
+
+ /**
* Requests to make a channel browsable.
*
* <p>Once called, the system will review the request and make the channel browsable based on
diff --git a/media/java/android/media/tv/TvView.java b/media/java/android/media/tv/TvView.java
index 9264fe4..9538e1d 100644
--- a/media/java/android/media/tv/TvView.java
+++ b/media/java/android/media/tv/TvView.java
@@ -199,6 +199,7 @@
* @hide
*/
@SystemApi
+ @RequiresPermission(android.Manifest.permission.CHANGE_HDMI_CEC_ACTIVE_SOURCE)
public void setMain() {
synchronized (sMainTvViewLock) {
sMainTvView = new WeakReference<>(this);
diff --git a/media/jni/Android.bp b/media/jni/Android.bp
index 9686ab5..02667ca 100644
--- a/media/jni/Android.bp
+++ b/media/jni/Android.bp
@@ -50,6 +50,12 @@
"libexif",
"libpiex",
"libandroidfw",
+ "libhidlbase",
+ "libhidltransport",
+ "android.hardware.cas@1.0",
+ "android.hardware.cas.native@1.0",
+ "android.hidl.memory@1.0",
+ "android.hidl.token@1.0-utils",
],
header_libs: ["libhardware_headers"],
diff --git a/media/jni/android_media_ImageReader.cpp b/media/jni/android_media_ImageReader.cpp
index ff115f70..885bf03 100644
--- a/media/jni/android_media_ImageReader.cpp
+++ b/media/jni/android_media_ImageReader.cpp
@@ -34,7 +34,7 @@
#include <grallocusage/GrallocUsageConversion.h>
#include <jni.h>
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include <stdint.h>
#include <inttypes.h>
diff --git a/media/jni/android_media_ImageWriter.cpp b/media/jni/android_media_ImageWriter.cpp
index 7c424d9..2c74992 100644
--- a/media/jni/android_media_ImageWriter.cpp
+++ b/media/jni/android_media_ImageWriter.cpp
@@ -26,7 +26,7 @@
#include <android_runtime/AndroidRuntime.h>
#include <android_runtime/android_view_Surface.h>
#include <jni.h>
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include <stdint.h>
#include <inttypes.h>
diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp
index 2178607..2d008c7 100644
--- a/media/jni/android_media_MediaCodec.cpp
+++ b/media/jni/android_media_MediaCodec.cpp
@@ -21,15 +21,16 @@
#include "android_media_MediaCodec.h"
#include "android_media_MediaCrypto.h"
+#include "android_media_MediaDescrambler.h"
#include "android_media_MediaMetricsJNI.h"
#include "android_media_Utils.h"
#include "android_runtime/AndroidRuntime.h"
#include "android_runtime/android_view_Surface.h"
#include "android_util_Binder.h"
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
-#include <android/media/IDescrambler.h>
+#include <android/hardware/cas/native/1.0/IDescrambler.h>
#include <cutils/compiler.h>
@@ -1010,8 +1011,7 @@
sp<IDescrambler> descrambler;
if (descramblerBinderObj != NULL) {
- sp<IBinder> binder = ibinderForJavaObject(env, descramblerBinderObj);
- descrambler = interface_cast<IDescrambler>(binder);
+ descrambler = JDescrambler::GetDescrambler(env, descramblerBinderObj);
}
err = codec->configure(format, bufferProducer, crypto, descrambler, flags);
@@ -1726,7 +1726,7 @@
if (mode != NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW
&& mode != NATIVE_WINDOW_SCALING_MODE_SCALE_CROP) {
- jniThrowException(env, "java/lang/InvalidArgumentException", NULL);
+ jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
return;
}
@@ -1952,7 +1952,7 @@
{ "native_configure",
"([Ljava/lang/String;[Ljava/lang/Object;Landroid/view/Surface;"
- "Landroid/media/MediaCrypto;Landroid/os/IBinder;I)V",
+ "Landroid/media/MediaCrypto;Landroid/os/IHwBinder;I)V",
(void *)android_media_MediaCodec_native_configure },
{ "native_setSurface",
diff --git a/media/jni/android_media_MediaCodec.h b/media/jni/android_media_MediaCodec.h
index c9a1700..2ec8703 100644
--- a/media/jni/android_media_MediaCodec.h
+++ b/media/jni/android_media_MediaCodec.h
@@ -36,10 +36,13 @@
struct MediaCodec;
struct PersistentSurface;
class Surface;
-namespace media {
-class IDescrambler;
-};
-using namespace media;
+namespace hardware {
+namespace cas {
+namespace native {
+namespace V1_0 {
+struct IDescrambler;
+}}}}
+using hardware::cas::native::V1_0::IDescrambler;
struct JMediaCodec : public AHandler {
JMediaCodec(
diff --git a/media/jni/android_media_MediaCodecList.cpp b/media/jni/android_media_MediaCodecList.cpp
index de9bf1f..8de11ca 100644
--- a/media/jni/android_media_MediaCodecList.cpp
+++ b/media/jni/android_media_MediaCodecList.cpp
@@ -26,7 +26,7 @@
#include "android_runtime/AndroidRuntime.h"
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "android_media_Utils.h"
using namespace android;
diff --git a/media/jni/android_media_MediaCrypto.cpp b/media/jni/android_media_MediaCrypto.cpp
index cbdb8ce..1b3c24f 100644
--- a/media/jni/android_media_MediaCrypto.cpp
+++ b/media/jni/android_media_MediaCrypto.cpp
@@ -22,7 +22,7 @@
#include "android_runtime/AndroidRuntime.h"
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include <binder/IServiceManager.h>
#include <cutils/properties.h>
diff --git a/media/jni/android_media_MediaDataSource.cpp b/media/jni/android_media_MediaDataSource.cpp
index 2ab7e39..8c38d88 100644
--- a/media/jni/android_media_MediaDataSource.cpp
+++ b/media/jni/android_media_MediaDataSource.cpp
@@ -23,7 +23,7 @@
#include "android_runtime/AndroidRuntime.h"
#include "android_runtime/Log.h"
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include <binder/MemoryDealer.h>
#include <drm/drm_framework_common.h>
diff --git a/media/jni/android_media_MediaDescrambler.cpp b/media/jni/android_media_MediaDescrambler.cpp
index 85d33b7..bee5218 100644
--- a/media/jni/android_media_MediaDescrambler.cpp
+++ b/media/jni/android_media_MediaDescrambler.cpp
@@ -20,16 +20,19 @@
#include "android_media_MediaDescrambler.h"
#include "android_runtime/AndroidRuntime.h"
-#include "android_util_Binder.h"
+#include "android_os_HwRemoteBinder.h"
#include "JNIHelp.h"
-#include <android/media/IDescrambler.h>
+#include <android/hardware/cas/native/1.0/BpHwDescrambler.h>
+#include <android/hardware/cas/native/1.0/BnHwDescrambler.h>
#include <binder/MemoryDealer.h>
+#include <hidl/HidlSupport.h>
#include <media/stagefright/foundation/ADebug.h>
#include <nativehelper/ScopedLocalRef.h>
namespace android {
-using media::MediaDescrambler::DescrambleInfo;
+
+using hardware::hidl_handle;
struct fields_t {
jfieldID context;
@@ -94,10 +97,9 @@
}
JDescrambler::JDescrambler(JNIEnv *env, jobject descramblerBinderObj) {
- sp<IDescrambler> cas;
- if (descramblerBinderObj != NULL) {
- sp<IBinder> binder = ibinderForJavaObject(env, descramblerBinderObj);
- mDescrambler = interface_cast<IDescrambler>(binder);
+ mDescrambler = GetDescrambler(env, descramblerBinderObj);
+ if (mDescrambler == NULL) {
+ jniThrowException(env, "java/lang/NullPointerException", NULL);
}
}
@@ -108,9 +110,23 @@
mDealer.clear();
}
-void JDescrambler::ensureBufferCapacity(size_t neededSize) {
+// static
+sp<IDescrambler> JDescrambler::GetDescrambler(JNIEnv *env, jobject obj) {
+ if (obj != NULL) {
+ sp<hardware::IBinder> hwBinder =
+ JHwRemoteBinder::GetNativeContext(env, obj)->getBinder();
+
+ if (hwBinder != NULL) {
+ return hardware::fromBinder<
+ IDescrambler, BpHwDescrambler, BnHwDescrambler>(hwBinder);
+ }
+ }
+ return NULL;
+}
+
+bool JDescrambler::ensureBufferCapacity(size_t neededSize) {
if (mMem != NULL && mMem->size() >= neededSize) {
- return;
+ return true;
}
ALOGV("ensureBufferCapacity: current size %zu, new size %zu",
@@ -122,49 +138,84 @@
neededSize = (neededSize + 65535) & ~65535;
mDealer = new MemoryDealer(neededSize, "JDescrambler");
mMem = mDealer->allocate(neededSize);
+
+ ssize_t offset;
+ size_t size;
+ sp<IMemoryHeap> heap = mMem->getMemory(&offset, &size);
+ if (heap == NULL) {
+ return false;
+ }
+
+ native_handle_t* nativeHandle = native_handle_create(1, 0);
+ if (!nativeHandle) {
+ ALOGE("ensureBufferCapacity: failed to create native handle");
+ return false;
+ }
+ nativeHandle->data[0] = heap->getHeapID();
+ mDescramblerSrcBuffer.heapBase = hidl_memory("ashmem",
+ hidl_handle(nativeHandle), heap->getSize());
+ mDescramblerSrcBuffer.offset = (uint64_t) offset;
+ mDescramblerSrcBuffer.size = (uint64_t) size;
+ return true;
}
-Status JDescrambler::descramble(
+status_t JDescrambler::descramble(
jbyte key,
- size_t numSubSamples,
ssize_t totalLength,
- DescramblerPlugin::SubSample *subSamples,
+ const hidl_vec<SubSample>& subSamples,
const void *srcPtr,
jint srcOffset,
void *dstPtr,
jint dstOffset,
- ssize_t *result) {
+ Status *status,
+ uint32_t *bytesWritten,
+ hidl_string *detailedError) {
// TODO: IDescrambler::descramble() is re-entrant, however because we
// only have 1 shared mem buffer, we can only do 1 descramble at a time.
// Concurrency might be improved by allowing on-demand allocation of up
// to 2 shared mem buffers.
Mutex::Autolock autolock(mSharedMemLock);
- ensureBufferCapacity(totalLength);
+ if (!ensureBufferCapacity(totalLength)) {
+ return NO_MEMORY;
+ }
memcpy(mMem->pointer(),
(const void*)((const uint8_t*)srcPtr + srcOffset), totalLength);
- DescrambleInfo info;
- info.dstType = DescrambleInfo::kDestinationTypeVmPointer;
- info.numSubSamples = numSubSamples;
- info.scramblingControl = (DescramblerPlugin::ScramblingControl) key;
- info.subSamples = subSamples;
- info.srcMem = mMem;
- info.srcOffset = 0;
- info.dstPtr = NULL;
- info.dstOffset = 0;
+ DestinationBuffer dstBuffer;
+ dstBuffer.type = BufferType::SHARED_MEMORY;
+ dstBuffer.nonsecureMemory = mDescramblerSrcBuffer;
- int32_t descrambleResult;
- Status status = mDescrambler->descramble(info, &descrambleResult);
+ auto err = mDescrambler->descramble(
+ (ScramblingControl) key,
+ subSamples,
+ mDescramblerSrcBuffer,
+ 0,
+ dstBuffer,
+ 0,
+ [&status, &bytesWritten, &detailedError] (
+ Status _status, uint32_t _bytesWritten,
+ const hidl_string& _detailedError) {
+ *status = _status;
+ *bytesWritten = _bytesWritten;
+ *detailedError = _detailedError;
+ });
- if (status.isOk()) {
- *result = (descrambleResult <= totalLength) ? descrambleResult : -1;
- if (*result > 0) {
- memcpy((void*)((uint8_t*)dstPtr + dstOffset), mMem->pointer(), *result);
+ if (!err.isOk()) {
+ return FAILED_TRANSACTION;
+ }
+
+ if (*status == Status::OK) {
+ if (*bytesWritten > 0 && (ssize_t) *bytesWritten <= totalLength) {
+ memcpy((void*)((uint8_t*)dstPtr + dstOffset), mMem->pointer(), *bytesWritten);
+ } else {
+ // status seems OK but bytesWritten is invalid, we really
+ // have no idea what is wrong.
+ *status = Status::ERROR_CAS_UNKNOWN;
}
}
- return status;
+ return OK;
}
} // namespace android
@@ -191,10 +242,10 @@
static ssize_t getSubSampleInfo(JNIEnv *env, jint numSubSamples,
jintArray numBytesOfClearDataObj, jintArray numBytesOfEncryptedDataObj,
- DescramblerPlugin::SubSample **outSubSamples) {
+ hidl_vec<SubSample> *outSubSamples) {
- if (numSubSamples <= 0 || numSubSamples >=
- (signed)(INT32_MAX / sizeof(DescramblerPlugin::SubSample)) ) {
+ if (numSubSamples <= 0 ||
+ numSubSamples >= (signed)(INT32_MAX / sizeof(SubSample))) {
// subSamples array may silently overflow if number of samples are
// too large. Use INT32_MAX as maximum allocation size may be less
// than SIZE_MAX on some platforms.
@@ -215,24 +266,23 @@
? NULL
: env->GetIntArrayElements(numBytesOfEncryptedDataObj, &isCopy);
- DescramblerPlugin::SubSample *subSamples =
- new(std::nothrow) DescramblerPlugin::SubSample[numSubSamples];
-
+ outSubSamples->resize(numSubSamples);
+ SubSample *subSamples = outSubSamples->data();
if (subSamples == NULL) {
ALOGE("Failed to allocate SubSample array!");
return -1;
}
for (jint i = 0; i < numSubSamples; ++i) {
- subSamples[i].mNumBytesOfClearData =
+ subSamples[i].numBytesOfClearData =
(numBytesOfClearData == NULL) ? 0 : numBytesOfClearData[i];
- subSamples[i].mNumBytesOfEncryptedData =
+ subSamples[i].numBytesOfEncryptedData =
(numBytesOfEncryptedData == NULL)
? 0 : numBytesOfEncryptedData[i];
- totalSize += subSamples[i].mNumBytesOfClearData +
- subSamples[i].mNumBytesOfEncryptedData;
+ totalSize += subSamples[i].numBytesOfClearData +
+ subSamples[i].numBytesOfEncryptedData;
}
if (numBytesOfEncryptedData != NULL) {
@@ -248,12 +298,9 @@
}
if (totalSize < 0) {
- delete[] subSamples;
return -1;
}
- *outSubSamples = subSamples;
-
return totalSize;
}
@@ -280,12 +327,6 @@
clazz.get(), ctor, serviceSpecificError, msgObj.get());
}
-static void throwServiceSpecificException(
- JNIEnv *env, int serviceSpecificError, const char *msg) {
- jthrowable exception = createServiceSpecificException(env, serviceSpecificError, msg);
- env->Throw(exception);
-}
-
static jint android_media_MediaDescrambler_native_descramble(
JNIEnv *env, jobject thiz, jbyte key, jint numSubSamples,
jintArray numBytesOfClearDataObj, jintArray numBytesOfEncryptedDataObj,
@@ -293,11 +334,12 @@
jobject dstBuf, jint dstOffset, jint dstLimit) {
sp<JDescrambler> descrambler = getDescrambler(env, thiz);
if (descrambler == NULL) {
- jniThrowException(env, "java/lang/IllegalStateException", NULL);
+ jniThrowException(env, "java/lang/IllegalStateException",
+ "Invalid descrambler object!");
return -1;
}
- DescramblerPlugin::SubSample *subSamples = NULL;
+ hidl_vec<SubSample> subSamples;
ssize_t totalLength = getSubSampleInfo(
env, numSubSamples, numBytesOfClearDataObj,
numBytesOfEncryptedDataObj, &subSamples);
@@ -307,7 +349,6 @@
return -1;
}
- ssize_t result = -1;
void *srcPtr = NULL, *dstPtr = NULL;
jbyteArray srcArray = NULL, dstArray = NULL;
status_t err = getBufferAndSize(
@@ -329,13 +370,15 @@
}
Status status;
- if (err == OK) {
- status = descrambler->descramble(
- key, numSubSamples, totalLength, subSamples,
- srcPtr, srcOffset, dstPtr, dstOffset, &result);
- }
+ uint32_t bytesWritten;
+ hidl_string detailedError;
- delete[] subSamples;
+ err = descrambler->descramble(
+ key, totalLength, subSamples,
+ srcPtr, srcOffset, dstPtr, dstOffset,
+ &status, &bytesWritten, &detailedError);
+
+ // Release byte array before throwing
if (srcArray != NULL) {
env->ReleaseByteArrayElements(srcArray, (jbyte *)srcPtr, 0);
}
@@ -343,51 +386,17 @@
env->ReleaseByteArrayElements(dstArray, (jbyte *)dstPtr, 0);
}
- if (!status.isOk()) {
- switch (status.exceptionCode()) {
- case Status::EX_SECURITY:
- jniThrowException(env, "java/lang/SecurityException",
- status.exceptionMessage());
- break;
- case Status::EX_BAD_PARCELABLE:
- jniThrowException(env, "java/lang/BadParcelableException",
- status.exceptionMessage());
- break;
- case Status::EX_ILLEGAL_ARGUMENT:
- jniThrowException(env, "java/lang/IllegalArgumentException",
- status.exceptionMessage());
- break;
- case Status::EX_NULL_POINTER:
- jniThrowException(env, "java/lang/NullPointerException",
- status.exceptionMessage());
- break;
- case Status::EX_ILLEGAL_STATE:
- jniThrowException(env, "java/lang/IllegalStateException",
- status.exceptionMessage());
- break;
- case Status::EX_NETWORK_MAIN_THREAD:
- jniThrowException(env, "java/lang/NetworkOnMainThreadException",
- status.exceptionMessage());
- break;
- case Status::EX_UNSUPPORTED_OPERATION:
- jniThrowException(env, "java/lang/UnsupportedOperationException",
- status.exceptionMessage());
- break;
- case Status::EX_SERVICE_SPECIFIC:
- throwServiceSpecificException(env, status.serviceSpecificErrorCode(),
- status.exceptionMessage());
- break;
- default:
- {
- String8 msg;
- msg.appendFormat("Unknown exception code: %d, msg: %s",
- status.exceptionCode(), status.exceptionMessage().string());
- jniThrowException(env, "java/lang/RuntimeException", msg.string());
- break;
- }
- }
+ if (err == NO_MEMORY) {
+ jniThrowException(env, "java/lang/OutOfMemoryError", NULL);
+ } else if (err == FAILED_TRANSACTION) {
+ jniThrowException(env, "android/os/RemoteException", NULL);
+ } else if (status != Status::OK) {
+ // Throw ServiceSpecific with cas error code and detailed msg,
+ // which will be re-thrown as MediaCasStateException.
+ env->Throw(createServiceSpecificException(
+ env, (int) status, detailedError.c_str()));
}
- return result;
+ return bytesWritten;
}
static const JNINativeMethod gMethods[] = {
@@ -395,7 +404,7 @@
(void *)android_media_MediaDescrambler_native_release },
{ "native_init", "()V",
(void *)android_media_MediaDescrambler_native_init },
- { "native_setup", "(Landroid/os/IBinder;)V",
+ { "native_setup", "(Landroid/os/IHwBinder;)V",
(void *)android_media_MediaDescrambler_native_setup },
{ "native_descramble", "(BI[I[ILjava/nio/ByteBuffer;IILjava/nio/ByteBuffer;II)I",
(void *)android_media_MediaDescrambler_native_descramble },
diff --git a/media/jni/android_media_MediaDescrambler.h b/media/jni/android_media_MediaDescrambler.h
index aeef05e..015fad2 100644
--- a/media/jni/android_media_MediaDescrambler.h
+++ b/media/jni/android_media_MediaDescrambler.h
@@ -19,34 +19,37 @@
#include "jni.h"
-#include <binder/Status.h>
-#include <media/cas/DescramblerAPI.h>
+#include <android/hardware/cas/native/1.0/IDescrambler.h>
+
#include <media/stagefright/foundation/ABase.h>
#include <utils/Mutex.h>
-#include <utils/RefBase.h>
namespace android {
class IMemory;
class MemoryDealer;
-namespace media {
-class IDescrambler;
-};
-using namespace media;
-using binder::Status;
+
+using hardware::hidl_memory;
+using hardware::hidl_string;
+using hardware::hidl_vec;
+using namespace hardware::cas::V1_0;
+using namespace hardware::cas::native::V1_0;
struct JDescrambler : public RefBase {
JDescrambler(JNIEnv *env, jobject descramberBinderObj);
- Status descramble(
+ status_t descramble(
jbyte key,
- size_t numSubSamples,
ssize_t totalLength,
- DescramblerPlugin::SubSample *subSamples,
+ const hidl_vec<SubSample>& subSamples,
const void *srcPtr,
jint srcOffset,
void *dstPtr,
jint dstOffset,
- ssize_t *result);
+ Status *status,
+ uint32_t *bytesWritten,
+ hidl_string *detailedError);
+
+ static sp<IDescrambler> GetDescrambler(JNIEnv *env, jobject obj);
protected:
virtual ~JDescrambler();
@@ -55,9 +58,11 @@
sp<IDescrambler> mDescrambler;
sp<IMemory> mMem;
sp<MemoryDealer> mDealer;
+ SharedBuffer mDescramblerSrcBuffer;
+
Mutex mSharedMemLock;
- void ensureBufferCapacity(size_t neededSize);
+ bool ensureBufferCapacity(size_t neededSize);
DISALLOW_EVIL_CONSTRUCTORS(JDescrambler);
};
diff --git a/media/jni/android_media_MediaDrm.cpp b/media/jni/android_media_MediaDrm.cpp
index ea35f78..d0c2aea 100644
--- a/media/jni/android_media_MediaDrm.cpp
+++ b/media/jni/android_media_MediaDrm.cpp
@@ -24,7 +24,7 @@
#include "android_runtime/Log.h"
#include "android_os_Parcel.h"
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include <binder/IServiceManager.h>
#include <binder/Parcel.h>
diff --git a/media/jni/android_media_MediaExtractor.cpp b/media/jni/android_media_MediaExtractor.cpp
index 9e5d3d1..c9657b1 100644
--- a/media/jni/android_media_MediaExtractor.cpp
+++ b/media/jni/android_media_MediaExtractor.cpp
@@ -18,16 +18,20 @@
#define LOG_TAG "MediaExtractor-JNI"
#include <utils/Log.h>
+#include "android_media_MediaDataSource.h"
#include "android_media_MediaExtractor.h"
#include "android_media_MediaMetricsJNI.h"
-
#include "android_media_Utils.h"
+#include "android_os_HwRemoteBinder.h"
#include "android_runtime/AndroidRuntime.h"
#include "android_runtime/Log.h"
+#include "android_util_Binder.h"
#include "jni.h"
#include "JNIHelp.h"
-#include "android_media_MediaDataSource.h"
+#include <android/hardware/cas/1.0/BpHwCas.h>
+#include <android/hardware/cas/1.0/BnHwCas.h>
+#include <hidl/HybridInterface.h>
#include <media/IMediaHTTPService.h>
#include <media/hardware/CryptoAPI.h>
#include <media/stagefright/foundation/ABuffer.h>
@@ -37,14 +41,12 @@
#include <media/stagefright/MediaErrors.h>
#include <media/stagefright/MetaData.h>
#include <media/stagefright/NuMediaExtractor.h>
-#include <android/media/ICas.h>
-
#include <nativehelper/ScopedLocalRef.h>
-#include "android_util_Binder.h"
-
namespace android {
+using namespace hardware::cas::V1_0;
+
struct fields_t {
jfieldID context;
@@ -89,8 +91,28 @@
return mImpl->setDataSource(datasource);
}
-status_t JMediaExtractor::setMediaCas(const sp<ICas> &cas) {
- return mImpl->setMediaCas(cas);
+status_t JMediaExtractor::setMediaCas(JNIEnv *env, jobject casBinderObj) {
+ if (casBinderObj == NULL) {
+ return BAD_VALUE;
+ }
+
+ sp<hardware::IBinder> hwBinder =
+ JHwRemoteBinder::GetNativeContext(env, casBinderObj)->getBinder();
+ if (hwBinder == NULL) {
+ return BAD_VALUE;
+ }
+
+ sp<ICas> cas = hardware::fromBinder<ICas, BpHwCas, BnHwCas>(hwBinder);
+ if (cas == NULL) {
+ return BAD_VALUE;
+ }
+
+ HalToken halToken;
+ if (!createHalToken(cas, &halToken)) {
+ return BAD_VALUE;
+ }
+
+ return mImpl->setMediaCas(halToken);
}
size_t JMediaExtractor::countTracks() const {
@@ -748,23 +770,13 @@
return;
}
- if (casBinderObj == NULL) {
- jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
- return;
- }
-
- sp<ICas> cas;
- if (casBinderObj != NULL) {
- sp<IBinder> binder = ibinderForJavaObject(env, casBinderObj);
- cas = interface_cast<ICas>(binder);
- }
- status_t err = extractor->setMediaCas(cas);
+ status_t err = extractor->setMediaCas(env, casBinderObj);
if (err != OK) {
- cas.clear();
+ extractor.clear();
jniThrowException(
env,
- "java/io/IllegalArgumentException",
+ "java/lang/IllegalArgumentException",
"Failed to set MediaCas on extractor.");
}
}
@@ -896,7 +908,7 @@
{ "setDataSource", "(Landroid/media/MediaDataSource;)V",
(void *)android_media_MediaExtractor_setDataSourceCallback },
- { "nativeSetMediaCas", "(Landroid/os/IBinder;)V",
+ { "nativeSetMediaCas", "(Landroid/os/IHwBinder;)V",
(void *)android_media_MediaExtractor_setMediaCas },
{ "getCachedDuration", "()J",
diff --git a/media/jni/android_media_MediaExtractor.h b/media/jni/android_media_MediaExtractor.h
index 3d8c50b..94d36f2 100644
--- a/media/jni/android_media_MediaExtractor.h
+++ b/media/jni/android_media_MediaExtractor.h
@@ -28,10 +28,6 @@
#include "jni.h"
namespace android {
-namespace media {
-class ICas;
-};
-using namespace media;
struct IMediaHTTPService;
class MetaData;
@@ -48,7 +44,7 @@
status_t setDataSource(int fd, off64_t offset, off64_t size);
status_t setDataSource(const sp<DataSource> &source);
- status_t setMediaCas(const sp<ICas> &cas);
+ status_t setMediaCas(JNIEnv *env, jobject casBinderObj);
size_t countTracks() const;
status_t getTrackFormat(size_t index, jobject *format) const;
diff --git a/media/jni/android_media_MediaHTTPConnection.cpp b/media/jni/android_media_MediaHTTPConnection.cpp
index fa0b43f..365e045 100644
--- a/media/jni/android_media_MediaHTTPConnection.cpp
+++ b/media/jni/android_media_MediaHTTPConnection.cpp
@@ -27,7 +27,7 @@
#include "android_runtime/AndroidRuntime.h"
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
namespace android {
diff --git a/media/jni/android_media_MediaMetadataRetriever.cpp b/media/jni/android_media_MediaMetadataRetriever.cpp
index 0a3ce21..71f3856 100644
--- a/media/jni/android_media_MediaMetadataRetriever.cpp
+++ b/media/jni/android_media_MediaMetadataRetriever.cpp
@@ -28,7 +28,7 @@
#include <private/media/VideoFrame.h>
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "android_runtime/AndroidRuntime.h"
#include "android_media_MediaDataSource.h"
#include "android_media_Utils.h"
diff --git a/media/jni/android_media_MediaMuxer.cpp b/media/jni/android_media_MediaMuxer.cpp
index c3461f0..f11452a 100644
--- a/media/jni/android_media_MediaMuxer.cpp
+++ b/media/jni/android_media_MediaMuxer.cpp
@@ -21,7 +21,7 @@
#include "android_media_Utils.h"
#include "android_runtime/AndroidRuntime.h"
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include <unistd.h>
#include <fcntl.h>
diff --git a/media/jni/android_media_MediaPlayer.cpp b/media/jni/android_media_MediaPlayer.cpp
index 3711462..c8ec7c4 100644
--- a/media/jni/android_media_MediaPlayer.cpp
+++ b/media/jni/android_media_MediaPlayer.cpp
@@ -32,7 +32,7 @@
#include <fcntl.h>
#include <utils/threads.h>
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "android_runtime/AndroidRuntime.h"
#include "android_runtime/android_view_Surface.h"
#include "android_runtime/Log.h"
diff --git a/media/jni/android_media_MediaProfiles.cpp b/media/jni/android_media_MediaProfiles.cpp
index 5800043..5bc8092 100644
--- a/media/jni/android_media_MediaProfiles.cpp
+++ b/media/jni/android_media_MediaProfiles.cpp
@@ -22,7 +22,7 @@
#include <utils/threads.h>
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "android_runtime/AndroidRuntime.h"
#include <media/MediaProfiles.h>
diff --git a/media/jni/android_media_MediaScanner.cpp b/media/jni/android_media_MediaScanner.cpp
index 0f3c61f..3b475b2 100644
--- a/media/jni/android_media_MediaScanner.cpp
+++ b/media/jni/android_media_MediaScanner.cpp
@@ -24,7 +24,7 @@
#include <private/media/VideoFrame.h>
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "android_runtime/AndroidRuntime.h"
#include "android_runtime/Log.h"
diff --git a/media/jni/android_media_MediaSync.cpp b/media/jni/android_media_MediaSync.cpp
index 6de5ea9..f752008 100644
--- a/media/jni/android_media_MediaSync.cpp
+++ b/media/jni/android_media_MediaSync.cpp
@@ -26,7 +26,7 @@
#include "android_runtime/AndroidRuntime.h"
#include "android_runtime/android_view_Surface.h"
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include <gui/Surface.h>
diff --git a/media/jni/android_media_ResampleInputStream.cpp b/media/jni/android_media_ResampleInputStream.cpp
index fa75524..3d8f517c 100644
--- a/media/jni/android_media_ResampleInputStream.cpp
+++ b/media/jni/android_media_ResampleInputStream.cpp
@@ -27,7 +27,7 @@
#include <utils/threads.h>
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "android_runtime/AndroidRuntime.h"
diff --git a/media/jni/android_media_SyncParams.cpp b/media/jni/android_media_SyncParams.cpp
index d9b2f1d..2d9738d 100644
--- a/media/jni/android_media_SyncParams.cpp
+++ b/media/jni/android_media_SyncParams.cpp
@@ -16,7 +16,7 @@
#include "android_media_SyncParams.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
namespace android {
diff --git a/media/jni/android_media_Utils.h b/media/jni/android_media_Utils.h
index af2f2d7..821c6b2 100644
--- a/media/jni/android_media_Utils.h
+++ b/media/jni/android_media_Utils.h
@@ -23,7 +23,7 @@
#include <android_runtime/AndroidRuntime.h>
#include <gui/CpuConsumer.h>
#include <jni.h>
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include <utils/KeyedVector.h>
#include <utils/String8.h>
#include <SkStream.h>
diff --git a/media/jni/android_mtp_MtpDatabase.cpp b/media/jni/android_mtp_MtpDatabase.cpp
index f7f79169..cf4458a 100644
--- a/media/jni/android_mtp_MtpDatabase.cpp
+++ b/media/jni/android_mtp_MtpDatabase.cpp
@@ -39,7 +39,7 @@
#include <android_runtime/AndroidRuntime.h>
#include <android_runtime/Log.h>
#include <jni.h>
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include <nativehelper/ScopedLocalRef.h>
#include <assert.h>
diff --git a/media/jni/android_mtp_MtpDevice.cpp b/media/jni/android_mtp_MtpDevice.cpp
index 768ac1d..d42c39e 100644
--- a/media/jni/android_mtp_MtpDevice.cpp
+++ b/media/jni/android_mtp_MtpDevice.cpp
@@ -29,8 +29,8 @@
#include <string>
#include "jni.h"
-#include "JNIHelp.h"
-#include "ScopedPrimitiveArray.h"
+#include <nativehelper/JNIHelp.h>
+#include <nativehelper/ScopedPrimitiveArray.h>
#include "android_runtime/AndroidRuntime.h"
#include "android_runtime/Log.h"
diff --git a/media/jni/android_mtp_MtpServer.cpp b/media/jni/android_mtp_MtpServer.cpp
index c325f4e..e9e9309 100644
--- a/media/jni/android_mtp_MtpServer.cpp
+++ b/media/jni/android_mtp_MtpServer.cpp
@@ -25,7 +25,7 @@
#include <utils/threads.h>
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "android_runtime/AndroidRuntime.h"
#include "private/android_filesystem_config.h"
diff --git a/media/jni/audioeffect/android_media_AudioEffect.cpp b/media/jni/audioeffect/android_media_AudioEffect.cpp
index d4cc3fb..48ddf9a 100644
--- a/media/jni/audioeffect/android_media_AudioEffect.cpp
+++ b/media/jni/audioeffect/android_media_AudioEffect.cpp
@@ -20,12 +20,12 @@
#define LOG_TAG "AudioEffects-JNI"
#include <utils/Log.h>
-#include <nativehelper/jni.h>
+#include <jni.h>
#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
#include "media/AudioEffect.h"
-#include <ScopedUtfChars.h>
+#include <nativehelper/ScopedUtfChars.h>
using namespace android;
diff --git a/media/jni/audioeffect/android_media_Visualizer.cpp b/media/jni/audioeffect/android_media_Visualizer.cpp
index 0645543..b7d7b03 100644
--- a/media/jni/audioeffect/android_media_Visualizer.cpp
+++ b/media/jni/audioeffect/android_media_Visualizer.cpp
@@ -20,13 +20,13 @@
#define LOG_TAG "visualizers-JNI"
#include <utils/Log.h>
-#include <nativehelper/jni.h>
+#include <jni.h>
#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
#include <utils/threads.h>
#include "media/Visualizer.h"
-#include <ScopedUtfChars.h>
+#include <nativehelper/ScopedUtfChars.h>
using namespace android;
diff --git a/media/jni/midi/android_media_midi_MidiDevice.cpp b/media/jni/midi/android_media_midi_MidiDevice.cpp
index 4df8436..5b35453 100644
--- a/media/jni/midi/android_media_midi_MidiDevice.cpp
+++ b/media/jni/midi/android_media_midi_MidiDevice.cpp
@@ -18,8 +18,8 @@
#define LOG_TAG "Midi-JNI"
#include <android_util_Binder.h>
+#include <jni.h>
#include <midi_internal.h>
-#include <nativehelper/jni.h>
#include <utils/Log.h>
using namespace android;
diff --git a/media/jni/soundpool/android_media_SoundPool.cpp b/media/jni/soundpool/android_media_SoundPool.cpp
index 9d0c1f8..f670636 100644
--- a/media/jni/soundpool/android_media_SoundPool.cpp
+++ b/media/jni/soundpool/android_media_SoundPool.cpp
@@ -20,7 +20,7 @@
#define LOG_TAG "SoundPool-JNI"
#include <utils/Log.h>
-#include <nativehelper/jni.h>
+#include <jni.h>
#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
#include "SoundPool.h"
diff --git a/native/android/asset_manager.cpp b/native/android/asset_manager.cpp
index 0e5e5c6..98e9a42 100644
--- a/native/android/asset_manager.cpp
+++ b/native/android/asset_manager.cpp
@@ -24,7 +24,7 @@
#include <utils/threads.h>
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
using namespace android;
diff --git a/native/android/include/android/multinetwork.h b/native/android/include/android/multinetwork.h
new file mode 120000
index 0000000..0feab3a
--- /dev/null
+++ b/native/android/include/android/multinetwork.h
@@ -0,0 +1 @@
+../../../../../native/include/android/multinetwork.h
\ No newline at end of file
diff --git a/native/android/include/multinetwork.h b/native/android/include/multinetwork.h
deleted file mode 120000
index f9d051a..0000000
--- a/native/android/include/multinetwork.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../../native/include/android/multinetwork.h
\ No newline at end of file
diff --git a/native/webview/Android.mk b/native/webview/Android.mk
new file mode 100644
index 0000000..a2a93d7
--- /dev/null
+++ b/native/webview/Android.mk
@@ -0,0 +1,19 @@
+#
+# Copyright (C) 2017 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.
+#
+
+# Include all the makefiles for subdirectories.
+include $(call all-subdir-makefiles)
+
diff --git a/native/webview/OWNERS b/native/webview/OWNERS
new file mode 100644
index 0000000..deee852
--- /dev/null
+++ b/native/webview/OWNERS
@@ -0,0 +1,4 @@
+boliu@google.com
+sgurun@google.com
+tobiasjs@google.com
+torne@google.com
diff --git a/native/webview/loader/Android.mk b/native/webview/loader/Android.mk
new file mode 100644
index 0000000..e8a7d97
--- /dev/null
+++ b/native/webview/loader/Android.mk
@@ -0,0 +1,40 @@
+#
+# Copyright (C) 2017 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.
+
+# This package provides the system interfaces required to load WebView.
+
+LOCAL_PATH := $(call my-dir)
+
+# Loader library which handles address space reservation and relro sharing.
+# Does NOT link any native chromium code.
+include $(CLEAR_VARS)
+
+LOCAL_MODULE:= libwebviewchromium_loader
+
+LOCAL_SRC_FILES := \
+ loader.cpp \
+
+LOCAL_CFLAGS := \
+ -Werror \
+
+LOCAL_SHARED_LIBRARIES += \
+ libdl \
+ liblog \
+ libnativeloader \
+
+LOCAL_MODULE_TAGS := optional
+
+include $(BUILD_SHARED_LIBRARY)
+
diff --git a/native/webview/loader/loader.cpp b/native/webview/loader/loader.cpp
new file mode 100644
index 0000000..376dbb8
--- /dev/null
+++ b/native/webview/loader/loader.cpp
@@ -0,0 +1,259 @@
+/*
+ * Copyright (C) 2014 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.
+ */
+
+// Uncomment for verbose logging.
+// #define LOG_NDEBUG 0
+#define LOG_TAG "webviewchromiumloader"
+
+#include <dlfcn.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#include <jni.h>
+#include <android/dlext.h>
+#include <nativeloader/native_loader.h>
+#include <utils/Log.h>
+
+#define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))
+
+namespace android {
+namespace {
+
+void* gReservedAddress = NULL;
+size_t gReservedSize = 0;
+
+jint LIBLOAD_SUCCESS;
+jint LIBLOAD_FAILED_TO_OPEN_RELRO_FILE;
+jint LIBLOAD_FAILED_TO_LOAD_LIBRARY;
+jint LIBLOAD_FAILED_JNI_CALL;
+jint LIBLOAD_FAILED_TO_FIND_NAMESPACE;
+
+jboolean DoReserveAddressSpace(jlong size) {
+ size_t vsize = static_cast<size_t>(size);
+
+ void* addr = mmap(NULL, vsize, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+ if (addr == MAP_FAILED) {
+ ALOGE("Failed to reserve %zd bytes of address space for future load of "
+ "libwebviewchromium.so: %s",
+ vsize, strerror(errno));
+ return JNI_FALSE;
+ }
+ gReservedAddress = addr;
+ gReservedSize = vsize;
+ ALOGV("Reserved %zd bytes at %p", vsize, addr);
+ return JNI_TRUE;
+}
+
+jboolean DoCreateRelroFile(const char* lib, const char* relro) {
+ // Try to unlink the old file, since if this is being called, the old one is
+ // obsolete.
+ if (unlink(relro) != 0 && errno != ENOENT) {
+ // If something went wrong other than the file not existing, log a warning
+ // but continue anyway in the hope that we can successfully overwrite the
+ // existing file with rename() later.
+ ALOGW("Failed to unlink old file %s: %s", relro, strerror(errno));
+ }
+ static const char tmpsuffix[] = ".XXXXXX";
+ char relro_tmp[strlen(relro) + sizeof(tmpsuffix)];
+ strlcpy(relro_tmp, relro, sizeof(relro_tmp));
+ strlcat(relro_tmp, tmpsuffix, sizeof(relro_tmp));
+ int tmp_fd = TEMP_FAILURE_RETRY(mkstemp(relro_tmp));
+ if (tmp_fd == -1) {
+ ALOGE("Failed to create temporary file %s: %s", relro_tmp, strerror(errno));
+ return JNI_FALSE;
+ }
+ android_dlextinfo extinfo;
+ extinfo.flags = ANDROID_DLEXT_RESERVED_ADDRESS | ANDROID_DLEXT_WRITE_RELRO;
+ extinfo.reserved_addr = gReservedAddress;
+ extinfo.reserved_size = gReservedSize;
+ extinfo.relro_fd = tmp_fd;
+ void* handle = android_dlopen_ext(lib, RTLD_NOW, &extinfo);
+ int close_result = close(tmp_fd);
+ if (handle == NULL) {
+ ALOGE("Failed to load library %s: %s", lib, dlerror());
+ unlink(relro_tmp);
+ return JNI_FALSE;
+ }
+ if (close_result != 0 ||
+ chmod(relro_tmp, S_IRUSR | S_IRGRP | S_IROTH) != 0 ||
+ rename(relro_tmp, relro) != 0) {
+ ALOGE("Failed to update relro file %s: %s", relro, strerror(errno));
+ unlink(relro_tmp);
+ return JNI_FALSE;
+ }
+ ALOGV("Created relro file %s for library %s", relro, lib);
+ return JNI_TRUE;
+}
+
+jint DoLoadWithRelroFile(JNIEnv* env, const char* lib, const char* relro,
+ jobject clazzLoader) {
+ int relro_fd = TEMP_FAILURE_RETRY(open(relro, O_RDONLY));
+ if (relro_fd == -1) {
+ ALOGE("Failed to open relro file %s: %s", relro, strerror(errno));
+ return LIBLOAD_FAILED_TO_OPEN_RELRO_FILE;
+ }
+ android_namespace_t* ns =
+ android::FindNamespaceByClassLoader(env, clazzLoader);
+ if (ns == NULL) {
+ ALOGE("Failed to find classloader namespace");
+ return LIBLOAD_FAILED_TO_FIND_NAMESPACE;
+ }
+ android_dlextinfo extinfo;
+ extinfo.flags = ANDROID_DLEXT_RESERVED_ADDRESS | ANDROID_DLEXT_USE_RELRO |
+ ANDROID_DLEXT_USE_NAMESPACE;
+ extinfo.reserved_addr = gReservedAddress;
+ extinfo.reserved_size = gReservedSize;
+ extinfo.relro_fd = relro_fd;
+ extinfo.library_namespace = ns;
+ void* handle = android_dlopen_ext(lib, RTLD_NOW, &extinfo);
+ close(relro_fd);
+ if (handle == NULL) {
+ ALOGE("Failed to load library %s: %s", lib, dlerror());
+ return LIBLOAD_FAILED_TO_LOAD_LIBRARY;
+ }
+ ALOGV("Loaded library %s with relro file %s", lib, relro);
+ return LIBLOAD_SUCCESS;
+}
+
+/******************************************************************************/
+/* JNI wrappers - handle string lifetimes and 32/64 ABI choice */
+/******************************************************************************/
+
+jboolean ReserveAddressSpace(JNIEnv*, jclass, jlong size) {
+ return DoReserveAddressSpace(size);
+}
+
+jboolean CreateRelroFile(JNIEnv* env, jclass, jstring lib32, jstring lib64,
+ jstring relro32, jstring relro64) {
+#ifdef __LP64__
+ jstring lib = lib64;
+ jstring relro = relro64;
+ (void)lib32; (void)relro32;
+#else
+ jstring lib = lib32;
+ jstring relro = relro32;
+ (void)lib64; (void)relro64;
+#endif
+ jboolean ret = JNI_FALSE;
+ const char* lib_utf8 = env->GetStringUTFChars(lib, NULL);
+ if (lib_utf8 != NULL) {
+ const char* relro_utf8 = env->GetStringUTFChars(relro, NULL);
+ if (relro_utf8 != NULL) {
+ ret = DoCreateRelroFile(lib_utf8, relro_utf8);
+ env->ReleaseStringUTFChars(relro, relro_utf8);
+ }
+ env->ReleaseStringUTFChars(lib, lib_utf8);
+ }
+ return ret;
+}
+
+jint LoadWithRelroFile(JNIEnv* env, jclass, jstring lib, jstring relro32,
+ jstring relro64, jobject clazzLoader) {
+#ifdef __LP64__
+ jstring relro = relro64;
+ (void)relro32;
+#else
+ jstring relro = relro32;
+ (void)relro64;
+#endif
+ jint ret = LIBLOAD_FAILED_JNI_CALL;
+ const char* lib_utf8 = env->GetStringUTFChars(lib, NULL);
+ if (lib_utf8 != NULL) {
+ const char* relro_utf8 = env->GetStringUTFChars(relro, NULL);
+ if (relro_utf8 != NULL) {
+ ret = DoLoadWithRelroFile(env, lib_utf8, relro_utf8, clazzLoader);
+ env->ReleaseStringUTFChars(relro, relro_utf8);
+ }
+ env->ReleaseStringUTFChars(lib, lib_utf8);
+ }
+ return ret;
+}
+
+const char kWebViewFactoryClassName[] = "android/webkit/WebViewFactory";
+const char kWebViewLibraryLoaderClassName[] =
+ "android/webkit/WebViewLibraryLoader";
+const JNINativeMethod kJniMethods[] = {
+ { "nativeReserveAddressSpace", "(J)Z",
+ reinterpret_cast<void*>(ReserveAddressSpace) },
+ { "nativeCreateRelroFile",
+ "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z",
+ reinterpret_cast<void*>(CreateRelroFile) },
+ { "nativeLoadWithRelroFile",
+ "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)I",
+ reinterpret_cast<void*>(LoadWithRelroFile) },
+};
+
+} // namespace
+
+void RegisterWebViewFactory(JNIEnv* env) {
+ // If either of these fail, it will set an exception that will be thrown on
+ // return, so no need to handle errors here.
+ jclass clazz = env->FindClass(kWebViewFactoryClassName);
+ if (clazz) {
+ LIBLOAD_SUCCESS = env->GetStaticIntField(
+ clazz,
+ env->GetStaticFieldID(clazz, "LIBLOAD_SUCCESS", "I"));
+
+ LIBLOAD_FAILED_TO_OPEN_RELRO_FILE = env->GetStaticIntField(
+ clazz,
+ env->GetStaticFieldID(clazz, "LIBLOAD_FAILED_TO_OPEN_RELRO_FILE", "I"));
+
+ LIBLOAD_FAILED_TO_LOAD_LIBRARY = env->GetStaticIntField(
+ clazz,
+ env->GetStaticFieldID(clazz, "LIBLOAD_FAILED_TO_LOAD_LIBRARY", "I"));
+
+ LIBLOAD_FAILED_JNI_CALL = env->GetStaticIntField(
+ clazz,
+ env->GetStaticFieldID(clazz, "LIBLOAD_FAILED_JNI_CALL", "I"));
+
+ LIBLOAD_FAILED_TO_FIND_NAMESPACE = env->GetStaticIntField(
+ clazz,
+ env->GetStaticFieldID(clazz, "LIBLOAD_FAILED_TO_FIND_NAMESPACE", "I"));
+ }
+}
+
+void RegisterWebViewLibraryLoader(JNIEnv* env) {
+ // If either of these fail, it will set an exception that will be thrown on
+ // return, so no need to handle errors here.
+ jclass clazz = env->FindClass(kWebViewLibraryLoaderClassName);
+ if (clazz) {
+ env->RegisterNatives(clazz, kJniMethods, NELEM(kJniMethods));
+ }
+}
+
+} // namespace android
+
+JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void*) {
+ JNIEnv* env = NULL;
+ if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
+ ALOGE("GetEnv failed");
+ return JNI_ERR;
+ }
+ android::RegisterWebViewFactory(env);
+ // Ensure there isn't a pending Java exception before registering methods from
+ // WebViewLibraryLoader
+ if (!env->ExceptionCheck()) {
+ android::RegisterWebViewLibraryLoader(env);
+ }
+ return JNI_VERSION_1_6;
+}
diff --git a/packages/BackupRestoreConfirmation/res/values-da/strings.xml b/packages/BackupRestoreConfirmation/res/values-da/strings.xml
index 28aea33..3a74915 100644
--- a/packages/BackupRestoreConfirmation/res/values-da/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-da/strings.xml
@@ -19,7 +19,7 @@
<string name="backup_confirm_title" msgid="827563724209303345">"Fuld sikkerhedskopiering"</string>
<string name="restore_confirm_title" msgid="5469365809567486602">"Fuld genoprettelse"</string>
<string name="backup_confirm_text" msgid="1878021282758896593">"Der er anmodet om en fuld sikkerhedskopiering af alle data til en tilsluttet stationær computer. Vil du tillade dette?\n\nHvis du ikke har anmodet om sikkerhedskopiering, skal du ikke tillade denne handling."</string>
- <string name="allow_backup_button_label" msgid="4217228747769644068">"Sikkerhedskopier mine data"</string>
+ <string name="allow_backup_button_label" msgid="4217228747769644068">"Sikkerhedskopiér mine data"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"Undlad at sikkerhedskopiere"</string>
<string name="restore_confirm_text" msgid="7499866728030461776">"Der er anmodet om en fuld sikkerhedskopiering af alle data til en tilsluttet stationær computer. Vil du tillade dette?\n\nHvis du ikke har anmodet om sikkerhedskopiering, skal du ikke tillade denne handling."</string>
<string name="allow_restore_button_label" msgid="3081286752277127827">"Gendan mine data"</string>
diff --git a/packages/BackupRestoreConfirmation/res/values-hy/strings.xml b/packages/BackupRestoreConfirmation/res/values-hy/strings.xml
index a054068..285c15d 100644
--- a/packages/BackupRestoreConfirmation/res/values-hy/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-hy/strings.xml
@@ -25,12 +25,12 @@
<string name="allow_restore_button_label" msgid="3081286752277127827">"Վերականգնել իմ տվյալները"</string>
<string name="deny_restore_button_label" msgid="1724367334453104378">"Չվերականգնել"</string>
<string name="current_password_text" msgid="8268189555578298067">"Խնդրում ենք մուտքագրել ձեր ընթացիկ պահուստային գաղտնաբառը ներքևում`"</string>
- <string name="device_encryption_restore_text" msgid="1570864916855208992">"Խնդրում ենք մուտքագրել ձեր սարքի կոդավորված գաղտնաբառը ներքևում:"</string>
- <string name="device_encryption_backup_text" msgid="5866590762672844664">"Խնդրում ենք մուտքագրել ձեր սարքի կոդավորված գաղտնաբառը ներքևում: Այն նաև կօգտագործվի պահուստային արխիվի կոդավորման համար:"</string>
- <string name="backup_enc_password_text" msgid="4981585714795233099">"Խնդրում ենք մուտքագրել գաղտնաբառը` ամբողջական պահուստավորվող տվյալները կոդավորելու համար: Եթե այն դատարկ թողնեք, ապա կօգտագործվի ձեր առկա պահուստավորման գաղտնաբառը`"</string>
- <string name="backup_enc_password_optional" msgid="1350137345907579306">"Եթե ցանկանում եք կոդավորել ամբողջական պահուստավորված տվյալները, մուտքագրեք գաղտնաբառ ստորև`"</string>
- <string name="backup_enc_password_required" msgid="7889652203371654149">"Քանի որ ձեր սարքը կոդավորված է, դուք պետք է կոդավորեք նաև ձեր պահուստը: Խնդրում ենք ստորև սահմանել գաղտնաբառը՝"</string>
- <string name="restore_enc_password_text" msgid="6140898525580710823">"Եթե վերականգնվող տվյալները կոդավորված են, խնդրում ենք մուտքագրել գաղտնաբառը ստորև`"</string>
+ <string name="device_encryption_restore_text" msgid="1570864916855208992">"Խնդրում ենք մուտքագրել ձեր սարքի գաղտնագրման գաղտնաբառը ներքևում:"</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"Խնդրում ենք մուտքագրել ձեր սարքի գաղտնագրման գաղտնաբառը ներքևում: Այն նաև կօգտագործվի պահուստային արխիվի գաղտնագրման համար:"</string>
+ <string name="backup_enc_password_text" msgid="4981585714795233099">"Խնդրում ենք մուտքագրել գաղտնաբառը` ամբողջական պահուստավորվող տվյալները գաղտնագրելու համար: Եթե այն դատարկ թողնեք, ապա կօգտագործվի ձեր առկա պահուստավորման գաղտնաբառը`"</string>
+ <string name="backup_enc_password_optional" msgid="1350137345907579306">"Եթե ցանկանում եք գաղտնագրել ամբողջական պահուստավորված տվյալները, մուտքագրեք գաղտնաբառ ստորև`"</string>
+ <string name="backup_enc_password_required" msgid="7889652203371654149">"Քանի որ ձեր սարքը գաղտնագրված է, դուք պետք է գաղտնագրեք նաև ձեր պահուստը: Խնդրում ենք ստորև սահմանել գաղտնաբառը՝"</string>
+ <string name="restore_enc_password_text" msgid="6140898525580710823">"Եթե վերականգնվող տվյալները գաղտնագրված են, խնդրում ենք մուտքագրել գաղտնաբառը ստորև`"</string>
<string name="toast_backup_started" msgid="550354281452756121">"Պահուստավորումը սկսվում է..."</string>
<string name="toast_backup_ended" msgid="3818080769548726424">"Պահուստավորումն ավարտվեց"</string>
<string name="toast_restore_started" msgid="7881679218971277385">"Վերականգնումը մեկնարկեց..."</string>
diff --git a/packages/CaptivePortalLogin/OWNERS b/packages/CaptivePortalLogin/OWNERS
new file mode 100644
index 0000000..fa26997
--- /dev/null
+++ b/packages/CaptivePortalLogin/OWNERS
@@ -0,0 +1,7 @@
+set noparent
+
+per-file Android.mk = build.master@android.com
+
+ek@google.com
+hugobenichi@google.com
+lorenzo@google.com
diff --git a/packages/CaptivePortalLogin/res/values-af/strings.xml b/packages/CaptivePortalLogin/res/values-af/strings.xml
index 0c48b76..fa6f3fa 100644
--- a/packages/CaptivePortalLogin/res/values-af/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-af/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Gebruik hierdie netwerk nes dit is"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Moenie hierdie netwerk gebruik nie"</string>
<string name="action_bar_label" msgid="917235635415966620">"Meld by netwerk aan"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Meld aan by %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Die netwerk waarby jy probeer aansluit, het sekuriteitkwessies."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Byvoorbeeld, die aanmeldbladsy behoort dalk nie aan die organisasie wat gewys word nie."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Gaan in elk geval deur blaaier voort"</string>
diff --git a/packages/CaptivePortalLogin/res/values-am/strings.xml b/packages/CaptivePortalLogin/res/values-am/strings.xml
index f126a86..36d5e19 100644
--- a/packages/CaptivePortalLogin/res/values-am/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-am/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"ይህን አውታረ መረብ እንዳለ ተጠቀምበት"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"ይህን አውታረ መረብ አትጠቀምበት"</string>
<string name="action_bar_label" msgid="917235635415966620">"ወደ አውታረ መረብ በመለያ ይግቡ"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"ወደ %1$s ይግቡ"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"ለመቀላቀል እየሞከሩ ያሉት አውታረ መረብ የደህንነት ችግሮች አሉበት።"</string>
<string name="ssl_error_example" msgid="647898534624078900">"ለምሳሌ፣ የመግቢያ ገጹ የሚታየው ድርጅት ላይሆን ይችላል።"</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"ለማንኛውም በአሳሽ በኩል ይቀጥሉ"</string>
diff --git a/packages/CaptivePortalLogin/res/values-ar/strings.xml b/packages/CaptivePortalLogin/res/values-ar/strings.xml
index 76ae5f1..3b2fd00 100644
--- a/packages/CaptivePortalLogin/res/values-ar/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-ar/strings.xml
@@ -5,6 +5,9 @@
<string name="action_use_network" msgid="6076184727448466030">"استخدام هذه الشبكة كما هي"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"عدم استخدام هذه الشبكة"</string>
<string name="action_bar_label" msgid="917235635415966620">"تسجيل الدخول إلى الشبكة"</string>
+ <!-- String.format failed for translation -->
+ <!-- no translation found for action_bar_title (5645564790486983117) -->
+ <skip />
<string name="ssl_error_warning" msgid="6653188881418638872">"الشبكة التي تحاول الانضمام إليها بها مشكلات أمنية."</string>
<string name="ssl_error_example" msgid="647898534624078900">"على سبيل المثال، قد لا تنتمي صفحة تسجيل الدخول إلى المنظمة المعروضة."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"المتابعة على أي حال عبر المتصفح"</string>
diff --git a/packages/CaptivePortalLogin/res/values-az/strings.xml b/packages/CaptivePortalLogin/res/values-az/strings.xml
index f723384..44b406d 100644
--- a/packages/CaptivePortalLogin/res/values-az/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-az/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Bu şəbəkəni olduğu kimi istifadə edin"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Bu şəbəkəni istifadə etməyin"</string>
<string name="action_bar_label" msgid="917235635415966620">"Şəbəkəyə daxil olun"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Daxil olun: %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Qoşulmaq istədiyiniz şəbəkənin təhlükəsizlik problemləri var."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Məsələn, giriş səhifəsi göstərilən təşkilata aid olmaya bilər."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Hər bir halda brazuer ilə davam edin"</string>
diff --git a/packages/CaptivePortalLogin/res/values-b+sr+Latn/strings.xml b/packages/CaptivePortalLogin/res/values-b+sr+Latn/strings.xml
index fb05a9ed..f2a6e07 100644
--- a/packages/CaptivePortalLogin/res/values-b+sr+Latn/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-b+sr+Latn/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Koristi ovu mrežu takvu kakva je"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Ne koristi ovu mrežu"</string>
<string name="action_bar_label" msgid="917235635415966620">"Prijavi me na mrežu"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Prijavite se u: %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Mreža kojoj pokušavate da se pridružite ima bezbednosnih problema."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Na primer, stranica za prijavljivanje možda ne pripada prikazanoj organizaciji."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Ipak nastavi preko pregledača"</string>
diff --git a/packages/CaptivePortalLogin/res/values-be/strings.xml b/packages/CaptivePortalLogin/res/values-be/strings.xml
index 5391946..09ed1de 100644
--- a/packages/CaptivePortalLogin/res/values-be/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-be/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Выкарыстоўваць гэтую сетку як ёсць"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Не выкарыстоўваць гэту сетку"</string>
<string name="action_bar_label" msgid="917235635415966620">"Увайсці ў сетку"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Увайсці ў %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"У сеткі, да якой вы спрабуеце далучыцца, ёсць праблемы з бяспекай."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Напрыклад, старонка ўваходу можа не належаць указанай арганізацыі."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Усё роўна працягнуць праз браўзер"</string>
diff --git a/packages/CaptivePortalLogin/res/values-bg/strings.xml b/packages/CaptivePortalLogin/res/values-bg/strings.xml
index a85191f..8ce9deb 100644
--- a/packages/CaptivePortalLogin/res/values-bg/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-bg/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Директно използване на тази мрежа"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Без използване на тази мрежа"</string>
<string name="action_bar_label" msgid="917235635415966620">"Вход в мрежата"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Влезте в/ъв %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Мрежата, към която опитвате да се присъедините, има проблеми със сигурността."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Например страницата за вход може да не принадлежи на показаната организация."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Продължаване през браузър въпреки това"</string>
diff --git a/packages/CaptivePortalLogin/res/values-bn/strings.xml b/packages/CaptivePortalLogin/res/values-bn/strings.xml
index 24cbfbd..c6a044d 100644
--- a/packages/CaptivePortalLogin/res/values-bn/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-bn/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"যেভাবে আছে সেভাবেই এই নেটওয়ার্ক ব্যবহার করুন"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"এই নেটওয়ার্ক ব্যবহার করবেন না"</string>
<string name="action_bar_label" msgid="917235635415966620">"নেটওয়ার্কে প্রবেশ করুন"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"%1$s তে সাইন-ইন করুন"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"আপনি যে নেটওয়ার্কে যোগ দেওয়ার চেষ্টা করছেন তাতে নিরাপত্তার সমস্যা আছে।"</string>
<string name="ssl_error_example" msgid="647898534624078900">"উদাহরণস্বরূপ, লগইন পৃষ্ঠাটি প্রদর্শিত প্রতিষ্ঠানের অন্তর্গত নাও হতে পারে৷"</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"যাই হোক না কেন ব্রাউজারের মাধ্যমে অবিরত রাখুন"</string>
diff --git a/packages/CaptivePortalLogin/res/values-bs/strings.xml b/packages/CaptivePortalLogin/res/values-bs/strings.xml
index 0b36cd0..10be0e5 100644
--- a/packages/CaptivePortalLogin/res/values-bs/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-bs/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Koristi ovu mrežu kakva jeste"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Ne koristi ovu mrežu"</string>
<string name="action_bar_label" msgid="917235635415966620">"Prijava na mrežu"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Prijava na %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Mreža kojoj pokušavate pristupiti ima sigurnosnih problema."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Naprimjer, stranica za prijavu možda ne pripada prikazanoj organizaciji."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Ipak nastavi preko preglednika"</string>
diff --git a/packages/CaptivePortalLogin/res/values-ca/strings.xml b/packages/CaptivePortalLogin/res/values-ca/strings.xml
index 9d8f6cc..fe189ed 100644
--- a/packages/CaptivePortalLogin/res/values-ca/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-ca/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Fes servir aquesta xarxa tal com està."</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"No facis servir aquesta xarxa."</string>
<string name="action_bar_label" msgid="917235635415966620">"Inicia la sessió a la xarxa"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Inicia la sessió a %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"La xarxa a què et vols connectar té problemes de seguretat."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Per exemple, la pàgina d\'inici de sessió podria no pertànyer a l\'organització que es mostra."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Continua igualment mitjançant el navegador"</string>
diff --git a/packages/CaptivePortalLogin/res/values-cs/strings.xml b/packages/CaptivePortalLogin/res/values-cs/strings.xml
index aee71d9..09dcc5f 100644
--- a/packages/CaptivePortalLogin/res/values-cs/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-cs/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Použít tuto síť tak, jak je"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Tuto síť nepoužívat"</string>
<string name="action_bar_label" msgid="917235635415966620">"Přihlásit se k síti"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Přihlaste se k síti %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Síť, ke které se pokoušíte připojit, má bezpečnostní problémy."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Například přihlašovací stránka nemusí patřit do zobrazované organizace."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Přesto pokračovat prostřednictvím prohlížeče"</string>
diff --git a/packages/CaptivePortalLogin/res/values-da/strings.xml b/packages/CaptivePortalLogin/res/values-da/strings.xml
index 712d9a1..dc0dd17 100644
--- a/packages/CaptivePortalLogin/res/values-da/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-da/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Brug dette netværk, som det er"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Brug ikke dette netværk"</string>
<string name="action_bar_label" msgid="917235635415966620">"Log ind på netværk"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Log ind på %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Der er sikkerhedsproblemer på det netværk, du forsøger at logge ind på."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Det er f.eks. ikke sikkert, at loginsiden tilhører den anførte organisation."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Fortsæt alligevel via browseren"</string>
diff --git a/packages/CaptivePortalLogin/res/values-de/strings.xml b/packages/CaptivePortalLogin/res/values-de/strings.xml
index 52c9dc8..e64fb76 100644
--- a/packages/CaptivePortalLogin/res/values-de/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-de/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Dieses Netzwerk im Istzustand verwenden"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Dieses Netzwerk nicht verwenden"</string>
<string name="action_bar_label" msgid="917235635415966620">"Im Netzwerk anmelden"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"In %1$s anmelden"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Im Netzwerk, zu dem du eine Verbindung herstellen möchtest, liegen Sicherheitsprobleme vor."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Beispiel: Die Log-in-Seite gehört möglicherweise nicht zur angezeigten Organisation."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Trotzdem in einem Browser fortfahren"</string>
diff --git a/packages/CaptivePortalLogin/res/values-el/strings.xml b/packages/CaptivePortalLogin/res/values-el/strings.xml
index 3e8ea44..cb61710 100644
--- a/packages/CaptivePortalLogin/res/values-el/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-el/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Χρήση αυτού του δικτύου ως έχει"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Να μη χρησιμοποιείται αυτό το δίκτυο"</string>
<string name="action_bar_label" msgid="917235635415966620">"Σύνδεση στο δίκτυο"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Συνδεθείτε στο %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Παρουσιάζονται προβλήματα ασφάλειας στο δίκτυο στο οποίο προσπαθείτε να συνδεθείτε."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Για παράδειγμα, η σελίδα σύνδεσης ενδέχεται να μην ανήκει στον οργανισμό που εμφανίζεται."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Συνέχεια ούτως ή άλλως μέσω του προγράμματος περιήγησης"</string>
diff --git a/packages/CaptivePortalLogin/res/values-en-rAU/strings.xml b/packages/CaptivePortalLogin/res/values-en-rAU/strings.xml
index 7d599e7..2e8d1f0 100644
--- a/packages/CaptivePortalLogin/res/values-en-rAU/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-en-rAU/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Use this network as is"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Do not use this network"</string>
<string name="action_bar_label" msgid="917235635415966620">"Sign in to network"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Sign in to %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"The network that you’re trying to join has security issues."</string>
<string name="ssl_error_example" msgid="647898534624078900">"For example, the login page might not belong to the organisation shown."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Continue anyway via browser"</string>
diff --git a/packages/CaptivePortalLogin/res/values-en-rGB/strings.xml b/packages/CaptivePortalLogin/res/values-en-rGB/strings.xml
index 7d599e7..2e8d1f0 100644
--- a/packages/CaptivePortalLogin/res/values-en-rGB/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-en-rGB/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Use this network as is"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Do not use this network"</string>
<string name="action_bar_label" msgid="917235635415966620">"Sign in to network"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Sign in to %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"The network that you’re trying to join has security issues."</string>
<string name="ssl_error_example" msgid="647898534624078900">"For example, the login page might not belong to the organisation shown."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Continue anyway via browser"</string>
diff --git a/packages/CaptivePortalLogin/res/values-en-rIN/strings.xml b/packages/CaptivePortalLogin/res/values-en-rIN/strings.xml
index 7d599e7..2e8d1f0 100644
--- a/packages/CaptivePortalLogin/res/values-en-rIN/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-en-rIN/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Use this network as is"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Do not use this network"</string>
<string name="action_bar_label" msgid="917235635415966620">"Sign in to network"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Sign in to %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"The network that you’re trying to join has security issues."</string>
<string name="ssl_error_example" msgid="647898534624078900">"For example, the login page might not belong to the organisation shown."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Continue anyway via browser"</string>
diff --git a/packages/CaptivePortalLogin/res/values-es-rUS/strings.xml b/packages/CaptivePortalLogin/res/values-es-rUS/strings.xml
index 55e06ab..5d7ba91 100644
--- a/packages/CaptivePortalLogin/res/values-es-rUS/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-es-rUS/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Usar esta red como está"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"No usar esta red"</string>
<string name="action_bar_label" msgid="917235635415966620">"Acceder a la red"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Acceder a %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"La red a la que intentas conectarte tiene problemas de seguridad."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Por ejemplo, es posible que la página de acceso no pertenezca a la organización que aparece."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Continuar de todos modos desde el navegador"</string>
diff --git a/packages/CaptivePortalLogin/res/values-es/strings.xml b/packages/CaptivePortalLogin/res/values-es/strings.xml
index c7e2d0b..da2eae9 100644
--- a/packages/CaptivePortalLogin/res/values-es/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-es/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Utilizar esta red tal cual"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"No utilizar esta red"</string>
<string name="action_bar_label" msgid="917235635415966620">"Iniciar sesión en la red"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Inicia sesión en %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"La red a la que intentas unirte tiene problemas de seguridad."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Por ejemplo, es posible que la página de inicio de sesión no pertenezca a la organización mostrada."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Continuar de todos modos a través del navegador"</string>
diff --git a/packages/CaptivePortalLogin/res/values-et/strings.xml b/packages/CaptivePortalLogin/res/values-et/strings.xml
index 768a5ec..41fcb9a 100644
--- a/packages/CaptivePortalLogin/res/values-et/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-et/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Kasuta seda võrku olemasoleval kujul"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Ära kasuta seda võrku"</string>
<string name="action_bar_label" msgid="917235635415966620">"Logi võrku sisse"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Logige sisse: %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Võrgul, millega üritate ühenduse luua, on turvaprobleeme."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Näiteks ei pruugi sisselogimisleht kuuluda kuvatavale organisatsioonile."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Jätka siiski brauseris"</string>
diff --git a/packages/CaptivePortalLogin/res/values-eu/strings.xml b/packages/CaptivePortalLogin/res/values-eu/strings.xml
index a46768f..8925aac 100644
--- a/packages/CaptivePortalLogin/res/values-eu/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-eu/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Erabili sare hau bere horretan"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Ez erabili sare hau"</string>
<string name="action_bar_label" msgid="917235635415966620">"Hasi saioa sarean"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Hasi saioa %1$s sarean"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Erabili nahi duzun sareak segurtasun-arazoak ditu."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Adibidez, baliteke saioa hasteko orria adierazitako erakundearena ez izatea."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Jarraitu arakatzailearen bidez, halere"</string>
diff --git a/packages/CaptivePortalLogin/res/values-fa/strings.xml b/packages/CaptivePortalLogin/res/values-fa/strings.xml
index 9408e9b..2e4cc51 100644
--- a/packages/CaptivePortalLogin/res/values-fa/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-fa/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"از این شبکه همانطور که هست استفاده شود"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"از این شبکه استفاده نشود"</string>
<string name="action_bar_label" msgid="917235635415966620">"ورود به سیستم شبکه"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"ورود به سیستم %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"شبکهای که میخواهید به آن بپیوندید مشکلات امنیتی دارد."</string>
<string name="ssl_error_example" msgid="647898534624078900">"به عنوان مثال، صفحه ورود به سیستم ممکن است متعلق به سازمان نشان داده شده نباشد."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"در هر صورت از طریق مرورگر ادامه یابد"</string>
diff --git a/packages/CaptivePortalLogin/res/values-fi/strings.xml b/packages/CaptivePortalLogin/res/values-fi/strings.xml
index 4e6e526..1976f7d 100644
--- a/packages/CaptivePortalLogin/res/values-fi/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-fi/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Käytä tätä verkkoa sellaisenaan"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Älä käytä tätä verkkoa"</string>
<string name="action_bar_label" msgid="917235635415966620">"Kirjaudu verkkoon"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Kirjaudu sisään kohteeseen %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Verkossa, johon yrität muodostaa yhteyttä, on turvallisuusongelmia."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Kirjautumissivu ei välttämättä kuulu näytetylle organisaatiolle."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Jatka silti selaimen kautta."</string>
diff --git a/packages/CaptivePortalLogin/res/values-fr-rCA/strings.xml b/packages/CaptivePortalLogin/res/values-fr-rCA/strings.xml
index 7cbfd0a..a7525a5 100644
--- a/packages/CaptivePortalLogin/res/values-fr-rCA/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-fr-rCA/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Utiliser ce réseau tel quel"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Ne pas utiliser ce réseau"</string>
<string name="action_bar_label" msgid="917235635415966620">"Connectez-vous au réseau"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Connexion à %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Le réseau que vous essayez de rejoindre présente des problèmes de sécurité."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Par exemple, la page de connexion pourrait ne pas appartenir à l\'organisation représentée."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Continuer quand même dans un navigateur"</string>
diff --git a/packages/CaptivePortalLogin/res/values-fr/strings.xml b/packages/CaptivePortalLogin/res/values-fr/strings.xml
index d90f530..8f98bb5 100644
--- a/packages/CaptivePortalLogin/res/values-fr/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-fr/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Utiliser ce réseau tel quel"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Ne pas utiliser ce réseau"</string>
<string name="action_bar_label" msgid="917235635415966620">"Se connecter au réseau"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Se connecter à %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Le réseau que vous essayez de rejoindre présente des problèmes de sécurité."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Par exemple, la page de connexion peut ne pas appartenir à l\'organisation représentée."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Continuer quand même dans le navigateur"</string>
diff --git a/packages/CaptivePortalLogin/res/values-gl/strings.xml b/packages/CaptivePortalLogin/res/values-gl/strings.xml
index 10f1f9d..6578285 100644
--- a/packages/CaptivePortalLogin/res/values-gl/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-gl/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Utilizar esta rede tal como está"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Non utilizar esta rede"</string>
<string name="action_bar_label" msgid="917235635415966620">"Inicia sesión na rede"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Iniciar sesión en %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"A rede á que tentas unirte ten problemas de seguranza."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Por exemplo, é posible que a páxina de inicio de sesión non pertenza á organización que se mostra."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Continuar igualmente co navegador"</string>
diff --git a/packages/CaptivePortalLogin/res/values-gu/strings.xml b/packages/CaptivePortalLogin/res/values-gu/strings.xml
index 8214865..c15eca4 100644
--- a/packages/CaptivePortalLogin/res/values-gu/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-gu/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"આ નેટવર્કનો જેમનો તેમ ઉપયોગ કરો"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"આ નેટવર્કનો ઉપયોગ કરશો નહીં"</string>
<string name="action_bar_label" msgid="917235635415966620">"નેટવર્ક પર સાઇન ઇન કરો"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"%1$sમાં સઇન ઇન કરો"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"તમે જોડાવાનો પ્રયાસ કરી રહ્યાં છો તે નેટવર્કમાં સુરક્ષા સમસ્યાઓ છે."</string>
<string name="ssl_error_example" msgid="647898534624078900">"ઉદાહરણ તરીકે, લોગિન પૃષ્ઠ દર્શાવેલ સંસ્થાનું હોઈ શકતું નથી."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"બ્રાઉઝર મારફતે કોઈપણ રીતે ચાલુ રાખો"</string>
diff --git a/packages/CaptivePortalLogin/res/values-hi/strings.xml b/packages/CaptivePortalLogin/res/values-hi/strings.xml
index 05fb4f4..1bc6879 100644
--- a/packages/CaptivePortalLogin/res/values-hi/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-hi/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"इस नेटवर्क का उपयोग जैसा है वैसा ही करें"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"इस नेटवर्क का उपयोग न करें"</string>
<string name="action_bar_label" msgid="917235635415966620">"नेटवर्क में प्रवेश करें"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"%1$s में प्रवेश करें"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"आप जिस नेटवर्क में शामिल होने का प्रयास कर रहे हैं उसमें सुरक्षा समस्याएं हैं."</string>
<string name="ssl_error_example" msgid="647898534624078900">"उदाहरण के लिए, हो सकता है कि लॉगिन पृष्ठ दिखाए गए संगठन से संबद्ध ना हो."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"ब्राउज़र के द्वारा फिर जारी रखें"</string>
diff --git a/packages/CaptivePortalLogin/res/values-hr/strings.xml b/packages/CaptivePortalLogin/res/values-hr/strings.xml
index c252b37..e44cd3b 100644
--- a/packages/CaptivePortalLogin/res/values-hr/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-hr/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Upotrebljavaj ovu mrežu u zatečenom stanju"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Ne upotrebljavaj ovu mrežu"</string>
<string name="action_bar_label" msgid="917235635415966620">"Prijava na mrežu"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Prijavite se na %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Mreža kojoj se pokušavate pridružiti ima sigurnosne poteškoće."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Na primjer, stranica za prijavu možda ne pripada prikazanoj organizaciji."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Ipak nastavi putem preglednika"</string>
diff --git a/packages/CaptivePortalLogin/res/values-hu/strings.xml b/packages/CaptivePortalLogin/res/values-hu/strings.xml
index 1f08c52..f15fb49 100644
--- a/packages/CaptivePortalLogin/res/values-hu/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-hu/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Hálózat használata jelen állapotában"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Ne használja ezt a hálózatot"</string>
<string name="action_bar_label" msgid="917235635415966620">"Bejelentkezés a hálózatba"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Bejelentkezés a következőbe: %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Biztonsági problémák vannak azzal a hálózattal, amelyhez csatlakozni szeretne."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Például lehet, hogy a bejelentkezési oldal nem a megjelenített szervezethez tartozik."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Folytatás ennek ellenére böngészőn keresztül"</string>
diff --git a/packages/CaptivePortalLogin/res/values-hy/strings.xml b/packages/CaptivePortalLogin/res/values-hy/strings.xml
index cf79b8c..a0ee862 100644
--- a/packages/CaptivePortalLogin/res/values-hy/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-hy/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Օգտագործել այս ցանցն ինչպես կա"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Չօգտագործել այս ցանցը"</string>
<string name="action_bar_label" msgid="917235635415966620">"Մուտք գործել ցանց"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Մուտք գործել %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Ցանցը, որին փորձում եք միանալ, անվտանգության խնդիրներ ունի:"</string>
<string name="ssl_error_example" msgid="647898534624078900">"Օրինակ՝ մուտքի էջը կարող է ցուցադրված կազմակերպության էջը չլինել:"</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Շարունակել այնուամենայնիվ դիտարկիչի միջոցով"</string>
diff --git a/packages/CaptivePortalLogin/res/values-in/strings.xml b/packages/CaptivePortalLogin/res/values-in/strings.xml
index ff957c4..7fa3a0a 100644
--- a/packages/CaptivePortalLogin/res/values-in/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-in/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Gunakan jaringan ini sebagaimana adanya"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Jangan gunakan jaringan ini"</string>
<string name="action_bar_label" msgid="917235635415966620">"Masuk ke jaringan"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Login ke %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Jaringan yang ingin Anda masuki mengalami masalah keamanan."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Misalnya, laman masuk mungkin bukan milik organisasi yang ditampilkan."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Tetap lanjutkan melalui browser"</string>
diff --git a/packages/CaptivePortalLogin/res/values-is/strings.xml b/packages/CaptivePortalLogin/res/values-is/strings.xml
index 8c886d2..8fde24b 100644
--- a/packages/CaptivePortalLogin/res/values-is/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-is/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Nota þetta net óbreytt"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Ekki nota þetta net"</string>
<string name="action_bar_label" msgid="917235635415966620">"Skrá inn á net"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Skrá inn á %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Öryggisvandamál eru á netinu sem þú ert að reyna að tengjast."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Til dæmis getur verið að innskráningarsíðan tilheyri ekki fyrirtækinu sem birtist."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Halda samt áfram í vafra"</string>
diff --git a/packages/CaptivePortalLogin/res/values-it/strings.xml b/packages/CaptivePortalLogin/res/values-it/strings.xml
index 23ed415..a01a553 100644
--- a/packages/CaptivePortalLogin/res/values-it/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-it/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Utilizza questa rete così com\'è"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Non utilizzare questa rete"</string>
<string name="action_bar_label" msgid="917235635415966620">"Accedi alla rete"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Accedi a %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"La rete a cui stai tentando di accedere presenta problemi di sicurezza."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Ad esempio, la pagina di accesso potrebbe non appartenere all\'organizzazione indicata."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Continua comunque dal browser"</string>
diff --git a/packages/CaptivePortalLogin/res/values-iw/strings.xml b/packages/CaptivePortalLogin/res/values-iw/strings.xml
index fe7333f..8e7915d 100644
--- a/packages/CaptivePortalLogin/res/values-iw/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-iw/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"השתמש ברשת זו כפי שהיא"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"אל תשתמש ברשת זו"</string>
<string name="action_bar_label" msgid="917235635415966620">"היכנס לרשת"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"כניסה אל %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"יש בעיות אבטחה ברשת שאליה אתה מנסה להתחבר."</string>
<string name="ssl_error_example" msgid="647898534624078900">"לדוגמה, ייתכן שדף ההתחברות אינו שייך לארגון המוצג."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"המשך בכל זאת באמצעות דפדפן"</string>
diff --git a/packages/CaptivePortalLogin/res/values-ja/strings.xml b/packages/CaptivePortalLogin/res/values-ja/strings.xml
index b369b65..e275b95 100644
--- a/packages/CaptivePortalLogin/res/values-ja/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-ja/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"このネットワークをそのまま使用する"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"このネットワークを使用しない"</string>
<string name="action_bar_label" msgid="917235635415966620">"ネットワークにログイン"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"%1$s にログイン"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"接続しようとしているネットワークにセキュリティの問題があります。"</string>
<string name="ssl_error_example" msgid="647898534624078900">"たとえば、ログインページが表示されている組織に属していない可能性があります。"</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"ブラウザから続行"</string>
diff --git a/packages/CaptivePortalLogin/res/values-ka/strings.xml b/packages/CaptivePortalLogin/res/values-ka/strings.xml
index 2913178..1ccff12 100644
--- a/packages/CaptivePortalLogin/res/values-ka/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-ka/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"ამ ქსელის გამოყენება, როგორც არის"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"ეს ქსელი არ გამოიყენო"</string>
<string name="action_bar_label" msgid="917235635415966620">"ქსელში შესვლა"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"%1$s-ში შესვლა"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"ქსელს, რომელზედაც მიერთებას ცდილობთ, უსაფრთხოების პრობლემები აქვს."</string>
<string name="ssl_error_example" msgid="647898534624078900">"მაგალითად, სისტემაში შესვლის გვერდი შეიძლება არ ეკუთვნოდეს ნაჩვენებ ორგანიზაციას."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"ბრაუზერში გაგრძელება"</string>
diff --git a/packages/CaptivePortalLogin/res/values-kk/strings.xml b/packages/CaptivePortalLogin/res/values-kk/strings.xml
index d1fb849..a904dea 100644
--- a/packages/CaptivePortalLogin/res/values-kk/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-kk/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Осы желіні бар күйінде пайдалану"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Осы желіні пайдаланбау"</string>
<string name="action_bar_label" msgid="917235635415966620">"Желіге кіру"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"%1$s жүйесіне кіру"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Қосылайын деп жатқан желіңіз қауіпсіз болуы мүмкін."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Мысалы, кіру беті көрсетілген ұйымға тиесілі болмауы мүмкін."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Бәрібір браузер арқылы жалғастыру"</string>
diff --git a/packages/CaptivePortalLogin/res/values-km/strings.xml b/packages/CaptivePortalLogin/res/values-km/strings.xml
index 32098ae..a0497f8 100644
--- a/packages/CaptivePortalLogin/res/values-km/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-km/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"ប្រើបណ្ដាញនេះជា"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"កុំប្រើបណ្ដាញនេះ"</string>
<string name="action_bar_label" msgid="917235635415966620">"ចូលទៅបណ្ដាញ"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"ចូលទៅ %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"បណ្តាញដែលអ្នកកំពុងព្យាយាមចូលមានបញ្ហាសុវត្ថិភាព។"</string>
<string name="ssl_error_example" msgid="647898534624078900">"ឧបករណ៍៖ ទំព័រចូលនេះអាចនឹងមិនមែនជាកម្មសិទ្ធិរបស់ស្ថាប័នដែលបានបង្ហាញនេះទេ។"</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"យ៉ាងណាក៏ដោយនៅតែបន្តតាមរយៈកម្មវិធីរុករក"</string>
diff --git a/packages/CaptivePortalLogin/res/values-kn/strings.xml b/packages/CaptivePortalLogin/res/values-kn/strings.xml
index b3f937a..3084504 100644
--- a/packages/CaptivePortalLogin/res/values-kn/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-kn/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"ಈ ನೆಟ್ವರ್ಕ್ ಅನ್ನು ಹೀಗೆ ಬಳಸಿ"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"ಈ ನೆಟ್ವರ್ಕ್ ಬಳಸಬೇಡಿ"</string>
<string name="action_bar_label" msgid="917235635415966620">"ನೆಟ್ವರ್ಕ್ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"%1$s ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"ನೀವು ಸೇರಬೇಕೆಂದಿರುವ ನೆಟ್ವರ್ಕ್ ಭದ್ರತೆ ಸಮಸ್ಯೆಗಳನ್ನು ಹೊಂದಿದೆ."</string>
<string name="ssl_error_example" msgid="647898534624078900">"ಉದಾಹರಣೆಗೆ, ಲಾಗಿನ್ ಪುಟವು ತೋರಿಸಲಾಗಿರುವ ಸಂಸ್ಥೆಗೆ ಸಂಬಂಧಿಸಿರುವುದಿಲ್ಲ."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"ಹೇಗಾದರೂ ಬ್ರೌಸರ್ ಮೂಲಕ ಮುಂದುವರಿಸಿ"</string>
diff --git a/packages/CaptivePortalLogin/res/values-ko/strings.xml b/packages/CaptivePortalLogin/res/values-ko/strings.xml
index 9756042..75f2b48 100644
--- a/packages/CaptivePortalLogin/res/values-ko/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-ko/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"현재 상태로 이 네트워크 사용"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"이 네트워크 사용 안함"</string>
<string name="action_bar_label" msgid="917235635415966620">"네트워크에 로그인"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"%1$s에 로그인"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"가입하려는 네트워크에 보안 문제가 있습니다."</string>
<string name="ssl_error_example" msgid="647898534624078900">"예를 들어 로그인 페이지가 표시된 조직에 속하지 않을 수 있습니다."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"브라우저를 통해 계속하기"</string>
diff --git a/packages/CaptivePortalLogin/res/values-ky/strings.xml b/packages/CaptivePortalLogin/res/values-ky/strings.xml
index ab1c7ff..af81ce3 100644
--- a/packages/CaptivePortalLogin/res/values-ky/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-ky/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Бул тармак кандай болсо, ошондой колдонулсун"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Бул тармак колдонулбасын"</string>
<string name="action_bar_label" msgid="917235635415966620">"Тармакка кирүү"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"%1$s каттоо эсебине кириңиз"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Кошулайын деген тармагыңызда коопсуздук көйгөйлөрү бар."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Мисалы, каттоо эсебине кирүү баракчасы көрсөтүлгөн уюмга таандык эмес болушу мүмкүн."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Баары бир серепчи аркылуу улантуу"</string>
diff --git a/packages/CaptivePortalLogin/res/values-lo/strings.xml b/packages/CaptivePortalLogin/res/values-lo/strings.xml
index c50aaa9..ee2b263 100644
--- a/packages/CaptivePortalLogin/res/values-lo/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-lo/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"ໃຊ້ເຄືອຂ່າຍນີ້ຕາມທີ່ມັນເປັນ"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"ບໍ່ໃຊ້ເຄືອຂ່າຍນີ້"</string>
<string name="action_bar_label" msgid="917235635415966620">"ລົງຊື່ເຂົ້າເຄືອຂ່າຍ"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"ເຂົ້າສູ່ລະບົບ %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"ເຄືອຂ່າຍທີ່ທ່ານກຳລັງເຂົ້າຮ່ວມມີບັນຫາຄວາມປອດໄພ."</string>
<string name="ssl_error_example" msgid="647898534624078900">"ຕົວຢ່າງ, ໜ້າລົງຊື່ເຂົ້າໃຊ້ອາດຈະບໍ່ເປັນຂອງອົງການທີ່ສະແດງຂຶ້ນ."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"ແນວໃດກໍ່ສືບຕໍ່ຜ່ານບຣາວເຊີ"</string>
diff --git a/packages/CaptivePortalLogin/res/values-lt/strings.xml b/packages/CaptivePortalLogin/res/values-lt/strings.xml
index 6cdd5ba6..17da83f 100644
--- a/packages/CaptivePortalLogin/res/values-lt/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-lt/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Naudoti šį tinklą tokį, koks yra"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Nenaudoti šio tinklo"</string>
<string name="action_bar_label" msgid="917235635415966620">"Prisijungti prie tinklo"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Prisijungimas prie „%1$s“"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Kilo tinklo, prie kurio bandote prisijungti, problemų."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Pavyzdžiui, prisijungimo puslapis gali nepriklausyti rodomai organizacijai."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Vis tiek tęsti naudojant naršyklę"</string>
diff --git a/packages/CaptivePortalLogin/res/values-lv/strings.xml b/packages/CaptivePortalLogin/res/values-lv/strings.xml
index b33293f..95b8558 100644
--- a/packages/CaptivePortalLogin/res/values-lv/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-lv/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Izmantot tīklu ar pašreizējiem iestatījumiem"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Neizmantot šo tīklu"</string>
<string name="action_bar_label" msgid="917235635415966620">"Pierakstīties tīklā"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Pierakstieties produktā %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Tīklam, kuram mēģināt pievienoties, ir drošības problēmas."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Piemēram, pieteikšanās lapa, iespējams, nepieder norādītajai organizācijai."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Tik un tā turpināt, izmantojot pārlūkprogrammu"</string>
diff --git a/packages/CaptivePortalLogin/res/values-mk/strings.xml b/packages/CaptivePortalLogin/res/values-mk/strings.xml
index 63428e7..2ae32c8 100644
--- a/packages/CaptivePortalLogin/res/values-mk/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-mk/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Користи ја мрежата во оваа состојба"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Не ја користи мрежата"</string>
<string name="action_bar_label" msgid="917235635415966620">"Најавете се на мрежа"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Најавете се на %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Мрежата на која се обидувате да се придружите има проблеми со безбедноста."</string>
<string name="ssl_error_example" msgid="647898534624078900">"На пример, страницата за најавување може да не припаѓа на организацијата што е прикажана."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Сепак продолжи преку прелистувач"</string>
diff --git a/packages/CaptivePortalLogin/res/values-ml/strings.xml b/packages/CaptivePortalLogin/res/values-ml/strings.xml
index 911b99882..79551f8 100644
--- a/packages/CaptivePortalLogin/res/values-ml/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-ml/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"ഈ നെറ്റ്വർക്ക് മാറ്റമൊന്നും വരുത്താതെ ഉപയോഗിക്കുക"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"ഈ നെറ്റ്വർക്ക് ഉപയോഗിക്കരുത്"</string>
<string name="action_bar_label" msgid="917235635415966620">"നെറ്റ്വർക്കിൽ സൈൻ ഇൻ ചെയ്യുക"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"%1$s എന്നതിലേക്ക് സൈൻ ഇൻ ചെയ്യുക"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"നിങ്ങൾ ചേരാൻ ശ്രമിക്കുന്ന നെറ്റ്വർക്കിൽ സുരക്ഷാ പ്രശ്നങ്ങളുണ്ടായിരിക്കാം."</string>
<string name="ssl_error_example" msgid="647898534624078900">"ഉദാഹരണത്തിന്, കാണിച്ചിരിക്കുന്ന ഓർഗനൈസേഷന്റേതായിരിക്കില്ല ലോഗിൻ പേജ്."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"എന്തായാലും ബ്രൗസർ വഴി തുടരുക"</string>
diff --git a/packages/CaptivePortalLogin/res/values-mn/strings.xml b/packages/CaptivePortalLogin/res/values-mn/strings.xml
index 2489e9c..67670915 100644
--- a/packages/CaptivePortalLogin/res/values-mn/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-mn/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Энэ сүлжээг ашиглана уу"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Энэ сүлжээг бүү ашиглана уу"</string>
<string name="action_bar_label" msgid="917235635415966620">"Сүлжээнд нэвтэрнэ үү"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"%1$s-д нэвтрэх"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Таны нэгдэх гэж буй сүлжээ аюулгүй байдлын асуудалтай байна."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Жишээлбэл нэвтрэх хуудас нь харагдах байгууллагынх биш байж болзошгүй."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Ямартаа ч хөтчөөр үргэлжлүүлэх"</string>
diff --git a/packages/CaptivePortalLogin/res/values-mr/strings.xml b/packages/CaptivePortalLogin/res/values-mr/strings.xml
index 9521c8d..fac0a08 100644
--- a/packages/CaptivePortalLogin/res/values-mr/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-mr/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"हे नेटवर्क जसेच्या तसे वापरा"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"हे नेटवर्क वापरू नका"</string>
<string name="action_bar_label" msgid="917235635415966620">"नेटवर्क मध्ये साइन इन करा"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"%1$sमध्ये साइन इन करा"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"ज्या नेटवर्कमध्ये आपण सामील होण्याचा प्रयत्न करीत आहात त्यात सुरक्षितता समस्या आहेत."</string>
<string name="ssl_error_example" msgid="647898534624078900">"उदाहरणार्थ, लॉगिन पृष्ठ कदाचित दर्शविलेल्या संस्थेच्या मालकीचे नसावे."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"ब्राउझरद्वारे तरीही सुरु ठेवा"</string>
diff --git a/packages/CaptivePortalLogin/res/values-ms/strings.xml b/packages/CaptivePortalLogin/res/values-ms/strings.xml
index 829c55a..933721a 100644
--- a/packages/CaptivePortalLogin/res/values-ms/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-ms/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Gunakan rangkaian ini"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Jangan gunakan rangkaian ini"</string>
<string name="action_bar_label" msgid="917235635415966620">"Log masuk ke rangkaian"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Log masuk ke %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Rangkaian yang anda cuba sertai mempunyai isu keselamatan."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Contohnya, halaman log masuk mungkin bukan milik organisasi yang ditunjukkan."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Teruskan juga melalui penyemak imbas"</string>
diff --git a/packages/CaptivePortalLogin/res/values-my/strings.xml b/packages/CaptivePortalLogin/res/values-my/strings.xml
index e25570d..902834b 100644
--- a/packages/CaptivePortalLogin/res/values-my/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-my/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"ဒီကွန်ရက်ကို လက်ရှိအတိုင်း သုံးရန်"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"ဒီကွန်ရက်ကို မသုံးပါနှင့်"</string>
<string name="action_bar_label" msgid="917235635415966620">"ကွန်ယက်သို့ လက်မှတ်ထိုးဝင်ရန်"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"%1$s သို့ လက်မှတ်ထိုးဝင်ပါ"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"သင်ချိတ်ဆက်ရန် ကြိုးစားနေသည့် ကွန်ရက်သည် လုံခြုံရေးပြဿနာ ရှိနေသည်။"</string>
<string name="ssl_error_example" msgid="647898534624078900">"ဥပမာ၊ ဝင်ရောက်ရန် စာမျက်နှာသည် ပြသထားသည့် အဖွဲ့အစည်းနှင့် သက်ဆိုင်မှု မရှိနိုင်ပါ။"</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"ဘရောက်ဇာမှတစ်ဆင့် ဆက်လုပ်ရန်"</string>
diff --git a/packages/CaptivePortalLogin/res/values-nb/strings.xml b/packages/CaptivePortalLogin/res/values-nb/strings.xml
index b9d3349..0dd5b6c 100644
--- a/packages/CaptivePortalLogin/res/values-nb/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-nb/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Bruk dette nettverket som det er"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Ikke bruk dette nettverket"</string>
<string name="action_bar_label" msgid="917235635415966620">"Logg på nettverk"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Logg på %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Nettverket du prøver å logge på, har sikkerhetsproblemer."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Det er for eksempel mulig at påloggingssiden kanskje ikke tilhører organisasjonen som vises."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Fortsett likevel via nettleseren"</string>
diff --git a/packages/CaptivePortalLogin/res/values-ne/strings.xml b/packages/CaptivePortalLogin/res/values-ne/strings.xml
index 02c2cf3..87a30c0 100644
--- a/packages/CaptivePortalLogin/res/values-ne/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-ne/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"यो सञ्जाल जस्तो छ प्रयोग गर्नुहोस्"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"यो सञ्जाल प्रयोग नगर्नुहोस्"</string>
<string name="action_bar_label" msgid="917235635415966620">"सञ्जालमा साइन इन गर्नुहोस्"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"%1$s मा साइन इन गर्नुहोस्"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"तपाईँले सामेल हुन प्रयास गरिरहनु भएको नेटवर्कमा सुरक्षा मुद्दाहरू छन्।"</string>
<string name="ssl_error_example" msgid="647898534624078900">"उदाहरणका लागि, लग इन पृष्ठ देखाइएको संस्थाको नहुन सक्छ।"</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"जे भए पनि ब्राउजर मार्फत जारी राख्नुहोस्"</string>
diff --git a/packages/CaptivePortalLogin/res/values-nl/strings.xml b/packages/CaptivePortalLogin/res/values-nl/strings.xml
index af1de0a..1c59601 100644
--- a/packages/CaptivePortalLogin/res/values-nl/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-nl/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Dit netwerk in de huidige staat gebruiken"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Dit netwerk niet gebruiken"</string>
<string name="action_bar_label" msgid="917235635415966620">"Inloggen bij netwerk"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Inloggen bij %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Het netwerk waarmee u verbinding probeert te maken, heeft beveiligingsproblemen."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Zo hoort de weergegeven inlogpagina misschien niet bij de weergegeven organisatie."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Toch doorgaan via browser"</string>
diff --git a/packages/CaptivePortalLogin/res/values-pa/strings.xml b/packages/CaptivePortalLogin/res/values-pa/strings.xml
index 4c188fa..c1b014c 100644
--- a/packages/CaptivePortalLogin/res/values-pa/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-pa/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"ਇਸ ਨੈੱਟਵਰਕ ਨੂੰ ਉਵੇਂ ਵਰਤੋ ਜਿਵੇਂ ਇਹ ਹੈ"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"ਇਹ ਨੈੱਟਵਰਕ ਨਾ ਵਰਤੋ"</string>
<string name="action_bar_label" msgid="917235635415966620">"ਨੈੱਟਵਰਕ ਤੇ ਸਾਈਨ ਇਨ ਕਰੋ"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"%1$s \'ਤੇ ਸਾਈਨ ਇਨ ਕਰੋ"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"ਤੁਹਾਡੇ ਦੁਆਰਾ ਸ਼ਾਮਿਲ ਹੋਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੇ ਜਾ ਰਹੇ ਨੈੱਟਵਰਕ ਵਿੱਚ ਸੁਰੱਖਿਆ ਸੰਬੰਧੀ ਸਮੱਸਿਆਵਾਂ ਹਨ।"</string>
<string name="ssl_error_example" msgid="647898534624078900">"ਉਦਾਹਰਣ ਵੱਜੋਂ, ਲੌਗਇਨ ਪੰਨਾ ਦਿਖਾਈ ਗਈ ਸੰਸਥਾ ਨਾਲ ਸੰਬੰਧਿਤ ਨਹੀਂ ਹੋ ਸਕਦਾ ਹੈ।"</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"ਬ੍ਰਾਉਜ਼ਰ ਰਾਹੀਂ ਫਿਰ ਵੀ ਜਾਰੀ ਰੱਖੋ"</string>
diff --git a/packages/CaptivePortalLogin/res/values-pl/strings.xml b/packages/CaptivePortalLogin/res/values-pl/strings.xml
index ee39fe5..17f20df 100644
--- a/packages/CaptivePortalLogin/res/values-pl/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-pl/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Używaj tej sieci tak jak jest"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Nie używaj tej sieci"</string>
<string name="action_bar_label" msgid="917235635415966620">"Zaloguj się do sieci"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Zaloguj się w aplikacji %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"W sieci, z którą próbujesz się połączyć, występują problemy z zabezpieczeniami."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Na przykład strona logowania może nie należeć do wyświetlanej organizacji."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Kontynuuj mimo to w przeglądarce"</string>
diff --git a/packages/CaptivePortalLogin/res/values-pt-rBR/strings.xml b/packages/CaptivePortalLogin/res/values-pt-rBR/strings.xml
index e1d420f..3d1064c 100644
--- a/packages/CaptivePortalLogin/res/values-pt-rBR/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-pt-rBR/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Usar esta rede como está"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Não usar esta rede"</string>
<string name="action_bar_label" msgid="917235635415966620">"Fazer login na rede"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Fazer login em %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"A rede à qual você está tentando se conectar tem problemas de segurança."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Por exemplo, a página de login pode não pertencer à organização mostrada."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Continuar mesmo assim pelo navegador"</string>
diff --git a/packages/CaptivePortalLogin/res/values-pt-rPT/strings.xml b/packages/CaptivePortalLogin/res/values-pt-rPT/strings.xml
index 54e2a8b..94b9d60 100644
--- a/packages/CaptivePortalLogin/res/values-pt-rPT/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-pt-rPT/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Utilizar esta rede como está"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Não utilizar esta rede"</string>
<string name="action_bar_label" msgid="917235635415966620">"Início de sessão na rede"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Iniciar sessão em %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"A rede à qual está a tentar aceder tem problemas de segurança."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Por exemplo, a página de início de sessão pode não pertencer à entidade apresentada."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Continuar mesmo assim através do navegador"</string>
diff --git a/packages/CaptivePortalLogin/res/values-pt/strings.xml b/packages/CaptivePortalLogin/res/values-pt/strings.xml
index e1d420f..3d1064c 100644
--- a/packages/CaptivePortalLogin/res/values-pt/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-pt/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Usar esta rede como está"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Não usar esta rede"</string>
<string name="action_bar_label" msgid="917235635415966620">"Fazer login na rede"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Fazer login em %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"A rede à qual você está tentando se conectar tem problemas de segurança."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Por exemplo, a página de login pode não pertencer à organização mostrada."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Continuar mesmo assim pelo navegador"</string>
diff --git a/packages/CaptivePortalLogin/res/values-ro/strings.xml b/packages/CaptivePortalLogin/res/values-ro/strings.xml
index 3d69e64..cf1b6b5 100644
--- a/packages/CaptivePortalLogin/res/values-ro/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-ro/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Utilizați această rețea în starea actuală"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Nu utilizați această rețea"</string>
<string name="action_bar_label" msgid="917235635415966620">"Conectați-vă la rețea"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Conectați-vă la %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Rețeaua la care încercați să vă conectați are probleme de securitate."</string>
<string name="ssl_error_example" msgid="647898534624078900">"De exemplu, este posibil ca pagina de conectare să nu aparțină organizației afișate."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Continuați oricum prin browser"</string>
diff --git a/packages/CaptivePortalLogin/res/values-ru/strings.xml b/packages/CaptivePortalLogin/res/values-ru/strings.xml
index c45a8c1..6966bcd 100644
--- a/packages/CaptivePortalLogin/res/values-ru/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-ru/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Использовать эту сеть"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Не использовать эту сеть"</string>
<string name="action_bar_label" msgid="917235635415966620">"Регистрация в сети"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Войти: %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Сеть, к которой вы хотите подключиться, небезопасна."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Например, страница входа в аккаунт может быть фиктивной."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Игнорировать и открыть браузер"</string>
diff --git a/packages/CaptivePortalLogin/res/values-si/strings.xml b/packages/CaptivePortalLogin/res/values-si/strings.xml
index 61fd2b8..a307913 100644
--- a/packages/CaptivePortalLogin/res/values-si/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-si/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"මෙම ජාලය ලෙසම භාවිතා කරන්න"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"මෙම ජාලය භාවිතා කරන්න එපා"</string>
<string name="action_bar_label" msgid="917235635415966620">"ජාලයට පුරනය වන්න"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"%1$s වෙත පුරන්න"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"ඔබ සම්බන්ධ වීමට උත්සහ කරන ජාලයේ ආරක්ෂක ගැටළු ඇත."</string>
<string name="ssl_error_example" msgid="647898534624078900">"උදාහරණයක් ලෙස, පුරනය වන පිටුව පෙන්වා ඇති සංවිධානයට අයිති නැති විය හැක."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"කෙසේ වුවත් බ්රවුසරය හරහා ඉදිරියට යන්න"</string>
diff --git a/packages/CaptivePortalLogin/res/values-sk/strings.xml b/packages/CaptivePortalLogin/res/values-sk/strings.xml
index 76af0ca..54763be 100644
--- a/packages/CaptivePortalLogin/res/values-sk/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-sk/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Použiť túto sieť tak, ako je"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Túto sieť nepoužívať"</string>
<string name="action_bar_label" msgid="917235635415966620">"Prihlásiť sa do siete"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Prihláste sa do služby %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Sieť, ku ktorej sa pokúšate pripojiť, má problémy so zabezpečením"</string>
<string name="ssl_error_example" msgid="647898534624078900">"Napríklad prihlasovacia stránka nemusí patriť uvedenej organizácii."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Pokračovať pomocou prehliadača"</string>
diff --git a/packages/CaptivePortalLogin/res/values-sl/strings.xml b/packages/CaptivePortalLogin/res/values-sl/strings.xml
index 158a4d3..7dd0b37 100644
--- a/packages/CaptivePortalLogin/res/values-sl/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-sl/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Uporabljajte to omrežje, »kakršno je«"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Ne uporabljajte tega omrežja"</string>
<string name="action_bar_label" msgid="917235635415966620">"Prijavite se v omrežje"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Prijava v %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Omrežje, ki se mu poskušate pridružiti, ima varnostne težave."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Stran za prijavo na primer morda ne pripada prikazani organizaciji."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Vseeno nadaljuj v brskalniku"</string>
diff --git a/packages/CaptivePortalLogin/res/values-sq/strings.xml b/packages/CaptivePortalLogin/res/values-sq/strings.xml
index 674b809..b06da6d 100644
--- a/packages/CaptivePortalLogin/res/values-sq/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-sq/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Përdore këtë rrjet siç është"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Mos e përdor këtë rrjet"</string>
<string name="action_bar_label" msgid="917235635415966620">"Identifikohu në rrjet"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Identifikohu në %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Rrjeti në të cilin po përpiqesh të bashkohesh ka probleme sigurie."</string>
<string name="ssl_error_example" msgid="647898534624078900">"për shembull, faqja e identifikimit mund të mos i përkasë organizatës së shfaqur."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Vazhdo gjithsesi nëpërmjet shfletuesit"</string>
diff --git a/packages/CaptivePortalLogin/res/values-sr/strings.xml b/packages/CaptivePortalLogin/res/values-sr/strings.xml
index 05c1d50..f604289 100644
--- a/packages/CaptivePortalLogin/res/values-sr/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-sr/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Користи ову мрежу такву каква је"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Не користи ову мрежу"</string>
<string name="action_bar_label" msgid="917235635415966620">"Пријави ме на мрежу"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Пријавите се у: %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Мрежа којој покушавате да се придружите има безбедносних проблема."</string>
<string name="ssl_error_example" msgid="647898534624078900">"На пример, страница за пријављивање можда не припада приказаној организацији."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Ипак настави преко прегледача"</string>
diff --git a/packages/CaptivePortalLogin/res/values-sv/strings.xml b/packages/CaptivePortalLogin/res/values-sv/strings.xml
index 700713a..8cf7041 100644
--- a/packages/CaptivePortalLogin/res/values-sv/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-sv/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Använd det här nätverket som det är"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Använd inte det här nätverket"</string>
<string name="action_bar_label" msgid="917235635415966620">"Logga in på nätverket"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Logga in på %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Nätverket du försöker ansluta till har säkerhetsproblem."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Det kan t.ex. hända att inloggningssidan inte tillhör den organisation som visas."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Fortsätt ändå via webbläsaren"</string>
diff --git a/packages/CaptivePortalLogin/res/values-sw/strings.xml b/packages/CaptivePortalLogin/res/values-sw/strings.xml
index d791955..1c8b6e1 100644
--- a/packages/CaptivePortalLogin/res/values-sw/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-sw/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Tumia mtandao huu jinsi ulivyo"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Usitumie mtandao huu"</string>
<string name="action_bar_label" msgid="917235635415966620">"Ingia katika mtandao"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Ingia katika akaunti ya %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Mtandao unaojaribu kujiunga nao una matatizo ya usalama."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Kwa mfano, ukurasa wa kuingia katika akaunti unaweza usiwe unamilikiwa na shirika lililoonyeshwa."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Endelea hata hivyo kupitia kivinjari"</string>
diff --git a/packages/CaptivePortalLogin/res/values-ta/strings.xml b/packages/CaptivePortalLogin/res/values-ta/strings.xml
index 038f05a..6a60ed7 100644
--- a/packages/CaptivePortalLogin/res/values-ta/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-ta/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"இந்த நெட்வொர்க்கைப் பயன்படுத்து"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"இந்த நெட்வொர்க்கைப் பயன்படுத்த வேண்டாம்"</string>
<string name="action_bar_label" msgid="917235635415966620">"நெட்வொர்க்கில் உள்நுழையவும்"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"%1$s இல் உள்நுழைக"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"நீங்கள் சேர முயற்சிக்கும் நெட்வொர்க்கில் பாதுகாப்புச் சிக்கல்கள் உள்ளன."</string>
<string name="ssl_error_example" msgid="647898534624078900">"எடுத்துக்காட்டாக, உள்நுழைவுப் பக்கமானது காட்டப்படும் அமைப்பிற்குச் சொந்தமானதாக இல்லாமல் இருக்கலாம்."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"பரவாயில்லை, உலாவி வழியாகத் தொடரவும்"</string>
diff --git a/packages/CaptivePortalLogin/res/values-te/strings.xml b/packages/CaptivePortalLogin/res/values-te/strings.xml
index 5d85568..c209d34 100644
--- a/packages/CaptivePortalLogin/res/values-te/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-te/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"ఈ నెట్వర్క్ని యథావిధిగా ఉపయోగించు"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"ఈ నెట్వర్క్ని ఉపయోగించవద్దు"</string>
<string name="action_bar_label" msgid="917235635415966620">"నెట్వర్క్కి సైన్ ఇన్ చేయండి"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"%1$sకి సైన్ ఇన్ చేయండి"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"మీరు చేరడానికి ప్రయత్నిస్తున్న నెట్వర్క్ భద్రతా సమస్యలను కలిగి ఉంది."</string>
<string name="ssl_error_example" msgid="647898534624078900">"ఉదాహరణకు, లాగిన్ పేజీ చూపిన సంస్థకు చెందినది కాకపోవచ్చు."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"ఏదేమైనా బ్రౌజర్ ద్వారా కొనసాగించు"</string>
diff --git a/packages/CaptivePortalLogin/res/values-th/strings.xml b/packages/CaptivePortalLogin/res/values-th/strings.xml
index cc3ae87..9a3a626 100644
--- a/packages/CaptivePortalLogin/res/values-th/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-th/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"ใช้เครือข่ายนี้ตามที่เป็นอยู่"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"ไม่ใช้เครือข่ายนี้"</string>
<string name="action_bar_label" msgid="917235635415966620">"ลงชื่อเข้าใช้เครือข่าย"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"ลงชื่อเข้าใช้ %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"เครือข่ายที่คุณพยายามเข้าร่วมมีปัญหาด้านความปลอดภัย"</string>
<string name="ssl_error_example" msgid="647898534624078900">"ตัวอย่างเช่น หน้าเข้าสู่ระบบอาจไม่ใช่ขององค์กรที่แสดงไว้"</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"ดำเนินการต่อผ่านเบราว์เซอร์"</string>
diff --git a/packages/CaptivePortalLogin/res/values-tl/strings.xml b/packages/CaptivePortalLogin/res/values-tl/strings.xml
index bad5a1a..565ef8f 100644
--- a/packages/CaptivePortalLogin/res/values-tl/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-tl/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Gamitin ang network na ito nang walang pagbabago"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Huwag gamitin ang network na ito"</string>
<string name="action_bar_label" msgid="917235635415966620">"Mag-sign in sa network"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Mag-sign in sa %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"May mga isyu sa seguridad ang network kung saan mo sinusubukang sumali."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Halimbawa, maaaring hindi sa organisasyong ipinapakita ang page sa pag-log in."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Magpatuloy pa rin sa pamamagitan ng browser"</string>
diff --git a/packages/CaptivePortalLogin/res/values-tr/strings.xml b/packages/CaptivePortalLogin/res/values-tr/strings.xml
index 50ea806..73d2455 100644
--- a/packages/CaptivePortalLogin/res/values-tr/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-tr/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Bu ağı olduğu gibi kullan"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Bu ağı kullanma"</string>
<string name="action_bar_label" msgid="917235635415966620">"Ağda oturum açın"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"%1$s üzerinde oturum açın"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Katılmaya çalıştığınız ağda güvenlik sorunları var."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Örneğin, giriş sayfası, gösterilen kuruluşa ait olmayabilir."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Yine de tarayıcıyla devam et"</string>
diff --git a/packages/CaptivePortalLogin/res/values-uk/strings.xml b/packages/CaptivePortalLogin/res/values-uk/strings.xml
index 5ef5426..0e818d3 100644
--- a/packages/CaptivePortalLogin/res/values-uk/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-uk/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Використовувати цю мережу як є"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Не використовувати цю мережу"</string>
<string name="action_bar_label" msgid="917235635415966620">"Увійти в мережу"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Увійти в обліковий запис %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"У мережі, до якої ви намагаєтеся під’єднатись, є проблеми з безпекою."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Наприклад, сторінка входу може не належати вказаній організації."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Усе одно продовжити у веб-переглядачі"</string>
diff --git a/packages/CaptivePortalLogin/res/values-ur/strings.xml b/packages/CaptivePortalLogin/res/values-ur/strings.xml
index 7da543f..05d8fb9 100644
--- a/packages/CaptivePortalLogin/res/values-ur/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-ur/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"جوں کا توں اس نیٹ ورک کا استعمال کریں"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"اس نیٹ ورک کا استعمال نہ کریں"</string>
<string name="action_bar_label" msgid="917235635415966620">"نیٹ ورک میں سائن ان کریں"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"%1$s میں سائن ان کریں"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"جس نیٹ ورک میں آپ شامل ہونے کی کوشش کر رہے ہیں اس میں سیکیورٹی کے مسائل ہیں۔"</string>
<string name="ssl_error_example" msgid="647898534624078900">"مثال کے طور پر ہو سکتا ہے کہ لاگ ان صفحہ دکھائی گئی تنظیم سے تعلق نہ رکھتا ہو۔"</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"براؤزر کے ذریعے بہرحال جاری رکھیں"</string>
diff --git a/packages/CaptivePortalLogin/res/values-uz/strings.xml b/packages/CaptivePortalLogin/res/values-uz/strings.xml
index 0cbef0a..cac96ea 100644
--- a/packages/CaptivePortalLogin/res/values-uz/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-uz/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Ushbu tarmoqdan o‘z holicha foydalanilsin"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Ushbu tarmoqdan foydalanilmasin"</string>
<string name="action_bar_label" msgid="917235635415966620">"Tarmoqqa kirish"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"%1$s hisobiga kirish"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Siz ulanmoqchi bo‘lgan tarmoqda xavfsizlik bilan bog‘liq muammolar mavjud."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Masalan, tizimga kirish sahifasi ko‘rsatilgan tashkilotga tegishli bo‘lmasligi mumkin."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"E’tiborsiz qoldirilsin va brauzer ochilsin"</string>
diff --git a/packages/CaptivePortalLogin/res/values-vi/strings.xml b/packages/CaptivePortalLogin/res/values-vi/strings.xml
index a667283..e51d2aa 100644
--- a/packages/CaptivePortalLogin/res/values-vi/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-vi/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Sử dụng mạng này"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Không sử dụng mạng này"</string>
<string name="action_bar_label" msgid="917235635415966620">"Đăng nhập vào mạng"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Đăng nhập vào %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Mạng mà bạn đang cố gắng tham gia có vấn đề về bảo mật."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Ví dụ, trang đăng nhập có thể không thuộc về tổ chức được hiển thị."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Vẫn tiếp tục qua trình duyệt"</string>
diff --git a/packages/CaptivePortalLogin/res/values-zh-rCN/strings.xml b/packages/CaptivePortalLogin/res/values-zh-rCN/strings.xml
index b832f6e..ce822e7 100644
--- a/packages/CaptivePortalLogin/res/values-zh-rCN/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-zh-rCN/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"直接使用此网络"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"不要使用此网络"</string>
<string name="action_bar_label" msgid="917235635415966620">"登录到网络"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"登录%1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"您尝试加入的网络存在安全问题。"</string>
<string name="ssl_error_example" msgid="647898534624078900">"例如,登录页面可能并不属于页面上显示的单位。"</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"仍然通过浏览器继续操作"</string>
diff --git a/packages/CaptivePortalLogin/res/values-zh-rHK/strings.xml b/packages/CaptivePortalLogin/res/values-zh-rHK/strings.xml
index 1232abb..9010e1e 100644
--- a/packages/CaptivePortalLogin/res/values-zh-rHK/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-zh-rHK/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"依照現況使用這個網絡"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"不要使用這個網絡"</string>
<string name="action_bar_label" msgid="917235635415966620">"登入網絡"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"登入「%1$s」"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"您正在嘗試加入的網絡有安全性問題。"</string>
<string name="ssl_error_example" msgid="647898534624078900">"例如,登入頁面並不屬於所顯示的機構。"</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"透過瀏覽器繼續"</string>
diff --git a/packages/CaptivePortalLogin/res/values-zh-rTW/strings.xml b/packages/CaptivePortalLogin/res/values-zh-rTW/strings.xml
index bd0f4b7..5b535e2 100644
--- a/packages/CaptivePortalLogin/res/values-zh-rTW/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-zh-rTW/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"依現況使用這個網路"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"不使用這個網路"</string>
<string name="action_bar_label" msgid="917235635415966620">"登入網路"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"登入 %1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"你嘗試加入的網路有安全問題。"</string>
<string name="ssl_error_example" msgid="647898534624078900">"例如,登入網頁中顯示的機構可能並非該網頁實際隸屬的機構。"</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"透過瀏覽器繼續"</string>
diff --git a/packages/CaptivePortalLogin/res/values-zu/strings.xml b/packages/CaptivePortalLogin/res/values-zu/strings.xml
index 3320fd4..866ba18 100644
--- a/packages/CaptivePortalLogin/res/values-zu/strings.xml
+++ b/packages/CaptivePortalLogin/res/values-zu/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network" msgid="6076184727448466030">"Sebenzisa le nethiwekhi njengoba injalo"</string>
<string name="action_do_not_use_network" msgid="4577366536956516683">"Ungasebenzisi le nethiwekhi"</string>
<string name="action_bar_label" msgid="917235635415966620">"Ngena ngemvume kunethiwekhi"</string>
+ <string name="action_bar_title" msgid="5645564790486983117">"Ngena ngemvume ku-%1$s"</string>
<string name="ssl_error_warning" msgid="6653188881418638872">"Inethiwekhi ozama ukuyijoyina inezinkinga zokuvikela."</string>
<string name="ssl_error_example" msgid="647898534624078900">"Isibonelo, ikhasi lokungena ngemvume kungenzeka lingelenhlangano ebonisiwe."</string>
<string name="ssl_error_continue" msgid="6492718244923937110">"Qhubeka noma kunjalo ngesiphequluli"</string>
diff --git a/packages/CaptivePortalLogin/res/values/strings.xml b/packages/CaptivePortalLogin/res/values/strings.xml
index b1a3852..f486fe4 100644
--- a/packages/CaptivePortalLogin/res/values/strings.xml
+++ b/packages/CaptivePortalLogin/res/values/strings.xml
@@ -5,6 +5,7 @@
<string name="action_use_network">Use this network as is</string>
<string name="action_do_not_use_network">Do not use this network</string>
<string name="action_bar_label">Sign in to network</string>
+ <string name="action_bar_title">Sign in to %1$s</string>
<string name="ssl_error_warning">The network you’re trying to join has security issues.</string>
<string name="ssl_error_example">For example, the login page may not belong to the organization shown.</string>
<string name="ssl_error_continue">Continue anyway via browser</string>
diff --git a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java
index 7e4f1d0..be87ed2 100644
--- a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java
+++ b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java
@@ -26,6 +26,7 @@
import android.net.ConnectivityManager.NetworkCallback;
import android.net.Network;
import android.net.NetworkCapabilities;
+import android.net.NetworkInfo;
import android.net.NetworkRequest;
import android.net.Proxy;
import android.net.Uri;
@@ -515,7 +516,15 @@
}
private String getHeaderTitle() {
- return getString(R.string.action_bar_label);
+ NetworkInfo info = mCm.getNetworkInfo(mNetwork);
+ if (info == null) {
+ return getString(R.string.action_bar_label);
+ }
+ NetworkCapabilities nc = mCm.getNetworkCapabilities(mNetwork);
+ if (!nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
+ return getString(R.string.action_bar_label);
+ }
+ return getString(R.string.action_bar_title, info.getExtraInfo().replaceAll("^\"|\"$", ""));
}
private String getHeaderSubtitle(URL url) {
diff --git a/packages/CarrierDefaultApp/res/values-ca/strings.xml b/packages/CarrierDefaultApp/res/values-ca/strings.xml
index c1ddbd3..66a8f37 100644
--- a/packages/CarrierDefaultApp/res/values-ca/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-ca/strings.xml
@@ -10,7 +10,7 @@
<string name="no_mobile_data_connection_title" msgid="7449525772416200578">"No hi ha connexió de dades mòbils"</string>
<string name="no_mobile_data_connection" msgid="544980465184147010">"Afegeix un pla de dades o d\'itinerància amb %s"</string>
<string name="mobile_data_status_notification_channel_name" msgid="833999690121305708">"Estat de les dades mòbils"</string>
- <string name="action_bar_label" msgid="4290345990334377177">"Inicia la sessió a la xarxa de telefonia mòbil"</string>
+ <string name="action_bar_label" msgid="4290345990334377177">"Inicia la sessió a la xarxa mòbil"</string>
<string name="ssl_error_warning" msgid="3127935140338254180">"La xarxa a què et vols connectar té problemes de seguretat."</string>
<string name="ssl_error_example" msgid="6188711843183058764">"Per exemple, la pàgina d\'inici de sessió podria no pertànyer a l\'organització que es mostra."</string>
<string name="ssl_error_continue" msgid="1138548463994095584">"Continua igualment mitjançant el navegador"</string>
diff --git a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java
index 0cf21d2..30c1fff 100644
--- a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java
+++ b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java
@@ -55,6 +55,8 @@
Log.e(LOG_TAG, "About to show UI, but no devices to show");
}
+ mPairButton = findViewById(R.id.button_pair);
+
if (getService().mRequest.isSingleDevice()) {
setContentView(R.layout.device_confirmation);
final DeviceFilterPair selectedDevice = getService().mDevicesFound.get(0);
@@ -62,9 +64,12 @@
R.string.confirmation_title,
getCallingAppName(),
selectedDevice.getDisplayName()), 0));
+ mPairButton.setOnClickListener(v -> onDeviceConfirmed(getService().mSelectedDevice));
getService().mSelectedDevice = selectedDevice;
+ onSelectionUpdate();
} else {
setContentView(R.layout.device_chooser);
+ mPairButton.setVisibility(View.GONE);
setTitle(Html.fromHtml(getString(R.string.chooser_title, getCallingAppName()), 0));
mDeviceListView = findViewById(R.id.device_list);
final DeviceDiscoveryService.DevicesAdapter adapter = getService().mDevicesAdapter;
@@ -72,16 +77,12 @@
adapter.registerDataSetObserver(new DataSetObserver() {
@Override
public void onChanged() {
- updatePairButtonEnabled();
+ onSelectionUpdate();
}
});
mDeviceListView.addFooterView(getProgressBar(), null, false);
}
- mPairButton = findViewById(R.id.button_pair);
- mPairButton.setOnClickListener(v -> onPairTapped(getService().mSelectedDevice));
- updatePairButtonEnabled();
-
mCancelButton = findViewById(R.id.button_cancel);
mCancelButton.setOnClickListener(v -> cancel());
}
@@ -134,15 +135,20 @@
return r.getDimensionPixelSize(R.dimen.padding);
}
- private void updatePairButtonEnabled() {
- mPairButton.setEnabled(getService().mSelectedDevice != null);
+ private void onSelectionUpdate() {
+ DeviceFilterPair selectedDevice = getService().mSelectedDevice;
+ if (mPairButton.getVisibility() != View.VISIBLE && selectedDevice != null) {
+ onDeviceConfirmed(selectedDevice);
+ } else {
+ mPairButton.setEnabled(selectedDevice != null);
+ }
}
private DeviceDiscoveryService getService() {
return DeviceDiscoveryService.sInstance;
}
- protected void onPairTapped(DeviceFilterPair selectedDevice) {
+ protected void onDeviceConfirmed(DeviceFilterPair selectedDevice) {
getService().onDeviceSelected(
getCallingPackage(), getDeviceMacAddress(selectedDevice.device));
setResult(RESULT_OK,
diff --git a/packages/DefaultContainerService/jni/com_android_defcontainer_MeasurementUtils.cpp b/packages/DefaultContainerService/jni/com_android_defcontainer_MeasurementUtils.cpp
index 6be4849..53cdc9d 100644
--- a/packages/DefaultContainerService/jni/com_android_defcontainer_MeasurementUtils.cpp
+++ b/packages/DefaultContainerService/jni/com_android_defcontainer_MeasurementUtils.cpp
@@ -16,7 +16,7 @@
#define LOG_TAG "DefContainer-JNI"
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include <diskusage/dirsize.h>
#include <utils/Log.h>
diff --git a/packages/DefaultContainerService/res/values-bs/strings.xml b/packages/DefaultContainerService/res/values-bs/strings.xml
index 56b7db1..9be3873 100644
--- a/packages/DefaultContainerService/res/values-bs/strings.xml
+++ b/packages/DefaultContainerService/res/values-bs/strings.xml
@@ -20,5 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="service_name" msgid="4841491635055379553">"Pomoćnik pristupa paketu"</string>
+ <string name="service_name" msgid="4841491635055379553">"Asistent pristupa paketu"</string>
</resources>
diff --git a/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java b/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java
index 9347877..3800e6f 100644
--- a/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java
+++ b/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java
@@ -213,27 +213,6 @@
}
@Override
- public long calculateDirectorySize(String path) throws RemoteException {
- Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
-
- final File dir = Environment.maybeTranslateEmulatedPathToInternal(new File(path));
- if (dir.exists() && dir.isDirectory()) {
- final String targetPath = dir.getAbsolutePath();
- return MeasurementUtils.measureDirectory(targetPath);
- } else {
- return 0L;
- }
- }
-
- @Override
- public long[] getFileSystemStats(String path) {
- Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
-
- final File file = new File(path);
- return new long[] { file.getTotalSpace(), file.getUsableSpace() };
- }
-
- @Override
public void clearDirectory(String path) throws RemoteException {
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
diff --git a/packages/PrintSpooler/AndroidManifest.xml b/packages/PrintSpooler/AndroidManifest.xml
index 4b9415e..91e23dd 100644
--- a/packages/PrintSpooler/AndroidManifest.xml
+++ b/packages/PrintSpooler/AndroidManifest.xml
@@ -36,6 +36,8 @@
<uses-permission android:name="android.permission.START_PRINT_SERVICE_CONFIG_ACTIVITY"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
+ <uses-permission android:name="android.permission.READ_PRINT_SERVICES" />
+ <uses-permission android:name="android.permission.READ_PRINT_SERVICE_RECOMMENDATIONS" />
<application
android:allowClearUserData="true"
diff --git a/packages/PrintSpooler/jni/com_android_printspooler_util_BitmapSerializeUtils.cpp b/packages/PrintSpooler/jni/com_android_printspooler_util_BitmapSerializeUtils.cpp
index 1ce3949..7ff9ced 100644
--- a/packages/PrintSpooler/jni/com_android_printspooler_util_BitmapSerializeUtils.cpp
+++ b/packages/PrintSpooler/jni/com_android_printspooler_util_BitmapSerializeUtils.cpp
@@ -17,7 +17,7 @@
#define LOG_TAG "BitmapSerializeUtils"
#include <jni.h>
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include <android/bitmap.h>
#include <android/log.h>
diff --git a/packages/PrintSpooler/res/layout/print_activity.xml b/packages/PrintSpooler/res/layout/print_activity.xml
index 94519d4..774f320 100644
--- a/packages/PrintSpooler/res/layout/print_activity.xml
+++ b/packages/PrintSpooler/res/layout/print_activity.xml
@@ -31,7 +31,7 @@
android:elevation="@dimen/preview_controls_elevation"
android:background="?android:attr/colorPrimary">
- <Spinner
+ <com.android.printspooler.widget.ClickInterceptSpinner
android:id="@+id/destination_spinner"
android:layout_width="wrap_content"
android:minWidth="@dimen/preview_destination_spinner_width"
@@ -39,7 +39,7 @@
android:layout_marginTop="4dip"
android:dropDownWidth="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeightSmall">
- </Spinner>
+ </com.android.printspooler.widget.ClickInterceptSpinner>
</FrameLayout>
diff --git a/packages/PrintSpooler/res/values-b+sr+Latn/strings.xml b/packages/PrintSpooler/res/values-b+sr+Latn/strings.xml
index 49fe52b..9c29ff2 100644
--- a/packages/PrintSpooler/res/values-b+sr+Latn/strings.xml
+++ b/packages/PrintSpooler/res/values-b+sr+Latn/strings.xml
@@ -16,7 +16,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_label" msgid="4469836075319831821">"Štamp. iz memor."</string>
+ <string name="app_label" msgid="4469836075319831821">"Štampanje iz memorije"</string>
<string name="more_options_button" msgid="2243228396432556771">"Još opcija"</string>
<string name="label_destination" msgid="9132510997381599275">"Odredište"</string>
<string name="label_copies" msgid="3634531042822968308">"Kopije"</string>
diff --git a/packages/PrintSpooler/res/values-bs/strings.xml b/packages/PrintSpooler/res/values-bs/strings.xml
index d3f1b80..2e9bfa3 100644
--- a/packages/PrintSpooler/res/values-bs/strings.xml
+++ b/packages/PrintSpooler/res/values-bs/strings.xml
@@ -53,7 +53,7 @@
<string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Okvir za pretraživanje je prikazan"</string>
<string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Okvir za pretraživanje je skriven"</string>
<string name="print_add_printer" msgid="1088656468360653455">"Dodaj štampač"</string>
- <string name="print_select_printer" msgid="7388760939873368698">"Izaberite štampač"</string>
+ <string name="print_select_printer" msgid="7388760939873368698">"Odaberite štampač"</string>
<string name="print_forget_printer" msgid="5035287497291910766">"Zaboravi ovaj štampač"</string>
<plurals name="print_search_result_count_utterance" formatted="false" msgid="6997663738361080868">
<item quantity="one"><xliff:g id="COUNT_1">%1$s</xliff:g> štampač je pronađen</item>
diff --git a/packages/PrintSpooler/res/values-da/strings.xml b/packages/PrintSpooler/res/values-da/strings.xml
index 5f116dc..f88a453 100644
--- a/packages/PrintSpooler/res/values-da/strings.xml
+++ b/packages/PrintSpooler/res/values-da/strings.xml
@@ -100,7 +100,7 @@
</string-array>
<string-array name="orientation_labels">
<item msgid="4061931020926489228">"Stående"</item>
- <item msgid="3199660090246166812">"Liggende"</item>
+ <item msgid="3199660090246166812">"Liggende format"</item>
</string-array>
<string name="print_write_error_message" msgid="5787642615179572543">"Der kunne ikke skrives til filen"</string>
<string name="print_error_default_message" msgid="8602678405502922346">"Det virkede desværre ikke. Prøv igen."</string>
diff --git a/packages/PrintSpooler/res/values-sr/strings.xml b/packages/PrintSpooler/res/values-sr/strings.xml
index c20a5af..cb23c3c 100644
--- a/packages/PrintSpooler/res/values-sr/strings.xml
+++ b/packages/PrintSpooler/res/values-sr/strings.xml
@@ -16,7 +16,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_label" msgid="4469836075319831821">"Штамп. из мемор."</string>
+ <string name="app_label" msgid="4469836075319831821">"Штампање из меморије"</string>
<string name="more_options_button" msgid="2243228396432556771">"Још опција"</string>
<string name="label_destination" msgid="9132510997381599275">"Одредиште"</string>
<string name="label_copies" msgid="3634531042822968308">"Копије"</string>
diff --git a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java
index 601491a..1b7a1b8 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java
@@ -70,7 +70,6 @@
import android.util.Log;
import android.util.TypedValue;
import android.view.KeyEvent;
-import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnFocusChangeListener;
@@ -101,6 +100,7 @@
import com.android.printspooler.util.MediaSizeUtils;
import com.android.printspooler.util.MediaSizeUtils.MediaSizeComparator;
import com.android.printspooler.util.PageRangeUtils;
+import com.android.printspooler.widget.ClickInterceptSpinner;
import com.android.printspooler.widget.PrintContentView;
import com.android.printspooler.widget.PrintContentView.OptionsStateChangeListener;
import com.android.printspooler.widget.PrintContentView.OptionsStateController;
@@ -200,7 +200,7 @@
private TextView mPageRangeTitle;
private EditText mPageRangeEditText;
- private Spinner mDestinationSpinner;
+ private ClickInterceptSpinner mDestinationSpinner;
private DestinationAdapter mDestinationSpinnerAdapter;
private boolean mShowDestinationPrompt;
@@ -1383,19 +1383,14 @@
mSummaryCopies.setEnabled(false);
mSummaryPaperSize.setEnabled(false);
- mDestinationSpinner.setOnTouchListener(new View.OnTouchListener() {
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- mShowDestinationPrompt = false;
- mSummaryCopies.setEnabled(true);
- mSummaryPaperSize.setEnabled(true);
- updateOptionsUi();
+ mDestinationSpinner.setPerformClickListener((v) -> {
+ mShowDestinationPrompt = false;
+ mSummaryCopies.setEnabled(true);
+ mSummaryPaperSize.setEnabled(true);
+ updateOptionsUi();
- mDestinationSpinner.setOnTouchListener(null);
- mDestinationSpinnerAdapter.notifyDataSetChanged();
-
- return false;
- }
+ mDestinationSpinner.setPerformClickListener(null);
+ mDestinationSpinnerAdapter.notifyDataSetChanged();
});
}
}
diff --git a/packages/PrintSpooler/src/com/android/printspooler/widget/ClickInterceptSpinner.java b/packages/PrintSpooler/src/com/android/printspooler/widget/ClickInterceptSpinner.java
new file mode 100644
index 0000000..1d3aac9
--- /dev/null
+++ b/packages/PrintSpooler/src/com/android/printspooler/widget/ClickInterceptSpinner.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.printspooler.widget;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.widget.Spinner;
+
+/**
+ * Spinner that can intercept {@link Spinner#performClick()}
+ */
+public class ClickInterceptSpinner extends Spinner {
+ private OnClickListener mListener;
+
+ /**
+ * Create a new spinner with the given attributes.
+ *
+ * @param context The context for the spinner
+ * @param attrs Attributes of the spinner
+ */
+ public ClickInterceptSpinner(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ /**
+ * Set a listener invoked on {@link #performClick()}
+ *
+ * @param listener The listener to be invoked
+ */
+ public void setPerformClickListener(OnClickListener listener) {
+ mListener = listener;
+ }
+
+ @Override
+ public boolean performClick() {
+ if (mListener != null) {
+ mListener.onClick(this);
+ }
+
+ return super.performClick();
+ }
+}
diff --git a/packages/SettingsLib/common.mk b/packages/SettingsLib/common.mk
index 0815534..46b66c4 100644
--- a/packages/SettingsLib/common.mk
+++ b/packages/SettingsLib/common.mk
@@ -20,13 +20,42 @@
SettingsLib
else
LOCAL_RESOURCE_DIR += $(call my-dir)/res
+
+
+## Include transitive dependencies below
+
+# Include support-v7-appcompat, if not already included
+ifeq (,$(findstring android-support-v7-appcompat,$(LOCAL_STATIC_JAVA_LIBRARIES)))
+LOCAL_RESOURCE_DIR += frameworks/support/v7/appcompat/res
+LOCAL_AAPT_FLAGS += --extra-packages android.support.v7.appcompat
+LOCAL_STATIC_JAVA_LIBRARIES += android-support-v7-appcompat
+endif
+
+# Include support-v7-recyclerview, if not already included
+ifeq (,$(findstring android-support-v7-recyclerview,$(LOCAL_STATIC_JAVA_LIBRARIES)))
+LOCAL_RESOURCE_DIR += frameworks/support/v7/recyclerview/res
+LOCAL_AAPT_FLAGS += --extra-packages android.support.v7.recyclerview
+LOCAL_STATIC_JAVA_LIBRARIES += android-support-v7-recyclerview
+endif
+
+# Include android-support-v7-preference, if not already included
+ifeq (,$(findstring android-support-v7-preference,$(LOCAL_STATIC_JAVA_LIBRARIES)))
+LOCAL_RESOURCE_DIR += frameworks/support/v7/preference/res
+LOCAL_AAPT_FLAGS += --extra-packages android.support.v7.preference
+LOCAL_STATIC_JAVA_LIBRARIES += android-support-v7-preference
+endif
+
+# Include android-support-v14-preference, if not already included
+ifeq (,$(findstring android-support-v14-preference,$(LOCAL_STATIC_JAVA_LIBRARIES)))
+LOCAL_RESOURCE_DIR += frameworks/support/v14/preference/res
+LOCAL_AAPT_FLAGS += --extra-packages android.support.v14.preference
+LOCAL_STATIC_JAVA_LIBRARIES += android-support-v14-preference
+endif
+
LOCAL_AAPT_FLAGS += --auto-add-overlay --extra-packages com.android.settingslib
+
LOCAL_STATIC_JAVA_LIBRARIES += \
android-support-annotations \
android-support-v4 \
- android-support-v7-appcompat \
- android-support-v7-preference \
- android-support-v7-recyclerview \
- android-support-v14-preference \
SettingsLib
endif
diff --git a/packages/SettingsLib/res/drawable/ic_expand_more.xml b/packages/SettingsLib/res/drawable/ic_expand_more.xml
new file mode 100644
index 0000000..a8ff539
--- /dev/null
+++ b/packages/SettingsLib/res/drawable/ic_expand_more.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2017 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.
+-->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24"
+ android:tint="?android:attr/colorControlNormal">
+
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M16.59,8.59L12.0,13.17 7.41,8.59 6.0,10.0l6.0,6.0 6.0,-6.0z"/>
+
+</vector>
diff --git a/packages/SettingsLib/res/layout/preference_category_divider.xml b/packages/SettingsLib/res/layout/preference_category_divider.xml
new file mode 100644
index 0000000..6644eec
--- /dev/null
+++ b/packages/SettingsLib/res/layout/preference_category_divider.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2017 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.
+ -->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/two_target_divider"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:gravity="start|center_vertical"
+ android:orientation="horizontal">
+ <View
+ android:layout_height="1dp"
+ android:layout_width="match_parent"
+ android:background="?android:attr/dividerHorizontal" />
+</LinearLayout>
\ No newline at end of file
diff --git a/packages/SettingsLib/res/layout/preference_category_material_settings.xml b/packages/SettingsLib/res/layout/preference_category_material_settings.xml
index 741435e..245e3b7 100644
--- a/packages/SettingsLib/res/layout/preference_category_material_settings.xml
+++ b/packages/SettingsLib/res/layout/preference_category_material_settings.xml
@@ -51,6 +51,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="@android:style/TextAppearance.Material.Body2"
+ android:textAlignment="viewStart"
android:textColor="?android:attr/colorAccent"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"/>
<TextView
diff --git a/packages/SettingsLib/res/layout/preference_category_material_settings_with_divider.xml b/packages/SettingsLib/res/layout/preference_category_material_settings_with_divider.xml
new file mode 100644
index 0000000..70d0898
--- /dev/null
+++ b/packages/SettingsLib/res/layout/preference_category_material_settings_with_divider.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2017 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.
+ -->
+
+<!-- Similar to preference_category_material_settings.xml, except that this always adds
+ a divider above category. -->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <include layout="@layout/preference_category_divider"/>
+ <include layout="@layout/preference_category_material_settings"/>
+</LinearLayout>
\ No newline at end of file
diff --git a/packages/SettingsLib/res/layout/preference_dropdown_material_settings.xml b/packages/SettingsLib/res/layout/preference_dropdown_material_settings.xml
new file mode 100644
index 0000000..a0b8155
--- /dev/null
+++ b/packages/SettingsLib/res/layout/preference_dropdown_material_settings.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2017 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.
+ -->
+
+
+<!-- Based off frameworks/base/core/res/res/layout/preference_dropdown_material.xml
+ except that icon space in this layout is always reserved -->
+<FrameLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <Spinner
+ android:id="@+id/spinner"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="@dimen/preference_no_icon_padding_start"
+ android:visibility="invisible" />
+
+ <include layout="@layout/preference_material"/>
+
+</FrameLayout>
\ No newline at end of file
diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml
index 5d04cf6..c174d5c 100644
--- a/packages/SettingsLib/res/values-af/strings.xml
+++ b/packages/SettingsLib/res/values-af/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Gekoppel via %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Beskikbaar via %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Gekoppel, geen internet nie"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Toegangspunt is tydelik vol"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Baie stadig"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Stadig"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Middelmatig"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Vinnig"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Baie vinnig"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Ontkoppel"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Ontkoppel tans…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Verbind tans…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wi-Fi twee stawe."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wi-Fi drie stawe."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Wi-Fi-sein vol."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Oop netwerk"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Veilige netwerk"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android-bedryfstelsel"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Verwyderde programme"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Verwyderde programme en gebruikers"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Gepasmaak (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Hulp en terugvoer"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Kieslys"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"MGT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Voer wagwoord in om fabriekterugstelling in demonstrasiemodus uit te voer"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Volgende"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Wagwoord word benodig"</string>
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index b42d26a..e1f6107 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"በ%1$s በኩል መገናኘት"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"በ%1$s በኩል የሚገኝ"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"ተገናኝቷል፣ ምንም በይነመረብ የለም"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"የመዳረሻ ነጥብ ለጊዜው ሞልቷል"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"በጣም ቀርፋፋ"</string>
<string name="speed_label_slow" msgid="813109590815810235">"አዘግይ"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"እሺ"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"መካከለኛ"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"ፈጣን"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"እጅግ በጣም ፈጣን"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"ተለያይቷል"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"በመለያየት ላይ..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"በማገናኘት ላይ…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"ሁለት የWiFi አሞሌዎች።"</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"ሦስት የWiFi አሞሌዎች።"</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"የWiFi ምልክት ሙሉ ነው።"</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"አውታረ መረብ ክፈት"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"ደህንነቱ የተጠበቀ አውታረ መረብ"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android ስርዓተ ክወና"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"የተወገዱ መተግበሪያዎች"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"የተወገዱ መተግበሪያዎች እና ተጠቃሚዎች"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"ብጁ (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"እገዛ እና ግብረመልስ"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"ምናሌ"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"ጂኤምቲ"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"የፋብሪካ ዳግም ማስጀመር በማሳያ ሁነታ ውስጥ ለማከናወን የይለፍ ቃል ያስገቡ"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"ቀጣይ"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"የይለፍ ቃል ያስፈልጋል"</string>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index 2ac6bb5..c7d8250 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"تم الاتصال عبر %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"متوفرة عبر %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"متصلة، ولا يتوفر إنترنت"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"نقطة الدخول ممتلئة مؤقتًا"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"بطيئة جدًا"</string>
<string name="speed_label_slow" msgid="813109590815810235">"بطيئة"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"موافق"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"متوسطة"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"سريعة"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"سريعة جدًا"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"غير متصل"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"جارٍ قطع الاتصال..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"جارٍ الاتصال…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"إشارة Wi-Fi تتكون من شريطين."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"إشارة Wi-Fi تتكون من ثلاثة أشرطة."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"إشارة Wi-Fi كاملة."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"شبكة مفتوحة"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"شبكة محمية بكلمة مرور"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"نظام التشغيل Android"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"التطبيقات المزالة"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"التطبيقات والمستخدمون الذين تمت إزالتهم"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"مخصص (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"المساعدة والتعليقات"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"القائمة"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"غرينيتش"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"إدخال كلمة المرور لإعادة الضبط بحسب بيانات المصنع في الوضع التجريبي"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"التالي"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"يلزم توفر كلمة مرور"</string>
diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml
index 494ae00..34736c6 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s vasitəsilə qoşuludur"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s vasitəsilə əlçatandır"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Qoşuludur, internet yoxdur"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Giriş nöqtəsi müvəqqəti olaraq doludur"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Çox Yavaş"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Yavaş"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Orta"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Sürətli"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Çox Sürətli"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Ayrıldı"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Ayrılır..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Qoşulur..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wifi iki xətdir."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wifi üç xətdir."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Wifi siqnalı tamdır."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Açıq şəbəkə"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Təhlükəsiz şəbəkə"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Silinmiş tətbiqlər"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Tətbiqləri və istifadəçiləri silin"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Fərdi (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Yardım və rəy"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menyu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Demo rejimində sıfırlamaq üçün parol daxil edin"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Növbəti"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Parol tələb olunur"</string>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
index fb06a82..bbffe8f 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Veza je uspostavljena preko pristupne tačke %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Dostupna je preko pristupne tačke %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Veza je uspostavljena, nema interneta"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Pristupna tačka je privremeno zauzeta"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Veoma spora"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Spora"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Potvrdi"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Srednja"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Brza"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Veoma brza"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Veza je prekinuta"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Prekidanje veze..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Povezivanje…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wi-Fi signal ima dve crte."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wi-Fi signal ima tri crte."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Wi-Fi signal je najjači."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Otvorena mreža"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Bezbedna mreža"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Uklonjene aplikacije"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Uklonjene aplikacije i korisnici"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Prilagođeni (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Pomoć i povratne informacije"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Meni"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Unesite lozinku da biste obavili resetovanje na fabrička podešavanja u režimu demonstracije"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Dalje"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Potrebna je lozinka"</string>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index f73fd39..aaf7e9a 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Падлучана праз %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Даступна праз %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Падлучана, няма інтэрнэту"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Пункт доступу часова заняты"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Вельмі павольная"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Павольная"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"ОК"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Сярэдняя"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Хуткая"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Вельмі хуткая"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Адключана"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Адключэнне..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Злучэнне..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Два слупкi Wi-Fi."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Тры слупкi Wi-Fi."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Поўны сігнал Wi-Fi."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Адкрытая сетка"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Бяспечная сетка"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"АС Android"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Выдаленыя прыкладанні"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Выдаленыя прыкладанні і карыстальнiкi"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Карыстальніцкі (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Даведка і водгукі"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Меню"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Каб выканаць скід да заводскіх налад у дэманстрацыйным рэжыме, увядзіце пароль"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Далей"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Патрабуецца пароль"</string>
diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml
index aa42cce..628234c 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Установена е връзка през „%1$s“"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Мрежата е достъпна през „%1$s“"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Установена е връзка – няма достъп до интернет"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Точката за достъп временно е пълна"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Много бавна"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Бавна"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"ОK"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Средна"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Бърза"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Много бърза"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Изкл."</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Изключва се..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Установява се връзка…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wi-Fi е с две чертички."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wi-Fi е с три чертички."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Сигналът за Wi-Fi е пълен."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Отворена мрежа"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Защитена мрежа"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android (ОС)"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Премахнати приложения"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Премахнати приложения и потребители"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Персонализирано (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Помощ и отзиви"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Меню"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"Средно време по Гринуич (GMT)"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Въведете парола за възст. на фабр. настройки в демонстр. режим"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Напред"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Изисква се парола"</string>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index 62deb12..6c8ff8ce 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s মাধ্যমে সংযুক্ত হয়েছে"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s এর মাধ্যমে উপলব্ধ"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"সংযুক্ত, ইন্টারনেট নেই"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"এই মুহূর্তে অ্যাক্সেস পয়েন্টের কোনও কানেকশন ফাঁকা নেই"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"খুব ধীরে"</string>
<string name="speed_label_slow" msgid="813109590815810235">"ধীরে"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"ঠিক আছে"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"মাঝারি"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"দ্রুত"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"খুব দ্রুত"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"সংযোগ বিচ্ছিন্ন করা হয়েছে"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"সংযোগ বিচ্ছিন্ন হচ্ছে..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"সংযুক্ত হচ্ছে..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"ওয়াই ফাই এ দুইটি দণ্ড৷"</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"ওয়াই ফাই এ তিনটি দণ্ড৷"</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"ওয়াই ফাই এ সম্পূর্ণ সিগন্যাল৷"</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"খোলা নেটওয়ার্ক"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"সুরক্ষিত নেটওয়ার্ক"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"সরানো অ্যাপ্লিকেশানগুলি"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"সরানো অ্যাপ্লিকেশানগুলি এবং ব্যবহারকারীগণ"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"কাস্টম (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"সহায়তা ও মতামত"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"মেনু"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"ডেমো মোডে ফ্যাক্টরি রিসেট করতে পাসওয়ার্ড দিন"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"পরবর্তী"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"পাসওয়ার্ড আবশ্যক"</string>
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index ca187ab..e6d62d3 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Povezani preko %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Dostupan preko %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Povezano. Nema interneta"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Pristupna tačka je privremeno puna"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Veoma sporo"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Sporo"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"UREDU"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Srednja brzina"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Brzo"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Veoma brzo"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Isključen"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Prekidanje veze…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Povezivanje…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wi-Fi dvije crtice."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wi-Fi tri crtice."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Wi-Fi puni signal."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Otvorena mreža"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Sigurna mreža"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Uklonjene aplikacije"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Uklonjene aplikacije i korisnici"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Prilagodi (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Pomoć i povratne informacije"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Meni"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Unesite lozinku da izvršite vraćanje na fabričke postavke u načinu demonstracije"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Naprijed"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Potrebna je lozinka"</string>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index 00bb4a9..75f464d 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Connectada mitjançant %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Disponible mitjançant %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Connectada, sense Internet"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"El punt d\'accés està temporalment ple"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Molt lenta"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Lenta"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Correcta"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Mitjana"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Ràpida"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Molt ràpida"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Desconnectat"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"S\'està desconnectant..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"S\'està connectant…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Senyal Wi-Fi: dues barres."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Senyal Wi-Fi: tres barres."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Senyal Wi-Fi: complet."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Xarxa oberta"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Xarxa segura"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Aplicacions eliminades"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Aplicacions i usuaris eliminats"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Personalitzat (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Ajuda i suggeriments"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menú"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Introdueix la contrasenya per restablir les dades de fàbrica en mode de demostració"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Següent"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Contrasenya obligatòria"</string>
diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml
index 8dd1c32..7af97e1 100644
--- a/packages/SettingsLib/res/values-cs/strings.xml
+++ b/packages/SettingsLib/res/values-cs/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Připojeno prostřednictvím %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Dostupné prostřednictvím %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Připojeno, není k dispozici internet"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Přístupový bod je dočasně zaplněn"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Velmi pomalá"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Pomalá"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Střední"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Rychlá"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Velmi rychlá"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Odpojeno"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Odpojování..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Připojování..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wi-Fi – dvě čárky."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wi-Fi – tři čárky."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Wi-Fi – plný signál."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Nezabezpečená síť"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Zabezpečená síť"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"OS Android"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Odebrané aplikace"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Odebrané aplikace a odebraní uživatelé"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Vlastní (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Nápověda a zpětná vazba"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Nabídka"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Chcete-li v ukázkovém režimu obnovit zařízení do továrního nastavení, zadejte heslo"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Další"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Je třeba zadat heslo"</string>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index 143ad92..948096c 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Tilsluttet via %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Tilgængelig via %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Tilsluttet – intet internet"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Adgangspunktet er midlertidigt fuldt"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Meget langsom"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Langsom"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Middel"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Hurtig"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Meget hurtig"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> – <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Afbrudt"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Afbryder ..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Opretter forbindelse..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wi-Fi har to bjælker."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wi-Fi har tre bjælker."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Wi-Fi har fuldt signal."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Åbent netværk"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Sikkert netværk"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Fjernede apps"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Fjernede apps og brugere"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Tilpasset (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Hjælp og feedback"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Angiv adgangskode for at gendanne fabriksdata i demotilstand"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Næste"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Angiv en adgangskode"</string>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index fda1aa4..40c5e7a 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Über %1$s verbunden"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Verfügbar über %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Verbunden, kein Internet"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Zugangspunkt vorübergehend voll belegt"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Sehr langsam"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Langsam"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Mittel"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Schnell"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Sehr schnell"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> – <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Nicht verbunden"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Verbindung wird getrennt..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Verbindung wird hergestellt..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"WLAN: zwei Balken"</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"WLAN: drei Balken"</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"WLAN: volle Signalstärke"</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Offenes Netzwerk"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Sicheres Netzwerk"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Entfernte Apps"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Entfernte Apps und Nutzer"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Benutzerdefiniert (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Hilfe & Feedback"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menü"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Passwort eingeben, um Gerät im Demomodus auf Werkseinstellungen zurückzusetzen"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Weiter"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Passwort erforderlich"</string>
diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml
index 244af42..13072de 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Συνδέθηκε μέσω %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Διαθέσιμο μέσω %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Συνδέθηκε, χωρίς διαδίκτυο"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Το σημείο πρόσβασης είναι προσωρινά πλήρες"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Πολύ αργή"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Αργή"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"ΟΚ"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Μέτρια"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Γρήγορη"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Πολύ γρήγορη"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Αποσυνδέθηκε"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Αποσύνδεση..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Σύνδεση..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Δύο γραμμές Wi-Fi."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Τρεις γραμμές Wi-Fi."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Άριστο σήμα Wi-Fi."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Ανοικτό δίκτυο"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Ασφαλές δίκτυο"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Λειτουργικό σύστημα Android"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Εφαρμογές που καταργήθηκαν"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Εφαρμογές και χρήστες που έχουν καταργηθεί"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Προσαρμοσμένη (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Βοήθεια και σχόλια"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Μενού"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Εισαγάγετε κωδικό πρόσβασης για επαναφορά εργοστασιακών ρυθμίσεων στη λειτουργία επίδειξης"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Επόμενο"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Απαιτείται κωδικός πρόσβασης"</string>
diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml
index 09ad05c..768dc8d 100644
--- a/packages/SettingsLib/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/res/values-en-rAU/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Connected via %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Available via %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Connected, no Internet"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Access point temporarily full"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Very slow"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Slow"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Medium"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Fast"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Very fast"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Disconnected"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Disconnecting…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Connecting…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wi-Fi two bars."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wi-Fi three bars."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Wi-Fi signal full."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Open network"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Secure network"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Removed apps"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Removed apps and users"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Custom (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Help & feedback"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Enter password to perform factory reset in demo mode"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Next"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Password required"</string>
diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml
index 09ad05c..768dc8d 100644
--- a/packages/SettingsLib/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/res/values-en-rGB/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Connected via %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Available via %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Connected, no Internet"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Access point temporarily full"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Very slow"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Slow"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Medium"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Fast"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Very fast"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Disconnected"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Disconnecting…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Connecting…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wi-Fi two bars."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wi-Fi three bars."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Wi-Fi signal full."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Open network"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Secure network"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Removed apps"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Removed apps and users"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Custom (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Help & feedback"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Enter password to perform factory reset in demo mode"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Next"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Password required"</string>
diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml
index 09ad05c..768dc8d 100644
--- a/packages/SettingsLib/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-en-rIN/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Connected via %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Available via %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Connected, no Internet"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Access point temporarily full"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Very slow"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Slow"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Medium"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Fast"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Very fast"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Disconnected"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Disconnecting…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Connecting…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wi-Fi two bars."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wi-Fi three bars."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Wi-Fi signal full."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Open network"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Secure network"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Removed apps"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Removed apps and users"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Custom (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Help & feedback"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Enter password to perform factory reset in demo mode"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Next"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Password required"</string>
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index 7e21d6c..6f990ae 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Conexión a través de %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Disponible a través de %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Conectado a Wi-Fi, sin conexión a Internet"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"El punto de acceso está completo temporalmente"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Muy lenta"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Lenta"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Aceptar"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Media"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Rápida"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Muy rápida"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Desconectado"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Desconectando…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Conectando…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Dos barras de Wi-Fi"</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Tres barras de Wi-Fi"</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Señal de Wi-Fi excelente"</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Red abierta"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Red segura"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"SO Android"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Aplicaciones eliminadas"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Aplicaciones y usuarios eliminados"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Personalizado (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Ayuda y comentarios"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menú"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Ingresa contraseña y restablece en demo"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Siguiente"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Contraseña obligatoria"</string>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index 4a6f12d..6d60362 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Conectado a través de %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Disponible a través de %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Conexión sin Internet"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Punto de acceso temporalmente lleno"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Muy lenta"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Lenta"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Aceptar"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Media"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Rápida"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Muy rápida"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Desconectado"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Desconectando…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Estableciendo conexión…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Dos barras de Wi-Fi."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Tres barras de Wi-Fi."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Señal de Wi-Fi al máximo."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Red abierta"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Red segura"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"SO Android"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Aplicaciones eliminadas"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Usuarios y aplicaciones eliminados"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Personalizado (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Ayuda y sugerencias"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menú"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Escribe una contraseña para restablecer datos de fábrica en modo demostración"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Siguiente"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Contraseña obligatoria"</string>
diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml
index f3748f8..cee443b 100644
--- a/packages/SettingsLib/res/values-et/strings.xml
+++ b/packages/SettingsLib/res/values-et/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Ühendatud üksuse %1$s kaudu"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Saadaval üksuse %1$s kaudu"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Ühendatud, Interneti-ühendus puudub"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Pääsupunkt on ajutiselt täis"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Väga aeglane"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Aeglane"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Hea"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Keskmine"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Kiire"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Väga kiire"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Ühendus katkestatud"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Ühenduse katkestamine ..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Ühendamine ..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"WiFi: kaks pulka."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"WiFi: kolm pulka."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"WiFi-signaal on tugev."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Avatud võrk"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Turvaline võrk"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Eemaldatud rakendused"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Eemaldatud rakendused ja kasutajad"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Kohandatud (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Abi ja tagasiside"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menüü"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Sisestage parool, et demorežiimis tehaseseadetele lähtestada"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Järgmine"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Parool on kohustuslik"</string>
diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml
index 9fd8ad8..d0aa89f 100644
--- a/packages/SettingsLib/res/values-eu/strings.xml
+++ b/packages/SettingsLib/res/values-eu/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s bidez konektatuta"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s bidez erabilgarri"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Konektatuta, ez dago Interneteko konexiorik"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Sarbide-puntua beteta dago aldi baterako"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Oso motela"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Motela"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Ados"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Tartekoa"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Bizkorra"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Oso bizkorra"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Deskonektatuta"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Deskonektatzen…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Konektatzen…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wi-Fi sarearen bi barra."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wi-Fi sarearen hiru barra."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Wi-Fi sarearen seinalea osoa."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Sare irekia"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Sare segurua"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android sistema eragilea"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Kendutako aplikazioak"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Kendutako aplikazioak eta erabiltzaileak"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Pertsonalizatua (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Laguntza eta iritziak"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menua"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Idatzi pasahitza jatorrizko ezarpenak demo moduan berrezartzeko"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Hurrengoa"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Pasahitza behar da"</string>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index 0430592..266b8ce 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"متصل از طریق %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"در دسترس از طریق %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"متصل، بدون اینترنت"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ظرفیت نقطه دسترسی موقتاً تکمیل شده است"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"بسیار آهسته"</string>
<string name="speed_label_slow" msgid="813109590815810235">"آهسته"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"تأیید"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"متوسط"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"سریع"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"خیلی سریع"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"اتصال قطع شد"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"در حال قطع اتصال..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"در حال اتصال…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"دو نوار برای Wi‑Fi."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"سه نوار برای Wi‑Fi."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"قدرت سیگنال Wi‑Fi کامل است."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"شبکه باز"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"شبکه ایمن"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"سیستم عامل Android"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"برنامههای حذف شده"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"برنامهها و کاربران حذف شده"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"سفارشی (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"راهنما و بازخورد"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"منو"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"برای انجام بازنشانی کارخانهای در حالت نمایشی، گذرواژه را وارد کنید"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"بعدی"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"وارد کردن گذرواژه الزامی است"</string>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index e3a92e6..185f56a 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Yhdistetty seuraavan kautta: %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Käytettävissä seuraavan kautta: %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Yhdistetty, ei internetyhteyttä."</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Yhteyspiste tilapäisesti täynnä"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Hyvin hidas"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Hidas"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Kohtuullinen"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Nopea"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Hyvin nopea"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Yhteys katkaistu"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Katkaistaan yhteyttä..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Yhdistetään…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wi-Fi-signaali – kaksi palkkia"</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wi-Fi-signaali – kolme palkkia"</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Vahva Wi-Fi-signaali"</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Avoin verkko"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Suojattu verkko"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android-käyttöjärjestelmä"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Poistetut sovellukset"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Poistetut sovellukset ja käyttäjät"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Muokattu (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Ohje ja palaute"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Valikko"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Palauta tehdasasetukset antamalla salasana"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Seuraava"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Salasana vaaditaan"</string>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index 99692a6..8dc8ead 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Connecté par %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Accessible par %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Connecté, aucun accès à Internet"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Le point d\'accès est temporairement plein"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Très lente"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Lente"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Moyenne"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Élevée"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Très rapide"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> : <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Déconnecté"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Déconnexion…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Connexion en cours…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wi-Fi : deux barres."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wi-Fi : trois barres."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Wi-Fi : signal complet."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Réseau ouvert"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Réseau sécurisé"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Système d\'exploitation Android"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Applications supprimées"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Applications et utilisateurs supprimés"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Personnalisée (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Aide et commentaires"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Entrez m. passe pour réinit. en mode démo"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Suivant"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Mot de passe obligatoire"</string>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index 2593c16..7fdc716 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Connecté via %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Disponible via %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Connecté, aucun accès à Internet"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Point d\'accès temporairement plein"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Très lente"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Lente"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Correct"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Moyenne"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Élevée"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Très élevée"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Déconnecté"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Déconnexion…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Connexion…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Signal Wi-Fi moyen"</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Signal Wi-Fi bon"</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Signal Wi-Fi excellent"</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Réseau ouvert"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Réseau sécurisé"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Plate-forme Android"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Applications supprimées"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Applications et utilisateurs supprimés"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Personnalisé (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Aide et commentaires"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Saisir mot de passe pour rétablir conf. d\'usine en mode démo."</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Suivant"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Veuillez saisir le mot de passe"</string>
diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml
index fe91f40..3ae0d6f 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Conectado a través de %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Dispoñible a través de %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Conectado, pero sen Internet"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"O punto de acceso está temporalmente cheo"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Moi lenta"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Lenta"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Aceptar"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Media"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Rápida"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Moi rápida"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Desconectado"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Desconectando..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Conectando..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Dúas barras de wifi."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Tres barras de wifi."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Sinal completo de wifi."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Rede aberta"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Rede segura"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"SO Android"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Aplicacións eliminadas"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Aplicacións e usuarios eliminados"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Personalizado (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Axuda e comentarios"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menú"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Insire contrasinal para restablec. en demostración"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Seguinte"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"O contrasinal é obrigatorio"</string>
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index 674d4c9..9d6c1e8 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s દ્વારા કનેક્ટ થયેલ"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s દ્વારા ઉપલબ્ધ"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"કનેક્ટ કર્યું, કોઈ ઇન્ટરનેટ નથી"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ઍક્સેસ પૉઇન્ટ અસ્થાયીરૂપે ભરાયેલ છે"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"ખૂબ જ ધીમી"</string>
<string name="speed_label_slow" msgid="813109590815810235">"ધીમી"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"ઓકે"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"મધ્યમ"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"ઝડપી"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"ખૂબ ઝડપી"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"ડિસ્કનેક્ટ કર્યું"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"ડિસ્કનેક્ટ થઈ રહ્યું છે..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"કનેક્ટ થઈ રહ્યું છે…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wifi બે બાર."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wifi ત્રણ બાર."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"પૂર્ણ Wifi સિગ્નલ."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"નેટવર્ક ખોલો"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"સુરક્ષિત નેટવર્ક"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"દૂર કરેલી ઍપ્લિકેશનો"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"દૂર કરેલી ઍપ્લિકેશનો અને વપરાશકર્તાઓ"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"કસ્ટમ (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"સહાય અને પ્રતિસાદ"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"મેનુ"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"ડેમો મોડમાં ફેક્ટરી રીસેટ પાસવર્ડ દાખલ કરો"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"આગલું"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"પાસવર્ડ આવશ્યક છે"</string>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index 12564b5..704a312 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s के द्वारा उपलब्ध"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s के द्वारा उपलब्ध"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"कनेक्ट किया गया, इंटरनेट नहीं"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"एक्सेस पॉइंट फ़िलहाल भरा हुआ है"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"अत्यधिक धीमी"</string>
<string name="speed_label_slow" msgid="813109590815810235">"धीमी"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"ठीक"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"मध्यम"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"तेज़"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"अत्यधिक तेज़"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"डिस्कनेक्ट किया गया"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"डिस्कनेक्ट हो रहा है..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"कनेक्ट हो रहा है..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"वाई-फ़ाई की दो पट्टी मिल रही हैं."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"वाई-फ़ाई की एक पट्टी मिल रही है."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"पूरे वाई-फ़ाई सिग्नल मिल रहे हैं."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"खुला नेटवर्क"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"सुरक्षित नेटवर्क"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"निकाले गए ऐप्स"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"ऐप्स और उपयोगकर्ताओं को निकालें"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"कस्टम (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"सहायता और फ़ीडबैक"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"मेनू"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"डेमो मोड में फ़ैक्टरी रीसेट के लिए पासवर्ड डालें"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"आगे"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"पासवर्ड आवश्यक"</string>
diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml
index 8ba4034..123d996 100644
--- a/packages/SettingsLib/res/values-hr/strings.xml
+++ b/packages/SettingsLib/res/values-hr/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Povezano putem %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Dostupno putem %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Povezano, bez interneta"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Pristupna je točka privremeno puna"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Vrlo sporo"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Sporo"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"U redu"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Srednje"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Brzo"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Vrlo brzo"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Niste povezani"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Isključivanje…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Povezivanje…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wi-Fi signal ima dva stupca."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wi-Fi signal ima tri stupca."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Wi-Fi signal je pun."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Otvorena mreža"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Sigurna mreža"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Uklonjene aplikacije"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Uklonjene aplikacije i korisnici"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Prilagođeno (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Pomoć i povratne informacije"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Izbornik"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Unesite zaporku za resetiranje u demo načinu"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Dalje"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Potrebna je zaporka"</string>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index a544125..ff700d9 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Csatlakozva a következőn keresztül: %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Elérhető a következőn keresztül: %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Csatlakozva, nincs internetelérés"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"A hozzáférési pont átmenetileg megtelt"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Nagyon lassú"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Lassú"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Rendben"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Közepes"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Gyors"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Nagyon gyors"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Szétkapcsolva"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Szétkapcsolás..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Csatlakozás…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wi-Fi-jel: két sáv."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wi-Fi-jel: három sáv."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Wi-Fi-jel: teljes."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Nyílt hálózat"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Biztonságos hálózat"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Eltávolított alkalmazások"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Eltávolított alkalmazások és felhasználók"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Egyéni (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Súgó és visszajelzés"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menü"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Írja be a jelszót a visszaállításhoz"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Következő"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Jelszó szükséges"</string>
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index cb04234..63fe5ab 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Կապակցված է %1$s-ի միջոցով"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Հասանելի է %1$s-ի միջոցով"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Կապակցված է առանց համացանցի"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Հասանելիության կետը ժամանակավորապես լիքն է"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Շատ դանդաղ"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Դանդաղ"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Հաստատել"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Միջին"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Արագ"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Շատ արագ"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Անջատված է"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Անջատվում է..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Միանում է..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wi-Fi-ի ուժգնությունը՝ երկու գիծ:"</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wi-Fi-ի ուժգնությունը՝ երեք գիծ:"</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Wi-Fi-ի ազդանշանը ուժեղ է:"</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Բաց ցանց"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Անվտանգ ցանց"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Հեռացված ծրագրեր"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Հեռացված հավելվածներն ու օգտատերերը"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Հատուկ (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Օգնություն և հետադարձ կապ"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Ընտրացանկ"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Մուտքագրեք գաղտնաբառը՝ ցուցադրական ռեժիմում գործարանային վերակայում կատարելու համար"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Հաջորդը"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Պահանջվում է գաղտնաբառ"</string>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index a8dd4c2..267bbf9 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Terhubung melalui %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Tersedia melalui %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Tersambung, tidak ada internet"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Titik akses penuh untuk sementara"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Sangat Lambat"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Lambat"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Oke"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Sedang"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Cepat"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Sangat Cepat"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Sambungan terputus"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Memutus sambungan..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Menyambung…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wi-Fi dua baris"</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wi-Fi tiga baris."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Sinyal Wi-Fi penuh."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Jaringan terbuka"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Jaringan aman"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"OS Android"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Aplikasi dihapus"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Aplikasi dan pengguna yang dihapus"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"(<xliff:g id="DENSITYDPI">%d</xliff:g>) khusus"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Bantuan & masukan"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Masukkan sandi untuk mengembalikan ke setelan pabrik dalam mode demo"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Berikutnya"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Perlu sandi"</string>
diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml
index 7f541ce..ae5f727 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Tengt í gegnum %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Í boði í gegnum %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Tengt, enginn internetaðgangur"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Aðgangsstaður tímabundið fullur"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Mjög hægt"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Hægt"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Í lagi"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Miðlungshratt"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Hratt"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Mjög hratt"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Aftengt"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Aftengist…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Tengist…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wi-Fi: Tvö strik."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wi-Fi: Þrjú strik."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Fullur Wi-Fi sendistyrkur."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Opið net"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Öruggt net"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android stýrikerfið"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Fjarlægð forrit"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Fjarlægð forrit og notendur"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Sérsniðið (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Hjálp og ábendingar"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Valmynd"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Sláðu inn aðgangsorð til að framkvæma núllstillingu í sýnisútgáfu"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Áfram"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Aðgangsorðs krafist"</string>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index 5598d87..4a2d3cb 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Collegato tramite %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Disponibile tramite %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Connesso senza Internet"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Punto di accesso momentaneamente al completo"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Molto lenta"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Lenta"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Media"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Veloce"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Molto veloce"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Disconnesso"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Disconnessione..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Connessione..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wi-Fi: due barre."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wi-Fi: tre barre."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Segnale Wi-Fi completo."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Rete aperta"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Rete protetta"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Sistema operativo Android"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Applicazioni rimosse"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"App e utenti rimossi"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Personalizzato (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Guida e feedback"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Inserisci la password per eseguire il ripristino dei dati di fabbrica in modalità demo"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Avanti"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Password obbligatoria"</string>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index 26ce32e..7f6f8f5 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"מחובר דרך %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"זמינה דרך %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"מחובר. אין אינטרנט"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"נקודת הגישה מלאה באופן זמני"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"איטית מאוד"</string>
<string name="speed_label_slow" msgid="813109590815810235">"איטית"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"אישור"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"בינונית"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"מהירה"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"מהירה מאוד"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"מנותק"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"מתנתק..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"מתחבר ..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"שני פסים של Wi-Fi."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"שלושה פסים של Wi-Fi."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"אות Wi-Fi מלא."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"רשת פתוחה"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"רשת מאובטחת"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"אפליקציות שהוסרו"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"אפליקציות ומשתמשים שהוסרו"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"מותאם אישית (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"עזרה ומשוב"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"תפריט"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"הזן סיסמה כדי לבצע איפוס להגדרות היצרן במצב הדגמה"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"הבא"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"דרושה סיסמה"</string>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index 30c7267..feb80e9 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s経由で接続"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s経由で使用可能"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"接続済み、インターネットは利用できません"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"アクセス ポイントが一時的にいっぱいです"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"とても遅い"</string>
<string name="speed_label_slow" msgid="813109590815810235">"遅い"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"普通"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"速い"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"とても速い"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"切断"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"切断中..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"接続中..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wi-Fiはレベル2です。"</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wi-Fiはレベル3です。"</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Wi-Fiの電波はフルです。"</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"オープンネットワーク"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"保護されたネットワーク"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"削除したアプリケーション"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"削除されたアプリとユーザー"</string>
@@ -377,7 +381,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"カスタム(<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"ヘルプとフィードバック"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"メニュー"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"デモモードで初期状態にリセットするには、パスワードを入力してください"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"次へ"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"パスワード必須"</string>
diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml
index 553c4a0..4d12fa7 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s-ით დაკავშირებული"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"ხელმისაწვდომია %1$s-ით"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"დაკავშირებულია, ინტერნეტის გარეშე"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"წვდომის წერტილი დროებით გადატვირთულია"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"ძალიან ნელი"</string>
<string name="speed_label_slow" msgid="813109590815810235">"ნელი"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"კარგი"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"საშუალო"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"სწრაფი"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"ძალიან სწრაფი"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"კავშირი გაწყვეტილია"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"მიმდინარეობს გათიშვა…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"მიმდინარეობს დაკავშირება…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"WiFi სიგნალი ორ ზოლზეა."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"WiFi სიგნალი სამ ზოლზეა."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"WiFi სიგნალი სრულია."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"ღია ქსელი"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"დაცული ქსელი"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"აპების წაშლა"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"წაშლილი აპები და მომხმარებლები"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"მორგებული (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"დახმარება და გამოხმაურება"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"მენიუ"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"შეიყვანეთ პაროლი დემო-რეჟიმში ქარხნულ მდგომარეობაზე დასაბრუნებლად"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"შემდეგი"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"საჭიროა პაროლი"</string>
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index 27622a1..0c7b4ac 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s арқылы қосылған"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s арқылы қолжетімді"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Қосылған, интернет жоқ"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Кіру нүктесі уақытша бос емес"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Өте баяу"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Баяу"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Жарайды"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Орташа"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Жылдам"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Өте жылдам"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Ажыратылған"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Ажыратылуда…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Жалғауда..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wi-Fi сигналы — екі жолақ."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wi-Fi сигналы — үш жолақ."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Wi-Fi сигналы толық."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Ашық желі"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Қауіпсіз желі"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android операциялық жүйесі"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Алынған қолданбалар"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Алынған қолданбалар және пайдаланушылар"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Арнаулы (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Анықтама және пікір"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Mәзір"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Демо режимде зауыттық мәндерге қайтару үшін құпия сөзді енгізу"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Келесі"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Құпия сөз қажет"</string>
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index 5f614f6..755859c 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"បានភ្ជាប់តាមរយៈ %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"មានតាមរយៈ %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"បានភ្ជាប់ ប៉ុន្តែគ្មានអ៊ីនធឺណិតទេ"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ចំណុចចូលប្រើពេញជាបណ្តោះអាសន្ន"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"យឺតណាស់"</string>
<string name="speed_label_slow" msgid="813109590815810235">"យឺត"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"យល់ព្រម"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"មធ្យម"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"លឿន"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"លឿនណាស់"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"បានផ្ដាច់"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"កំពុងផ្ដាច់…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"កំពុងតភ្ជាប់…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wifi ពីរកាំ"</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wifi បីកាំ"</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"សេវា Wifi ពេញ"</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"បើកបណ្ដាញ"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"បណ្តាញដែលមានសុវត្ថិភាព"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"ប្រព័ន្ធប្រតិបត្តិការ Android"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"កម្មវិធីដែលបានលុប"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"បានលុបកម្មវិធី និងអ្នកប្រើ"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"ផ្ទាល់ខ្លួន (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"ជំនួយ និងមតិស្ថាបនា"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"ម៉ឺនុយ"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"បញ្ចូលពាក្យសម្ងាត់ ដើម្បីកំណត់ឧបករណ៍ឡើងវិញដូចពេលចេញពីរោងចក្រ នៅក្នុងមុខងារសាកល្បង"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"បន្ទាប់"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"តម្រូវឲ្យមានពាក្យសម្ងាត់"</string>
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index c74b7be..939e2a9 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s ಮೂಲಕ ಸಂಪರ್ಕಗೊಂಡಿದೆ"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s ಮೂಲಕ ಲಭ್ಯವಿದೆ"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ, ಇಂಟರ್ನೆಟ್ ಇಲ್ಲ"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ಪ್ರವೇಶ ಕೇಂದ್ರ ತಾತ್ಕಾಲಿಕವಾಗಿ ಭರ್ತಿಯಾಗಿದೆ"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"ತುಂಬಾ ನಿಧಾನವಾಗಿದೆ"</string>
<string name="speed_label_slow" msgid="813109590815810235">"ನಿಧಾನ"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"ಸರಿ"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"ಮಧ್ಯಮ"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"ವೇಗ"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"ತುಂಬಾ ವೇಗವಾಗಿದೆ"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲಾಗಿದೆ"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲಾಗುತ್ತಿದೆ..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"ಸಂಪರ್ಕಗೊಳಿಸಲಾಗುತ್ತಿದೆ..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"ವೈಫೈ ಎರಡು ಪಟ್ಟಿಗಳು."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"ವೈಫೈ ಮೂರು ಪಟ್ಟಿಗಳು."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"ವೈಫೈ ಸಿಗ್ನಲ್ ಪೂರ್ತಿ ಇದೆ."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"ನೆಟ್ವರ್ಕ್ ತೆರೆಯಿರಿ"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"ಸುರಕ್ಷಿತ ನೆಟ್ವರ್ಕ್"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"ತೆಗೆದುಹಾಕಲಾದ ಅಪ್ಲಿಕೇಶನ್ಗಳು"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"ಅಪ್ಲಿಕೇಶನ್ಗಳು ಮತ್ತು ಬಳಕೆದಾರರನ್ನು ತೆಗೆದುಹಾಕಲಾಗಿದೆ"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"ಕಸ್ಟಮ್ (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"ಸಹಾಯ ಮತ್ತು ಪ್ರತಿಕ್ರಿಯೆ"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"ಮೆನು"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"ಫ್ಯಾಕ್ಟರಿ ರಿಸೆಟ್ಗೆ ಪಾಸ್ವರ್ಡ್ ನಮೂದಿಸಿ"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"ಮುಂದೆ"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"ಪಾಸ್ವರ್ಡ್ ಅಗತ್ಯವಿದೆ"</string>
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index b7cf515..972fef1 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s을(를) 통해 연결됨"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s을(를) 통해 사용 가능"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"인터넷을 사용하지 않고 연결됨"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"액세스 포인트가 일시적으로 가득 참"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"매우 느림"</string>
<string name="speed_label_slow" msgid="813109590815810235">"느림"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"확인"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"보통"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"빠름"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"매우 빠름"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"연결 끊김"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"연결을 끊는 중…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"연결 중…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wi-Fi 신호 막대가 두 개입니다."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wi-Fi 신호 막대가 세 개입니다."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Wi-Fi 신호가 강합니다."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"개방형 네트워크"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"보안 네트워크"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"삭제된 앱"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"삭제된 앱 및 사용자"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"맞춤(<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"고객센터"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"메뉴"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"데모 모드에서 초기화하려면 비밀번호 입력"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"다음"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"비밀번호 입력 필요"</string>
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index 1fb4b48..cff25dd 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s аркылуу жеткиликтүү"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s аркылуу жеткиликтүү"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Туташып турат, Интернет жок"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Туташуу түйүнү убактылуу толуп калды"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Өтө жай"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Жай"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Жарайт"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Орто"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Ылдам"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Абдан ылдам"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Ажыратылган"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Ажыратылууда…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Туташууда…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wifi: эки таякча."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wifi: үч таякча."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Wifi: күчтүү сигнал."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Ачык тармак"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Коопсуз тармак"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Алынып салынган колдонмолор"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Өчүрүлгөн колдонмолор жана колдонуучулар"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Ыңгайлаштырылган (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Жардам жана пикир билдирүү"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Меню"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Демо режиминде демейки жөндөөлөргө кайтаруу үчүн сырсөздү киргизиңиз"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Кийинки"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Сырсөз талап кылынат"</string>
diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml
index 88bdc41..2460154 100644
--- a/packages/SettingsLib/res/values-lo/strings.xml
+++ b/packages/SettingsLib/res/values-lo/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"ເຊື່ອມຕໍ່ຜ່ານ %1$s ແລ້ວ"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"ມີໃຫ້ຜ່ານ %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"ເຊື່ອມຕໍ່ແລ້ວ, ບໍ່ມີອິນເຕີເນັດ"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ຈຸດການເຂົ້າເຖິງເຕັມຊົ່ວຄາວ"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"ຊ້າຫຼາຍ"</string>
<string name="speed_label_slow" msgid="813109590815810235">"ຊ້າ"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"ຕົກລົງ"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"ປານກາງ"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"ໄວ"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"ໄວຫຼາຍ"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"ຕັດການເຊື່ອມຕໍ່ແລ້ວ"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"ກຳລັງຢຸດການເຊື່ອມຕໍ່..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"ກຳລັງເຊື່ອມຕໍ່..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"ສັນຍານ Wi-Fi ສອງຂີດ."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wifi ສາມຂີດ."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"ສັນຍານ Wi-Fi ເຕັມ"</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"ເຄືອຂ່າຍເປີດ"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"ເຄືອຂ່າຍເຂົ້າລະຫັດ"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"ແອັບຯທີ່ຖືກລຶບອອກແລ້ວ"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"ລຶບແອັບຯ ແລະຜູ່ໃຊ້ແລ້ວ"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"ປັບແຕ່ງເອງ (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"ຊ່ວຍເຫຼືອ & ຄຳຕິຊົມ"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"ເມນູ"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Enter password to perform factory reset in demo mode"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"ຕໍ່ໄປ"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"ຕ້ອງໃສ່ລະຫັດຜ່ານ"</string>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index 8ca0d36..c5a035f 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Prisijungta naudojant „%1$s“"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Pasiekiama naudojant „%1$s“"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Prisijungta, nėra interneto"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Prieigos taškas laikinai visiškai užimtas"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Labai lėtas"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Lėtas"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Gerai"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Vidutinis"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Greitas"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Labai greitas"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Atsijungęs (-usi)"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Atjungiama..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Prisijungiama..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Dvi „Wi-Fi“ signalo juostos."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Trys „Wi-Fi“ signalo juostos."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Stiprus „Wi-Fi“ signalas."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Atviras tinklas"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Saugus tinklas"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"„Android“ OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Pašalintos programos"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Pašalintos programos ir naudotojai"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Tinkintas (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Pagalba ir atsiliepimai"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Meniu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Įv. slapt. ir atk. gam. nust. dem. rež."</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Kitas"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Būtina nurodyti slaptažodį"</string>
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index 518eb33..89cc958 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Savienots, izmantojot %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Pieejams, izmantojot %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Savienots, nav piekļuves internetam"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Piekļuves punkts īslaicīgi ir pilns"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Ļoti lēns"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Lēns"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Labi"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Vidējs"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Ātrs"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Ļoti ātrs"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Atvienots"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Notiek atvienošana..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Notiek savienojuma izveide…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wi-Fi: divas joslas"</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wi-Fi: trīs joslas"</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Pilna piekļuve Wi-Fi signālam"</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Atvērts tīkls"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Drošs tīkls"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Noņemtās lietotnes"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Noņemtās lietotnes un lietotāji"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Pielāgots (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Palīdzība un atsauksmes"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Izvēlne"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Iev. paroli, lai atiest. rūpnīcas iest. dem. režīmā"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Tālāk"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Nepieciešama parole"</string>
diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index 3f7ab8c..6bd9c5f 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Поврзано преку %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Достапно преку %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Поврзана, нема интернет"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Пристапната точка привремено е преоптоварена"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Многу бавна"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Бавна"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Во ред"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Средна"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Брза"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Многу брза"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Исклучено"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Се исклучува..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Се поврзува..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Две црти на Wi-Fi."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Три црти на Wi-Fi."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Полн сигнал на Wi-Fi."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Отворена мрежа"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Заклучена мрежа"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Оперативен систем Android"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Отстранети апликации"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Отстранети апликации и корисници"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Приспособен (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Помош и повратни информации"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Мени"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Внесете лозинка за фаб. ресет. во демо"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Следно"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Потребна е лозинка"</string>
diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml
index 635d8a4..5e0c25c 100644
--- a/packages/SettingsLib/res/values-ml/strings.xml
+++ b/packages/SettingsLib/res/values-ml/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s വഴി ബന്ധിപ്പിച്ചു"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s വഴി ലഭ്യം"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"കണക്റ്റുചെയ്തിരിക്കുന്നു, ഇന്റർനെറ്റില്ല"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ആക്സസ് പോയിന്റ് താൽക്കാലികമായി നിറഞ്ഞിരിക്കുന്നു"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"വളരെ കുറഞ്ഞ വേഗത്തിൽ"</string>
<string name="speed_label_slow" msgid="813109590815810235">"കുറഞ്ഞ വേഗത്തിൽ"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"ശരി"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"ഇടത്തരം"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"വേഗത്തിൽ"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"വളരെ വേഗത്തിൽ"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"വിച്ഛേദിച്ചു"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"വിച്ഛേദിക്കുന്നു..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"കണക്റ്റുചെയ്യുന്നു..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"വൈഫൈ സിഗ്നൽ രണ്ട് ബാറുകൾ."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"വൈഫൈ സിഗ്നൽ മൂന്ന് ബാറുകൾ."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"വൈഫൈ മികച്ച സിഗ്നൽ."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"ഓപ്പൺ നെറ്റ്വര്ക്ക്"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"സുരക്ഷിത നെറ്റ്വര്ക്ക്"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"നീക്കംചെയ്ത അപ്ലിക്കേഷനുകൾ"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"നീക്കംചെയ്ത അപ്ലിക്കേഷനുകളും ഉപയോക്താക്കളും"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"ഇഷ്ടാനുസൃതം ( <xliff:g id="DENSITYDPI">%d</xliff:g> )"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"സഹായവും പ്രതികരണവും"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"മെനു"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"ഡെമോ മോഡിൽ ഫാക്ടറി റീസെറ്റിന് പാസ്വേഡ് നൽകുക"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"അടുത്തത്"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"പാസ്വേഡ് ആവശ്യമാണ്"</string>
diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index 1e864da..f0020fe 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s-р холбогдсон"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s-р боломжтой"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Холбогдсон, интернэт байхгүй байна"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Хандах цэг түр хугацаанд дүүрсэн байна"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Маш удаан"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Удаан"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"ЗА"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Дунд"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Хурдан"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Маш хурдан"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Салгагдсан"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Салгаж байна…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Холбогдож байна..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wifi сүлжээний дохио хоёр баганатай байна."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wifi сүлжээний дохио гурван баганатай байна."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Wifi-н дохио дүүрэн байна."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Нээлттэй сүлжээ"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Аюулгүй сүлжээ"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Андройд OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Арилгасан апп-ууд"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Арилгасан апп-ууд болон хэрэглэгчид"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Тогтмол утга (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Тусламж, санал хүсэлт"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Цэс"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"Гринвичийн цаг"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Үйлдвэрийн тохиргоог демо горимд ажиллуулахын тулд нууц үг оруулна уу"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Дараагийн"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Нууц үг шаардлагатай"</string>
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index 0d5f90b..c056d8e 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s द्वारे कनेक्ट केले"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s द्वारे उपलब्ध"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"कनेक्ट केले, इंटरनेट नाही"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"अॅक्सेस पॉइंट तात्पुरते भरलेले"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"खूप हळू"</string>
<string name="speed_label_slow" msgid="813109590815810235">"हळू"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"ठीक आहे"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"मध्यम"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"जलद"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"खूप जलद"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"डिस्कनेक्ट केले"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"डिस्कनेक्ट करत आहे..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"कनेक्ट करीत आहे..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"वाय फाय दोन बार."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"वाय फाय तीन बार."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"वाय फाय सिग्नल संपूर्ण आहे."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"नेटवर्क उघडा"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"सुरक्षित नेटवर्क"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"काढलेले अॅप्स"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"काढलेले अॅप्स आणि वापरकर्ते"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"सानुकूल करा (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"मदत आणि अभिप्राय"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"मेनू"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"डेमो मोडमध्ये फॅक्टरी रीसेट करण्यासाठी संकेतशब्द प्रविष्ट करा"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"पुढील"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"संकेतशब्द आवश्यक"</string>
diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml
index caa07f9..a8424ff 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Disambungkan melalui %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Tersedia melalui %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Disambungkan, tiada Internet"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Titik akses penuh buat sementara waktu"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Sangat Perlahan"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Perlahan"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Sederhana"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Laju"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Sangat Laju"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Diputuskan sambungan"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Memutuskan sambungan..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Menyambung..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wi-Fi dua bar."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wi-Fi tiga bar."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Isyarat Wi-Fi penuh."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Rangkaian terbuka"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Rangkaian selamat"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"OS Android"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Apl dialih keluar"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Apl dan pengguna yang dialih keluar"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Tersuai (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Bantuan & maklum balas"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Mskkn kta laluan utk ttpn sml kilang dlm mod demo"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Seterusnya"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Kata laluan diperlukan"</string>
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index e1f0085..40cd3e9 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s မှတစ်ဆင့် ချိတ်ဆက်ထားသည်"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s မှတစ်ဆင့်ရနိုင်သည်"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"ချိတ်ဆက်ထားသည်၊ အင်တာနက်မရှိ"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ကွန်ရက်ချိတ်ဆက်မှု ယာယီပြည့်နေသည်"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"အလွန်နှေး"</string>
<string name="speed_label_slow" msgid="813109590815810235">"နှေး"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"အတော်အသင့်"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"မြန်"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"အလွန်မြန်"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"ချိတ်ဆက်မှုပြတ်တောက်သည်"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"အဆက်အသွယ်ဖြတ်တောက်သည်"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"ချိတ်ဆက်နေသည်"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wi-Fi ၂ ဘား"</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wi-Fi ၃ ဘား"</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Wi-Fi အပြည့်ရှိ"</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"အများသုံး ကွန်ရက်"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"လုံခြုံသည့် ကွန်ရက်"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android စနစ်"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"ဖယ်ရှားထားသော အက်ပ်များ"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"ဖယ်ရှားထားသော အပလီကေးရှင်းနှင့် သုံးစွဲသူများ"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"စိတ်ကြိုက် (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"အကူအညီနှင့် အကြံပြုချက်"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"မီနူး"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"ဂရင်းနစ်စံတော်ချိန်"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"ဒီမိုမုဒ်၌မူလဆက်တင်ထားရန် စကားဝှက်ထည့်ပါ"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"ရှေ့သို့"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"စကားဝှက် လိုအပ်သည်"</string>
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index 004fcf1e..b125a9c 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Tilkoblet via %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Tilgjengelig via %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Tilkoblet – ingen Internett-forbindelse"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Tilgangspunktet er midlertidig fullt"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Veldig treg"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Treg"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Ok"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Middels"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Rask"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Veldig rask"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Frakoblet"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Kobler fra…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Kobler til…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wi-Fi-signal med to stolper."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wi-Fi-signal med tre stolper."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Wi-Fi-signalet er ved full styrke."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Åpent nettverk"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Sikkert nettverk"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android-operativsystem"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Fjernede apper"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Fjernede apper og brukere"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Egendefinert (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Hjelp og tilbakemelding"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Meny"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Skriv inn passordet for å tilbakestille til fabrikkstandard i demomodus"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Neste"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Passord er obligatorisk"</string>
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index eac1e24..2870d2e 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s मार्फत जडित"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s मार्फत उपलब्ध"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"जडित, इन्टरनेट चलेको छैन"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"पहुँचसम्बन्धी स्थान अस्थायी रूपमा भरिएको छ"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"धेरै ढिलो"</string>
<string name="speed_label_slow" msgid="813109590815810235">"बिस्तारै"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"ठीक छ"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"मध्यम"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"छिटो"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"धेरै छिटो"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"विच्छेदन गरियो"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"जडान हटाइँदै ..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"जडान हुँदै..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wi-Fi दुई पट्टि।"</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wi-Fi तीन बारहरू।"</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"पूर्ण Wi-Fi सिंग्नल।"</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"खुला नेटवर्क"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"सुरक्षित नेटवर्क"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"एन्ड्रोइड OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"हटाइएका अनुप्रयोगहरू"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"अनुप्रयोगहरू र प्रयोगकर्ताहरू हटाइयो।"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"आफू अनुकूल (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"मद्दत र प्रतिक्रिया"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"मेनु"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"डेमो मोडमा फ्याक्ट्री रिसेट गर्न पासवर्ड प्रविष्ट गर्नुहोस्"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"अर्को"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"पासवर्ड आवश्यक छ"</string>
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index 9ca3bfd..b021680 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Verbonden via %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Beschikbaar via %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Verbonden, geen internet"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Toegangspunt tijdelijk vol"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Zeer langzaam"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Langzaam"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Redelijk"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Gemiddeld"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Snel"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Zeer snel"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Verbinding verbroken"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Verbinding verbreken..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Verbinding maken..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wifi: twee streepjes."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wifi: drie streepjes."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Wifii-signaal is op volledige sterkte."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Open netwerk"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Beveiligd netwerk"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android-besturingssysteem"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Verwijderde apps"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Verwijderde apps en gebruikers"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Aangepast (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Help en feedback"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Geef wachtwoord op om terug te zetten op fabrieksinstellingen in demomodus"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Volgende"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Wachtwoord vereist"</string>
diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml
index 084b9ed..e1c1a4a 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s ਰਾਹੀਂ ਕਨੈਕਟ ਕੀਤਾ"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s ਰਾਹੀਂ ਉਪਲਬਧ"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"ਕਨੈਕਟ ਕੀਤਾ, ਕੋਈ ਇੰਟਰਨੈਟ ਨਹੀਂ"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ਪਹੁੰਚ ਪੁਆਇੰਟ ਅਸਥਾਈ ਤੌਰ \'ਤੇ ਸੰਪੂਰਨ ਰੁਝੇਂਵੇਂ ਵਿੱਚ ਹੈ"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"ਬਹੁਤ ਹੌਲੀ"</string>
<string name="speed_label_slow" msgid="813109590815810235">"ਹੌਲੀ"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"ਠੀਕ ਹੈ"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"ਔਸਤ"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"ਤੇਜ਼"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"ਬਹੁਤ ਤੇਜ਼"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"ਡਿਸਕਨੈਕਟ ਕੀਤਾ"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"ਡਿਸਕਨੈਕਟ ਕਰ ਰਿਹਾ ਹੈ..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"ਕਨੈਕਟ ਕਰ ਰਿਹਾ ਹੈ…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wifi ਦੋ ਬਾਰ।"</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wifi ਤਿੰਨ ਬਾਰ।"</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Wifi ਸਿਗਨਲ ਪੂਰਾ।"</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"ਖੁੱਲ੍ਹਾ ਨੈੱਟਵਰਕ"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"ਸੁਰੱਖਿਅਤ ਨੈੱਟਵਰਕ"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"ਹਟਾਏ ਗਏ ਐਪਸ"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"ਹਟਾਏ ਗਏ ਐਪਸ ਅਤੇ ਉਪਭੋਗਤਾ"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤਬੱਧ (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"ਮਦਦ ਅਤੇ ਪ੍ਰਤੀਕਰਮ"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"ਮੀਨੂ"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"ਡੈਮੋ ਮੋਡ \'ਚ ਫੈਕਟਰੀ ਰੀਸੈੱਟ ਲਈ ਪਾਸਵਰਡ ਦਿਓ"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"ਅੱਗੇ"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"ਪਾਸਵਰਡ ਦੀ ਲੋੜ ਹੈ"</string>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index 58454b4..e4c74503 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Połączono przez %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Dostępne przez %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Połączono, brak internetu"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Punkt dostępu jest tymczasowo zajęty"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Bardzo wolna"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Wolna"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Średnia"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Szybka"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Bardzo szybka"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Rozłączona"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Rozłączanie..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Łączenie..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wi-Fi: dwa paski."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wi-Fi: trzy paski."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Wi-Fi: pełna moc sygnału."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Sieć otwarta"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Sieć zabezpieczona"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"System operacyjny Android"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Usunięte aplikacje"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Usunięte aplikacje i użytkownicy"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Niestandardowe (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Pomoc i opinie"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Wpisz hasło, by przywrócić ustawienia fabryczne w trybie demonstracyjnym"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Dalej"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Wymagane hasło"</string>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index 3b97a7f..7e6e2dc 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Conectado via %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Disponível via %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Conectada, sem Internet"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Ponto de acesso temporariamente cheio"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Muito lenta"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Lenta"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Ok"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Média"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Rápida"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Muito rápida"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Desconectado"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Desconectando…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Conectando..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Duas barras de Wi-Fi."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Três barras de Wi-Fi."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Sinal Wi-Fi cheio."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Rede aberta"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Rede segura"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Sistema operacional Android"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Apps removidos"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Apps e usuários removidos"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Personalizada (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Ajuda e feedback"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Digite a senha para redef. p/ configuração original em modo demo"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Próxima"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Senha necessária"</string>
diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml
index e2c6b2f..514dfd1 100644
--- a/packages/SettingsLib/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Ligado através de %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Disponível através de %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Ligado, sem Internet"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Ponto de acesso temporariamente cheio"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Muito lenta"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Lenta"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Média"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Rápida"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Muito rápida"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Desligado"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"A desligar..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"A ligar..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Duas barras de Wi-Fi."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Três barras de Wi-Fi."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Sinal de Wi-Fi completo."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Rede aberta"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Rede segura"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"SO Android"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Aplicações removidas"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Aplicações e utilizadores removidos"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Personalizado (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Ajuda e comentários"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Introduzir palavra-passe para efetuar a reposição de fábrica no modo demo"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Próximo"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Palavra-passe obrigatória"</string>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index 3b97a7f..7e6e2dc 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Conectado via %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Disponível via %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Conectada, sem Internet"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Ponto de acesso temporariamente cheio"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Muito lenta"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Lenta"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Ok"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Média"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Rápida"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Muito rápida"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Desconectado"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Desconectando…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Conectando..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Duas barras de Wi-Fi."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Três barras de Wi-Fi."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Sinal Wi-Fi cheio."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Rede aberta"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Rede segura"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Sistema operacional Android"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Apps removidos"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Apps e usuários removidos"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Personalizada (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Ajuda e feedback"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Digite a senha para redef. p/ configuração original em modo demo"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Próxima"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Senha necessária"</string>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index a3a2b47..c81673d 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Conectată prin %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Disponibilă prin %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Conectată, fără internet"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Punctul de acces este temporar plin"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Foarte lentă"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Lentă"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Bine"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Medie"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Rapidă"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Foarte rapidă"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Deconectat"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"În curs de deconectare..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Se conectează..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Semnal Wi-Fi: două bare."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Semnal Wi-Fi: trei bare."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Semnal Wi-Fi: complet."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Rețea nesecurizată"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Securizați rețeaua"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Sistem de operare Android"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Aplicații eliminate"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Aplicații și utilizatori eliminați"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Personalizat (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Ajutor și feedback"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Meniu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Introduceți parola pentru a reveni la setările din fabrică în modul demo"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Înainte"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Trebuie să introduceți o parolă"</string>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index 905195a..9a28e79 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Подключено к %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Доступно через %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Подключено, без Интернета"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"К точке доступа подключено слишком много устройств"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Очень медленная"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Медленная"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"ОК"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Средняя"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Быстрая"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Очень быстрая"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="DESCRIPTION">%2$s</xliff:g>: <xliff:g id="STATE">%1$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Нет подключения"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Отключение..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Подключение..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wi-Fi: два деления"</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wi-Fi: три деления"</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Wi-Fi: надежный сигнал"</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Открытая сеть"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Защищенная сеть"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"ОС Android"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Удаленные приложения"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Удаленные приложения и пользователи"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Другой (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Справка/отзыв"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Меню"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Чтобы сбросить настройки в деморежиме, введите пароль."</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Далее"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Требуется пароль"</string>
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index 9c75355..afe84f6 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s හරහා සම්බන්ධ විය"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s හරහා ලබා ගැනීමට හැකිය"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"සම්බන්ධයි, අන්තර්ජාලය නැත"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ප්රවේශ ලක්ෂ්ය තාවකාලිකව පිරී ඇත"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"ඉතා මන්දගාමී"</string>
<string name="speed_label_slow" msgid="813109590815810235">"මන්දගාමී"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"හරි"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"මධ්යම"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"වේගවත්"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"ඉතා වේගවත්"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"විසන්ධි වුණි"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"විසන්ධි වෙමින්…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"සම්බන්ධ වෙමින්…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wifi තීරු දෙකයි."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"WiFi තීරු තුනයි."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Wifi සංඥාව පිරී ඇත."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"විවෘත ජාලය"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"ආරක්ෂිත ජාලය"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"ඉවත් කළ යෙදුම්"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"යෙදුම් සහ පරිශීලකයින් ඉවත් කරන ලදි"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"අභිරුචි (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"උදව් සහ ප්රතිපෝෂණ"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"මෙනුව"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"ආදර්ශන ප්රකාර කර්මාන්තශාලා යළි සැකසීමට මුරපදය ඇ. ක."</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"ඊළඟ"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"මුරපදය අවශ්යයි"</string>
diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml
index 595fd4c..1599d80 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Pripojené prostredníctvom %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"K dispozícii prostredníctvom %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Pripojené, žiadny internet"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Prístupový bod je dočasne plný"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Veľmi nízka"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Nízka"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Stredná"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Vysoká"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Veľmi vysoká"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Odpojený"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Prebieha odpájanie..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Prebieha pripájanie…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Dve čiarky signálu Wi-Fi."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Tri čiarky signálu Wi-Fi."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Plný signál Wi-Fi."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Otvorená sieť"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Zabezpečená sieť"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"OS Android"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Odstránené aplikácie"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Odstránené aplikácie a používatelia"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Vlastné (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Pomocník a spätná väzba"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Ponuka"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Zadajte heslo na obnovenie továrenských nastavení v režime ukážky"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Ďalej"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Vyžaduje sa heslo"</string>
diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml
index b8a0514..dbeec8a 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Vzpostavljena povezava prek: %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Na voljo prek: %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Vzpostavljena povezava, brez interneta"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Dostopna točka je trenutno zasedena"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Zelo počasna"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Počasna"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"V redu"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Srednje hitra"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Hitra"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Zelo hitra"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Prekinjena povezava"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Prekinjanje povezave ..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Vzpostavljanje povezave ..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Dve črtici signala Wi-Fi."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Tri črtice signala Wi-Fi."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Poln signal Wi-Fi."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Odprto omrežje"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Varno omrežje"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"OS Android"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Odstranjene aplikacije"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Odstranjene aplikacije in uporabniki"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Po meri (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Pomoč in povratne informacije"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Meni"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Geslo za tovar. nast. v predstav. načinu"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Naprej"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Vnesite geslo"</string>
diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml
index 34d0333..85393d7 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"E lidhur përmes %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"E mundshme përmes %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"U lidh, nuk ka internet"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Pika e qasjes është përkohësisht plot"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Shumë e ulët"</string>
<string name="speed_label_slow" msgid="813109590815810235">"E ngadaltë"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Në rregull"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Mesatare"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"E shpejtë"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Shumë e shpejtë"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Shkëputur"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Po shkëputet..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Po lidhet..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wi-Fi ka dy vija."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wi-Fi: tre vija."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Wi-Fi ka sinjal të plotë."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Rrjet i hapur"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Rrjet i sigurt"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Sistemi operativ Android"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Aplikacionet e hequra"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Aplikacionet dhe përdoruesit e hequr"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"I personalizuar (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Ndihma dhe komentet"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menyja"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Fut fjalëkalimin për të kryer rivendosje në gjendje fabrike në modalitetin e demonstrimit"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Përpara"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Kërkohet fjalëkalimi"</string>
diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml
index 2b21d30..9cbb997 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Веза је успостављена преко приступне тачке %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Доступна је преко приступне тачке %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Веза је успостављена, нема интернета"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Приступна тачка је привремено заузета"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Веома спора"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Спора"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Потврди"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Средња"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Брза"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Веома брза"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Веза је прекинута"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Прекидање везе..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Повезивање…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wi-Fi сигнал има две црте."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wi-Fi сигнал има три црте."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Wi-Fi сигнал је најјачи."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Отворена мрежа"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Безбедна мрежа"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android ОС"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Уклоњене апликације"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Уклоњене апликације и корисници"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Прилагођени (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Помоћ и повратне информације"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Мени"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Унесите лозинку да бисте обавили ресетовање на фабричка подешавања у режиму демонстрације"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Даље"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Потребна је лозинка"</string>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index d73ec66..157e581 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Anslutet via %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Tillgängligt via %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Ansluten, inget internet"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Åtkomstpunkten har inga platser över för tillfället"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Mycket långsam"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Långsam"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Okej"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Medelsnabb"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Snabb"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Mycket snabb"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Kopplas ifrån"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Kopplar ifrån…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Ansluter…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wi-Fi: två staplar."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wi-Fi: tre staplar."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Full signalstyrka för Wi-Fi."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Öppet nätverk"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Säkert nätverk"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Operativsystemet Android"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Borttagna appar"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Borttagna appar och användare"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Anpassad (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Hjälp och feedback"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Meny"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Ange lösenord och utför fabriksåterställning i demoläge"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Nästa"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Lösenord krävs"</string>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index e1fc468..cd6a332 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Imeunganishwa kupitia %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Inapatikana kupitia %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Imeunganishwa, hakuna Intaneti"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Lango la mtandao lina shughuli nyingi kwa sasa"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Polepole Sana"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Polepole"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Sawa"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Wastani"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Haraka"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Haraka Sana"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Haijaunganishwa"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Inatenganisha..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Inaunganisha…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Vipima mtandao viwili vya Wifi."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Vipima mtandao vitatu vya Wifi."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Nguvu kamili ya mtandao wa Wifi."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Mtandao unaotumiwa na mtu yeyote"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Mtandao salama"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"OS ya Android"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Programu zilizoondolewa"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Watumiaji na programu ziilizoondolewa"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Kiwango maalum (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Usaidizi na maoni"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menyu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Weka nenosiri ili urejeshe mipangilio ya kiwandani ikiwa katika hali ya onyesho."</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Inayofuata"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Nenosiri linahitajika"</string>
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index b16a29c..5014600 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s வழியாக இணைக்கப்பட்டது"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s வழியாகக் கிடைக்கிறது"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"இணைக்கப்பட்டது, இணையம் இல்லை"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"தற்காலிகமாக அணுகல் புள்ளி நிரம்பியுள்ளது"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"மிகவும் வேகம் குறைவானது"</string>
<string name="speed_label_slow" msgid="813109590815810235">"வேகம் குறைவு"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"சரி"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"நடுத்தரம்"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"வேகம்"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"மிகவும் வேகமானது"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"தொடர்பு துண்டிக்கப்பட்டது"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"துண்டிக்கிறது..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"இணைக்கிறது..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"வைஃபை சிக்னல்: இரண்டு கோடுகள்."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"வைஃபை சிக்னல்: மூன்று கோடுகள்."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"வைஃபை சிக்னல் முழுமையாக உள்ளது."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"கடவுச்சொல் தேவைப்படாத திறந்த நெட்வொர்க்"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"கடவுச்சொல் தேவைப்படும் பாதுகாப்பான நெட்வொர்க்"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"அகற்றப்பட்ட பயன்பாடுகள்"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"அகற்றப்பட்ட பயன்பாடுகள் மற்றும் பயனர்கள்"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"தனிப்பயன் (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"உதவி & கருத்து"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"மெனு"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"டெமோ பயன்முறையில் ஆரம்பநிலை மீட்டமைவைச் செயல்படுத்த, கடவுச்சொல்லை உள்ளிடவும்"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"அடுத்து"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"கடவுச்சொல் தேவை"</string>
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index 921af68..f678a89 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s ద్వారా కనెక్ట్ చేయబడింది"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s ద్వారా అందుబాటులో ఉంది"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"కనెక్ట్ చేయబడింది, ఇంటర్నెట్ లేదు"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ప్రాప్యత పాయింట్ తాత్కాలికంగా పూర్తయింది"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"చాలా నెమ్మది"</string>
<string name="speed_label_slow" msgid="813109590815810235">"నెమ్మది"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"సరే"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"మధ్యస్థం"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"వేగవంతం"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"చాలా వేగవంతం"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"డిస్కనెక్ట్ చేయబడింది"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"డిస్కనెక్ట్ చేస్తోంది..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"కనెక్ట్ చేస్తోంది..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wifi సిగ్నల్ రెండు బార్లు ఉంది."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wifi సిగ్నల్ మూడు బార్లు ఉంది."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Wifi సిగ్నల్ పూర్తిగా ఉంది."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"ఓపెన్ నెట్వర్క్"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"సురక్షిత నెట్వర్క్"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"తీసివేయబడిన అనువర్తనాలు"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"తీసివేయబడిన అనువర్తనాలు మరియు వినియోగదారులు"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"అనుకూలం (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"సహాయం & అభిప్రాయం"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"మెను"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"డెమో మోడ్లో ఫ్యాక్టరీ రీసెట్ను నిర్వహించడానికి పాస్వర్డ్ను నమోదు చేయండి"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"తదుపరి"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"పాస్వర్డ్ అవసరం"</string>
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index 4f31238..fa5bdfe 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"เชื่อมต่อผ่าน %1$s แล้ว"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"พร้อมใช้งานผ่านทาง %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"เชื่อมต่อแล้ว ไม่พบอินเทอร์เน็ต"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"จุดเข้าใช้งานเต็มชั่วคราว"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"ช้ามาก"</string>
<string name="speed_label_slow" msgid="813109590815810235">"ช้า"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"ตกลง"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"ปานกลาง"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"เร็ว"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"เร็วมาก"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"ตัดการเชื่อมต่อ"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"กำลังตัดการเชื่อมต่อ..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"กำลังเชื่อมต่อ…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"สัญญาณ Wi-Fi 2 ขีด"</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"สัญญาณ Wi-Fi 3 ขีด"</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"สัญญาณ Wi-Fi เต็ม"</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"เครือข่ายแบบเปิด"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"เครือข่ายที่ปลอดภัย"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"ระบบปฏิบัติการของ Android"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"แอปพลิเคชันที่นำออก"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"แอปพลิเคชันและผู้ใช้ที่นำออก"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"กำหนดเอง (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"ความช่วยเหลือและความคิดเห็น"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"เมนู"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"ป้อนรหัสผ่านเพื่อรีเซ็ตค่าในโหมดสาธิต"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"ถัดไป"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"ต้องป้อนรหัสผ่าน"</string>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index 984030d..c0acdc0 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Nakakonekta sa pamamagitan ng %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Available sa pamamagitan ng %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Nakakonekta, walang Internet"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Pansamantalang puno ang access point"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Napakabagal"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Mabagal"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Katamtaman"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Mabilis"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Napakabilis"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Hindi nakakonekta"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Nadidiskonekta..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Kumukonekta…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"May dalawang bar ang Wifi."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"May tatlong bar ang Wifi."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Puno ang signal ng Wifi."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Bukas na network"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Ligtas na network"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Mga inalis na app"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Mga inalis na apps at user"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Custom (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Tulong at feedback"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Ilagay ang password upang mag-factory reset sa demo mode"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Susunod"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Kinakailangan ang password"</string>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index b0c60f5..d288712 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s üzerinden bağlı"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s üzerinden kullanılabilir"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Bağlı, İnternet yok"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Erişim noktası geçici olarak dolu"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Çok Yavaş"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Yavaş"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Tamam"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Orta"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Hızlı"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Çok Hızlı"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Bağlantı kesildi"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Bağlantı kesiliyor…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Bağlanıyor…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Kablosuz sinyal gücü iki çubuk."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Kablosuz sinyal gücü üç çubuk."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Kablosuz sinyal gücü tam."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Açık ağ"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Güvenli ağ"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Kaldırılan uygulamalar"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Kaldırılmış kullanıcılar ve uygulamalar"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Özel (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Yardım ve geri bildirim"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menü"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Demo modunda sıfırlamak için şifreyi girin"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Sonraki"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Şifre gerekli"</string>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index 28c5276..3be3434 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Під’єднано через %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Доступ через %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Під’єднано, але немає доступу до Інтернету"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Точка доступу тимчасово переповнена"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Дуже повільна"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Повільна"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"ОК"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Середня"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Швидка"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Дуже швидка"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>: <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Роз’єднано"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Відключення..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Підключення…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Дві смужки сигналу Wi-Fi."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Три смужки сигналу Wi-Fi."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Максимальний сигнал Wi-Fi."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Відкрита мережа"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Захищена мережа"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"ОС Android"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Видалені програми"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Видалені програми та користувачі"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Спеціальний масштаб (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Довідка й відгуки"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Меню"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Введіть пароль, щоб скинути налаштування в демо-режимі"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Далі"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Потрібен пароль"</string>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index 3aec6aee..0282d09 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"منسلک بذریعہ %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"دستیاب بذریعہ %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"منسلک، انٹرنیٹ نہیں ہے"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"رسائی پوائنٹ عارضی طور پر فُل ہے"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"بہت سست"</string>
<string name="speed_label_slow" msgid="813109590815810235">"سست"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"ٹھیک ہے"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"متوسط"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"تیز"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"بہت تیز"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"منقطع"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"منقطع کیا جارہا ہے…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"مربوط ہو رہا ہے…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wifi دو بارز۔"</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wifi تین بارز۔"</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Wifi سگنل پورا ہے۔"</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"اوپن نیٹ ورک"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"محفوظ نیٹ ورک"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"ہٹائی گئی ایپس"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"ہٹائی گئی ایپس اور صارفین"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"حسب ضرورت (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"مدد اور تاثرات"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"مینو"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"ڈیمو موڈ میں فیکٹری ری سیٹ کیلئے پاس ورڈ درج کریں"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"اگلا"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"پاس ورڈ درکار ہے"</string>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index 5c4d3bd..8684b49 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s orqali ulangan"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"%1$s orqali ishlaydi"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Ulangan, lekin internet aloqasi yo‘q"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Internet kirish nuqtasi vaqtinchalik to‘lgan"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Juda sekin"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Sekin"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"OK"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"O‘rtacha"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Tez"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Juda tez"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Uzildi"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Uzilyapti…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Ulanmoqda…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wi-Fi: ikkita ustun"</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wi-Fi: uchta ustun"</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Wi-Fi: signal to‘liq"</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Ochiq tarmoq"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Xavfsiz tarmoq"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"O‘chirilgan ilovalar"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"O‘chirib tashlangan ilova va foydalanuvchilar"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Moslashtirilgan (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Yordam va fikr-mulohaza"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menyu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Demo rejimda zavod holatiga qaytarish uchun parolni kiriting"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Keyingisi"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Parolni kiritish zarur"</string>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index db2b29d..836dd3d 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Được kết nối qua %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Có sẵn qua %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Đã kết nối, không có Internet"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Điểm truy cập tạm thời đã đạt đến giới hạn số lượng thiết bị truy cập."</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Rất chậm"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Chậm"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"Khá tốt"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Trung bình"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Nhanh"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Rất nhanh"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Đã ngắt kết nối"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Đang ngắt kết nối…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Đang kết nối…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Tín hiệu Wi-Fi hai vạch."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Tín hiệu Wi-Fi ba vạch."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Tín hiệu Wi-Fi đủ."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Mạng mở"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Mạng bảo mật"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Hệ điều hành Android"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Ứng dụng đã xóa"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Ứng dụng và người dùng bị xóa"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Tùy chỉnh (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Trợ giúp và phản hồi"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Nhập mật khẩu để tiến hành khôi phục cài đặt gốc ở chế độ trình diễn"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Tiếp theo"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Yêu cầu mật khẩu"</string>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index 1fe8778..c7a3d77 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"已通过%1$s连接"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"可通过%1$s连接"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"已连接,但无法访问互联网"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"接入点暂时满载"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"很慢"</string>
<string name="speed_label_slow" msgid="813109590815810235">"慢"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"良好"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"适中"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"快"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"很快"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"已断开连接"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"正在断开连接..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"正在连接..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"WLAN 信号强度为两格。"</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"WLAN 信号强度为三格。"</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"WLAN 信号满格。"</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"开放网络"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"安全网络"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android 操作系统"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"已删除的应用"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"已删除的应用和用户"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"自定义 (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"帮助和反馈"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"菜单"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"输入密码即可在演示模式下恢复出厂设置"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"下一步"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"需要输入密码"</string>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index 080a417..bc3348c 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"已透過 %1$s 連線"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"可透過 %1$s 連線"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"已連線,沒有互聯網"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"存取點暫時已滿"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"非常慢"</string>
<string name="speed_label_slow" msgid="813109590815810235">"慢"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"良好"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"適中"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"快"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"非常快"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"已中斷連線"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"正在中斷連線..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"正在連線..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wi-Fi 訊號兩格。"</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wi-Fi 訊號三格。"</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Wi-Fi 訊號滿格。"</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"開放式網絡"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"安全網絡"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android 作業系統"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"已移除的應用程式"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"已移除的應用程式和使用者"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"自訂 (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"說明和意見反映"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"選單"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"輸入密碼即可在示範模式下重設原廠設定"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"下一步"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"請輸入密碼"</string>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index b3c5212..10f2e76 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"已透過 %1$s 連線"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"可透過 %1$s 使用"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"已連線,沒有網際網路"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"存取點暫時滿載"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"非常慢"</string>
<string name="speed_label_slow" msgid="813109590815810235">"慢"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"確定"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"適中"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"快"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"非常快"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"已中斷連線"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"正在中斷連線…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"連線中…"</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wi-Fi 訊號強度兩格。"</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wi-Fi 訊號強度三格。"</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Wi-Fi 訊號強度滿格。"</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"開放式網路"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"安全網路"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android 作業系統"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"移除的應用程式"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"已移除的應用程式和使用者"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"自訂 (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"說明與意見回饋"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"選單"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"如要在示範模式中恢復原廠設定,請輸入密碼"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"下一步"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"請輸入密碼"</string>
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index f3c27a1..65b3478 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -40,12 +40,14 @@
<string name="connected_via_passpoint" msgid="2826205693803088747">"Kuxhumeke nge-%1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Iyatholakala nge-%1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Kuxhumekile, ayikho i-inthanethi"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Iphoyinti lokufinyelela ligcwele okwesikhashana"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Phansi kakhulu"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Phansi"</string>
<string name="speed_label_okay" msgid="2331665440671174858">"KULUNGILE"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"Okumaphakathi"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"Sheshayo"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"Kushesha kakhulu"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Ayixhunyiwe"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Inqamula uxhumano kwi-inthanethi..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Iyaxhuma..."</string>
@@ -101,6 +103,8 @@
<string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Amabha amabili we-Wifi."</string>
<string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Amabha amathathu we-Wifi."</string>
<string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Isiginali ye-Wifi igcwele."</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Vula inethiwekhi"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Inethiwekhi evikelekile"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"I-Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Izinhlelo zokusebenza zisusiwe"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Izinhelo zokusebenza nabasebenzisi abasusiwe"</string>
@@ -375,7 +379,6 @@
<string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Ngokwezifiso (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
<string name="help_feedback_label" msgid="6815040660801785649">"Usizo nempendulo"</string>
<string name="content_description_menu_button" msgid="8182594799812351266">"Imenyu"</string>
- <string name="time_zone_gmt" msgid="2587097992671450782">"I-GMT"</string>
<string name="retail_demo_reset_message" msgid="118771671364131297">"Faka iphasiwedi ukuze wenze ukusetha kwefekthri kumodi yedemo"</string>
<string name="retail_demo_reset_next" msgid="8356731459226304963">"Okulandelayo"</string>
<string name="retail_demo_reset_title" msgid="696589204029930100">"Iphasiwedi iyadingeka"</string>
diff --git a/packages/SettingsLib/res/values/attrs.xml b/packages/SettingsLib/res/values/attrs.xml
index 6d852df..a8a1793 100644
--- a/packages/SettingsLib/res/values/attrs.xml
+++ b/packages/SettingsLib/res/values/attrs.xml
@@ -48,9 +48,4 @@
<attr name="footerPreferenceStyle" format="reference" />
- <declare-styleable name="PreferenceImageView">
- <attr name="maxWidth" format="dimension" />
- <attr name="maxHeight" format="dimension" />
- </declare-styleable>
-
</resources>
diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml
index 064cc84..259446a 100644
--- a/packages/SettingsLib/res/values/strings.xml
+++ b/packages/SettingsLib/res/values/strings.xml
@@ -97,6 +97,9 @@
<!-- Summary for Connected wifi network without internet -->
<string name="wifi_connected_no_internet">Connected, no Internet</string>
+ <!-- Summary for networks failing to connect due to association rejection status 17, AP full -->
+ <string name="wifi_ap_unable_to_handle_new_sta">Access point temporarily full</string>
+
<!-- Speed label for very slow network speed -->
<string name="speed_label_very_slow">Very Slow</string>
<!-- Speed label for slow network speed -->
@@ -110,6 +113,9 @@
<!-- Speed label for very fast network speed -->
<string name="speed_label_very_fast">Very Fast</string>
+ <!-- Summary text separator for preferences including a short description (eg. "Fast / Connected"). -->
+ <string name="preference_summary_default_combination"><xliff:g id="state" example="ON">%1$s</xliff:g> / <xliff:g id="description" example="High accuracy mode">%2$s</xliff:g></string>
+
<!-- Bluetooth settings. Message when a device is disconnected -->
<string name="bluetooth_disconnected">Disconnected</string>
<!-- Bluetooth settings. Message when disconnecting from a device -->
@@ -237,6 +243,12 @@
<!-- Content description of the WIFI signal when it is full for accessibility (not shown on the screen). [CHAR LIMIT=NONE] -->
<string name="accessibility_wifi_signal_full">Wifi signal full.</string>
+ <!-- Content description of the Wi-Fi security type. This message indicates this is an open Wi-Fi (no password needed) [CHAR LIMIT=NONE] -->
+ <string name="accessibility_wifi_security_type_none">Open network</string>
+
+ <!-- Content description of the Wi-Fi security type. This message indicates this is a secured Wi-Fi (password needed) [CHAR LIMIT=NONE] -->
+ <string name="accessibility_wifi_security_type_secured">Secure network</string>
+
<!-- Label for kernel threads in battery usage -->
<string name="process_kernel_label">Android OS</string>
<!-- Title of data usage item that represents all uninstalled applications. [CHAR LIMIT=48] -->
@@ -938,9 +950,6 @@
<!-- Content description for drawer menu button [CHAR_LIMIT=30]-->
<string name="content_description_menu_button">Menu</string>
- <!-- Label for Greenwich mean time, used in a string like GMT+05:00. [CHAR LIMIT=NONE] -->
- <string name="time_zone_gmt">GMT</string>
-
<!-- Label for carrier demo mode factory reset confirmation dialog. [CHAR LIMIT=NONE] -->
<string name="retail_demo_reset_message">Enter password to perform factory reset in demo mode</string>
<!-- Label for positive button on carrier demo mode factory reset confirmation dialog [CHAR LIMIT=40] -->
diff --git a/packages/SettingsLib/res/values/styles_support_preference.xml b/packages/SettingsLib/res/values/styles_support_preference.xml
new file mode 100644
index 0000000..cf9f3c6
--- /dev/null
+++ b/packages/SettingsLib/res/values/styles_support_preference.xml
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2017 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.
+ -->
+
+<!-- Common style for support lib preference to look like Settings app UI -->
+<resources>
+
+ <dimen name="preference_no_icon_padding_start">72dp</dimen>
+
+ <!-- Fragment style -->
+ <style name="PreferenceFragmentStyle.SettingsBase" parent="@*android:style/PreferenceFragment.Material">
+ <item name="allowDividerAfterLastItem">false</item>
+ </style>
+
+ <!-- Preferences -->
+ <style name="Preference.SettingsBase" parent="@style/Preference.Material">
+ <item name="allowDividerAbove">false</item>
+ <item name="allowDividerBelow">true</item>
+ <item name="singleLineTitle">false</item>
+ <item name="iconSpaceReserved">true</item>
+ </style>
+
+ <!-- Preference category -->
+ <style name="Preference.Category.SettingsBase" parent="@style/Preference.Category.Material">
+ <item name="allowDividerAbove">true</item>
+ <item name="allowDividerBelow">true</item>
+ <item name="android:layout">@layout/preference_category_material_settings</item>
+ </style>
+
+ <!-- Preference screen -->
+ <style name="Preference.Screen.SettingsBase" parent="@style/Preference.PreferenceScreen.Material">
+ <item name="allowDividerAbove">false</item>
+ <item name="allowDividerBelow">true</item>
+ <item name="iconSpaceReserved">true</item>
+ </style>
+
+ <!-- Footer Preferences -->
+ <style name="Preference.FooterPreference.SettingsBase" parent="Preference.SettingsBase">
+ <item name="android:layout">@layout/preference_footer</item>
+ <item name="allowDividerAbove">true</item>
+ </style>
+
+ <!-- Dropdown Preferences -->
+ <style name="Preference.DropdownPreference.SettingsBase" parent="Preference.SettingsBase">
+ <item name="android:layout">@layout/preference_dropdown_material_settings</item>
+ </style>
+
+ <!-- Switch Preferences -->
+ <style name="Preference.SwitchPreference.SettingsBase" parent="@style/Preference.SwitchPreference.Material">
+ <item name="allowDividerAbove">false</item>
+ <item name="allowDividerBelow">true</item>
+ <item name="iconSpaceReserved">true</item>
+ <item name="singleLineTitle">false</item>
+ </style>
+
+ <!-- EditText Preferences -->
+ <style name="Preference.EditTextPreference.SettingsBase"
+ parent="@style/Preference.DialogPreference.EditTextPreference.Material">
+ <item name="allowDividerAbove">false</item>
+ <item name="allowDividerBelow">true</item>
+ <item name="iconSpaceReserved">true</item>
+ <item name="singleLineTitle">false</item>
+ </style>
+
+ <style name="PreferenceThemeOverlay.SettingsBase" parent="@style/PreferenceThemeOverlay.v14.Material">
+ <!-- Parent path frameworks/support/v14/preference/res/values/themes.xml -->
+ <item name="android:scrollbars">vertical</item>
+ <item name="preferenceFragmentStyle">@style/PreferenceFragmentStyle.SettingsBase</item>
+ <item name="preferenceCategoryStyle">@style/Preference.Category.SettingsBase</item>
+ <item name="preferenceScreenStyle">@style/Preference.Screen.SettingsBase</item>
+ <item name="preferenceStyle">@style/Preference.SettingsBase</item>
+ <item name="dialogPreferenceStyle">@style/Preference.SettingsBase</item>
+ <item name="editTextPreferenceStyle">@style/Preference.EditTextPreference.SettingsBase</item>
+ <item name="footerPreferenceStyle">@style/Preference.FooterPreference.SettingsBase</item>
+ <item name="switchPreferenceStyle">@style/Preference.SwitchPreference.SettingsBase</item>
+ <item name="dropdownPreferenceStyle">@style/Preference.DropdownPreference.SettingsBase</item>
+ </style>
+
+</resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/src/com/android/settingslib/CustomEditTextPreference.java b/packages/SettingsLib/src/com/android/settingslib/CustomEditTextPreference.java
index 692d211..253ca11 100644
--- a/packages/SettingsLib/src/com/android/settingslib/CustomEditTextPreference.java
+++ b/packages/SettingsLib/src/com/android/settingslib/CustomEditTextPreference.java
@@ -30,8 +30,7 @@
private CustomPreferenceDialogFragment mFragment;
- public CustomEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr,
- int defStyleRes) {
+ public CustomEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/NetworkPolicyEditor.java b/packages/SettingsLib/src/com/android/settingslib/NetworkPolicyEditor.java
index 2e77f42..b01fc85 100644
--- a/packages/SettingsLib/src/com/android/settingslib/NetworkPolicyEditor.java
+++ b/packages/SettingsLib/src/com/android/settingslib/NetworkPolicyEditor.java
@@ -21,6 +21,7 @@
import static android.net.NetworkPolicy.SNOOZE_NEVER;
import static android.net.NetworkPolicy.WARNING_DISABLED;
import static android.net.NetworkTemplate.MATCH_WIFI;
+
import static com.android.internal.util.Preconditions.checkNotNull;
import android.net.NetworkPolicy;
@@ -29,10 +30,12 @@
import android.net.wifi.WifiInfo;
import android.os.AsyncTask;
import android.text.TextUtils;
-import android.text.format.Time;
+import android.util.RecurrenceRule;
import com.google.android.collect.Lists;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
import java.util.ArrayList;
/**
@@ -128,35 +131,36 @@
@Deprecated
private static NetworkPolicy buildDefaultPolicy(NetworkTemplate template) {
// TODO: move this into framework to share with NetworkPolicyManagerService
- final int cycleDay;
- final String cycleTimezone;
+ final RecurrenceRule cycleRule;
final boolean metered;
if (template.getMatchRule() == MATCH_WIFI) {
- cycleDay = CYCLE_NONE;
- cycleTimezone = Time.TIMEZONE_UTC;
+ cycleRule = RecurrenceRule.buildNever();
metered = false;
} else {
- final Time time = new Time();
- time.setToNow();
- cycleDay = time.monthDay;
- cycleTimezone = time.timezone;
+ cycleRule = RecurrenceRule.buildRecurringMonthly(ZonedDateTime.now().getDayOfMonth(),
+ ZoneId.systemDefault());
metered = true;
}
- return new NetworkPolicy(template, cycleDay, cycleTimezone, WARNING_DISABLED,
+ return new NetworkPolicy(template, cycleRule, WARNING_DISABLED,
LIMIT_DISABLED, SNOOZE_NEVER, SNOOZE_NEVER, metered, true);
}
+ @Deprecated
public int getPolicyCycleDay(NetworkTemplate template) {
final NetworkPolicy policy = getPolicy(template);
- return (policy != null) ? policy.cycleDay : -1;
+ if (policy != null && policy.cycleRule.isMonthly()) {
+ return policy.cycleRule.start.getDayOfMonth();
+ } else {
+ return CYCLE_NONE;
+ }
}
+ @Deprecated
public void setPolicyCycleDay(NetworkTemplate template, int cycleDay, String cycleTimezone) {
final NetworkPolicy policy = getOrCreatePolicy(template);
- policy.cycleDay = cycleDay;
- policy.cycleTimezone = cycleTimezone;
+ policy.cycleRule = NetworkPolicy.buildRule(cycleDay, ZoneId.of(cycleTimezone));
policy.inferred = false;
policy.clearSnooze();
writeAsync();
@@ -204,53 +208,6 @@
writeAsync();
}
- public boolean getPolicyMetered(NetworkTemplate template) {
- NetworkPolicy policy = getPolicy(template);
- if (policy != null) {
- return policy.metered;
- } else {
- return false;
- }
- }
-
- public void setPolicyMetered(NetworkTemplate template, boolean metered) {
- boolean modified = false;
-
- NetworkPolicy policy = getPolicy(template);
- if (metered) {
- if (policy == null) {
- policy = buildDefaultPolicy(template);
- policy.metered = true;
- policy.inferred = false;
- mPolicies.add(policy);
- modified = true;
- } else if (!policy.metered) {
- policy.metered = true;
- policy.inferred = false;
- modified = true;
- }
-
- } else {
- if (policy == null) {
- // ignore when policy doesn't exist
- } else if (policy.metered) {
- policy.metered = false;
- policy.inferred = false;
- modified = true;
- }
- }
-
- // Remove legacy unquoted policies while we're here
- final NetworkTemplate unquoted = buildUnquotedNetworkTemplate(template);
- final NetworkPolicy unquotedPolicy = getPolicy(unquoted);
- if (unquotedPolicy != null) {
- mPolicies.remove(unquotedPolicy);
- modified = true;
- }
-
- if (modified) writeAsync();
- }
-
/**
* Build a revised {@link NetworkTemplate} that matches the same rule, but
* with an unquoted {@link NetworkTemplate#getNetworkId()}. Used to work
diff --git a/packages/SettingsLib/src/com/android/settingslib/core/AbstractPreferenceController.java b/packages/SettingsLib/src/com/android/settingslib/core/AbstractPreferenceController.java
index fc1a3a9..38fe879 100644
--- a/packages/SettingsLib/src/com/android/settingslib/core/AbstractPreferenceController.java
+++ b/packages/SettingsLib/src/com/android/settingslib/core/AbstractPreferenceController.java
@@ -4,7 +4,6 @@
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceGroup;
import android.support.v7.preference.PreferenceScreen;
-import java.util.List;
/**
* A controller that manages event for preference.
@@ -40,17 +39,6 @@
}
/**
- * Updates non-indexable keys for search provider.
- *
- * Called by SearchIndexProvider#getNonIndexableKeys
- */
- public void updateNonIndexableKeys(List<String> keys) {
- if (!isAvailable()) {
- keys.add(getPreferenceKey());
- }
- }
-
- /**
* Returns true if preference is available (should be displayed)
*/
public abstract boolean isAvailable();
diff --git a/packages/SettingsLib/src/com/android/settingslib/datetime/ZoneGetter.java b/packages/SettingsLib/src/com/android/settingslib/datetime/ZoneGetter.java
index 1cbb745..1771208 100644
--- a/packages/SettingsLib/src/com/android/settingslib/datetime/ZoneGetter.java
+++ b/packages/SettingsLib/src/com/android/settingslib/datetime/ZoneGetter.java
@@ -18,6 +18,7 @@
import android.content.Context;
import android.content.res.XmlResourceParser;
+import android.icu.text.TimeZoneFormat;
import android.icu.text.TimeZoneNames;
import android.support.v4.text.BidiFormatter;
import android.support.v4.text.TextDirectionHeuristicsCompat;
@@ -88,8 +89,9 @@
private static final String XMLTAG_TIMEZONE = "timezone";
public static CharSequence getTimeZoneOffsetAndName(Context context, TimeZone tz, Date now) {
- Locale locale = Locale.getDefault();
- CharSequence gmtText = getGmtOffsetText(context, locale, tz, now);
+ Locale locale = context.getResources().getConfiguration().locale;
+ TimeZoneFormat tzFormatter = TimeZoneFormat.getInstance(locale);
+ CharSequence gmtText = getGmtOffsetText(tzFormatter, locale, tz, now);
TimeZoneNames timeZoneNames = TimeZoneNames.getInstance(locale);
String zoneNameString = getZoneLongName(timeZoneNames, tz, now);
if (zoneNameString == null) {
@@ -101,7 +103,7 @@
}
public static List<Map<String, Object>> getZonesList(Context context) {
- final Locale locale = Locale.getDefault();
+ final Locale locale = context.getResources().getConfiguration().locale;
final Date now = new Date();
final TimeZoneNames timeZoneNames = TimeZoneNames.getInstance(locale);
final ZoneGetterData data = new ZoneGetterData(context);
@@ -243,12 +245,15 @@
builder.setSpan(span, start, builder.length(), 0);
}
- private static String twoDigits(int input) {
- StringBuilder builder = new StringBuilder(3);
- if (input < 0) builder.append('-');
- String string = Integer.toString(Math.abs(input));
- if (string.length() == 1) builder.append("0");
- builder.append(string);
+ // Input must be positive. minDigits must be 1 or 2.
+ private static String formatDigits(int input, int minDigits, String localizedDigits) {
+ final int tens = input / 10;
+ final int units = input % 10;
+ StringBuilder builder = new StringBuilder(minDigits);
+ if (input >= 10 || minDigits == 2) {
+ builder.append(localizedDigits.charAt(tens));
+ }
+ builder.append(localizedDigits.charAt(units));
return builder.toString();
}
@@ -256,36 +261,83 @@
* Get the GMT offset text label for the given time zone, in the format "GMT-08:00". This will
* also add TTS spans to give hints to the text-to-speech engine for the type of data it is.
*
- * @param context The context which the string is displayed in.
+ * @param tzFormatter The timezone formatter to use.
* @param locale The locale which the string is displayed in. This should be the same as the
- * locale of the context.
+ * locale of the time zone formatter.
* @param tz Time zone to get the GMT offset from.
* @param now The current time, used to tell whether daylight savings is active.
* @return A CharSequence suitable for display as the offset label of {@code tz}.
*/
- private static CharSequence getGmtOffsetText(Context context, Locale locale, TimeZone tz,
- Date now) {
- SpannableStringBuilder builder = new SpannableStringBuilder();
+ private static CharSequence getGmtOffsetText(TimeZoneFormat tzFormatter, Locale locale,
+ TimeZone tz, Date now) {
+ final SpannableStringBuilder builder = new SpannableStringBuilder();
- appendWithTtsSpan(builder, "GMT",
- new TtsSpan.TextBuilder(context.getString(R.string.time_zone_gmt)).build());
-
- int offsetMillis = tz.getOffset(now.getTime());
- if (offsetMillis >= 0) {
- appendWithTtsSpan(builder, "+", new TtsSpan.VerbatimBuilder("+").build());
+ final String gmtPattern = tzFormatter.getGMTPattern();
+ final int placeholderIndex = gmtPattern.indexOf("{0}");
+ final String gmtPatternPrefix, gmtPatternSuffix;
+ if (placeholderIndex == -1) {
+ // Bad pattern. Replace with defaults.
+ gmtPatternPrefix = "GMT";
+ gmtPatternSuffix = "";
+ } else {
+ gmtPatternPrefix = gmtPattern.substring(0, placeholderIndex);
+ gmtPatternSuffix = gmtPattern.substring(placeholderIndex + 3); // After the "{0}".
}
+ if (!gmtPatternPrefix.isEmpty()) {
+ appendWithTtsSpan(builder, gmtPatternPrefix,
+ new TtsSpan.TextBuilder(gmtPatternPrefix).build());
+ }
+
+ int offsetMillis = tz.getOffset(now.getTime());
+ final boolean negative = offsetMillis < 0;
+ final TimeZoneFormat.GMTOffsetPatternType patternType;
+ if (negative) {
+ offsetMillis = -offsetMillis;
+ patternType = TimeZoneFormat.GMTOffsetPatternType.NEGATIVE_HM;
+ } else {
+ patternType = TimeZoneFormat.GMTOffsetPatternType.POSITIVE_HM;
+ }
+ final String gmtOffsetPattern = tzFormatter.getGMTOffsetPattern(patternType);
+ final String localizedDigits = tzFormatter.getGMTOffsetDigits();
+
final int offsetHours = (int) (offsetMillis / DateUtils.HOUR_IN_MILLIS);
- appendWithTtsSpan(builder, twoDigits(offsetHours),
- new TtsSpan.MeasureBuilder().setNumber(offsetHours).setUnit("hour").build());
-
- builder.append(":");
-
final int offsetMinutes = (int) (offsetMillis / DateUtils.MINUTE_IN_MILLIS);
final int offsetMinutesRemaining = Math.abs(offsetMinutes) % 60;
- appendWithTtsSpan(builder, twoDigits(offsetMinutesRemaining),
- new TtsSpan.MeasureBuilder().setNumber(offsetMinutesRemaining)
- .setUnit("minute").build());
+
+ for (int i = 0; i < gmtOffsetPattern.length(); i++) {
+ char c = gmtOffsetPattern.charAt(i);
+ if (c == '+' || c == '-' || c == '\u2212' /* MINUS SIGN */) {
+ final String sign = String.valueOf(c);
+ appendWithTtsSpan(builder, sign, new TtsSpan.VerbatimBuilder(sign).build());
+ } else if (c == 'H' || c == 'm') {
+ final int numDigits;
+ if (i + 1 < gmtOffsetPattern.length() && gmtOffsetPattern.charAt(i + 1) == c) {
+ numDigits = 2;
+ i++; // Skip the next formatting character.
+ } else {
+ numDigits = 1;
+ }
+ final int number;
+ final String unit;
+ if (c == 'H') {
+ number = offsetHours;
+ unit = "hour";
+ } else { // c == 'm'
+ number = offsetMinutesRemaining;
+ unit = "minute";
+ }
+ appendWithTtsSpan(builder, formatDigits(number, numDigits, localizedDigits),
+ new TtsSpan.MeasureBuilder().setNumber(number).setUnit(unit).build());
+ } else {
+ builder.append(c);
+ }
+ }
+
+ if (!gmtPatternSuffix.isEmpty()) {
+ appendWithTtsSpan(builder, gmtPatternSuffix,
+ new TtsSpan.TextBuilder(gmtPatternSuffix).build());
+ }
CharSequence gmtText = new SpannableString(builder);
@@ -305,7 +357,8 @@
public final int zoneCount;
public ZoneGetterData(Context context) {
- final Locale locale = Locale.getDefault();
+ final Locale locale = context.getResources().getConfiguration().locale;
+ final TimeZoneFormat tzFormatter = TimeZoneFormat.getInstance(locale);
final Date now = new Date();
final List<String> olsonIdsToDisplayList = readTimezonesToDisplay(context);
@@ -319,7 +372,7 @@
olsonIdsToDisplay[i] = olsonId;
final TimeZone tz = TimeZone.getTimeZone(olsonId);
timeZones[i] = tz;
- gmtOffsetTexts[i] = getGmtOffsetText(context, locale, tz, now);
+ gmtOffsetTexts[i] = getGmtOffsetText(tzFormatter, locale, tz, now);
}
// Create a lookup of local zone IDs.
diff --git a/packages/SettingsLib/src/com/android/settingslib/development/AbstractEnableAdbPreferenceController.java b/packages/SettingsLib/src/com/android/settingslib/development/AbstractEnableAdbPreferenceController.java
new file mode 100644
index 0000000..75b6696
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/development/AbstractEnableAdbPreferenceController.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.development;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.os.UserManager;
+import android.provider.Settings;
+import android.support.v14.preference.SwitchPreference;
+import android.support.v4.content.LocalBroadcastManager;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+import android.support.v7.preference.TwoStatePreference;
+import android.text.TextUtils;
+
+import com.android.settingslib.core.AbstractPreferenceController;
+
+public abstract class AbstractEnableAdbPreferenceController extends AbstractPreferenceController {
+ private static final String KEY_ENABLE_ADB = "enable_adb";
+ public static final String ACTION_ENABLE_ADB_STATE_CHANGED =
+ "com.android.settingslib.development.AbstractEnableAdbController."
+ + "ENABLE_ADB_STATE_CHANGED";
+
+ private SwitchPreference mPreference;
+
+ public AbstractEnableAdbPreferenceController(Context context) {
+ super(context);
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ super.displayPreference(screen);
+ if (isAvailable()) {
+ mPreference = (SwitchPreference) screen.findPreference(KEY_ENABLE_ADB);
+ }
+ }
+
+ @Override
+ public boolean isAvailable() {
+ return mContext.getSystemService(UserManager.class).isAdminUser();
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return KEY_ENABLE_ADB;
+ }
+
+ private boolean isAdbEnabled() {
+ final ContentResolver cr = mContext.getContentResolver();
+ return Settings.Global.getInt(cr, Settings.Global.ADB_ENABLED, 0) != 0;
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ ((TwoStatePreference)preference).setChecked(isAdbEnabled());
+ }
+
+ public void enablePreference(boolean enabled) {
+ if (isAvailable()) {
+ mPreference.setEnabled(enabled);
+ }
+ }
+
+ public void resetPreference() {
+ if (mPreference.isChecked()) {
+ mPreference.setChecked(false);
+ handlePreferenceTreeClick(mPreference);
+ }
+ }
+
+ public boolean haveDebugSettings() {
+ return isAdbEnabled();
+ }
+
+ @Override
+ public boolean handlePreferenceTreeClick(Preference preference) {
+ if (TextUtils.equals(KEY_ENABLE_ADB, preference.getKey())) {
+ if (!isAdbEnabled()) {
+ showConfirmationDialog((SwitchPreference) preference);
+ } else {
+ writeAdbSetting(false);
+ }
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ protected void writeAdbSetting(boolean enabled) {
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.ADB_ENABLED, enabled ? 1 : 0);
+ notifyStateChanged();
+ }
+
+ protected void notifyStateChanged() {
+ LocalBroadcastManager.getInstance(mContext)
+ .sendBroadcast(new Intent(ACTION_ENABLE_ADB_STATE_CHANGED));
+ }
+
+ public abstract void showConfirmationDialog(SwitchPreference preference);
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/drawer/CategoryKey.java b/packages/SettingsLib/src/com/android/settingslib/drawer/CategoryKey.java
index e067de1..b04bd5a 100644
--- a/packages/SettingsLib/src/com/android/settingslib/drawer/CategoryKey.java
+++ b/packages/SettingsLib/src/com/android/settingslib/drawer/CategoryKey.java
@@ -37,6 +37,8 @@
public static final String CATEGORY_SECURITY_LOCKSCREEN =
"com.android.settings.category.ia.lockscreen";
public static final String CATEGORY_ACCOUNT = "com.android.settings.category.ia.accounts";
+ public static final String CATEGORY_ACCOUNT_DETAIL =
+ "com.android.settings.category.ia.account_detail";
public static final String CATEGORY_SYSTEM = "com.android.settings.category.ia.system";
public static final String CATEGORY_SYSTEM_LANGUAGE =
"com.android.settings.category.ia.language";
diff --git a/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerActivity.java b/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerActivity.java
index a0eadd0..190f5e6 100644
--- a/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerActivity.java
+++ b/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerActivity.java
@@ -169,7 +169,10 @@
finish();
}
- public void setTileEnabled(ComponentName component, boolean enabled) {
+ /**
+ * @return whether or not the enabled state actually changed.
+ */
+ public boolean setTileEnabled(ComponentName component, boolean enabled) {
PackageManager pm = getPackageManager();
int state = pm.getComponentEnabledSetting(component);
boolean isEnabled = state == PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
@@ -183,7 +186,9 @@
? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
: PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
+ return true;
}
+ return false;
}
/**
diff --git a/packages/SettingsLib/src/com/android/settingslib/net/DataUsageController.java b/packages/SettingsLib/src/com/android/settingslib/net/DataUsageController.java
index b69232c..ed3696c 100644
--- a/packages/SettingsLib/src/com/android/settingslib/net/DataUsageController.java
+++ b/packages/SettingsLib/src/com/android/settingslib/net/DataUsageController.java
@@ -16,6 +16,14 @@
package com.android.settingslib.net;
+import static android.net.ConnectivityManager.TYPE_MOBILE;
+import static android.net.NetworkStatsHistory.FIELD_RX_BYTES;
+import static android.net.NetworkStatsHistory.FIELD_TX_BYTES;
+import static android.net.TrafficStats.MB_IN_BYTES;
+import static android.telephony.TelephonyManager.SIM_STATE_READY;
+import static android.text.format.DateUtils.FORMAT_ABBREV_MONTH;
+import static android.text.format.DateUtils.FORMAT_SHOW_DATE;
+
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.INetworkStatsService;
@@ -29,22 +37,15 @@
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.text.format.DateUtils;
-import android.text.format.Time;
import android.util.Log;
+import android.util.Pair;
import com.android.internal.R;
+import java.time.ZonedDateTime;
import java.util.Date;
import java.util.Locale;
-import static android.net.ConnectivityManager.TYPE_MOBILE;
-import static android.net.NetworkStatsHistory.FIELD_RX_BYTES;
-import static android.net.NetworkStatsHistory.FIELD_TX_BYTES;
-import static android.telephony.TelephonyManager.SIM_STATE_READY;
-import static android.text.format.DateUtils.FORMAT_ABBREV_MONTH;
-import static android.text.format.DateUtils.FORMAT_SHOW_DATE;
-import static android.net.TrafficStats.MB_IN_BYTES;
-
public class DataUsageController {
private static final String TAG = "DataUsageController";
@@ -107,13 +108,6 @@
return null;
}
- private static Time addMonth(Time t, int months) {
- final Time rt = new Time(t);
- rt.set(t.monthDay, t.month + months, t.year);
- rt.normalize(false);
- return rt;
- }
-
public DataUsageInfo getDataUsageInfo() {
final String subscriberId = getActiveSubscriberId(mContext);
if (subscriberId == null) {
@@ -140,22 +134,11 @@
final NetworkStatsHistory history = session.getHistoryForNetwork(template, FIELDS);
final long now = System.currentTimeMillis();
final long start, end;
- if (policy != null && policy.cycleDay > 0) {
- // period = determined from cycleDay
- if (DEBUG) Log.d(TAG, "Cycle day=" + policy.cycleDay + " tz="
- + policy.cycleTimezone);
- final Time nowTime = new Time(policy.cycleTimezone);
- nowTime.setToNow();
- final Time policyTime = new Time(nowTime);
- policyTime.set(policy.cycleDay, policyTime.month, policyTime.year);
- policyTime.normalize(false);
- if (nowTime.after(policyTime)) {
- start = policyTime.toMillis(false);
- end = addMonth(policyTime, 1).toMillis(false);
- } else {
- start = addMonth(policyTime, -1).toMillis(false);
- end = policyTime.toMillis(false);
- }
+ if (policy != null) {
+ final Pair<ZonedDateTime, ZonedDateTime> cycle = NetworkPolicyManager
+ .cycleIterator(policy).next();
+ start = cycle.first.toInstant().toEpochMilli();
+ end = cycle.second.toInstant().toEpochMilli();
} else {
// period = last 4 wks
end = now;
diff --git a/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionParser.java b/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionParser.java
index 7f82a1ca..f9dc0e4 100644
--- a/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionParser.java
+++ b/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionParser.java
@@ -93,11 +93,9 @@
// Index into current dismissed state.
@VisibleForTesting
static final String DISMISS_INDEX = "_dismiss_index";
- private static final String SETUP_TIME = "_setup_time";
+ public static final String SETUP_TIME = "_setup_time";
private static final String IS_DISMISSED = "_is_dismissed";
- private static final long MILLIS_IN_DAY = 24 * 60 * 60 * 1000;
-
// Default dismiss control for smart suggestions.
private static final String DEFAULT_SMART_DISMISS_CONTROL = "0,10";
@@ -392,7 +390,7 @@
}
private long getEndTime(long startTime, int daysDelay) {
- long days = daysDelay * MILLIS_IN_DAY;
+ long days = daysDelay * DateUtils.DAY_IN_MILLIS;
return startTime + days;
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
index 8f62100..a814a9f 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
@@ -28,9 +28,11 @@
import android.net.NetworkInfo;
import android.net.NetworkInfo.DetailedState;
import android.net.NetworkInfo.State;
+import android.net.NetworkKey;
import android.net.NetworkScoreManager;
import android.net.NetworkScorerAppData;
import android.net.ScoredNetwork;
+import android.net.WifiKey;
import android.net.wifi.IWifiManager;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
@@ -126,6 +128,7 @@
static final String KEY_SCANRESULT = "key_scanresult";
static final String KEY_SSID = "key_ssid";
static final String KEY_SECURITY = "key_security";
+ static final String KEY_SPEED = "key_speed";
static final String KEY_PSKTYPE = "key_psktype";
static final String KEY_SCANRESULTCACHE = "key_scanresultcache";
static final String KEY_CONFIG = "key_config";
@@ -175,7 +178,6 @@
private Object mTag;
- private int mRankingScore = Integer.MIN_VALUE;
private int mSpeed = Speed.NONE;
private boolean mIsScoredNetworkMetered = false;
@@ -201,10 +203,13 @@
if (savedState.containsKey(KEY_SECURITY)) {
security = savedState.getInt(KEY_SECURITY);
}
+ if (savedState.containsKey(KEY_SPEED)) {
+ mSpeed = savedState.getInt(KEY_SPEED);
+ }
if (savedState.containsKey(KEY_PSKTYPE)) {
pskType = savedState.getInt(KEY_PSKTYPE);
}
- mInfo = (WifiInfo) savedState.getParcelable(KEY_WIFIINFO);
+ mInfo = savedState.getParcelable(KEY_WIFIINFO);
if (savedState.containsKey(KEY_NETWORKINFO)) {
mNetworkInfo = savedState.getParcelable(KEY_NETWORKINFO);
}
@@ -278,7 +283,6 @@
this.mId = that.mId;
this.mSpeed = that.mSpeed;
this.mIsScoredNetworkMetered = that.mIsScoredNetworkMetered;
- this.mRankingScore = that.mRankingScore;
}
/**
@@ -289,7 +293,7 @@
* 1. Active before inactive
* 2. Reachable before unreachable
* 3. Saved before unsaved
- * 4. (Internal only) Network ranking score
+ * 4. Network speed value
* 5. Stronger signal before weaker signal
* 6. SSID alphabetically
*
@@ -310,9 +314,9 @@
if (isSaved() && !other.isSaved()) return -1;
if (!isSaved() && other.isSaved()) return 1;
- // Higher scores go before lower scores
- if (getRankingScore() != other.getRankingScore()) {
- return (getRankingScore() > other.getRankingScore()) ? -1 : 1;
+ // Faster speeds go before slower speeds
+ if (getSpeed() != other.getSpeed()) {
+ return other.getSpeed() - getSpeed();
}
// Sort by signal strength, bucketed by level
@@ -371,9 +375,6 @@
builder.append(',').append(securityToString(security, pskType));
}
builder.append(",level=").append(getLevel());
- if (mRankingScore != Integer.MIN_VALUE) {
- builder.append(",rankingScore=").append(mRankingScore);
- }
if (mSpeed != Speed.NONE) {
builder.append(",speed=").append(mSpeed);
}
@@ -404,24 +405,31 @@
*/
private boolean updateScores(WifiNetworkScoreCache scoreCache) {
int oldSpeed = mSpeed;
- int oldRankingScore = mRankingScore;
mSpeed = Speed.NONE;
- mRankingScore = Integer.MIN_VALUE;
- for (ScanResult result : mScanResultCache.values()) {
- ScoredNetwork score = scoreCache.getScoredNetwork(result);
- if (score == null) {
- continue;
+ if (isActive() && mInfo != null) {
+ NetworkKey key = new NetworkKey(new WifiKey(
+ AccessPoint.convertToQuotedString(ssid), mInfo.getBSSID()));
+ ScoredNetwork score = scoreCache.getScoredNetwork(key);
+ if (score != null) {
+ mSpeed = score.calculateBadge(mInfo.getRssi());
}
-
- if (score.hasRankingScore()) {
- mRankingScore = Math.max(mRankingScore, score.calculateRankingScore(result.level));
+ } else {
+ for (ScanResult result : mScanResultCache.values()) {
+ ScoredNetwork score = scoreCache.getScoredNetwork(result);
+ if (score == null) {
+ continue;
+ }
+ // TODO(sghuman): Rename calculateBadge API
+ mSpeed = Math.max(mSpeed, score.calculateBadge(result.level));
}
- // TODO(sghuman): Rename calculateBadge API
- mSpeed = Math.max(mSpeed, score.calculateBadge(result.level));
}
- return (oldSpeed != mSpeed || oldRankingScore != mRankingScore);
+ if(WifiTracker.sVerboseLogging) {
+ Log.i(TAG, String.format("%s: Set speed to %d", ssid, mSpeed));
+ }
+
+ return oldSpeed != mSpeed;
}
/**
@@ -431,12 +439,22 @@
private boolean updateMetered(WifiNetworkScoreCache scoreCache) {
boolean oldMetering = mIsScoredNetworkMetered;
mIsScoredNetworkMetered = false;
- for (ScanResult result : mScanResultCache.values()) {
- ScoredNetwork score = scoreCache.getScoredNetwork(result);
- if (score == null) {
- continue;
+
+ if (isActive() && mInfo != null) {
+ NetworkKey key = new NetworkKey(new WifiKey(
+ AccessPoint.convertToQuotedString(ssid), mInfo.getBSSID()));
+ ScoredNetwork score = scoreCache.getScoredNetwork(key);
+ if (score != null) {
+ mIsScoredNetworkMetered |= score.meteredHint;
}
- mIsScoredNetworkMetered |= score.meteredHint;
+ } else {
+ for (ScanResult result : mScanResultCache.values()) {
+ ScoredNetwork score = scoreCache.getScoredNetwork(result);
+ if (score == null) {
+ continue;
+ }
+ mIsScoredNetworkMetered |= score.meteredHint;
+ }
}
return oldMetering == mIsScoredNetworkMetered;
}
@@ -557,15 +575,11 @@
}
/**
- * Returns if the network is marked metered. Metering can be marked through its config in
- * {@link WifiConfiguration}, after connection in {@link WifiInfo}, or from a score config in
- * {@link ScoredNetwork}.
+ * Returns if the network should be considered metered.
*/
public boolean isMetered() {
return mIsScoredNetworkMetered
- || (mConfig != null && mConfig.meteredHint)
- || (mInfo != null && mInfo.getMeteredHint()
- || (mNetworkInfo != null && mNetworkInfo.isMetered()));
+ || WifiConfiguration.isMetered(mConfig, mInfo);
}
public NetworkInfo getNetworkInfo() {
@@ -682,13 +696,6 @@
// Update to new summary
StringBuilder summary = new StringBuilder();
- // TODO(b/62354743): Standardize and international delimiter usage
- final String concatenator = " / ";
-
- if (mSpeed != Speed.NONE) {
- summary.append(getSpeedLabel() + concatenator);
- }
-
if (isActive() && config != null && config.isPasspoint()) {
// This is the active connection on passpoint
summary.append(getSummary(mContext, getDetailedState(),
@@ -730,14 +737,24 @@
summary.append(mContext.getString(R.string.wifi_not_in_range));
} else { // In range, not disabled.
if (config != null) { // Is saved network
- summary.append(mContext.getString(R.string.wifi_remembered));
+ // Last attempt to connect to this failed. Show reason why
+ switch (config.recentFailure.getAssociationStatus()) {
+ case WifiConfiguration.RecentFailure.STATUS_AP_UNABLE_TO_HANDLE_NEW_STA:
+ summary.append(mContext.getString(
+ R.string.wifi_ap_unable_to_handle_new_sta));
+ break;
+ default:
+ // "Saved"
+ summary.append(mContext.getString(R.string.wifi_remembered));
+ break;
+ }
}
}
- if (WifiTracker.sVerboseLogging > 0) {
+ if (WifiTracker.sVerboseLogging) {
// Add RSSI/band information for this config, what was seen up to 6 seconds ago
// verbose WiFi Logging is only turned on thru developers settings
- if (mInfo != null && mNetworkInfo != null) { // This is the active connection
+ if (isActive() && mInfo != null) {
summary.append(" f=" + Integer.toString(mInfo.getFrequency()));
}
summary.append(" " + getVisibilityStatus());
@@ -772,14 +789,18 @@
}
}
- // Strip trailing delimiter if applicable
- int concatLength = concatenator.length();
- if (summary.length() >= concatLength && summary.substring(
- summary.length() - concatLength, summary.length()).equals(concatenator)) {
- summary.delete(summary.length() - concatLength, summary.length());
+ // If Speed label and summary are both present, use the preference combination to combine
+ // the two, else return the non-null one.
+ if (getSpeedLabel() != null && summary.length() != 0) {
+ return mContext.getResources().getString(
+ R.string.preference_summary_default_combination,
+ getSpeedLabel(),
+ summary.toString());
+ } else if (getSpeedLabel() != null) {
+ return getSpeedLabel();
+ } else {
+ return summary.toString();
}
-
- return summary.toString();
}
/**
@@ -798,7 +819,7 @@
long now = System.currentTimeMillis();
- if (mInfo != null) {
+ if (isActive() && mInfo != null) {
bssid = mInfo.getBSSID();
if (bssid != null) {
visibility.append(" ").append(bssid);
@@ -806,9 +827,6 @@
visibility.append(" rssi=").append(mInfo.getRssi());
visibility.append(" ");
visibility.append(" score=").append(mInfo.score);
- if (mRankingScore != Integer.MIN_VALUE) {
- visibility.append(" rankingScore=").append(getRankingScore());
- }
if (mSpeed != Speed.NONE) {
visibility.append(" speed=").append(getSpeedLabel());
}
@@ -1009,6 +1027,7 @@
public void saveWifiState(Bundle savedState) {
if (ssid != null) savedState.putString(KEY_SSID, getSsidStr());
savedState.putInt(KEY_SECURITY, security);
+ savedState.putInt(KEY_SPEED, mSpeed);
savedState.putInt(KEY_PSKTYPE, pskType);
if (mConfig != null) savedState.putParcelable(KEY_CONFIG, mConfig);
savedState.putParcelable(KEY_WIFIINFO, mInfo);
@@ -1112,10 +1131,6 @@
setRssi(AccessPoint.UNREACHABLE_RSSI);
}
- int getRankingScore() {
- return mRankingScore;
- }
-
int getSpeed() { return mSpeed;}
@Nullable
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java
index 92995a8..2c4f9c4 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java
@@ -25,6 +25,7 @@
import android.net.wifi.WifiConfiguration;
import android.os.Looper;
import android.os.UserHandle;
+import android.support.annotation.VisibleForTesting;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceViewHolder;
import android.text.TextUtils;
@@ -47,7 +48,17 @@
R.attr.state_metered
};
- private static final int[] wifi_friction_attributes = { R.attr.wifi_friction };
+ private static final int[] FRICTION_ATTRS = {
+ R.attr.wifi_friction
+ };
+
+ private static final int[] WIFI_CONNECTION_STRENGTH = {
+ R.string.accessibility_no_wifi,
+ R.string.accessibility_wifi_one_bar,
+ R.string.accessibility_wifi_two_bars,
+ R.string.accessibility_wifi_three_bars,
+ R.string.accessibility_wifi_signal_full
+ };
private final StateListDrawable mFrictionSld;
private final int mBadgePadding;
@@ -62,14 +73,6 @@
private int mDefaultIconResId;
private int mWifiSpeed = NetworkBadging.BADGING_NONE;
- static final int[] WIFI_CONNECTION_STRENGTH = {
- R.string.accessibility_no_wifi,
- R.string.accessibility_wifi_one_bar,
- R.string.accessibility_wifi_two_bars,
- R.string.accessibility_wifi_three_bars,
- R.string.accessibility_wifi_signal_full
- };
-
public static String generatePreferenceKey(AccessPoint accessPoint) {
StringBuilder builder = new StringBuilder();
@@ -103,7 +106,7 @@
TypedArray frictionSld;
try {
- frictionSld = context.getTheme().obtainStyledAttributes(wifi_friction_attributes);
+ frictionSld = context.getTheme().obtainStyledAttributes(FRICTION_ATTRS);
} catch (Resources.NotFoundException e) {
// Fallback for platforms that do not need friction icon resources.
frictionSld = null;
@@ -129,7 +132,7 @@
TypedArray frictionSld;
try {
- frictionSld = context.getTheme().obtainStyledAttributes(wifi_friction_attributes);
+ frictionSld = context.getTheme().obtainStyledAttributes(FRICTION_ATTRS);
} catch (Resources.NotFoundException e) {
// Fallback for platforms that do not need friction icon resources.
frictionSld = null;
@@ -249,14 +252,7 @@
setSummary(mForSavedNetworks ? mAccessPoint.getSavedNetworkSummary()
: mAccessPoint.getSettingsSummary());
- mContentDescription = getTitle();
- if (getSummary() != null) {
- mContentDescription = TextUtils.concat(mContentDescription, ",", getSummary());
- }
- if (level >= 0 && level < WIFI_CONNECTION_STRENGTH.length) {
- mContentDescription = TextUtils.concat(mContentDescription, ",",
- getContext().getString(WIFI_CONNECTION_STRENGTH[level]));
- }
+ mContentDescription = buildContentDescription(getContext(), this /* pref */, mAccessPoint);
}
@Override
@@ -269,6 +265,27 @@
}
}
+ /**
+ * Helper method to generate content description string.
+ */
+ @VisibleForTesting
+ static CharSequence buildContentDescription(Context context, Preference pref, AccessPoint ap) {
+ CharSequence contentDescription = pref.getTitle();
+ final CharSequence summary = pref.getSummary();
+ if (!TextUtils.isEmpty(summary)) {
+ contentDescription = TextUtils.concat(contentDescription, ",", summary);
+ }
+ int level = ap.getLevel();
+ if (level >= 0 && level < WIFI_CONNECTION_STRENGTH.length) {
+ contentDescription = TextUtils.concat(contentDescription, ",",
+ context.getString(WIFI_CONNECTION_STRENGTH[level]));
+ }
+ return TextUtils.concat(contentDescription, ",",
+ ap.getSecurity() == AccessPoint.SECURITY_NONE
+ ? context.getString(R.string.accessibility_wifi_security_type_none)
+ : context.getString(R.string.accessibility_wifi_security_type_secured));
+ }
+
public void onLevelChanged() {
postNotifyChanged();
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/TestAccessPointBuilder.java b/packages/SettingsLib/src/com/android/settingslib/wifi/TestAccessPointBuilder.java
index 3413f24..731a607 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/TestAccessPointBuilder.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/TestAccessPointBuilder.java
@@ -19,10 +19,14 @@
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
+import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.os.Bundle;
import android.support.annotation.Keep;
+import com.android.settingslib.wifi.AccessPoint.Speed;
+
+import java.util.ArrayList;
/**
* Build and return a valid AccessPoint.
@@ -39,6 +43,7 @@
// set some sensible defaults
private String mBssid = null;
+ private int mSpeed = Speed.NONE;
private int mRssi = AccessPoint.UNREACHABLE_RSSI;
private int mNetworkId = WifiConfiguration.INVALID_NETWORK_ID;
private String ssid = "TestSsid";
@@ -50,6 +55,7 @@
private WifiInfo mWifiInfo;
Context mContext;
+ private ArrayList<ScanResult> mScanResultCache;
@Keep
public TestAccessPointBuilder(Context context) {
@@ -74,7 +80,11 @@
if (mProviderFriendlyName != null) {
bundle.putString(AccessPoint.KEY_PROVIDER_FRIENDLY_NAME, mProviderFriendlyName);
}
+ if (mScanResultCache != null) {
+ bundle.putParcelableArrayList(AccessPoint.KEY_SCANRESULTCACHE, mScanResultCache);
+ }
bundle.putInt(AccessPoint.KEY_SECURITY, mSecurity);
+ bundle.putInt(AccessPoint.KEY_SPEED, mSpeed);
AccessPoint ap = new AccessPoint(mContext, bundle);
ap.setRssi(mRssi);
@@ -128,6 +138,11 @@
return this;
}
+ public TestAccessPointBuilder setSpeed(int speed) {
+ mSpeed = speed;
+ return this;
+ }
+
/**
* Set whether the AccessPoint is reachable.
* Side effect: if the signal level was not previously set,
@@ -202,4 +217,9 @@
mBssid = bssid;
return this;
}
+
+ public TestAccessPointBuilder setScanResultCache(ArrayList<ScanResult> scanResultCache) {
+ mScanResultCache = scanResultCache;
+ return this;
+ }
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
index b299961..45032ce 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
@@ -68,11 +68,13 @@
// TODO(b/36733768): Remove flag includeSaved and includePasspoints.
private static final String TAG = "WifiTracker";
- private static final boolean DBG = Log.isLoggable(TAG, Log.DEBUG);
+ private static final boolean DBG() {
+ return Log.isLoggable(TAG, Log.DEBUG);
+ }
/** verbose logging flag. this flag is set thru developer debugging options
* and used so as to assist with in-the-field WiFi connectivity debugging */
- public static int sVerboseLogging = 0;
+ public static boolean sVerboseLogging;
// TODO: Allow control of this?
// Combo scans can take 5-6s to complete - set to 10s.
@@ -195,7 +197,7 @@
mConnectivityManager = connectivityManager;
// check if verbose logging has been turned on or off
- sVerboseLogging = mWifiManager.getVerboseLoggingLevel();
+ sVerboseLogging = (mWifiManager.getVerboseLoggingLevel() > 0);
mFilter = new IntentFilter();
mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
@@ -248,20 +250,20 @@
mLastNetworkInfo = mConnectivityManager.getNetworkInfo(mWifiManager.getCurrentNetwork());
final List<ScanResult> newScanResults = mWifiManager.getScanResults();
+ if (sVerboseLogging) {
+ Log.i(TAG, "Fetched scan results: " + newScanResults);
+ }
+
List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks();
mInternalAccessPoints.clear();
updateAccessPointsLocked(newScanResults, configs);
- if (DBG) {
- Log.d(TAG, "force update - internal access point list:\n" + mInternalAccessPoints);
- }
-
// Synchronously copy access points
mMainHandler.removeMessages(MainHandler.MSG_ACCESS_POINT_CHANGED);
mMainHandler.handleMessage(
Message.obtain(mMainHandler, MainHandler.MSG_ACCESS_POINT_CHANGED));
- if (DBG) {
- Log.d(TAG, "force update - external access point list:\n" + mAccessPoints);
+ if (sVerboseLogging) {
+ Log.i(TAG, "force update - external access point list:\n" + mAccessPoints);
}
}
}
@@ -339,7 +341,7 @@
private void requestScoresForNetworkKeys(Collection<NetworkKey> keys) {
if (keys.isEmpty()) return;
- if (DBG) {
+ if (DBG()) {
Log.d(TAG, "Requesting scores for Network Keys: " + keys);
}
mNetworkScoreManager.requestScores(keys.toArray(new NetworkKey[keys.size()]));
@@ -444,19 +446,19 @@
}
if (mScanId > NUM_SCANS_TO_CONFIRM_AP_LOSS) {
- if (DBG) Log.d(TAG, "------ Dumping SSIDs that were expired on this scan ------");
+ if (DBG()) Log.d(TAG, "------ Dumping SSIDs that were expired on this scan ------");
Integer threshold = mScanId - NUM_SCANS_TO_CONFIRM_AP_LOSS;
for (Iterator<Map.Entry<String, Integer>> it = mSeenBssids.entrySet().iterator();
it.hasNext(); /* nothing */) {
Map.Entry<String, Integer> e = it.next();
if (e.getValue() < threshold) {
ScanResult result = mScanResultCache.get(e.getKey());
- if (DBG) Log.d(TAG, "Removing " + e.getKey() + ":(" + result.SSID + ")");
+ if (DBG()) Log.d(TAG, "Removing " + e.getKey() + ":(" + result.SSID + ")");
mScanResultCache.remove(e.getKey());
it.remove();
}
}
- if (DBG) Log.d(TAG, "---- Done Dumping SSIDs that were expired on this scan ----");
+ if (DBG()) Log.d(TAG, "---- Done Dumping SSIDs that were expired on this scan ----");
}
return mScanResultCache.values();
@@ -483,6 +485,9 @@
private void updateAccessPoints() {
List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks();
final List<ScanResult> newScanResults = mWifiManager.getScanResults();
+ if (sVerboseLogging) {
+ Log.i(TAG, "Fetched scan results: " + newScanResults);
+ }
synchronized (mLock) {
if(!sStaleScanResults) {
@@ -610,7 +615,7 @@
Collections.sort(accessPoints);
// Log accesspoints that were deleted
- if (DBG) {
+ if (DBG()) {
Log.d(TAG, "------ Dumping SSIDs that were not seen on this scan ------");
for (AccessPoint prevAccessPoint : mInternalAccessPoints) {
if (prevAccessPoint.getSsid() == null)
@@ -1067,7 +1072,7 @@
oldAccessPoints.put(accessPoint.mId, accessPoint);
}
- if (DBG) {
+ if (DBG()) {
Log.d(TAG, "Starting to copy AP items on the MainHandler");
}
synchronized (mLock) {
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/utils/ZoneGetterTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/utils/ZoneGetterTest.java
index a3345ee..0ec75ec 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/utils/ZoneGetterTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/utils/ZoneGetterTest.java
@@ -36,6 +36,8 @@
public class ZoneGetterTest {
private static final String TIME_ZONE_LONDON_ID = "Europe/London";
private static final String TIME_ZONE_LA_ID = "America/Los_Angeles";
+ private static final String TIME_ZONE_ALGIERS_ID = "Africa/Algiers";
+ private static final String TIME_ZONE_CEUTA_ID = "Africa/Ceuta";
private Locale mLocaleEnUs;
private Calendar mCalendar;
@@ -59,6 +61,16 @@
}
@Test
+ public void getTimeZoneOffsetAndName_setAlgiers_returnCentralEuropeanStandardTime() {
+ testTimeZoneOffsetAndNameInner(TIME_ZONE_ALGIERS_ID, "Central European Standard Time");
+ }
+
+ @Test
+ public void getTimeZoneOffsetAndName_setCeuta_returnCentralEuropeanSummerTime() {
+ testTimeZoneOffsetAndNameInner(TIME_ZONE_CEUTA_ID, "Central European Summer Time");
+ }
+
+ @Test
public void getZonesList_checkTypes() {
final List<Map<String, Object>> zones =
ZoneGetter.getZonesList(InstrumentationRegistry.getContext());
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 2f02b9b..35c730e 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
@@ -21,6 +21,8 @@
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -48,6 +50,7 @@
import com.android.settingslib.R;
+import com.android.settingslib.wifi.AccessPoint.Speed;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -143,7 +146,13 @@
assertSortingWorks(savedAp, notSavedAp);
}
- //TODO: add tests for mRankingScore sort order if ranking is exposed
+ @Test
+ public void testCompareTo_GivesHighSpeedBeforeLowSpeed() {
+ AccessPoint fastAp = new TestAccessPointBuilder(mContext).setSpeed(Speed.FAST).build();
+ AccessPoint slowAp = new TestAccessPointBuilder(mContext).setSpeed(Speed.SLOW).build();
+
+ assertSortingWorks(fastAp, slowAp);
+ }
@Test
public void testCompareTo_GivesHighLevelBeforeLowLevel() {
@@ -298,23 +307,6 @@
}
@Test
- public void testIsMetered_returnTrueWhenNetworkInfoIsMetered() {
- WifiConfiguration configuration = createWifiConfiguration();
-
- NetworkInfo networkInfo =
- new NetworkInfo(ConnectivityManager.TYPE_WIFI, 2, "WIFI", "WIFI_SUBTYPE");
- networkInfo.setMetered(true);
- AccessPoint accessPoint = new AccessPoint(mContext, configuration);
- WifiInfo wifiInfo = new WifiInfo();
- wifiInfo.setSSID(WifiSsid.createFromAsciiEncoded(configuration.SSID));
- wifiInfo.setBSSID(configuration.BSSID);
- wifiInfo.setNetworkId(configuration.networkId);
- accessPoint.update(configuration, wifiInfo, networkInfo);
-
- assertThat(accessPoint.isMetered()).isTrue();
- }
-
- @Test
public void testIsMetered_returnTrueWhenScoredNetworkIsMetered() {
AccessPoint ap = createAccessPointWithScanResultCache();
@@ -406,6 +398,39 @@
}
@Test
+ public void testSpeedLabel_isDerivedFromConnectedBssid() {
+ int rssi = -55;
+ String bssid = "00:00:00:00:00:00";
+ int networkId = 123;
+
+ WifiInfo info = new WifiInfo();
+ info.setRssi(rssi);
+ info.setSSID(WifiSsid.createFromAsciiEncoded(TEST_SSID));
+ info.setBSSID(bssid);
+ info.setNetworkId(networkId);
+
+ AccessPoint ap =
+ new TestAccessPointBuilder(mContext)
+ .setActive(true)
+ .setNetworkId(networkId)
+ .setSsid(TEST_SSID)
+ .setScanResultCache(buildScanResultCache())
+ .setWifiInfo(info)
+ .build();
+
+ NetworkKey key = new NetworkKey(new WifiKey('"' + TEST_SSID + '"', bssid));
+ when(mockWifiNetworkScoreCache.getScoredNetwork(key))
+ .thenReturn(buildScoredNetworkWithMockBadgeCurve());
+ when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) AccessPoint.Speed.FAST);
+
+ ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */);
+
+ verify(mockWifiNetworkScoreCache, times(2)).getScoredNetwork(key);
+ verify(mockWifiNetworkScoreCache, never()).getScoredNetwork(any(ScanResult.class));
+ assertThat(ap.getSpeed()).isEqualTo(AccessPoint.Speed.FAST);
+ }
+
+ @Test
public void testSummaryString_showsSpeedLabel() {
AccessPoint ap = createAccessPointWithScanResultCache();
@@ -460,6 +485,12 @@
private AccessPoint createAccessPointWithScanResultCache() {
Bundle bundle = new Bundle();
+ ArrayList<ScanResult> scanResults = buildScanResultCache();
+ bundle.putParcelableArrayList(AccessPoint.KEY_SCANRESULTCACHE, scanResults);
+ return new AccessPoint(mContext, bundle);
+ }
+
+ private ArrayList<ScanResult> buildScanResultCache() {
ArrayList<ScanResult> scanResults = new ArrayList<>();
for (int i = 0; i < 5; i++) {
ScanResult scanResult = new ScanResult();
@@ -469,9 +500,7 @@
scanResult.capabilities = "";
scanResults.add(scanResult);
}
-
- bundle.putParcelableArrayList(AccessPoint.KEY_SCANRESULTCACHE, scanResults);
- return new AccessPoint(mContext, bundle);
+ return scanResults;
}
private WifiConfiguration createWifiConfiguration() {
@@ -483,7 +512,7 @@
}
/**
- * Assert that the first AccessPoint appears after the second AccessPoint
+ * Assert that the first AccessPoint appears before the second AccessPoint
* once sorting has been completed.
*/
private void assertSortingWorks(AccessPoint first, AccessPoint second) {
diff --git a/packages/SettingsLib/tests/robotests/Android.mk b/packages/SettingsLib/tests/robotests/Android.mk
index eca2052..55b635e 100644
--- a/packages/SettingsLib/tests/robotests/Android.mk
+++ b/packages/SettingsLib/tests/robotests/Android.mk
@@ -41,7 +41,7 @@
# Include the testing libraries (JUnit4 + Robolectric libs).
LOCAL_STATIC_JAVA_LIBRARIES := \
- platform-system-robolectric \
+ mockito-robolectric-prebuilt \
truth-prebuilt
LOCAL_JAVA_LIBRARIES := \
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/SettingLibRobolectricTestRunner.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/SettingLibRobolectricTestRunner.java
index fd3b1dc6..482b788 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/SettingLibRobolectricTestRunner.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/SettingLibRobolectricTestRunner.java
@@ -20,6 +20,9 @@
import org.robolectric.annotation.Config;
import org.robolectric.manifest.AndroidManifest;
import org.robolectric.res.Fs;
+import org.robolectric.res.ResourcePath;
+
+import java.util.List;
public class SettingLibRobolectricTestRunner extends RobolectricTestRunner {
@@ -36,10 +39,31 @@
final String assetsDir = appRoot + config.assetDir();
final AndroidManifest manifest = new AndroidManifest(Fs.fileFromPath(manifestPath),
- Fs.fileFromPath(resDir), Fs.fileFromPath(assetsDir));
-
+ Fs.fileFromPath(resDir), Fs.fileFromPath(assetsDir)) {
+ @Override
+ public List<ResourcePath> getIncludedResourcePaths() {
+ List<ResourcePath> paths = super.getIncludedResourcePaths();
+ SettingLibRobolectricTestRunner.getIncludedResourcePaths(getPackageName(), paths);
+ return paths;
+ }
+ };
manifest.setPackageName("com.android.settingslib");
return manifest;
}
+ static void getIncludedResourcePaths(String packageName, List<ResourcePath> paths) {
+ paths.add(new ResourcePath(
+ packageName,
+ Fs.fileFromPath("./frameworks/base/packages/SettingsLib/res"),
+ null));
+ paths.add(new ResourcePath(
+ packageName,
+ Fs.fileFromPath("./frameworks/base/core/res/res"),
+ null));
+ paths.add(new ResourcePath(
+ packageName,
+ Fs.fileFromPath("./frameworks/support/v7/appcompat/res"),
+ null));
+ }
+
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/EnableAdbPreferenceControllerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/EnableAdbPreferenceControllerTest.java
new file mode 100644
index 0000000..0778b27
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/EnableAdbPreferenceControllerTest.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.development;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Answers.RETURNS_DEEP_STUBS;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.os.UserManager;
+import android.provider.Settings;
+import android.support.v14.preference.SwitchPreference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.settingslib.SettingLibRobolectricTestRunner;
+import com.android.settingslib.TestConfig;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowApplication;
+
+@RunWith(SettingLibRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class EnableAdbPreferenceControllerTest {
+ @Mock(answer = RETURNS_DEEP_STUBS)
+ private PreferenceScreen mScreen;
+ @Mock
+ private UserManager mUserManager;
+ @Mock
+ private PackageManager mPackageManager;
+
+ private Context mContext;
+ private SwitchPreference mPreference;
+ private ConcreteEnableAdbPreferenceController mController;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ ShadowApplication shadowContext = ShadowApplication.getInstance();
+ shadowContext.setSystemService(Context.USER_SERVICE, mUserManager);
+ mContext = spy(shadowContext.getApplicationContext());
+ when(mContext.getPackageManager()).thenReturn(mPackageManager);
+ mPreference = new SwitchPreference(mContext);
+ when(mScreen.findPreference(anyString())).thenReturn(mPreference);
+ mController = new ConcreteEnableAdbPreferenceController(mContext);
+ mPreference.setKey(mController.getPreferenceKey());
+ }
+
+ @Test
+ public void displayPreference_isNotAdmin_shouldRemovePreference() {
+ when(mUserManager.isAdminUser()).thenReturn(false);
+ when(mScreen.getPreferenceCount()).thenReturn(1);
+ when(mScreen.getPreference(0)).thenReturn(mPreference);
+
+ mController.displayPreference(mScreen);
+
+ verify(mScreen).removePreference(any(Preference.class));
+ }
+
+ @Test
+ public void displayPreference_isAdmin_shouldNotRemovePreference() {
+ when(mUserManager.isAdminUser()).thenReturn(true);
+
+ mController.displayPreference(mScreen);
+
+ verify(mScreen, never()).removePreference(any(Preference.class));
+ }
+
+
+ @Test
+ public void resetPreference_shouldUncheck() {
+ when(mUserManager.isAdminUser()).thenReturn(true);
+ mController.displayPreference(mScreen);
+ mPreference.setChecked(true);
+
+ mController.resetPreference();
+
+ assertThat(mPreference.isChecked()).isFalse();
+ }
+
+ @Test
+ public void handlePreferenceTreeClick_shouldUpdateSettings() {
+ when(mUserManager.isAdminUser()).thenReturn(true);
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Global.ADB_ENABLED, 1);
+ mPreference.setChecked(true);
+ mController.displayPreference(mScreen);
+
+ mController.handlePreferenceTreeClick(mPreference);
+
+ assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Global.ADB_ENABLED, 0)).isEqualTo(0);
+ }
+
+ @Test
+ public void updateState_settingsOn_shouldCheck() {
+ when(mUserManager.isAdminUser()).thenReturn(true);
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Global.ADB_ENABLED, 1);
+ mPreference.setChecked(false);
+ mController.displayPreference(mScreen);
+
+ mController.updateState(mPreference);
+
+ assertThat(mPreference.isChecked()).isTrue();
+ }
+
+ @Test
+ public void updateState_settingsOff_shouldUncheck() {
+ when(mUserManager.isAdminUser()).thenReturn(true);
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Global.ADB_ENABLED, 0);
+ mPreference.setChecked(true);
+ mController.displayPreference(mScreen);
+
+ mController.updateState(mPreference);
+
+ assertThat(mPreference.isChecked()).isFalse();
+ }
+
+ class ConcreteEnableAdbPreferenceController extends AbstractEnableAdbPreferenceController {
+ public ConcreteEnableAdbPreferenceController(Context context) {
+ super(context);
+ }
+
+ @Override
+ public void showConfirmationDialog(SwitchPreference preference) {
+ // Don't show a dialog, just set setting.
+ writeAdbSetting(true);
+ }
+ }
+}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/CategoryKeyTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/CategoryKeyTest.java
index 9fc8a96..6be44cc 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/CategoryKeyTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/CategoryKeyTest.java
@@ -56,12 +56,13 @@
allKeys.add(CategoryKey.CATEGORY_SECURITY);
allKeys.add(CategoryKey.CATEGORY_SECURITY_LOCKSCREEN);
allKeys.add(CategoryKey.CATEGORY_ACCOUNT);
+ allKeys.add(CategoryKey.CATEGORY_ACCOUNT_DETAIL);
allKeys.add(CategoryKey.CATEGORY_SYSTEM);
allKeys.add(CategoryKey.CATEGORY_SYSTEM_LANGUAGE);
allKeys.add(CategoryKey.CATEGORY_SYSTEM_DEVELOPMENT);
// DO NOT REMOVE ANYTHING ABOVE
- assertThat(allKeys.size()).isEqualTo(14);
+ assertThat(allKeys.size()).isEqualTo(15);
}
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/TileUtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/TileUtilsTest.java
index 0364418..e9ca753 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/TileUtilsTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/TileUtilsTest.java
@@ -18,11 +18,12 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Matchers.argThat;
-import static org.mockito.Matchers.eq;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.argThat;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
@@ -59,7 +60,6 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
-import org.mockito.ArgumentMatcher;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
@@ -100,6 +100,7 @@
MockitoAnnotations.initMocks(this);
when(mContext.getPackageManager()).thenReturn(mPackageManager);
when(mPackageManager.getResourcesForApplication(anyString())).thenReturn(mResources);
+ when(mPackageManager.getResourcesForApplication((String) isNull())).thenReturn(mResources);
when(mPackageManager.getApplicationInfo(eq("abc"), anyInt()))
.thenReturn(application.getApplicationInfo());
mContentResolver = spy(application.getContentResolver());
@@ -115,7 +116,6 @@
List<Tile> outTiles = new ArrayList<>();
List<ResolveInfo> info = new ArrayList<>();
info.add(newInfo(true, testCategory));
- Map<Pair<String, String>, Tile> cache = new ArrayMap<>();
when(mPackageManager.queryIntentActivitiesAsUser(eq(intent), anyInt(), anyInt()))
.thenReturn(info);
@@ -169,7 +169,6 @@
@Test
public void getTilesForIntent_shouldSkipFilteredApps() {
- final String testCategory = "category1";
Intent intent = new Intent();
Map<Pair<String, String>, Tile> addedCache = new ArrayMap<>();
List<Tile> outTiles = new ArrayList<>();
@@ -210,11 +209,9 @@
userHandleList.add(UserHandle.CURRENT);
when(mUserManager.getUserProfiles()).thenReturn(userHandleList);
- when(mPackageManager.queryIntentActivitiesAsUser(argThat(new ArgumentMatcher<Intent>() {
- public boolean matches(Object event) {
- return testAction.equals(((Intent) event).getAction());
- }
- }), anyInt(), anyInt())).thenReturn(info);
+ when(mPackageManager.queryIntentActivitiesAsUser(argThat(
+ event -> testAction.equals(event.getAction())), anyInt(), anyInt()))
+ .thenReturn(info);
List<DashboardCategory> categoryList = TileUtils.getCategories(
mContext, cache, false /* categoryDefinedInManifest */, testAction,
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/AccessPointPreferenceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/AccessPointPreferenceTest.java
index 335653b..7fe69a7 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/AccessPointPreferenceTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/AccessPointPreferenceTest.java
@@ -16,6 +16,8 @@
package com.android.settingslib.wifi;
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
import android.content.Context;
@@ -58,4 +60,22 @@
assertThat(AccessPointPreference.generatePreferenceKey(builder.build()))
.isEqualTo(expectedKey);
}
+
+ @Test
+ public void refresh_openNetwork_updateContentDescription() {
+ final String ssid = "ssid";
+ final String summary = "connected";
+ final int security = AccessPoint.SECURITY_WEP;
+ final AccessPoint ap = new TestAccessPointBuilder(mContext)
+ .setSsid(ssid)
+ .setSecurity(security)
+ .build();
+ final AccessPointPreference pref = mock(AccessPointPreference.class);
+ when(pref.getTitle()).thenReturn(ssid);
+ when(pref.getSummary()).thenReturn(summary);
+
+ assertThat(AccessPointPreference.buildContentDescription(
+ RuntimeEnvironment.application, pref, ap))
+ .isEqualTo("ssid,connected,Wifi signal full.,Secure network");
+ }
}
diff --git a/packages/SettingsProvider/res/values/defaults.xml b/packages/SettingsProvider/res/values/defaults.xml
index e9dadc5..4007cc9 100644
--- a/packages/SettingsProvider/res/values/defaults.xml
+++ b/packages/SettingsProvider/res/values/defaults.xml
@@ -187,4 +187,7 @@
<!-- default setting for Settings.System.END_BUTTON_BEHAVIOR : END_BUTTON_BEHAVIOR_SLEEP -->
<integer name="def_end_button_behavior">0x2</integer>
+
+ <!-- default setting for Settings.Global.DEFAULT_RESTRICT_BACKGROUND_DATA -->
+ <bool name="def_restrict_background_data">false</bool>
</resources>
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
index 533c52b..96f51c1 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
@@ -16,6 +16,7 @@
package com.android.providers.settings;
+import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.app.backup.BackupAgentHelper;
import android.app.backup.BackupDataInput;
@@ -30,7 +31,6 @@
import android.net.Uri;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
-import android.os.Handler;
import android.os.ParcelFileDescriptor;
import android.os.UserHandle;
import android.provider.Settings;
@@ -590,14 +590,18 @@
Log.i(TAG, "restoreSettings: " + contentUri);
}
- // Figure out the white list and redirects to the global table.
+ // Figure out the white list and redirects to the global table. We restore anything
+ // in either the backup whitelist or the legacy-restore whitelist for this table.
final String[] whitelist;
if (contentUri.equals(Settings.Secure.CONTENT_URI)) {
- whitelist = Settings.Secure.SETTINGS_TO_BACKUP;
+ whitelist = concat(Settings.Secure.SETTINGS_TO_BACKUP,
+ Settings.Secure.LEGACY_RESTORE_SETTINGS);
} else if (contentUri.equals(Settings.System.CONTENT_URI)) {
- whitelist = Settings.System.SETTINGS_TO_BACKUP;
+ whitelist = concat(Settings.System.SETTINGS_TO_BACKUP,
+ Settings.System.LEGACY_RESTORE_SETTINGS);
} else if (contentUri.equals(Settings.Global.CONTENT_URI)) {
- whitelist = Settings.Global.SETTINGS_TO_BACKUP;
+ whitelist = concat(Settings.Global.SETTINGS_TO_BACKUP,
+ Settings.Global.LEGACY_RESTORE_SETTINGS);
} else {
throw new IllegalArgumentException("Unknown URI: " + contentUri);
}
@@ -648,6 +652,18 @@
}
}
+ private final String[] concat(String[] first, @Nullable String[] second) {
+ if (second == null || second.length == 0) {
+ return first;
+ }
+ final int firstLen = first.length;
+ final int secondLen = second.length;
+ String[] both = new String[firstLen + secondLen];
+ System.arraycopy(first, 0, both, 0, firstLen);
+ System.arraycopy(second, 0, both, firstLen, secondLen);
+ return both;
+ }
+
/**
* Restores the owner info enabled and other settings in LockSettings.
*
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
index 8abdc64..6247b3b 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
@@ -16,6 +16,11 @@
package com.android.providers.settings;
+import com.android.internal.R;
+import com.android.internal.app.LocalePicker;
+import com.android.internal.annotations.VisibleForTesting;
+
+import android.annotation.NonNull;
import android.app.ActivityManager;
import android.app.IActivityManager;
import android.app.backup.IBackupManager;
@@ -24,11 +29,13 @@
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
+import android.icu.util.ULocale;
import android.location.LocationManager;
import android.media.AudioManager;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.IPowerManager;
+import android.os.LocaleList;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserHandle;
@@ -39,6 +46,9 @@
import android.util.ArraySet;
import android.util.Slog;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
import java.util.Locale;
public class SettingsHelper {
@@ -305,59 +315,106 @@
}
}
- byte[] getLocaleData() {
+ /* package */ byte[] getLocaleData() {
Configuration conf = mContext.getResources().getConfiguration();
- final Locale loc = conf.locale;
- String localeString = loc.getLanguage();
- String country = loc.getCountry();
- if (!TextUtils.isEmpty(country)) {
- localeString += "-" + country;
+ return conf.getLocales().toLanguageTags().getBytes();
+ }
+
+ private static Locale toFullLocale(@NonNull Locale locale) {
+ if (locale.getScript().isEmpty() || locale.getCountry().isEmpty()) {
+ return ULocale.addLikelySubtags(ULocale.forLocale(locale)).toLocale();
}
- return localeString.getBytes();
+ return locale;
}
/**
- * Sets the locale specified. Input data is the byte representation of a
- * BCP-47 language tag. For backwards compatibility, strings of the form
+ * Merging the locale came from backup server and current device locale.
+ *
+ * Merge works with following rules.
+ * - The backup locales are appended to the current locale with keeping order.
+ * e.g. current locale "en-US,zh-CN" and backup locale "ja-JP,ko-KR" are merged to
+ * "en-US,zh-CH,ja-JP,ko-KR".
+ *
+ * - Duplicated locales are dropped.
+ * e.g. current locale "en-US,zh-CN" and backup locale "ja-JP,zh-Hans-CN,en-US" are merged to
+ * "en-US,zh-CN,ja-JP".
+ *
+ * - Unsupported locales are dropped.
+ * e.g. current locale "en-US" and backup locale "ja-JP,zh-CN" but the supported locales
+ * are "en-US,zh-CN", the merged locale list is "en-US,zh-CN".
+ *
+ * - The final result locale list only contains the supported locales.
+ * e.g. current locale "en-US" and backup locale "zh-Hans-CN" and supported locales are
+ * "en-US,zh-CN", the merged locale list is "en-US,zh-CN".
+ *
+ * @param restore The locale list that came from backup server.
+ * @param current The device's locale setting.
+ * @param supportedLocales The list of language tags supported by this device.
+ */
+ @VisibleForTesting
+ public static LocaleList resolveLocales(LocaleList restore, LocaleList current,
+ String[] supportedLocales) {
+ final HashMap<Locale, Locale> allLocales = new HashMap<>(supportedLocales.length);
+ for (String supportedLocaleStr : supportedLocales) {
+ final Locale locale = Locale.forLanguageTag(supportedLocaleStr);
+ allLocales.put(toFullLocale(locale), locale);
+ }
+
+ final ArrayList<Locale> filtered = new ArrayList<>(current.size());
+ for (int i = 0; i < current.size(); i++) {
+ final Locale locale = current.get(i);
+ allLocales.remove(toFullLocale(locale));
+ filtered.add(locale);
+ }
+
+ for (int i = 0; i < restore.size(); i++) {
+ final Locale locale = allLocales.remove(toFullLocale(restore.get(i)));
+ if (locale != null) {
+ filtered.add(locale);
+ }
+ }
+
+ if (filtered.size() == current.size()) {
+ return current; // Nothing added to current locale list.
+ }
+
+ return new LocaleList(filtered.toArray(new Locale[filtered.size()]));
+ }
+
+ /**
+ * Sets the locale specified. Input data is the byte representation of comma separated
+ * multiple BCP-47 language tags. For backwards compatibility, strings of the form
* {@code ll_CC} are also accepted, where {@code ll} is a two letter language
* code and {@code CC} is a two letter country code.
*
- * @param data the locale string in bytes.
+ * @param data the comma separated BCP-47 language tags in bytes.
*/
- void setLocaleData(byte[] data, int size) {
- // Check if locale was set by the user:
- final ContentResolver cr = mContext.getContentResolver();
- final boolean userSetLocale = mContext.getResources().getConfiguration().userSetLocale;
- final boolean provisioned = Settings.Global.getInt(cr,
- Settings.Global.DEVICE_PROVISIONED, 0) != 0;
- if (userSetLocale || provisioned) {
- // Don't change if user set it in the SetupWizard, or if this is a post-setup
- // deferred restore operation
- Slog.i(TAG, "Not applying restored locale; "
- + (userSetLocale ? "user already specified" : "device already provisioned"));
+ /* package */ void setLocaleData(byte[] data, int size) {
+ final Configuration conf = mContext.getResources().getConfiguration();
+
+ // Replace "_" with "-" to deal with older backups.
+ final String localeCodes = new String(data, 0, size).replace('_', '-');
+ final LocaleList localeList = LocaleList.forLanguageTags(localeCodes);
+ if (localeList.isEmpty()) {
return;
}
- final String[] availableLocales = mContext.getAssets().getLocales();
- // Replace "_" with "-" to deal with older backups.
- String localeCode = new String(data, 0, size).replace('_', '-');
- Locale loc = null;
- for (int i = 0; i < availableLocales.length; i++) {
- if (availableLocales[i].equals(localeCode)) {
- loc = Locale.forLanguageTag(localeCode);
- break;
- }
+ final String[] supportedLocales = LocalePicker.getSupportedLocales(mContext);
+ final LocaleList currentLocales = conf.getLocales();
+
+ final LocaleList merged = resolveLocales(localeList, currentLocales, supportedLocales);
+ if (merged.equals(currentLocales)) {
+ return;
}
- if (loc == null) return; // Couldn't find the saved locale in this version of the software
try {
IActivityManager am = ActivityManager.getService();
Configuration config = am.getConfiguration();
- config.locale = loc;
+ config.setLocales(merged);
// indicate this isn't some passing default - the user wants this remembered
config.userSetLocale = true;
- am.updateConfiguration(config);
+ am.updatePersistentConfiguration(config);
} catch (RemoteException e) {
// Intentionally left blank
}
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index ad2ec0b..146b349 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -32,8 +32,6 @@
import android.content.pm.IPackageManager;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.content.pm.ServiceInfo;
import android.content.pm.UserInfo;
import android.content.res.Resources;
import android.database.Cursor;
@@ -61,7 +59,7 @@
import android.os.UserManager;
import android.os.UserManagerInternal;
import android.provider.Settings;
-import android.service.notification.NotificationListenerService;
+import android.provider.Settings.Global;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
@@ -82,7 +80,6 @@
import java.io.FileDescriptor;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
-import java.nio.charset.StandardCharsets;
import java.nio.ByteBuffer;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
@@ -2895,7 +2892,7 @@
}
private final class UpgradeController {
- private static final int SETTINGS_VERSION = 145;
+ private static final int SETTINGS_VERSION = 147;
private final int mUserId;
@@ -3166,33 +3163,7 @@
}
if (currentVersion == 128) {
- // Version 128: Allow OEMs to grant DND access to default apps. Note that
- // the new apps are appended to the list of already approved apps.
- final SettingsState systemSecureSettings =
- getSecureSettingsLocked(userId);
-
- final Setting policyAccess = systemSecureSettings.getSettingLocked(
- Settings.Secure.ENABLED_NOTIFICATION_POLICY_ACCESS_PACKAGES);
- String defaultPolicyAccess = getContext().getResources().getString(
- com.android.internal.R.string.config_defaultDndAccessPackages);
- if (!TextUtils.isEmpty(defaultPolicyAccess)) {
- if (policyAccess.isNull()) {
- systemSecureSettings.insertSettingLocked(
- Settings.Secure.ENABLED_NOTIFICATION_POLICY_ACCESS_PACKAGES,
- defaultPolicyAccess, null, true,
- SettingsState.SYSTEM_PACKAGE_NAME);
- } else {
- StringBuilder currentSetting =
- new StringBuilder(policyAccess.getValue());
- currentSetting.append(":");
- currentSetting.append(defaultPolicyAccess);
- systemSecureSettings.updateSettingLocked(
- Settings.Secure.ENABLED_NOTIFICATION_POLICY_ACCESS_PACKAGES,
- currentSetting.toString(), null, true,
- SettingsState.SYSTEM_PACKAGE_NAME);
- }
- }
-
+ // Version 128: Removed
currentVersion = 129;
}
@@ -3365,58 +3336,7 @@
}
if (currentVersion == 140) {
- // Version 141: One-time grant of notification listener privileges
- // to packages specified in overlay.
- String defaultListenerAccess = getContext().getResources().getString(
- com.android.internal.R.string.config_defaultListenerAccessPackages);
- if (defaultListenerAccess != null) {
- StringBuffer newListeners = new StringBuffer();
- for (String whitelistPkg : defaultListenerAccess.split(":")) {
- // Gather all notification listener components for candidate pkgs.
- Intent serviceIntent =
- new Intent(NotificationListenerService.SERVICE_INTERFACE)
- .setPackage(whitelistPkg);
- List<ResolveInfo> installedServices =
- getContext().getPackageManager().queryIntentServicesAsUser(
- serviceIntent,
- PackageManager.GET_SERVICES
- | PackageManager.GET_META_DATA
- | PackageManager.MATCH_DIRECT_BOOT_AWARE
- | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
- userId);
-
- for (int i = 0, count = installedServices.size(); i < count; i++) {
- ResolveInfo resolveInfo = installedServices.get(i);
- ServiceInfo info = resolveInfo.serviceInfo;
- if (!android.Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE
- .equals(info.permission)) {
- continue;
- }
- newListeners.append(":")
- .append(info.getComponentName().flattenToString());
- }
- }
-
- if (newListeners.length() > 0) {
- final SettingsState secureSetting = getSecureSettingsLocked(userId);
- final Setting existingSetting = secureSetting.getSettingLocked(
- Settings.Secure.ENABLED_NOTIFICATION_LISTENERS);
- if (existingSetting.isNull()) {
- secureSetting.insertSettingLocked(
- Settings.Secure.ENABLED_NOTIFICATION_LISTENERS,
- newListeners.toString(), null, true,
- SettingsState.SYSTEM_PACKAGE_NAME);
- } else {
- StringBuilder currentSetting =
- new StringBuilder(existingSetting.getValue());
- currentSetting.append(newListeners.toString());
- secureSetting.updateSettingLocked(
- Settings.Secure.ENABLED_NOTIFICATION_LISTENERS,
- currentSetting.toString(), null, true,
- SettingsState.SYSTEM_PACKAGE_NAME);
- }
- }
- }
+ // Version 141: Removed
currentVersion = 141;
}
@@ -3478,22 +3398,42 @@
}
if (currentVersion == 144) {
- // Version 145: Set the default value for WIFI_WAKEUP_AVAILABLE.
+ // Version 145: Removed
+ currentVersion = 145;
+ }
+
+ if (currentVersion == 145) {
+ // Version 146: Set the default value for WIFI_WAKEUP_AVAILABLE.
if (userId == UserHandle.USER_SYSTEM) {
final SettingsState globalSettings = getGlobalSettingsLocked();
final Setting currentSetting = globalSettings.getSettingLocked(
Settings.Global.WIFI_WAKEUP_AVAILABLE);
+ final int defaultValue = getContext().getResources().getInteger(
+ com.android.internal.R.integer.config_wifi_wakeup_available);
+ globalSettings.insertSettingLocked(
+ Settings.Global.WIFI_WAKEUP_AVAILABLE,
+ String.valueOf(defaultValue),
+ null, true, SettingsState.SYSTEM_PACKAGE_NAME);
+ }
+
+ currentVersion = 146;
+ }
+
+ if (currentVersion == 146) {
+ // Version 146: Set the default value for DEFAULT_RESTRICT_BACKGROUND_DATA.
+ if (userId == UserHandle.USER_SYSTEM) {
+ final SettingsState globalSettings = getGlobalSettingsLocked();
+ final Setting currentSetting = globalSettings.getSettingLocked(
+ Global.DEFAULT_RESTRICT_BACKGROUND_DATA);
if (currentSetting.isNull()) {
- final int defaultValue = getContext().getResources().getInteger(
- com.android.internal.R.integer.config_wifi_wakeup_available);
globalSettings.insertSettingLocked(
- Settings.Global.WIFI_WAKEUP_AVAILABLE,
- String.valueOf(defaultValue),
+ Global.DEFAULT_RESTRICT_BACKGROUND_DATA,
+ getContext().getResources().getBoolean(
+ R.bool.def_restrict_background_data) ? "1" : "0",
null, true, SettingsState.SYSTEM_PACKAGE_NAME);
}
}
-
- currentVersion = 145;
+ currentVersion = 147;
}
// vXXX: Add new settings above this point.
diff --git a/packages/SettingsProvider/test/Android.mk b/packages/SettingsProvider/test/Android.mk
index a4cbf34..a9707d4 100644
--- a/packages/SettingsProvider/test/Android.mk
+++ b/packages/SettingsProvider/test/Android.mk
@@ -4,12 +4,15 @@
LOCAL_MODULE_TAGS := tests
-# Note we statically link SettingsState to do some unit tests. It's not accessible otherwise
+# Note we statically link several classes to do some unit tests. It's not accessible otherwise
# because this test is not an instrumentation test. (because the target runs in the system process.)
LOCAL_SRC_FILES := $(call all-subdir-java-files) \
- ../src/com/android/providers/settings/SettingsState.java
+ ../src/com/android/providers/settings/SettingsState.java \
+ ../src/com/android/providers/settings/SettingsHelper.java
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-test legacy-android-test
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-test
+
+LOCAL_JAVA_LIBRARIES := legacy-android-test
LOCAL_PACKAGE_NAME := SettingsProviderTest
diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsHelperTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsHelperTest.java
new file mode 100644
index 0000000..6fa014d
--- /dev/null
+++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsHelperTest.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.providers.settings;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertSame;
+import static junit.framework.Assert.assertNull;
+import static junit.framework.Assert.fail;
+
+import com.android.internal.app.LocalePicker;
+import com.android.providers.settings.SettingsHelper;
+
+import android.os.LocaleList;
+import android.support.test.runner.AndroidJUnit4;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Tests for the SettingsHelperTest
+ */
+@RunWith(AndroidJUnit4.class)
+public class SettingsHelperTest {
+ @Test
+ public void testResolveLocales() throws Exception {
+ // Empty string from backup server
+ assertEquals(LocaleList.forLanguageTags("en-US"),
+ SettingsHelper.resolveLocales(
+ LocaleList.forLanguageTags(""), // restore
+ LocaleList.forLanguageTags("en-US"), // current
+ new String[] { "en-US" })); // supported
+
+ // Same as current settings
+ assertEquals(LocaleList.forLanguageTags("en-US"),
+ SettingsHelper.resolveLocales(
+ LocaleList.forLanguageTags("en-US"), // restore
+ LocaleList.forLanguageTags("en-US"), // current
+ new String[] { "en-US" })); // supported
+
+ assertEquals(LocaleList.forLanguageTags("en-US,ja-JP"),
+ SettingsHelper.resolveLocales(
+ LocaleList.forLanguageTags("en-US,ja-JP"), // restore
+ LocaleList.forLanguageTags("en-US,ja-JP"), // current
+ new String[] { "en-US", "ja-JP" })); // supported
+
+ // Current locale must be kept at the first place.
+ assertEquals(LocaleList.forLanguageTags("ja-JP,en-US"),
+ SettingsHelper.resolveLocales(
+ LocaleList.forLanguageTags("en-US"), // restore
+ LocaleList.forLanguageTags("ja-JP"), // current
+ new String[] { "en-US", "ja-JP" })); // supported
+
+ assertEquals(LocaleList.forLanguageTags("ja-JP,ko-KR,en-US"),
+ SettingsHelper.resolveLocales(
+ LocaleList.forLanguageTags("en-US"), // restore
+ LocaleList.forLanguageTags("ja-JP,ko-KR"), // current
+ new String[] { "en-US", "ja-JP", "ko-KR" })); // supported
+
+ assertEquals(LocaleList.forLanguageTags("ja-JP,en-US,ko-KR"),
+ SettingsHelper.resolveLocales(
+ LocaleList.forLanguageTags("en-US,ko-KR"), // restore
+ LocaleList.forLanguageTags("ja-JP"), // current
+ new String[] { "en-US", "ja-JP", "ko-KR" })); // supported
+
+ // Duplicated entries must be removed.
+ assertEquals(LocaleList.forLanguageTags("ja-JP,ko-KR,en-US"),
+ SettingsHelper.resolveLocales(
+ LocaleList.forLanguageTags("en-US,ko-KR"), // restore
+ LocaleList.forLanguageTags("ja-JP,ko-KR"), // current
+ new String[] { "en-US", "ja-JP", "ko-KR" })); // supported
+
+ // Drop unsupported locales.
+ assertEquals(LocaleList.forLanguageTags("en-US"),
+ SettingsHelper.resolveLocales(
+ LocaleList.forLanguageTags("en-US,zh-CN"), // restore
+ LocaleList.forLanguageTags("en-US"), // current
+ new String[] { "en-US" })); // supported
+
+ // Comparison happens on fully-expanded locale.
+ assertEquals(LocaleList.forLanguageTags("en-US,sr-Latn-SR,sr-Cryl-SR"),
+ SettingsHelper.resolveLocales(
+ LocaleList.forLanguageTags("sr-Cryl-SR"), // restore
+ LocaleList.forLanguageTags("en-US,sr-Latn-SR"), // current
+ new String[] { "en-US", "sr-Latn-SR", "sr-Cryl-SR" })); // supported
+
+ assertEquals(LocaleList.forLanguageTags("en-US"),
+ SettingsHelper.resolveLocales(
+ LocaleList.forLanguageTags("kk-Cryl-KZ"), // restore
+ LocaleList.forLanguageTags("en-US"), // current
+ new String[] { "en-US", "kk-Latn-KZ" })); // supported
+
+ assertEquals(LocaleList.forLanguageTags("en-US,kk-Cryl-KZ"),
+ SettingsHelper.resolveLocales(
+ LocaleList.forLanguageTags("kk-Cryl-KZ"), // restore
+ LocaleList.forLanguageTags("en-US"), // current
+ new String[] { "en-US", "kk-Cryl-KZ" })); // supported
+
+ assertEquals(LocaleList.forLanguageTags("en-US,zh-CN"),
+ SettingsHelper.resolveLocales(
+ LocaleList.forLanguageTags("zh-Hans-CN"), // restore
+ LocaleList.forLanguageTags("en-US"), // current
+ new String[] { "en-US", "zh-CN" })); // supported
+
+ assertEquals(LocaleList.forLanguageTags("en-US,zh-Hans-CN"),
+ SettingsHelper.resolveLocales(
+ LocaleList.forLanguageTags("zh-CN"), // restore
+ LocaleList.forLanguageTags("en-US"), // current
+ new String[] { "en-US", "zh-Hans-CN" })); // supported
+
+ // Old langauge code should be updated.
+ assertEquals(LocaleList.forLanguageTags("en-US,he-IL,id-ID,yi"),
+ SettingsHelper.resolveLocales(
+ LocaleList.forLanguageTags("iw-IL,in-ID,ji"), // restore
+ LocaleList.forLanguageTags("en-US"), // current
+ new String[] { "he-IL", "id-ID", "yi" })); // supported
+ }
+}
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index e6d9a9a..2446775 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -114,6 +114,7 @@
<uses-permission android:name="android.permission.GET_APP_OPS_STATS" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.MANAGE_ACTIVITY_STACKS" />
+ <uses-permission android:name="android.permission.ACTIVITY_EMBEDDING" />
<uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" />
<uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE" />
<uses-permission android:name="android.permission.MANAGE_AUTO_FILL" />
diff --git a/packages/Shell/res/layout/dialog_bugreport_info.xml b/packages/Shell/res/layout/dialog_bugreport_info.xml
index bb3084f..4bd8711 100644
--- a/packages/Shell/res/layout/dialog_bugreport_info.xml
+++ b/packages/Shell/res/layout/dialog_bugreport_info.xml
@@ -19,39 +19,51 @@
android:paddingTop="15dp"
android:paddingStart="24dp"
android:paddingEnd="24dp"
- android:focusableInTouchMode="true"
+ android:focusableInTouchMode="false"
+ android:focusable="false"
+ android:importantForAutofill="noExcludeDescendants"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
+ android:focusableInTouchMode="false"
+ android:focusable="false"
android:inputType="textNoSuggestions"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/bugreport_info_name"/>
<EditText
android:id="@+id/name"
+ android:nextFocusDown="@+id/title"
android:maxLength="30"
android:singleLine="true"
android:inputType="textNoSuggestions"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
+ android:focusableInTouchMode="false"
+ android:focusable="false"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/bugreport_info_title"/>
<EditText
android:id="@+id/title"
+ android:nextFocusUp="@+id/name"
+ android:nextFocusDown="@+id/description"
android:maxLength="80"
android:singleLine="true"
android:inputType="textAutoCorrect|textCapSentences"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
+ android:focusableInTouchMode="false"
+ android:focusable="false"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:editable="false"
android:text="@string/bugreport_info_description"/>
<EditText
android:id="@+id/description"
+ android:nextFocusUp="@+id/title"
android:singleLine="false"
android:inputType="textMultiLine|textAutoCorrect|textCapSentences"
android:layout_width="match_parent"
diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java
index 988b986..a8b184c 100644
--- a/packages/Shell/src/com/android/shell/BugreportProgressService.java
+++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java
@@ -1060,7 +1060,6 @@
}
return new Notification.Builder(context, NOTIFICATION_CHANNEL_ID)
.addExtras(sNotificationBundle)
- .setCategory(Notification.CATEGORY_SYSTEM)
.setSmallIcon(
isTv(context) ? R.drawable.ic_bug_report_black_24dp
: com.android.internal.R.drawable.stat_sys_adb)
diff --git a/packages/Shell/src/com/android/shell/BugreportWarningActivity.java b/packages/Shell/src/com/android/shell/BugreportWarningActivity.java
index bdf4171..2191d93 100644
--- a/packages/Shell/src/com/android/shell/BugreportWarningActivity.java
+++ b/packages/Shell/src/com/android/shell/BugreportWarningActivity.java
@@ -64,7 +64,7 @@
final int state = getWarningState(this, STATE_UNKNOWN);
final boolean checked;
- if (Build.TYPE.equals("user")) {
+ if (Build.IS_USER) {
checked = state == STATE_HIDE; // Only checks if specifically set to.
} else {
checked = state != STATE_SHOW; // Checks by default.
diff --git a/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java b/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java
index 8bfcc74..e69b0a8 100644
--- a/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java
+++ b/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java
@@ -577,7 +577,7 @@
mUiBot.getVisibleObject(mContext.getString(R.string.bugreport_confirm_dont_repeat));
final boolean firstTime = propertyState == null || propertyState == STATE_UNKNOWN;
if (firstTime) {
- if (Build.TYPE.equals("user")) {
+ if (Build.IS_USER) {
assertFalse("Checkbox should NOT be checked by default on user builds",
dontShowAgain.isChecked());
mUiBot.click(dontShowAgain, "dont-show-again");
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 47ffa5c..24f6c13 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -271,21 +271,9 @@
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<meta-data android:name="com.android.settings.category"
- android:value="com.android.settings.category.system" />
+ android:value="com.android.settings.category.ia.system" />
</activity>
- <activity-alias android:name=".tuner.TunerSettingLink"
- android:targetActivity=".tuner.TunerActivity"
- android:enabled="false"
- android:process=":tuner">
- <intent-filter android:priority="1">
- <action android:name="com.android.settings.action.EXTRA_SETTINGS" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- <meta-data android:name="com.android.settings.category"
- android:value="com.android.settings.category.ia.system" />
- </activity-alias>
-
<activity-alias android:name=".DemoMode"
android:targetActivity=".tuner.TunerActivity"
android:icon="@drawable/tuner"
@@ -411,7 +399,8 @@
<!-- started from PipUI -->
<activity
android:name=".pip.tv.PipMenuActivity"
- android:exported="true"
+ android:permission="com.android.systemui.permission.SELF"
+ android:exported="false"
android:theme="@style/PipTheme"
android:launchMode="singleTop"
android:taskAffinity=""
@@ -420,24 +409,10 @@
android:supportsPictureInPicture="true"
androidprv:alwaysFocusable="true"
android:excludeFromRecents="true" />
- <activity
- android:name=".pip.tv.PipOverlayActivity"
- android:exported="true"
- android:theme="@style/PipTheme"
- android:taskAffinity=""
- android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation|locale|layoutDirection"
- android:resizeableActivity="true"
- android:supportsPictureInPicture="true"
- android:excludeFromRecents="true" />
- <activity
- android:name=".pip.tv.PipOnboardingActivity"
- android:exported="true"
- android:theme="@style/PipTheme"
- android:launchMode="singleTop"
- android:excludeFromRecents="true" />
<activity
android:name=".pip.phone.PipMenuActivity"
+ android:permission="com.android.systemui.permission.SELF"
android:theme="@style/PipPhoneOverlayControlTheme"
android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout"
android:excludeFromRecents="true"
@@ -455,7 +430,6 @@
android:exported="true"
android:label="@string/dessert_case"
android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
- android:hardwareAccelerated="true"
android:launchMode="singleInstance"
android:screenOrientation="locked"
android:process=":sweetsweetdesserts"
@@ -471,7 +445,6 @@
android:exported="true"
android:icon="@drawable/icon"
android:label="@string/mland"
- android:hardwareAccelerated="true"
android:launchMode="singleInstance"
android:screenOrientation="locked"
android:process=":sweetsweetdesserts"
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java
index d571243..a648345e 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java
@@ -31,9 +31,9 @@
@DependsOn(target = HeightListener.class)
public interface QS extends FragmentBase {
- public static final String ACTION = "com.android.systemui.action.PLUGIN_QS";
+ String ACTION = "com.android.systemui.action.PLUGIN_QS";
- public static final int VERSION = 6;
+ int VERSION = 6;
String TAG = "QS";
@@ -66,8 +66,8 @@
}
@ProvidesInterface(version = HeightListener.VERSION)
- public interface HeightListener {
- public static final int VERSION = 1;
+ interface HeightListener {
+ int VERSION = 1;
void onQsHeightChanged();
}
diff --git a/packages/SystemUI/res/drawable/car_qs_background_primary.xml b/packages/SystemUI/res/drawable/car_qs_background_primary.xml
new file mode 100644
index 0000000..0f77987
--- /dev/null
+++ b/packages/SystemUI/res/drawable/car_qs_background_primary.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+<inset xmlns:android="http://schemas.android.com/apk/res/android">
+ <shape>
+ <solid android:color="?android:attr/colorPrimaryDark"/>
+ </shape>
+</inset>
diff --git a/packages/SystemUI/res/drawable/recents_low_ram_stack_button_background.xml b/packages/SystemUI/res/drawable/recents_low_ram_stack_button_background.xml
new file mode 100644
index 0000000..db2eb3a
--- /dev/null
+++ b/packages/SystemUI/res/drawable/recents_low_ram_stack_button_background.xml
@@ -0,0 +1,22 @@
+<!--
+ ~ Copyright (C) 2017 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<shape xmlns:android="http://schemas.android.com/apk/res/android" >
+
+ <corners android:radius="@dimen/borderless_button_radius" />
+
+ <solid android:color="#CC000000" />
+
+</shape>
diff --git a/packages/SystemUI/res/layout/car_fullscreen_user_switcher.xml b/packages/SystemUI/res/layout/car_fullscreen_user_switcher.xml
index c82eddc..257e281 100644
--- a/packages/SystemUI/res/layout/car_fullscreen_user_switcher.xml
+++ b/packages/SystemUI/res/layout/car_fullscreen_user_switcher.xml
@@ -35,6 +35,10 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
+ <include layout="@layout/car_status_bar_header"
+ android:theme="@android:style/Theme"
+ android:layout_alignParentTop="true"/>
+
<!-- This progress bar is the countdown timer. -->
<ProgressBar
android:id="@+id/countdown_progress"
diff --git a/packages/SystemUI/res/layout/car_qs_footer.xml b/packages/SystemUI/res/layout/car_qs_footer.xml
new file mode 100644
index 0000000..96f34fc
--- /dev/null
+++ b/packages/SystemUI/res/layout/car_qs_footer.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+<!-- extends RelativeLayout -->
+<com.android.systemui.qs.car.CarQSFooter
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/qs_footer"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/qs_footer_height"
+ android:baselineAligned="false"
+ android:clickable="false"
+ android:clipChildren="false"
+ android:clipToPadding="false"
+ android:paddingBottom="16dp"
+ android:paddingTop="16dp"
+ android:paddingEnd="32dp"
+ android:paddingStart="32dp"
+ android:gravity="center_vertical">
+
+ <com.android.systemui.statusbar.phone.MultiUserSwitch
+ android:id="@+id/multi_user_switch"
+ android:layout_alignParentStart="true"
+ android:layout_centerVertical="true"
+ android:layout_width="48dp"
+ android:layout_height="48dp"
+ android:background="@drawable/ripple_drawable"
+ android:focusable="true">
+
+ <ImageView
+ android:id="@+id/multi_user_avatar"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_gravity="center"
+ android:scaleType="centerInside"/>
+ </com.android.systemui.statusbar.phone.MultiUserSwitch>
+
+ <com.android.systemui.statusbar.phone.SettingsButton
+ android:id="@+id/settings_button"
+ android:layout_alignParentEnd="true"
+ android:layout_centerVertical="true"
+ android:layout_width="48dp"
+ android:layout_height="48dp"
+ android:background="@drawable/ripple_drawable"
+ android:contentDescription="@string/accessibility_quick_settings_settings"
+ android:scaleType="centerCrop"
+ android:src="@drawable/ic_settings_16dp"
+ android:tint="?android:attr/colorForeground"
+ style="@android:style/Widget.Material.Button.Borderless" />
+
+</com.android.systemui.qs.car.CarQSFooter>
diff --git a/packages/SystemUI/res/layout/car_qs_panel.xml b/packages/SystemUI/res/layout/car_qs_panel.xml
new file mode 100644
index 0000000..d1f7ff8
--- /dev/null
+++ b/packages/SystemUI/res/layout/car_qs_panel.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/quick_settings_container"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="@drawable/car_qs_background_primary"
+ android:orientation="vertical"
+ android:elevation="4dp">
+
+ <include layout="@layout/car_status_bar_header" />
+ <include layout="@layout/car_qs_footer" />
+</LinearLayout>
diff --git a/packages/SystemUI/res/layout/car_status_bar_header.xml b/packages/SystemUI/res/layout/car_status_bar_header.xml
new file mode 100644
index 0000000..158907e
--- /dev/null
+++ b/packages/SystemUI/res/layout/car_status_bar_header.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+<!-- Extends RelativeLayout -->
+<com.android.systemui.qs.car.CarStatusBarHeader
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:systemui="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/header"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/car_qs_header_system_icons_area_height"
+ android:paddingStart="8dp"
+ android:paddingEnd="8dp" >
+
+ <include
+ layout="@layout/system_icons"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_alignParentStart="true"
+ android:layout_centerVertical="true" />
+
+ <com.android.systemui.statusbar.policy.Clock
+ android:id="@+id/clock"
+ android:textAppearance="@style/TextAppearance.StatusBar.Clock"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_alignParentEnd="true"
+ android:layout_centerVertical="true"
+ android:singleLine="true"
+ android:paddingStart="@dimen/status_bar_clock_starting_padding"
+ android:paddingEnd="@dimen/status_bar_clock_end_padding"
+ systemui:showDark="false" />
+</com.android.systemui.qs.car.CarStatusBarHeader>
diff --git a/packages/SystemUI/res/layout/preference_widget_switch.xml b/packages/SystemUI/res/layout/preference_widget_switch.xml
deleted file mode 100644
index 49610de..0000000
--- a/packages/SystemUI/res/layout/preference_widget_switch.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2015 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.
--->
-
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content">
-
- <RadioButton
- android:id="@+id/radio_button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:clickable="false"
- android:focusable="false"
- android:layout_marginEnd="4dp" />
-
- <View
- android:layout_width="1dp"
- android:layout_height="match_parent"
- android:background="?android:attr/listDivider" />
-
- <Switch
- android:id="@*android:id/switch_widget"
- android:layout_width="50dp"
- android:layout_height="wrap_content"
- android:focusable="false"
- android:clickable="false"
- android:background="@null" />
-
-</LinearLayout>
diff --git a/packages/SystemUI/res/layout/qs_footer.xml b/packages/SystemUI/res/layout/qs_footer.xml
deleted file mode 100644
index db39905..0000000
--- a/packages/SystemUI/res/layout/qs_footer.xml
+++ /dev/null
@@ -1,117 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-** Copyright 2012, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
--->
-
-<!-- Extends RelativeLayout -->
-<com.android.systemui.qs.QSFooter
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/header"
- android:layout_width="match_parent"
- android:layout_height="48dp"
- android:baselineAligned="false"
- android:clickable="false"
- android:clipChildren="false"
- android:clipToPadding="false"
- android:paddingTop="0dp"
- android:gravity="center_vertical"
- android:orientation="horizontal">
-
- <include
- android:id="@+id/date_time_alarm_group"
- layout="@layout/status_bar_alarm_group"
- android:layout_marginStart="16dp"
- android:layout_marginEnd="8dp"
- android:layout_width="wrap_content"
- android:layout_height="match_parent" />
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginStart="16dp"
- android:layout_marginEnd="8dp"
- android:gravity="end">
-
- <com.android.systemui.statusbar.phone.MultiUserSwitch
- android:id="@+id/multi_user_switch"
- android:layout_width="48dp"
- android:layout_height="48dp"
- android:layout_alignParentEnd="true"
- android:background="@drawable/ripple_drawable"
- android:focusable="true">
-
- <ImageView
- android:id="@+id/multi_user_avatar"
- android:layout_width="@dimen/multi_user_avatar_expanded_size"
- android:layout_height="@dimen/multi_user_avatar_expanded_size"
- android:layout_gravity="center"
- android:scaleType="centerInside"/>
- </com.android.systemui.statusbar.phone.MultiUserSwitch>
-
- <com.android.systemui.statusbar.AlphaOptimizedImageView
- android:id="@android:id/edit"
- android:layout_width="48dp"
- android:layout_height="48dp"
- android:background="?android:attr/selectableItemBackgroundBorderless"
- android:clickable="true"
- android:clipToPadding="false"
- android:contentDescription="@string/accessibility_quick_settings_edit"
- android:focusable="true"
- android:padding="16dp"
- android:src="@drawable/ic_mode_edit"
- android:tint="?android:attr/colorForeground"/>
-
- <com.android.systemui.statusbar.AlphaOptimizedFrameLayout
- android:id="@+id/settings_button_container"
- android:layout_width="48dp"
- android:layout_height="48dp"
- android:clipChildren="false"
- android:clipToPadding="false">
-
- <com.android.systemui.statusbar.phone.SettingsButton
- android:id="@+id/settings_button"
- style="@android:style/Widget.Material.Button.Borderless"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="@drawable/ripple_drawable"
- android:contentDescription="@string/accessibility_quick_settings_settings"
- android:src="@drawable/ic_settings_16dp"
- android:tint="?android:attr/colorForeground"/>
-
- <com.android.systemui.statusbar.AlphaOptimizedImageView
- android:id="@+id/tuner_icon"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingStart="36dp"
- android:paddingEnd="4dp"
- android:src="@drawable/tuner"
- android:tint="?android:attr/textColorTertiary"
- android:visibility="invisible"/>
-
- </com.android.systemui.statusbar.AlphaOptimizedFrameLayout>
-
- <com.android.systemui.statusbar.phone.ExpandableIndicator
- android:id="@+id/expand_indicator"
- android:layout_width="48dp"
- android:layout_height="48dp"
- android:clipToPadding="false"
- android:clickable="true"
- android:focusable="true"
- android:background="?android:attr/selectableItemBackgroundBorderless"
- android:contentDescription="@string/accessibility_quick_settings_expand"
- android:padding="14dp" />
- </LinearLayout>
-
-</com.android.systemui.qs.QSFooter>
diff --git a/packages/SystemUI/res/layout/qs_footer_impl.xml b/packages/SystemUI/res/layout/qs_footer_impl.xml
new file mode 100644
index 0000000..43e88ba
--- /dev/null
+++ b/packages/SystemUI/res/layout/qs_footer_impl.xml
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+** Copyright 2012, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+-->
+
+<!-- Extends FrameLayout -->
+<com.android.systemui.qs.QSFooterImpl
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/qs_footer"
+ android:layout_width="match_parent"
+ android:layout_height="48dp"
+ android:baselineAligned="false"
+ android:clickable="false"
+ android:clipChildren="false"
+ android:clipToPadding="false"
+ android:paddingTop="0dp"
+ android:gravity="center_vertical"
+ android:orientation="horizontal">
+
+ <include
+ android:id="@+id/date_time_alarm_group"
+ layout="@layout/status_bar_alarm_group"
+ android:layout_marginStart="16dp"
+ android:layout_marginEnd="8dp"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent" />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="16dp"
+ android:layout_marginEnd="8dp"
+ android:gravity="end">
+
+ <com.android.systemui.statusbar.phone.MultiUserSwitch
+ android:id="@+id/multi_user_switch"
+ android:layout_width="48dp"
+ android:layout_height="48dp"
+ android:layout_alignParentEnd="true"
+ android:background="@drawable/ripple_drawable"
+ android:focusable="true">
+
+ <ImageView
+ android:id="@+id/multi_user_avatar"
+ android:layout_width="@dimen/multi_user_avatar_expanded_size"
+ android:layout_height="@dimen/multi_user_avatar_expanded_size"
+ android:layout_gravity="center"
+ android:scaleType="centerInside"/>
+ </com.android.systemui.statusbar.phone.MultiUserSwitch>
+
+ <com.android.systemui.statusbar.AlphaOptimizedImageView
+ android:id="@android:id/edit"
+ android:layout_width="48dp"
+ android:layout_height="48dp"
+ android:background="?android:attr/selectableItemBackgroundBorderless"
+ android:clickable="true"
+ android:clipToPadding="false"
+ android:contentDescription="@string/accessibility_quick_settings_edit"
+ android:focusable="true"
+ android:padding="16dp"
+ android:src="@drawable/ic_mode_edit"
+ android:tint="?android:attr/colorForeground"/>
+
+ <com.android.systemui.statusbar.AlphaOptimizedFrameLayout
+ android:id="@+id/settings_button_container"
+ android:layout_width="48dp"
+ android:layout_height="48dp"
+ android:clipChildren="false"
+ android:clipToPadding="false">
+
+ <com.android.systemui.statusbar.phone.SettingsButton
+ android:id="@+id/settings_button"
+ style="@android:style/Widget.Material.Button.Borderless"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@drawable/ripple_drawable"
+ android:contentDescription="@string/accessibility_quick_settings_settings"
+ android:src="@drawable/ic_settings_16dp"
+ android:tint="?android:attr/colorForeground"/>
+
+ <com.android.systemui.statusbar.AlphaOptimizedImageView
+ android:id="@+id/tuner_icon"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:paddingStart="36dp"
+ android:paddingEnd="4dp"
+ android:src="@drawable/tuner"
+ android:tint="?android:attr/textColorTertiary"
+ android:visibility="invisible"/>
+
+ </com.android.systemui.statusbar.AlphaOptimizedFrameLayout>
+
+ <com.android.systemui.statusbar.phone.ExpandableIndicator
+ android:id="@+id/expand_indicator"
+ android:layout_width="48dp"
+ android:layout_height="48dp"
+ android:clipToPadding="false"
+ android:clickable="true"
+ android:focusable="true"
+ android:background="?android:attr/selectableItemBackgroundBorderless"
+ android:contentDescription="@string/accessibility_quick_settings_expand"
+ android:padding="14dp" />
+ </LinearLayout>
+
+</com.android.systemui.qs.QSFooterImpl>
diff --git a/packages/SystemUI/res/layout/qs_panel.xml b/packages/SystemUI/res/layout/qs_panel.xml
index 87101e4..5541f3d 100644
--- a/packages/SystemUI/res/layout/qs_panel.xml
+++ b/packages/SystemUI/res/layout/qs_panel.xml
@@ -32,8 +32,7 @@
<include layout="@layout/quick_status_bar_expanded_header" />
- <include android:id="@+id/qs_footer"
- layout="@layout/qs_footer" />
+ <include layout="@layout/qs_footer_impl" />
<include android:id="@+id/qs_detail" layout="@layout/qs_detail" />
diff --git a/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml b/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml
index f8b7b8a..e8b418c 100644
--- a/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml
+++ b/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml
@@ -18,7 +18,6 @@
<!-- Extends RelativeLayout -->
<com.android.systemui.qs.QuickStatusBarHeader
xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:systemui="http://schemas.android.com/apk/res-auto"
android:id="@+id/header"
android:layout_width="match_parent"
android:layout_height="@dimen/status_bar_header_height"
@@ -31,46 +30,7 @@
android:paddingEnd="0dp"
android:paddingStart="0dp">
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="40dp"
- android:layout_alignParentEnd="true"
- android:clipChildren="false"
- android:clipToPadding="false"
- android:gravity="center"
- android:paddingStart="8dp"
- android:paddingEnd="8dp"
- android:orientation="horizontal">
-
-
- <com.android.keyguard.CarrierText
- android:id="@+id/qs_carrier_text"
- android:layout_width="0dp"
- android:layout_height="match_parent"
- android:layout_weight="1"
- android:gravity="center_vertical|start"
- android:ellipsize="marquee"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?android:attr/textColorPrimary"
- android:singleLine="true" />
-
- <com.android.systemui.BatteryMeterView android:id="@+id/battery"
- android:layout_height="match_parent"
- android:layout_width="wrap_content"
- />
-
- <com.android.systemui.statusbar.policy.Clock
- android:id="@+id/clock"
- android:textAppearance="@style/TextAppearance.StatusBar.Clock"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:singleLine="true"
- android:paddingStart="@dimen/status_bar_clock_starting_padding"
- android:paddingEnd="@dimen/status_bar_clock_end_padding"
- android:gravity="center_vertical|start"
- systemui:showDark="false"
- />
- </LinearLayout>
+ <include layout="@layout/quick_status_bar_header_system_icons" />
<com.android.systemui.qs.QuickQSPanel
android:id="@+id/quick_qs_panel"
diff --git a/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml b/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml
new file mode 100644
index 0000000..849bea4
--- /dev/null
+++ b/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+** Copyright 2017, 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.
+-->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:systemui="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/qs_header_system_icons_area_height"
+ android:layout_alignParentEnd="true"
+ android:clipChildren="false"
+ android:clipToPadding="false"
+ android:gravity="center"
+ android:paddingStart="8dp"
+ android:paddingEnd="8dp"
+ android:orientation="horizontal">
+
+
+ <com.android.keyguard.CarrierText
+ android:id="@+id/qs_carrier_text"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:gravity="center_vertical|start"
+ android:ellipsize="marquee"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textColor="?android:attr/textColorPrimary"
+ android:singleLine="true" />
+
+ <com.android.systemui.BatteryMeterView android:id="@+id/battery"
+ android:layout_height="match_parent"
+ android:layout_width="wrap_content"
+ />
+
+ <com.android.systemui.statusbar.policy.Clock
+ android:id="@+id/clock"
+ android:textAppearance="@style/TextAppearance.StatusBar.Clock"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:singleLine="true"
+ android:paddingStart="@dimen/status_bar_clock_starting_padding"
+ android:paddingEnd="@dimen/status_bar_clock_end_padding"
+ android:gravity="center_vertical|start"
+ systemui:showDark="false"
+ />
+</LinearLayout>
diff --git a/packages/SystemUI/res/layout/recents_low_ram_stack_action_button.xml b/packages/SystemUI/res/layout/recents_low_ram_stack_action_button.xml
new file mode 100644
index 0000000..dca8911
--- /dev/null
+++ b/packages/SystemUI/res/layout/recents_low_ram_stack_action_button.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2017 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.
+ -->
+<TextView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingStart="26dp"
+ android:paddingEnd="26dp"
+ android:paddingTop="17dp"
+ android:paddingBottom="17dp"
+ android:text="@string/recents_stack_action_button_label"
+ android:textSize="14sp"
+ android:textColor="#FFFFFF"
+ android:textAllCaps="true"
+ android:fontFamily="sans-serif-medium"
+ android:background="@drawable/recents_low_ram_stack_button_background"
+ android:visibility="invisible"
+ android:forceHasOverlappingRendering="false"
+ style="?attr/clearAllStyle" />
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index bc8e342..2533b50 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Soek"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Gly op vir <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Gly links vir <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Jy sal nie deur geluide en vibrasies gepla word nie, behalwe deur wekkers, herinneringe, geleenthede en bellers wat jy spesifiseer. Jy sal steeds enigiets hoor wat jy kies om te speel, insluitend musiek, video\'s en speletjies."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Jy sal nie deur geluide en vibrasies gepla word nie, behalwe deur wekkers. Jy sal steeds enigiets hoor wat jy kies om te speel, insluitend musiek, video\'s en speletjies."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Jy sal nie deur geluide en vibrasies gepla word nie, behalwe deur wekkers, herinneringe, geleenthede en bellers wat jy spesifiseer. Jy sal steeds enigiets hoor wat jy kies om te speel, insluitend musiek, video\'s en speletjies."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Jy sal nie deur geluide en vibrasies gepla word nie, behalwe deur wekkers. Jy sal steeds enigiets hoor wat jy kies om te speel, insluitend musiek, video\'s en speletjies."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Pasmaak"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Dit blokkeer ALLE klanke en vibrasies, insluitend van wekkers, musiek, video\'s en speletjies af. Jy sal steeds foonoproepe kan maak."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Dit blokkeer ALLE klanke en vibrasies, insluitend van wekkers, musiek, video\'s en speletjies af. Jy sal steeds foonoproepe kan maak."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Dit blokkeer ALLE klanke en vibrasies, insluitend van wekkers, musiek, video\'s en speletjies af."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Minder dringende kennisgewings hieronder"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Sleep af om toe te maak"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Prent op prent-kieslys"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> is in beeld-in-beeld"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"As jy nie wil hê dat <xliff:g id="NAME">%s</xliff:g> hierdie kenmerk gebruik nie, tik om instellings oop te maak en skakel dit af."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"As jy nie wil hê dat <xliff:g id="NAME">%s</xliff:g> hierdie kenmerk moet gebruik nie, tik om instellings oop te maak en skakel dit af."</string>
<string name="pip_play" msgid="1417176722760265888">"Speel"</string>
<string name="pip_pause" msgid="8881063404466476571">"Laat wag"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Slaan oor na volgende"</string>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index 7c7d166..f524201 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"ፍለጋ"</string>
<string name="description_direction_up" msgid="7169032478259485180">"ለ<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ወደ ላይ አንሸራትት።"</string>
<string name="description_direction_left" msgid="7207478719805562165">"ለ<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ወደ ግራ አንሸራትት።"</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"እርስዎ ከወሰንዋቸው ማንቂያዎች፣ አስታዋሾች፣ ክስተቶች እና ደዋዮች በስተቀር፣ በድምጾች እና ንዝረቶች አይረበሹም። ሙዚቃ፣ ቪዲዮዎች እና ጨዋታዎች ጨምሮ ለመጫወት የሚመርጡትን ማንኛውም ነገር አሁንም ይሰማሉ።"</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"ከማንቂያዎች በስተቀር፣ በድምጾች እና ንዝረቶች አይረበሹም። ሙዚቃ፣ ቪዲዮዎች እና ጨዋታዎች ጨምሮ ለመጫወት የሚመርጡትን ማንኛውም ነገር አሁንም ይሰማሉ።"</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"እርስዎ ከወሰንዋቸው ማንቂያዎች፣ አስታዋሾች፣ ክስተቶች እና ደዋዮች በስተቀር፣ በድምጾች እና ንዝረቶች አይረበሹም። ሙዚቃ፣ ቪዲዮዎች እና ጨዋታዎች ጨምሮ ለመጫወት የሚመርጡትን ማንኛውም ነገር አሁንም ይሰማሉ።"</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"ከማንቂያዎች በስተቀር፣ በድምጾች እና ንዝረቶች አይረበሹም። ሙዚቃ፣ ቪዲዮዎች እና ጨዋታዎች ጨምሮ ለመጫወት የሚመርጡትን ማንኛውም ነገር አሁንም ይሰማሉ።"</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"አብጅ"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"ይሄ ማንቂያዎችን፣ ሙዚቃን፣ ቪዲዮዎችን እና ጨዋታዎችንም ጨምሮ ሁሉንም ድምጾች እና ንዝረቶች ያጠፋል። አሁንም የድምጽ ጥሪዎችን ማድረግ ይችላሉ።"</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"ይሄ ማንቂያዎችን፣ ሙዚቃን፣ ቪዲዮዎችን እና ጨዋታዎችንም ጨምሮ ሁሉንም ድምጾች እና ንዝረቶች ያጠፋል። አሁንም የድምጽ ጥሪዎችን ማድረግ ይችላሉ።"</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"ይሄ ማንቂያዎችን፣ ሙዚቃን፣ ቪዲዮዎችን እና ጨዋታዎችንም ጨምሮ ሁሉንም ድምጾች እና ንዝረቶች ያጠፋል።"</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"በጣም አስቸካይ ያልሆኑ ማሳወቂያዎች ከታች"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"ለማሰናበት ወደ ታች ይጎትቱ"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"በስዕል ምናሌ ውስጥ ያለ ስዕል"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> በስዕል-ላይ-ስዕል ውስጥ ነው"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"<xliff:g id="NAME">%s</xliff:g> ይህን ባህሪ እንዲጠቀም ካልፈለጉ ቅንብሮችን ለመክፈት መታ ያድርጉና ያጥፉት።"</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"<xliff:g id="NAME">%s</xliff:g> ይህን ባህሪ እንዲጠቀም ካልፈለጉ ቅንብሮችን ለመክፈት መታ ያድርጉና ያጥፉት።"</string>
<string name="pip_play" msgid="1417176722760265888">"አጫውት"</string>
<string name="pip_pause" msgid="8881063404466476571">"ባለበት አቁም"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"ወደ ቀጣይ ዝለል"</string>
diff --git a/packages/SystemUI/res/values-am/strings_tv.xml b/packages/SystemUI/res/values-am/strings_tv.xml
index 89fd692..7a375a9 100644
--- a/packages/SystemUI/res/values-am/strings_tv.xml
+++ b/packages/SystemUI/res/values-am/strings_tv.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="notification_channel_tv_pip" msgid="134047986446577723">"ፎቶ በፎቶ"</string>
+ <string name="notification_channel_tv_pip" msgid="134047986446577723">"ስዕል-ላይ-ስዕል"</string>
<string name="pip_notification_unknown_title" msgid="6289156118095849438">"(ርዕስ የሌለው ፕሮግራም)"</string>
<string name="pip_close" msgid="3480680679023423574">"PIPን ዝጋ"</string>
<string name="pip_fullscreen" msgid="8604643018538487816">"ሙሉ ማያ ገጽ"</string>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index e0c5ac9..adb76b9 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -361,10 +361,10 @@
<string name="description_target_search" msgid="3091587249776033139">"بحث"</string>
<string name="description_direction_up" msgid="7169032478259485180">"تمرير لأعلى لـ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"تمرير لليسار لـ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"لن يتم إزعاجك بالأصوات والاهتزاز، عدا من التنبيهات والتذكيرات والأحداث والمتصلين الذين تحددهم. وسيظل بإمكانك سماع أي عناصر أخرى تختار تشغيلها، بما في ذلك الموسيقى ومقاطع الفيديو والألعاب."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"لن يتم إزعاجك بالأصوات والاهتزاز، عدا من التنبيهات. وسيظل بإمكانك سماع أي عناصر أخرى تختار تشغيلها، بما في ذلك الموسيقى ومقاطع الفيديو والألعاب."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"لن يتم إزعاجك بالأصوات والاهتزاز، باستثناء المُنبِّهات والتذكيرات والأحداث والمتصلين الذين تحددهم. وسيظل بإمكانك سماع أي عناصر أخرى تختار تشغيلها، بما في ذلك الموسيقى ومقاطع الفيديو والألعاب."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"لن يتم إزعاجك بالأصوات والاهتزاز، باستثناء المُنبِّهات. وسيظل بإمكانك سماع أي عناصر أخرى تختار تشغيلها، بما في ذلك الموسيقى ومقاطع الفيديو والألعاب."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"تخصيص"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"سيؤدي هذا إلى حظر جميع الأصوات والاهتزازات، بما في ذلك ما يرد من التنبيهات والموسيقى والفيديو والألعاب. إلا أنه سيظل بإمكانك إجراء مكالمات هاتفية."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"سيؤدي هذا إلى منع صدور جميع الأصوات والاهتزازات، بما في ذلك المُنبِّهات والموسيقى ومقاطع الفيديو والألعاب. وسيظل بإمكانك إجراء مكالمات هاتفية."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"سيؤدي هذا إلى حظر جميع الأصوات والاهتزازات، بما في ذلك ما يرد من التنبيهات والموسيقى والفيديو والألعاب."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"الإشعارات الأقل إلحاحًا أدناه"</string>
@@ -752,7 +752,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"اسحب لأسفل للإلغاء"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"قائمة صورة داخل صورة"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> يظهر في صورة داخل صورة"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"إذا كنت لا تريد أن يستخدم <xliff:g id="NAME">%s</xliff:g> هذه الميزة، فانقر لفتح الإعدادات، ثم اختر تعطيلها."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"إذا كنت لا تريد أن يستخدم <xliff:g id="NAME">%s</xliff:g> هذه الميزة، فانقر لفتح الإعدادات، ثم أوقِف تشغيل هذه الميزة."</string>
<string name="pip_play" msgid="1417176722760265888">"تشغيل"</string>
<string name="pip_pause" msgid="8881063404466476571">"إيقاف مؤقت"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"التخطي إلى التالي"</string>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index cafdc50..a7b3b03 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Axtar"</string>
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> üçün yuxarı sürüşdürün."</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> üçün sola sürüşdür."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Seçdiyiniz siqnal, xatırladıcı, tədbir və zənglər istisna olmaqla səslər və vibrasiyalar Sizi narahat etməyəcək. Musiqi, video və oyunlar da daxil olmaqla oxutmaq istədiyiniz hər şeyi eşidəcəksiniz."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Siqnallar istisna olmaqla səslər və vibrasiyalar Sizi narahat etməyəcək. Musiqi, video və oyunlar da daxil olmaqla oxutmaq istədiyiniz hər şeyi eşidəcəksiniz."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Seçdiyiniz siqnal, xatırladıcı, tədbir və zənglər istisna olmaqla səslər və vibrasiyalar Sizi narahat etməyəcək. Musiqi, video və oyunlar da daxil olmaqla oxutmaq istədiyiniz hər şeyi eşidəcəksiniz."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Siqnallar istisna olmaqla səslər və vibrasiyalar Sizi narahat etməyəcək. Musiqi, video və oyunlar da daxil olmaqla oxutmaq istədiyiniz hər şeyi eşidəcəksiniz."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Fərdiləşdirin"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Bu, zəng, musiqi, video və oyunlar daxil olmaqla BÜTÜN səs və vibrasiyanı bloklayır. Yenə də telefon zəngi edə bilərsiniz."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Bu, zəng, musiqi, video və oyunlar daxil olmaqla BÜTÜN səs və vibrasiyanı blok edir. Hələ də telefon zəngi edə biləcəksiniz."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Bu, zəng, musiqi, video və oyunlar daxil olmaqla BÜTÜN səs və vibrasiyanı bloklayır."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Daha az təcili bildirişlər aşağıdadır"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Rədd etmək üçün aşağı çəkin"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Şəkil-içində-şəkil menyusu"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> şəkil içində şəkildədir"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"<xliff:g id="NAME">%s</xliff:g> adlı şəxsin bu funksiyadan istifadə etməyini istəmirsinizsə, ayarları açmaq və deaktiv etmək üçün klikləyin."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"<xliff:g id="NAME">%s</xliff:g> tətbiqinin bu funksiyadan istifadə etməyini istəmirsinizsə, ayarları açmaq və deaktiv etmək üçün klikləyin."</string>
<string name="pip_play" msgid="1417176722760265888">"Oxudun"</string>
<string name="pip_pause" msgid="8881063404466476571">"Fasilə verin"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Növbətiyə keçin"</string>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index 71cb6bd..6547f0f 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -355,10 +355,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Pretraga"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Prevucite nagore za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Prevucite ulevo za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Neće vas uznemiravati zvukovi i vibracije osim za alarme, podsetnike, događaje i pozivaoce koje navedete. I dalje ćete čuti sve što odaberete da pustite, uključujući muziku, video snimke i igre."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Neće vas uznemiravati zvukovi i vibracije osim za alarme. I dalje ćete čuti sve što odaberete da pustite, uključujući muziku, video snimke i igre."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Neće vas uznemiravati zvukovi i vibracije osim za alarme, podsetnike, događaje i pozivaoce koje navedete. I dalje ćete čuti sve što odaberete da pustite, uključujući muziku, video snimke i igre."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Neće vas uznemiravati zvukovi i vibracije osim za alarme. I dalje ćete čuti sve što odaberete da pustite, uključujući muziku, video snimke i igre."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Prilagodi"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Ovo blokira SVE zvukove i vibracije uključujući alarme, muziku, video snimke i igre. I dalje ćete moći da upućujete pozive."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Ovo blokira SVE zvukove i vibracije uključujući alarme, muziku, video snimke i igre. I dalje ćete moći da upućujete pozive."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Ovo blokira SVE zvukove i vibracije uključujući alarme, muziku, video snimke i igre."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Manje hitna obaveštenja su u nastavku"</string>
@@ -734,7 +734,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Prevucite nadole da biste odbili"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Meni Slika u slici"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> je slika u slici"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Ako ne želite da <xliff:g id="NAME">%s</xliff:g> koristi ovu funkciju, dodirnite da biste otvorili podešavanja i isključili je."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Ako ne želite da <xliff:g id="NAME">%s</xliff:g> koristi ovu funkciju, dodirnite da biste otvorili podešavanja i isključili je."</string>
<string name="pip_play" msgid="1417176722760265888">"Pusti"</string>
<string name="pip_pause" msgid="8881063404466476571">"Pauziraj"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Pređi na sledeće"</string>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index fc74dbe..6d6d1b2 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -359,10 +359,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Пошук"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Правядзіце пальцам уверх, каб атрымаць <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Правядзіце пальцам улева, каб атрымаць <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Вас не будуць турбаваць гукі і вібрацыя, за выключэннем будзільнікаў, напамінаў, падзей і выбраных вамі абанентаў. Вы будзеце чуць усё, што ўключыце, у тым ліку музыку, відэа і гульні."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Вас не будуць турбаваць гукі і вібрацыя, за выключэннем будзільнікаў. Вы будзеце чуць усё, што ўключыце, у тым ліку музыку, відэа і гульні."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Вас не будуць турбаваць гукі і вібрацыя, за выключэннем будзільнікаў, напамінаў, падзей і выбраных вамі абанентаў. Вы будзеце чуць усё, што ўключыце, у тым ліку музыку, відэа і гульні."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Вас не будуць турбаваць гукі і вібрацыя, за выключэннем будзільнікаў. Вы будзеце чуць усё, што ўключыце, у тым ліку музыку, відэа і гульні."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Дапасаваць"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Гэта заблакіруе ЎСЕ гукі і вібрацыі, у тым ліку ад будзільнікаў, музыкі, відэа і гульняў. Вы па-ранейшаму зможаце тэлефанаваць."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Гэта заблакіруе ЎСЕ гукі і вібрацыю, у тым ліку ад будзільнікаў, музыкі, відэа і гульняў. Вы па-ранейшаму зможаце рабіць тэлефонныя выклікі."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Гэта заблакіруе ЎСЕ гукі і вібрацыі, у тым ліку ад будзільнікаў, музыкі, відэа і гульняў."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Менш тэрміновыя апавяшчэнні ніжэй"</string>
@@ -742,7 +742,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Перацягніце ўніз, каб адхіліць"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Меню \"Відарыс у відарысе\""</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> з’яўляецца відарысам у відарысе"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Калі вы не хочаце, каб праграма <xliff:g id="NAME">%s</xliff:g> выкарыстоўвала гэту функцыю, дакраніцеся, каб адкрыць налады і адключыць яе."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Калі вы не хочаце, каб праграма <xliff:g id="NAME">%s</xliff:g> выкарыстоўвала гэту функцыю, дакраніцеся, каб адкрыць налады і адключыць яе."</string>
<string name="pip_play" msgid="1417176722760265888">"Прайграць"</string>
<string name="pip_pause" msgid="8881063404466476571">"Прыпыніць"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Перайсці да наступнага"</string>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index 2b3539c..86e0278 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Търсене"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Плъзнете нагоре за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Плъзнете наляво за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Няма да бъдете обезпокоявани от звуци и вибрирания освен от будилници, напомняния, събития и обаждания от посочени от вас контакти. Пак ще чувате всичко, което изберете да се пусне, включително музика, видеоклипове и игри."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Няма да бъдете обезпокоявани от звуци и вибрирания освен от будилници. Пак ще чувате всичко, което изберете да се пусне, включително музика, видеоклипове и игри."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Няма да бъдете обезпокоявани от звуци и вибрирания освен от будилници, напомняния, събития и обаждания от посочени от вас контакти. Пак ще чувате всичко, което изберете да се пусне, включително музика, видеоклипове и игри."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Няма да бъдете обезпокоявани от звуци и вибрирания освен от будилници. Пак ще чувате всичко, което изберете да се пусне, включително музика, видеоклипове и игри."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Персонализиране"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Този режим блокира ВСИЧКИ звуци и вибрирания, включително от будилници, музика, видеоклипове и игри. Пак ще можете да извършвате телефонни обаждания."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Този режим блокира ВСИЧКИ звуци и вибрирания, включително от будилници, музика, видеоклипове и игри. Пак ще можете да извършвате телефонни обаждания."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Този режим блокира ВСИЧКИ звуци и вибрирания, включително от будилници, музика, видеоклипове и игри."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Ппоказване на по-малко спешните известия по-долу"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Преместете надолу с плъзгане, за да отхвърлите"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Меню за режима „Картина в картината“"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> е в режима „Картина в картината“"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Ако не искате <xliff:g id="NAME">%s</xliff:g> да използва тази функция, докоснете, за да отворите настройките, и я изключете."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Ако не искате <xliff:g id="NAME">%s</xliff:g> да използва тази функция, докоснете, за да отворите настройките, и я изключете."</string>
<string name="pip_play" msgid="1417176722760265888">"Пускане"</string>
<string name="pip_pause" msgid="8881063404466476571">"Поставяне на пауза"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Към следващия елемент"</string>
diff --git a/packages/SystemUI/res/values-bg/strings_tv.xml b/packages/SystemUI/res/values-bg/strings_tv.xml
index ffe9007..a5eb8b93 100644
--- a/packages/SystemUI/res/values-bg/strings_tv.xml
+++ b/packages/SystemUI/res/values-bg/strings_tv.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="notification_channel_tv_pip" msgid="134047986446577723">"Картина в картина"</string>
+ <string name="notification_channel_tv_pip" msgid="134047986446577723">"Картина в картината"</string>
<string name="pip_notification_unknown_title" msgid="6289156118095849438">"(Програма без заглавие)"</string>
<string name="pip_close" msgid="3480680679023423574">"Затваряне на PIP"</string>
<string name="pip_fullscreen" msgid="8604643018538487816">"Цял екран"</string>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index 485e5f2..8db54c8 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"অনুসন্ধান করুন"</string>
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> এর জন্য উপরের দিকে স্লাইড করুন৷"</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> এর জন্য বাঁ দিকে স্লাইড করুন৷"</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"অ্যালার্ম, রিমাইন্ডার, ইভেন্ট, এবং আপনার নির্দিষ্ট করে দেওয়া ব্যক্তিদের কল ছাড়া অন্য কোনও আওয়াজ বা ভাইব্রেশন হবে না। তবে সঙ্গীত, ভিডিও, এবং গেমের আওয়াজ শুনতে পাবেন।"</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"অ্যালার্ম ছাড়া অন্য কোনও আওয়াজ বা ভাইব্রেশন হবে না। তবে সঙ্গীত, ভিডিও, এবং গেমের আওয়াজ শুনতে পাবেন।"</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"অ্যালার্ম, রিমাইন্ডার, ইভেন্ট, এবং আপনার নির্দিষ্ট করে দেওয়া ব্যক্তিদের কল ছাড়া অন্য কোনও আওয়াজ বা ভাইব্রেশন হবে না। তবে সঙ্গীত, ভিডিও, এবং গেম সহ আপনি যা কিছু চালাবেন তার আওয়াজ শুনতে পাবেন।"</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"অ্যালার্ম ছাড়া অন্য কোনও আওয়াজ বা ভাইব্রেশন হবে না। তবে সঙ্গীত, ভিডিও, এবং গেম সহ আপনি যা কিছু চালাবেন তার আওয়াজ শুনতে পাবেন।"</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"কাস্টমাইজ করুন"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"এটি অ্যালার্ম, সংগীত, ভিডিও এবং গেমগুলি থেকে আসা সমস্ত রকমের ধ্বনি এবং কম্পনগুলিকে বন্ধ করে৷ আপনি এখনও ফোন কলগুলি করতে পারবেন৷"</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"এটি অ্যালার্ম, সংগীত, ভিডিও এবং গেম থেকে আসা সমস্ত রকমের আওয়াজ এবং ভাইব্রেশনকে ব্লক করে দেয়। তবুও আপনি ফোন করতে পারবেন।"</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"এটি অ্যালার্ম, সংগীত, ভিডিও এবং গেমগুলি থেকে আসা সমস্ত রকমের ধ্বনি এবং কম্পনগুলিকে বন্ধ করে৷"</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"নিচে অপেক্ষাকৃত কম জরুরী বিজ্ঞপ্তিগুলি"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"খারিজ করতে নিচের দিকে টেনে আনুন"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"পিকচার ইন পিকচার মেনু"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"ছবির-মধ্যে-ছবি তে <xliff:g id="NAME">%s</xliff:g> আছেন"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"<xliff:g id="NAME">%s</xliff:g> কে এই বৈশিষ্ট্যটি ব্যবহার করতে দিতে না চাইলে ট্যাপ করে সেটিংসে গিয়ে সেটি বন্ধ করে দিন।"</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"<xliff:g id="NAME">%s</xliff:g> কে এই বৈশিষ্ট্যটি ব্যবহার করতে দিতে না চাইলে ট্যাপ করে সেটিংসে গিয়ে সেটি বন্ধ করে দিন।"</string>
<string name="pip_play" msgid="1417176722760265888">"চালান"</string>
<string name="pip_pause" msgid="8881063404466476571">"বিরাম দিন"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"এগিয়ে যাওয়ার জন্য এড়িয়ে যান"</string>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index 9a6595e..337b68f 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -355,10 +355,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Pretraživanje"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Povucite gore za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Povucite lijevo za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Neće vas ometati zvukovi i vibracije, osim alarma, podsjetnika, događaja i pozivalaca koje odredite. I dalje ćete čuti sve što ste odabrali za reprodukciju, uključujući muziku, videozapise i igre."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Neće vas ometati zvukovi i vibracije, osim alarma. I dalje ćete čuti sve što ste odabrali za reprodukciju, uključujući muziku, videozapise i igre."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Neće vas ometati zvukovi i vibracije, osim alarma, podsjetnika, događaja i pozivalaca koje odredite. I dalje ćete čuti sve što ste odabrali za reprodukciju, uključujući muziku, videozapise i igre."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Neće vas ometati zvukovi i vibracije, osim alarma. I dalje ćete čuti sve što izaberete za reprodukciju, uključujući muziku, videozapise i igre."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Prilagodi"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Ovim se blokiraju SVI zvukovi i vibracije, uključujući alarme, muziku, videozapise i igre. I dalje ćete moći obavljati pozive."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Ovim se blokiraju SVI zvukovi i vibracije, uključujući alarme, muziku, videozapise i igre. I dalje ćete moći obavljati pozive."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Ovim se blokiraju SVI zvukovi i vibracije, uključujući alarme, muziku, video zapise i igre."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Prikaži manje važna obavještenja ispod"</string>
@@ -736,7 +736,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Povucite prema dolje da odbacite"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Meni za način rada Slika u slici"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> je u načinu priakza Slika u slici"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Ako ne želite da <xliff:g id="NAME">%s</xliff:g> koristi ovu funkciju, dodirnite da otvorite postavke i isključite je."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Ako ne želite da <xliff:g id="NAME">%s</xliff:g> koristi ovu funkciju, dodirnite da otvorite postavke i isključite je."</string>
<string name="pip_play" msgid="1417176722760265888">"Reproduciraj"</string>
<string name="pip_pause" msgid="8881063404466476571">"Pauziraj"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Preskoči na sljedeći"</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 2559bc8..5aa85b8 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Cerca"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Llisca cap amunt per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Llisca cap a l\'esquerra per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"No t\'interromprà cap so ni cap vibració, tret dels de les alarmes, recordatoris, esdeveniments i trucades de les persones que especifiquis. Continuaràs sentint tot allò que decideixis reproduir, com ara música, vídeos i jocs."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"No t\'interromprà cap so ni cap vibració, tret dels de les alarmes. Continuaràs sentint tot allò que decideixis reproduir, com ara música, vídeos i jocs."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"No t\'interromprà cap so ni cap vibració, tret dels de les alarmes, recordatoris, esdeveniments i trucades de les persones que especifiquis. Continuaràs sentint tot allò que decideixis reproduir, com ara música, vídeos i jocs."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"No t\'interromprà cap so ni cap vibració, tret dels de les alarmes. Continuaràs sentint tot allò que decideixis reproduir, com ara música, vídeos i jocs."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Personalitza"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Es bloquejaran TOTS els sons i totes les vibracions, inclosos els de vídeos, jocs, alarmes i música. Encara podràs fer trucades."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Es bloquejaran TOTS els sons i totes les vibracions, inclosos els de vídeos, jocs, alarmes i música. Encara podràs fer trucades."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Es bloquejaran TOTS els sons i totes les vibracions, inclosos els de vídeos, jocs, alarmes i música."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Notificacions menys urgents a continuació"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Arrossega cap avall per ignorar-ho"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Menú per a Imatge en imatge"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> està en imatge en imatge"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Si no vols que <xliff:g id="NAME">%s</xliff:g> utilitzi aquesta funció, toca per obrir la configuració i desactiva-la."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Si no vols que <xliff:g id="NAME">%s</xliff:g> utilitzi aquesta funció, toca per obrir la configuració i desactiva-la."</string>
<string name="pip_play" msgid="1417176722760265888">"Reprodueix"</string>
<string name="pip_pause" msgid="8881063404466476571">"Posa en pausa"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Ves al següent"</string>
diff --git a/packages/SystemUI/res/values-car/dimens.xml b/packages/SystemUI/res/values-car/dimens.xml
new file mode 100644
index 0000000..b2e7bd1
--- /dev/null
+++ b/packages/SystemUI/res/values-car/dimens.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (c) 2017, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+*/
+-->
+<resources>
+ <!-- The height of the quick settings footer that holds the user switcher, settings icon,
+ etc. in the car setting.-->
+ <dimen name="qs_footer_height">74dp</dimen>
+</resources>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index fe80975..ed4bd0f 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -359,10 +359,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Vyhledávání"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Přejeďte prstem nahoru: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
<string name="description_direction_left" msgid="7207478719805562165">"Přejeďte prstem doleva: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Nebudou vás rušit zvuky ani vibrace s výjimkou budíků, upozornění, událostí a vybraných volajících. Nadále uslyšíte veškerý obsah, který si sami pustíte (např. hudba, videa nebo hry)."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Nebudou vás rušit zvuky ani vibrace s výjimkou budíků. Nadále uslyšíte veškerý obsah, který si sami pustíte (např. hudba, videa nebo hry)."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Nebudou vás rušit zvuky ani vibrace s výjimkou budíků, upozornění, událostí a volajících, které zadáte. Nadále uslyšíte veškerý obsah, který si sami pustíte (např. hudba, videa nebo hry)."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Nebudou vás rušit zvuky ani vibrace s výjimkou budíků. Nadále uslyšíte veškerý obsah, který si sami pustíte (např. hudba, videa nebo hry)."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Přizpůsobit"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"V tomto režimu budou blokovány VŠECHNY zvuky a vibrace, včetně těch z budíků, hudby, videí a her. Telefonovat budete moci i nadále."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"V tomto režimu budou blokovány VŠECHNY zvuky a vibrace, včetně těch z budíků, hudby, videí a her. Telefonovat budete moci i nadále."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"V tomto režimu budou blokovány VŠECHNY zvuky a vibrace, včetně těch z budíků, hudby, videí a her."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Méně urgentní oznámení níže"</string>
@@ -742,7 +742,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Nápovědu zavřete přetažením dolů"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Nabídka režimu obraz v obraze"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"Aplikace <xliff:g id="NAME">%s</xliff:g> je v režimu obraz v obraze"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Pokud nechcete, aby aplikace <xliff:g id="NAME">%s</xliff:g> tuto funkci používala, klepnutím otevřete nastavení a funkci vypněte."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Pokud nechcete, aby aplikace <xliff:g id="NAME">%s</xliff:g> tuto funkci používala, klepnutím otevřete nastavení a funkci vypněte."</string>
<string name="pip_play" msgid="1417176722760265888">"Přehrát"</string>
<string name="pip_pause" msgid="8881063404466476571">"Pozastavit"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Přeskočit na další"</string>
diff --git a/packages/SystemUI/res/values-cs/strings_tv.xml b/packages/SystemUI/res/values-cs/strings_tv.xml
index f27974f..a928218 100644
--- a/packages/SystemUI/res/values-cs/strings_tv.xml
+++ b/packages/SystemUI/res/values-cs/strings_tv.xml
@@ -21,6 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="notification_channel_tv_pip" msgid="134047986446577723">"Obraz v obraze"</string>
<string name="pip_notification_unknown_title" msgid="6289156118095849438">"(Bez názvu)"</string>
- <string name="pip_close" msgid="3480680679023423574">"Ukončit PIP"</string>
+ <string name="pip_close" msgid="3480680679023423574">"Ukončit obraz v obraze (PIP)"</string>
<string name="pip_fullscreen" msgid="8604643018538487816">"Celá obrazovka"</string>
</resources>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index bbeb335..c7367be 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Søgning"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Glid op for at <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Glid til venstre for at <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Du bliver ikke forstyrret af lyde eller vibrationer, undtagen fra alarmer, påmindelser, begivenheder og opkald fra personer, du angiver. Du kan stadig høre alt, du vælger at afspille, bl.a. musik samt lyd i videoer og spil."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Du bliver ikke forstyrret af lyde eller vibrationer, undtagen fra alarmer. Du kan stadig høre alt, du vælger at afspille, bl.a. musik samt lyd i videoer og spil."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Du bliver ikke forstyrret af lyde eller vibrationer, undtagen fra alarmer, påmindelser, begivenheder og opkald fra udvalgte personer, du selv angiver. Du kan stadig høre alt, du vælger at afspille, f.eks. musik, videoer og spil."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Du bliver ikke forstyrret af lyde eller vibrationer, undtagen fra alarmer. Du kan stadig høre alt, du vælger at afspille, f.eks. musik, videoer og spil."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Tilpas"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Dette blokerer ALLE lyde og vibrationer, bl.a. fra alarmer, musik, videoer og spil. Du vil stadig kunne foretage telefonopkald."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Dette blokerer ALLE lyde og vibrationer, bl.a. fra alarmer, musik, videoer og spil. Du vil stadig kunne foretage telefonopkald."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Dette blokerer ALLE lyde og vibrationer, bl.a. fra alarmer, musik, videoer og spil."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Mindre presserende underretninger nedenfor"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Træk nedad for at afvise"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Menu for integreret billede"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> vises som integreret billede"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Hvis du ikke ønsker, at <xliff:g id="NAME">%s</xliff:g> skal benytte denne funktion, kan du åbne indstillingerne og deaktivere den."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Hvis du ikke ønsker, at <xliff:g id="NAME">%s</xliff:g> skal benytte denne funktion, kan du åbne indstillingerne og deaktivere den."</string>
<string name="pip_play" msgid="1417176722760265888">"Afspil"</string>
<string name="pip_pause" msgid="8881063404466476571">"Sæt på pause"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Gå videre til næste"</string>
diff --git a/packages/SystemUI/res/values-da/strings_tv.xml b/packages/SystemUI/res/values-da/strings_tv.xml
index d24cb3a..aa8af74 100644
--- a/packages/SystemUI/res/values-da/strings_tv.xml
+++ b/packages/SystemUI/res/values-da/strings_tv.xml
@@ -21,6 +21,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="notification_channel_tv_pip" msgid="134047986446577723">"Integreret billede"</string>
<string name="pip_notification_unknown_title" msgid="6289156118095849438">"(Program uden titel)"</string>
- <string name="pip_close" msgid="3480680679023423574">"Luk PIP"</string>
+ <string name="pip_close" msgid="3480680679023423574">"Luk integreret billede"</string>
<string name="pip_fullscreen" msgid="8604643018538487816">"Fuld skærm"</string>
</resources>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 869bca7..ed57564 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -357,10 +357,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Suche"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Zum <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> nach oben schieben"</string>
<string name="description_direction_left" msgid="7207478719805562165">"Zum <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> nach links schieben"</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Klingeltöne und die Vibration werden deaktiviert, außer für Weckrufe, Erinnerungen, Termine sowie Anrufe von zuvor von dir festgelegten Personen. Du hörst jedoch weiterhin Sound, wenn du Musik und Videos wiedergibst oder Spiele spielst."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Klingeltöne und die Vibration werden deaktiviert, außer für Weckrufe. Du hörst jedoch weiterhin Sound, wenn du Musik und Videos wiedergibst oder Spiele spielst."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Klingeltöne und die Vibration werden deaktiviert, außer für Weckrufe, Erinnerungen, Termine sowie Anrufe von zuvor von dir festgelegten Personen. Du hörst jedoch weiterhin Sound, wenn du dir Musik anhörst, Videos ansiehst oder Spiele spielst."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Klingeltöne und die Vibration werden deaktiviert, außer für Weckrufe. Du hörst jedoch weiterhin Sound, wenn du dir Musik anhörst, Videos ansiehst oder Spiele spielst."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Anpassen"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Hierdurch werden alle Klingeltöne und Vibrationsalarme stummgeschaltet, auch für Weckrufe, Musik, Videos und Spiele. Anrufe kannst du jedoch weiterhin tätigen."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Hierdurch werden ALLE Klingeltöne und die Vibration deaktiviert, auch für Weckrufe, Musik, Videos und Spiele. Du kannst aber weiterhin selbst anrufen."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Hierdurch werden alle Klingeltöne und Vibrationsalarme stummgeschaltet, auch für Weckrufe, Musik, Videos und Spiele."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Weniger dringende Benachrichtigungen unten"</string>
@@ -732,7 +732,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Zum Schließen nach unten ziehen"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Menü \"Bild im Bild\""</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> ist in Bild im Bild"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Wenn du nicht möchtest, dass <xliff:g id="NAME">%s</xliff:g> diese Funktion verwendet, tippe, um die Einstellungen zu öffnen und die Funktion zu deaktivieren."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Wenn du nicht möchtest, dass <xliff:g id="NAME">%s</xliff:g> diese Funktion verwendet, tippe, um die Einstellungen zu öffnen und die Funktion zu deaktivieren."</string>
<string name="pip_play" msgid="1417176722760265888">"Wiedergeben"</string>
<string name="pip_pause" msgid="8881063404466476571">"Pausieren"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Vorwärts springen"</string>
diff --git a/packages/SystemUI/res/values-de/strings_tv.xml b/packages/SystemUI/res/values-de/strings_tv.xml
index c83a52e..adae259 100644
--- a/packages/SystemUI/res/values-de/strings_tv.xml
+++ b/packages/SystemUI/res/values-de/strings_tv.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="notification_channel_tv_pip" msgid="134047986446577723">"Bild-in-Bild"</string>
+ <string name="notification_channel_tv_pip" msgid="134047986446577723">"Bild im Bild"</string>
<string name="pip_notification_unknown_title" msgid="6289156118095849438">"(Kein Programmtitel)"</string>
<string name="pip_close" msgid="3480680679023423574">"PIP schließen"</string>
<string name="pip_fullscreen" msgid="8604643018538487816">"Vollbild"</string>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index bb44d99..c206d86 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Αναζήτηση"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Κύλιση προς τα επάνω για <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Κύλιση προς τα αριστερά για <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Δεν θα ενοχλείστε από ήχους και δονήσεις, παρά μόνο από ξυπνητήρια, υπενθυμίσεις, συμβάντα και καλούντες που έχετε καθορίσει. Θα εξακολουθείτε να ακούτε όλο το περιεχόμενο που επιλέγετε να αναπαραγάγετε, συμπεριλαμβανομένων μουσικής, βίντεο και παιχνιδιών."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Δεν θα ενοχλείστε από ήχους και δονήσεις, παρά μόνο από ξυπνητήρια. Θα εξακολουθείτε να ακούτε όλο το περιεχόμενο που επιλέγετε να αναπαραγάγετε, συμπεριλαμβανομένων μουσικής, βίντεο και παιχνιδιών."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Δεν θα ενοχλείστε από ήχους και δονήσεις, παρά μόνο από ξυπνητήρια, υπενθυμίσεις, συμβάντα και καλούντες που έχετε καθορίσει. Θα εξακολουθείτε να ακούτε όλο το περιεχόμενο που επιλέγετε να αναπαραγάγετε, συμπεριλαμβανομένης της μουσικής, των βίντεο και των παιχνιδιών."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Δεν θα ενοχλείστε από ήχους και δονήσεις, παρά μόνο από ξυπνητήρια. Θα εξακολουθείτε να ακούτε όλο το περιεχόμενο που επιλέγετε να αναπαραγάγετε, συμπεριλαμβανομένης της μουσικής, των βίντεο και των παιχνιδιών."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Προσαρμογή"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Αυτή η επιλογή αποκλείει όλους τους ήχους και τις δονήσεις, μεταξύ των οποίων των ξυπνητηριών, της μουσικής, των βίντεο και των παιχνιδιών. Θα εξακολουθείτε να είστε σε θέση να πραγματοποιήσετε τηλεφωνικές κλήσεις."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Αυτή η επιλογή αποκλείει όλους τους ήχους και τις δονήσεις, όπως είναι οι ήχοι και οι δονήσεις από ξυπνητήρια, μουσική, βίντεο και παιχνίδια. Θα μπορείτε ακόμη να κάνετε τηλεφωνικές κλήσεις."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Αυτή η επιλογή αποκλείει όλους τους ήχους και τις δονήσεις, μεταξύ των οποίων των ξυπνητηριών, της μουσικής, των βίντεο και των παιχνιδιών."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Λιγότερο επείγουσες ειδοποιήσεις παρακάτω"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Σύρετε προς τα κάτω για παράβλεψη"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Μενού λειτουργίας Picture in picture"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"Η λειτουργία picture-in-picture είναι ενεργή σε <xliff:g id="NAME">%s</xliff:g>."</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Εάν δεν θέλετε να χρησιμοποιείται αυτή η λειτουργία από την εφαρμογή <xliff:g id="NAME">%s</xliff:g>, πατήστε για να ανοίξετε τις ρυθμίσεις και απενεργοποιήστε την."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Εάν δεν θέλετε να χρησιμοποιείται αυτή η λειτουργία από την εφαρμογή <xliff:g id="NAME">%s</xliff:g>, πατήστε για να ανοίξετε τις ρυθμίσεις και απενεργοποιήστε την."</string>
<string name="pip_play" msgid="1417176722760265888">"Αναπαραγωγή"</string>
<string name="pip_pause" msgid="8881063404466476571">"Παύση"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Μετάβαση στο επόμενο"</string>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index 3a39a2e..a9cd4dd 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Search"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Slide up for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Slide left for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"You won’t be disturbed by sounds and vibrations, except from alarms, reminders, events and callers that you specify. You\'ll still hear anything that you choose to play, including music, videos and games."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"You won’t be disturbed by sounds and vibrations, except from alarms. You\'ll still hear anything that you choose to play, including music, videos and games."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"You won\'t be disturbed by sounds and vibrations, except from alarms, reminders, events and callers you specify. You\'ll still hear anything you choose to play including music, videos and games."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"You won\'t be disturbed by sounds and vibrations, except from alarms. You\'ll still hear anything you choose to play including music, videos and games."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Customise"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"This blocks ALL sounds and vibrations, including from alarms, music, videos and games. You’ll still be able to make phone calls."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"This blocks ALL sounds and vibrations, including from alarms, music, videos, and games. You\'ll still be able to make phone calls."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"This blocks ALL sounds and vibrations, including from alarms, music, videos and games."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Less urgent notifications below"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Drag down to dismiss"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Picture in picture menu"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> is in picture-in-picture"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"If you don’t want <xliff:g id="NAME">%s</xliff:g> to use this feature, tap to open settings and turn it off."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"If you don\'t want <xliff:g id="NAME">%s</xliff:g> to use this feature, tap to open settings and turn it off."</string>
<string name="pip_play" msgid="1417176722760265888">"Play"</string>
<string name="pip_pause" msgid="8881063404466476571">"Pause"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Skip to next"</string>
diff --git a/packages/SystemUI/res/values-en-rAU/strings_tv.xml b/packages/SystemUI/res/values-en-rAU/strings_tv.xml
index ffcd655..31cbd83 100644
--- a/packages/SystemUI/res/values-en-rAU/strings_tv.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings_tv.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="notification_channel_tv_pip" msgid="134047986446577723">"Picture-in-Picture"</string>
+ <string name="notification_channel_tv_pip" msgid="134047986446577723">"Picture-in-picture"</string>
<string name="pip_notification_unknown_title" msgid="6289156118095849438">"(No title program)"</string>
<string name="pip_close" msgid="3480680679023423574">"Close PIP"</string>
<string name="pip_fullscreen" msgid="8604643018538487816">"Full screen"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index 3a39a2e..a9cd4dd 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Search"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Slide up for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Slide left for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"You won’t be disturbed by sounds and vibrations, except from alarms, reminders, events and callers that you specify. You\'ll still hear anything that you choose to play, including music, videos and games."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"You won’t be disturbed by sounds and vibrations, except from alarms. You\'ll still hear anything that you choose to play, including music, videos and games."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"You won\'t be disturbed by sounds and vibrations, except from alarms, reminders, events and callers you specify. You\'ll still hear anything you choose to play including music, videos and games."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"You won\'t be disturbed by sounds and vibrations, except from alarms. You\'ll still hear anything you choose to play including music, videos and games."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Customise"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"This blocks ALL sounds and vibrations, including from alarms, music, videos and games. You’ll still be able to make phone calls."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"This blocks ALL sounds and vibrations, including from alarms, music, videos, and games. You\'ll still be able to make phone calls."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"This blocks ALL sounds and vibrations, including from alarms, music, videos and games."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Less urgent notifications below"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Drag down to dismiss"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Picture in picture menu"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> is in picture-in-picture"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"If you don’t want <xliff:g id="NAME">%s</xliff:g> to use this feature, tap to open settings and turn it off."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"If you don\'t want <xliff:g id="NAME">%s</xliff:g> to use this feature, tap to open settings and turn it off."</string>
<string name="pip_play" msgid="1417176722760265888">"Play"</string>
<string name="pip_pause" msgid="8881063404466476571">"Pause"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Skip to next"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings_tv.xml b/packages/SystemUI/res/values-en-rGB/strings_tv.xml
index ffcd655..31cbd83 100644
--- a/packages/SystemUI/res/values-en-rGB/strings_tv.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings_tv.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="notification_channel_tv_pip" msgid="134047986446577723">"Picture-in-Picture"</string>
+ <string name="notification_channel_tv_pip" msgid="134047986446577723">"Picture-in-picture"</string>
<string name="pip_notification_unknown_title" msgid="6289156118095849438">"(No title program)"</string>
<string name="pip_close" msgid="3480680679023423574">"Close PIP"</string>
<string name="pip_fullscreen" msgid="8604643018538487816">"Full screen"</string>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index 3a39a2e..a9cd4dd 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Search"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Slide up for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Slide left for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"You won’t be disturbed by sounds and vibrations, except from alarms, reminders, events and callers that you specify. You\'ll still hear anything that you choose to play, including music, videos and games."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"You won’t be disturbed by sounds and vibrations, except from alarms. You\'ll still hear anything that you choose to play, including music, videos and games."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"You won\'t be disturbed by sounds and vibrations, except from alarms, reminders, events and callers you specify. You\'ll still hear anything you choose to play including music, videos and games."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"You won\'t be disturbed by sounds and vibrations, except from alarms. You\'ll still hear anything you choose to play including music, videos and games."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Customise"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"This blocks ALL sounds and vibrations, including from alarms, music, videos and games. You’ll still be able to make phone calls."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"This blocks ALL sounds and vibrations, including from alarms, music, videos, and games. You\'ll still be able to make phone calls."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"This blocks ALL sounds and vibrations, including from alarms, music, videos and games."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Less urgent notifications below"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Drag down to dismiss"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Picture in picture menu"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> is in picture-in-picture"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"If you don’t want <xliff:g id="NAME">%s</xliff:g> to use this feature, tap to open settings and turn it off."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"If you don\'t want <xliff:g id="NAME">%s</xliff:g> to use this feature, tap to open settings and turn it off."</string>
<string name="pip_play" msgid="1417176722760265888">"Play"</string>
<string name="pip_pause" msgid="8881063404466476571">"Pause"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Skip to next"</string>
diff --git a/packages/SystemUI/res/values-en-rIN/strings_tv.xml b/packages/SystemUI/res/values-en-rIN/strings_tv.xml
index ffcd655..31cbd83 100644
--- a/packages/SystemUI/res/values-en-rIN/strings_tv.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings_tv.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="notification_channel_tv_pip" msgid="134047986446577723">"Picture-in-Picture"</string>
+ <string name="notification_channel_tv_pip" msgid="134047986446577723">"Picture-in-picture"</string>
<string name="pip_notification_unknown_title" msgid="6289156118095849438">"(No title program)"</string>
<string name="pip_close" msgid="3480680679023423574">"Close PIP"</string>
<string name="pip_fullscreen" msgid="8604643018538487816">"Full screen"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index f1ca9b0..94f37b9 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -355,10 +355,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Buscar"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Desliza el dedo hacia arriba para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Desliza el dedo hacia la izquierda para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"No te molestarán los sonidos ni las vibraciones, excepto las alarmas, los recordatorios, los eventos y las llamadas de los emisores que especifiques. Seguirás escuchando el contenido que reproduzcas, como música, videos y juegos."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"No te molestarán los sonidos ni las vibraciones, excepto las alarmas. Seguirás escuchando el contenido que reproduzcas, como música, videos y juegos."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"No te molestarán los sonidos ni las vibraciones, excepto las alarmas, los recordatorios, los eventos y las llamadas de los emisores que especifiques. Podrás escuchar el contenido que reproduzcas, como música, videos y juegos."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"No te molestarán los sonidos ni las vibraciones, excepto las alarmas. Podrás escuchar el contenido que reproduzcas, como música, videos y juegos."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Personalizar"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Esta acción bloquea TODOS los sonidos y las vibraciones, incluidas las que provienen de alarmas, videos y juegos. Podrás realizar llamadas telefónicas."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Esta acción bloquea TODOS los sonidos y las vibraciones, incluso las alarmas, los videos y los juegos. Podrás realizar llamadas telefónicas."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Esta acción bloquea TODOS los sonidos y las vibraciones, incluso los que provienen de alarmas, música, videos y juegos."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Notificaciones menos urgentes abajo"</string>
@@ -730,7 +730,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Arrastra hacia abajo para descartar"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Menú de Imagen en imagen"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> está en modo de imagen en imagen"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Si no quieres que <xliff:g id="NAME">%s</xliff:g> use esta función, presiona para abrir la configuración y desactivarla."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Si no quieres que <xliff:g id="NAME">%s</xliff:g> use esta función, presiona para abrir la configuración y desactivarla."</string>
<string name="pip_play" msgid="1417176722760265888">"Reproducir"</string>
<string name="pip_pause" msgid="8881063404466476571">"Pausar"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Siguiente"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index f8bd8ff..c479cfe 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -355,10 +355,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Buscar"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Desliza el dedo hacia arriba para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Desliza el dedo hacia la izquierda para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"No te molestarán los sonidos ni las vibraciones, excepto las alarmas, los recordatorios, los eventos y las llamadas que especifiques. Seguirás escuchando el contenido que quieras reproducir, como música, vídeos y juegos."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"No te molestarán los sonidos ni las vibraciones, excepto las alarmas. Seguirás escuchando el contenido que quieras reproducir, como música, vídeos y juegos."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"No te molestarán los sonidos ni las vibraciones, excepto las alarmas, los recordatorios, los eventos y las llamadas que especifiques. Seguirás escuchando el contenido que quieras reproducir, como música, vídeos y juegos."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"No te molestarán los sonidos ni las vibraciones, excepto las alarmas. Seguirás escuchando el contenido que quieras reproducir, como música, vídeos y juegos."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Personalizar"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Este modo permite bloquear TODOS los sonidos y todas las vibraciones (p. ej., los de alarmas, música, vídeos y juegos). Seguirás pudiendo hacer llamadas de teléfono."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Esta opción bloqueará TODOS los sonidos y todas las vibraciones, por ejemplo, los vídeos, los juegos, las alarmas y la música. Seguirás pudiendo hacer llamadas."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Este modo permite bloquear TODOS los sonidos y todas las vibraciones (p. ej., los de alarmas, música, vídeos y juegos)."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Notificaciones menos urgente abajo"</string>
@@ -730,7 +730,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Arrastra hacia abajo para ignorar"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Menú del modo Imagen en imagen"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> está en imagen en imagen"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Si no quieres que <xliff:g id="NAME">%s</xliff:g> utilice esta función, toca la notificación para abrir los ajustes y desactivarla."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Si no quieres que <xliff:g id="NAME">%s</xliff:g> utilice esta función, toca la notificación para abrir los ajustes y desactivarla."</string>
<string name="pip_play" msgid="1417176722760265888">"Reproducir"</string>
<string name="pip_pause" msgid="8881063404466476571">"Pausar"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Saltar al siguiente"</string>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index 1d94e01..a08a97a 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -355,10 +355,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Otsing"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Lohistage üles: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Lohistage vasakule: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Helid ja vibratsioonid ei sega teid. Kuulete siiski enda määratud alarme, meeldetuletusi, sündmusi ja helistajaid. Samuti kuulete kõike, mille esitamise ise valite, sh muusika, videod ja mängud."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Helid ja vibratsioonid ei sega teid. Kuulete siiski alarme. Samuti kuulete kõike, mille esitamise ise valite, sh muusika, videod ja mängud."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Helid ja vibratsioonid ei sega teid. Kuulete siiski enda määratud alarme, meeldetuletusi, sündmusi ja helistajaid. Samuti kuulete kõike, mille esitamise ise valite, sh muusika, videod ja mängud."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Helid ja vibratsioonid ei sega teid. Kuulete siiski alarme. Samuti kuulete kõike, mille esitamise ise valite, sh muusika, videod ja mängud."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Kohanda"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"See blokeerib KÕIK – sealhulgas alarmide, muusika, videote ja mängude – helid ja värinad. Saate siiski helistada."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"See blokeerib KÕIK helid ja vibratsioonid, sh alarmid, muusika, videod ja mängud. Siiski saate helistada."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"See blokeerib KÕIK – sealhulgas alarmide, muusika, videote ja mängude – helid ja vibratsioonid."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Vähem kiireloomulised märguanded on allpool"</string>
@@ -730,7 +730,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Loobumiseks lohistage alla"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Menüü Pilt pildis"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> on režiimis Pilt pildis"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Kui te ei soovi, et rakendus <xliff:g id="NAME">%s</xliff:g> seda funktsiooni kasutaks, puudutage seadete avamiseks ja lülitage see välja."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Kui te ei soovi, et rakendus <xliff:g id="NAME">%s</xliff:g> seda funktsiooni kasutaks, puudutage seadete avamiseks ja lülitage see välja."</string>
<string name="pip_play" msgid="1417176722760265888">"Esita"</string>
<string name="pip_pause" msgid="8881063404466476571">"Peata"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Järgmise juurde"</string>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index 0d5e58f..820fdb3 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -355,10 +355,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Bilatu"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Lerratu gora hau egiteko: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Lerratu ezkerrera hau egiteko: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Gailuak ez du egingo ez soinurik ez dardararik, baina alarmak, gertaeren abisu-tonuak eta aukeratzen dituzun deitzaileen dei-tonuak joko ditu. Bestalde, zuk erreproduzitutako guztia entzungo duzu, besteak beste, musika, bideoak eta jokoak."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Gailuak ez du egingo ez soinurik ez dardararik, baina alarmak joko ditu. Hala ere, zuk erreproduzitutako guztia entzun ahal izango duzu, besteak beste, musika, bideoak eta jokoak."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Gailuak ez du egingo ez soinurik ez dardararik, baina alarmak, gertaera eta abisuen tonuak, eta aukeratzen dituzun deitzaileen dei-tonuak joko ditu. Bestalde, zuk erreproduzitutako guztia entzungo duzu, besteak beste, musika, bideoak eta jokoak."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Gailuak ez du egingo ez soinurik ez dardararik, baina alarmak joko ditu. Hala ere, zuk erreproduzitutako guztia entzun ahal izango duzu, besteak beste, musika, bideoak eta jokoak."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Pertsonalizatu"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Soinu eta dardara GUZTIAK blokeatuko dira, besteak beste, alarmak, musika, bideoak eta jokoak. Telefono-deiak egiteko aukera izaten jarraituko duzu."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Soinu eta dardara GUZTIAK blokeatuko dira, besteak beste, alarmak, musika, bideoak eta jokoak. Telefono-deiak egiteko aukera izaten jarraituko duzu."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Soinu eta dardara GUZTIAK blokeatuko dira, besteak beste, alarmak, musika, bideoak eta jokoak."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Horren premiazkoak ez diren jakinarazpenak daude behean"</string>
@@ -730,7 +730,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Baztertzeko, arrastatu behera"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Pantaila txiki gainjarriaren menua"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"Pantaila txiki gainjarrian dago <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Ez baduzu nahi <xliff:g id="NAME">%s</xliff:g> zerbitzuak eginbide hori erabiltzea, sakatu hau ezarpenak ireki eta aukera desaktibatzeko."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Ez baduzu nahi <xliff:g id="NAME">%s</xliff:g> zerbitzuak eginbide hori erabiltzea, sakatu hau ezarpenak ireki eta aukera desaktibatzeko."</string>
<string name="pip_play" msgid="1417176722760265888">"Erreproduzitu"</string>
<string name="pip_pause" msgid="8881063404466476571">"Pausatu"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Saltatu hurrengora"</string>
diff --git a/packages/SystemUI/res/values-eu/strings_tv.xml b/packages/SystemUI/res/values-eu/strings_tv.xml
index 6dd81a6..081d1fe 100644
--- a/packages/SystemUI/res/values-eu/strings_tv.xml
+++ b/packages/SystemUI/res/values-eu/strings_tv.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="notification_channel_tv_pip" msgid="134047986446577723">"Pantaila txikia"</string>
+ <string name="notification_channel_tv_pip" msgid="134047986446577723">"Pantaila txiki gainjarria"</string>
<string name="pip_notification_unknown_title" msgid="6289156118095849438">"(Programa izengabea)"</string>
<string name="pip_close" msgid="3480680679023423574">"Itxi PIPa"</string>
<string name="pip_fullscreen" msgid="8604643018538487816">"Pantaila osoa"</string>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index f5c5ac8..0cf5530 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"جستجو"</string>
<string name="description_direction_up" msgid="7169032478259485180">"لغزاندن به بالا برای <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"لغزاندن به چپ برای <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"بجز هشدارها، یادآوریها، رویدادها و تماسگیرندگانی که خودتان مشخص میکنید، هیچ صدا و لرزشی نخواهید داشت. همچنان صدای مواردی را که پخش میکنید میشنوید از جمله صدای موسیقی، ویدیو و بازی."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"بجز هشدارها، هیچ صدا و لرزشی نخواهید داشت. همچنان صدای مواردی را که پخش میکنید میشنوید از جمله صدای موسیقی، ویدیو و بازی."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"بهجز هشدارها، یادآوریها، رویدادها و تماسگیرندگانی که خودتان مشخص میکنید، هیچ صدا و لرزشی نخواهید داشت. همچنان صدای مواردی را که پخش میکنید میشنوید (ازجمله صدای موسیقی، ویدیو و بازی)."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"بهجز هشدارها، هیچ صدا و لرزشی نخواهید داشت. همچنان صدای مواردی را که پخش میکنید میشنوید (ازجمله صدای موسیقی، ویدیو و بازی)."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"سفارشی کردن"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"این کار «همه» صداها و لرزشها از جمله هشدارها، موسیقی، ویدئوها و بازیها را مسدود میکند. همچنان میتوانید تماس تلفنی برقرار کنید."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"این کار «همه» صداها و لرزشها (شامل هشدار، موسیقی، ویدیو و بازی) را مسدود میکند. همچنان میتوانید تماس تلفنی برقرار کنید."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"این کار «همه» صداها و لرزشها از جمله هشدارها، موسیقی، ویدئوها و بازیها را مسدود میکند."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"اعلانهای کمتر فوری در زیر"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"برای نپذیرفتن، به پایین بکشید"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"منوی تصویر در تصویر"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> درحالت تصویر در تصویر است"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"اگر نمیخواهید <xliff:g id="NAME">%s</xliff:g> از این قابلیت استفاده کند، با ضربه زدن، تنظیمات را باز کنید و قابلیت را خاموش کنید."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"اگر نمیخواهید <xliff:g id="NAME">%s</xliff:g> از این قابلیت استفاده کند، با ضربه زدن، تنظیمات را باز کنید و آن را خاموش کنید."</string>
<string name="pip_play" msgid="1417176722760265888">"پخش"</string>
<string name="pip_pause" msgid="8881063404466476571">"توقف موقت"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"رد شدن به بعدی"</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 9edbc78..638ca2e 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Haku"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Liu\'uta ylös ja <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Liu\'uta vasemmalle ja <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Äänet ja värinät eivät häiritse sinua, paitsi jos ne ovat hälytyksiä, muistutuksia, tapahtumia tai määrittämiäsi soittajia. Kuulet edelleen kaiken valitsemasi sisällön, kuten musiikin, videot ja pelit."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Äänet ja värinät eivät häiritse sinua, paitsi jos ne ovat hälytyksiä. Kuulet edelleen kaiken valitsemasi sisällön, kuten musiikin, videot ja pelit."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Äänet ja värinät eivät häiritse sinua, paitsi jos ne ovat hälytyksiä, muistutuksia, tapahtumia tai määrittämiäsi soittajia. Kuulet edelleen kaiken valitsemasi sisällön, kuten musiikin, videot ja pelit."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Äänet ja värinät eivät häiritse sinua, paitsi jos ne ovat hälytyksiä. Kuulet edelleen kaiken valitsemasi sisällön, kuten musiikin, videot ja pelit."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Muokkaa"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Tämä estää KAIKKI äänet ja värinät, mukaan lukien hälytysten, musiikin, videoiden ja pelien äänet ja värinät. Voit kuitenkin soittaa puheluita."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Tämä estää kaikki äänet ja värinät, mukaan lukien hälytysten, musiikin, videoiden ja pelien äänet ja värinät. Voit kuitenkin soittaa puheluita."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Tämä estää KAIKKI äänet ja värinät, mukaan lukien hälytysten, musiikin, videoiden ja pelien äänet ja värinät."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Vähemmän kiireelliset ilmoitukset ovat alla"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Hylkää vetämällä alas."</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Kuva kuvassa ‑valikko"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> on kuva kuvassa ‑tilassa"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Jos et halua, että <xliff:g id="NAME">%s</xliff:g> voi käyttää tätä ominaisuutta, avaa asetukset napauttamalla ja poista se käytöstä."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Jos et halua, että <xliff:g id="NAME">%s</xliff:g> voi käyttää tätä ominaisuutta, avaa asetukset napauttamalla ja poista se käytöstä."</string>
<string name="pip_play" msgid="1417176722760265888">"Toista"</string>
<string name="pip_pause" msgid="8881063404466476571">"Keskeytä"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Siirry seuraavaan"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 951d2af..25c448a 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -355,10 +355,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Recherche"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Faire glisser le doigt vers le haut : <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
<string name="description_direction_left" msgid="7207478719805562165">"Faites glisser votre doigt vers la gauche pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Vous ne serez pas dérangé par les sons et les vibrations, sauf pour les alarmes, les rappels, les événements et les appelants. Vous entendrez tout ce que vous choisissez d\'écouter, y compris la musique, les vidéos et les jeux."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Vous ne serez pas dérangé par les sons et les vibrations, sauf pour les alarmes. Vous entendrez tout ce que vous choisissez d\'écouter, y compris la musique, les vidéos et les jeux."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Vous ne serez pas dérangé par les sons et les vibrations, sauf pour les alarmes, les rappels, les événements et les appelants que vous sélectionnez. Vous entendrez tout ce que vous choisissez d\'écouter, y compris la musique, les vidéos et les jeux."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Vous ne serez pas dérangé par les sons et les vibrations, sauf pour les alarmes. Vous entendrez tout ce que vous choisissez d\'écouter, y compris la musique, les vidéos et les jeux."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Personnaliser"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Cette option permet de bloquer TOUS les sons et vibrations, y compris pour les alarmes, la musique, les vidéos et les jeux. Vous pourrez quand même faire des appels téléphoniques."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Cette option permet de bloquer TOUS les sons et vibrations, y compris pour les alarmes, la musique, les vidéos et les jeux. Vous pourrez quand même faire des appels téléphoniques."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Cette option permet de bloquer TOUS les sons et vibrations, y compris pour les alarmes, la musique, les vidéos et les jeux."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Notifications moins urgentes affichées ci-dessous"</string>
@@ -730,7 +730,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Faire glisser vers le bas pour ignorer"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Menu d\'incrustation d\'image"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> est en mode d\'incrustation d\'image"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Si vous ne voulez pas que <xliff:g id="NAME">%s</xliff:g> utilise cette fonctionnalité, touchez l\'écran pour ouvrir les paramètres, puis désactivez-la."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Si vous ne voulez pas que <xliff:g id="NAME">%s</xliff:g> utilise cette fonctionnalité, touchez l\'écran pour ouvrir les paramètres, puis désactivez-la."</string>
<string name="pip_play" msgid="1417176722760265888">"Lire"</string>
<string name="pip_pause" msgid="8881063404466476571">"Interrompre"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Passer au suivant"</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index fc430be..44a26a6 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -355,10 +355,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Rechercher"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Faites glisser vers le haut pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Faites glisser vers la gauche pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Vous ne serez pas dérangé par des sons ou des vibrations, hormis ceux des alarmes, des rappels, des événements et des appelants de votre choix. Vous entendrez toujours les sons que vous choisirez de jouer, notamment la musique, les vidéos et les jeux."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Vous ne serez pas dérangé par des sons ou des vibrations, hormis ceux des alarmes. Vous entendrez toujours les sons que vous choisirez de jouer, notamment la musique, les vidéos et les jeux."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Vous ne serez pas dérangé par des sons ou des vibrations, hormis ceux des alarmes, des rappels, des événements et des appelants de votre choix. Vous entendrez encore les sons que vous choisirez de jouer, notamment la musique, les vidéos et les jeux."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Vous ne serez pas dérangé par des sons ou des vibrations, hormis ceux des alarmes. Vous entendrez encore les sons que vous choisirez de jouer, notamment la musique, les vidéos et les jeux."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Personnaliser"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Cette option permet de bloquer TOUS les sons et les vibrations, y compris pour les alarmes, la musique, les vidéos et les jeux. Vous pourrez toujours passer des appels téléphoniques."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Cette option permet de bloquer TOUS les sons et les vibrations, y compris pour les alarmes, la musique, les vidéos et les jeux. Vous pourrez encore passer des appels téléphoniques."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Cette option permet de bloquer TOUS les sons et les vibrations, y compris pour les alarmes, la musique, les vidéos et les jeux."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Notifications moins urgentes ci-dessous"</string>
@@ -730,7 +730,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Faire glisser vers le bas pour ignorer"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Menu Picture-in-picture"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> est en mode Picture-in-picture"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Si vous ne voulez pas que l\'application <xliff:g id="NAME">%s</xliff:g> utilise cette fonctionnalité, appuyez ici pour ouvrir les paramètres et la désactiver."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Si vous ne voulez pas que l\'application <xliff:g id="NAME">%s</xliff:g> utilise cette fonctionnalité, appuyez ici pour ouvrir les paramètres et la désactiver."</string>
<string name="pip_play" msgid="1417176722760265888">"Lecture"</string>
<string name="pip_pause" msgid="8881063404466476571">"Suspendre"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Passer au contenu suivant"</string>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index 25563f9..68d1c93 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -355,10 +355,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Buscar"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Pasa o dedo cara arriba para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Pasa o dedo cara a esquerda para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Non te molestará ningún son nin vibración, agás os procedentes de alarmas, recordatorios, eventos e os emisores de chamada especificados. Seguirás escoitando todo aquilo que decidas reproducir, mesmo a música, os vídeos e os xogos."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Non te molestará ningún son nin vibración, agás os procedentes de alarmas. Seguirás escoitando todo aquilo que decidas reproducir, mesmo a música, os vídeos e os xogos."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Non te molestará ningún son nin vibración, agás os procedentes de alarmas, recordatorios, eventos e os emisores de chamada especificados. Seguirás escoitando todo aquilo que decidas reproducir, mesmo a música, os vídeos e os xogos."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Non te molestará ningún son nin vibración, agás os procedentes de alarmas. Seguirás escoitando todo aquilo que decidas reproducir, mesmo a música, os vídeos e os xogos."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Personalizar"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Esta acción bloquea TODOS os sons e vibracións, incluídos os das alarmas, música, vídeos e xogos. Aínda podes facer chamadas de teléfono."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Esta acción bloquea TODOS os sons e vibracións, mesmo os das alarmas, música, vídeos e xogos. Podes seguir facendo chamadas de teléfono."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Esta acción bloquea TODOS os sons e vibracións, incluídos os das alarmas, música, vídeos e xogos."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Notificacións menos urxentes abaixo"</string>
@@ -730,7 +730,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Arrastra cara abaixo para ignorar"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Menú de pantalla superposta"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> está na pantalla superposta"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Se non queres que <xliff:g id="NAME">%s</xliff:g> utilice esta función, toca para abrir a configuración e desactivala."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Se non queres que <xliff:g id="NAME">%s</xliff:g> utilice esta función, toca a configuración para abrir as opcións e desactivar a función."</string>
<string name="pip_play" msgid="1417176722760265888">"Reproducir"</string>
<string name="pip_pause" msgid="8881063404466476571">"Pausar"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Ir ao seguinte"</string>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index 9bae98a..021ad3e 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"શોધો"</string>
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> માટે ઉપર સ્લાઇડ કરો."</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> માટે ડાબે સ્લાઇડ કરો."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"તમને ધ્વનિ કે વાઇબ્રેશનો દ્વારા ખલેલ પહોંચાડવામાં આવશે નહીં, સિવાય કે અલાર્મ, સ્મૃતિપત્રો, ઇવેન્ટ અને તમે ઉલ્લેખ કરો તે કૉલર. તમે સંગીત, વીડિયો અને રમતો સહિત તમે જે કંઈપણ ચલાવવાનું પસંદ કરો તે હજુ પણ સંભળાશે."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"તમને ધ્વનિ કે વાઇબ્રેશનો દ્વારા ખલેલ પહોંચાડવામાં આવશે નહીં, સિવાય કે અલાર્મ. તમે સંગીત, વીડિયો અને રમતો સહિત તમે જે કંઈપણ ચલાવવાનું પસંદ કરો તે હજુ પણ સંભળાશે."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"અલાર્મ, સ્મૃતિપત્રો, ઇવેન્ટ અને તમે ઉલ્લેખ કરો તે કૉલર સિવાય તમને ધ્વનિ કે વાઇબ્રેશન દ્વારા ખલેલ પહોંચાડવામાં આવશે નહીં. સંગીત, વીડિઓ અને રમતો સહિત તમે જે કંઈપણ ચલાવવાનું પસંદ કરશો તે સંભળાતું રહેશે."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"અલાર્મ સિવાય તમને ધ્વનિ કે વાઇબ્રેશન દ્વારા ખલેલ પહોંચાડવામાં આવશે નહીં. સંગીત, વીડિઓ અને રમતો સહિત તમે જે કંઈપણ ચલાવવાનું પસંદ કરશો તે સંભળાતું રહેશે."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"કસ્ટમાઇઝ કરો"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"આ એલાર્મ્સ, સંગીત, વિડિઓઝ અને રમતો સહિત તમામ ધ્વનિઓ અને વાઇબ્રેશન્સને અવરોધિત કરે છે. તમે હજુ પણ ફોન કૉલ્સ કરવા માટે સમર્થ હશો."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"આ અલાર્મ, સંગીત, વીડિઓ અને રમતો સહિત બધા ધ્વનિ કે વાઇબ્રેશનને અવરોધિત કરે છે. ફોન કૉલ કરવા માટે તમે હજી પણ સમર્થ રહેશો."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"એલાર્મ્સ, સંગીત, વિડિઓઝ અને રમતો સહિત તમામ ધ્વનિઓ અને વાઇબ્રેશન્સને આ અવરોધિત કરે છે."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"નીચે ઓછી તાકીદની સૂચનાઓ"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"છોડી દેવા માટે નીચે ખેંચો"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"ચિત્રમાં ચિત્ર મેનૂ"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> ચિત્રમાં-ચિત્રની અંદર છે"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"જો તમે નથી ઇચ્છતા કે <xliff:g id="NAME">%s</xliff:g> આ સુવિધાનો ઉપયોગ કરે, તો સેટિંગ્સ ખોલવા માટે ટૅપ કરો અને તેને બંધ કરો."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"જો તમે નથી ઈચ્છતા કે <xliff:g id="NAME">%s</xliff:g> આ સુવિધાનો ઉપયોગ કરે, તો સેટિંગ્સ ખોલવા માટે ટૅપ કરો અને તે સુવિધાને બંધ કરો."</string>
<string name="pip_play" msgid="1417176722760265888">"ચલાવો"</string>
<string name="pip_pause" msgid="8881063404466476571">"થોભાવો"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"આગલા પર જાઓ"</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 4668b80..fa346af 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"खोजें"</string>
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> के लिए ऊपर स्लाइड करें."</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> के लिए बाएं स्लाइड करें."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"आपको अलार्म, रिमाइंडर, इवेंट और आपने जिन कॉलर के बारे में विशेष रूप से बताया है, उन्हें छोड़कर ध्वनियों और कंपनों से परेशान नहीं किया जाएगा. आपको अभी भी संगीत, वीडियो और गेम सहित वह सब कुछ सुनाई देगा जो आपने चलाने के लिए चुना है."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"आपको अलार्म छोड़कर दूसरी ध्वनियों और कंपनों से परेशान नहीं किया जाएगा. आपको अभी भी संगीत, वीडियो और गेम सहित वह सब कुछ सुनाई देगा जो आपने चलाने के लिए चुना है."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"आपको अलार्म, रिमाइंडर, इवेंट और आपने जिन कॉलर के बारे में खास तौर पर बताया है, उन्हें छोड़कर आवाज़ों और कंपनों से परेशान नहीं किया जाएगा. आपको अभी भी संगीत, वीडियो और गेम सहित वह सब कुछ सुनाई देगा जो आपने चलाने के लिए चुना है."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"आपको अलार्म छोड़कर दूसरी आवाज़ों और कंपनों से परेशान नहीं किया जाएगा. आपको अभी भी संगीत, वीडियो और गेम सहित वह सब कुछ सुनाई देगा जो आपने चलाने के लिए चुना है."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"कस्टमाइज़ करें"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"इससे अलार्म, संगीत, वीडियो और गेम सहित सभी ध्वनियां और कंपन अवरुद्ध हो जाते हैं. आप अभी भी फ़ोन काॅल कर सकेंगे."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"इससे अलार्म, संगीत, वीडियो और गेम सहित सभी आवाज़ें और कंपन अवरुद्ध हो जाते हैं. आप अभी भी फ़ोन काॅल कर सकेंगे."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"इससे अलार्म, संगीत, वीडियो और गेम सहित सभी ध्वनियां और कंपन अवरुद्ध हो जाते हैं."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"कम अत्यावश्यक सूचनाएं नीचे दी गई हैं"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"खारिज करने के लिए नीचे खींचें"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"चित्र में चित्र मेनू"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> स्क्रीन में स्क्रीन के अंदर है"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"अगर आप नहीं चाहते कि <xliff:g id="NAME">%s</xliff:g> इस सुविधा का उपयोग करे, तो सेटिंग खोलने और उसे बंद करने के लिए टैप करें."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"अगर आप नहीं चाहते कि <xliff:g id="NAME">%s</xliff:g> इस सुविधा का उपयोग करे, तो सेटिंग खोलने के लिए टैप करें और उसे बंद करें ."</string>
<string name="pip_play" msgid="1417176722760265888">"चलाएं"</string>
<string name="pip_pause" msgid="8881063404466476571">"रोकें"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"अगले पर जाएं"</string>
diff --git a/packages/SystemUI/res/values-hi/strings_tv.xml b/packages/SystemUI/res/values-hi/strings_tv.xml
index 39f06f6..5e65e46 100644
--- a/packages/SystemUI/res/values-hi/strings_tv.xml
+++ b/packages/SystemUI/res/values-hi/strings_tv.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="notification_channel_tv_pip" msgid="134047986446577723">"चित्र में चित्र"</string>
+ <string name="notification_channel_tv_pip" msgid="134047986446577723">"स्क्रीन में स्क्रीन"</string>
<string name="pip_notification_unknown_title" msgid="6289156118095849438">"(कोई शीर्षक कार्यक्रम नहीं)"</string>
<string name="pip_close" msgid="3480680679023423574">"PIP बंद करें"</string>
<string name="pip_fullscreen" msgid="8604643018538487816">"पूर्ण स्क्रीन"</string>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 5a98451..ea7ba5b 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -355,10 +355,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Pretraživanje"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Kliznite prema gore za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Kliznite lijevo za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Neće vas ometati zvukovi i vibracije, osim alarma, podsjetnika, događaja i pozivatelja koje navedete. I dalje ćete čuti sve što želite reproducirati, uključujući glazbu, videozapise i igre."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Neće vas ometati zvukovi i vibracije, osim alarma. I dalje ćete čuti sve što želite reproducirati, uključujući glazbu, videozapise i igre."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Neće vas ometati zvukovi i vibracije, osim alarma, podsjetnika, događaja i pozivatelja koje navedete. I dalje ćete čuti sve što želite reproducirati, uključujući glazbu, videozapise i igre."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Neće vas ometati zvukovi i vibracije, osim alarma. I dalje ćete čuti sve što želite reproducirati, uključujući glazbu, videozapise i igre."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Prilagodi"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"To blokira SVE zvukove i vibracije, uključujući alarme, glazbu, videozapise i igre. I dalje ćete moći telefonirati."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"To blokira SVE zvukove i vibracije, uključujući alarme, glazbu, videozapise i igre. I dalje ćete moći telefonirati."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"To blokira SVE zvukove i vibracije, uključujući alarme, glazbu, videozapise i igre."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Manje hitne obavijesti pri dnu"</string>
@@ -734,7 +734,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Povucite prema dolje da biste odbacili"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Izbornik slike u slici"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> jest na slici u slici"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Ako ne želite da aplikacija <xliff:g id="NAME">%s</xliff:g> upotrebljava tu značajku, dodirnite da biste otvorili postavke i isključili je."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Ako ne želite da aplikacija <xliff:g id="NAME">%s</xliff:g> upotrebljava tu značajku, dodirnite da biste otvorili postavke i isključili je."</string>
<string name="pip_play" msgid="1417176722760265888">"Reproduciraj"</string>
<string name="pip_pause" msgid="8881063404466476571">"Pauziraj"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Preskoči na sljedeće"</string>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index d734484..a47daf5 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Keresés"</string>
<string name="description_direction_up" msgid="7169032478259485180">"A(z) <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> művelethez csúsztassa felfelé."</string>
<string name="description_direction_left" msgid="7207478719805562165">"A(z) <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> művelethez csúsztassa balra."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Az Ön által meghatározott ébresztéseken, emlékeztetőkön, eseményeken és hívókon kívül nem fogja Önt más hang vagy rezgés megzavarni. Továbbra is lesz hangjuk azoknak a tartalmaknak, amelyeket Ön elindít, például zenék, videók és játékok."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Az ébresztéseken kívül nem fogja Önt más hang és rezgés megzavarni. Továbbra is lesz hangjuk azoknak a tartalmaknak, amelyeket Ön elindít, például zenék, videók és játékok."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Az Ön által meghatározott ébresztéseken, emlékeztetőkön, eseményeken és hívókon kívül nem fogja Önt más hang vagy rezgés megzavarni. Továbbra is lesz hangjuk azoknak a tartalmaknak, amelyeket Ön elindít, például zenék, videók és játékok."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Az ébresztéseken kívül nem fogja Önt más hang és rezgés megzavarni. Továbbra is lesz hangjuk azoknak a tartalmaknak, amelyeket Ön elindít, például zenék, videók és játékok."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Személyre szabás"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Ez letiltja az ÖSSZES hanghatást és rezgést, beleértve az ébresztések, zeneszámok, videók és játékok hangjait is. Telefonhívást továbbra is indíthat majd."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Ez letiltja az ÖSSZES hangot és rezgést, beleértve az ébresztések, zeneszámok, videók és játékok hangjait is. Telefonhívást továbbra is indíthat majd."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Ez letiltja az ÖSSZES hanghatást és rezgést, beleértve az ébresztések, zeneszámok, videók és játékok hangjait is."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"A kevésbé sürgős értesítések lentebb vannak"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Elvetéshez húzza lefelé"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Kép a képben menü"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"A(z) <xliff:g id="NAME">%s</xliff:g> kép a képben funkciót használ"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Ha nem szeretné, hogy a(z) <xliff:g id="NAME">%s</xliff:g> használja ezt a funkciót, koppintson a beállítások megnyitásához, és kapcsolja ki."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Ha nem szeretné, hogy a(z) <xliff:g id="NAME">%s</xliff:g> használja ezt a funkciót, koppintson a beállítások megnyitásához, és kapcsolja ki."</string>
<string name="pip_play" msgid="1417176722760265888">"Lejátszás"</string>
<string name="pip_pause" msgid="8881063404466476571">"Szüneteltetés"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Ugrás a következőre"</string>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index 1359eb0..0dbee58 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Որոնել"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Սահեցրեք վերև <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-ի համար:"</string>
<string name="description_direction_left" msgid="7207478719805562165">"Սահեցրեք ձախ` <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-ի համար:"</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Ձայները և թրթռոցները չեն անհանգստացնի ձեզ, բացի ձեր կողմից նշված զարթուցիչները, հիշեցումները, միջոցառումների ծանուցումները և զանգերը։ Դուք կլսեք ձեր ընտրածի նվագարկումը, այդ թվում՝ երաժշտություն, տեսանյութեր և խաղեր:"</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Ձայները և թրթռոցները, բացի զարթուցիչներից, չեն անհանգստացնի ձեզ: Դուք կլսեք ձեր ընտրածի նվագարկումը, այդ թվում՝ երաժշտություն, տեսանյութեր և խաղեր:"</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Ձայները և թրթռոցները չեն անհանգստացնի ձեզ, բացի ձեր կողմից նշված զարթուցիչները, հիշեցումները, միջոցառումների ծանուցումները և զանգերը։ Դուք կլսեք ձեր ընտրածի նվագարկումը, այդ թվում՝ երաժշտություն, տեսանյութեր և խաղեր:"</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Ձայները և թրթռոցները, բացի զարթուցիչներից, չեն անհանգստացնի ձեզ: Դուք կլսեք ձեր ընտրածի նվագարկումը, այդ թվում՝ երաժշտություն, տեսանյութեր և խաղեր:"</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Հարմարեցնել"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Այս գործողությունն արգելափակում է ԲՈԼՈՐ ձայներն ու թրթռոցները, այդ թվում զարթուցիչները, երաժշտությունը, տեսանյութերի և խաղերի ձայները: Դուք կկարողանաք հեռախոսազանգեր անել։"</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Այս գործողությունն արգելափակում է ԲՈԼՈՐ ձայներն ու թրթռոցները, այդ թվում զարթուցիչները, երաժշտությունը, տեսանյութերի և խաղերի ձայները: Դուք կկարողանաք հեռախոսազանգեր անել։"</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Այս գործողությունն արգելափակում է ԲՈԼՈՐ ձայներն ու թրթռոցները, այդ թվում նաև զարթուցիչների, երաժշտության, տեսանյութերի և խաղերի ձայներն ու թրթռոցները:"</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Պակաս հրատապ ծանուցումները ստորև"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Քաշեք վար՝ փակելու համար"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"«Նկար նկարի մեջ» ռեժիմի ընտրացանկ"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g>-ը «Նկար նկարի մեջ» ռեժիմում է"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Եթե չեք ցանկանում, որ <xliff:g id="NAME">%s</xliff:g>-ն օգտագործի այս գործառույթը, հպեք՝ կարգավորումները բացելու և այն անջատելու համար։"</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Եթե չեք ցանկանում, որ <xliff:g id="NAME">%s</xliff:g>-ն օգտագործի այս գործառույթը, հպեք՝ կարգավորումները բացելու և այն անջատելու համար։"</string>
<string name="pip_play" msgid="1417176722760265888">"Նվագարկել"</string>
<string name="pip_pause" msgid="8881063404466476571">"Դադարեցնել"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Անցնել հաջորդին"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 6166671..12ff89d 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Telusuri"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Geser ke atas untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Geser ke kiri untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Anda tidak akan terganggu oleh suara dan getaran, kecuali dari alarm, pengingat, acara, dan penelepon yang Anda tentukan. Anda akan tetap mendengar apa pun yang telah dipilih untuk diputar, termasuk musik, video, dan game."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Anda tidak akan terganggu oleh suara dan getaran, kecuali dari alarm. Anda akan tetap mendengar apa pun yang telah dipilih untuk diputar, termasuk musik, video, dan game."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Anda tidak akan terganggu oleh suara dan getaran, kecuali dari alarm, pengingat, acara, dan penelepon yang Anda tentukan. Anda akan tetap mendengar apa pun yang telah dipilih untuk diputar, termasuk musik, video, dan game."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Anda tidak akan terganggu oleh suara dan getaran, kecuali dari alarm. Anda akan tetap mendengar apa pun yang telah dipilih untuk diputar, termasuk musik, video, dan game."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Sesuaikan"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"SEMUA suara dan getaran, termasuk dari alarm, musik, video, dan game akan diblokir. Anda tetap dapat melakukan panggilan telepon."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"SEMUA suara dan getaran, termasuk dari alarm, musik, video, dan game akan diblokir. Anda tetap dapat melakukan panggilan telepon."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"SEMUA suara dan getaran, termasuk dari alarm, musik, video, dan game akan diblokir."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Notifikasi kurang darurat di bawah"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Seret ke bawah untuk menutup"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Menu picture in picture"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> adalah picture-in-picture"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Jika Anda tidak ingin <xliff:g id="NAME">%s</xliff:g> menggunakan fitur ini, tap untuk membuka setelan dan menonaktifkannya."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Jika Anda tidak ingin <xliff:g id="NAME">%s</xliff:g> menggunakan fitur ini, tap untuk membuka setelan dan menonaktifkannya."</string>
<string name="pip_play" msgid="1417176722760265888">"Putar"</string>
<string name="pip_pause" msgid="8881063404466476571">"Jeda"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Lewati ke berikutnya"</string>
diff --git a/packages/SystemUI/res/values-in/strings_tv.xml b/packages/SystemUI/res/values-in/strings_tv.xml
index ca3b32f..a1aa168 100644
--- a/packages/SystemUI/res/values-in/strings_tv.xml
+++ b/packages/SystemUI/res/values-in/strings_tv.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="notification_channel_tv_pip" msgid="134047986446577723">"Gambar-dalam-Gambar"</string>
+ <string name="notification_channel_tv_pip" msgid="134047986446577723">"Picture-in-picture"</string>
<string name="pip_notification_unknown_title" msgid="6289156118095849438">"(Program tanpa judul)"</string>
<string name="pip_close" msgid="3480680679023423574">"Tutup PIP"</string>
<string name="pip_fullscreen" msgid="8604643018538487816">"Layar penuh"</string>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index 74d06d4..9100ca8 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Leita"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Strjúktu upp til að <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Strjúktu til vinstri til að <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Þú verður ekki fyrir truflunum frá hljóðmerkjum og titringi, fyrir utan vekjara, áminningar, viðburði og símtöl frá þeim sem þú leyfir fyrirfram. Þú heyrir áfram í öllu sem þú velur að spila, svo sem tónlist, myndskeiðum og leikjum."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Þú verður ekki fyrir truflunum frá hljóðmerkjum og titringi, fyrir utan vekjara. Þú heyrir áfram í öllu sem þú velur að spila, svo sem tónlist, myndskeiðum og leikjum."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Þú verður ekki fyrir truflunum frá hljóðmerkjum og titringi, fyrir utan vekjara, áminningar, viðburði og símtöl frá þeim sem þú leyfir fyrirfram. Þú heyrir áfram í öllu sem þú velur að spila, svo sem tónlist, myndskeiðum og leikjum."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Þú verður ekki fyrir truflunum frá hljóðmerkjum og titringi, fyrir utan vekjara. Þú heyrir áfram í öllu sem þú velur að spila, svo sem tónlist, myndskeiðum og leikjum."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Sérsníða"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Þetta lokar á ÖLL hljóðmerki og titring, þ.m.t. frá vekjurum, tónlist, myndskeiðum og leikjum. Þú getur áfram hringt símtöl."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Þetta lokar á ÖLL hljóðmerki og titring, þ.m.t. frá vekjurum, tónlist, myndskeiðum og leikjum. Þú getur áfram hringt símtöl."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Þetta lokar á ÖLL hljóðmerki og titring, þ.m.t. frá vekjurum, tónlist, myndskeiðum og leikjum."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Minna áríðandi tilkynningar fyrir neðan"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Draga niður til að hunsa"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Valmynd fyrir mynd í mynd"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> er með mynd í mynd"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Ef þú vilt ekki að <xliff:g id="NAME">%s</xliff:g> noti þennan eiginleika skaltu ýta til að opna stillingarnar og slökkva á því."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Ef þú vilt ekki að <xliff:g id="NAME">%s</xliff:g> noti þennan eiginleika skaltu ýta til að opna stillingarnar og slökkva á því."</string>
<string name="pip_play" msgid="1417176722760265888">"Spila"</string>
<string name="pip_pause" msgid="8881063404466476571">"Gera hlé"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Fara á næsta"</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 6ed2c5e..134503b 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -355,10 +355,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Ricerca"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Su per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"A sinistra per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Non verrai disturbato da suoni e vibrazioni, ad eccezione di sveglie, promemoria, eventi, chiamate da contatti da te specificati ed elementi che hai scelto di continuare a riprodurre, inclusi video, musica e giochi."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Non verrai disturbato da suoni e vibrazioni, ad eccezione delle sveglie e degli elementi che hai scelto di continuare a riprodurre, inclusi video, musica e giochi."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Non verrai disturbato da suoni e vibrazioni, ad eccezione di sveglie, promemoria, eventi, chiamate da contatti da te specificati ed elementi che hai scelto di continuare a riprodurre, inclusi video, musica e giochi."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Non verrai disturbato da suoni e vibrazioni, ad eccezione delle sveglie e degli elementi che hai scelto di continuare a riprodurre, inclusi video, musica e giochi."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Personalizza"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Verranno bloccati TUTTI i suoni e le vibrazioni, anche di sveglie, musica, video e giochi. Potrai ancora telefonare."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Verranno bloccati TUTTI i suoni e le vibrazioni, anche di sveglie, musica, video e giochi. Potrai ancora telefonare."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Verranno bloccati TUTTI i suoni e le vibrazioni, anche di sveglie, musica, video e giochi."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Notifiche meno urgenti in basso"</string>
@@ -730,7 +730,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Trascina verso il basso per ignorare"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Menu Picture in picture"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> è in Picture in picture"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Se non desideri che l\'app <xliff:g id="NAME">%s</xliff:g> utilizzi questa funzione, tocca per aprire le impostazioni e disattivarla."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Se non desideri che l\'app <xliff:g id="NAME">%s</xliff:g> utilizzi questa funzione, tocca per aprire le impostazioni e disattivarla."</string>
<string name="pip_play" msgid="1417176722760265888">"Riproduci"</string>
<string name="pip_pause" msgid="8881063404466476571">"Metti in pausa"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Passa ai contenuti successivi"</string>
diff --git a/packages/SystemUI/res/values-it/strings_tv.xml b/packages/SystemUI/res/values-it/strings_tv.xml
index 629e306..81d76d5 100644
--- a/packages/SystemUI/res/values-it/strings_tv.xml
+++ b/packages/SystemUI/res/values-it/strings_tv.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="notification_channel_tv_pip" msgid="134047986446577723">"Picture-in-Picture"</string>
+ <string name="notification_channel_tv_pip" msgid="134047986446577723">"Picture in picture"</string>
<string name="pip_notification_unknown_title" msgid="6289156118095849438">"(Programma senza titolo)"</string>
<string name="pip_close" msgid="3480680679023423574">"Chiudi PIP"</string>
<string name="pip_fullscreen" msgid="8604643018538487816">"Schermo intero"</string>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index f424a30..ba5816b 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -357,10 +357,10 @@
<string name="description_target_search" msgid="3091587249776033139">"חיפוש"</string>
<string name="description_direction_up" msgid="7169032478259485180">"הסט למעלה כדי להציג <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"הסט שמאלה כדי להציג <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"כדי לא להפריע לך, המכשיר לא ירטוט ולא ישמיע שום צליל, חוץ מהתראות, תזכורות, אירועים ושיחות ממתקשרים מסוימים לבחירתך. המצב הזה לא ישפיע על צלילים שהם חלק מתוכן שבחרת להפעיל, כמו מוזיקה, סרטונים ומשחקים."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"כדי לא להפריע לך, המכשיר לא ירטוט ולא ישמיע שום צליל, חוץ מהתראות. המצב הזה לא ישפיע על צלילים שהם חלק מתוכן שבחרת להפעיל, כמו מוזיקה, סרטונים ומשחקים."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"כדי לא להפריע לך, המכשיר לא ירטוט ולא ישמיע שום צליל, חוץ מהתראות, תזכורות, אירועים ושיחות ממתקשרים מסוימים לבחירתך. המצב הזה לא ישפיע על צלילים שהם חלק מתוכן שבחרת להפעיל, כמו מוזיקה, סרטונים ומשחקים."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"כדי לא להפריע לך, המכשיר לא ירטוט ולא ישמיע שום צליל, חוץ מהתראות. המצב הזה לא ישפיע על צלילים שהם חלק מתוכן שבחרת להפעיל, כמו מוזיקה, סרטונים ומשחקים."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"התאמה אישית"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"פעולה זו מבטלת את כל הצלילים והרטט, כולל צלילים ורטט שמקורם בהתראות, מוזיקה, סרטונים ומשחקים. בכל מקרה, עדיין אפשר להתקשר."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"פעולה זו מבטלת את כל הצלילים והרטט, כולל צלילים ורטט שמקורם בהתראות, מוזיקה, סרטונים ומשחקים. בכל מקרה, עדיין אפשר להתקשר."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"פעולה זו מבטלת את כל הצלילים והרטט, כולל בהתראות, מוזיקה, סרטונים ומשחקים."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"הודעות בדחיפות נמוכה יותר בהמשך"</string>
@@ -740,7 +740,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"גרור למטה כדי לסגור"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"תפריט \'תמונה בתוך תמונה\'"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> במצב תמונה בתוך תמונה"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"אם אינך רוצה שהתכונה הזו תשמש את <xliff:g id="NAME">%s</xliff:g>, הקש כדי לפתוח את ההגדרות ולכבות את התכונה."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"אם אינך רוצה שהתכונה הזו תשמש את <xliff:g id="NAME">%s</xliff:g>, יש להקיש כדי לפתוח את ההגדרות ולכבות את התכונה."</string>
<string name="pip_play" msgid="1417176722760265888">"הפעל"</string>
<string name="pip_pause" msgid="8881063404466476571">"השהה"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"ברצוני לדלג אל הבא"</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 920a96b..8b86acc 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -355,10 +355,10 @@
<string name="description_target_search" msgid="3091587249776033139">"検索します"</string>
<string name="description_direction_up" msgid="7169032478259485180">"上にスライドして<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>を行います。"</string>
<string name="description_direction_left" msgid="7207478719805562165">"左にスライドして<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>を行います。"</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"アラーム、リマインダー、予定、指定した人からの着信以外の音やバイブレーションに煩わされることはありません。音楽、動画、ゲームなど再生対象として選択したコンテンツは引き続き再生されます。"</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"アラーム以外の音やバイブレーションに煩わされることはありません。音楽、動画、ゲームなど再生対象として選択したコンテンツは引き続き再生されます。"</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"アラーム、リマインダー、予定、指定した人からの着信以外の音やバイブレーションに煩わされることはありません。音楽、動画、ゲームなど再生対象として選択したコンテンツは引き続き再生されます。"</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"アラーム以外の音やバイブレーションに煩わされることはありません。音楽、動画、ゲームなど再生対象として選択したコンテンツは引き続き再生されます。"</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"カスタマイズ"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"アラーム、音楽、動画、ゲームを含むすべての音とバイブレーションがブロックされます。電話をかけることはできます。"</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"アラーム、音楽、動画、ゲームを含むすべての音とバイブレーションがブロックされます。電話をかけることはできます。"</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"アラーム、音楽、動画、ゲームを含むすべての音とバイブレーションがブロックされます。"</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"緊急度の低い通知を下に表示"</string>
@@ -730,7 +730,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"下にドラッグして閉じる"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"ピクチャー イン ピクチャー メニュー"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g>はピクチャー イン ピクチャーで表示中です"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"<xliff:g id="NAME">%s</xliff:g>でこの機能を使用しない場合は、タップして設定を開いて OFF にしてください。"</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"<xliff:g id="NAME">%s</xliff:g>でこの機能を使用しない場合は、タップして設定を開いて OFF にしてください。"</string>
<string name="pip_play" msgid="1417176722760265888">"再生"</string>
<string name="pip_pause" msgid="8881063404466476571">"一時停止"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"次へスキップ"</string>
diff --git a/packages/SystemUI/res/values-ja/strings_tv.xml b/packages/SystemUI/res/values-ja/strings_tv.xml
index 134bb18..4596551 100644
--- a/packages/SystemUI/res/values-ja/strings_tv.xml
+++ b/packages/SystemUI/res/values-ja/strings_tv.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="notification_channel_tv_pip" msgid="134047986446577723">"PIP"</string>
+ <string name="notification_channel_tv_pip" msgid="134047986446577723">"ピクチャー イン ピクチャー"</string>
<string name="pip_notification_unknown_title" msgid="6289156118095849438">"(無題の番組)"</string>
<string name="pip_close" msgid="3480680679023423574">"PIP を閉じる"</string>
<string name="pip_fullscreen" msgid="8604643018538487816">"全画面表示"</string>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index 153b1b2..72c4215 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"ძიება"</string>
<string name="description_direction_up" msgid="7169032478259485180">"გაასრიალეთ ზემოთ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-თვის."</string>
<string name="description_direction_left" msgid="7207478719805562165">"გაასრიალეთ მარცხნივ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-თვის."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"თქვენ მიერ მითითებული მაღვიძარების, შეხსენებების, ღონისძიებებისა და ზარების გარდა, არავითარი ხმა და ვიბრაცია არ შეგაწუხებთ. თქვენ მაინც შეგეძლებათ ნებისმიერი სასურველი რამის, მაგალითად, მუსიკის, ვიდეოებისა და თამაშების მოსმენა."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"მაღვიძარების გარდა, არავითარი ხმა და ვიბრაცია არ შეგაწუხებთ. თქვენ მაინც შეგეძლებათ ნებისმიერი სასურველი რამის, მაგალითად, მუსიკის, ვიდეოებისა და თამაშების მოსმენა."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"თქვენ მიერ მითითებული მაღვიძარების, შეხსენებების, მოვლენებისა და ზარების გარდა, არავითარი ხმა და ვიბრაცია არ შეგაწუხებთ. თქვენ მაინც შეძლებთ სასურველი კონტენტის, მაგალითად, მუსიკის, ვიდეოებისა და თამაშების აუდიოს მოსმენა."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"მაღვიძარების გარდა, არავითარი ხმა და ვიბრაცია არ შეგაწუხებთ. თქვენ მაინც შეძლებთ სასურველი კონტენტის, მაგალითად, მუსიკის, ვიდეოებისა და თამაშების აუდიოს მოსმენა."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"მორგება"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"ეს ბლოკავს ყველა ხმასა და ვიბრაციას, მათ შორის, მაღვიძარების, მუსიკის, ვიდეოებისა და თამაშების. მიუხედავად ამისა, თქვენ მაინც შეძლებთ სატელეფონო ზარების განხორციელებას."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"ეს ვარიანტი დაბლოკავს ნებისმიერ ხმასა და ვიბრაციას, მათ შორის, მაღვიძარების, მუსიკის, ვიდეოებისა და თამაშების. მიუხედავად ამისა, თქვენ მაინც შეძლებთ სატელეფონო ზარების განხორციელებას."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"ეს ბლოკავს ყველა ხმასა და ვიბრაციას, მათ შორის, მაღვიძარების, მუსიკის, ვიდეოებისა და თამაშების."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"ქვემოთ მითითებულია ნაკლებად სასწრაფო შეტყობინებები"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"დასახურად ჩავლებით ჩამოიტანეთ ქვემოთ"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"მენიუ „ეკრანი ეკრანში“"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> იყენებს რეჟიმს „ეკრანი ეკრანში“"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"თუ არ გსურთ, რომ <xliff:g id="NAME">%s</xliff:g> ამ ფუნქციას იყენებდეს, აქ შეხებით შეგიძლიათ გახსნათ პარამეტრები და გამორთოთ."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"თუ არ გსურთ, რომ <xliff:g id="NAME">%s</xliff:g> ამ ფუნქციას იყენებდეს, აქ შეხებით შეგიძლიათ გახსნათ პარამეტრები და გამორთოთ ის."</string>
<string name="pip_play" msgid="1417176722760265888">"დაკვრა"</string>
<string name="pip_pause" msgid="8881063404466476571">"დაპაუზება"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"შემდეგზე გადასვლა"</string>
diff --git a/packages/SystemUI/res/values-ka/strings_tv.xml b/packages/SystemUI/res/values-ka/strings_tv.xml
index 1a97590..f4f818b 100644
--- a/packages/SystemUI/res/values-ka/strings_tv.xml
+++ b/packages/SystemUI/res/values-ka/strings_tv.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="notification_channel_tv_pip" msgid="134047986446577723">"სურათი სურათში"</string>
+ <string name="notification_channel_tv_pip" msgid="134047986446577723">"ეკრანი ეკრანში"</string>
<string name="pip_notification_unknown_title" msgid="6289156118095849438">"(პროგრამის სათაურის გარეშე)"</string>
<string name="pip_close" msgid="3480680679023423574">"PIP-ის დახურვა"</string>
<string name="pip_fullscreen" msgid="8604643018538487816">"სრულ ეკრანზე"</string>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index 5de7f45..5d5f807 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Іздеу"</string>
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үшін жоғары сырғыту."</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үшін солға сырғыту."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Дабылдар, еске салғыштар, оқиғалар мен өзіңіз көрсеткен контактілердің қоңырауларынан басқа дыбыстар мен дірілдер мазаламайтын болады. Музыка, бейне және ойындар сияқты ойнатылатын мазмұндардың дыбысы өшірілмейді."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Дабылдардан басқа ешқандай дыбыстар мен дірілдер мазаламайтын болады. Музыка, бейне және ойындар сияқты ойнатылатын мазмұндардың дыбысы өшірілмейді."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Дабылдар, еске салғыштар, оқиғалар мен өзіңіз көрсеткен контактілердің қоңырауларынан басқа дыбыстар мен дірілдер мазаламайтын болады. Музыка, бейне және ойындар сияқты ойнатылатын мазмұндарды ести алатын боласыз."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Дабылдардан басқа ешқандай дыбыстар мен дірілдер мазаламайтын болады. Музыка, бейне және ойындар сияқты ойнатылатын мазмұндарды ести алатын боласыз."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Реттеу"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"БАРЛЫҚ, соның ішінде дабылдардың, музыканың, бейнелердің және ойындардың дыбыстары мен дірілдері өшіріледі. Бірақ телефон қоңыраулары шалына береді."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Дабыл, музыка, бейнелер мен ойындарды қоса алғанда, барлық дыбыстар мен дірілдер бөгелетін болады. Қоңырау шала беруіңізге болады."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"БАРЛЫҚ, соның ішінде дабылдардың, музыканың, бейнелердің және ойындардың дыбыстары мен дірілдері өшіріледі."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Шұғылдығы азырақ хабарландырулар төменде"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Жабу үшін төмен қарай сүйреңіз"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"\"Сурет ішіндегі сурет\" мәзірі"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> \"сурет ішіндегі сурет\" режимінде"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"<xliff:g id="NAME">%s</xliff:g> деген пайдаланушының бұл функцияны пайдалануына жол бермеу үшін параметрлерді түртіп ашыңыз да, оларды өшіріңіз."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"<xliff:g id="NAME">%s</xliff:g> деген пайдаланушының бұл мүмкіндікті пайдалануын қаламасаңыз, параметрлерді түртіп ашыңыз да, оларды өшіріңіз."</string>
<string name="pip_play" msgid="1417176722760265888">"Ойнату"</string>
<string name="pip_pause" msgid="8881063404466476571">"Кідірту"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Келесіге өту"</string>
diff --git a/packages/SystemUI/res/values-kk/strings_tv.xml b/packages/SystemUI/res/values-kk/strings_tv.xml
index 305ad2e..7112017 100644
--- a/packages/SystemUI/res/values-kk/strings_tv.xml
+++ b/packages/SystemUI/res/values-kk/strings_tv.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="notification_channel_tv_pip" msgid="134047986446577723">"Сурет ішіндегі сурет"</string>
+ <string name="notification_channel_tv_pip" msgid="134047986446577723">"Суреттегі сурет"</string>
<string name="pip_notification_unknown_title" msgid="6289156118095849438">"(Атаусыз бағдарлама)"</string>
<string name="pip_close" msgid="3480680679023423574">"PIP жабу"</string>
<string name="pip_fullscreen" msgid="8604643018538487816">"Толық экран"</string>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index c7603ca..e161f59 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"ស្វែងរក"</string>
<string name="description_direction_up" msgid="7169032478259485180">"រុញឡើងលើដើម្បី <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ។"</string>
<string name="description_direction_left" msgid="7207478719805562165">"រុញទៅឆ្វេងដើម្បី <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ។"</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"សំឡេង និងរំញ័រមិនរំខានដល់អ្នកឡើយ លើកលែងតែសំឡេងរោទ៍ ការរំលឹក ព្រឹត្តិការណ៍ និងអ្នកហៅទូរសព្ទដែលអ្នកបញ្ជាក់។ អ្នកនៅតែឮអ្វីគ្រប់យ៉ាងដែលអ្នកជ្រើសរើសឲ្យលេង រួមទាំងតន្រ្តី វីដេអូ និងហ្គេមផងដែរ។"</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"សំឡេង និងរំញ័រមិនរំខានដល់អ្នកឡើយ លើកលែងតែសំឡេងរោទ៍។ អ្នកនៅតែឮអ្វីគ្រប់យ៉ាងដែលអ្នកជ្រើសរើសឲ្យលេង រួមទាំងតន្រ្តី វីដេអូ និងហ្គេមផងដែរ។"</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"សំឡេង និងរំញ័រនឹងមិនរំខានដល់អ្នកឡើយ លើកលែងតែម៉ោងរោទ៍ ការរំលឹក ព្រឹត្តិការណ៍ និងអ្នកហៅទូរសព្ទដែលអ្នកបញ្ជាក់ប៉ុណ្ណោះ។ អ្នកនឹងនៅតែឮសំឡេងសកម្មភាពគ្រប់យ៉ាងដែលអ្នកលេងដដែល រួមទាំងតន្រ្តី វីដេអូ និងហ្គេម។"</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"សំឡេង និងរំញ័រនឹងមិនរំខានដល់អ្នកឡើយ លើកលែងតែម៉ោងរោទ៍ប៉ុណ្ណោះ។ អ្នកនឹងនៅតែឮសំឡេងសកម្មភាពគ្រប់យ៉ាងដែលអ្នកលេងដដែល រួមទាំងតន្រ្តី វីដេអូ និងហ្គេម។"</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"ប្ដូរតាមបំណង"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"វារារាំងសំឡេង និងរំញ័រទាំងអស់ ដោយរួមបញ្ចូលទាំងសំឡេងរោទ៍ តន្ត្រី វីដេអូ និងហ្គេម។ អ្នកនឹងនៅតែអាចធ្វើការហៅទូរសព្ទបានដដែល។"</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"សកម្មភាពនេះទប់ស្កាត់សំឡេង និងរំញ័រទាំងអស់ រួមទាំងម៉ោងរោទ៍ តន្ត្រី វីដេអូ និងហ្គេមផងដែរ។ អ្នកនឹងនៅតែអាចធ្វើការហៅទូរសព្ទបានដដែល។"</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"វារារាំងសំឡេង និងរំញ័រទាំងអស់ដែលចេញពីម៉ោងរោទិ៍ តន្ត្រី វីដេអូ និងហ្គេម។"</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"ការជូនដំណឹងមិនសូវបន្ទាន់ខាងក្រោម"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"អូសចុះក្រោមដើម្បីបដិសេធ"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"ម៉ឺនុយរូបក្នុងរូប"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> ស្ថិតក្នុងមុខងាររូបក្នុងរូប"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"ប្រសិនបើអ្នកមិនចង់ឲ្យ <xliff:g id="NAME">%s</xliff:g> ប្រើមុខងារនេះទេ សូមចុចដើម្បីបើកការកំណត់ រួចបិទវា។"</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"ប្រសិនបើអ្នកមិនចង់ឲ្យ <xliff:g id="NAME">%s</xliff:g> ប្រើមុខងារនេះ សូមចុចបើកការកំណត់ រួចបិទវា។"</string>
<string name="pip_play" msgid="1417176722760265888">"លេង"</string>
<string name="pip_pause" msgid="8881063404466476571">"ផ្អាក"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"រំលងទៅបន្ទាប់"</string>
diff --git a/packages/SystemUI/res/values-km/strings_tv.xml b/packages/SystemUI/res/values-km/strings_tv.xml
index 5da818e..641bba3 100644
--- a/packages/SystemUI/res/values-km/strings_tv.xml
+++ b/packages/SystemUI/res/values-km/strings_tv.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="notification_channel_tv_pip" msgid="134047986446577723">"រូបភាពក្នុងរូបភាព"</string>
+ <string name="notification_channel_tv_pip" msgid="134047986446577723">"រូបក្នុងរូប"</string>
<string name="pip_notification_unknown_title" msgid="6289156118095849438">"(កម្មវិធីគ្មានចំណងជើង)"</string>
<string name="pip_close" msgid="3480680679023423574">"បិទ PIP"</string>
<string name="pip_fullscreen" msgid="8604643018538487816">"ពេញអេក្រង់"</string>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index 861a06e..2284c9b 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"ಹುಡುಕಿ"</string>
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ಗಾಗಿ ಮೇಲಕ್ಕೆ ಸ್ಲೈಡ್ ಮಾಡಿ."</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ಗಾಗಿ ಎಡಕ್ಕೆ ಸ್ಲೈಡ್ ಮಾಡಿ."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"ಅಲಾರಾಂಗಳು, ಜ್ಞಾಪನೆಗಳು, ಈವೆಂಟ್ಗಳು ಹಾಗೂ ನೀವು ಸೂಚಿಸಿರುವ ಕರೆದಾರರನ್ನು ಹೊರತುಪಡಿಸಿ ಬೇರಾವುದೇ ಸದ್ದುಗಳು ಅಥವಾ ವೈಬ್ರೇಶನ್ಗಳು ನಿಮಗೆ ತೊಂದರೆ ನೀಡುವುದಿಲ್ಲ. ಹಾಗಿದ್ದರೂ, ನೀವು ಪ್ಲೇ ಮಾಡುವ ಸಂಗೀತ, ವೀಡಿಯೊಗಳು ಮತ್ತು ಆಟಗಳ ಆಡಿಯೊ ನಿಮಗೆ ಕೇಳಿಸುತ್ತದೆ."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"ಅಲಾರಾಂಗಳನ್ನು ಹೊರತುಪಡಿಸಿ, ಬೇರಾವುದೇ ಸದ್ದುಗಳು ಅಥವಾ ವೈಬ್ರೇಶನ್ಗಳು ನಿಮಗೆ ತೊಂದರೆ ನೀಡುವುದಿಲ್ಲ. ಹಾಗಿದ್ದರೂ, ನೀವು ಪ್ಲೇ ಮಾಡುವ ಸಂಗೀತ, ವೀಡಿಯೊಗಳು ಮತ್ತು ಆಟಗಳ ಆಡಿಯೊ ನಿಮಗೆ ಕೇಳಿಸುತ್ತದೆ."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"ಅಲಾರಾಂಗಳು, ಜ್ಞಾಪನೆಗಳು, ಈವೆಂಟ್ಗಳು ಹಾಗೂ ನೀವು ಸೂಚಿಸಿರುವ ಕರೆದಾರರನ್ನು ಹೊರತುಪಡಿಸಿ ಬೇರಾವುದೇ ಸದ್ದುಗಳು ಅಥವಾ ವೈಬ್ರೇಶನ್ಗಳು ನಿಮಗೆ ತೊಂದರೆ ನೀಡುವುದಿಲ್ಲ. ಹಾಗಿದ್ದರೂ, ನೀವು ಪ್ಲೇ ಮಾಡುವ ಸಂಗೀತ, ವೀಡಿಯೊಗಳು ಮತ್ತು ಆಟಗಳ ಆಡಿಯೊವನ್ನು ನೀವು ಕೇಳಿಸಿಕೊಳ್ಳುತ್ತೀರಿ."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"ಅಲಾರಾಂಗಳನ್ನು ಹೊರತುಪಡಿಸಿ, ಬೇರಾವುದೇ ಸದ್ದುಗಳು ಅಥವಾ ವೈಬ್ರೇಶನ್ಗಳು ನಿಮಗೆ ತೊಂದರೆ ನೀಡುವುದಿಲ್ಲ. ಹಾಗಿದ್ದರೂ, ನೀವು ಪ್ಲೇ ಮಾಡುವ ಸಂಗೀತ, ವೀಡಿಯೊಗಳು ಮತ್ತು ಆಟಗಳ ಆಡಿಯೊವನ್ನು ಕೇಳಿಸಿಕೊಳ್ಳುತ್ತೀರಿ."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"ಕಸ್ಟಮೈಸ್ ಮಾಡು"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"ಇದು ಅಲಾರಮ್ಗಳು, ಸಂಗೀತ, ವೀಡಿಯೊಗಳು, ಮತ್ತು ಗೇಮ್ಗಳು ಸೇರಿದಂತೆ ಎಲ್ಲಾ ಧ್ವನಿಗಳು ಮತ್ತು ವೈಬ್ರೇಶನ್ಗಳನ್ನು ನಿರ್ಬಂಧಿಸುತ್ತದೆ. ನಿಮಗೆ ಈಗಲೂ ಫೋನ್ ಕರೆಗಳನ್ನು ಮಾಡಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"ಇದು ಅಲಾರಮ್ಗಳು, ಸಂಗೀತ, ವೀಡಿಯೊಗಳು, ಮತ್ತು ಗೇಮ್ಗಳು ಸೇರಿದಂತೆ ಎಲ್ಲಾ ಧ್ವನಿಗಳು ಮತ್ತು ವೈಬ್ರೇಶನ್ಗಳನ್ನು ನಿರ್ಬಂಧಿಸುತ್ತದೆ. ನಿಮಗೆ ಈಗಲೂ ಫೋನ್ ಕರೆಗಳನ್ನು ಮಾಡಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"ಇದು ಅಲಾರಮ್ಗಳು, ಸಂಗೀತ, ವೀಡಿಯೊಗಳು, ಮತ್ತು ಗೇಮ್ಗಳು ಸೇರಿದಂತೆ ಎಲ್ಲಾ ಧ್ವನಿಗಳು ಮತ್ತು ವೈಬ್ರೇಶನ್ಗಳನ್ನು ನಿರ್ಬಂಧಿಸುತ್ತದೆ."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"ಕೆಳಗೆ ಕಡಿಮೆ ಅವಸರದ ಅಧಿಸೂಚನೆಗಳು"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"ವಜಾಗೊಳಿಸಲು ಕೆಳಕ್ಕೆ ಡ್ರ್ಯಾಗ್ ಮಾಡಿ"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"ಚಿತ್ರದಲ್ಲಿ ಚಿತ್ರ ಮೆನು"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> ಚಿತ್ರದಲ್ಲಿನ ಚಿತ್ರದಲ್ಲಿದೆ"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"<xliff:g id="NAME">%s</xliff:g> ಈ ವೈಶಿಷ್ಟ್ಯ ಬಳಸುವುದನ್ನು ನೀವು ಬಯಸದಿದ್ದರೆ, ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ತೆರೆದು, ಅದನ್ನು ಆಫ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"<xliff:g id="NAME">%s</xliff:g> ಈ ವೈಶಿಷ್ಟ್ಯ ಬಳಸುವುದನ್ನು ನೀವು ಬಯಸದಿದ್ದರೆ, ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ತೆರೆಯಲು ಮತ್ತು ಅದನ್ನು ಆಫ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="pip_play" msgid="1417176722760265888">"ಪ್ಲೇ"</string>
<string name="pip_pause" msgid="8881063404466476571">"ವಿರಾಮಗೊಳಿಸಿ"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"ಮುಂದಕ್ಕೆ ಸ್ಕಿಪ್ ಮಾಡಿ"</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index 7667c5e..31cc047 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -355,10 +355,10 @@
<string name="description_target_search" msgid="3091587249776033139">"검색"</string>
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>하려면 위로 슬라이드"</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>하려면 왼쪽으로 슬라이드"</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"알람, 알림, 일정 및 지정한 발신자부터 받은 연락을 제외하고 소리와 진동을 끕니다. 음악, 동영상, 게임 등에서 재생하도록 선택한 소리는 정상적으로 들립니다."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"알람을 제외하고 소리와 진동을 끕니다. 음악, 동영상, 게임 등에서 재생하도록 선택한 소리는 정상적으로 들립니다."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"알람, 알림, 일정 및 지정한 발신자로부터 받은 전화를 제외한 소리와 진동을 끕니다. 음악, 동영상, 게임 등 재생하도록 선택한 소리는 정상적으로 들립니다."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"알람을 제외한 소리와 진동을 끕니다. 음악, 동영상, 게임 등 재생하도록 선택한 소리는 정상적으로 들립니다."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"맞춤설정"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"알람, 음악, 동영상, 게임을 포함하여 모든 소리와 진동을 끕니다. 전화는 걸 수 있습니다."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"알람, 음악, 동영상, 게임을 비롯한 모든 소리와 진동을 끕니다. 이 경우에도 전화는 걸 수 있습니다."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"알람, 음악, 동영상, 게임을 포함하여 모든 소리와 진동을 끕니다."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"아래에 덜 급한 알림 표시"</string>
@@ -730,7 +730,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"아래로 드래그하여 닫기"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"PIP 메뉴"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g>에서 PIP 사용 중"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"<xliff:g id="NAME">%s</xliff:g>에서 이 기능이 사용되는 것을 원하지 않는 경우 탭하여 설정을 열고 기능을 사용 중지하세요."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"<xliff:g id="NAME">%s</xliff:g>에서 이 기능이 사용되는 것을 원하지 않는 경우 탭하여 설정을 열고 기능을 사용 중지하세요."</string>
<string name="pip_play" msgid="1417176722760265888">"재생"</string>
<string name="pip_pause" msgid="8881063404466476571">"일시중지"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"다음으로 건너뛰기"</string>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index 78de8a9..f3d5dbd 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Издөө"</string>
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үчүн жогору жылмыштырыңыз."</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үчүн солго жылмыштырыңыз."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Ойготкучтардан, эскертүүлөрдөн, жылнаамадагы иш-чараларды эстеткичтерден жана белгиленген байланыштардын чалууларынан тышкары башка үндөр жана дирилдөөлөр тынчыңызды албайт. Бирок ойнотулуп жаткан музыканы, видеолорду жана оюндарды мурдагыдай эле уга бересиз."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Ойготкучтардан башка үндөр жана дирилдөөлөр тынчыңызды албайт. Бирок ойнотулуп жаткан музыканы, видеолорду жана оюндарды мурдагыдай эле уга бересиз."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Ойготкучтардан, эскертүүлөрдөн, жылнаамадагы иш-чараларды эстеткичтерден жана белгиленген байланыштардын чалууларынан тышкары башка үндөр жана дирилдөөлөр тынчыңызды албайт. Бирок ойнотулуп жаткан музыканы, видеолорду жана оюндарды мурдагыдай эле уга бересиз."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Ойготкучтардан башка үндөр жана дирилдөөлөр тынчыңызды албайт. Бирок ойнотулуп жаткан музыканы, видеолорду жана оюндарды мурдагыдай эле уга бересиз."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Ыңгайлаштыруу"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Ушуну менен эскертүүлөрдүн, музыканын, видеолордун жана оюндардын үндөрү жана дирилдөөлөрү өчүрүлөт. Бирок телефон менен сүйлөшө бересиз."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Ушуну менен эскертүүлөрдүн, музыканын, видеолордун жана оюндардын үндөрү жана дирилдөөлөрү өчүрүлөт. Бирок телефон менен сүйлөшө бересиз."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Ушуну менен эскертүүлөрдүн, музыканын, видеолордун жана оюндардын үндөрү жана дирилдөөлөрү өчүрүлөт."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Анчейин шашылыш эмес эскертмелер төмөндө"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Четке кагуу үчүн төмөн сүйрөңүз"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Сүрөт ичиндеги сүрөт менюсу"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> – сүрөт ичиндеги сүрөт"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Эгер <xliff:g id="NAME">%s</xliff:g> колдонмосу бул функцияны пайдаланбасын десеңиз, жөндөөлөрдү ачып туруп, аны өчүрүп коюңуз."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Эгер <xliff:g id="NAME">%s</xliff:g> колдонмосу бул функцияны пайдаланбасын десеңиз, жөндөөлөрдү ачып туруп, аны өчүрүп коюңуз."</string>
<string name="pip_play" msgid="1417176722760265888">"Ойнотуу"</string>
<string name="pip_pause" msgid="8881063404466476571">"Тындыруу"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Кийинкисине өткөрүп жиберүү"</string>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index ce5d862..a5f0ca4 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"ຊອກຫາ"</string>
<string name="description_direction_up" msgid="7169032478259485180">"ເລື່ອນຂຶ້ນເພື່ອ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"ເລື່ອນໄປທາງຊ້າຍເພື່ອ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"ທ່ານຈະບໍ່ໄດ້ຮັບການລົບກວນຈາກສຽງ ຫຼື ການສັ່ງເຕືອນ, ຍົກເວັ້ນໃນເວລາໂມງ, ການແຈ້ງເຕືອນ, ນັດໝາຍ ແລະປະຕິທິນທີ່ທ່ານບຸ . ທ່ານອາດຍັງຄົງໄດ້ຍິນຫາກທ່ານເລືອກຫຼິ້ນເພລງ, ວິດີໂອ ລລະ ເກມ."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"ທ່ານຈະບໍ່ໄດ້ຮັບການລົບກວນຈາກສຽງ ຫຼື ການສັ່ງເຕືອນ, ຍົກເວັ້ນໃນເວລາໂມງປຸກດັງ. ທ່ານອາດຍັງຄົງໄດ້ຍິນຫາກທ່ານເລືອກຫຼິ້ນເພລງ, ວິດີໂອ ລລະ ເກມ."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"ທ່ານຈະບໍ່ໄດ້ຮັບການລົບກວນຈາກສຽງ ແລະ ການສັ່ນເຕືອນ, ຍົກເວັ້ນໃນເວລາໂມງປຸກດັງ, ມີການແຈ້ງເຕືອນ ຫຼື ມີສາຍໂທເຂົ້າຈາກຜູ້ໂທທີ່ທ່ານລະບຸໄວ້. ທ່ານອາດຍັງຄົງໄດ້ຍິນຫາກທ່ານເລືອກຫຼິ້ນເພງ, ວິດີໂອ ແລະ ເກມ."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"ທ່ານຈະບໍ່ໄດ້ຮັບການລົບກວນຈາກສຽງ ແລະ ການສັ່ນເຕືອນ, ຍົກເວັ້ນໃນເວລາໂມງປຸກດັງ. ທ່ານອາດຍັງຄົງໄດ້ຍິນຫາກທ່ານເລືອກຫຼິ້ນເພງ, ວິດີໂອ ແລະ ເກມ."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"ປັບແຕ່ງ"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"ນີ້ຈະເປັນການປິດສຽງ ແລະ ການສັ່ນທັງໝົດ ຮວມທັງສຽງໂມງປຸກ, ເພງ, ວິດີໂອ ແລະ ເກມນຳ. ແຕ່ທ່ານຍັງສາມາດໂທລະສັບໄດ້ປົກກະຕິ."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"ນີ້ຈະເປັນການປິດສຽງ ແລະ ການສັ່ນເຕືອນທັງໝົດໄວ້ ຮວມທັງໂມງປຸກ, ເພງ, ວິດີໂອ ແລະ ເກມ. ທ່ານຈະຍັງສາມາດໄດ້ຍິນສຽງໃນເວລາໂທໄດ້ຢູ່."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"ອັນນີ້ບລັອກທຸກສຽງ ແລະການສັ່ນ, ລວມທັງຈາກໂມງປຸກ, ເພງ, ວິດີໂອ, ແລະເກມ."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"ການແຈ້ງເຕືອນທີ່ສຳຄັນໜ້ອຍກວ່າຢູ່ດ້ານລຸ່ມ"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"ລາກລົງເພື່ອປິດໄວ້"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"ເມນູຊ້ອນຮູບພາບ"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> ແມ່ນເປັນການສະແດງຜົນຫຼາຍຢ່າງພ້ອມກັນ"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"ຫາກທ່ານບໍ່ຕ້ອງການ <xliff:g id="NAME">%s</xliff:g> ໃຫ້ໃຊ້ຄຸນສົມບັດນີ້, ໃຫ້ແຕະເພື່ອເປີດການຕັ້ງຄ່າ ແລ້ວປິດມັນໄວ້."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"ຫາກທ່ານບໍ່ຕ້ອງການ <xliff:g id="NAME">%s</xliff:g> ໃຫ້ໃຊ້ຄຸນສົມບັດນີ້, ໃຫ້ແຕະເພື່ອເປີດການຕັ້ງຄ່າ ແລ້ວປິດມັນໄວ້."</string>
<string name="pip_play" msgid="1417176722760265888">"ຫຼິ້ນ"</string>
<string name="pip_pause" msgid="8881063404466476571">"ຢຸດຊົ່ວຄາວ"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"ຂ້າມໄປລາຍການໜ້າ"</string>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index f550e9d..c1ccc75 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -357,10 +357,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Paieška"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Slyskite aukštyn link <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Slyskite į kairę link <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Jūsų netrikdys garsai ir vibravimas, išskyrus nurodytų signalų, priminimų, įvykių ir skambintojų garsus. Vis tiek girdėsite viską, ką pasirinksite leisti, įskaitant muziką, vaizdo įrašus ir žaidimus."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Jūsų netrikdys garsai ir vibravimas, išskyrus signalus. Vis tiek girdėsite viską, ką pasirinksite leisti, įskaitant muziką, vaizdo įrašus ir žaidimus."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Jūsų netrikdys garsai ir vibravimas, išskyrus nurodytų signalų, priminimų, įvykių ir skambintojų garsus. Vis tiek girdėsite viską, ką pasirinksite leisti, įskaitant muziką, vaizdo įrašus ir žaidimus."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Jūsų netrikdys garsai ir vibravimas, išskyrus signalus. Vis tiek girdėsite viską, ką pasirinksite leisti, įskaitant muziką, vaizdo įrašus ir žaidimus."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Tinkinti"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Taip bus užblokuoti VISI garsai ir vibravimas, įskaitant signalų, muzikos, vaizdo įrašų ir žaidimų garsus ir vibravimą. Vis tiek galėsite skambinti telefonu."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Taip bus užblokuoti VISI garsai ir vibravimas, įskaitant signalų, muzikos, vaizdo įrašų bei žaidimų garsus ir vibravimą. Vis tiek galėsite skambinti telefonu."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Taip bus užblokuoti VISI garsai ir vibravimas, įskaitant signalų, muzikos, vaizdo įrašų ir žaidimų garsus ir vibravimą."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Mažiau skubūs pranešimai toliau"</string>
@@ -740,7 +740,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Nuvilkite žemyn, kad atsisakytumėte"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Vaizdo vaizde meniu"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> rodom. vaizdo vaizde"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Jei nenorite, kad <xliff:g id="NAME">%s</xliff:g> naudotų šią funkciją, palietę atidarykite nustatymus ir išjunkite ją."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Jei nenorite, kad „<xliff:g id="NAME">%s</xliff:g>“ naudotų šią funkciją, palietę atidarykite nustatymus ir išjunkite ją."</string>
<string name="pip_play" msgid="1417176722760265888">"Leisti"</string>
<string name="pip_pause" msgid="8881063404466476571">"Pristabdyti"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Praleisti ir eiti į kitą"</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 334583f..4d4aad1 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -355,10 +355,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Meklēt"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Velciet uz augšu, lai veiktu šādu darbību: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Velciet pa kreisi, lai veiktu šādu darbību: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Jūs netraucēs skaņas un vibrācija, izņemot signālus, atgādinājumus, pasākumus un zvanītājus, ko būsiet norādījis. Jūs joprojām dzirdēsiet atskaņošanai izvēlētos vienumus, tostarp mūziku, videoklipus un spēles."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Jūs netraucēs skaņas un vibrācija, izņemot signālus. Jūs joprojām dzirdēsiet atskaņošanai izvēlētos vienumus, tostarp mūziku, videoklipus un spēles."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Jūs netraucēs skaņas un vibrācija, izņemot signālus, atgādinājumus, pasākumus un zvanītājus, ko būsiet norādījis. Jūs joprojām dzirdēsiet atskaņošanai izvēlētos vienumus, tostarp mūziku, videoklipus un spēles."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Jūs netraucēs skaņas un vibrācija, izņemot signālus. Jūs joprojām dzirdēsiet atskaņošanai izvēlētos vienumus, tostarp mūziku, videoklipus un spēles."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Pielāgot"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Tiks bloķētas VISAS skaņas un vibrosignāli, tostarp modinātāja, mūzikas, videoklipu un spēļu skaņas un signāli. Jūs joprojām varēsiet veikt tālruņa zvanus."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Tiks bloķētas VISAS skaņas un vibrosignāli, tostarp modinātāja, mūzikas, videoklipu un spēļu skaņas un signāli. Jūs joprojām varēsiet veikt tālruņa zvanus."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Tiks bloķētas VISAS skaņas un vibrosignāli, tostarp modinātāja, mūzikas, videoklipu un spēļu skaņas un signāli."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Mazāk steidzami paziņojumi tiek rādīti tālāk"</string>
@@ -734,7 +734,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Velciet lejup, lai noraidītu"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Izvēlne attēlam attēlā"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> ir attēlā attēlā"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Ja nevēlaties lietotnē <xliff:g id="NAME">%s</xliff:g> izmantot šo funkciju, pieskarieties, lai atvērtu iestatījumus un funkciju izslēgtu."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Ja nevēlaties lietotnē <xliff:g id="NAME">%s</xliff:g> izmantot šo funkciju, pieskarieties, lai atvērtu iestatījumus un izslēgtu funkciju."</string>
<string name="pip_play" msgid="1417176722760265888">"Atskaņot"</string>
<string name="pip_pause" msgid="8881063404466476571">"Apturēt"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Pāriet uz nākamo"</string>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index 974ad44..fb7c7af 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Пребарај"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Лизгај нагоре за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Лизгај налево за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Нема да ве вознемируваат звуци и вибрации, освен од аларми, потсетници, настани и повикувачи што ќе ги наведете. Сѐ уште ќе слушате сѐ што ќе изберете да пуштите, што опфаќа музика, видеа и игри."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Нема да ве вознемируваат звуци и вибрации, освен од аларми. Сѐ уште ќе слушате сѐ што ќе изберете да пуштите, што опфаќа музика, видеа и игри."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Нема да ве вознемируваат звуци и вибрации, освен од аларми, потсетници, настани и повикувачи што ќе ги наведете. Сѐ уште ќе слушате сѐ што ќе изберете да пуштите, заедно со музика, видеа и игри."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Нема да ве вознемируваат звуци и вибрации, освен од аларми. Сѐ уште ќе слушате сѐ што ќе изберете да пуштите, заедно со музика, видеа и игри."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Приспособи"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Ова ги блокира СИТЕ звуци и вибрации, вклучувајќи ги и оние од алармите, музиката, видеата и игрите. Сѐ уште ќе може да воспоставувате телефонски повици."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Ова ги блокира СИТЕ звуци и вибрации, заедно со алармите, музиката, видеата и игрите. Сѐ уште ќе може да воспоставувате телефонски повици."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Ова ги блокира СИТЕ звуци и вибрации, вклучувајќи ги и оние од алармите, музиката, видеата и игрите."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Долу се помалку итни известувања"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Повлечете надолу за да отфрлите"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Мени слика во слика"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> е во слика во слика"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Ако не сакате <xliff:g id="NAME">%s</xliff:g> да ја користи функцијава, допрете за да ги отворите поставките и исклучете ја."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Ако не сакате <xliff:g id="NAME">%s</xliff:g> да ја користи функцијава, допрете за да ги отворите поставките и да ја исклучите."</string>
<string name="pip_play" msgid="1417176722760265888">"Пушти"</string>
<string name="pip_pause" msgid="8881063404466476571">"Паузирај"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Прескокни до следната"</string>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index 2134e94..b42319a 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"തിരയൽ"</string>
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> എന്നതിനായി മുകളിലേയ്ക്ക് സ്ലൈഡുചെയ്യുക."</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> എന്നതിനായി ഇടത്തേയ്ക്ക് സ്ലൈഡുചെയ്യുക."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"നിങ്ങൾ സജ്ജീകരിച്ച അലാറങ്ങൾ, റിമൈൻഡറുകൾ, ഇവന്റുകൾ, കോളർമാർ എന്നിവയിൽ നിന്നുള്ള ശബ്ദങ്ങളും വൈബ്രേഷനുകളുമൊഴികെ മറ്റൊന്നും നിങ്ങളെ ശല്യപ്പെടുത്തുകയില്ല. സംഗീതം, വീഡിയോകൾ, ഗെയിമുകൾ എന്നിവയുൾപ്പെടെ പ്ലേ ചെയ്യുന്നതെന്തും നിങ്ങൾക്ക് തുടർന്നും കേൾക്കാൻ കഴിയും."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"അലാറങ്ങളിൽ നിന്നുള്ള ശബ്ദങ്ങളും വൈബ്രേഷനുകളുമൊഴികെ മറ്റൊന്നും നിങ്ങളെ ശല്യപ്പെടുത്തുകയില്ല. സംഗീതം, വീഡിയോകൾ, ഗെയിമുകൾ എന്നിവയുൾപ്പെടെ പ്ലേ ചെയ്യുന്നതെന്തും നിങ്ങൾക്ക് തുടർന്നും കേൾക്കാൻ കഴിയും."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"നിങ്ങൾ സജ്ജീകരിച്ച അലാറങ്ങൾ, റിമൈൻഡറുകൾ, ഇവന്റുകൾ, കോളർമാർ എന്നിവയിൽ നിന്നുള്ള ശബ്ദങ്ങളും വൈബ്രേഷനുകളുമൊഴികെ മറ്റൊന്നും നിങ്ങളെ ശല്യപ്പെടുത്തുകയില്ല. സംഗീതം, വീഡിയോകൾ, ഗെയിമുകൾ എന്നിവയുൾപ്പെടെ പ്ലേ ചെയ്യുന്നതെന്തും നിങ്ങൾക്ക് തുടർന്നും കേൾക്കാൻ കഴിയും."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"അലാറങ്ങളിൽ നിന്നുള്ള ശബ്ദങ്ങളും വൈബ്രേഷനുകളുമൊഴികെ മറ്റൊന്നും നിങ്ങളെ ശല്യപ്പെടുത്തുകയില്ല. സംഗീതം, വീഡിയോകൾ, ഗെയിമുകൾ എന്നിവയുൾപ്പെടെ പ്ലേ ചെയ്യുന്നതെന്തും നിങ്ങൾക്ക് തുടർന്നും കേൾക്കാൻ കഴിയും."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"ഇഷ്ടാനുസൃതമാക്കുക"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"ഇത് അലാറങ്ങൾ, സംഗീതം, വീഡിയോകൾ, ഗെയിമുകൾ എന്നിവയിൽ നിന്നുൾപ്പെടെ എല്ലാ ശബ്ദങ്ങളും വൈബ്രേഷനുകളും തടയുന്നു. നിങ്ങൾക്ക് തുടർന്നും ഫോൺ വിളിക്കാനാകും."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"അലാറങ്ങൾ, സംഗീതം, വീഡിയോകൾ, ഗെയിമുകൾ എന്നിവയിൽ നിന്നുൾപ്പെടെ എല്ലാ ശബ്ദങ്ങളും വൈബ്രേഷനുകളും ഇത് തടയുന്നു. നിങ്ങൾക്ക് തുടർന്നും ഫോൺ കോളുകൾ ചെയ്യാനാകും."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"ഇത് അലാറങ്ങൾ, സംഗീതം, വീഡിയോകൾ, ഗെയിമുകൾ എന്നിവയിൽ നിന്നുൾപ്പെടെ എല്ലാ ശബ്ദങ്ങളും വൈബ്രേഷനുകളും തടയുന്നു."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"ആവശ്യം കുറഞ്ഞ അറിയിപ്പുകൾ ചുവടെ നൽകിയിരിക്കുന്നു"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"തള്ളിക്കളയാൻ താഴേക്ക് വലിച്ചിടുക"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"\'ചിത്രത്തിനുള്ളിൽ ചിത്രം\' മെനു"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> ചിത്രത്തിനുള്ളിലെ ചിത്രത്തിലാണ്"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"<xliff:g id="NAME">%s</xliff:g> ഈ ഫീച്ചർ ഉപയോഗിക്കുന്നതിൽ നിങ്ങൾക്ക് താൽപ്പര്യമില്ലെങ്കിൽ, ടാപ്പുചെയ്ത് ക്രമീകരണം തുറന്ന് അത് ഓഫാക്കുക."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"<xliff:g id="NAME">%s</xliff:g> ഈ ഫീച്ചർ ഉപയോഗിക്കുന്നതിൽ നിങ്ങൾക്ക് താൽപ്പര്യമില്ലെങ്കിൽ, ടാപ്പുചെയ്ത് ക്രമീകരണം തുറന്ന് അത് ഓഫാക്കുക."</string>
<string name="pip_play" msgid="1417176722760265888">"പ്ലേ ചെയ്യുക"</string>
<string name="pip_pause" msgid="8881063404466476571">"താൽക്കാലികമായി നിർത്തുക"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"അടുത്തതിലേക്ക് പോകുക"</string>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index ed8a961..cd4f5be 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -351,10 +351,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Хайх"</string>
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-г гулсуулах."</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> хийх зүүнлүү гулсуулах."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Танд сэрүүлэг, сануулга, үйл ажиллагаа, таны сонгосон дуудлага илгээгчээс бусад дуу, чичиргээ саад болохгүй. Та хөгжим, видео, тоглоом зэрэг тоглуулахыг хүссэн бүх зүйлээ сонсох боломжтой хэвээр байна."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Танд сэрүүлгээс бусад дуу, чичиргээ саад болохгүй. Та хөгжим, видео, тоглоом зэрэг тоглуулахыг хүссэн бүх зүйлээ сонсох боломжтой хэвээр байна."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Танд сэрүүлэг, сануулга, арга хэмжээ, таны сонгосон дуудлага илгээгчээс бусад дуу, чичиргээ саад болохгүй. Та хөгжим, видео, тоглоом зэрэг тоглуулахыг хүссэн бүх зүйлээ сонсох боломжтой хэвээр байна."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Танд сэрүүлгээс бусад дуу, чичиргээ саад болохгүй. Та хөгжим, видео, тоглоом зэрэг тоглуулахыг хүссэн бүх зүйлээ сонсох боломжтой хэвээр байна."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Тохируулах"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Энэ нь сэрүүлэг, хөгжим, видео, тоглоом зэргийг оруулаад зэрэг БҮХ дуу, чичиргээг блоклодог. Та дуудлага хийх боломжтой хэвээр байна."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Энэ нь сэрүүлэг, хөгжим, видео, тоглоом зэрэг БҮХ дуу, чичиргээг блоклодог. Та дуудлага хийх боломжтой хэвээр байна."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Энэ нь сэрүүлэг, хөгжим, видео, тоглоом зэргийг оруулаад зэрэг БҮХ дуу, чичиргээг блоклодог."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Яаралтай биш мэдэгдлүүдийг доор"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Хаахын тулд доош чирэх"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Дэлгэцэн доторх дэлгэцийн цэс"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> дэлгэцэн доторх дэлгэцэд байна"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Та <xliff:g id="NAME">%s</xliff:g>-г энэ онцлогийг ашиглахыг хүсэхгүй байвал тохиргоог нээгээд, үүнийг унтраана уу."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Та <xliff:g id="NAME">%s</xliff:g>-д энэ онцлогийг ашиглуулахыг хүсэхгүй байвал тохиргоог нээгээд, үүнийг унтраана уу."</string>
<string name="pip_play" msgid="1417176722760265888">"Тоглуулах"</string>
<string name="pip_pause" msgid="8881063404466476571">"Түр зогсоох"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Дараагийн медиад очих"</string>
diff --git a/packages/SystemUI/res/values-mn/strings_tv.xml b/packages/SystemUI/res/values-mn/strings_tv.xml
index bbc94c8..e250c2d 100644
--- a/packages/SystemUI/res/values-mn/strings_tv.xml
+++ b/packages/SystemUI/res/values-mn/strings_tv.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="notification_channel_tv_pip" msgid="134047986446577723">"Зураг-доторх-Зураг"</string>
+ <string name="notification_channel_tv_pip" msgid="134047986446577723">"Дэлгэцэн-доторх-Дэлгэц"</string>
<string name="pip_notification_unknown_title" msgid="6289156118095849438">"(Гарчиггүй хөтөлбөр)"</string>
<string name="pip_close" msgid="3480680679023423574">"PIP-г хаах"</string>
<string name="pip_fullscreen" msgid="8604643018538487816">"Бүтэн дэлгэц"</string>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index 8120b37..b8562f6 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"शोध"</string>
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> साठी वर स्लाइड करा."</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> साठी डावीकडे स्लाइड करा."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"अलार्म, रिमाइंडर्स, इव्हेंट आणि तुम्ही निश्चित केलेल्या कॉलरचा अपवाद वगळता तुम्हाला कोणत्याही आवाज आणि कंपनांचा व्यत्त्यय आणला जाणार नाही. तसे असले तरीही तुम्ही प्ले करायचे ठरवलेले कोणतेही संगीत, व्हिडिओ आणि गेमचे आवाज चालू ठेवले जातील."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"अलार्मचा अपवाद सोडल्यास तुम्हाला कोणत्याही आवाज आणि कंपनांचा व्यत्त्यय आणला जाणार नाही. तसे असले तरीही तुम्ही प्ले करायचे ठरवलेले कोणतेही संगीत, व्हिडिओ आणि गेमचे आवाज चालू ठेवले जातील."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"अलार्म, रिमाइंडर, इव्हेंट आणि तुम्ही निश्चित केलेल्या कॉलर व्यतिरिक्त तुम्हाला कोणत्याही आवाज आणि कंपनांचा व्यत्त्यय आणला जाणार नाही. तरीही तुम्ही प्ले करायचे ठरवलेले कोणतेही संगीत, व्हिडिओ आणि गेमचे आवाज ऐकू शकतात."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"अलार्म व्यतिरिक्त तुम्हाला कोणत्याही आवाज आणि कंपनांचा व्यत्त्यय आणला जाणार नाही. तरीही तुम्ही प्ले करायचे ठरवलेले कोणतेही संगीत, व्हिडिओ आणि गेमचे आवाज ऐकू शकतात."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"सानुकूलित करा"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"हे अलार्म, संगीत, व्हिडिओ आणि गेम यासह, सर्व आवाज आणि कंपने अवरोधित करते. आपण तरीही फोन कॉल करण्यात सक्षम व्हाल."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"हे अलार्म, संगीत, व्हिडिओ आणि गेमसह, सर्व आवाज आणि कंपने ब्लॉक करते. तरीही तुम्ही फोन कॉल करू शकतात."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"हे अलार्म, संगीत, व्हिडिओ आणि गेम यासह, सर्व आवाज आणि कंपने अवरोधित करते."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"खाली कमी तातडीच्या सूचना"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"डिसमिस करण्यासाठी खाली ड्रॅग करा"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"चित्र मेनूमधील चित्र"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> चित्रामध्ये चित्र मध्ये आहे"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"<xliff:g id="NAME">%s</xliff:g> ने हे वैशिष्ट्य वापरू नये असे आपल्याला वाटत असल्यास, टॅप करून सेटिंग्ज उघडा आणि ते बंद करा."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"<xliff:g id="NAME">%s</xliff:g>ने हे वैशिष्ट्य वापरू नये असे तुम्हाला वाटत असल्यास, सेटिंग्ज उघडण्यासाठी टॅप करा आणि ते बंद करा."</string>
<string name="pip_play" msgid="1417176722760265888">"प्ले करा"</string>
<string name="pip_pause" msgid="8881063404466476571">"थांबवा"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"डावलून पुढे जा"</string>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index 65791f3..2c2e094 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Carian"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Luncurkan ke atas untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Luncurkan ke kiri untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Anda tidak akan diganggu oleh bunyi dan getaran, kecuali daripada penggera, peringatan, acara dan pemanggil yang anda tetapkan. Anda masih mendengar item lain yang anda pilih untuk dimainkan termasuk muzik, video dan permainan."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Anda tidak akan diganggu oleh bunyi dan getaran, kecuali daripada penggera. Anda masih mendengar item lain yang anda pilih untuk dimainkan termasuk muzik, video dan permainan."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Anda tidak akan diganggu oleh bunyi dan getaran, kecuali daripada penggera, peringatan, acara dan pemanggil yang anda tetapkan. Anda masih mendengar item lain yang anda pilih untuk dimainkan termasuk muzik, video dan permainan."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Anda tidak akan diganggu oleh bunyi dan getaran, kecuali daripada penggera. Anda masih mendengar item lain yang anda pilih untuk dimainkan termasuk muzik, video dan permainan."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Peribadikan"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Mod ini menyekat SEMUA bunyi dan getaran, termasuk daripada penggera, muzik, video dan permainan. Anda masih boleh membuat panggilan telefon."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Mesej ini menyekat SEMUA bunyi dan getaran, termasuk daripada penggera, muzik, video dan permainan. Anda masih dapat membuat panggilan telefon."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Mod ini menyekat SEMUA bunyi dan getaran, termasuk daripada penggera, muzik, video dan permainan."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Pemberitahuan kurang penting di bawah"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Seret ke bawah untuk mengetepikan"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Menu gambar dalam gambar"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> terdapat dalam gambar dalam gambar"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Jika anda tidak mahu <xliff:g id="NAME">%s</xliff:g> menggunakan ciri ini, ketik untuk membuka tetapan dan matikan ciri."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Jika anda tidak mahu <xliff:g id="NAME">%s</xliff:g> menggunakan ciri ini, ketik untuk membuka tetapan dan matikan ciri."</string>
<string name="pip_play" msgid="1417176722760265888">"Main"</string>
<string name="pip_pause" msgid="8881063404466476571">"Jeda"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Langkau ke seterusnya"</string>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index 019f6e5..5040bfd 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"ရှာဖွေရန်"</string>
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> အတွက် အပေါ်ကို ပွတ်ဆွဲပါ"</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> အတွက် ဖယ်ဘက်ကို ပွတ်ဆွဲပါ"</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"နှိုးစက်သံ၊ သတိပေးချက်အသံများ၊ ပွဲစဉ်သတိပေးသံများနှင့် သင်ခွင့်ပြုထားသူများထံမှ ဖုန်းခေါ်မှုများမှလွဲ၍ အခြားအသံများနှင့် တုန်ခါမှုများက သင့်ကို အနှောင့်အယှက်ပြုမည် မဟုတ်ပါ။ သို့သော်လည်း သီချင်း၊ ဗီဒီယိုနှင့် ဂိမ်းများအပါအဝင် သင်ကရွေးချယ်ဖွင့်ထားသည့် အရာတိုင်း၏ အသံကိုမူ ကြားနေရဆဲဖြစ်ပါလိမ့်မည်။"</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"နှိုးစက်သံမှလွဲ၍ အခြားအသံများနှင့် တုန်ခါမှုများက သင့်ကို အနှောင့်အယှက်ပြုမည် မဟုတ်ပါ။ သို့သော်လည်း သီချင်း၊ ဗီဒီယိုနှင့် ဂိမ်းများအပါအဝင် သင်ကရွေးချယ်ဖွင့်ထားသည့် အရာတိုင်း၏ အသံကိုမူ ကြားနေရဆဲဖြစ်ပါလိမ့်မည်။"</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"နှိုးစက်သံ၊ သတိပေးချက်အသံများ၊ ပွဲစဉ်သတိပေးသံများနှင့် သင်ခွင့်ပြုထားသူများထံမှ ဖုန်းခေါ်မှုများမှလွဲ၍ အခြားအသံများနှင့် တုန်ခါမှုများက သင့်ကို အနှောင့်အယှက်ပြုမည် မဟုတ်ပါ။ သို့သော်လည်း သီချင်း၊ ဗီဒီယိုနှင့် ဂိမ်းများအပါအဝင် သင်ကရွေးချယ်ဖွင့်ထားသည့် အရာတိုင်း၏ အသံကိုမူ ကြားနေရဆဲဖြစ်ပါလိမ့်မည်။"</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"နှိုးစက်သံမှလွဲ၍ အခြားအသံများနှင့် တုန်ခါမှုများက သင့်ကို အနှောင့်အယှက်ပြုမည် မဟုတ်ပါ။ သို့သော်လည်း သီချင်း၊ ဗီဒီယိုနှင့် ဂိမ်းများအပါအဝင် သင်ကရွေးချယ်ဖွင့်ထားသည့် အရာတိုင်း၏ အသံကိုမူ ကြားနေရဆဲဖြစ်ပါလိမ့်မည်။"</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"စိတ်ကြိုက် ပြုလုပ်ရန်"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"ဤအရာမှ နှိုးစက်၊ ဂီတ၊ ဗွီဒီယိုများနှင့် ဂိမ်းများ အပါအဝင်၊ အသံအားလုံးနှင့် တုန်ခါမှုများအား တားဆီးပေးသည်။ ဖုန်းခေါ်ဆိုမှုများ ပြုလုပ်နိုင်ဆဲဖြစ်မည်။"</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"၎င်းသည် နှိုးစက်သံ၊ သီချင်း၊ ဗွီဒီယိုများနှင့် ဂိမ်းများ အပါအဝင် အသံများနှင့် တုန်ခါမှုအားလုံးကို တားဆီးပေးသည်။ ဖုန်းခေါ်ဆိုမှုများကိုမူ ပြုလုပ်နိုင်ဆဲဖြစ်ပါလိမ့်မည်။"</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"နှိုးစက်၊ ဂီတ၊ ဗွီဒီယိုများနှင့် ဂိမ်းများ အပါအဝင်၊ အသံအားလုံးနှင့် တုန်ခါမှုများအား ဤအရာမှ တားဆီးပေး၏။"</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"အရေးပါမှု နည်းသည့် အကြောင်းကြားချက်များ အောက်မှာ"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"ပယ်ရန်အတွက် အောက်သို့ ပွတ်ဆွဲပါ"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"တစ်ခုပေါ်တစ်ခု ထပ်၍ ဖွင့်ခြင်းမီနူး"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> သည် တစ်ခုပေါ် တစ်ခုထပ်၍ ဖွင့်ထားသည်"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"<xliff:g id="NAME">%s</xliff:g> အား ဤဝန်ဆောင်မှုကို အသုံးမပြုစေလိုလျှင် ဆက်တင်ကိုဖွင့်ရန် တို့ပြီး ၎င်းဝန်ဆောင်မှုကို ပိတ်လိုက်ပါ။"</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"<xliff:g id="NAME">%s</xliff:g> အား ဤဝန်ဆောင်မှုကို အသုံးမပြုစေလိုလျှင် ဆက်တင်ကိုဖွင့်ရန် တို့ပြီး ၎င်းဝန်ဆောင်မှုကို ပိတ်လိုက်ပါ။"</string>
<string name="pip_play" msgid="1417176722760265888">"ဖွင့်ရန်"</string>
<string name="pip_pause" msgid="8881063404466476571">"ခေတ္တရပ်ရန်"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"နောက်တစ်ခုသို့ ကျော်ရန်"</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index 983b966..324c583 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Søk"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Dra opp for å <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Dra til venstre for å <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Du blir ikke forstyrret av lyder og vibrasjoner, med unntak av alarmer, påminnelser, aktiviteter og oppringere du angir. Du kan fremdeles høre alt du velger å spille av, for eksempel musikk, videoer og spill."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Du blir ikke forstyrret av lyder og vibrasjoner, med unntak av alarmer. Du kan fremdeles høre alt du velger å spille av, for eksempel musikk, videoer og spill."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Du blir ikke forstyrret av lyder og vibrasjoner, med unntak av alarmer, påminnelser, aktiviteter og oppringere du angir. Du kan fremdeles høre alt du velger å spille av, for eksempel musikk, videoer og spill."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Du blir ikke forstyrret av lyder og vibrasjoner, med unntak av alarmer. Du kan fremdeles høre alt du velger å spille av, for eksempel musikk, videoer og spill."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Tilpass"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Dette blokkerer ALLE lyder og vibrasjoner, inkludert fra alarmer, musikk, videoer og spill. Du kan fremdeles ringe."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Dette blokkerer ALLE lyder og vibrasjoner, inkludert fra alarmer, musikk, videoer og spill. Du kan fremdeles ringe."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Dette blokkerer ALLE lyder og vibrasjoner, inkludert fra alarmer, musikk, videoer og spill."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Mindre presserende varsler nedenfor"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Dra ned for å avvise"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Bilde-i-bilde-meny"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> er i bilde-i-bilde"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Hvis du ikke vil at <xliff:g id="NAME">%s</xliff:g> skal bruke denne funksjonen, kan du trykke for å åpne innstillingene og slå den av."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Hvis du ikke vil at <xliff:g id="NAME">%s</xliff:g> skal bruke denne funksjonen, kan du trykke for å åpne innstillingene og slå den av."</string>
<string name="pip_play" msgid="1417176722760265888">"Spill av"</string>
<string name="pip_pause" msgid="8881063404466476571">"Sett på pause"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Hopp til neste"</string>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index 0491f88..d2a5020 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"खोज्नुहोस्"</string>
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>को लागि माथि धिसार्नुहोस्"</string>
<string name="description_direction_left" msgid="7207478719805562165">"स्लाइड <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>को लागि बायाँ।"</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"तपाईंलाई अलार्म, रिमाइन्डर, कार्यक्रम र तपाईंले निर्दिष्ट गर्नुभएका कलरहरू बाहेकका ध्वनि र कम्पनहरूले बाधा पुऱ्याउने छैनन्। तपाईंले अझै संगीत, भिडियो र खेलहरू लगायत आफूले प्ले गर्न छनौट गरेका जुनसुकै कुरा सुन्न सक्नुहुन्छ।"</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"तपाईंलाई अलार्म बाहेकका ध्वनि र कम्पनहरूले बाधा पुऱ्याउने छैनन्। तपाईंले अझै संगीत, भिडियो र खेलहरू लगायत आफूले प्ले गर्न छनौट गरेका जुनसुकै कुरा पनि सुन्न सक्नुहुन्छ।"</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"तपाईंलाई अलार्म, रिमाइन्डर, कार्यक्रम र तपाईंले निर्दिष्ट गर्नुभएका कलरहरू बाहेकका ध्वनि र कम्पनहरूले बाधा पुऱ्याउने छैनन्। तपाईंले अझै संगीत, भिडियो र खेलहरू लगायत आफूले प्ले गर्न छनौट गरेका जुनसुकै कुरा सुन्न सक्नुहुनेछ।"</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"तपाईंलाई अलार्महरू बाहेकका ध्वनि र कम्पनहरूले बाधा पुऱ्याउने छैनन्। तपाईंले अझै संगीत, भिडियो र खेलहरू लगायत आफूले प्ले गर्न छनौट गरेका जुनसुकै कुरा सुन्न सक्नुहुनेछ।"</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"आफू अनुकूल बनाउनुहोस्"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"यसले अलार्म, संगीत, भिडियो, र खेलहरू लगायतका सबै ध्वनि र कम्पन रोक्छ। तपाईं अझै पनि फोन कल गर्न सक्षम हुनुहुन्छ।"</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"यसले अलार्म, संगीत, भिडियो, र खेलहरू लगायत सबैका ध्वनि र कम्पनहरूमाथि रोक लगाउँछ। तपाईं अझै पनि फोन कलहरू गर्न सक्नुहुनेछ।"</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"यसले अलार्म, संगीत, भिडियोहरू र खेलहरूसहित सबै ध्वनिहरू र कम्पनहरूलाई रोक्छ।"</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"तल कम जरुरी सूचनाहरू"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"खारेज गर्न तल तान्नुहोस्"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"तस्बिर मेनुमा तस्बिर"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> Picture-in-picture मा छ"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"तपाईं <xliff:g id="NAME">%s</xliff:g> ले यो सुविधा प्रयोग नगरोस् भन्ने चाहनुहुन्छ भने ट्याप गरेर सेटिङहरू खोल्नुहोस् र यसलाई निष्क्रिय पार्नुहोस्।"</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"तपाईं <xliff:g id="NAME">%s</xliff:g> ले सुविधा प्रयोग नगरोस् भन्ने चाहनुहुन्छ भने ट्याप गरेर सेटिङहरू खोल्नुहोस् र यसलाई निष्क्रिय पार्नुहोस्।"</string>
<string name="pip_play" msgid="1417176722760265888">"प्ले गर्नुहोस्"</string>
<string name="pip_pause" msgid="8881063404466476571">"पज गर्नुहोस्"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"अर्कोमा जानुहोस्"</string>
diff --git a/packages/SystemUI/res/values-ne/strings_tv.xml b/packages/SystemUI/res/values-ne/strings_tv.xml
index 2c5c186..2e42b6c 100644
--- a/packages/SystemUI/res/values-ne/strings_tv.xml
+++ b/packages/SystemUI/res/values-ne/strings_tv.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="notification_channel_tv_pip" msgid="134047986446577723">"तस्बिरभित्रको तस्बिर"</string>
+ <string name="notification_channel_tv_pip" msgid="134047986446577723">"Picture-in-Picture"</string>
<string name="pip_notification_unknown_title" msgid="6289156118095849438">"(शीर्षकविहीन कार्यक्रम)"</string>
<string name="pip_close" msgid="3480680679023423574">"PIP लाई बन्द गर्नुहोस्"</string>
<string name="pip_fullscreen" msgid="8604643018538487816">"पूर्ण स्क्रिन"</string>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index c399e5d..d6a949d 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Zoeken"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Veeg omhoog voor <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Veeg naar links voor <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Je wordt niet gestoord door geluiden en trillingen, behalve bij alarmen, herinneringen, afspraken en specifieke bellers die je selecteert. Je kunt nog steeds alles horen wat je wilt afspelen, waaronder muziek, video\'s en games."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Je wordt niet gestoord door geluiden en trillingen, behalve bij alarmen. Je kunt nog steeds alles horen wat je wilt afspelen, waaronder muziek, video\'s en games."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Je wordt niet gestoord door geluiden en trillingen, behalve bij alarmen, herinneringen, afspraken en specifieke bellers die je selecteert. Je kunt nog steeds alles horen wat je wilt afspelen, waaronder muziek, video\'s en games."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Je wordt niet gestoord door geluiden en trillingen, behalve bij alarmen. Je kunt nog steeds alles horen wat je wilt afspelen, waaronder muziek, video\'s en games."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Aanpassen"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Hiermee worden ALLE geluiden en trillingen geblokkeerd, waaronder die voor alarmen, muziek, video\'s en games. U kunt wel nog steeds bellen."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Hiermee worden ALLE geluiden en trillingen geblokkeerd, waaronder die voor alarmen, muziek, video\'s en games. Je kunt wel nog steeds bellen."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Hiermee worden ALLE geluiden en trillingen geblokkeerd, waaronder die voor alarmen, muziek, video\'s en games."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Minder urgente meldingen onderaan"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Sleep omlaag om te sluiten"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Scherm-in-scherm-menu"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> is in scherm-in-scherm"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Als je niet wilt dat <xliff:g id="NAME">%s</xliff:g> deze functie gebruikt, tik je om de instellingen te openen en schakel je de functie uit."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Als je niet wilt dat <xliff:g id="NAME">%s</xliff:g> deze functie gebruikt, tik je om de instellingen te openen en schakel je de functie uit."</string>
<string name="pip_play" msgid="1417176722760265888">"Afspelen"</string>
<string name="pip_pause" msgid="8881063404466476571">"Onderbreken"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Doorgaan naar volgende"</string>
diff --git a/packages/SystemUI/res/values-nl/strings_tv.xml b/packages/SystemUI/res/values-nl/strings_tv.xml
index fae484f..8270fee 100644
--- a/packages/SystemUI/res/values-nl/strings_tv.xml
+++ b/packages/SystemUI/res/values-nl/strings_tv.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="notification_channel_tv_pip" msgid="134047986446577723">"Beeld-in-beeld"</string>
+ <string name="notification_channel_tv_pip" msgid="134047986446577723">"Scherm-in-scherm"</string>
<string name="pip_notification_unknown_title" msgid="6289156118095849438">"(Naamloos programma)"</string>
<string name="pip_close" msgid="3480680679023423574">"PIP sluiten"</string>
<string name="pip_fullscreen" msgid="8604643018538487816">"Volledig scherm"</string>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index a235c51..c321759 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"ਖੋਜੋ"</string>
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ਲਈ ਉੱਪਰ ਸਲਾਈਡ ਕਰੋ।"</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ਤੱਕ ਖੱਬੇ ਪਾਸੇ ਸਲਾਈਡ ਕਰੋ।"</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"ਧੁਨੀਆਂ ਅਤੇ ਥਰਥਰਾਹਟਾਂ ਤੁਹਾਨੂੰ ਪਰੇਸ਼ਾਨ ਨਹੀਂ ਕਰਨਗੀਆਂ, ਸਿਵਾਏ ਅਲਾਰਮਾਂ, ਯਾਦ-ਦਹਾਨੀਆਂ, ਵਰਤਾਰਿਆਂ, ਅਤੇ ਤੁਹਾਡੇ ਵੱਲੋਂ ਨਿਰਧਾਰਤ ਕੀਤੇ ਕਾਲਰਾਂ ਦੀ ਸੂਰਤ ਵਿੱਚ। ਤੁਸੀਂ ਅਜੇ ਵੀ ਸੰਗੀਤ, ਵੀਡੀਓ ਅਤੇ ਗੇਮਾਂ ਸਮੇਤ ਆਪਣੀ ਚੋਣ ਅਨੁਸਾਰ ਕੁਝ ਵੀ ਸੁਣ ਸਕਦੇ ਹੋ।"</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"ਧੁਨੀਆਂ ਅਤੇ ਥਰਥਰਾਹਟਾਂ ਤੁਹਾਨੂੰ ਪਰੇਸ਼ਾਨ ਨਹੀਂ ਕਰਨਗੀਆਂ, ਸਿਵਾਏ ਅਲਾਰਮਾਂ ਦੀ ਸੂਰਤ ਵਿੱਚ। ਤੁਸੀਂ ਅਜੇ ਵੀ ਸੰਗੀਤ, ਵੀਡੀਓ ਅਤੇ ਗੇਮਾਂ ਸਮੇਤ ਆਪਣੀ ਚੋਣ ਅਨੁਸਾਰ ਕੁਝ ਵੀ ਸੁਣ ਸਕਦੇ ਹੋ।"</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"ਧੁਨੀਆਂ ਅਤੇ ਥਰਥਰਾਹਟਾਂ ਤੁਹਾਨੂੰ ਪਰੇਸ਼ਾਨ ਨਹੀਂ ਕਰਨਗੀਆਂ, ਸਿਵਾਏ ਅਲਾਰਮਾਂ, ਯਾਦ-ਦਹਾਨੀਆਂ, ਵਰਤਾਰਿਆਂ, ਅਤੇ ਤੁਹਾਡੇ ਵੱਲੋਂ ਨਿਰਧਾਰਤ ਕੀਤੇ ਕਾਲਰਾਂ ਦੀ ਸੂਰਤ ਵਿੱਚ। ਤੁਸੀਂ ਅਜੇ ਵੀ ਸੰਗੀਤ, ਵੀਡੀਓ ਅਤੇ ਗੇਮਾਂ ਸਮੇਤ ਆਪਣੀ ਚੋਣ ਅਨੁਸਾਰ ਕੁਝ ਵੀ ਸੁਣ ਸਕਦੇ ਹੋ।"</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"ਧੁਨੀਆਂ ਅਤੇ ਥਰਥਰਾਹਟਾਂ ਤੁਹਾਨੂੰ ਪਰੇਸ਼ਾਨ ਨਹੀਂ ਕਰਨਗੀਆਂ, ਸਿਵਾਏ ਅਲਾਰਮਾਂ ਦੀ ਸੂਰਤ ਵਿੱਚ। ਤੁਸੀਂ ਅਜੇ ਵੀ ਸੰਗੀਤ, ਵੀਡੀਓ ਅਤੇ ਗੇਮਾਂ ਸਮੇਤ ਆਪਣੀ ਚੋਣ ਅਨੁਸਾਰ ਕੁਝ ਵੀ ਸੁਣ ਸਕਦੇ ਹੋ।"</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤਬੱਧ ਕਰੋ"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"ਇਹ ਅਲਾਰਮ, ਸੰਗੀਤ, ਵੀਡੀਓ, ਅਤੇ ਗੇਮਾਂ ਸਮੇਤ, ਸਾਰੀਆਂ ਧੁਨੀਆਂ ਅਤੇ ਥਰਥਰਾਹਟ ਨੂੰ ਬਲੌਕ ਕਰਦਾ ਹੈ। ਤੁਸੀਂ ਅਜੇ ਵੀ ਫ਼ੋਨ ਕਾਲ ਕਰਨ ਦੇ ਯੋਗ ਹੋਵੋਂਗੇ।"</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"ਇਹ ਅਲਾਰਮ, ਸੰਗੀਤ, ਵੀਡੀਓ, ਅਤੇ ਗੇਮਾਂ ਸਮੇਤ, ਸਾਰੀਆਂ ਧੁਨੀਆਂ ਅਤੇ ਥਰਥਰਾਹਟਾਂ ਨੂੰ ਬਲੌਕ ਕਰਦਾ ਹੈ। ਤੁਸੀਂ ਅਜੇ ਵੀ ਫ਼ੋਨ ਕਾਲ ਕਰਨ ਦੇ ਯੋਗ ਹੋਵੋਂਗੇ।"</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"ਇਹ ਅਲਾਰਮ, ਸੰਗੀਤ, ਵੀਡੀਓਜ਼, ਅਤੇ ਗੇਮਸ ਸਮੇਤ, ਸਾਰੀਆਂ ਧੁਨੀਆਂ ਅਤੇ ਵਾਇਬ੍ਰੇਸ਼ਨ ਨੂੰ ਬਲੌਕ ਕਰਦਾ ਹੈ।"</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"ਹੇਠਾਂ ਘੱਟ ਲਾਜ਼ਮੀ ਸੂਚਨਾਵਾਂ"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"ਖਾਰਜ ਕਰਨ ਲਈ ਹੇਠਾਂ ਘਸੀਟੋ"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"ਤਸਵੀਰ-ਵਿੱਚ-ਤਸਵੀਰ ਮੀਨੂ"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> ਤਸਵੀਰ-ਵਿੱਚ-ਤਸਵੀਰ \'ਚ ਹੈ"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"ਜੇ ਤੁਸੀਂ ਨਹੀਂ ਚਾਹੁੰਦੇ ਕਿ <xliff:g id="NAME">%s</xliff:g> ਐਪ ਇਸ ਵਿਸ਼ੇਸ਼ਤਾ ਦੀ ਵਰਤੋਂ ਕਰੇ, ਤਾਂ ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹਣ ਲਈ ਟੈਪ ਕਰੋ ਅਤੇ ਇਸਨੂੰ ਬੰਦ ਕਰੋ।"</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"ਜੇ ਤੁਸੀਂ ਨਹੀਂ ਚਾਹੁੰਦੇ ਕਿ <xliff:g id="NAME">%s</xliff:g> ਐਪ ਇਸ ਵਿਸ਼ੇਸ਼ਤਾ ਦੀ ਵਰਤੋਂ ਕਰੇ, ਤਾਂ ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹਣ ਲਈ ਟੈਪ ਕਰੋ ਅਤੇ ਇਸਨੂੰ ਬੰਦ ਕਰੋ।"</string>
<string name="pip_play" msgid="1417176722760265888">"ਚਲਾਓ"</string>
<string name="pip_pause" msgid="8881063404466476571">"ਵਿਰਾਮ ਦਿਓ"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"ਅਗਲੇ \'ਤੇ ਜਾਓ"</string>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 136bd43..279d121 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -357,10 +357,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Szukaj"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Przesuń w górę: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Przesuń w lewo: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Nie będą Cię niepokoić żadne dźwięki ani wibracje z wyjątkiem alarmów, przypomnień, wydarzeń i połączeń od wybranych osób. Będziesz słyszeć wszystkie odtwarzane treści, takie jak muzyka, filmy czy gry."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Nie będą Cię niepokoić żadne dźwięki ani wibracje z wyjątkiem alarmów. Będziesz słyszeć wszystkie odtwarzane treści, takie jak muzyka, filmy czy gry."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Nie będą Cię niepokoić żadne dźwięki ani wibracje z wyjątkiem alarmów, przypomnień, wydarzeń i połączeń od wybranych osób. Będziesz słyszeć wszystkie odtwarzane treści, takie jak muzyka, filmy czy gry."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Nie będą Cię niepokoić żadne dźwięki ani wibracje z wyjątkiem alarmów. Będziesz słyszeć wszystkie odtwarzane treści, takie jak muzyka, filmy czy gry."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Dostosuj"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"To zablokuje WSZYSTKIE dźwięki i wibracje, w tym alarmy, muzykę, filmy i gry. Nadal będzie można wykonywać połączenia."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"To zablokuje WSZYSTKIE dźwięki i wibracje, w tym alarmy, muzykę, filmy i gry. Nadal będzie można wykonywać połączenia."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"To zablokuje WSZYSTKIE dźwięki i wibracje – w tym alarmy, muzykę, filmy i gry."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Poniżej widać mniej pilne powiadomienia"</string>
@@ -740,7 +740,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Przeciągnij w dół, by zamknąć"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Menu funkcji Obraz w obrazie"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"Aplikacja <xliff:g id="NAME">%s</xliff:g> działa w trybie obraz w obrazie"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Jeśli nie chcesz, by aplikacja <xliff:g id="NAME">%s</xliff:g> korzystała z tej funkcji, otwórz ustawienia i ją wyłącz."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Jeśli nie chcesz, by aplikacja <xliff:g id="NAME">%s</xliff:g> korzystała z tej funkcji, otwórz ustawienia i ją wyłącz."</string>
<string name="pip_play" msgid="1417176722760265888">"Odtwórz"</string>
<string name="pip_pause" msgid="8881063404466476571">"Wstrzymaj"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Dalej"</string>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index 0614849..746a7fd 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -355,10 +355,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Pesquisar"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>, deslize para cima."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>, deslize para a esquerda."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Você não será perturbado por sons e vibrações, exceto alarmes, lembretes, eventos e chamadas de pessoas especificadas. No entanto, você ouvirá tudo o que decidir reproduzir, como músicas, vídeos e jogos."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Você não será perturbado por sons e vibrações, exceto alarmes. No entanto, você ouvirá tudo o que decidir reproduzir, como músicas, vídeos e jogos."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Você não será perturbado por sons e vibrações, exceto alarmes, lembretes, eventos e chamadas de pessoas especificadas. No entanto, você ouvirá tudo o que decidir reproduzir, como músicas, vídeos e jogos."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Você não será perturbado por sons e vibrações, exceto alarmes. No entanto, você ouvirá tudo o que decidir reproduzir, como músicas, vídeos e jogos."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Personalizar"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Isso bloqueia TODOS os sons e vibrações, incluindo alarmes, músicas, vídeos e jogos. Você ainda poderá fazer chamadas telefônicas."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Isso bloqueia TODOS os sons e vibrações, incluindo alarmes, músicas, vídeos e jogos. Você ainda poderá fazer chamadas telefônicas."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Isso bloqueia TODOS os sons e vibrações, incluindo alarmes, músicas, vídeos e jogos."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Notificações menos urgentes abaixo"</string>
@@ -730,7 +730,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Arraste para baixo para dispensar"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Menu Picture-in-picture"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> está em picture-in-picture"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Se você não deseja que o <xliff:g id="NAME">%s</xliff:g> use este recurso, toque para abrir as configurações e desativá-lo."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Se você não deseja que o app <xliff:g id="NAME">%s</xliff:g> use este recurso, toque para abrir as configurações e desativá-lo."</string>
<string name="pip_play" msgid="1417176722760265888">"Reproduzir"</string>
<string name="pip_pause" msgid="8881063404466476571">"Pausar"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Pular para a próxima"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 65bed3c..92d2c94 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Pesquisar"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Deslize para cima para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Deslize para a esquerda para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Não é incomodado por sons e vibrações, exceto de alarmes, lembretes, eventos e autores de chamadas que especificar. Continua a ouvir tudo o que optar por reproduzir, incluindo música, vídeos e jogos."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Não é incomodado por sons e vibrações, exceto de alarmes. Continua a ouvir tudo o que optar por reproduzir, incluindo música, vídeos e jogos."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Não é incomodado por sons e vibrações, exceto de alarmes, lembretes, eventos e autores de chamadas que especificar. Continua a ouvir tudo o que optar por reproduzir, incluindo música, vídeos e jogos."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Não é incomodado por sons e vibrações, exceto de alarmes. Continua a ouvir tudo o que optar por reproduzir, incluindo música, vídeos e jogos."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Personalizar"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Esta ação bloqueia TODOS os sons e as vibrações, incluindo de alarmes, de músicas, de vídeos e de jogos. Continua a ser possível telefonar."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Esta ação bloqueia TODOS os sons e as vibrações, incluindo de alarmes, música, vídeos e jogos. Continua a poder telefonar."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Esta ação bloqueia TODOS os sons e as vibrações, incluindo de alarmes, de músicas, de vídeos e de jogos."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Notificações menos urgentes abaixo"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Arrastar para baixo para ignorar"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Menu de ecrã no ecrã"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"A aplicação <xliff:g id="NAME">%s</xliff:g> está no modo de ecrã no ecrã"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Se não pretende que a aplicação <xliff:g id="NAME">%s</xliff:g> utilize esta funcionalidade, toque para abrir as definições e desative-a."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Se não pretende que a aplicação <xliff:g id="NAME">%s</xliff:g> utilize esta funcionalidade, toque para abrir as definições e desative-a."</string>
<string name="pip_play" msgid="1417176722760265888">"Reproduzir"</string>
<string name="pip_pause" msgid="8881063404466476571">"Colocar em pausa"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Mudar para o seguinte"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 7d7c9c6..0b7e8b01 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -355,10 +355,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Pesquisar"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>, deslize para cima."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>, deslize para a esquerda."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Você não será perturbado por sons e vibrações, exceto alarmes, lembretes, eventos e chamadas de pessoas especificadas. No entanto, você ouvirá tudo o que decidir reproduzir, como músicas, vídeos e jogos."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Você não será perturbado por sons e vibrações, exceto alarmes. No entanto, você ouvirá tudo o que decidir reproduzir, como músicas, vídeos e jogos."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Você não será perturbado por sons e vibrações, exceto alarmes, lembretes, eventos e chamadas de pessoas especificadas. No entanto, você ouvirá tudo o que decidir reproduzir, como músicas, vídeos e jogos."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Você não será perturbado por sons e vibrações, exceto alarmes. No entanto, você ouvirá tudo o que decidir reproduzir, como músicas, vídeos e jogos."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Personalizar"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Isso bloqueia TODOS os sons e vibrações, incluindo alarmes, músicas, vídeos e jogos. Você ainda poderá fazer chamadas telefônicas."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Isso bloqueia TODOS os sons e vibrações, incluindo alarmes, músicas, vídeos e jogos. Você ainda poderá fazer chamadas telefônicas."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Isso bloqueia TODOS os sons e vibrações, incluindo alarmes, músicas, vídeos e jogos."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Notificações menos urgentes abaixo"</string>
@@ -730,7 +730,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Arraste para baixo para dispensar"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Menu Picture-in-picture"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> está em picture-in-picture"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Se você não deseja que o <xliff:g id="NAME">%s</xliff:g> use este recurso, toque para abrir as configurações e desativá-lo."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Se você não deseja que o app <xliff:g id="NAME">%s</xliff:g> use este recurso, toque para abrir as configurações e desativá-lo."</string>
<string name="pip_play" msgid="1417176722760265888">"Reproduzir"</string>
<string name="pip_pause" msgid="8881063404466476571">"Pausar"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Pular para a próxima"</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 0c4d163..0224ef5 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -357,10 +357,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Căutați"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Glisați în sus pentru <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Glisați spre stânga pentru <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Se vor anunța prin sunete și vibrații numai alarmele, mementourile, evenimentele și apelanții specificați de dvs. Totuși, veți auzi tot ce alegeți să redați, inclusiv muzică, videoclipuri și jocuri."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Se vor anunța prin sunete și vibrații numai alarmele. Totuși, veți auzi tot ce alegeți să redați, inclusiv muzică, videoclipuri și jocuri."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Se vor anunța prin sunete și vibrații numai alarmele, mementourile, evenimentele și apelanții specificați de dvs. Totuși, veți auzi tot ce alegeți să redați, inclusiv muzică, videoclipuri și jocuri."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Se vor anunța prin sunete și vibrații numai alarmele. Totuși, veți auzi tot ce alegeți să redați, inclusiv muzică, videoclipuri și jocuri."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Personalizați"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Această opțiune blochează TOATE sunetele și vibrațiile, inclusiv cele ale alarmelor, muzicii, videoclipurilor și jocurilor. Totuși, veți putea iniția apeluri."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Această opțiune blochează TOATE sunetele și vibrațiile, inclusiv cele ale alarmelor, muzicii, videoclipurilor și jocurilor. Totuși, veți putea iniția apeluri."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Această opțiune blochează TOATE sunetele și vibrațiile, inclusiv cele ale alarmelor, muzicii, videoclipurilor și jocurilor."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Notificările mai puțin urgente mai jos"</string>
@@ -736,7 +736,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Trageți în jos pentru a închide"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Meniul picture-in-picture"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> este în modul picture-in-picture"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Dacă nu doriți ca <xliff:g id="NAME">%s</xliff:g> să utilizeze această funcție, atingeți pentru a deschide setările și dezactivați-o."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Dacă nu doriți ca <xliff:g id="NAME">%s</xliff:g> să utilizeze această funcție, atingeți pentru a deschide setările și dezactivați-o."</string>
<string name="pip_play" msgid="1417176722760265888">"Redați"</string>
<string name="pip_pause" msgid="8881063404466476571">"Întrerupeți"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Treceți la următorul"</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 8fac8ad..f8dc744 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -359,10 +359,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Поиск"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Проведите вверх, чтобы <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Проведите влево, чтобы <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Вас не будут отвлекать звуки и вибрация, за исключением сигналов будильника, напоминаний, уведомлений о мероприятиях и звонков от помеченных контактов. Вы по-прежнему будете слышать включенную вами музыку, видео, игры и т. д."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Вас не будут отвлекать звуки и вибрация, за исключением сигналов будильника. Вы по-прежнему будете слышать включенную вами музыку, видео, игры и т. д."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Вас не будут отвлекать звуки и вибрация, за исключением сигналов будильника, напоминаний, уведомлений о мероприятиях и звонков от помеченных контактов. Вы по-прежнему будете слышать включенную вами музыку, видео, игры и т. д."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Вас не будут отвлекать звуки и вибрация, за исключением сигналов будильника. Вы по-прежнему будете слышать включенную вами музыку, видео, игры и т. д."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Настроить"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"В этом режиме будут отключены вибросигнал и все звуки (в том числе для будильника, музыкального проигрывателя, игр и видео). При этом вы сможете разговаривать по телефону."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Этот режим заблокирует все звуки и вибрацию, в том числе для будильника, музыки, видео и игр. Вы сможете разговаривать по телефону."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"В этом режиме будут отключены вибросигнал и все звуки (в том числе для будильника, музыкального проигрывателя, игр и видео)."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Показать менее важные оповещения"</string>
@@ -742,7 +742,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Чтобы закрыть, потяните вниз"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Меню \"Картинка в картинке\""</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> находится в режиме \"Картинка в картинке\""</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Чтобы отключить эту функцию для приложения \"<xliff:g id="NAME">%s</xliff:g>\", перейдите в настройки."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Чтобы отключить эту функцию для приложения \"<xliff:g id="NAME">%s</xliff:g>\", перейдите в настройки."</string>
<string name="pip_play" msgid="1417176722760265888">"Воспроизвести"</string>
<string name="pip_pause" msgid="8881063404466476571">"Приостановить"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Перейти к следующему"</string>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index 6011363..7e77c43 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"සෙවීම"</string>
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> සඳහා උඩට සර්පණය කරන්න."</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> සඳහා වමට සර්පණය කරන්න."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"එලාම සිහිකැඳවීම්, සිදුවීම්, සහ ඔබ සඳහන් කළ අමතන්නන් හැර, ශබ්ද සහ කම්පනවලින් ඔබට බාධා නොවනු ඇත. සංගීතය, වීඩියෝ, සහ ක්රීඩා ඇතුළු ඔබ වාදනය කිරීමට තෝරන ලද සියලු දේ ඔබට තවම ඇසෙනු ඇත."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"එලාම හැර, ශබ්ද සහ කම්පනවලින් ඔබට බාධා නොවනු ඇත. සංගීතය, වීඩියෝ, සහ ක්රීඩා ඇතුළු ඔබ වාදනය කිරීමට තෝරන ලද සියලු දේ ඔබට තවම ඇසෙනු ඇත."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"එලාම සිහිකැඳවීම්, සිදුවීම්, සහ ඔබ සඳහන් කළ අමතන්නන් හැර, ශබ්ද සහ කම්පනවලින් ඔබට බාධා නොවනු ඇත. සංගීතය, වීඩියෝ, සහ ක්රීඩා ඇතුළු ඔබ වාදනය කිරීමට තෝරන ලද සියලු දේ ඔබට තවම ඇසෙනු ඇත."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"එලාම හැර, ශබ්ද සහ කම්පනවලින් ඔබට බාධා නොවනු ඇත. සංගීතය, වීඩියෝ, සහ ක්රීඩා ඇතුළු ඔබ වාදනය කිරීමට තෝරන ලද සියලු දේ ඔබට තවම ඇසෙනු ඇත."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"අභිරුචිකරණය"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"මෙය එලාම්, සංගීතය, වීඩියෝ, සහ ක්රීඩා ඇතුළු, සියලු ශබ්ද සහ කම්පන අවහිර කරයි. ඔබට තවමත් දුරකථන ඇමතුම් ගැනීමට හැකියාව ඇත."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"මෙය එලාම්, සංගීතය, වීඩියෝ, සහ ක්රීඩා ඇතුළු, සියලු ශබ්ද සහ කම්පන අවහිර කරයි. ඔබට තවම දුරකථන ඇමතුම් ගැනීමට හැකි වනු ඇත."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"මෙය එලාම්, සංගීතය, වීඩියෝ, සහ ක්රීඩා ඇතුළු, සියලු ශබ්ද සහ කම්පන අවහිර කරයි."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"හදිසිය අඩු දැනුම් දීම් පහත"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"ඉවත ලෑමට පහළට ඇදගෙන යන්න"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"පින්තූරය තුළ පින්තූරය මෙනුව"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> පින්තූරය-තුළ-පින්තූරය තුළ වේ"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"ඔබට <xliff:g id="NAME">%s</xliff:g> මෙම විශේෂාංගය භාවිත කිරීමට අවශ්ය නැති නම්, සැකසීම් විවෘත කිරීමට තට්ටු කර එය ක්රියාවිරහිත කරන්න."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"ඔබට <xliff:g id="NAME">%s</xliff:g> මෙම විශේෂාංගය භාවිත කිරීමට අවශ්ය නැති නම්, සැකසීම් විවෘත කිරීමට තට්ටු කර එය ක්රියාවිරහිත කරන්න."</string>
<string name="pip_play" msgid="1417176722760265888">"ධාවනය කරන්න"</string>
<string name="pip_pause" msgid="8881063404466476571">"විරාම කරන්න"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"ඊළඟ එකට පනින්න"</string>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 5ed7823..2b19d6f 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -359,10 +359,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Vyhľadávanie"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Prejdite prstom nahor: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Prejdite prstom doľava: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Nebudú vás vyrušovať zvuky ani vibrácie, iba budíky, pripomenutia, udalosti a volajúci, ktorých určíte. Budete naďalej počuť všetko, čo sa rozhodnete prehrať, ako napríklad hudbu, videá a hry."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Nebudú vás vyrušovať zvuky ani vibrácie, iba budíky. Budete naďalej počuť všetko, čo sa rozhodnete prehrať, ako napríklad hudbu, videá a hry."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Nebudú vás vyrušovať zvuky ani vibrácie, iba budíky, pripomenutia, udalosti a volajúci, ktorých určíte. Budete naďalej počuť všetko, čo sa rozhodnete prehrať, ako napríklad hudbu, videá a hry."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Nebudú vás vyrušovať zvuky ani vibrácie, iba budíky. Budete naďalej počuť všetko, čo sa rozhodnete prehrať, ako napríklad hudbu, videá a hry."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Prispôsobiť"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Budú zablokované všetky zvuky a vibrácie vrátane budíkov, hudby, videí a hier. Stále však budete môcť telefonovať."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Zablokujú sa VŠETKY zvuky a vibrácie vrátane budíkov, hudby, videí a hier. Stále však budete môcť telefonovať."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Zablokujú sa tým VŠETKY zvuky a vibrácie vrátane zvukov budíkov, hudby, videí a hier."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Menej naliehavé upozornenia sa nachádzajú nižšie"</string>
@@ -742,7 +742,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Zrušíte presunutím nadol"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Ponuka režimu obraz v obraze"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> je v režime obraz v obraze"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Ak nechcete, aby aplikácia <xliff:g id="NAME">%s</xliff:g> používala túto funkciu, klepnutím otvorte nastavenia a vypnite ju."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Ak nechcete, aby aplikácia <xliff:g id="NAME">%s</xliff:g> používala túto funkciu, klepnutím otvorte nastavenia a vypnite ju."</string>
<string name="pip_play" msgid="1417176722760265888">"Prehrať"</string>
<string name="pip_pause" msgid="8881063404466476571">"Pozastaviť"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Preskočiť na ďalšie"</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index e961093..29dfa3a 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -359,10 +359,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Iskanje"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Povlecite navzgor za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Povlecite v levo za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Ne bodo vas motili zvoki ali tresenje, razen od alarmov, opomnikov, dogodkov in klicateljev, ki jih določite. Še vedno pa boste slišali vse, kar se boste odločili predvajati, vključno z glasbo, videoposnetki in igrami."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Ne bodo vas motili zvoki ali tresenje, razen alarmov. Še vedno pa boste slišali vse, kar se boste odločili predvajati, vključno z glasbo, videoposnetki in igrami."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Ne bodo vas motili zvoki ali vibriranje, razen v primeru alarmov, opomnikov, dogodkov in klicateljev, ki jih določite. Še vedno pa boste slišali vse, kar se boste odločili predvajati, vključno z glasbo, videoposnetki in igrami."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Ne bodo vas motili zvoki ali vibriranje, razen v primeru alarmov. Še vedno pa boste slišali vse, kar se boste odločili predvajati, vključno z glasbo, videoposnetki in igrami."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Prilagodi"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"S tem so blokirani VSI zvoki in vibriranje – tudi od alarmov, glasbe, videoposnetkov in iger. Še vedno boste lahko opravljali telefonske klice."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"S tem so onemogočeni VSI zvoki in vibriranje – tudi v primeru alarmov, glasbe, videoposnetkov in iger. Še vedno pa boste lahko opravljali telefonske klice."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"S tem so blokirani VSI zvoki in vibriranje – tudi od alarmov, glasbe, videoposnetkov in iger."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Manj nujna obvestila spodaj"</string>
@@ -742,7 +742,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Povlecite navzdol, da opustite"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Meni za sliko v sliki"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> je v načinu slika v sliki"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Če ne želite, da aplikacija <xliff:g id="NAME">%s</xliff:g> uporablja to funkcijo, se dotaknite, da odprete nastavitve, in funkcijo izklopite."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Če ne želite, da aplikacija <xliff:g id="NAME">%s</xliff:g> uporablja to funkcijo, se dotaknite, da odprete nastavitve, in funkcijo izklopite."</string>
<string name="pip_play" msgid="1417176722760265888">"Predvajaj"</string>
<string name="pip_pause" msgid="8881063404466476571">"Začasno ustavi"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Preskoči na naslednjega"</string>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index 23e8d5e..0423208 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Kërko"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Rrëshqit lart për <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Rrëshqit majtas për <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Nuk do të shqetësohesh nga tingujt dhe dridhjet, përveç alarmeve, alarmeve rikujtuese, ngjarjeve dhe telefonuesve që specifikon. Do të vazhdosh të dëgjosh gjithçka që zgjedh të luash duke përfshirë muzikën, videot dhe lojërat."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Nuk do të shqetësohesh nga tingujt dhe dridhjet, përveç alarmeve. Do të vazhdosh të dëgjosh gjithçka që zgjedh të luash duke përfshirë muzikën, videot dhe lojërat."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Nuk do të shqetësohesh nga tingujt dhe dridhjet, përveç alarmeve, alarmeve rikujtuese, ngjarjeve dhe telefonuesve që specifikon. Do të vazhdosh të dëgjosh çdo gjë që zgjedh të luash duke përfshirë muzikën, videot dhe lojërat."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Nuk do të shqetësohesh nga tingujt dhe dridhjet, përveç alarmeve. Do të vazhdosh të dëgjosh çdo gjë që zgjedh të luash duke përfshirë muzikën, videot dhe lojërat."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Personalizo"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Kjo bllokon TË GJITHË tingujt dhe dridhjet, duke përfshirë edhe nga alarmet, muzika, videot dhe lojërat. Përsëri do të mund të bësh telefonata."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Kjo bllokon TË GJITHË tingujt dhe dridhjet, duke përfshirë edhe nga alarmet, muzika, videot dhe lojërat. Përsëri do të mund të bësh telefonata."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Kjo bllokon TË GJITHË tingujt dhe dridhjet, duke përfshirë edhe nga alarmet, muzika, videot dhe lojërat."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Njoftimet më pak urgjente, më poshtë!"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Zvarrit poshtë për të larguar"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Menyja e \"Figurës brenda figurës\""</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> është në figurë brenda figurës"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Nëse nuk dëshiron që <xliff:g id="NAME">%s</xliff:g> ta përdorë këtë funksion, trokit për të hapur cilësimet dhe për ta çaktivizuar."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Nëse nuk dëshiron që <xliff:g id="NAME">%s</xliff:g> ta përdorë këtë funksion, trokit për të hapur cilësimet dhe për ta çaktivizuar."</string>
<string name="pip_play" msgid="1417176722760265888">"Luaj"</string>
<string name="pip_pause" msgid="8881063404466476571">"Ndërprit"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Kalo te tjetra"</string>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index a2a905a..d6adcb5 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -355,10 +355,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Претрага"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Превуците нагоре за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Превуците улево за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Неће вас узнемиравати звукови и вибрације осим за аларме, подсетнике, догађаје и позиваоце које наведете. И даље ћете чути све што одаберете да пустите, укључујући музику, видео снимке и игре."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Неће вас узнемиравати звукови и вибрације осим за аларме. И даље ћете чути све што одаберете да пустите, укључујући музику, видео снимке и игре."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Неће вас узнемиравати звукови и вибрације осим за аларме, подсетнике, догађаје и позиваоце које наведете. И даље ћете чути све што одаберете да пустите, укључујући музику, видео снимке и игре."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Неће вас узнемиравати звукови и вибрације осим за аларме. И даље ћете чути све што одаберете да пустите, укључујући музику, видео снимке и игре."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Прилагоди"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Ово блокира СВЕ звукове и вибрације укључујући аларме, музику, видео снимке и игре. И даље ћете моћи да упућујете позиве."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Ово блокира СВЕ звукове и вибрације укључујући аларме, музику, видео снимке и игре. И даље ћете моћи да упућујете позиве."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Ово блокира СВЕ звукове и вибрације укључујући аларме, музику, видео снимке и игре."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Мање хитна обавештења су у наставку"</string>
@@ -734,7 +734,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Превуците надоле да бисте одбили"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Мени Слика у слици"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> је слика у слици"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Ако не желите да <xliff:g id="NAME">%s</xliff:g> користи ову функцију, додирните да бисте отворили подешавања и искључили је."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Ако не желите да <xliff:g id="NAME">%s</xliff:g> користи ову функцију, додирните да бисте отворили подешавања и искључили је."</string>
<string name="pip_play" msgid="1417176722760265888">"Пусти"</string>
<string name="pip_pause" msgid="8881063404466476571">"Паузирај"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Пређи на следеће"</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 0408888..642484f 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Sök"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Dra uppåt för <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Dra åt vänster för <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Du blir inte störd av ljud och vibrationer, förutom från alarm, påminnelser, event och specifika samtal. Ljudet är fortfarande på för sådant du väljer att spela upp, till exempel musik, videor och spel."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Du blir inte störd av ljud och vibrationer, förutom från alarm. Ljudet är fortfarande på för sådant du väljer att spela upp, till exempel musik, videor och spel."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Du blir inte störd av ljud och vibrationer, förutom från alarm, påminnelser, händelser och specifika samtal. Ljudet är fortfarande på för sådant du väljer att spela upp, till exempel musik, videor och spel."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Du blir inte störd av ljud och vibrationer, förutom från alarm. Ljudet är fortfarande på för sådant du väljer att spela upp, till exempel musik, videor och spel."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Anpassa"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Detta blockerar ALLA ljud och vibrationer, inklusive alarm, musik, videor och spel. Du kan fortfarande ringa."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"ALLA ljud och vibrationer blockeras, inklusive alarm, musik, videor och spel. Du kan fortfarande ringa."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Detta blockerar ALLA ljud och vibrationer, inklusive alarm, musik, videor och spel."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Mindre brådskande aviseringar nedan"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Tryck och dra nedåt för att ignorera"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Bild-i-bild-meny"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> visas i bild-i-bild"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Om du inte vill att den här funktionen används för <xliff:g id="NAME">%s</xliff:g> öppnar du inställningarna genom att trycka. Sedan inaktiverar du funktionen."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Om du inte vill att den här funktionen används i <xliff:g id="NAME">%s</xliff:g> öppnar du inställningarna genom att trycka. Sedan inaktiverar du funktionen."</string>
<string name="pip_play" msgid="1417176722760265888">"Spela upp"</string>
<string name="pip_pause" msgid="8881063404466476571">"Pausa"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Hoppa till nästa"</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index b3fd5e3..f567ec9 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Tafuta"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Sogeza juu kwa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Sogeza kushoto kwa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Hutasumbuliwa na sauti na mitetemo, isipokuwa kengele, vikumbusho, matukio na watu wanaokupigia simu ambao umechagua. Bado utasikia chochote utakachochagua kucheza, ikiwa ni pamoja na muziki, video na michezo."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Hutasumbuliwa na sauti na mitetemo, isipokuwa kengele. Bado utasikia chochote utakachochagua kucheza, ikiwa ni pamoja na muziki, video na michezo."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Hutasumbuliwa na sauti na mitetemo, isipokuwa inayotokana na kengele, vikumbusho, matukio na simu zinazopigwa na watu uliobainisha. Bado utasikia chochote utakachochagua kucheza, ikiwa ni pamoja na muziki, video na michezo."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Hutasumbuliwa na sauti na mitetemo, isipokuwa inayotokana na kengele. Bado utasikia chochote utakachochagua kucheza, ikiwa ni pamoja na muziki, video na michezo."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Badilisha upendavyo"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Hatua hii huzuia sauti na mitetemo YOTE, ikiwa ni pamoja na ile inayotokana na kengele, muziki, video na michezo. Bado utaweza kupiga simu."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Hatua hii huzuia mitetemo na sauti ZOTE, ikiwa ni pamoja na inayotokana na kengele, muziki video na michezo. Bado utaweza kupiga simu."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Hatua hii huzuia sauti na mitetemo YOTE, ikiwa ni pamoja na ile inayotokana na kengele, muziki, video na michezo."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>+"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Arifa zisizo za dharura sana ziko hapo chini"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Buruta ili uondoe"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Menyu ya picha ndani ya picha"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> iko katika hali ya picha ndani ya picha nyingine"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Ikiwa hutaki <xliff:g id="NAME">%s</xliff:g> kutumia kipengele hiki, gonga ili ufungue mipangilio na ukizime."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Ikiwa hutaki <xliff:g id="NAME">%s</xliff:g> itumie kipengele hiki, gonga ili ufungue mipangilio na uizime."</string>
<string name="pip_play" msgid="1417176722760265888">"Cheza"</string>
<string name="pip_pause" msgid="8881063404466476571">"Sitisha"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Ruka ufikie inayofuata"</string>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index a51866d..e0a0e9b 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"தேடு"</string>
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> க்கு மேலாக இழுக்கவும்."</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> க்கு இடதுபக்கமாக இழுக்கவும்."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"அலாரங்கள், நினைவூட்டல்கள், நிகழ்வுகள் மற்றும் குறிப்பிட்ட அழைப்பாளர்களைத் தவிர்த்து, பிற ஒலிகள் மற்றும் அதிர்வுகளின் தொந்தரவு இருக்காது. எனினும், நீங்கள் எதையேனும் (இசை, வீடியோக்கள் மற்றும் கேம்கள் உட்பட) ஒலிக்கும்படி தேர்ந்தெடுத்திருந்தால், அவை வழக்கம் போல் ஒலிக்கும்."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"அலாரங்களைத் தவிர்த்து, பிற ஒலிகள் மற்றும் அதிர்வுகளின் தொந்தரவு இருக்காது. எனினும், நீங்கள் எதையேனும் (இசை, வீடியோக்கள் மற்றும் கேம்கள் உட்பட) ஒலிக்கும்படி தேர்ந்தெடுத்திருந்தால், அவை வழக்கம் போல் ஒலிக்கும்."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"அலாரங்கள், நினைவூட்டல்கள், நிகழ்வுகள் மற்றும் குறிப்பிட்ட அழைப்பாளர்களைத் தவிர்த்து, பிற ஒலிகள் மற்றும் அதிர்வுகளின் தொந்தரவு இருக்காது. எனினும், நீங்கள் எதையேனும் (இசை, வீடியோக்கள், கேம்கள் போன்றவை) ஒலிக்கும்படி தேர்ந்தெடுத்திருந்தால், அவை வழக்கம் போல் ஒலிக்கும்."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"அலாரங்களைத் தவிர்த்து, பிற ஒலிகள் மற்றும் அதிர்வுகளின் தொந்தரவு இருக்காது. எனினும், நீங்கள் எதையேனும் (இசை, வீடியோக்கள், கேம்கள் போன்றவை) ஒலிக்கும்படி தேர்ந்தெடுத்திருந்தால், அவை வழக்கம் போல் ஒலிக்கும்."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"தனிப்பயனாக்கு"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"இது அலாரங்கள், இசை, வீடியோக்கள் மற்றும் கேம்கள் உட்பட எல்லா ஒலிகளையும் அதிர்வுகளையும் தடுக்கும். இருப்பினும் நீங்கள் அழைப்புகளைச் செய்யலாம்."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"இது அலாரங்கள், இசை, வீடியோக்கள் மற்றும் கேம்கள் உட்பட எல்லா ஒலிகளையும் அதிர்வுகளையும் தடுக்கும். எனினும், உங்களால் ஃபோன் அழைப்புகளைச் செய்ய முடியும்."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"இது அலாரங்கள், இசை, வீடியோக்கள் மற்றும் கேம்கள் உட்பட எல்லா ஒலிகளையும் அதிர்வுகளையும் தடுக்கும்."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"அவசர நிலைக் குறைவான அறிவிப்புகள் கீழே உள்ளன"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"நிராகரிக்க, கீழே இழுக்கவும்"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"பிக்ச்சர்-இன்-பிக்ச்சர் மெனு"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> தற்போது பிக்ச்சர்-இன்-பிக்ச்சரில் உள்ளது"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"<xliff:g id="NAME">%s</xliff:g> இந்த அம்சத்தைப் பயன்படுத்த வேண்டாம் என நினைத்தால், அமைப்புகளைத் திறந்து அதை முடக்க, தட்டவும்."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"<xliff:g id="NAME">%s</xliff:g> இந்த அம்சத்தைப் பயன்படுத்த வேண்டாம் என நினைத்தால், அமைப்புகளைத் திறந்து அதை முடக்க, தட்டவும்."</string>
<string name="pip_play" msgid="1417176722760265888">"இயக்கு"</string>
<string name="pip_pause" msgid="8881063404466476571">"இடைநிறுத்து"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"அடுத்ததற்குச் செல்"</string>
diff --git a/packages/SystemUI/res/values-ta/strings_tv.xml b/packages/SystemUI/res/values-ta/strings_tv.xml
index 5ddab56..f7c81ee 100644
--- a/packages/SystemUI/res/values-ta/strings_tv.xml
+++ b/packages/SystemUI/res/values-ta/strings_tv.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="notification_channel_tv_pip" msgid="134047986446577723">"பிக்ச்சர் இன் பிக்ச்சர்"</string>
+ <string name="notification_channel_tv_pip" msgid="134047986446577723">"பிக்ச்சர்-இன்-பிக்ச்சர்"</string>
<string name="pip_notification_unknown_title" msgid="6289156118095849438">"(தலைப்பு இல்லை)"</string>
<string name="pip_close" msgid="3480680679023423574">"PIPஐ மூடு"</string>
<string name="pip_fullscreen" msgid="8604643018538487816">"முழுத்திரை"</string>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index dbee51b..1787d07 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"శోధించండి"</string>
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> కోసం పైకి స్లైడ్ చేయండి."</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> కోసం ఎడమవైపుకు స్లైడ్ చేయండి."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"మీరు పేర్కొనే అలారాలు, రిమైండర్లు, ఈవెంట్లు మరియు కాలర్ల నుండి మినహా మరే ఇతర ధ్వనులు మరియు వైబ్రేషన్లతో మీకు అంతరాయం కలగదు. మీరు ఇప్పటికీ సంగీతం, వీడియోలు మరియు గేమ్లతో సహా మీరు ప్లే చేయడానికి ఎంచుకున్నవి ఏవైనా వింటారు."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"అలారాలు నుండి మినహా మరే ఇతర ధ్వనులు మరియు వైబ్రేషన్లతో మీకు అంతరాయం కలగదు. మీరు ఇప్పటికీ సంగీతం, వీడియోలు మరియు గేమ్లతో సహా మీరు ప్లే చేయడానికి ఎంచుకున్నవి ఏవైనా వింటారు."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"మీరు పేర్కొనే అలారాలు, రిమైండర్లు, ఈవెంట్లు మరియు కాలర్ల నుండి మినహా మరే ఇతర ధ్వనులు మరియు వైబ్రేషన్లతో మీకు అంతరాయం కలగదు. మీరు ఇప్పటికీ సంగీతం, వీడియోలు మరియు గేమ్లతో సహా మీరు ప్లే చేయడానికి ఎంచుకున్నవి ఏవైనా వింటారు."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"అలారాలు నుండి మినహా మరే ఇతర ధ్వనులు మరియు వైబ్రేషన్లతో మీకు అంతరాయం కలగదు. మీరు ఇప్పటికీ సంగీతం, వీడియోలు మరియు గేమ్లతో సహా మీరు ప్లే చేయడానికి ఎంచుకున్నవి ఏవైనా వింటారు."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"అనుకూలీకరించు"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"ఇది అలారాలు, సంగీతం, వీడియోలు మరియు గేమ్లతో సహా అన్ని ధ్వనులు మరియు వైబ్రేషన్లను బ్లాక్ చేస్తుంది. మీరు ఇప్పటికీ ఫోన్ కాల్లు చేయగలుగుతారు."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"ఇది అలారాలు, సంగీతం, వీడియోలు మరియు గేమ్లతో సహా అన్ని ధ్వనులు మరియు వైబ్రేషన్లను బ్లాక్ చేస్తుంది. మీరు ఇప్పటికీ ఫోన్ కాల్లు చేయగలుగుతారు."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"ఇది అలారాలు, సంగీతం, వీడియోలు మరియు గేమ్లతో సహా అన్ని ధ్వనులు మరియు వైబ్రేషన్లను బ్లాక్ చేస్తుంది."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"తక్కువ అత్యవసర నోటిఫికేషన్లు దిగువన"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"తీసివేయడానికి కిందికి లాగండి"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"చిత్రంలో చిత్రం మెను"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> చిత్రంలో చిత్రం రూపంలో ఉంది"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"<xliff:g id="NAME">%s</xliff:g> ఈ లక్షణాన్ని ఉపయోగించకూడదు అని మీరు అనుకుంటే, సెట్టింగ్లను తెరవడానికి నొక్కి, దీన్ని ఆఫ్ చేయండి."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"<xliff:g id="NAME">%s</xliff:g> ఈ లక్షణాన్ని ఉపయోగించకూడదు అని మీరు అనుకుంటే, సెట్టింగ్లను తెరవడానికి నొక్కి, దీన్ని ఆఫ్ చేయండి."</string>
<string name="pip_play" msgid="1417176722760265888">"ప్లే చేయి"</string>
<string name="pip_pause" msgid="8881063404466476571">"పాజ్ చేయి"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"దాటవేసి తదుపరి దానికి వెళ్లు"</string>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 9492665..a0db287 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"ค้นหา"</string>
<string name="description_direction_up" msgid="7169032478259485180">"เลื่อนขึ้นเพื่อ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
<string name="description_direction_left" msgid="7207478719805562165">"เลื่อนไปทางซ้ายเพื่อ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"คุณจะไม่ถูกรบกวนจากเสียงและการสั่น ยกเว้นเสียงนาฬิกาปลุก การช่วยเตือน กิจกรรม และผู้โทรที่ระบุไว้ คุณจะยังคงได้ยินสิ่งที่คุณเลือกเล่น เช่น เพลง วิดีโอ และเกม"</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"คุณจะไม่ถูกรบกวนจากเสียงและการสั่น ยกเว้นเสียงนาฬิกาปลุก คุณจะยังคงได้ยินสิ่งที่คุณเลือกเล่น เช่น เพลง วิดีโอ และเกม"</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"คุณจะไม่ถูกรบกวนจากเสียงและการสั่น ยกเว้นเสียงนาฬิกาปลุก การช่วยเตือน กิจกรรม และผู้โทรที่ระบุไว้ คุณจะยังคงได้ยินสิ่งที่คุณเลือกเล่น เช่น เพลง วิดีโอ และเกม"</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"คุณจะไม่ถูกรบกวนจากเสียงและการสั่น ยกเว้นเสียงนาฬิกาปลุก คุณจะยังคงได้ยินสิ่งที่คุณเลือกเล่น เช่น เพลง วิดีโอ และเกม"</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"กำหนดค่า"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"การใช้โหมดนี้จะบล็อกเสียงและการสั่นทั้งหมด ซึ่งรวมถึงเสียงปลุก เพลง วิดีโอ และเกม คุณจะยังโทรออกได้อยู่"</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"การตั้งค่านี้จะบล็อกเสียงและการสั่นทั้งหมด ซึ่งรวมถึงเสียงปลุก เพลง วิดีโอ และเกม คุณจะยังสามารถโทรออกได้อยู่"</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"การใช้โหมดนี้จะบล็อกเสียงและการสั่นทั้งหมด ซึ่งรวมถึงเสียงปลุก เพลง วิดีโอ และเกม"</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"การแจ้งเตือนที่เร่งด่วนน้อยด้านล่าง"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"ลากลงเพื่อปิด"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"เมนูการแสดงผลหลายแหล่งพร้อมกัน"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> ใช้การแสดงผลหลายแหล่งพร้อมกัน"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"หากคุณไม่ต้องการให้ <xliff:g id="NAME">%s</xliff:g> ใช้ฟีเจอร์นี้ ให้แตะเพื่อเปิดการตั้งค่าแล้วปิดฟีเจอร์"</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"หากคุณไม่ต้องการให้ <xliff:g id="NAME">%s</xliff:g> ใช้ฟีเจอร์นี้ ให้แตะเพื่อเปิดการตั้งค่าแล้วปิดฟีเจอร์"</string>
<string name="pip_play" msgid="1417176722760265888">"เล่น"</string>
<string name="pip_pause" msgid="8881063404466476571">"หยุดชั่วคราว"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"ข้ามไปรายการถัดไป"</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 964b99d..5b6732c 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Maghanap"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Mag-slide pataas para sa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Mag-slide pakaliwa para sa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Hindi ka maiistorbo ng mga tunog at pag-vibrate, maliban sa mga alarm, paalala, kaganapan, at tumatawag na tutukuyin mo. Maririnig mo pa rin ang anumang pipiliin mong i-play kabilang ang musika, mga video, at mga laro."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Hindi ka maiistorbo ng mga tunog at pag-vibrate, maliban sa mga alarm. Maririnig mo pa rin ang anumang pipiliin mong i-play kabilang ang musika, mga video, at mga laro."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Hindi ka maiistorbo ng mga tunog at pag-vibrate, maliban mula sa mga alarm, paalala, kaganapan, at tumatawag na tutukuyin mo. Maririnig mo pa rin ang kahit na anong piliin mong i-play kabilang ang mga musika, video, at laro."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Hindi ka maiistorbo ng mga tunog at pag-vibrate, maliban mula sa mga alarm. Maririnig mo pa rin ang kahit na anong piliin mong i-play kabilang ang mga musika, video, at laro."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"I-customize"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Bina-block nito ang LAHAT ng tunog at pag-vibrate, kabilang ang mula sa mga alarm, musika, video at laro. Magagawa mo pa ring tumawag."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Bina-block nito ang LAHAT ng tunog at pag-vibrate, kabilang ang mula sa mga alarm, musika, video, at laro. Makakatawag ka pa rin."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Bina-block nito ang LAHAT ng tunog at pag-vibrate, kabilang ang mula sa mga alarm, musika, video at laro."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Nasa ibaba ang mga notification na hindi masyadong mahalaga"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"I-drag pababa upang i-dismiss"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Menu ng picture in picture"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"Nasa picture-in-picture ang <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Kung ayaw mong gamitin ng <xliff:g id="NAME">%s</xliff:g> ang feature na ito, i-tap upang buksan ang mga setting at i-off ito."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Kung ayaw mong magamit ni <xliff:g id="NAME">%s</xliff:g> ang feature na ito, i-tap upang buksan ang mga setting at i-off ito."</string>
<string name="pip_play" msgid="1417176722760265888">"I-play"</string>
<string name="pip_pause" msgid="8881063404466476571">"I-pause"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Lumaktaw sa susunod"</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index b2e5641..ad6c498 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Ara"</string>
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> için yukarı kaydırın."</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> için sola kaydırın."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Alarmlar, hatırlatıcılar, etkinlikler ve sizin seçtiğiniz arayan kişiler dışında hiçbir ses ve titreşimle rahatsız edilmeyeceksiniz. O sırada çaldığınız, seyrettiğiniz ya da oynadığınız müzik, video ve oyunların sesini duymaya devam edeceksiniz"</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Alarmlar dışında hiçbir ses ve titreşimle rahatsız edilmeyeceksiniz. O sırada çaldığınız, seyrettiğiniz ya da oynadığınız müzik, video ve oyunların sesini duymaya devam edeceksiniz."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Alarmlar, hatırlatıcılar, etkinlikler ve sizin seçtiğiniz kişilerden gelen çağrılar dışında hiçbir ses ve titreşimle rahatsız edilmeyeceksiniz. O sırada çaldığınız müzik, seyrettiğiniz video ya da oynadığınız oyunların sesini duymaya devam edeceksiniz."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Alarmlar dışında hiçbir ses ve titreşimle rahatsız edilmeyeceksiniz. O sırada çaldığınız müzik, seyrettiğiniz video ya da oynadığınız oyunların sesini duymaya devam edeceksiniz."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Özelleştir"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Bu seçenek TÜM sesleri ve titreşimleri engeller. Buna alarmlar, müzik, videolar ve oyunlar dahildir. Telefon aramaları yapmaya devam edebileceksiniz."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Bu seçenek TÜM sesleri ve titreşimleri engeller. Buna alarmlar, müzik, videolar ve oyunlar dahildir. Telefon aramaları yapmaya devam edebilirsiniz."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Bu seçenek TÜM sesleri ve titreşimleri engeller. Buna alarmlar, müzik, videolar ve oyunlar dahildir."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Daha az acil bildirimler aşağıdadır"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Kapatmak için aşağıya sürükleyin"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Pencere içinde pencere menüsü"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g>, pencere içinde pencere özelliğini kullanıyor"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"<xliff:g id="NAME">%s</xliff:g> uygulamasının bu özelliği kullanmasını istemiyorsanız dokunarak ayarları açın ve özelliği kapatın."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"<xliff:g id="NAME">%s</xliff:g> uygulamasının bu özelliği kullanmasını istemiyorsanız dokunarak ayarları açın ve söz konusu özelliği kapatın."</string>
<string name="pip_play" msgid="1417176722760265888">"Oynat"</string>
<string name="pip_pause" msgid="8881063404466476571">"Duraklat"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Sonrakine atla"</string>
diff --git a/packages/SystemUI/res/values-tr/strings_tv.xml b/packages/SystemUI/res/values-tr/strings_tv.xml
index ec2c784..fb39510 100644
--- a/packages/SystemUI/res/values-tr/strings_tv.xml
+++ b/packages/SystemUI/res/values-tr/strings_tv.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="notification_channel_tv_pip" msgid="134047986446577723">"Ekran İçinde Ekran"</string>
+ <string name="notification_channel_tv_pip" msgid="134047986446577723">"Pencere İçinde Pencere"</string>
<string name="pip_notification_unknown_title" msgid="6289156118095849438">"(Başlıksız program)"</string>
<string name="pip_close" msgid="3480680679023423574">"PIP\'yi kapat"</string>
<string name="pip_fullscreen" msgid="8604643018538487816">"Tam ekran"</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index cc52331..7866c8f 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -359,10 +359,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Пошук"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Проведіть пальцем угору, щоб <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Проведіть пальцем ліворуч, щоб <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Ви отримуватиме звукові та вібросигнали лише для вибраних будильників, нагадувань, подій і абонентів. Однак ви чутимете все, що захочете відтворити, зокрема музику, відео й ігри."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Ви отримуватиме звукові та вібросигнали лише для будильників. Однак ви чутимете все, що захочете відтворити, зокрема музику, відео й ігри."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Ви отримуватиме звукові та вібросигнали лише для вибраних будильників, нагадувань, подій і абонентів. Однак ви чутимете все, що захочете відтворити, зокрема музику, відео й ігри."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Ви отримуватиме звукові та вібросигнали лише для будильників. Однак ви чутимете все, що захочете відтворити, зокрема музику, відео й ігри."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Налаштувати"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Блокуватимуться ВСІ звукові та вібросигнали, зокрема будильники, музика, відео й ігри. Ви зможете телефонувати."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Блокуватимуться ВСІ звукові та вібросигнали, зокрема будильники, музика, відео й ігри. Однак ви зможете телефонувати."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Блокуватимуться ВСІ звукові та вібросигнали, зокрема будильники, музика, відео й ігри."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Менше термінових сповіщень нижче"</string>
@@ -742,7 +742,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Перетягніть униз, щоб закрити"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Меню \"Картинка в картинці\""</string>
<string name="pip_notification_title" msgid="3204024940158161322">"У додатку <xliff:g id="NAME">%s</xliff:g> є функція \"Картинка в картинці\""</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Щоб у додатку <xliff:g id="NAME">%s</xliff:g> не працювала ця функція, вимкніть її в налаштуваннях."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Щоб додаток <xliff:g id="NAME">%s</xliff:g> не використовував цю функцію, вимкніть її в налаштуваннях."</string>
<string name="pip_play" msgid="1417176722760265888">"Відтворити"</string>
<string name="pip_pause" msgid="8881063404466476571">"Призупинити"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Перейти далі"</string>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index fdf8923..c59242f 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"تلاش کریں"</string>
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> کیلئے اوپر سلائیڈ کریں۔"</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> کیلئے بائیں سلائیڈ کریں۔"</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"الارمز، یاد دہانیوں، ایونٹس اور آپ کے متعین کردہ کالرز کے علاوہ، آپ آوازوں اور وائبریشنز سے ڈسٹرب نہیں ہوں گے۔ موسیقی، ویڈیوز اور گیمز سمیت آپ ابھی بھی ہر وہ چیز سنیں گے جسے چلانے کا آپ انتخاب کرتے ہیں۔"</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"الارمز کے علاوہ، آپ آوازوں اور وائبریشنز سے ڈسٹرب نہیں ہوں گے۔ موسیقی، ویڈیوز اور گیمز سمیت آپ ہر وہ چیز سنیں گے جسے چلانے کا آپ انتخاب کرتے ہیں۔"</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"الارمز، یاددہانیوں، ایونٹس اور آپ کے متعین کردہ کالرز کے علاوہ، آپ آوازوں اور وائبریشنز سے ڈسٹرب نہیں ہوں گے۔ موسیقی، ویڈیوز اور گیمز سمیت آپ ابھی بھی ہر وہ چیز سنیں گے جسے چلانے کا آپ انتخاب کرتے ہیں۔"</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"الارمز کے علاوہ، آپ آوازوں اور وائبریشنز سے ڈسٹرب نہیں ہوں گے۔ موسیقی، ویڈیوز اور گیمز سمیت آپ ہر وہ چیز سنیں گے جسے چلانے کا آپ انتخاب کرتے ہیں۔"</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"حسب ضرورت بنائیں"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"یہ الارمز، موسیقی، ویڈیوز اور گیمز کی آوازوں اور وائبریشنز سمیت سبھی آوازیں اور وائبریشنز مسدود کر دیتا ہے۔ آپ ابھی بھی فون کالز کر سکیں گے۔"</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"یہ الارمز، موسیقی، ویڈیوز اور گیمز کی آوازوں اور وائبریشنز سمیت سبھی آوازیں اور وائبریشنز مسدود کر دیتا ہے۔ آپ ابھی بھی فون کالز کر سکیں گے۔"</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"یہ الارمز، موسیقی، ویڈیوز اور گیمز کی آوازوں اور وائبریشنز سمیت سبھی آوازیں اور وائبریشنز مسدود کر دیتا ہے۔"</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"کم اہم اطلاعات ذیل میں ہیں"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"برخاست کرنے کیلئے نیچے گھسیٹیں"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"تصویر کے مینو میں تصویر"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> تصویر میں تصویر میں ہے"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"اگر آپ نہیں چاہتے ہیں کہ <xliff:g id="NAME">%s</xliff:g> اس خصوصیت کا استعمال کرے تو ترتیبات کھولنے کیلئے تھپتھپائیں اور اسے آف کر دیں۔"</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"اگر آپ نہیں چاہتے ہیں کہ <xliff:g id="NAME">%s</xliff:g> اس خصوصیت کا استعمال کرے تو ترتیبات کھولنے کے لیے تھپتھپا کر اسے آف کرے۔"</string>
<string name="pip_play" msgid="1417176722760265888">"چلائیں"</string>
<string name="pip_pause" msgid="8881063404466476571">"موقوف کریں"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"نظرانداز کرکے اگلے پر جائیں"</string>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index 07d5b1a..4946f69 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -355,10 +355,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Qidirish"</string>
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> uchun yuqoriga suring."</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> uchun chapga suring."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Turli ovoz va tebranishlar endi sizni bezovta qilmaydi. Biroq, signallar, eslatmalar, tadbirlar haqidagi bildirishnomalar va siz tanlagan abonentlardan kelgan chaqiruvlar bundan mustasno. Lekin, ijro etiladigan barcha narsalar, jumladan, musiqa, video va o‘yinlar eshitiladi."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Turli ovoz va tebranishlar endi sizni bezovta qilmaydi. Biroq, signallar bundan mustasno. Lekin, ijro etiladigan barcha narsalar, jumladan, musiqa, video va o‘yinlar eshitiladi."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Turli ovoz va tebranishlar endi sizni bezovta qilmaydi. Biroq, signallar, eslatmalar, tadbirlar haqidagi bildirishnomalar va siz tanlagan abonentlardan kelgan chaqiruvlar bundan mustasno. Lekin, ijro etiladigan barcha narsalar, jumladan, musiqa, video va o‘yinlar ovozi eshitiladi."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Turli ovoz va tebranishlar endi sizni bezovta qilmaydi. Biroq, signallar bundan mustasno. Lekin, ijro etiladigan barcha narsalar, jumladan, musiqa, video va o‘yinlar ovozi eshitiladi."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Sozlash"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Bu BARCHA, jumladan signallar, musiqa, videolar va o‘yinlardan keladigan tovush va tebranishlarni to‘sib qo‘yadi. Siz telefon qo‘ng‘iroqlarini bemalol amalga oshirishingiz mumkin."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Bu rejimda BARCHA ovoz va tebranishlar, jumladan, signal, musiqa va o‘yinlar ovozi ham o‘chirib qo‘yiladi. Shunday bo‘lsa-da, chaqiruvlarni bemalol amalga oshirishingiz mumkin."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Bu BARCHA, jumladan, signallar, musiqa, videolar va o‘yinlardan keladigan tovush va tebranishlarni to‘sib qo‘yadi."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Kam ahamiyatli bildirishnomalarni pastda ko‘rsatish"</string>
@@ -730,7 +730,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Yopish uchun pastga torting"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Tasvir ustida tasvir menyusi"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> tasvir ustida tasvir rejimida"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"<xliff:g id="NAME">%s</xliff:g> ilovasi uchun bu funksiyani sozlamalar orqali o‘chirib qo‘yish mumkin."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"<xliff:g id="NAME">%s</xliff:g> ilovasi uchun bu funksiyani sozlamalar orqali faolsizlantirish mumkin."</string>
<string name="pip_play" msgid="1417176722760265888">"Ijro"</string>
<string name="pip_pause" msgid="8881063404466476571">"Pauza"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Keyingisiga o‘tish"</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index f0385a4..e716899 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Tìm kiếm"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Trượt lên để <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Trượt sang trái để <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Bạn sẽ không bị làm phiền bởi âm thanh và tiếng rung, ngoại trừ báo thức, nhắc nhở, sự kiện và người gọi mà bạn chỉ định. Bạn sẽ vẫn nghe thấy mọi thứ bạn chọn phát, bao gồm nhạc, video và trò chơi."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Bạn sẽ không bị làm phiền bởi âm thanh và tiếng rung, ngoại trừ báo thức. Bạn sẽ vẫn nghe thấy mọi thứ bạn chọn phát, bao gồm nhạc, video và trò chơi."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Bạn sẽ không bị làm phiền bởi âm thanh và tiếng rung, ngoại trừ báo thức, lời nhắc, sự kiện và người gọi mà bạn chỉ định. Bạn sẽ vẫn nghe thấy mọi thứ bạn chọn phát, bao gồm nhạc, video và trò chơi."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Bạn sẽ không bị làm phiền bởi âm thanh và tiếng rung, ngoại trừ báo thức. Bạn sẽ vẫn nghe thấy mọi thứ bạn chọn phát, bao gồm nhạc, video và trò chơi."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Tùy chỉnh"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Chế độ này sẽ chặn TẤT CẢ âm thanh và tiếng rung, bao gồm báo thức, âm nhạc, video và trò chơi. Bạn vẫn có thể gọi điện thoại."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Chế độ này sẽ chặn TẤT CẢ âm thanh và tiếng rung, bao gồm báo thức, nhạc, video và trò chơi. Bạn vẫn có thể gọi điện thoại."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Chế độ này sẽ chặn TẤT CẢ âm thanh và tiếng rung, bao gồm báo thức, âm nhạc, video và trò chơi."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Thông báo ít khẩn cấp hơn bên dưới"</string>
@@ -730,7 +730,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Kéo xuống để loại bỏ"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Menu ảnh trong ảnh"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> đang ở chế độ ảnh trong ảnh"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Nếu bạn không muốn <xliff:g id="NAME">%s</xliff:g> sử dụng tính năng này, hãy nhấn để mở cài đặt và tắt tính năng này."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Nếu bạn không muốn <xliff:g id="NAME">%s</xliff:g> sử dụng tính năng này, hãy nhấn để mở cài đặt và tắt tính năng này."</string>
<string name="pip_play" msgid="1417176722760265888">"Phát"</string>
<string name="pip_pause" msgid="8881063404466476571">"Tạm dừng"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Chuyển tới mục tiếp theo"</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 906b40f..b8588d9 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"搜索"</string>
<string name="description_direction_up" msgid="7169032478259485180">"向上滑动以<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
<string name="description_direction_left" msgid="7207478719805562165">"向左滑动以<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"您将不会受到声音和振动的打扰(闹钟、提醒、活动和所指定来电者的相关提示音除外)。您依然可以听到您选择播放的任何内容(包括音乐、视频和游戏)的相关音效。"</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"您将不会受到声音和振动的打扰(闹钟提示音除外)。您依然可以听到您选择播放的任何内容(包括音乐、视频和游戏)的相关音效。"</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"您将不会受到声音和振动的打扰(闹钟、提醒、活动和所指定来电者的相关提示音除外)。您依然可以听到您选择播放的任何内容(包括音乐、视频和游戏)的相关音效。"</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"您将不会受到声音和振动的打扰(闹钟提示音除外)。您依然可以听到您选择播放的任何内容(包括音乐、视频和游戏)的相关音效。"</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"自定义"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"这会阻止所有声音和振动(包括闹钟、音乐、视频和游戏)打扰您。您仍然可以拨打电话。"</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"这会阻止所有声音和振动(包括闹钟、音乐、视频和游戏)打扰您。您仍然可以拨打电话。"</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"这会阻止所有声音和振动(包括闹钟、音乐、视频和游戏)打扰您。"</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"不太紧急的通知会显示在下方"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"向下拖动即可关闭"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"画中画菜单"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g>目前位于“画中画”中"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"如果您不想让<xliff:g id="NAME">%s</xliff:g>使用此功能,请点按以打开设置,然后关闭此功能。"</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"如果您不想让“<xliff:g id="NAME">%s</xliff:g>”使用此功能,请点按以打开设置,然后关闭此功能。"</string>
<string name="pip_play" msgid="1417176722760265888">"播放"</string>
<string name="pip_pause" msgid="8881063404466476571">"暂停"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"跳到下一个"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index 85f7298..e29ccb6 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -355,10 +355,10 @@
<string name="description_target_search" msgid="3091587249776033139">"搜尋"</string>
<string name="description_direction_up" msgid="7169032478259485180">"向上滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
<string name="description_direction_left" msgid="7207478719805562165">"向左滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"您不會受音效和震動騷擾 (鬧鐘、提醒、活動,以及您指定的來電者鈴聲除外)。如果您選擇播放特定音樂、影片和遊戲等內容,仍可以聽到相關音訊。"</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"您不會受音效和震動騷擾 (鬧鐘除外)。如果您選擇播放特定音樂、影片和遊戲等內容,仍可以聽到相關音訊。"</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"您不會受到聲音和震動騷擾 (鬧鐘、提醒、活動和您指定的來電者鈴聲除外)。當您選擇播放音樂、影片和遊戲等,仍可以聽到該內容的聲音。"</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"您不會受到聲音和震動騷擾 (鬧鐘除外)。當您選擇播放音樂、影片和遊戲等,仍可以聽到該內容的聲音。"</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"自訂"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"這會封鎖所有聲音和震動,包括鬧鐘、音樂、影片和遊戲,但您仍可撥打電話。"</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"這會封鎖所有聲音和震動 (包括鬧鐘、音樂、影片及遊戲),但您仍可以撥打電話。"</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"這會封鎖所有聲音和震動,包括鬧鐘、音樂、影片和遊戲。"</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"還有 <xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g> 則通知"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"不太緊急的通知會在下方顯示"</string>
@@ -730,7 +730,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"向下拖曳即可關閉"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"畫中畫選單"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"「<xliff:g id="NAME">%s</xliff:g>」目前在畫中畫模式"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"如果您不想「<xliff:g id="NAME">%s</xliff:g>」使用此功能,請輕按以開啟設定,然後停用此功能。"</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"如果您不想「<xliff:g id="NAME">%s</xliff:g>」使用此功能,請輕按以開啟設定,然後停用此功能。"</string>
<string name="pip_play" msgid="1417176722760265888">"播放"</string>
<string name="pip_pause" msgid="8881063404466476571">"暫停"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"跳到下一個"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index f64428c..2656550 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"搜尋"</string>
<string name="description_direction_up" msgid="7169032478259485180">"向上滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
<string name="description_direction_left" msgid="7207478719805562165">"向左滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"裝置不會發出音效或震動造成干擾,但會保留鬧鐘、提醒、活動和你指定的來電者響鈴。如果你選擇播放特定音樂、影片和遊戲等內容,還是可以聽見相關音訊。"</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"裝置不會發出音效或震動造成干擾,但會保留鬧鐘響鈴。如果你選擇播放特定音樂、影片和遊戲等內容,還是可以聽見相關音訊。"</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"裝置不會發出音效或震動造成干擾,但是會保留與鬧鐘、提醒、活動和指定來電者有關的設定。如果你選擇播放音樂、影片和遊戲等內容,還是可以聽見相關音訊。"</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"裝置不會發出音效或震動造成干擾,但是會保留鬧鐘響鈴。如果你選擇播放音樂、影片和遊戲等內容,還是可以聽見相關音訊。"</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"自訂"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"這會封鎖「所有」聲音和震動干擾,包括鬧鐘、音樂、影片和遊戲在內,但你仍然可以撥打電話。"</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"這會封鎖「所有」音效和震動干擾,包括鬧鐘、音樂、影片和遊戲在內,但你仍然可以撥打電話。"</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"這會封鎖「所有」聲音和震動干擾,包括鬧鐘、音樂、影片和遊戲在內。"</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"還有 <xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g> 則通知"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"較不緊急的通知會顯示在下方"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"向下拖曳即可關閉"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"子母畫面選單"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"「<xliff:g id="NAME">%s</xliff:g>」目前在子母畫面中"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"如果你不想讓「<xliff:g id="NAME">%s</xliff:g>」使用這項功能,請輕觸開啟設定頁面,然後停用此功能。"</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"如果你不想讓「<xliff:g id="NAME">%s</xliff:g>」使用這項功能,請輕觸開啟設定頁面,然後停用此功能。"</string>
<string name="pip_play" msgid="1417176722760265888">"播放"</string>
<string name="pip_pause" msgid="8881063404466476571">"暫停"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"跳到下一個"</string>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 397f31c..e66ff73 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -353,10 +353,10 @@
<string name="description_target_search" msgid="3091587249776033139">"Sesha"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Shelelisela ngenhla ku-<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Shelelisela ngakwesokunxele ku-<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="7577965386868311310">"Ngeke uphazanyiswe yimisindo nokudlidliza, ngaphandle kwama-alamu, izikhumbuzi, izehlakalo, nabashayi obacacisayo. Usazokuzwa okuthile okhetha ukudlala kufaka phakathi umculo, amavidiyo, namageyimu."</string>
- <string name="zen_alarms_introduction" msgid="7034415210361973827">"Ngeke uphazanyiswe yimisindo nokudlidliza, ngaphandle kwama-alamu. Usazokuzwa okuthile okhetha ukudlala kufaka phakathi umculo, amavidiyo, namageyimu."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Ngeke uphazanyiswe imisindo nokudlidliza, ngaphandle kusukela kuma-alamu, izikhumbuzi, imicimbi, nabafonayo obacacisayo. Usazozwa noma yini okhetha ukuyidlala okufaka umculo, amavidiyo, namageyimu."</string>
+ <string name="zen_alarms_introduction" msgid="4934328096749380201">"Ngeke uze uphazanyiswe imisindo nokudlidliza, ngaphandle kusukela kuma-alamu. Usazozwa noma yini okhetha ukuyidlala okufaka umculo, amavidiyo, namageyimu."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Enza ngendlela oyifisayo"</string>
- <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"Lokhu kuvimbela YONKE imisindo nokudludliza, kufaka phakathi ama-alamu, umculo, amavidiyo, namageyimu. Usazokwazi ukwenza amkholi wefoni."</string>
+ <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Lokhu kuvimbela YONKE imisindo nokudlidliza, okufaka kusukela kuma-alamu, umculo, amavidiyo, namageyimu. Usazokwazi ukwenza amakholi efoni."</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"Lokhu kuvimbela YONKE imisindo nokudlidliza, kufaka phakathi kusuka kuma-alamu, umculo, amavidiyo, namageyimu."</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Izaziso ezingasheshi kakhulu ezingezansi"</string>
@@ -728,7 +728,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Hudulela phansi ukuze ucashise"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"Isithombe ngemenyu yesithombe ngesithombe"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"U-<xliff:g id="NAME">%s</xliff:g> ungaphakathi kwesithombe esiphakathi kwesithombe"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"Uma ungafuni ukuthi i-<xliff:g id="NAME">%s</xliff:g> isebenzise lesi sici, thepha ukuze uvule izilungiselelo bese usivale."</string>
+ <string name="pip_notification_message" msgid="5619512781514343311">"Uma ungafuni i-<xliff:g id="NAME">%s</xliff:g> ukuthi isebenzise lesi sici, thepha ukuze uvule izilungiselelo uphinde uyivale."</string>
<string name="pip_play" msgid="1417176722760265888">"Dlala"</string>
<string name="pip_pause" msgid="8881063404466476571">"Misa isikhashana"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"Yeqela kokulandelayo"</string>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index 3c86c87..5917dc5 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -331,26 +331,6 @@
<!-- Whether or not a background should be drawn behind a notification. -->
<bool name="config_drawNotificationBackground">true</bool>
- <!-- Whether or not the edit icon on the quick settings header is shown. -->
- <bool name="config_showQuickSettingsEditingIcon">true</bool>
-
- <!-- Whether or not the multi-user switcher should be visible even if the quick settings are
- not expanded. If there are not multiple users on the system, the switcher will still
- hide itself. -->
- <bool name="config_alwaysShowMultiUserSwitcher">false</bool>
-
- <!-- Whether or not the expand indicator is visible for manually expanding the quick settings
- panel. -->
- <bool name="config_showQuickSettingsExpandIndicator">true</bool>
-
- <!-- Whether or not to display the row of quick settings icons separate from the full quick
- settings panel. -->
- <bool name="config_showQuickSettingsRow">true</bool>
-
- <!-- Whether or not the quick settings should be revealed on an overscroll of the
- notifications panel. -->
- <bool name="config_enableQuickSettingsOverscrollExpansion">true</bool>
-
<!-- Whether or the notifications can be shown and dismissed with a drag. -->
<bool name="config_enableNotificationShadeDrag">true</bool>
@@ -417,4 +397,8 @@
one bar higher than they actually are -->
<bool name="config_inflateSignalStrength">false</bool>
+ <!-- Should we vibrate on an icon animation of the shelf. This should only be active if the
+ vibrator is capable of subtle vibrations -->
+ <bool name="config_vibrateOnIconAnimation">false</bool>
+
</resources>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 94687de..c8e6021 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -192,6 +192,23 @@
<!-- Height of the status bar header bar -->
<dimen name="status_bar_header_height">124dp</dimen>
+ <!-- Height of the status bar header bar in the car setting. -->
+ <dimen name="car_status_bar_header_height">128dp</dimen>
+
+ <!-- The bottom padding of the status bar header. -->
+ <dimen name="status_bar_header_padding_bottom">48dp</dimen>
+
+ <!-- The height of the container that holds the system icons in the quick settings header. -->
+ <dimen name="qs_header_system_icons_area_height">40dp</dimen>
+
+ <!-- The height of the container that holds the system icons in the quick settings header in the
+ car setting. -->
+ <dimen name="car_qs_header_system_icons_area_height">54dp</dimen>
+
+ <!-- The height of the quick settings footer that holds the user switcher, settings icon,
+ etc. -->
+ <dimen name="qs_footer_height">48dp</dimen>
+
<!-- Height of the status bar header bar when expanded -->
<dimen name="status_bar_header_height_expanded">124dp</dimen>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 6202d13..9067865 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -840,16 +840,16 @@
<string name="description_direction_left">"Slide left for <xliff:g id="target_description" example="Unlock">%s</xliff:g>.</string>
<!-- Zen mode: Priority only introduction message on first use -->
- <string name="zen_priority_introduction">You won’t be disturbed by sounds and vibrations, except from alarms, reminders, events, and callers you specify. You'll still hear anything you choose to play including music, videos, and games.</string>
+ <string name="zen_priority_introduction">You won\'t be disturbed by sounds and vibrations, except from alarms, reminders, events, and callers you specify. You\'ll still hear anything you choose to play including music, videos, and games.</string>
<!-- Zen mode: Alarms only introduction message on first use -->
- <string name="zen_alarms_introduction">You won’t be disturbed by sounds and vibrations, except from alarms. You'll still hear anything you choose to play including music, videos, and games.</string>
+ <string name="zen_alarms_introduction">You won\'t be disturbed by sounds and vibrations, except from alarms. You\'ll still hear anything you choose to play including music, videos, and games.</string>
<!-- Zen mode: Priority only customization button label -->
<string name="zen_priority_customize_button">Customize</string>
<!-- Zen mode: Total silence introduction message on first use (voice capable devices) -->
- <string name="zen_silence_introduction_voice">This blocks ALL sounds and vibrations, including from alarms, music, videos, and games. You’ll still be able to make phone calls.</string>
+ <string name="zen_silence_introduction_voice">This blocks ALL sounds and vibrations, including from alarms, music, videos, and games. You\'ll still be able to make phone calls.</string>
<!-- Zen mode: Total silence introduction message on first use (non-voice capable devices) -->
<string name="zen_silence_introduction">This blocks ALL sounds and vibrations, including from alarms, music, videos, and games.</string>
@@ -1910,7 +1910,7 @@
<string name="pip_notification_title"><xliff:g id="name" example="Google Maps">%s</xliff:g> is in picture-in-picture</string>
<!-- PiP BTW notification description. [CHAR LIMIT=NONE] -->
- <string name="pip_notification_message">If you don’t want <xliff:g id="name" example="Google Maps">%s</xliff:g> to use this feature, tap to open settings and turn it off.</string>
+ <string name="pip_notification_message">If you don\'t want <xliff:g id="name" example="Google Maps">%s</xliff:g> to use this feature, tap to open settings and turn it off.</string>
<!-- Button to play the current media on picture-in-picture (PIP) [CHAR LIMIT=30] -->
<string name="pip_play">Play</string>
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index 99111f8..dca021e 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -440,8 +440,7 @@
<item name="preferenceTheme">@style/TunerPreferenceTheme</item>
</style>
- <style name="TunerPreferenceTheme" parent="@android:style/Theme.DeviceDefault.Settings">
- <item name="dropdownPreferenceStyle">@style/Preference.DropDown.Material</item>
+ <style name="TunerPreferenceTheme" parent="@style/PreferenceThemeOverlay.SettingsBase">
</style>
<style name="TextAppearance.NotificationInfo">
diff --git a/packages/SystemUI/src/com/android/systemui/RoundedCorners.java b/packages/SystemUI/src/com/android/systemui/RoundedCorners.java
index 74a1505..40ea4ec 100644
--- a/packages/SystemUI/src/com/android/systemui/RoundedCorners.java
+++ b/packages/SystemUI/src/com/android/systemui/RoundedCorners.java
@@ -93,16 +93,17 @@
private void setupPadding(int padding) {
// Add some padding to all the content near the edge of the screen.
StatusBar sb = getComponent(StatusBar.class);
- View statusBar = sb.getStatusBarWindow();
+ View statusBar = (sb != null ? sb.getStatusBarWindow() : null);
+ if (statusBar != null) {
+ TunablePadding.addTunablePadding(statusBar.findViewById(R.id.keyguard_header), PADDING,
+ padding, FLAG_END);
- TunablePadding.addTunablePadding(statusBar.findViewById(R.id.keyguard_header), PADDING,
- padding, FLAG_END);
-
- FragmentHostManager fragmentHostManager = FragmentHostManager.get(statusBar);
- fragmentHostManager.addTagListener(CollapsedStatusBarFragment.TAG,
- new TunablePaddingTagListener(padding, R.id.status_bar));
- fragmentHostManager.addTagListener(QS.TAG,
- new TunablePaddingTagListener(padding, R.id.header));
+ FragmentHostManager fragmentHostManager = FragmentHostManager.get(statusBar);
+ fragmentHostManager.addTagListener(CollapsedStatusBarFragment.TAG,
+ new TunablePaddingTagListener(padding, R.id.status_bar));
+ fragmentHostManager.addTagListener(QS.TAG,
+ new TunablePaddingTagListener(padding, R.id.header));
+ }
}
private WindowManager.LayoutParams getWindowLayoutParams() {
@@ -110,15 +111,12 @@
ViewGroup.LayoutParams.MATCH_PARENT,
LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL,
- 0
- | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
- | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
- | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
- | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
- | WindowManager.LayoutParams.FLAG_SLIPPERY
- | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
- | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED
- ,
+ WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
+ | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+ | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
+ | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
+ | WindowManager.LayoutParams.FLAG_SLIPPERY
+ | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
PixelFormat.TRANSLUCENT);
lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS
| WindowManager.LayoutParams.PRIVATE_FLAG_NO_MAGNIFICATION_REGION_EFFECT;
diff --git a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
index 699fdef..6777ea2 100644
--- a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
@@ -25,6 +25,7 @@
import android.content.res.Resources;
import android.graphics.RectF;
import android.os.Handler;
+import android.util.ArrayMap;
import android.util.Log;
import android.view.MotionEvent;
import android.view.VelocityTracker;
@@ -37,8 +38,6 @@
import com.android.systemui.statusbar.ExpandableNotificationRow;
import com.android.systemui.statusbar.FlingAnimationUtils;
-import java.util.HashMap;
-
public class SwipeHelper implements Gefingerpoken {
static final String TAG = "com.android.systemui.SwipeHelper";
private static final boolean DEBUG = false;
@@ -51,10 +50,10 @@
public static final int X = 0;
public static final int Y = 1;
- private float SWIPE_ESCAPE_VELOCITY = 500f; // dp/sec
- private int DEFAULT_ESCAPE_ANIMATION_DURATION = 200; // ms
- private int MAX_ESCAPE_ANIMATION_DURATION = 400; // ms
- private int MAX_DISMISS_VELOCITY = 4000; // dp/sec
+ private static final float SWIPE_ESCAPE_VELOCITY = 500f; // dp/sec
+ private static final int DEFAULT_ESCAPE_ANIMATION_DURATION = 200; // ms
+ private static final int MAX_ESCAPE_ANIMATION_DURATION = 400; // ms
+ private static final int MAX_DISMISS_VELOCITY = 4000; // dp/sec
private static final int SNAP_ANIM_LEN = SLOW_ANIMATIONS ? 1000 : 150; // ms
static final float SWIPE_PROGRESS_FADE_END = 0.5f; // fraction of thumbnail width
@@ -65,13 +64,13 @@
private float mMinSwipeProgress = 0f;
private float mMaxSwipeProgress = 1f;
- private FlingAnimationUtils mFlingAnimationUtils;
+ private final FlingAnimationUtils mFlingAnimationUtils;
private float mPagingTouchSlop;
- private Callback mCallback;
- private Handler mHandler;
- private int mSwipeDirection;
- private VelocityTracker mVelocityTracker;
- private FalsingManager mFalsingManager;
+ private final Callback mCallback;
+ private final Handler mHandler;
+ private final int mSwipeDirection;
+ private final VelocityTracker mVelocityTracker;
+ private final FalsingManager mFalsingManager;
private float mInitialTouchPos;
private float mPerpendicularInitialTouchPos;
@@ -86,16 +85,16 @@
private boolean mLongPressSent;
private LongPressListener mLongPressListener;
private Runnable mWatchLongPress;
- private long mLongPressTimeout;
+ private final long mLongPressTimeout;
final private int[] mTmpPos = new int[2];
- private int mFalsingThreshold;
+ private final int mFalsingThreshold;
private boolean mTouchAboveFalsingThreshold;
private boolean mDisableHwLayers;
- private boolean mFadeDependingOnAmountSwiped;
- private Context mContext;
+ private final boolean mFadeDependingOnAmountSwiped;
+ private final Context mContext;
- private HashMap<View, Animator> mDismissPendingMap = new HashMap<>();
+ private final ArrayMap<View, Animator> mDismissPendingMap = new ArrayMap<>();
public SwipeHelper(int swipeDirection, Callback callback, Context context) {
mContext = context;
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
index 9f2dcd9..d8da5ed 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
@@ -27,8 +27,10 @@
import android.content.res.Configuration;
import android.os.Process;
import android.os.SystemProperties;
+import android.os.Trace;
import android.os.UserHandle;
import android.util.ArraySet;
+import android.util.BootTimingsTraceLog;
import android.util.Log;
import com.android.systemui.fragments.FragmentService;
@@ -192,11 +194,17 @@
Log.v(TAG, "Starting SystemUI services for user " +
Process.myUserHandle().getIdentifier() + ".");
+ BootTimingsTraceLog log = new BootTimingsTraceLog("SystemUIBootTiming",
+ Trace.TRACE_TAG_APP);
+ log.traceBegin("StartServices");
final int N = services.length;
for (int i = 0; i < N; i++) {
Class<?> cl = services[i];
if (DEBUG) Log.d(TAG, "loading: " + cl);
+ log.traceBegin("StartServices" + cl.getSimpleName());
+ long ti = System.currentTimeMillis();
try {
+
Object newService = SystemUIFactory.getInstance().createInstance(cl);
mServices[i] = (SystemUI) ((newService == null) ? cl.newInstance() : newService);
} catch (IllegalAccessException ex) {
@@ -209,11 +217,18 @@
mServices[i].mComponents = mComponents;
if (DEBUG) Log.d(TAG, "running: " + mServices[i]);
mServices[i].start();
+ log.traceEnd();
+ // Warn if initialization of component takes too long
+ ti = System.currentTimeMillis() - ti;
+ if (ti > 1000) {
+ Log.w(TAG, "Initialization of " + cl.getName() + " took " + ti + " ms");
+ }
if (mBootCompleted) {
mServices[i].onBootCompleted();
}
}
+ log.traceEnd();
Dependency.get(PluginManager.class).addPluginListener(
new PluginListener<OverlayPlugin>() {
private ArraySet<OverlayPlugin> mOverlays;
diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistDisclosure.java b/packages/SystemUI/src/com/android/systemui/assist/AssistDisclosure.java
index 8bd38db..4bd095d 100644
--- a/packages/SystemUI/src/com/android/systemui/assist/AssistDisclosure.java
+++ b/packages/SystemUI/src/com/android/systemui/assist/AssistDisclosure.java
@@ -66,7 +66,6 @@
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
WindowManager.LayoutParams.TYPE_SECURE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
- | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
| WindowManager.LayoutParams.FLAG_FULLSCREEN
| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED,
diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java
index 3b81cc4..c5eebcc 100644
--- a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java
+++ b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java
@@ -170,9 +170,6 @@
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
lp.token = new Binder();
- if (ActivityManager.isHighEndGfx()) {
- lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
- }
lp.gravity = Gravity.BOTTOM | Gravity.START;
lp.setTitle("AssistPreviewPanel");
lp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipDismissViewController.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipDismissViewController.java
index e1a7e3b..5547e2d 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipDismissViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipDismissViewController.java
@@ -90,8 +90,7 @@
LayoutParams.TYPE_NAVIGATION_BAR_PANEL,
LayoutParams.FLAG_LAYOUT_IN_SCREEN
| LayoutParams.FLAG_NOT_TOUCHABLE
- | LayoutParams.FLAG_NOT_FOCUSABLE
- | LayoutParams.FLAG_HARDWARE_ACCELERATED,
+ | LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
lp.setTitle("pip-dismiss-overlay");
lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java
index a5ee198..13ba7c1 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java
@@ -388,6 +388,11 @@
private void updateFromIntent(Intent intent) {
mToControllerMessenger = intent.getParcelableExtra(EXTRA_CONTROLLER_MESSENGER);
+ if (mToControllerMessenger == null) {
+ Log.w(TAG, "Controller messenger is null. Stopping.");
+ finish();
+ return;
+ }
notifyActivityCallback(mMessenger);
// Register for HidePipMenuEvents once we notify the controller of this activity
@@ -567,6 +572,9 @@
}
private void sendMessage(Message m, String errorMsg) {
+ if (mToControllerMessenger == null) {
+ return;
+ }
try {
mToControllerMessenger.send(m);
} catch (RemoteException e) {
diff --git a/packages/SystemUI/src/com/android/systemui/pip/tv/PipMenuActivity.java b/packages/SystemUI/src/com/android/systemui/pip/tv/PipMenuActivity.java
index 82018ce..e437eff 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/tv/PipMenuActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/tv/PipMenuActivity.java
@@ -45,6 +45,9 @@
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
+ if (!mPipManager.isPipShown()) {
+ finish();
+ }
setContentView(R.layout.tv_pip_menu);
mPipManager.addListener(this);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
index ed57c04..33b5268 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
@@ -38,7 +38,7 @@
protected View mHeader;
protected float mQsExpansion;
private QSCustomizer mQSCustomizer;
- private QSFooter mQSFooter;
+ private View mQSFooter;
private float mFullElevation;
public QSContainerImpl(Context context, AttributeSet attrs) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java
index 67c115c..3f3cea2 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2015 The Android Open Source Project
+ * Copyright (C) 2017 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.
@@ -13,427 +13,60 @@
* See the License for the specific language governing permissions and
* limitations under the License
*/
-
package com.android.systemui.qs;
-import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_QS_DATE;
-
-import android.app.ActivityManager;
-import android.app.AlarmManager;
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.graphics.PorterDuff.Mode;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.RippleDrawable;
-import android.os.UserManager;
-import android.provider.AlarmClock;
import android.support.annotation.Nullable;
-import android.support.annotation.VisibleForTesting;
-import android.util.AttributeSet;
import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-import android.widget.Toast;
-import com.android.internal.logging.MetricsLogger;
-import com.android.internal.logging.nano.MetricsProto;
-import com.android.keyguard.KeyguardStatusView;
-import com.android.settingslib.Utils;
-import com.android.systemui.Dependency;
-import com.android.systemui.FontSizeUtils;
-import com.android.systemui.R;
-import com.android.systemui.R.dimen;
-import com.android.systemui.R.id;
-import com.android.systemui.plugins.ActivityStarter;
-import com.android.systemui.qs.TouchAnimator.Builder;
-import com.android.systemui.qs.TouchAnimator.Listener;
-import com.android.systemui.qs.TouchAnimator.ListenerAdapter;
-import com.android.systemui.statusbar.phone.ExpandableIndicator;
-import com.android.systemui.statusbar.phone.MultiUserSwitch;
-import com.android.systemui.statusbar.phone.SettingsButton;
-import com.android.systemui.statusbar.policy.DeviceProvisionedController;
-import com.android.systemui.statusbar.policy.NetworkController;
-import com.android.systemui.statusbar.policy.NetworkController.EmergencyListener;
-import com.android.systemui.statusbar.policy.NetworkController.SignalCallback;
-import com.android.systemui.statusbar.policy.NextAlarmController;
-import com.android.systemui.statusbar.policy.NextAlarmController.NextAlarmChangeCallback;
-import com.android.systemui.statusbar.policy.UserInfoController;
-import com.android.systemui.statusbar.policy.UserInfoController.OnUserInfoChangedListener;
-import com.android.systemui.tuner.TunerService;
+/**
+ * The bottom footer of the quick settings panel.
+ */
+public interface QSFooter {
+ /**
+ * Sets the given {@link QSPanel} to be the one that will display the quick settings.
+ */
+ void setQSPanel(@Nullable QSPanel panel);
-public class QSFooter extends FrameLayout implements
- NextAlarmChangeCallback, OnClickListener, OnUserInfoChangedListener, EmergencyListener,
- SignalCallback {
- private static final float EXPAND_INDICATOR_THRESHOLD = .93f;
+ /**
+ * Sets whether or not the footer should be visible.
+ *
+ * @param visibility One of {@link View#VISIBLE}, {@link View#INVISIBLE} or {@link View#GONE}.
+ * @see View#setVisibility(int)
+ */
+ void setVisibility(int visibility);
- private ActivityStarter mActivityStarter;
- private NextAlarmController mNextAlarmController;
- private UserInfoController mUserInfoController;
- private SettingsButton mSettingsButton;
- protected View mSettingsContainer;
+ /**
+ * Sets whether the footer is in an expanded state.
+ */
+ void setExpanded(boolean expanded);
- private TextView mAlarmStatus;
- private View mAlarmStatusCollapsed;
- private View mDate;
+ /**
+ * Returns the full height of the footer.
+ */
+ int getHeight();
- private QSPanel mQsPanel;
+ /**
+ * Sets the percentage amount that the quick settings has been expanded.
+ *
+ * @param expansion A value from 1 to 0 that indicates how much the quick settings have been
+ * expanded. 1 is fully expanded.
+ */
+ void setExpansion(float expansion);
- private boolean mExpanded;
- private boolean mAlarmShowing;
+ /**
+ * Sets whether or not this footer should set itself to listen for changes in any callbacks
+ * that it has implemented.
+ */
+ void setListening(boolean listening);
- protected ExpandableIndicator mExpandIndicator;
+ /**
+ * Sets whether or not the keyguard is currently being shown.
+ */
+ void setKeyguardShowing(boolean keyguardShowing);
- private boolean mListening;
- private AlarmManager.AlarmClockInfo mNextAlarm;
-
- private boolean mShowEmergencyCallsOnly;
- protected MultiUserSwitch mMultiUserSwitch;
- private ImageView mMultiUserAvatar;
- private boolean mAlwaysShowMultiUserSwitch;
-
- protected TouchAnimator mSettingsAlpha;
- private float mExpansionAmount;
-
- protected View mEdit;
- private boolean mShowEditIcon;
- private TouchAnimator mAnimator;
- private View mDateTimeGroup;
- private boolean mKeyguardShowing;
- private TouchAnimator mAlarmAnimator;
-
- public QSFooter(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- @Override
- protected void onFinishInflate() {
- super.onFinishInflate();
- Resources res = getResources();
-
- mShowEditIcon = res.getBoolean(R.bool.config_showQuickSettingsEditingIcon);
-
- mEdit = findViewById(android.R.id.edit);
- mEdit.setVisibility(mShowEditIcon ? VISIBLE : GONE);
-
- if (mShowEditIcon) {
- findViewById(android.R.id.edit).setOnClickListener(view ->
- Dependency.get(ActivityStarter.class).postQSRunnableDismissingKeyguard(() ->
- mQsPanel.showEdit(view)));
- }
-
- mDateTimeGroup = findViewById(id.date_time_alarm_group);
- mDate = findViewById(R.id.date);
-
- mExpandIndicator = findViewById(R.id.expand_indicator);
- mExpandIndicator.setVisibility(
- res.getBoolean(R.bool.config_showQuickSettingsExpandIndicator)
- ? VISIBLE : GONE);
-
- mSettingsButton = findViewById(R.id.settings_button);
- mSettingsContainer = findViewById(R.id.settings_button_container);
- mSettingsButton.setOnClickListener(this);
-
- mAlarmStatusCollapsed = findViewById(R.id.alarm_status_collapsed);
- mAlarmStatus = findViewById(R.id.alarm_status);
- mDateTimeGroup.setOnClickListener(this);
-
- mMultiUserSwitch = findViewById(R.id.multi_user_switch);
- mMultiUserAvatar = mMultiUserSwitch.findViewById(R.id.multi_user_avatar);
- mAlwaysShowMultiUserSwitch = res.getBoolean(R.bool.config_alwaysShowMultiUserSwitcher);
-
- // RenderThread is doing more harm than good when touching the header (to expand quick
- // settings), so disable it for this view
- ((RippleDrawable) mSettingsButton.getBackground()).setForceSoftware(true);
- ((RippleDrawable) mExpandIndicator.getBackground()).setForceSoftware(true);
-
- updateResources();
-
- mNextAlarmController = Dependency.get(NextAlarmController.class);
- mUserInfoController = Dependency.get(UserInfoController.class);
- mActivityStarter = Dependency.get(ActivityStarter.class);
- addOnLayoutChangeListener((v, left, top, right, bottom, oldLeft, oldTop, oldRight,
- oldBottom) -> updateAnimator(right - left));
- }
-
- private void updateAnimator(int width) {
- int numTiles = QuickQSPanel.getNumQuickTiles(mContext);
- int size = mContext.getResources().getDimensionPixelSize(R.dimen.qs_quick_tile_size)
- - mContext.getResources().getDimensionPixelSize(dimen.qs_quick_tile_padding);
- int remaining = (width - numTiles * size) / (numTiles - 1);
- int defSpace = mContext.getResources().getDimensionPixelOffset(R.dimen.default_gear_space);
-
- mAnimator = new Builder()
- .addFloat(mSettingsContainer, "translationX", -(remaining - defSpace), 0)
- .addFloat(mSettingsButton, "rotation", -120, 0)
- .build();
- if (mAlarmShowing) {
- int translate = isLayoutRtl() ? mDate.getWidth() : -mDate.getWidth();
- mAlarmAnimator = new Builder().addFloat(mDate, "alpha", 1, 0)
- .addFloat(mDateTimeGroup, "translationX", 0, translate)
- .addFloat(mAlarmStatus, "alpha", 0, 1)
- .setListener(new ListenerAdapter() {
- @Override
- public void onAnimationAtStart() {
- mAlarmStatus.setVisibility(View.GONE);
- }
-
- @Override
- public void onAnimationStarted() {
- mAlarmStatus.setVisibility(View.VISIBLE);
- }
- }).build();
- } else {
- mAlarmAnimator = null;
- mAlarmStatus.setVisibility(View.GONE);
- mDate.setAlpha(1);
- mDateTimeGroup.setTranslationX(0);
- }
- setExpansion(mExpansionAmount);
- }
-
- @Override
- protected void onConfigurationChanged(Configuration newConfig) {
- super.onConfigurationChanged(newConfig);
- updateResources();
- }
-
- @Override
- public void onRtlPropertiesChanged(int layoutDirection) {
- super.onRtlPropertiesChanged(layoutDirection);
- updateResources();
- }
-
- private void updateResources() {
- FontSizeUtils.updateFontSize(mAlarmStatus, R.dimen.qs_date_collapsed_size);
-
- updateSettingsAnimator();
- }
-
- private void updateSettingsAnimator() {
- mSettingsAlpha = createSettingsAlphaAnimator();
-
- final boolean isRtl = isLayoutRtl();
- if (isRtl && mDate.getWidth() == 0) {
- mDate.addOnLayoutChangeListener(new OnLayoutChangeListener() {
- @Override
- public void onLayoutChange(View v, int left, int top, int right, int bottom,
- int oldLeft, int oldTop, int oldRight, int oldBottom) {
- mDate.setPivotX(getWidth());
- mDate.removeOnLayoutChangeListener(this);
- }
- });
- } else {
- mDate.setPivotX(isRtl ? mDate.getWidth() : 0);
- }
- }
-
+ /**
+ * Returns the {@link View} that should expand the quick settings when clicked.
+ */
@Nullable
- private TouchAnimator createSettingsAlphaAnimator() {
- // If the settings icon is not shown and the user switcher is always shown, then there
- // is nothing to animate.
- if (!mShowEditIcon && mAlwaysShowMultiUserSwitch) {
- return null;
- }
-
- TouchAnimator.Builder animatorBuilder = new TouchAnimator.Builder();
- animatorBuilder.setStartDelay(QSAnimator.EXPANDED_TILE_DELAY);
-
- if (mShowEditIcon) {
- animatorBuilder.addFloat(mEdit, "alpha", 0, 1);
- }
-
- if (!mAlwaysShowMultiUserSwitch) {
- animatorBuilder.addFloat(mMultiUserSwitch, "alpha", 0, 1);
- }
-
- return animatorBuilder.build();
- }
-
- public void setKeyguardShowing(boolean keyguardShowing) {
- mKeyguardShowing = keyguardShowing;
- setExpansion(mExpansionAmount);
- }
-
- public void setExpanded(boolean expanded) {
- if (mExpanded == expanded) return;
- mExpanded = expanded;
- updateEverything();
- }
-
- @Override
- public void onNextAlarmChanged(AlarmManager.AlarmClockInfo nextAlarm) {
- mNextAlarm = nextAlarm;
- if (nextAlarm != null) {
- String alarmString = KeyguardStatusView.formatNextAlarm(getContext(), nextAlarm);
- mAlarmStatus.setText(alarmString);
- mAlarmStatus.setContentDescription(mContext.getString(
- R.string.accessibility_quick_settings_alarm, alarmString));
- mAlarmStatusCollapsed.setContentDescription(mContext.getString(
- R.string.accessibility_quick_settings_alarm, alarmString));
- }
- if (mAlarmShowing != (nextAlarm != null)) {
- mAlarmShowing = nextAlarm != null;
- updateAnimator(getWidth());
- updateEverything();
- }
- }
-
- public void setExpansion(float headerExpansionFraction) {
- mExpansionAmount = headerExpansionFraction;
- if (mAnimator != null) mAnimator.setPosition(headerExpansionFraction);
- if (mAlarmAnimator != null) mAlarmAnimator.setPosition(
- mKeyguardShowing ? 0 : headerExpansionFraction);
-
- if (mSettingsAlpha != null) {
- mSettingsAlpha.setPosition(headerExpansionFraction);
- }
-
- updateAlarmVisibilities();
-
- mExpandIndicator.setExpanded(headerExpansionFraction > EXPAND_INDICATOR_THRESHOLD);
- }
-
- @Override
- @VisibleForTesting
- public void onDetachedFromWindow() {
- setListening(false);
- super.onDetachedFromWindow();
- }
-
- private void updateAlarmVisibilities() {
- mAlarmStatusCollapsed.setVisibility(mAlarmShowing ? View.VISIBLE : View.GONE);
- }
-
- public void setListening(boolean listening) {
- if (listening == mListening) {
- return;
- }
- mListening = listening;
- updateListeners();
- }
-
- public View getExpandView() {
- return findViewById(R.id.expand_indicator);
- }
-
- public void updateEverything() {
- post(() -> {
- updateVisibilities();
- setClickable(false);
- });
- }
-
- private void updateVisibilities() {
- updateAlarmVisibilities();
- mSettingsContainer.findViewById(R.id.tuner_icon).setVisibility(
- TunerService.isTunerEnabled(mContext) ? View.VISIBLE : View.INVISIBLE);
- final boolean isDemo = UserManager.isDeviceInDemoMode(mContext);
-
- mMultiUserSwitch.setVisibility((mExpanded || mAlwaysShowMultiUserSwitch)
- && mMultiUserSwitch.hasMultipleUsers() && !isDemo
- ? View.VISIBLE : View.INVISIBLE);
-
- if (mShowEditIcon) {
- mEdit.setVisibility(isDemo || !mExpanded ? View.INVISIBLE : View.VISIBLE);
- }
- }
-
- private void updateListeners() {
- if (mListening) {
- mNextAlarmController.addCallback(this);
- mUserInfoController.addCallback(this);
- if (Dependency.get(NetworkController.class).hasVoiceCallingFeature()) {
- Dependency.get(NetworkController.class).addEmergencyListener(this);
- Dependency.get(NetworkController.class).addCallback(this);
- }
- } else {
- mNextAlarmController.removeCallback(this);
- mUserInfoController.removeCallback(this);
- Dependency.get(NetworkController.class).removeEmergencyListener(this);
- Dependency.get(NetworkController.class).removeCallback(this);
- }
- }
-
- public void setQSPanel(final QSPanel qsPanel) {
- mQsPanel = qsPanel;
- if (mQsPanel != null) {
- mMultiUserSwitch.setQsPanel(qsPanel);
- }
- }
-
- @Override
- public void onClick(View v) {
- if (v == mSettingsButton) {
- if (!Dependency.get(DeviceProvisionedController.class).isCurrentUserSetup()) {
- // If user isn't setup just unlock the device and dump them back at SUW.
- mActivityStarter.postQSRunnableDismissingKeyguard(() -> { });
- return;
- }
- MetricsLogger.action(mContext,
- mExpanded ? MetricsProto.MetricsEvent.ACTION_QS_EXPANDED_SETTINGS_LAUNCH
- : MetricsProto.MetricsEvent.ACTION_QS_COLLAPSED_SETTINGS_LAUNCH);
- if (mSettingsButton.isTunerClick()) {
- Dependency.get(ActivityStarter.class).postQSRunnableDismissingKeyguard(() -> {
- if (TunerService.isTunerEnabled(mContext)) {
- TunerService.showResetRequest(mContext, () -> {
- // Relaunch settings so that the tuner disappears.
- startSettingsActivity();
- });
- } else {
- Toast.makeText(getContext(), R.string.tuner_toast,
- Toast.LENGTH_LONG).show();
- TunerService.setTunerEnabled(mContext, true);
- }
- startSettingsActivity();
-
- });
- } else {
- startSettingsActivity();
- }
- } else if (v == mDateTimeGroup) {
- Dependency.get(MetricsLogger.class).action(ACTION_QS_DATE,
- mNextAlarm != null);
- if (mNextAlarm != null) {
- PendingIntent showIntent = mNextAlarm.getShowIntent();
- mActivityStarter.startPendingIntentDismissingKeyguard(showIntent);
- } else {
- mActivityStarter.postStartActivityDismissingKeyguard(new Intent(
- AlarmClock.ACTION_SHOW_ALARMS), 0);
- }
- }
- }
-
- private void startSettingsActivity() {
- mActivityStarter.startActivity(new Intent(android.provider.Settings.ACTION_SETTINGS),
- true /* dismissShade */);
- }
-
- @Override
- public void setEmergencyCallsOnly(boolean show) {
- boolean changed = show != mShowEmergencyCallsOnly;
- if (changed) {
- mShowEmergencyCallsOnly = show;
- if (mExpanded) {
- updateEverything();
- }
- }
- }
-
- @Override
- public void onUserInfoChanged(String name, Drawable picture, String userAccount) {
- if (picture != null &&
- UserManager.get(mContext).isGuestUser(ActivityManager.getCurrentUser())) {
- picture = picture.getConstantState().newDrawable().mutate();
- picture.setColorFilter(
- Utils.getColorAttr(mContext, android.R.attr.colorForeground),
- Mode.SRC_IN);
- }
- mMultiUserAvatar.setImageDrawable(picture);
- }
+ View getExpandView();
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
new file mode 100644
index 0000000..9eb29f8
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
@@ -0,0 +1,415 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.qs;
+
+import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_QS_DATE;
+
+import android.app.ActivityManager;
+import android.app.AlarmManager;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.graphics.PorterDuff.Mode;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.RippleDrawable;
+import android.os.UserManager;
+import android.provider.AlarmClock;
+import android.support.annotation.Nullable;
+import android.support.annotation.VisibleForTesting;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.nano.MetricsProto;
+import com.android.keyguard.KeyguardStatusView;
+import com.android.settingslib.Utils;
+import com.android.systemui.Dependency;
+import com.android.systemui.FontSizeUtils;
+import com.android.systemui.R;
+import com.android.systemui.R.dimen;
+import com.android.systemui.R.id;
+import com.android.systemui.plugins.ActivityStarter;
+import com.android.systemui.qs.TouchAnimator.Builder;
+import com.android.systemui.qs.TouchAnimator.Listener;
+import com.android.systemui.qs.TouchAnimator.ListenerAdapter;
+import com.android.systemui.statusbar.phone.ExpandableIndicator;
+import com.android.systemui.statusbar.phone.MultiUserSwitch;
+import com.android.systemui.statusbar.phone.SettingsButton;
+import com.android.systemui.statusbar.policy.DeviceProvisionedController;
+import com.android.systemui.statusbar.policy.NetworkController;
+import com.android.systemui.statusbar.policy.NetworkController.EmergencyListener;
+import com.android.systemui.statusbar.policy.NetworkController.SignalCallback;
+import com.android.systemui.statusbar.policy.NextAlarmController;
+import com.android.systemui.statusbar.policy.NextAlarmController.NextAlarmChangeCallback;
+import com.android.systemui.statusbar.policy.UserInfoController;
+import com.android.systemui.statusbar.policy.UserInfoController.OnUserInfoChangedListener;
+import com.android.systemui.tuner.TunerService;
+
+public class QSFooterImpl extends FrameLayout implements QSFooter,
+ NextAlarmChangeCallback, OnClickListener, OnUserInfoChangedListener, EmergencyListener,
+ SignalCallback {
+ private static final float EXPAND_INDICATOR_THRESHOLD = .93f;
+
+ private ActivityStarter mActivityStarter;
+ private NextAlarmController mNextAlarmController;
+ private UserInfoController mUserInfoController;
+ private SettingsButton mSettingsButton;
+ protected View mSettingsContainer;
+
+ private TextView mAlarmStatus;
+ private View mAlarmStatusCollapsed;
+ private View mDate;
+
+ private QSPanel mQsPanel;
+
+ private boolean mExpanded;
+ private boolean mAlarmShowing;
+
+ protected ExpandableIndicator mExpandIndicator;
+
+ private boolean mListening;
+ private AlarmManager.AlarmClockInfo mNextAlarm;
+
+ private boolean mShowEmergencyCallsOnly;
+ protected MultiUserSwitch mMultiUserSwitch;
+ private ImageView mMultiUserAvatar;
+
+ protected TouchAnimator mSettingsAlpha;
+ private float mExpansionAmount;
+
+ protected View mEdit;
+ private TouchAnimator mAnimator;
+ private View mDateTimeGroup;
+ private boolean mKeyguardShowing;
+ private TouchAnimator mAlarmAnimator;
+
+ public QSFooterImpl(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+ Resources res = getResources();
+
+ mEdit = findViewById(android.R.id.edit);
+ mEdit.setOnClickListener(view ->
+ Dependency.get(ActivityStarter.class).postQSRunnableDismissingKeyguard(() ->
+ mQsPanel.showEdit(view)));
+
+ mDateTimeGroup = findViewById(id.date_time_alarm_group);
+ mDate = findViewById(R.id.date);
+
+ mExpandIndicator = findViewById(R.id.expand_indicator);
+ mSettingsButton = findViewById(R.id.settings_button);
+ mSettingsContainer = findViewById(R.id.settings_button_container);
+ mSettingsButton.setOnClickListener(this);
+
+ mAlarmStatusCollapsed = findViewById(R.id.alarm_status_collapsed);
+ mAlarmStatus = findViewById(R.id.alarm_status);
+ mDateTimeGroup.setOnClickListener(this);
+
+ mMultiUserSwitch = findViewById(R.id.multi_user_switch);
+ mMultiUserAvatar = mMultiUserSwitch.findViewById(R.id.multi_user_avatar);
+
+ // RenderThread is doing more harm than good when touching the header (to expand quick
+ // settings), so disable it for this view
+ ((RippleDrawable) mSettingsButton.getBackground()).setForceSoftware(true);
+ ((RippleDrawable) mExpandIndicator.getBackground()).setForceSoftware(true);
+
+ updateResources();
+
+ mNextAlarmController = Dependency.get(NextAlarmController.class);
+ mUserInfoController = Dependency.get(UserInfoController.class);
+ mActivityStarter = Dependency.get(ActivityStarter.class);
+ addOnLayoutChangeListener((v, left, top, right, bottom, oldLeft, oldTop, oldRight,
+ oldBottom) -> updateAnimator(right - left));
+ }
+
+ private void updateAnimator(int width) {
+ int numTiles = QuickQSPanel.getNumQuickTiles(mContext);
+ int size = mContext.getResources().getDimensionPixelSize(R.dimen.qs_quick_tile_size)
+ - mContext.getResources().getDimensionPixelSize(dimen.qs_quick_tile_padding);
+ int remaining = (width - numTiles * size) / (numTiles - 1);
+ int defSpace = mContext.getResources().getDimensionPixelOffset(R.dimen.default_gear_space);
+
+ mAnimator = new Builder()
+ .addFloat(mSettingsContainer, "translationX", -(remaining - defSpace), 0)
+ .addFloat(mSettingsButton, "rotation", -120, 0)
+ .build();
+ if (mAlarmShowing) {
+ int translate = isLayoutRtl() ? mDate.getWidth() : -mDate.getWidth();
+ mAlarmAnimator = new Builder().addFloat(mDate, "alpha", 1, 0)
+ .addFloat(mDateTimeGroup, "translationX", 0, translate)
+ .addFloat(mAlarmStatus, "alpha", 0, 1)
+ .setListener(new ListenerAdapter() {
+ @Override
+ public void onAnimationAtStart() {
+ mAlarmStatus.setVisibility(View.GONE);
+ }
+
+ @Override
+ public void onAnimationStarted() {
+ mAlarmStatus.setVisibility(View.VISIBLE);
+ }
+ }).build();
+ } else {
+ mAlarmAnimator = null;
+ mAlarmStatus.setVisibility(View.GONE);
+ mDate.setAlpha(1);
+ mDateTimeGroup.setTranslationX(0);
+ }
+ setExpansion(mExpansionAmount);
+ }
+
+ @Override
+ protected void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ updateResources();
+ }
+
+ @Override
+ public void onRtlPropertiesChanged(int layoutDirection) {
+ super.onRtlPropertiesChanged(layoutDirection);
+ updateResources();
+ }
+
+ private void updateResources() {
+ FontSizeUtils.updateFontSize(mAlarmStatus, R.dimen.qs_date_collapsed_size);
+
+ updateSettingsAnimator();
+ }
+
+ private void updateSettingsAnimator() {
+ mSettingsAlpha = createSettingsAlphaAnimator();
+
+ final boolean isRtl = isLayoutRtl();
+ if (isRtl && mDate.getWidth() == 0) {
+ mDate.addOnLayoutChangeListener(new OnLayoutChangeListener() {
+ @Override
+ public void onLayoutChange(View v, int left, int top, int right, int bottom,
+ int oldLeft, int oldTop, int oldRight, int oldBottom) {
+ mDate.setPivotX(getWidth());
+ mDate.removeOnLayoutChangeListener(this);
+ }
+ });
+ } else {
+ mDate.setPivotX(isRtl ? mDate.getWidth() : 0);
+ }
+ }
+
+ @Nullable
+ private TouchAnimator createSettingsAlphaAnimator() {
+ return new TouchAnimator.Builder()
+ .addFloat(mEdit, "alpha", 0, 1)
+ .addFloat(mMultiUserSwitch, "alpha", 0, 1)
+ .build();
+ }
+
+ @Override
+ public void setKeyguardShowing(boolean keyguardShowing) {
+ mKeyguardShowing = keyguardShowing;
+ setExpansion(mExpansionAmount);
+ }
+
+ @Override
+ public void setExpanded(boolean expanded) {
+ if (mExpanded == expanded) return;
+ mExpanded = expanded;
+ updateEverything();
+ }
+
+ @Override
+ public void onNextAlarmChanged(AlarmManager.AlarmClockInfo nextAlarm) {
+ mNextAlarm = nextAlarm;
+ if (nextAlarm != null) {
+ String alarmString = KeyguardStatusView.formatNextAlarm(getContext(), nextAlarm);
+ mAlarmStatus.setText(alarmString);
+ mAlarmStatus.setContentDescription(mContext.getString(
+ R.string.accessibility_quick_settings_alarm, alarmString));
+ mAlarmStatusCollapsed.setContentDescription(mContext.getString(
+ R.string.accessibility_quick_settings_alarm, alarmString));
+ }
+ if (mAlarmShowing != (nextAlarm != null)) {
+ mAlarmShowing = nextAlarm != null;
+ updateAnimator(getWidth());
+ updateEverything();
+ }
+ }
+
+ @Override
+ public void setExpansion(float headerExpansionFraction) {
+ mExpansionAmount = headerExpansionFraction;
+ if (mAnimator != null) mAnimator.setPosition(headerExpansionFraction);
+ if (mAlarmAnimator != null) mAlarmAnimator.setPosition(
+ mKeyguardShowing ? 0 : headerExpansionFraction);
+
+ if (mSettingsAlpha != null) {
+ mSettingsAlpha.setPosition(headerExpansionFraction);
+ }
+
+ updateAlarmVisibilities();
+
+ mExpandIndicator.setExpanded(headerExpansionFraction > EXPAND_INDICATOR_THRESHOLD);
+ }
+
+ @Override
+ @VisibleForTesting
+ public void onDetachedFromWindow() {
+ setListening(false);
+ super.onDetachedFromWindow();
+ }
+
+ private void updateAlarmVisibilities() {
+ mAlarmStatusCollapsed.setVisibility(mAlarmShowing ? View.VISIBLE : View.GONE);
+ }
+
+ @Override
+ public void setListening(boolean listening) {
+ if (listening == mListening) {
+ return;
+ }
+ mListening = listening;
+ updateListeners();
+ }
+
+ @Override
+ public View getExpandView() {
+ return findViewById(R.id.expand_indicator);
+ }
+
+ public void updateEverything() {
+ post(() -> {
+ updateVisibilities();
+ setClickable(false);
+ });
+ }
+
+ private void updateVisibilities() {
+ updateAlarmVisibilities();
+ mSettingsContainer.findViewById(R.id.tuner_icon).setVisibility(
+ TunerService.isTunerEnabled(mContext) ? View.VISIBLE : View.INVISIBLE);
+ final boolean isDemo = UserManager.isDeviceInDemoMode(mContext);
+
+ mMultiUserSwitch.setVisibility(mExpanded && mMultiUserSwitch.hasMultipleUsers() && !isDemo
+ ? View.VISIBLE : View.INVISIBLE);
+
+ mEdit.setVisibility(isDemo || !mExpanded ? View.INVISIBLE : View.VISIBLE);
+ }
+
+ private void updateListeners() {
+ if (mListening) {
+ mNextAlarmController.addCallback(this);
+ mUserInfoController.addCallback(this);
+ if (Dependency.get(NetworkController.class).hasVoiceCallingFeature()) {
+ Dependency.get(NetworkController.class).addEmergencyListener(this);
+ Dependency.get(NetworkController.class).addCallback(this);
+ }
+ } else {
+ mNextAlarmController.removeCallback(this);
+ mUserInfoController.removeCallback(this);
+ Dependency.get(NetworkController.class).removeEmergencyListener(this);
+ Dependency.get(NetworkController.class).removeCallback(this);
+ }
+ }
+
+ @Override
+ public void setQSPanel(final QSPanel qsPanel) {
+ mQsPanel = qsPanel;
+ if (mQsPanel != null) {
+ mMultiUserSwitch.setQsPanel(qsPanel);
+ }
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (v == mSettingsButton) {
+ if (!Dependency.get(DeviceProvisionedController.class).isCurrentUserSetup()) {
+ // If user isn't setup just unlock the device and dump them back at SUW.
+ mActivityStarter.postQSRunnableDismissingKeyguard(() -> { });
+ return;
+ }
+ MetricsLogger.action(mContext,
+ mExpanded ? MetricsProto.MetricsEvent.ACTION_QS_EXPANDED_SETTINGS_LAUNCH
+ : MetricsProto.MetricsEvent.ACTION_QS_COLLAPSED_SETTINGS_LAUNCH);
+ if (mSettingsButton.isTunerClick()) {
+ Dependency.get(ActivityStarter.class).postQSRunnableDismissingKeyguard(() -> {
+ if (TunerService.isTunerEnabled(mContext)) {
+ TunerService.showResetRequest(mContext, () -> {
+ // Relaunch settings so that the tuner disappears.
+ startSettingsActivity();
+ });
+ } else {
+ Toast.makeText(getContext(), R.string.tuner_toast,
+ Toast.LENGTH_LONG).show();
+ TunerService.setTunerEnabled(mContext, true);
+ }
+ startSettingsActivity();
+
+ });
+ } else {
+ startSettingsActivity();
+ }
+ } else if (v == mDateTimeGroup) {
+ Dependency.get(MetricsLogger.class).action(ACTION_QS_DATE,
+ mNextAlarm != null);
+ if (mNextAlarm != null) {
+ PendingIntent showIntent = mNextAlarm.getShowIntent();
+ mActivityStarter.startPendingIntentDismissingKeyguard(showIntent);
+ } else {
+ mActivityStarter.postStartActivityDismissingKeyguard(new Intent(
+ AlarmClock.ACTION_SHOW_ALARMS), 0);
+ }
+ }
+ }
+
+ private void startSettingsActivity() {
+ mActivityStarter.startActivity(new Intent(android.provider.Settings.ACTION_SETTINGS),
+ true /* dismissShade */);
+ }
+
+ @Override
+ public void setEmergencyCallsOnly(boolean show) {
+ boolean changed = show != mShowEmergencyCallsOnly;
+ if (changed) {
+ mShowEmergencyCallsOnly = show;
+ if (mExpanded) {
+ updateEverything();
+ }
+ }
+ }
+
+ @Override
+ public void onUserInfoChanged(String name, Drawable picture, String userAccount) {
+ if (picture != null &&
+ UserManager.get(mContext).isGuestUser(ActivityManager.getCurrentUser())) {
+ picture = picture.getConstantState().newDrawable().mutate();
+ picture.setColorFilter(
+ Utils.getColorAttr(mContext, android.R.attr.colorForeground),
+ Mode.SRC_IN);
+ }
+ mMultiUserAvatar.setImageDrawable(picture);
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
index dc81772..4a91ee0 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
@@ -16,11 +16,11 @@
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
-import android.annotation.Nullable;
import android.app.Fragment;
import android.content.res.Configuration;
import android.graphics.Rect;
import android.os.Bundle;
+import android.support.annotation.Nullable;
import android.support.annotation.VisibleForTesting;
import android.util.Log;
import android.view.ContextThemeWrapper;
@@ -80,14 +80,9 @@
mFooter = view.findViewById(R.id.qs_footer);
mContainer = view.findViewById(id.quick_settings_container);
- mQSDetail.setQsPanel(mQSPanel, mHeader, mFooter);
-
- // If the quick settings row is not shown, then there is no need for the animation from
- // the row to the full QS panel.
- if (getResources().getBoolean(R.bool.config_showQuickSettingsRow)) {
- mQSAnimator = new QSAnimator(this,
- mHeader.findViewById(R.id.quick_qs_panel), mQSPanel);
- }
+ mQSDetail.setQsPanel(mQSPanel, mHeader, (View) mFooter);
+ mQSAnimator = new QSAnimator(this,
+ mHeader.findViewById(R.id.quick_qs_panel), mQSPanel);
mQSCustomizer = view.findViewById(R.id.qs_customize);
mQSCustomizer.setQs(this);
@@ -139,6 +134,7 @@
public void setHasNotifications(boolean hasNotifications) {
}
+ @Override
public void setPanelView(HeightListener panelView) {
mPanelView = panelView;
}
@@ -162,6 +158,7 @@
}
}
+ @Override
public boolean isCustomizing() {
return mQSCustomizer.isCustomizing();
}
@@ -203,15 +200,22 @@
return mQSCustomizer;
}
+ @Override
public boolean isShowingDetail() {
return mQSPanel.isShowingCustomize() || mQSDetail.isShowingDetail();
}
+ @Override
public void setHeaderClickable(boolean clickable) {
if (DEBUG) Log.d(TAG, "setHeaderClickable " + clickable);
- mFooter.getExpandView().setClickable(clickable);
+
+ View expandView = mFooter.getExpandView();
+ if (expandView != null) {
+ expandView.setClickable(clickable);
+ }
}
+ @Override
public void setExpanded(boolean expanded) {
if (DEBUG) Log.d(TAG, "setExpanded " + expanded);
mQsExpanded = expanded;
@@ -219,6 +223,7 @@
updateQsState();
}
+ @Override
public void setKeyguardShowing(boolean keyguardShowing) {
if (DEBUG) Log.d(TAG, "setKeyguardShowing " + keyguardShowing);
mKeyguardShowing = keyguardShowing;
@@ -231,12 +236,14 @@
updateQsState();
}
+ @Override
public void setOverscrolling(boolean stackScrollerOverscrolling) {
if (DEBUG) Log.d(TAG, "setOverscrolling " + stackScrollerOverscrolling);
mStackScrollerOverscrolling = stackScrollerOverscrolling;
updateQsState();
}
+ @Override
public void setListening(boolean listening) {
if (DEBUG) Log.d(TAG, "setListening " + listening);
mListening = listening;
@@ -245,11 +252,13 @@
mQSPanel.setListening(mListening && mQsExpanded);
}
+ @Override
public void setHeaderListening(boolean listening) {
mHeader.setListening(listening);
mFooter.setListening(listening);
}
+ @Override
public void setQsExpansion(float expansion, float headerTranslation) {
if (DEBUG) Log.d(TAG, "setQSExpansion " + expansion + " " + headerTranslation);
mContainer.setExpansion(expansion);
@@ -277,6 +286,7 @@
mQSPanel.setClipBounds(mQsBounds);
}
+ @Override
public void animateHeaderSlidingIn(long delay) {
if (DEBUG) Log.d(TAG, "animateHeaderSlidingIn");
// If the QS is already expanded we don't need to slide in the header as it's already
@@ -288,6 +298,7 @@
}
}
+ @Override
public void animateHeaderSlidingOut() {
if (DEBUG) Log.d(TAG, "animateHeaderSlidingOut");
mHeaderAnimating = true;
@@ -308,7 +319,11 @@
@Override
public void setExpandClickListener(OnClickListener onClickListener) {
- mFooter.getExpandView().setOnClickListener(onClickListener);
+ View expandView = mFooter.getExpandView();
+
+ if (expandView != null) {
+ expandView.setOnClickListener(onClickListener);
+ }
}
@Override
@@ -331,6 +346,7 @@
* The height this view wants to be. This is different from {@link #getMeasuredHeight} such that
* during closing the detail panel, this already returns the smaller height.
*/
+ @Override
public int getDesiredHeight() {
if (mQSCustomizer.isCustomizing()) {
return getView().getHeight();
@@ -350,6 +366,7 @@
mContainer.setHeightOverride(desiredHeight);
}
+ @Override
public int getQsMinExpansionHeight() {
return mHeader.getHeight();
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
index 7ec0760..0709e22 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
@@ -58,8 +58,6 @@
Resources res = getResources();
mHeaderQsPanel = findViewById(R.id.quick_qs_panel);
- mHeaderQsPanel.setVisibility(res.getBoolean(R.bool.config_showQuickSettingsRow)
- ? VISIBLE : GONE);
// RenderThread is doing more harm than good when touching the header (to expand quick
// settings), so disable it for this view
diff --git a/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFooter.java b/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFooter.java
new file mode 100644
index 0000000..9730f29
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFooter.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+package com.android.systemui.qs.car;
+
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.Drawable;
+import android.support.annotation.Nullable;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.RelativeLayout;
+
+import com.android.systemui.Dependency;
+import com.android.systemui.R;
+import com.android.systemui.plugins.ActivityStarter;
+import com.android.systemui.qs.QSFooter;
+import com.android.systemui.qs.QSPanel;
+import com.android.systemui.statusbar.phone.MultiUserSwitch;
+import com.android.systemui.statusbar.policy.DeviceProvisionedController;
+import com.android.systemui.statusbar.policy.UserInfoController;
+
+/**
+ * The footer view that displays below the status bar in the auto use-case. This view shows the
+ * user switcher and access to settings.
+ */
+public class CarQSFooter extends RelativeLayout implements QSFooter,
+ UserInfoController.OnUserInfoChangedListener {
+ private UserInfoController mUserInfoController;
+
+ private MultiUserSwitch mMultiUserSwitch;
+ private ImageView mMultiUserAvatar;
+
+ public CarQSFooter(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+ mMultiUserSwitch = findViewById(R.id.multi_user_switch);
+ mMultiUserAvatar = mMultiUserSwitch.findViewById(R.id.multi_user_avatar);
+
+ mUserInfoController = Dependency.get(UserInfoController.class);
+
+ findViewById(R.id.settings_button).setOnClickListener(v -> {
+ ActivityStarter activityStarter = Dependency.get(ActivityStarter.class);
+
+ if (!Dependency.get(DeviceProvisionedController.class).isCurrentUserSetup()) {
+ // If user isn't setup just unlock the device and dump them back at SUW.
+ activityStarter.postQSRunnableDismissingKeyguard(() -> { });
+ return;
+ }
+
+ activityStarter.startActivity(new Intent(android.provider.Settings.ACTION_SETTINGS),
+ true /* dismissShade */);
+ });
+ }
+
+ @Override
+ public void onUserInfoChanged(String name, Drawable picture, String userAccount) {
+ mMultiUserAvatar.setImageDrawable(picture);
+ }
+
+ @Override
+ public void setQSPanel(@Nullable QSPanel panel) {
+ if (panel != null) {
+ mMultiUserSwitch.setQsPanel(panel);
+ }
+ }
+
+ @Override
+ public void setListening(boolean listening) {
+ if (listening) {
+ mUserInfoController.addCallback(this);
+ } else {
+ mUserInfoController.removeCallback(this);
+ }
+ }
+
+ @Nullable
+ @Override
+ public View getExpandView() {
+ // No view that should expand/collapse the quick settings.
+ return null;
+ }
+
+ @Override
+ public void setExpanded(boolean expanded) {
+ // Do nothing because the quick settings cannot be expanded.
+ }
+
+ @Override
+ public void setExpansion(float expansion) {
+ // Do nothing because the quick settings cannot be expanded.
+ }
+
+ @Override
+ public void setKeyguardShowing(boolean keyguardShowing) {
+ // Do nothing because the footer will not be shown when the keyguard is up.
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFragment.java
new file mode 100644
index 0000000..7c2a812
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFragment.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+package com.android.systemui.qs.car;
+
+import android.app.Fragment;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.annotation.VisibleForTesting;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+
+import com.android.systemui.R;
+import com.android.systemui.plugins.qs.QS;
+import com.android.systemui.qs.QSFooter;
+
+/**
+ * A quick settings fragment for the car. For auto, there is no row for quick settings or ability
+ * to expand the quick settings panel. Instead, the only thing is that displayed is the
+ * status bar, and a static row with access to the user switcher and settings.
+ */
+public class CarQSFragment extends Fragment implements QS {
+ private View mHeader;
+ private QSFooter mFooter;
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
+ Bundle savedInstanceState) {
+ return inflater.inflate(R.layout.car_qs_panel, container, false);
+ }
+
+ @Override
+ public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ mHeader = view.findViewById(R.id.header);
+ mFooter = view.findViewById(R.id.qs_footer);
+ }
+
+ @Override
+ public void hideImmediately() {
+ getView().setVisibility(View.INVISIBLE);
+ }
+
+ @Override
+ public void setQsExpansion(float qsExpansionFraction, float headerTranslation) {
+ // If the header is to be completed translated down, then set it to be visible.
+ getView().setVisibility(headerTranslation == 0 ? View.VISIBLE : View.INVISIBLE);
+ }
+
+ @Override
+ public View getHeader() {
+ return mHeader;
+ }
+
+ @VisibleForTesting
+ QSFooter getFooter() {
+ return mFooter;
+ }
+
+ @Override
+ public void setHeaderListening(boolean listening) {
+ mFooter.setListening(listening);
+ }
+
+ @Override
+ public void setListening(boolean listening) {
+ mFooter.setListening(listening);
+ }
+
+ @Override
+ public int getQsMinExpansionHeight() {
+ return getView().getHeight();
+ }
+
+ @Override
+ public int getDesiredHeight() {
+ return getView().getHeight();
+ }
+
+ @Override
+ public void setPanelView(HeightListener notificationPanelView) {
+ // No quick settings panel.
+ }
+
+ @Override
+ public void setHeightOverride(int desiredHeight) {
+ // No ability to expand quick settings.
+ }
+
+ @Override
+ public void setHeaderClickable(boolean qsExpansionEnabled) {
+ // Usually this sets the expand button to be clickable, but there is no quick settings to
+ // expand.
+ }
+
+ @Override
+ public boolean isCustomizing() {
+ // No ability to customize the quick settings.
+ return false;
+ }
+
+ @Override
+ public void setOverscrolling(boolean overscrolling) {
+ // No overscrolling to reveal quick settings.
+ }
+
+ @Override
+ public void setExpanded(boolean qsExpanded) {
+ // No quick settings to expand
+ }
+
+ @Override
+ public boolean isShowingDetail() {
+ // No detail panel to close.
+ return false;
+ }
+
+ @Override
+ public void closeDetail() {
+ // No detail panel to close.
+ }
+
+ @Override
+ public void setKeyguardShowing(boolean keyguardShowing) {
+ // No keyguard to show.
+ }
+
+ @Override
+ public void animateHeaderSlidingIn(long delay) {
+ // No header to animate.
+ }
+
+ @Override
+ public void animateHeaderSlidingOut() {
+ // No header to animate.
+ }
+
+ @Override
+ public void notifyCustomizeChanged() {
+ // There is no ability to customize quick settings.
+ }
+
+ @Override
+ public void setContainer(ViewGroup container) {
+ // No quick settings, so no container to set.
+ }
+
+ @Override
+ public void setExpandClickListener(OnClickListener onClickListener) {
+ // No ability to expand the quick settings.
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/car/CarStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/car/CarStatusBarHeader.java
new file mode 100644
index 0000000..6797bb9
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/car/CarStatusBarHeader.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+package com.android.systemui.qs.car;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.graphics.Rect;
+import android.support.annotation.IdRes;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.RelativeLayout;
+
+import com.android.settingslib.Utils;
+import com.android.systemui.BatteryMeterView;
+import com.android.systemui.R;
+import com.android.systemui.statusbar.policy.DarkIconDispatcher;
+
+/**
+ * A view that forms the header of the notification panel. This view will ensure that any
+ * status icons that are displayed are tinted accordingly to the current theme.
+ */
+public class CarStatusBarHeader extends RelativeLayout {
+ public CarStatusBarHeader(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+
+ // Set the light/dark theming on the header status UI to match the current theme.
+ int colorForeground = Utils.getColorAttr(getContext(), android.R.attr.colorForeground);
+ float intensity = colorForeground == Color.WHITE ? 0f : 1f;
+ Rect tintArea = new Rect(0, 0, 0, 0);
+
+ applyDarkness(R.id.signal_cluster, tintArea, intensity, colorForeground);
+ applyDarkness(R.id.battery, tintArea, intensity, colorForeground);
+ applyDarkness(R.id.clock, tintArea, intensity, colorForeground);
+
+ ((BatteryMeterView) findViewById(R.id.battery)).setForceShowPercent(true);
+ }
+
+ private void applyDarkness(@IdRes int id, Rect tintArea, float intensity, int color) {
+ View v = findViewById(id);
+ if (v instanceof DarkIconDispatcher.DarkReceiver) {
+ ((DarkIconDispatcher.DarkReceiver) v).onDarkChanged(tintArea, intensity, color);
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
index 272380b..1e78e65 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
@@ -20,13 +20,14 @@
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
+import android.content.pm.PackageManager;
import android.content.res.Resources;
+import android.os.SystemProperties;
import android.service.quicksettings.Tile;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Switch;
-
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settingslib.net.DataUsageController;
@@ -48,8 +49,17 @@
/** Quick settings tile: Cellular **/
public class CellularTile extends QSTileImpl<SignalState> {
- static final Intent CELLULAR_SETTINGS = new Intent().setComponent(new ComponentName(
- "com.android.settings", "com.android.settings.Settings$DataUsageSummaryActivity"));
+ private static final ComponentName CELLULAR_SETTING_COMPONENT = new ComponentName(
+ "com.android.settings", "com.android.settings.Settings$DataUsageSummaryActivity");
+ private static final ComponentName DATA_PLAN_CELLULAR_COMPONENT = new ComponentName(
+ "com.android.settings", "com.android.settings.Settings$DataPlanUsageSummaryActivity");
+
+ private static final Intent CELLULAR_SETTINGS =
+ new Intent().setComponent(CELLULAR_SETTING_COMPONENT);
+ private static final Intent DATA_PLAN_CELLULAR_SETTINGS =
+ new Intent().setComponent(DATA_PLAN_CELLULAR_COMPONENT);
+
+ private static final String ENABLE_SETTINGS_DATA_PLAN = "enable.settings.data.plan";
private final NetworkController mController;
private final DataUsageController mDataController;
@@ -94,7 +104,7 @@
@Override
public Intent getLongClickIntent() {
- return CELLULAR_SETTINGS;
+ return getCellularSettingIntent(mContext);
}
@Override
@@ -128,7 +138,9 @@
if (mDataController.isMobileDataSupported()) {
showDetail(true);
} else {
- mActivityStarter.postStartActivityDismissingKeyguard(CELLULAR_SETTINGS, 0);
+ mActivityStarter
+ .postStartActivityDismissingKeyguard(getCellularSettingIntent(mContext),
+ 0 /* delay */);
}
}
@@ -265,7 +277,28 @@
public void setMobileDataEnabled(boolean enabled) {
mDetailAdapter.setMobileDataEnabled(enabled);
}
- };
+ }
+
+ static Intent getCellularSettingIntent(Context context) {
+ // TODO(b/62349208): We should replace feature flag check below with data plans
+ // availability check. If the data plans are available we display the data plans usage
+ // summary otherwise we display data usage summary without data plans.
+ boolean isDataPlanFeatureEnabled =
+ SystemProperties.getBoolean(ENABLE_SETTINGS_DATA_PLAN, false /* default */);
+ context.getPackageManager()
+ .setComponentEnabledSetting(
+ DATA_PLAN_CELLULAR_COMPONENT,
+ isDataPlanFeatureEnabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
+ : PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
+ PackageManager.DONT_KILL_APP);
+ context.getPackageManager()
+ .setComponentEnabledSetting(
+ CELLULAR_SETTING_COMPONENT,
+ isDataPlanFeatureEnabled ? PackageManager.COMPONENT_ENABLED_STATE_DISABLED
+ : PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
+ PackageManager.DONT_KILL_APP);
+ return isDataPlanFeatureEnabled ? DATA_PLAN_CELLULAR_SETTINGS : CELLULAR_SETTINGS;
+ }
private final class CellularDetailAdapter implements DetailAdapter {
@@ -283,7 +316,7 @@
@Override
public Intent getSettingsIntent() {
- return CELLULAR_SETTINGS;
+ return getCellularSettingIntent(mContext);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DataSaverTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DataSaverTile.java
index b796451..8b62beb 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DataSaverTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DataSaverTile.java
@@ -14,18 +14,16 @@
package com.android.systemui.qs.tiles;
-import android.content.DialogInterface;
+import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.service.quicksettings.Tile;
import android.widget.Switch;
-
-import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.systemui.Dependency;
import com.android.systemui.Prefs;
import com.android.systemui.R;
-import com.android.systemui.qs.QSHost;
import com.android.systemui.plugins.qs.QSTile.BooleanState;
+import com.android.systemui.qs.QSHost;
import com.android.systemui.qs.tileimpl.QSTileImpl;
import com.android.systemui.statusbar.phone.SystemUIDialog;
import com.android.systemui.statusbar.policy.DataSaverController;
@@ -57,9 +55,8 @@
@Override
public Intent getLongClickIntent() {
- return CellularTile.CELLULAR_SETTINGS;
+ return CellularTile.getCellularSettingIntent(mContext);
}
-
@Override
protected void handleClick() {
if (mState.value
@@ -73,12 +70,7 @@
dialog.setTitle(com.android.internal.R.string.data_saver_enable_title);
dialog.setMessage(com.android.internal.R.string.data_saver_description);
dialog.setPositiveButton(com.android.internal.R.string.data_saver_enable_button,
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- toggleDataSaver();
- }
- });
+ (OnClickListener) (dialogInterface, which) -> toggleDataSaver());
dialog.setNegativeButton(com.android.internal.R.string.cancel, null);
dialog.setShowForAllUsers(true);
dialog.show();
@@ -126,4 +118,4 @@
public void onDataSaverChanged(boolean isDataSaving) {
refreshState(isDataSaving);
}
-}
\ No newline at end of file
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/NfcTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/NfcTile.java
index d147b69..6500740 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/NfcTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/NfcTile.java
@@ -56,13 +56,6 @@
if (mListening) {
mContext.registerReceiver(mNfcReceiver,
new IntentFilter(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED));
- if (mAdapter == null) {
- try {
- mAdapter = NfcAdapter.getNfcAdapter(mContext);
- } catch (UnsupportedOperationException e) {
- mAdapter = null;
- }
- }
} else {
mContext.unregisterReceiver(mNfcReceiver);
}
@@ -84,11 +77,10 @@
@Override
protected void handleClick() {
- if (mAdapter == null) return;
- if (!mAdapter.isEnabled()) {
- mAdapter.enable();
+ if (!getAdapter().isEnabled()) {
+ getAdapter().enable();
} else {
- mAdapter.disable();
+ getAdapter().disable();
}
}
@@ -106,7 +98,7 @@
protected void handleUpdateState(BooleanState state, Object arg) {
final Drawable mEnable = mContext.getDrawable(R.drawable.ic_qs_nfc_enabled);
final Drawable mDisable = mContext.getDrawable(R.drawable.ic_qs_nfc_disabled);
- state.value = mAdapter == null ? false : mAdapter.isEnabled();
+ state.value = getAdapter().isEnabled();
state.label = mContext.getString(R.string.quick_settings_nfc_label);
state.icon = new DrawableIcon(state.value ? mEnable : mDisable);
state.expandedAccessibilityClassName = Switch.class.getName();
@@ -127,6 +119,17 @@
}
}
+ private NfcAdapter getAdapter() {
+ if (mAdapter == null) {
+ try {
+ mAdapter = NfcAdapter.getNfcAdapter(mContext);
+ } catch (UnsupportedOperationException e) {
+ mAdapter = null;
+ }
+ }
+ return mAdapter;
+ }
+
private BroadcastReceiver mNfcReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
diff --git a/packages/SystemUI/src/com/android/systemui/recents/Recents.java b/packages/SystemUI/src/com/android/systemui/recents/Recents.java
index 3800c8d..1657bfa 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/Recents.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/Recents.java
@@ -205,13 +205,13 @@
public void start() {
sDebugFlags = new RecentsDebugFlags(mContext);
sSystemServicesProxy = SystemServicesProxy.getInstance(mContext);
- sTaskLoader = new RecentsTaskLoader(mContext);
sConfiguration = new RecentsConfiguration(mContext);
+ sTaskLoader = new RecentsTaskLoader(mContext);
mHandler = new Handler();
mImpl = new RecentsImpl(mContext);
// Check if there is a recents override package
- if ("userdebug".equals(Build.TYPE) || "eng".equals(Build.TYPE)) {
+ if (Build.IS_USERDEBUG || Build.IS_ENG) {
String cnStr = SystemProperties.get(RECENTS_OVERRIDE_SYSPROP_KEY);
if (!cnStr.isEmpty()) {
mOverrideRecentsPackageName = cnStr;
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java
index ff8d4bf..5dc6f31 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java
@@ -16,12 +16,14 @@
package com.android.systemui.recents;
+import android.app.ActivityManager;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Rect;
import android.os.SystemProperties;
+
import com.android.systemui.R;
import com.android.systemui.recents.misc.SystemServicesProxy;
import com.android.systemui.recents.model.TaskStack;
@@ -84,6 +86,13 @@
// Recents will layout task views in a grid mode when there's enough space in the screen.
public boolean isGridEnabled;
+ // Support for Android Recents for low ram devices. If this field is set to true, then Recents
+ // will use the alternative layout.
+ public boolean isLowRamDevice;
+
+ // Enable drag and drop split from Recents. Disabled for low ram devices.
+ public boolean dragToSplitEnabled;
+
private final Context mAppContext;
public RecentsConfiguration(Context context) {
@@ -95,6 +104,8 @@
fakeShadows = res.getBoolean(R.bool.config_recents_fake_shadows);
svelteLevel = res.getInteger(R.integer.recents_svelte_level);
isGridEnabled = SystemProperties.getBoolean("ro.recents.grid", false);
+ isLowRamDevice = ActivityManager.isLowRamDeviceStatic();
+ dragToSplitEnabled = !isLowRamDevice;
float screenDensity = context.getResources().getDisplayMetrics().density;
smallestWidth = ssp.getDeviceSmallestWidth();
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsDebugFlags.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsDebugFlags.java
index bb8bfee..0262a09 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsDebugFlags.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsDebugFlags.java
@@ -41,6 +41,8 @@
private static final boolean EnableFastToggleTimeout = false;
// Overrides the Tuner flags and enables the paging via the Recents button
private static final boolean EnablePaging = false;
+ // Disables enter and exit transitions for other tasks for low ram devices
+ public static final boolean DisableRecentsLowRamEnterExitAnimation = false;
// Enables us to create mock recents tasks
public static final boolean EnableMockTasks = false;
diff --git a/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java b/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java
index d74970f..316ad16 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java
@@ -107,11 +107,8 @@
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL,
- 0
- | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
- | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
- | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED
- ,
+ WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
+ | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
lp.token = new Binder();
lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/HighResThumbnailLoader.java b/packages/SystemUI/src/com/android/systemui/recents/model/HighResThumbnailLoader.java
index 974139a..48fa6c3 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/model/HighResThumbnailLoader.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/model/HighResThumbnailLoader.java
@@ -25,6 +25,8 @@
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.systemui.recents.Recents;
+import com.android.systemui.recents.RecentsConfiguration;
import com.android.systemui.recents.misc.SystemServicesProxy;
import com.android.systemui.recents.model.Task.TaskCallbacks;
@@ -47,25 +49,30 @@
private final Thread mLoadThread;
private final Handler mMainThreadHandler;
private final SystemServicesProxy mSystemServicesProxy;
+ private final boolean mIsLowRamDevice;
private boolean mLoading;
private boolean mVisible;
private boolean mFlingingFast;
private boolean mTaskLoadQueueIdle;
- public HighResThumbnailLoader(SystemServicesProxy ssp, Looper looper) {
+ public HighResThumbnailLoader(SystemServicesProxy ssp, Looper looper, boolean isLowRamDevice) {
mMainThreadHandler = new Handler(looper);
mLoadThread = new Thread(mLoader, "Recents-HighResThumbnailLoader");
mLoadThread.start();
mSystemServicesProxy = ssp;
+ mIsLowRamDevice = isLowRamDevice;
}
public void setVisible(boolean visible) {
+ if (mIsLowRamDevice) {
+ return;
+ }
mVisible = visible;
updateLoading();
}
public void setFlingingFast(boolean flingingFast) {
- if (mFlingingFast == flingingFast) {
+ if (mFlingingFast == flingingFast || mIsLowRamDevice) {
return;
}
mFlingingFast = flingingFast;
@@ -77,6 +84,9 @@
* starting this queue until the other queue is idling.
*/
public void setTaskLoadQueueIdle(boolean idle) {
+ if (mIsLowRamDevice) {
+ return;
+ }
mTaskLoadQueueIdle = idle;
updateLoading();
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java
index 80c44a3..8d31730 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java
@@ -37,6 +37,7 @@
import com.android.systemui.recents.Recents;
import com.android.systemui.recents.RecentsDebugFlags;
import com.android.systemui.recents.misc.SystemServicesProxy;
+import com.android.systemui.recents.views.lowram.TaskStackLowRamLayoutAlgorithm;
import com.android.systemui.recents.views.grid.TaskGridLayoutAlgorithm;
import java.util.ArrayList;
@@ -163,9 +164,13 @@
boolean isStackTask;
if (Recents.getConfiguration().isGridEnabled) {
// When grid layout is enabled, we only show the first
- // TaskGridLayoutAlgorithm.MAX_LAYOUT_TASK_COUNT} tasks.
+ // TaskGridLayoutAlgorithm.MAX_LAYOUT_FROM_HOME_TASK_COUNT} tasks.
isStackTask = t.lastActiveTime >= lastStackActiveTime &&
i >= taskCount - TaskGridLayoutAlgorithm.MAX_LAYOUT_TASK_COUNT;
+ } else if (Recents.getConfiguration().isLowRamDevice) {
+ // Show a max of 3 items
+ isStackTask = t.lastActiveTime >= lastStackActiveTime &&
+ i >= taskCount - TaskStackLowRamLayoutAlgorithm.MAX_LAYOUT_TASK_COUNT;
} else {
isStackTask = isFreeformTask || !isHistoricalTask(t) ||
(t.lastActiveTime >= lastStackActiveTime && i >= (taskCount - MIN_NUM_TASKS));
diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java
index 1da2d74..1b89386 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java
@@ -306,7 +306,7 @@
// Initialize the proxy, cache and loaders
int numRecentTasks = ActivityManager.getMaxRecentTasksStatic();
mHighResThumbnailLoader = new HighResThumbnailLoader(Recents.getSystemServices(),
- Looper.getMainLooper());
+ Looper.getMainLooper(), Recents.getConfiguration().isLowRamDevice);
mLoadQueue = new TaskResourceLoadQueue();
mIconCache = new TaskKeyLruCache<>(iconCacheSize, mClearActivityInfoOnEviction);
mActivityLabelCache = new TaskKeyLruCache<>(numRecentTasks, mClearActivityInfoOnEviction);
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsTransitionHelper.java b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsTransitionHelper.java
index 67685b8..127822a 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsTransitionHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsTransitionHelper.java
@@ -447,8 +447,12 @@
Rect taskRect = new Rect();
transform.rect.round(taskRect);
- if (stackView.getStack().getStackFrontMostTask(false /* includeFreeformTasks */) !=
- taskView.getTask()) {
+ // Disable in for low ram devices because each task does in Recents does not have fullscreen
+ // height (stackView height) and when transitioning to fullscreen app, the code below would
+ // force the task thumbnail to full stackView height immediately causing the transition
+ // jarring.
+ if (!Recents.getConfiguration().isLowRamDevice && taskView.getTask() !=
+ stackView.getStack().getStackFrontMostTask(false /* includeFreeformTasks */)) {
taskRect.bottom = taskRect.top + stackView.getMeasuredHeight();
}
return new AppTransitionAnimationSpec(taskView.getTask().key.id, b, taskRect);
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
index 8e09481..ccaf3cd 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
@@ -159,7 +159,10 @@
if (mStackActionButton != null) {
removeView(mStackActionButton);
}
- mStackActionButton = (TextView) inflater.inflate(R.layout.recents_stack_action_button,
+ mStackActionButton = (TextView) inflater.inflate(Recents.getConfiguration()
+ .isLowRamDevice
+ ? R.layout.recents_low_ram_stack_action_button
+ : R.layout.recents_stack_action_button,
this, false);
mStackActionButton.setOnClickListener(
v -> EventBus.getDefault().send(new DismissAllTaskViewsEvent()));
@@ -480,7 +483,6 @@
if (mAwaitingFirstLayout) {
mAwaitingFirstLayout = false;
-
// If launched via dragging from the nav bar, then we should translate the whole view
// down offscreen
RecentsActivityLaunchState launchState = Recents.getConfiguration().getLaunchState();
@@ -489,6 +491,11 @@
} else {
setTranslationY(0f);
}
+
+ if (Recents.getConfiguration().isLowRamDevice
+ && mEmptyView.getVisibility() == View.VISIBLE) {
+ animateEmptyView(true /* show */, null /* postAnimationTrigger */);
+ }
}
}
@@ -538,6 +545,9 @@
mLastTaskLaunchedWasFreeform = event.task.isFreeformTask();
mTransitionHelper.launchTaskFromRecents(getStack(), event.task, mTaskStackView,
event.taskView, event.screenPinningRequested, event.targetTaskStack);
+ if (Recents.getConfiguration().isLowRamDevice) {
+ hideStackActionButton(HIDE_STACK_ACTION_BUTTON_DURATION, false /* translate */);
+ }
}
public final void onBusEvent(DismissRecentsToHomeAnimationStarted event) {
@@ -547,6 +557,10 @@
hideStackActionButton(taskViewExitToHomeDuration, false /* translate */);
}
animateBackgroundScrim(0f, taskViewExitToHomeDuration);
+
+ if (Recents.getConfiguration().isLowRamDevice) {
+ animateEmptyView(false /* show */, event.getAnimationTrigger());
+ }
}
public final void onBusEvent(DragStartEvent event) {
@@ -701,6 +715,9 @@
animateBackgroundScrim(getOpaqueScrimAlpha(),
TaskStackAnimationHelper.ENTER_FROM_HOME_TRANSLATION_DURATION);
}
+ if (Recents.getConfiguration().isLowRamDevice && mEmptyView.getVisibility() != View.VISIBLE) {
+ showStackActionButton(SHOW_STACK_ACTION_BUTTON_DURATION, false /* translate */);
+ }
}
public final void onBusEvent(AllTaskViewsDismissedEvent event) {
@@ -818,6 +835,28 @@
}
/**
+ * Animates a translation in the Y direction and fades in/out for empty view to show or hide it.
+ * @param show whether to translate up and fade in the empty view to the center of the screen
+ * @param postAnimationTrigger to keep track of the animation
+ */
+ private void animateEmptyView(boolean show, ReferenceCountedTrigger postAnimationTrigger) {
+ float start = mTaskStackView.getStackAlgorithm().getTaskRect().height() / 4;
+ mEmptyView.setTranslationY(show ? start : 0);
+ mEmptyView.setAlpha(show ? 0f : 1f);
+ ViewPropertyAnimator animator = mEmptyView.animate()
+ .setDuration(150)
+ .setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
+ .translationY(show ? 0 : start)
+ .alpha(show ? 1f : 0f);
+
+ if (postAnimationTrigger != null) {
+ animator.setListener(postAnimationTrigger.decrementOnAnimationEnd());
+ postAnimationTrigger.increment();
+ }
+ animator.start();
+ }
+
+ /**
* Updates the dock region to match the specified dock state.
*/
private void updateVisibleDockRegions(TaskStack.DockState[] newDockStates,
@@ -891,12 +930,21 @@
*/
private Rect getStackActionButtonBoundsFromStackLayout() {
Rect actionButtonRect = new Rect(mTaskStackView.mLayoutAlgorithm.getStackActionButtonRect());
- int left = isLayoutRtl()
+ int left, top;
+ if (Recents.getConfiguration().isLowRamDevice) {
+ Rect windowRect = Recents.getSystemServices().getWindowRect();
+ left = (windowRect.width() - mSystemInsets.left - mSystemInsets.right
+ - mStackActionButton.getMeasuredWidth()) / 2;
+ top = windowRect.height() - (mStackActionButton.getMeasuredHeight()
+ + mSystemInsets.bottom + mStackActionButton.getPaddingBottom() / 2);
+ } else {
+ left = isLayoutRtl()
? actionButtonRect.left - mStackActionButton.getPaddingLeft()
: actionButtonRect.right + mStackActionButton.getPaddingRight()
- mStackActionButton.getMeasuredWidth();
- int top = actionButtonRect.top +
+ top = actionButtonRect.top +
(actionButtonRect.height() - mStackActionButton.getMeasuredHeight()) / 2;
+ }
actionButtonRect.set(left, top, left + mStackActionButton.getMeasuredWidth(),
top + mStackActionButton.getMeasuredHeight());
return actionButtonRect;
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackAnimationHelper.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackAnimationHelper.java
index 0fc68e6..6e57044 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackAnimationHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackAnimationHelper.java
@@ -33,9 +33,11 @@
import com.android.systemui.recents.Recents;
import com.android.systemui.recents.RecentsActivityLaunchState;
import com.android.systemui.recents.RecentsConfiguration;
+import com.android.systemui.recents.RecentsDebugFlags;
import com.android.systemui.recents.misc.ReferenceCountedTrigger;
import com.android.systemui.recents.model.Task;
import com.android.systemui.recents.model.TaskStack;
+import com.android.systemui.recents.views.lowram.TaskStackLowRamLayoutAlgorithm;
import java.util.ArrayList;
import java.util.List;
@@ -144,6 +146,14 @@
boolean isLandscape = appResources.getConfiguration().orientation
== Configuration.ORIENTATION_LANDSCAPE;
+ float top = 0;
+ final boolean isLowRamDevice = Recents.getConfiguration().isLowRamDevice;
+ if (isLowRamDevice && launchState.launchedFromApp && !launchState.launchedViaDockGesture) {
+ stackLayout.getStackTransform(launchTargetTask, stackScroller.getStackScroll(),
+ mTmpTransform, null /* frontTransform */);
+ top = mTmpTransform.rect.top;
+ }
+
// Prepare each of the task views for their enter animation from front to back
List<TaskView> taskViews = mStackView.getTaskViews();
for (int i = taskViews.size() - 1; i >= 0; i--) {
@@ -165,6 +175,24 @@
} else if (launchState.launchedFromApp && !launchState.launchedViaDockGesture) {
if (task.isLaunchTarget) {
tv.onPrepareLaunchTargetForEnterAnimation();
+ } else if (isLowRamDevice && i >= taskViews.size() -
+ (TaskStackLowRamLayoutAlgorithm.MAX_LAYOUT_TASK_COUNT + 1)
+ && !RecentsDebugFlags.Static.DisableRecentsLowRamEnterExitAnimation) {
+ // Move the last 2nd and 3rd last tasks in-app animation to match the motion of
+ // the last task's app transition
+ stackLayout.getStackTransform(task, stackScroller.getStackScroll(),
+ mTmpTransform, null);
+ mTmpTransform.rect.offset(0, -top);
+ mTmpTransform.alpha = 0f;
+ mStackView.updateTaskViewToTransform(tv, mTmpTransform,
+ AnimationProps.IMMEDIATE);
+ stackLayout.getStackTransform(task, stackScroller.getStackScroll(),
+ mTmpTransform, null);
+ mTmpTransform.alpha = 1f;
+ // Duration see {@link
+ // com.android.server.wm.AppTransition#DEFAULT_APP_TRANSITION_DURATION}
+ mStackView.updateTaskViewToTransform(tv, mTmpTransform,
+ new AnimationProps(336, Interpolators.FAST_OUT_SLOW_IN));
} else if (currentTaskOccludesLaunchTarget) {
// Move the task view slightly lower so we can animate it in
mTmpTransform.rect.offset(0, taskViewAffiliateGroupEnterOffset);
@@ -174,8 +202,12 @@
tv.setClipViewInStack(false);
}
} else if (launchState.launchedFromHome) {
- // Move the task view off screen (below) so we can animate it in
- mTmpTransform.rect.offset(0, offscreenYOffset);
+ if (isLowRamDevice) {
+ mTmpTransform.rect.offset(0, stackLayout.getTaskRect().height() / 4);
+ } else {
+ // Move the task view off screen (below) so we can animate it in
+ mTmpTransform.rect.offset(0, offscreenYOffset);
+ }
mTmpTransform.alpha = 0f;
mStackView.updateTaskViewToTransform(tv, mTmpTransform, AnimationProps.IMMEDIATE);
} else if (launchState.launchedViaDockGesture) {
@@ -262,16 +294,23 @@
taskIndexFromFront) * mEnterAndExitFromHomeTranslationOffset) /
ENTER_FROM_HOME_TRANSLATION_DURATION;
AnimationProps taskAnimation = new AnimationProps()
- .setStartDelay(AnimationProps.ALPHA,
- Math.min(ENTER_EXIT_NUM_ANIMATING_TASKS, taskIndexFromFront) *
- FRAME_OFFSET_MS)
- .setDuration(AnimationProps.BOUNDS, ENTER_FROM_HOME_TRANSLATION_DURATION)
- .setDuration(AnimationProps.ALPHA, ENTER_FROM_HOME_ALPHA_DURATION)
- .setInterpolator(AnimationProps.BOUNDS,
- new RecentsEntrancePathInterpolator(0f, 0f, 0.2f, 1f,
- startOffsetFraction))
.setInterpolator(AnimationProps.ALPHA, ENTER_FROM_HOME_ALPHA_INTERPOLATOR)
.setListener(postAnimationTrigger.decrementOnAnimationEnd());
+ if (Recents.getConfiguration().isLowRamDevice) {
+ taskAnimation.setInterpolator(AnimationProps.BOUNDS,
+ Interpolators.FAST_OUT_SLOW_IN)
+ .setDuration(AnimationProps.BOUNDS, 150)
+ .setDuration(AnimationProps.ALPHA, 150);
+ } else {
+ taskAnimation.setStartDelay(AnimationProps.ALPHA,
+ Math.min(ENTER_EXIT_NUM_ANIMATING_TASKS, taskIndexFromFront) *
+ FRAME_OFFSET_MS)
+ .setInterpolator(AnimationProps.BOUNDS,
+ new RecentsEntrancePathInterpolator(0f, 0f, 0.2f, 1f,
+ startOffsetFraction))
+ .setDuration(AnimationProps.BOUNDS, ENTER_FROM_HOME_TRANSLATION_DURATION)
+ .setDuration(AnimationProps.ALPHA, ENTER_FROM_HOME_ALPHA_DURATION);
+ }
postAnimationTrigger.increment();
mStackView.updateTaskViewToTransform(tv, mTmpTransform, taskAnimation);
if (i == taskViewCount - 1) {
@@ -325,18 +364,32 @@
int delay = Math.min(ENTER_EXIT_NUM_ANIMATING_TASKS , taskIndexFromFront) *
mEnterAndExitFromHomeTranslationOffset;
taskAnimation = new AnimationProps()
- .setStartDelay(AnimationProps.BOUNDS, delay)
.setDuration(AnimationProps.BOUNDS, EXIT_TO_HOME_TRANSLATION_DURATION)
- .setInterpolator(AnimationProps.BOUNDS,
- EXIT_TO_HOME_TRANSLATION_INTERPOLATOR)
.setListener(postAnimationTrigger.decrementOnAnimationEnd());
+ if (Recents.getConfiguration().isLowRamDevice) {
+ taskAnimation.setInterpolator(AnimationProps.BOUNDS,
+ Interpolators.FAST_OUT_SLOW_IN);
+ } else {
+ taskAnimation.setStartDelay(AnimationProps.BOUNDS, delay)
+ .setInterpolator(AnimationProps.BOUNDS,
+ EXIT_TO_HOME_TRANSLATION_INTERPOLATOR);
+ }
postAnimationTrigger.increment();
} else {
taskAnimation = AnimationProps.IMMEDIATE;
}
mTmpTransform.fillIn(tv);
- mTmpTransform.rect.offset(0, offscreenYOffset);
+ if (Recents.getConfiguration().isLowRamDevice) {
+ taskAnimation.setInterpolator(AnimationProps.ALPHA,
+ EXIT_TO_HOME_TRANSLATION_INTERPOLATOR)
+ .setDuration(AnimationProps.ALPHA, EXIT_TO_HOME_TRANSLATION_DURATION);
+ mTmpTransform.rect.offset(0, stackLayout.mTaskStackLowRamLayoutAlgorithm
+ .getTaskRect().height() / 4);
+ mTmpTransform.alpha = 0f;
+ } else {
+ mTmpTransform.rect.offset(0, offscreenYOffset);
+ }
mStackView.updateTaskViewToTransform(tv, mTmpTransform, taskAnimation);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackLayoutAlgorithm.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackLayoutAlgorithm.java
index 9c14d48..d810ea4 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackLayoutAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackLayoutAlgorithm.java
@@ -39,7 +39,9 @@
import com.android.systemui.recents.misc.Utilities;
import com.android.systemui.recents.model.Task;
import com.android.systemui.recents.model.TaskStack;
+import com.android.systemui.recents.views.lowram.TaskStackLowRamLayoutAlgorithm;
import com.android.systemui.recents.views.grid.TaskGridLayoutAlgorithm;
+
import java.io.PrintWriter;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -345,6 +347,7 @@
// The freeform workspace layout
FreeformWorkspaceLayoutAlgorithm mFreeformLayoutAlgorithm;
TaskGridLayoutAlgorithm mTaskGridLayoutAlgorithm;
+ TaskStackLowRamLayoutAlgorithm mTaskStackLowRamLayoutAlgorithm;
// The transform to place TaskViews at the front and back of the stack respectively
TaskViewTransform mBackOfStackTransform = new TaskViewTransform();
@@ -356,6 +359,7 @@
mCb = cb;
mFreeformLayoutAlgorithm = new FreeformWorkspaceLayoutAlgorithm(context);
mTaskGridLayoutAlgorithm = new TaskGridLayoutAlgorithm(context);
+ mTaskStackLowRamLayoutAlgorithm = new TaskStackLowRamLayoutAlgorithm(context);
reloadOnConfigurationChange(context);
}
@@ -392,6 +396,7 @@
R.dimen.recents_layout_initial_bottom_offset_tablet);
mFreeformLayoutAlgorithm.reloadOnConfigurationChange(context);
mTaskGridLayoutAlgorithm.reloadOnConfigurationChange(context);
+ mTaskStackLowRamLayoutAlgorithm.reloadOnConfigurationChange(context);
mMinMargin = res.getDimensionPixelSize(R.dimen.recents_layout_min_margin);
mBaseTopMargin = getDimensionForDevice(context,
R.dimen.recents_layout_top_margin_phone,
@@ -431,6 +436,7 @@
boolean changed = !mSystemInsets.equals(systemInsets);
mSystemInsets.set(systemInsets);
mTaskGridLayoutAlgorithm.setSystemInsets(systemInsets);
+ mTaskStackLowRamLayoutAlgorithm.setSystemInsets(systemInsets);
return changed;
}
@@ -506,6 +512,7 @@
// Initialize the grid layout
mTaskGridLayoutAlgorithm.initialize(windowRect);
+ mTaskStackLowRamLayoutAlgorithm.initialize(windowRect);
}
/**
@@ -587,15 +594,23 @@
int maxBottomOffset = mStackBottomOffset + mTaskRect.height();
float maxBottomNormX = getNormalizedXFromUnfocusedY(maxBottomOffset, FROM_BOTTOM);
mUnfocusedRange.offset(0f);
- mMinScrollP = 0;
- mMaxScrollP = Math.max(mMinScrollP, (mNumStackTasks - 1) -
+ mMinScrollP = Recents.getConfiguration().isLowRamDevice
+ ? mTaskStackLowRamLayoutAlgorithm.getMinScrollP()
+ : 0;
+ mMaxScrollP = Recents.getConfiguration().isLowRamDevice
+ ? mTaskStackLowRamLayoutAlgorithm.getMaxScrollP(taskCount)
+ : Math.max(mMinScrollP, (mNumStackTasks - 1) -
Math.max(0, mUnfocusedRange.getAbsoluteX(maxBottomNormX)));
boolean scrollToFront = launchState.launchedFromHome || launchState.launchedFromPipApp
|| launchState.launchedWithNextPipApp || launchState.launchedViaDockGesture;
+
if (launchState.launchedFromBlacklistedApp) {
mInitialScrollP = mMaxScrollP;
} else if (launchState.launchedWithAltTab) {
mInitialScrollP = Utilities.clamp(launchTaskIndex, mMinScrollP, mMaxScrollP);
+ } else if (Recents.getConfiguration().isLowRamDevice) {
+ mInitialScrollP = mTaskStackLowRamLayoutAlgorithm.getInitialScrollP(mNumStackTasks,
+ scrollToFront);
} else if (scrollToFront) {
mInitialScrollP = Utilities.clamp(launchTaskIndex, mMinScrollP, mMaxScrollP);
} else {
@@ -706,7 +721,7 @@
*/
public float updateFocusStateOnScroll(float lastTargetStackScroll, float targetStackScroll,
float lastStackScroll) {
- if (targetStackScroll == lastStackScroll) {
+ if (targetStackScroll == lastStackScroll || Recents.getConfiguration().isLowRamDevice) {
return targetStackScroll;
}
@@ -802,6 +817,10 @@
return mTaskGridLayoutAlgorithm.computeStackVisibilityReport(tasks);
}
+ if (Recents.getConfiguration().isLowRamDevice) {
+ return mTaskStackLowRamLayoutAlgorithm.computeStackVisibilityReport(tasks);
+ }
+
// Ensure minimum visibility count
if (tasks.size() <= 1) {
return new VisibilityReport(1, 1);
@@ -896,6 +915,15 @@
int taskCount = mTaskIndexMap.size();
mTaskGridLayoutAlgorithm.getTransform(taskIndex, taskCount, transformOut, this);
return transformOut;
+ } else if (Recents.getConfiguration().isLowRamDevice) {
+ if (task == null) {
+ transformOut.reset();
+ return transformOut;
+ }
+ int taskIndex = mTaskIndexMap.get(task.key.id);
+ mTaskStackLowRamLayoutAlgorithm.getTransform(taskIndex, stackScroll, transformOut,
+ mNumStackTasks, this);
+ return transformOut;
} else {
// Return early if we have an invalid index
int nonOverrideTaskProgress = mTaskIndexMap.get(task.key.id, -1);
@@ -906,6 +934,7 @@
float taskProgress = ignoreTaskOverrides
? nonOverrideTaskProgress
: getStackScrollForTask(task);
+
getStackTransform(taskProgress, nonOverrideTaskProgress, stackScroll, focusState,
transformOut, frontTransform, false /* ignoreSingleTaskCase */, forceUpdate);
return transformOut;
@@ -1031,7 +1060,6 @@
unfocusedDim *= MAX_DIM / (MAX_DIM - offset);
}
}
-
y = (mStackRect.top - mTaskRect.top) +
(int) Utilities.mapRange(focusState, unfocusedY, focusedY);
z = Utilities.mapRange(Utilities.clamp01(boundedScrollUnfocusedNonOverrideRangeX),
@@ -1067,7 +1095,7 @@
*/
float getStackScrollForTask(Task t) {
Float overrideP = mTaskIndexOverrideMap.get(t.key.id, null);
- if (overrideP == null) {
+ if (Recents.getConfiguration().isLowRamDevice || overrideP == null) {
return (float) mTaskIndexMap.get(t.key.id, 0);
}
return overrideP;
@@ -1086,6 +1114,12 @@
* offset (which is at the task's brightest point).
*/
float getStackScrollForTaskAtInitialOffset(Task t) {
+ if (Recents.getConfiguration().isLowRamDevice) {
+ RecentsActivityLaunchState launchState = Recents.getConfiguration().getLaunchState();
+ return mTaskStackLowRamLayoutAlgorithm.getInitialScrollP(mNumStackTasks,
+ launchState.launchedFromHome || launchState.launchedFromPipApp
+ || launchState.launchedWithNextPipApp);
+ }
float normX = getNormalizedXFromUnfocusedY(mInitialTopOffset, FROM_TOP);
mUnfocusedRange.offset(0f);
return Utilities.clamp((float) mTaskIndexMap.get(t.key.id, 0) - Math.max(0,
@@ -1098,6 +1132,9 @@
* screen along the arc-length proportionally (1/arclength).
*/
public float getDeltaPForY(int downY, int y) {
+ if (Recents.getConfiguration().isLowRamDevice) {
+ return mTaskStackLowRamLayoutAlgorithm.scrollToPercentage(downY - y);
+ }
float deltaP = (float) (y - downY) / mStackRect.height() *
mUnfocusedCurveInterpolator.getArcLength();
return -deltaP;
@@ -1108,6 +1145,9 @@
* of the curve, map back to the screen y.
*/
public int getYForDeltaP(float downScrollP, float p) {
+ if (Recents.getConfiguration().isLowRamDevice) {
+ return mTaskStackLowRamLayoutAlgorithm.percentageToScroll(downScrollP - p);
+ }
int y = (int) ((p - downScrollP) * mStackRect.height() *
(1f / mUnfocusedCurveInterpolator.getArcLength()));
return -y;
@@ -1300,6 +1340,11 @@
if (mStackRect.isEmpty()) {
return;
}
+ if (Recents.getConfiguration().isLowRamDevice) {
+ mTaskStackLowRamLayoutAlgorithm.getBackOfStackTransform(mBackOfStackTransform, this);
+ mTaskStackLowRamLayoutAlgorithm.getFrontOfStackTransform(mFrontOfStackTransform, this);
+ return;
+ }
float min = Utilities.mapRange(mFocusState, mUnfocusedRange.relativeMin,
mFocusedRange.relativeMin);
@@ -1317,6 +1362,9 @@
* Returns the proper task rectangle according to the current grid state.
*/
public Rect getTaskRect() {
+ if (Recents.getConfiguration().isLowRamDevice) {
+ return mTaskStackLowRamLayoutAlgorithm.getTaskRect();
+ }
return useGridLayout() ? mTaskGridLayoutAlgorithm.getTaskGridRect() : mTaskRect;
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
index 6ad6a15..15b682e 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
@@ -1685,7 +1685,7 @@
// If the doze trigger has already fired, then update the state for this task view
if (mUIDozeTrigger.isAsleep() ||
Recents.getSystemServices().hasFreeformWorkspaceSupport() ||
- useGridLayout()) {
+ useGridLayout() || Recents.getConfiguration().isLowRamDevice) {
tv.setNoUserInteractionState();
}
@@ -1763,7 +1763,8 @@
}
// In grid layout, the stack action button always remains visible.
- if (mEnterAnimationComplete && !useGridLayout()) {
+ if (mEnterAnimationComplete && !useGridLayout() &&
+ !Recents.getConfiguration().isLowRamDevice) {
if (prevScroll > SHOW_STACK_ACTION_BUTTON_SCROLL_THRESHOLD &&
curScroll <= SHOW_STACK_ACTION_BUTTON_SCROLL_THRESHOLD &&
mStack.getTaskCount() > 0) {
@@ -2381,7 +2382,7 @@
// Always show the button in grid layout.
if (useGridLayout() ||
(mStackScroller.getStackScroll() < SHOW_STACK_ACTION_BUTTON_SCROLL_THRESHOLD &&
- mStack.getTaskCount() > 0)) {
+ mStack.getTaskCount() > 0 && !Recents.getConfiguration().isLowRamDevice)) {
EventBus.getDefault().send(new ShowStackActionButtonEvent(false /* translate */));
} else {
EventBus.getDefault().send(new HideStackActionButtonEvent());
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewScroller.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewScroller.java
index 8cd3d15..27cfdc1 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewScroller.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewScroller.java
@@ -19,17 +19,23 @@
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
+import android.animation.TimeInterpolator;
+import android.animation.ValueAnimator;
import android.content.Context;
import android.util.FloatProperty;
import android.util.Log;
import android.util.MutableFloat;
import android.util.Property;
+import android.view.ViewConfiguration;
import android.view.ViewDebug;
import android.widget.OverScroller;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.recents.Recents;
import com.android.systemui.recents.misc.Utilities;
+import com.android.systemui.recents.views.lowram.TaskStackLowRamLayoutAlgorithm;
+import com.android.systemui.statusbar.FlingAnimationUtils;
import java.io.PrintWriter;
@@ -76,12 +82,15 @@
ObjectAnimator mScrollAnimator;
float mFinalAnimatedScroll;
+ final FlingAnimationUtils mFlingAnimationUtils;
+
public TaskStackViewScroller(Context context, TaskStackViewScrollerCallbacks cb,
TaskStackLayoutAlgorithm layoutAlgorithm) {
mContext = context;
mCb = cb;
mScroller = new OverScroller(context);
mLayoutAlgorithm = layoutAlgorithm;
+ mFlingAnimationUtils = new FlingAnimationUtils(context, 0.3f);
}
/** Resets the task scroller. */
@@ -186,6 +195,37 @@
return Float.compare(getScrollAmountOutOfBounds(mStackScrollP), 0f) != 0;
}
+
+ /**
+ * Scrolls the closest task and snaps into place. Only used in recents for low ram devices.
+ * @param velocity of scroll
+ */
+ void scrollToClosestTask(int velocity) {
+ float stackScroll = getStackScroll();
+
+ // Skip if not in low ram layout and if the scroll is out of min and max bounds
+ if (!Recents.getConfiguration().isLowRamDevice || stackScroll < mLayoutAlgorithm.mMinScrollP
+ || stackScroll > mLayoutAlgorithm.mMaxScrollP) {
+ return;
+ }
+
+ TaskStackLowRamLayoutAlgorithm algorithm = mLayoutAlgorithm.mTaskStackLowRamLayoutAlgorithm;
+ float newScrollP = algorithm.getClosestTaskP(stackScroll,
+ mLayoutAlgorithm.mNumStackTasks, velocity);
+ float flingThreshold = ViewConfiguration.get(mContext).getScaledMinimumFlingVelocity();
+
+ if (Math.abs(velocity) > flingThreshold) {
+ ValueAnimator animator = ObjectAnimator.ofFloat(stackScroll, newScrollP);
+ mFlingAnimationUtils.apply(animator, algorithm.percentageToScroll(stackScroll),
+ algorithm.percentageToScroll(newScrollP), velocity);
+ animateScroll(newScrollP, (int) animator.getDuration(), animator.getInterpolator(),
+ null /* postRunnable */);
+ } else {
+ animateScroll(newScrollP, 300, Interpolators.ACCELERATE_DECELERATE,
+ null /* postRunnable */);
+ }
+ }
+
/** Animates the stack scroll into bounds */
ObjectAnimator animateBoundScroll() {
// TODO: Take duration for snap back
@@ -207,6 +247,21 @@
/** Animates the stack scroll */
void animateScroll(float newScroll, int duration, final Runnable postRunnable) {
+ animateScroll(newScroll, duration, Interpolators.LINEAR_OUT_SLOW_IN, postRunnable);
+ }
+
+ /** Animates the stack scroll with time interpolator */
+ void animateScroll(float newScroll, int duration, TimeInterpolator interpolator,
+ final Runnable postRunnable) {
+ ObjectAnimator an = ObjectAnimator.ofFloat(this, STACK_SCROLL, getStackScroll(), newScroll);
+ an.setDuration(duration);
+ an.setInterpolator(interpolator);
+ animateScroll(newScroll, an, postRunnable);
+ }
+
+ /** Animates the stack scroll with animator */
+ private void animateScroll(float newScroll, ObjectAnimator animator,
+ final Runnable postRunnable) {
// Finish any current scrolling animations
if (mScrollAnimator != null && mScrollAnimator.isRunning()) {
setStackScroll(mFinalAnimatedScroll);
@@ -217,9 +272,7 @@
if (Float.compare(mStackScrollP, newScroll) != 0) {
mFinalAnimatedScroll = newScroll;
- mScrollAnimator = ObjectAnimator.ofFloat(this, STACK_SCROLL, getStackScroll(), newScroll);
- mScrollAnimator.setDuration(duration);
- mScrollAnimator.setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN);
+ mScrollAnimator = animator;
mScrollAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewTouchHandler.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewTouchHandler.java
index 36be49d..32a249c 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewTouchHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewTouchHandler.java
@@ -294,10 +294,13 @@
if (curScrollP < minScrollP || curScrollP > maxScrollP) {
float clampedScrollP = Utilities.clamp(curScrollP, minScrollP, maxScrollP);
float overscrollP = (curScrollP - clampedScrollP);
- float overscrollX = Math.abs(overscrollP) / MAX_OVERSCROLL;
+ float maxOverscroll = Recents.getConfiguration().isLowRamDevice
+ ? layoutAlgorithm.mTaskStackLowRamLayoutAlgorithm.getMaxOverscroll()
+ : MAX_OVERSCROLL;
+ float overscrollX = Math.abs(overscrollP) / maxOverscroll;
float interpX = OVERSCROLL_INTERP.getInterpolation(overscrollX);
curScrollP = clampedScrollP + Math.signum(overscrollP) *
- (interpX * MAX_OVERSCROLL);
+ (interpX * maxOverscroll);
}
mDownScrollP += mScroller.setDeltaStackScroll(mDownScrollP,
curScrollP - mDownScrollP);
@@ -333,7 +336,8 @@
if (mIsScrolling) {
if (mScroller.isScrollOutOfBounds()) {
mScroller.animateBoundScroll();
- } else if (Math.abs(velocity) > mMinimumVelocity) {
+ } else if (Math.abs(velocity) > mMinimumVelocity &&
+ !Recents.getConfiguration().isLowRamDevice) {
float minY = mDownY + layoutAlgorithm.getYForDeltaP(mDownScrollP,
layoutAlgorithm.mMaxScrollP);
float maxY = mDownY + layoutAlgorithm.getYForDeltaP(mDownScrollP,
@@ -346,7 +350,11 @@
// Reset the focused task after the user has scrolled, but we have no scrolling
// in grid layout and therefore we don't want to reset the focus there.
if (!mSv.mTouchExplorationEnabled && !mSv.useGridLayout()) {
- mSv.resetFocusedTask(mSv.getFocusedTask());
+ if (Recents.getConfiguration().isLowRamDevice) {
+ mScroller.scrollToClosestTask(velocity);
+ } else {
+ mSv.resetFocusedTask(mSv.getFocusedTask());
+ }
}
} else if (mActiveTaskView == null) {
// This tap didn't start on a task.
@@ -495,7 +503,13 @@
float prevAnchorTaskScroll = 0;
boolean pullStackForward = mCurrentTasks.size() > 0;
if (pullStackForward) {
- prevAnchorTaskScroll = layoutAlgorithm.getStackScrollForTask(anchorTask);
+ if (Recents.getConfiguration().isLowRamDevice) {
+ float index = layoutAlgorithm.getStackScrollForTask(anchorTask);
+ prevAnchorTaskScroll = mSv.getStackAlgorithm().mTaskStackLowRamLayoutAlgorithm
+ .getScrollPForTask((int) index);
+ } else {
+ prevAnchorTaskScroll = layoutAlgorithm.getStackScrollForTask(anchorTask);
+ }
}
// Calculate where the views would be without the deleting tasks
@@ -509,8 +523,14 @@
// Otherwise, offset the scroll by the movement of the anchor task
float anchorTaskScroll =
layoutAlgorithm.getStackScrollForTaskIgnoreOverrides(anchorTask);
+ if (Recents.getConfiguration().isLowRamDevice) {
+ float index = layoutAlgorithm.getStackScrollForTask(anchorTask);
+ anchorTaskScroll = mSv.getStackAlgorithm().mTaskStackLowRamLayoutAlgorithm
+ .getScrollPForTask((int) index);
+ }
float stackScrollOffset = (anchorTaskScroll - prevAnchorTaskScroll);
- if (layoutAlgorithm.getFocusState() != TaskStackLayoutAlgorithm.STATE_FOCUSED) {
+ if (layoutAlgorithm.getFocusState() != TaskStackLayoutAlgorithm.STATE_FOCUSED
+ && !Recents.getConfiguration().isLowRamDevice) {
// If we are focused, we don't want the front task to move, but otherwise, we
// allow the back task to move up, and the front task to move back
stackScrollOffset *= 0.75f;
@@ -543,7 +563,8 @@
public boolean updateSwipeProgress(View v, boolean dismissable, float swipeProgress) {
// Only update the swipe progress for the surrounding tasks if the dismiss animation was not
// preempted from a call to cancelNonDismissTaskAnimations
- if (mActiveTaskView == v || mSwipeHelperAnimations.containsKey(v)) {
+ if ((mActiveTaskView == v || mSwipeHelperAnimations.containsKey(v)) &&
+ !Recents.getConfiguration().isLowRamDevice) {
updateTaskViewTransforms(
Interpolators.FAST_OUT_SLOW_IN.getInterpolation(swipeProgress));
}
@@ -561,6 +582,10 @@
tv.setClipViewInStack(true);
// Re-enable touch events from this task view
tv.setTouchEnabled(true);
+ // Update the scroll to the final scroll position before laying out the tasks during dismiss
+ if (mSwipeHelperAnimations.containsKey(v)) {
+ mSv.getScroller().setStackScroll(mTargetStackScroll, null);
+ }
// Remove the task view from the stack, ignoring the animation if we've started dragging
// again
EventBus.getDefault().send(new TaskViewDismissedEvent(tv.getTask(), tv,
@@ -571,8 +596,6 @@
// Only update the final scroll and layout state (set in onBeginDrag()) if the dismiss
// animation was not preempted from a call to cancelNonDismissTaskAnimations
if (mSwipeHelperAnimations.containsKey(v)) {
- // Update the scroll to the final scroll position
- mSv.getScroller().setStackScroll(mTargetStackScroll, null);
// Update the focus state to the final focus state
mSv.getStackAlgorithm().setFocusState(TaskStackLayoutAlgorithm.STATE_UNFOCUSED);
mSv.getStackAlgorithm().clearUnfocusedTaskOverrides();
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java
index 17204a4..ceeebd96 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java
@@ -416,7 +416,8 @@
*/
boolean shouldClipViewInStack() {
// Never clip for freeform tasks or if invisible
- if (mTask.isFreeformTask() || getVisibility() != View.VISIBLE) {
+ if (mTask.isFreeformTask() || getVisibility() != View.VISIBLE ||
+ Recents.getConfiguration().isLowRamDevice) {
return false;
}
return mClipViewInStack;
@@ -684,6 +685,9 @@
@Override
public boolean onLongClick(View v) {
+ if (!Recents.getConfiguration().dragToSplitEnabled) {
+ return false;
+ }
SystemServicesProxy ssp = Recents.getSystemServices();
boolean inBounds = false;
Rect clipBounds = new Rect(mViewBounds.mClipBounds);
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/lowram/TaskStackLowRamLayoutAlgorithm.java b/packages/SystemUI/src/com/android/systemui/recents/views/lowram/TaskStackLowRamLayoutAlgorithm.java
new file mode 100644
index 0000000..52fa7b5
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/lowram/TaskStackLowRamLayoutAlgorithm.java
@@ -0,0 +1,262 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.recents.views.lowram;
+
+import android.content.Context;
+import android.graphics.Rect;
+import android.view.ViewConfiguration;
+
+import com.android.systemui.R;
+import com.android.systemui.recents.Recents;
+import com.android.systemui.recents.RecentsActivityLaunchState;
+import com.android.systemui.recents.misc.Utilities;
+import com.android.systemui.recents.model.Task;
+import com.android.systemui.recents.views.TaskStackLayoutAlgorithm;
+import com.android.systemui.recents.views.TaskViewTransform;
+
+import java.util.ArrayList;
+
+import static com.android.systemui.recents.views.TaskStackLayoutAlgorithm.VisibilityReport;
+
+public class TaskStackLowRamLayoutAlgorithm {
+
+ private static final String TAG = "TaskStackLowRamLayoutAlgorithm";
+ private static final float MAX_OVERSCROLL = 0.2f / 0.3f;
+
+ public static final int MAX_LAYOUT_TASK_COUNT = 9;
+ public static final int NUM_TASK_VISIBLE_LAUNCHED_FROM_HOME = 2;
+ public static final int NUM_TASK_VISIBLE_LAUNCHED_FROM_APP =
+ NUM_TASK_VISIBLE_LAUNCHED_FROM_HOME + 1;
+ private Rect mWindowRect;
+
+ private int mFlingThreshold;
+ private int mPadding;
+ private int mPaddingLeftRight;
+ private int mTopOffset;
+ private int mPaddingEndTopBottom;
+ private Rect mTaskRect = new Rect();
+ private Rect mSystemInsets = new Rect();
+
+ public TaskStackLowRamLayoutAlgorithm(Context context) {
+ reloadOnConfigurationChange(context);
+ }
+
+ public void reloadOnConfigurationChange(Context context) {
+ mPadding = context.getResources()
+ .getDimensionPixelSize(R.dimen.recents_layout_side_margin_phone);
+ mFlingThreshold = ViewConfiguration.get(context).getScaledMinimumFlingVelocity();
+ }
+
+ public void initialize(Rect windowRect) {
+ mWindowRect = windowRect;
+ if (mWindowRect.height() > 0) {
+ int windowHeight = mWindowRect.height() - mSystemInsets.bottom;
+ int windowWidth = mWindowRect.width() - mSystemInsets.right - mSystemInsets.left;
+ int width = Math.min(windowWidth, windowHeight) - mPadding * 2;
+ boolean isLandscape = windowWidth > windowHeight;
+ mTaskRect.set(0, 0, width, isLandscape ? width * 2 / 3 : width);
+ mPaddingLeftRight = (windowWidth - mTaskRect.width()) / 2;
+ mPaddingEndTopBottom = (windowHeight - mTaskRect.height()) / 2;
+
+ // Compute the top offset to center tasks in the middle of the screen
+ mTopOffset = (getTotalHeightOfTasks(MAX_LAYOUT_TASK_COUNT) - windowHeight) / 2;
+ }
+ }
+
+ public void setSystemInsets(Rect systemInsets) {
+ mSystemInsets = systemInsets;
+ }
+
+ public VisibilityReport computeStackVisibilityReport(ArrayList<Task> tasks) {
+ RecentsActivityLaunchState launchState = Recents.getConfiguration().getLaunchState();
+ int maxVisible = launchState.launchedFromHome || launchState.launchedFromPipApp
+ || launchState.launchedWithNextPipApp
+ ? NUM_TASK_VISIBLE_LAUNCHED_FROM_HOME
+ : NUM_TASK_VISIBLE_LAUNCHED_FROM_APP;
+ int visibleCount = Math.min(maxVisible, tasks.size());
+ return new VisibilityReport(visibleCount, visibleCount);
+ }
+
+ public void getFrontOfStackTransform(TaskViewTransform transformOut,
+ TaskStackLayoutAlgorithm stackLayout) {
+ if (mWindowRect == null) {
+ transformOut.reset();
+ return;
+ }
+
+ // Calculate the static task y position 2 tasks after/below the middle/current task
+ int windowHeight = mWindowRect.height() - mSystemInsets.bottom;
+ int bottomOfCurrentTask = (windowHeight + mTaskRect.height()) / 2;
+ int y = bottomOfCurrentTask + mTaskRect.height() + mPadding * 2;
+ fillStackTransform(transformOut, y, stackLayout.mMaxTranslationZ, true);
+ }
+
+ public void getBackOfStackTransform(TaskViewTransform transformOut,
+ TaskStackLayoutAlgorithm stackLayout) {
+ if (mWindowRect == null) {
+ transformOut.reset();
+ return;
+ }
+
+ // Calculate the static task y position 2 tasks before/above the middle/current task
+ int windowHeight = mWindowRect.height() - mSystemInsets.bottom;
+ int topOfCurrentTask = (windowHeight - mTaskRect.height()) / 2;
+ int y = topOfCurrentTask - (mTaskRect.height() + mPadding) * 2;
+ fillStackTransform(transformOut, y, stackLayout.mMaxTranslationZ, true);
+ }
+
+ public TaskViewTransform getTransform(int taskIndex, float stackScroll,
+ TaskViewTransform transformOut, int taskCount, TaskStackLayoutAlgorithm stackLayout) {
+ if (taskCount == 0) {
+ transformOut.reset();
+ return transformOut;
+ }
+ boolean visible = true;
+ int x = mPaddingLeftRight;
+ int y;
+ if (taskCount > 1) {
+ y = getTaskTopFromIndex(taskIndex) - percentageToScroll(stackScroll);
+
+ // Check visibility from the bottom of the task
+ visible = y + mPadding + getTaskRect().height() > 0;
+ } else {
+ int windowHeight = mWindowRect.height() - mSystemInsets.bottom;
+ y = (windowHeight - mTaskRect.height()) / 2 - percentageToScroll(stackScroll);
+ }
+ fillStackTransform(transformOut, y, stackLayout.mMaxTranslationZ, visible);
+ return transformOut;
+ }
+
+ /**
+ * Finds the closest task to the scroll percentage in the y axis and returns the percentage of
+ * the task to scroll to.
+ * @param scrollP percentage to find nearest to
+ * @param numTasks number of tasks in recents stack
+ * @param velocity speed of fling
+ */
+ public float getClosestTaskP(float scrollP, int numTasks, int velocity) {
+ int y = percentageToScroll(scrollP);
+
+ int lastY = getTaskTopFromIndex(0) - mPaddingEndTopBottom;
+ for (int i = 1; i < numTasks; i++) {
+ int taskY = getTaskTopFromIndex(i) - mPaddingEndTopBottom;
+ int diff = taskY - y;
+ if (diff > 0) {
+ int diffPrev = Math.abs(y - lastY);
+ boolean useNext = diff > diffPrev;
+ if (Math.abs(velocity) > mFlingThreshold) {
+ useNext = velocity > 0;
+ }
+ return useNext
+ ? scrollToPercentage(lastY) : scrollToPercentage(taskY);
+ }
+ lastY = taskY;
+ }
+ return scrollToPercentage(lastY);
+ }
+
+ /**
+ * Convert a scroll value to a percentage
+ * @param scroll a scroll value
+ * @return a percentage that represents the scroll from the total height of tasks
+ */
+ public float scrollToPercentage(int scroll) {
+ return (float) scroll / (mTaskRect.height() + mPadding);
+ }
+
+ /**
+ * Converts a percentage to the scroll value from the total height of tasks
+ * @param p a percentage that represents the scroll value
+ * @return a scroll value in pixels
+ */
+ public int percentageToScroll(float p) {
+ return (int) (p * (mTaskRect.height() + mPadding));
+ }
+
+ /**
+ * Get the min scroll progress for low ram layout. This computes the top position of the
+ * first task and reduce by the end padding to center the first task
+ * @return position of max scroll
+ */
+ public float getMinScrollP() {
+ return getScrollPForTask(0);
+ }
+
+ /**
+ * Get the max scroll progress for low ram layout. This computes the top position of the last
+ * task and reduce by the end padding to center the last task
+ * @param taskCount the amount of tasks in the recents stack
+ * @return position of max scroll
+ */
+ public float getMaxScrollP(int taskCount) {
+ return getScrollPForTask(taskCount - 1);
+ }
+
+ /**
+ * Get the initial scroll value whether launched from home or from an app.
+ * @param taskCount the amount of tasks currently in recents
+ * @param fromHome if launching recents from home or not
+ * @return from home it will return max value and from app it will return 2nd last task
+ */
+ public float getInitialScrollP(int taskCount, boolean fromHome) {
+ if (fromHome) {
+ return getMaxScrollP(taskCount);
+ }
+ if (taskCount < 2) {
+ return 0;
+ }
+ return getScrollPForTask(taskCount - 2);
+ }
+
+ /**
+ * Get the scroll progress for any task
+ * @param taskIndex task index to get the scroll progress of
+ * @return scroll progress of task
+ */
+ public float getScrollPForTask(int taskIndex) {
+ return scrollToPercentage(getTaskTopFromIndex(taskIndex) - mPaddingEndTopBottom);
+ }
+
+ public Rect getTaskRect() {
+ return mTaskRect;
+ }
+
+ public float getMaxOverscroll() {
+ return MAX_OVERSCROLL;
+ }
+
+ private int getTaskTopFromIndex(int index) {
+ return getTotalHeightOfTasks(index) - mTopOffset;
+ }
+
+ private int getTotalHeightOfTasks(int taskCount) {
+ return taskCount * mTaskRect.height() + (taskCount + 1) * mPadding;
+ }
+
+ private void fillStackTransform(TaskViewTransform transformOut, int y, int translationZ,
+ boolean visible) {
+ transformOut.scale = 1f;
+ transformOut.alpha = 1f;
+ transformOut.translationZ = translationZ;
+ transformOut.dimAlpha = 0f;
+ transformOut.viewOutlineAlpha = 1f;
+ transformOut.rect.set(getTaskRect());
+ transformOut.rect.offset(mPaddingLeftRight, y);
+ Utilities.scaleRectAboutCenter(transformOut.rect, transformOut.scale);
+ transformOut.visible = visible;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
index a2409d1..a35310f 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
@@ -46,6 +46,7 @@
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
+import android.os.PowerManager;
import android.os.Process;
import android.os.UserHandle;
import android.provider.MediaStore;
@@ -61,6 +62,7 @@
import android.view.WindowManager;
import android.view.animation.Interpolator;
import android.widget.ImageView;
+import android.widget.Toast;
import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
import com.android.systemui.R;
@@ -476,7 +478,6 @@
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT, 0, 0,
WindowManager.LayoutParams.TYPE_SCREENSHOT,
WindowManager.LayoutParams.FLAG_FULLSCREEN
- | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED,
PixelFormat.TRANSLUCENT);
@@ -679,6 +680,13 @@
*/
private void startAnimation(final Runnable finisher, int w, int h, boolean statusBarVisible,
boolean navBarVisible) {
+ // If power save is on, show a toast so there is some visual indication that a screenshot
+ // has been taken.
+ PowerManager powerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
+ if (powerManager.isPowerSaveMode()) {
+ Toast.makeText(mContext, R.string.screenshot_saved_title, Toast.LENGTH_SHORT).show();
+ }
+
// Add the view for the animation
mScreenshotView.setImageBitmap(mScreenBitmap);
mScreenshotLayout.requestFocus();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java
index 29b720c..68fe9a8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java
@@ -214,15 +214,24 @@
mFakeShadow = findViewById(R.id.fake_shadow);
mShadowHidden = mFakeShadow.getVisibility() != VISIBLE;
mBackgroundDimmed = findViewById(R.id.backgroundDimmed);
- mBackgroundNormal.setCustomBackground(R.drawable.notification_material_bg);
- mBackgroundDimmed.setCustomBackground(R.drawable.notification_material_bg_dim);
mDimmedAlpha = Color.alpha(mContext.getColor(
R.color.notification_material_background_dimmed_color));
+ initBackground();
updateBackground();
updateBackgroundTint();
updateOutlineAlpha();
}
+ /**
+ * Sets the custom backgrounds on {@link #mBackgroundNormal} and {@link #mBackgroundDimmed}.
+ * This method can also be used to reload the backgrounds on both of those views, which can
+ * be useful in a configuration change.
+ */
+ protected void initBackground() {
+ mBackgroundNormal.setCustomBackground(R.drawable.notification_material_bg);
+ mBackgroundDimmed.setCustomBackground(R.drawable.notification_material_bg_dim);
+ }
+
private final Runnable mTapTimeoutRunnable = new Runnable() {
@Override
public void run() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
index f9407dd..2e10831 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
@@ -79,6 +79,7 @@
private static final int MSG_DISMISS_KEYBOARD_SHORTCUTS = 32 << MSG_SHIFT;
private static final int MSG_HANDLE_SYSTEM_KEY = 33 << MSG_SHIFT;
private static final int MSG_SHOW_GLOBAL_ACTIONS = 34 << MSG_SHIFT;
+ private static final int MSG_TOGGLE_PANEL = 35 << MSG_SHIFT;
public static final int FLAG_EXCLUDE_NONE = 0;
public static final int FLAG_EXCLUDE_SEARCH_PANEL = 1 << 0;
@@ -104,6 +105,7 @@
default void disable(int state1, int state2, boolean animate) { }
default void animateExpandNotificationsPanel() { }
default void animateCollapsePanels(int flags) { }
+ default void togglePanel() { }
default void animateExpandSettingsPanel(String obj) { }
default void setSystemUiVisibility(int vis, int fullscreenStackVis,
int dockedStackVis, int mask, Rect fullscreenStackBounds, Rect dockedStackBounds) {
@@ -211,6 +213,13 @@
}
}
+ public void togglePanel() {
+ synchronized (mLock) {
+ mHandler.removeMessages(MSG_TOGGLE_PANEL);
+ mHandler.obtainMessage(MSG_TOGGLE_PANEL, 0, 0).sendToTarget();
+ }
+ }
+
public void animateExpandSettingsPanel(String subPanel) {
synchronized (mLock) {
mHandler.removeMessages(MSG_EXPAND_SETTINGS);
@@ -469,6 +478,11 @@
mCallbacks.get(i).animateCollapsePanels(msg.arg1);
}
break;
+ case MSG_TOGGLE_PANEL:
+ for (int i = 0; i < mCallbacks.size(); i++) {
+ mCallbacks.get(i).togglePanel();
+ }
+ break;
case MSG_EXPAND_SETTINGS:
for (int i = 0; i < mCallbacks.size(); i++) {
mCallbacks.get(i).animateExpandSettingsPanel((String) msg.obj);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
index 22c0b736..7bc1a39 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
@@ -861,6 +861,7 @@
public void onDensityOrFontScaleChanged() {
super.onDensityOrFontScaleChanged();
initDimens();
+ initBackground();
// Let's update our childrencontainer. This is intentionally not guarded with
// mIsSummaryWithChildren since we might have had children but not anymore.
if (mChildrenContainer != null) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java
index 0ea56b8..d370a63 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java
@@ -62,7 +62,7 @@
import com.android.internal.logging.nano.MetricsProto;
import com.android.settingslib.Utils;
import com.android.systemui.R;
-import com.android.systemui.recents.Recents;
+import com.android.systemui.recents.misc.SystemServicesProxy;
import java.util.ArrayList;
import java.util.Collections;
@@ -371,7 +371,7 @@
private void showKeyboardShortcuts(int deviceId) {
retrieveKeyCharacterMap(deviceId);
- Recents.getSystemServices().requestKeyboardShortcuts(mContext,
+ SystemServicesProxy.getInstance(mContext).requestKeyboardShortcuts(mContext,
new KeyboardShortcutsReceiver() {
@Override
public void onKeyboardShortcutsReceived(
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
index e5b1afe..68802b9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
@@ -107,7 +107,6 @@
* Resets the notification entry to be re-used.
*/
public void reset() {
- lastFullScreenIntentLaunchTime = NOT_LAUNCHED_YET;
if (row != null) {
row.reset();
}
@@ -122,6 +121,7 @@
}
public void notifyFullScreenIntentLaunched() {
+ setInterruption();
lastFullScreenIntentLaunchTime = SystemClock.elapsedRealtime();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java
index 1889806..41db927 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java
@@ -78,6 +78,9 @@
private boolean mNoAnimationsInThisFrame;
private boolean mAnimationsEnabled = true;
private boolean mShowNotificationShelf;
+ private boolean mVibrationOnAnimation;
+ private boolean mUserTouchingScreen;
+ private boolean mTouchActive;
public NotificationShelf(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -94,12 +97,24 @@
setClipChildren(false);
setClipToPadding(false);
mShelfIcons.setShowAllIcons(false);
+ mVibrationOnAnimation = mContext.getResources().getBoolean(
+ R.bool.config_vibrateOnIconAnimation);
+ updateVibrationOnAnimation();
mViewInvertHelper = new ViewInvertHelper(mShelfIcons,
NotificationPanelView.DOZE_ANIMATION_DURATION);
mShelfState = new ShelfState();
initDimens();
}
+ private void updateVibrationOnAnimation() {
+ mShelfIcons.setVibrateOnAnimation(mVibrationOnAnimation && mTouchActive);
+ }
+
+ public void setTouchActive(boolean touchActive) {
+ mTouchActive = touchActive;
+ updateVibrationOnAnimation();
+ }
+
public void bind(AmbientState ambientState, NotificationStackScrollLayout hostLayout) {
mAmbientState = ambientState;
mHostLayout = hostLayout;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
index f5dc038..cc4c313 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
@@ -141,6 +141,7 @@
private int mCachedContrastBackgroundColor = NO_COLOR;
private float[] mMatrix;
private ColorMatrixColorFilter mMatrixColorFilter;
+ private boolean mIsInShelf;
public StatusBarIconView(Context context, String slot, StatusBarNotification sbn) {
this(context, slot, sbn, false);
@@ -795,6 +796,14 @@
}
}
+ public void setIsInShelf(boolean isInShelf) {
+ mIsInShelf = isInShelf;
+ }
+
+ public boolean isInShelf() {
+ return mIsInShelf;
+ }
+
public interface OnVisibilityChangedListener {
void onVisibilityChanged(int newVisibility);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
index 76177a3..680f693 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
@@ -51,7 +51,14 @@
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.UserSwitcherController;
+import com.android.keyguard.KeyguardUpdateMonitor;
+import com.android.systemui.classifier.FalsingLog;
+import com.android.systemui.classifier.FalsingManager;
+import com.android.systemui.Prefs;
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.util.Map;
/**
* A status bar (and navigation bar) tailored for the automotive use case.
*/
@@ -69,8 +76,10 @@
private Drawable mNotificationPanelBackground;
private ConnectedDeviceSignalController mConnectedDeviceSignalController;
+ private ViewGroup mNavigationBarWindow;
private CarNavigationBarView mNavigationBarView;
+ private final Object mQueueLock = new Object();
@Override
public void start() {
super.start();
@@ -89,6 +98,11 @@
mCarBatteryController.stopListening();
mConnectedDeviceSignalController.stopListening();
+ if (mNavigationBarWindow != null) {
+ mWindowManager.removeViewImmediate(mNavigationBarWindow);
+ mNavigationBarView = null;
+ }
+
super.destroy();
}
@@ -145,10 +159,19 @@
// SystemUI requires that the navigation bar view have a parent. Since the regular
// StatusBar inflates navigation_bar_window as this parent view, use the same view for the
// CarNavigationBarView.
- ViewGroup navigationBarWindow = (ViewGroup) View.inflate(mContext,
+ mNavigationBarWindow = (ViewGroup) View.inflate(mContext,
R.layout.navigation_bar_window, null);
- View.inflate(mContext, R.layout.car_navigation_bar, navigationBarWindow);
- mNavigationBarView = (CarNavigationBarView) navigationBarWindow.getChildAt(0);
+ if (mNavigationBarWindow == null) {
+ Log.e(TAG, "CarStatusBar failed inflate for R.layout.navigation_bar_window");
+ }
+
+
+ View.inflate(mContext, R.layout.car_navigation_bar, mNavigationBarWindow);
+ mNavigationBarView = (CarNavigationBarView) mNavigationBarWindow.getChildAt(0);
+ if (mNavigationBarView == null) {
+ Log.e(TAG, "CarStatusBar failed inflate for R.layout.car_navigation_bar");
+ }
+
mController = new CarNavigationBarController(mContext, mNavigationBarView,
this /* ActivityStarter*/);
@@ -160,13 +183,49 @@
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
- | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
- | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
+ | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
PixelFormat.TRANSLUCENT);
lp.setTitle("CarNavigationBar");
lp.windowAnimations = 0;
- mWindowManager.addView(navigationBarWindow, lp);
+ mWindowManager.addView(mNavigationBarWindow, lp);
+ }
+
+ @Override
+ public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ //When executing dump() funciton simultaneously, we need to serialize them
+ //to get mStackScroller's position correctly.
+ synchronized (mQueueLock) {
+ pw.println(" mStackScroller: " + viewInfo(mStackScroller));
+ pw.println(" mStackScroller: " + viewInfo(mStackScroller)
+ + " scroll " + mStackScroller.getScrollX()
+ + "," + mStackScroller.getScrollY());
+ }
+
+ pw.print(" mTaskStackListener="); pw.println(mTaskStackListener);
+ pw.print(" mController=");
+ pw.println(mController);
+ pw.print(" mFullscreenUserSwitcher="); pw.println(mFullscreenUserSwitcher);
+ pw.print(" mCarBatteryController=");
+ pw.println(mCarBatteryController);
+ pw.print(" mBatteryMeterView=");
+ pw.println(mBatteryMeterView);
+ pw.print(" mConnectedDeviceSignalController=");
+ pw.println(mConnectedDeviceSignalController);
+ pw.print(" mNavigationBarView=");
+ pw.println(mNavigationBarView);
+
+ if (KeyguardUpdateMonitor.getInstance(mContext) != null) {
+ KeyguardUpdateMonitor.getInstance(mContext).dump(fd, pw, args);
+ }
+
+ FalsingManager.getInstance(mContext).dump(pw);
+ FalsingLog.dump(pw);
+
+ pw.println("SharedPreferences:");
+ for (Map.Entry<String, ?> entry : Prefs.getAll(mContext).entrySet()) {
+ pw.print(" "); pw.print(entry.getKey()); pw.print("="); pw.println(entry.getValue());
+ }
}
@Override
@@ -175,6 +234,11 @@
}
@Override
+ public View getNavigationBarWindow() {
+ return mNavigationBarWindow;
+ }
+
+ @Override
protected View.OnTouchListener getStatusBarWindowTouchListener() {
// Usually, a touch on the background window will dismiss the notification shade. However,
// for the car use-case, the shade should remain unless the user switches to a different
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java
index 9338887..6060134 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java
@@ -74,6 +74,15 @@
automaticallySelectUser();
});
+ // Any interaction with the screen should cancel the timer.
+ mContainer.setOnClickListener(v -> {
+ cancelTimer();
+ });
+ mUserGridView.setOnTouchListener((v, e) -> {
+ cancelTimer();
+ return false;
+ });
+
mSwitchingUsers = mParent.findViewById(R.id.switching_users);
}
@@ -152,6 +161,7 @@
if (mTimer != null) {
mTimer.cancel();
mTimer = null;
+ mProgressBar.setProgress(0, true /* animate */);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/PageIndicator.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/PageIndicator.java
index f7d0906..c830ff8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/car/PageIndicator.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/PageIndicator.java
@@ -98,6 +98,11 @@
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
+ // Don't draw anything unless there's multiple pages to scroll through. No need to clear
+ // any previous dots, since onDraw provides a canvas that's already cleared.
+ if (mPageCount <= 1)
+ return;
+
int x = canvas.getWidth() / 2 - (mPageCount / 2) * mStep;
int y = canvas.getHeight() / 2;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ConfigurationControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ConfigurationControllerImpl.java
index 37554c4..6f53844 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ConfigurationControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ConfigurationControllerImpl.java
@@ -37,12 +37,17 @@
private final Configuration mLastConfig = new Configuration();
private int mDensity;
private float mFontScale;
+ private boolean mInCarMode;
+ private int mUiMode;
private LocaleList mLocaleList;
public ConfigurationControllerImpl(Context context) {
Configuration currentConfig = context.getResources().getConfiguration();
mFontScale = currentConfig.fontScale;
mDensity = currentConfig.densityDpi;
+ mInCarMode = (currentConfig.uiMode & Configuration.UI_MODE_TYPE_MASK)
+ == Configuration.UI_MODE_TYPE_CAR;
+ mUiMode = currentConfig.uiMode & Configuration.UI_MODE_NIGHT_MASK;
mLocaleList = currentConfig.getLocales();
}
@@ -58,7 +63,9 @@
});
final float fontScale = newConfig.fontScale;
final int density = newConfig.densityDpi;
- if (density != mDensity || mFontScale != fontScale) {
+ int uiMode = newConfig.uiMode & Configuration.UI_MODE_NIGHT_MASK;
+ if (density != mDensity || fontScale != mFontScale
+ || (mInCarMode && uiMode != mUiMode)) {
listeners.forEach(l -> {
if (mListeners.contains(l)) {
l.onDensityOrFontScaleChanged();
@@ -66,6 +73,7 @@
});
mDensity = density;
mFontScale = fontScale;
+ mUiMode = uiMode;
}
final LocaleList localeList = newConfig.getLocales();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
index fbad937..c44e1db 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
@@ -544,7 +544,8 @@
private boolean onLongPressRecents() {
if (mRecents == null || !ActivityManager.supportsMultiWindow(getContext())
- || !mDivider.getView().getSnapAlgorithm().isSplitScreenFeasible()) {
+ || !mDivider.getView().getSnapAlgorithm().isSplitScreenFeasible()
+ || Recents.getConfiguration().isLowRamDevice) {
return false;
}
@@ -676,10 +677,6 @@
| WindowManager.LayoutParams.FLAG_SLIPPERY,
PixelFormat.TRANSLUCENT);
lp.token = new Binder();
- // this will allow the navbar to run in an overlay on devices that support this
- if (ActivityManager.isHighEndGfx()) {
- lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
- }
lp.setTitle("NavigationBar");
lp.windowAnimations = 0;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java
index aaa31b6..4e79314b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java
@@ -131,9 +131,6 @@
mRot90.setId(R.id.rot90);
addView(mRot90);
updateAlternativeOrder();
- if (getParent() instanceof NavigationBarView) {
- ((NavigationBarView) getParent()).updateRotatedViews();
- }
}
protected String getDefaultLayout() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
index d116bbf3..57c8827 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
@@ -560,15 +560,15 @@
public void onFinishInflate() {
mNavigationInflaterView = (NavigationBarInflaterView) findViewById(
R.id.navigation_inflater);
- updateRotatedViews();
mNavigationInflaterView.setButtonDispatchers(mButtonDispatchers);
getImeSwitchButton().setOnClickListener(mImeSwitcherClickListener);
DockedStackExistsListener.register(mDockedListener);
+ updateRotatedViews();
}
- void updateRotatedViews() {
+ private void updateRotatedViews() {
mRotatedViews[Surface.ROTATION_0] =
mRotatedViews[Surface.ROTATION_180] = findViewById(R.id.rot0);
mRotatedViews[Surface.ROTATION_270] =
@@ -609,6 +609,7 @@
updateCurrentView();
mDeadZone = (DeadZone) mCurrentView.findViewById(R.id.deadzone);
+
((NavigationBarFrame) getRootView()).setDeadZone(mDeadZone);
mDeadZone.setDisplayRotation(mCurrentRotation);
@@ -749,6 +750,7 @@
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
+ reorient();
onPluginDisconnected(null); // Create default gesture helper
Dependency.get(PluginManager.class).addPluginListener(this,
NavGesture.class, false /* Only one */);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
index 6f5ad96..e0d9748 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
@@ -22,6 +22,8 @@
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.drawable.Icon;
+import android.os.VibrationEffect;
+import android.os.Vibrator;
import android.support.v4.util.ArrayMap;
import android.support.v4.util.ArraySet;
import android.util.AttributeSet;
@@ -122,6 +124,8 @@
private float mVisualOverflowAdaption;
private boolean mDisallowNextAnimation;
private boolean mAnimationsEnabled = true;
+ private boolean mVibrateOnAnimation;
+ private Vibrator mVibrator;
private ArrayMap<String, ArrayList<StatusBarIcon>> mReplacingIcons;
private int mDarkOffsetX;
@@ -129,6 +133,7 @@
super(context, attrs);
initDimens();
setWillNotDraw(!DEBUG);
+ mVibrator = mContext.getSystemService(Vibrator.class);
}
private void initDimens() {
@@ -499,6 +504,10 @@
return width - (getWidth() - getActualPaddingStart() - getActualPaddingEnd()) > 0;
}
+ public void setVibrateOnAnimation(boolean vibrateOnAnimation) {
+ mVibrateOnAnimation = vibrateOnAnimation;
+ }
+
public int getIconSize() {
return mIconSize;
}
@@ -517,14 +526,14 @@
mAnimationsEnabled = enabled;
}
- public void setReplacingIcons(ArrayMap<String, ArrayList<StatusBarIcon>> replacingIcons) {
- mReplacingIcons = replacingIcons;
- }
-
public void setDarkOffsetX(int offsetX) {
mDarkOffsetX = offsetX;
}
+ public void setReplacingIcons(ArrayMap<String, ArrayList<StatusBarIcon>> replacingIcons) {
+ mReplacingIcons = replacingIcons;
+ }
+
public class IconState extends ViewState {
public static final int NO_VALUE = NotificationIconContainer.NO_VALUE;
public float iconAppearAmount = 1.0f;
@@ -611,6 +620,13 @@
} else {
super.applyToView(view);
}
+ boolean wasInShelf = icon.isInShelf();
+ boolean inShelf = iconAppearAmount == 1.0f;
+ icon.setIsInShelf(inShelf);
+ if (mVibrateOnAnimation && !justAdded && mAnimationsEnabled
+ && wasInShelf != inShelf) {
+ mVibrator.vibrate(VibrationEffect.get(VibrationEffect.EFFECT_TICK));
+ }
}
justAdded = false;
justReplaced = false;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
index cca6ae0..04be357 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -153,7 +153,6 @@
protected int mQsMinExpansionHeight;
protected int mQsMaxExpansionHeight;
private int mQsPeekHeight;
- private boolean mQsOverscrollExpansionEnabled;
private boolean mStackScrollerOverscrolling;
private boolean mQsExpansionFromOverscroll;
private float mLastOverscroll;
@@ -243,8 +242,6 @@
super(context, attrs);
setWillNotDraw(!DEBUG);
mFalsingManager = FalsingManager.getInstance(context);
- mQsOverscrollExpansionEnabled =
- getResources().getBoolean(R.bool.config_enableQuickSettingsOverscrollExpansion);
}
public void setStatusBar(StatusBar bar) {
@@ -673,7 +670,7 @@
return true;
}
- if (mQsOverscrollExpansionEnabled && !isFullyCollapsed() && onQsIntercept(event)) {
+ if (!isFullyCollapsed() && onQsIntercept(event)) {
return true;
}
return super.onInterceptTouchEvent(event);
@@ -848,8 +845,7 @@
}
handled |= mHeadsUpTouchHelper.onTouchEvent(event);
- if (mQsOverscrollExpansionEnabled && !mHeadsUpTouchHelper.isTrackingHeadsUp()
- && handleQsTouch(event)) {
+ if (!mHeadsUpTouchHelper.isTrackingHeadsUp() && handleQsTouch(event)) {
return true;
}
if (event.getActionMasked() == MotionEvent.ACTION_DOWN && isFullyCollapsed()) {
@@ -1033,10 +1029,6 @@
@Override
public void onOverscrollTopChanged(float amount, boolean isRubberbanded) {
- if (!mQsOverscrollExpansionEnabled) {
- return;
- }
-
cancelQsAnimation();
if (!mQsExpansionEnabled) {
amount = 0f;
@@ -1051,10 +1043,6 @@
@Override
public void flingTopOverscroll(float velocity, boolean open) {
- if (!mQsOverscrollExpansionEnabled) {
- return;
- }
-
mLastOverscroll = 0f;
mQsExpansionFromOverscroll = false;
setQsExpansion(mQsExpansionHeight);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
index 16d85be..d3ee550 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
@@ -24,6 +24,8 @@
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.SystemClock;
+import android.os.VibrationEffect;
+import android.os.Vibrator;
import android.util.AttributeSet;
import android.util.Log;
import android.view.InputDevice;
@@ -98,6 +100,7 @@
private FlingAnimationUtils mFlingAnimationUtilsClosing;
private FlingAnimationUtils mFlingAnimationUtilsDismissing;
private FalsingManager mFalsingManager;
+ private final Vibrator mVibrator;
/**
* Whether an instant expand request is currently pending and we are just waiting for layout.
@@ -199,6 +202,7 @@
mFalsingManager = FalsingManager.getInstance(context);
mNotificationsDragEnabled =
getResources().getBoolean(R.bool.config_enableNotificationShadeDrag);
+ mVibrator = mContext.getSystemService(Vibrator.class);
}
protected void loadDimens() {
@@ -390,6 +394,7 @@
runPeekAnimation(INITIAL_OPENING_PEEK_DURATION, getOpeningHeight(),
false /* collapseWhenFinished */);
notifyBarPanelExpansionChanged();
+ mVibrator.vibrate(VibrationEffect.get(VibrationEffect.EFFECT_CLICK));
}
protected abstract float getOpeningHeight();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
index d1ef035..4ae1393 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
@@ -491,7 +491,8 @@
boolean isManagedProfile = mUserManager.isManagedProfile(userId);
mHandler.post(() -> {
final boolean showIcon;
- if (isManagedProfile && !mKeyguardMonitor.isShowing()) {
+ if (isManagedProfile &&
+ (!mKeyguardMonitor.isShowing() || mKeyguardMonitor.isOccluded())) {
showIcon = true;
mIconController.setIcon(mSlotManagedProfile,
R.drawable.stat_sys_managed_profile_status,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index 0b57e7c..0d6c383 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -190,6 +190,7 @@
import com.android.systemui.qs.QSFragment;
import com.android.systemui.qs.QSPanel;
import com.android.systemui.qs.QSTileHost;
+import com.android.systemui.qs.car.CarQSFragment;
import com.android.systemui.recents.Recents;
import com.android.systemui.recents.ScreenPinningRequest;
import com.android.systemui.recents.events.EventBus;
@@ -1169,6 +1170,7 @@
ExtensionFragmentListener.attachExtensonToFragment(container, QS.TAG, R.id.qs_frame,
Dependency.get(ExtensionController.class).newExtension(QS.class)
.withPlugin(QS.class)
+ .withUiMode(UI_MODE_TYPE_CAR, () -> new CarQSFragment())
.withDefault(() -> new QSFragment())
.build());
final QSTileHost qsh = SystemUIFactory.getInstance().createQSTileHost(mContext, this,
@@ -3023,6 +3025,15 @@
}
@Override
+ public void togglePanel() {
+ if (mPanelExpanded) {
+ animateCollapsePanels();
+ } else {
+ animateExpandNotificationsPanel();
+ }
+ }
+
+ @Override
public void animateCollapsePanels(int flags) {
animateCollapsePanels(flags, false /* force */, false /* delayed */,
1.0f /* speedUpFactor */);
@@ -7117,7 +7128,8 @@
// If mAlwaysExpandNonGroupedNotification is false, then only expand the
// very first notification and if it's not a child of grouped notifications.
row.setSystemExpanded(mAlwaysExpandNonGroupedNotification
- || (visibleNotifications == 0 && !isChildNotification));
+ || (visibleNotifications == 0 && !isChildNotification
+ && !row.isLowPriority()));
}
entry.row.setShowAmbient(isDozing());
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java
index d886508..eaa6a33 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java
@@ -99,7 +99,6 @@
| WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
PixelFormat.TRANSLUCENT);
mLp.token = new Binder();
- mLp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
mLp.gravity = Gravity.TOP;
mLp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
mLp.setTitle("StatusBar");
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
index adc33a1..0dcf6d2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
@@ -246,6 +246,11 @@
return false;
}
+ public void setTouchActive(boolean touchActive) {
+ mTouchActive = touchActive;
+ mStackScrollLayout.setTouchActive(touchActive);
+ }
+
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
boolean isDown = ev.getActionMasked() == MotionEvent.ACTION_DOWN;
@@ -253,11 +258,11 @@
mNotificationPanel.startExpandLatencyTracking();
}
if (isDown) {
- mTouchActive = true;
+ setTouchActive(true);
mTouchCancelled = false;
} else if (ev.getActionMasked() == MotionEvent.ACTION_UP
|| ev.getActionMasked() == MotionEvent.ACTION_CANCEL) {
- mTouchActive = false;
+ setTouchActive(false);
}
if (mTouchCancelled) {
return false;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java
index dc4b115..fc74952 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java
@@ -75,6 +75,8 @@
@Override
public boolean canConfigBluetooth() {
return !mUserManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_BLUETOOTH,
+ UserHandle.of(mCurrentUser))
+ && !mUserManager.hasUserRestriction(UserManager.DISALLOW_BLUETOOTH,
UserHandle.of(mCurrentUser));
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java
index 6df2051..cc10775 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java
@@ -274,7 +274,8 @@
public UiModeItem(int uiMode, Supplier<T> supplier) {
mDesiredUiMode = uiMode;
mSupplier = supplier;
- mUiMode = mDefaultContext.getResources().getConfiguration().uiMode;
+ mUiMode = mDefaultContext.getResources().getConfiguration().uiMode
+ & Configuration.UI_MODE_TYPE_MASK;
Dependency.get(ConfigurationController.class).addCallback(this);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitorImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitorImpl.java
index 7bce33a..5ead02f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitorImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitorImpl.java
@@ -58,6 +58,7 @@
};
}
+ @Override
public void addCallback(Callback callback) {
mCallbacks.add(callback);
if (mCallbacks.size() != 0 && !mListening) {
@@ -69,6 +70,7 @@
}
}
+ @Override
public void removeCallback(Callback callback) {
if (mCallbacks.remove(callback) && mCallbacks.size() == 0 && mListening) {
mListening = false;
@@ -77,18 +79,22 @@
}
}
+ @Override
public boolean isShowing() {
return mShowing;
}
+ @Override
public boolean isSecure() {
return mSecure;
}
+ @Override
public boolean isOccluded() {
return mOccluded;
}
+ @Override
public boolean canSkipBouncer() {
return mCanSkipBouncer;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
index 4bbe895..472e30c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
@@ -4311,6 +4311,10 @@
mAmbientState.getScrollY()));
}
+ public void setTouchActive(boolean touchActive) {
+ mShelf.setTouchActive(touchActive);
+ }
+
/**
* A listener that is notified when some child locations might have changed.
*/
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerActivity.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerActivity.java
index 9c69b98..474a9a4 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/TunerActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerActivity.java
@@ -33,8 +33,6 @@
PreferenceFragment.OnPreferenceStartFragmentCallback,
PreferenceFragment.OnPreferenceStartScreenCallback {
- static final String ACTIVITY_ALIAS_NAME = "com.android.systemui.tuner.TunerSettingLink";
-
private static final String TAG_TUNER = "tuner";
protected void onCreate(Bundle savedInstanceState) {
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerService.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerService.java
index 369ce69..3a9d1c7 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/TunerService.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerService.java
@@ -68,12 +68,6 @@
enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
: PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
-
- userContext(context).getPackageManager().setComponentEnabledSetting(
- new ComponentName(context, TunerActivity.ACTIVITY_ALIAS_NAME),
- enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
- : PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
- PackageManager.DONT_KILL_APP);
}
public static final boolean isTunerEnabled(Context context) {
diff --git a/packages/SystemUI/src/com/android/systemui/volume/Util.java b/packages/SystemUI/src/com/android/systemui/volume/Util.java
index a46a44d..c6d6218 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/Util.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/Util.java
@@ -78,6 +78,7 @@
}
public static String mediaMetadataToString(MediaMetadata metadata) {
+ if (metadata == null) return null;
return metadata.getDescription().toString();
}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
index 9e50e81..fe3d4b7 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
@@ -25,7 +25,6 @@
import android.annotation.SuppressLint;
import android.app.Dialog;
import android.app.KeyguardManager;
-import android.app.WallpaperManager;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.res.ColorStateList;
@@ -33,7 +32,6 @@
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.PixelFormat;
-import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.drawable.AnimatedVectorDrawable;
import android.graphics.drawable.ColorDrawable;
@@ -78,10 +76,10 @@
import com.android.systemui.Dependency;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.plugins.VolumeDialog;
import com.android.systemui.plugins.VolumeDialogController;
import com.android.systemui.plugins.VolumeDialogController.State;
import com.android.systemui.plugins.VolumeDialogController.StreamState;
-import com.android.systemui.plugins.VolumeDialog;
import com.android.systemui.statusbar.policy.ZenModeController;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.tuner.TunerZenModePanel;
@@ -107,7 +105,7 @@
private final Context mContext;
private final H mHandler = new H();
- private VolumeDialogController mController;
+ private final VolumeDialogController mController;
private Window mWindow;
private CustomDialog mDialog;
@@ -231,8 +229,9 @@
return true;
}
});
- mDialogContentView = (ViewGroup) mDialog.findViewById(R.id.volume_dialog_content);
- mDialogRowsView = (ViewGroup) mDialogContentView.findViewById(R.id.volume_dialog_rows);
+
+ mDialogContentView = mDialog.findViewById(R.id.volume_dialog_content);
+ mDialogRowsView = mDialogContentView.findViewById(R.id.volume_dialog_rows);
mExpanded = false;
mExpandButton = (ImageButton) mDialogView.findViewById(R.id.volume_expand_button);
mExpandButton.setOnClickListener(mClickExpand);
@@ -585,7 +584,7 @@
final VolumeRow activeRow = getActiveRow();
if (!dismissing) {
mWindow.setLayout(mWindow.getAttributes().width, ViewGroup.LayoutParams.MATCH_PARENT);
- TransitionManager.beginDelayedTransition(mDialogView, getTransistion());
+ TransitionManager.beginDelayedTransition(mDialogView, getTransition());
}
updateRowsH(activeRow);
rescheduleTimeoutH();
@@ -703,7 +702,7 @@
final boolean visible = mState.zenMode != Global.ZEN_MODE_OFF
&& (mAudioManager.isStreamAffectedByRingerMode(mActiveStream) || mExpanded)
&& !mZenPanel.isEditing();
- TransitionManager.beginDelayedTransition(mDialogView, getTransistion());
+ TransitionManager.beginDelayedTransition(mDialogView, getTransition());
if (wasVisible != visible && !visible) {
prepareForCollapse();
}
@@ -957,7 +956,7 @@
}
}
- private AutoTransition getTransistion() {
+ private AutoTransition getTransition() {
AutoTransition transition = new AutoTransition();
transition.setDuration(mExpandButtonAnimationDuration);
transition.setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN);
diff --git a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java
index 4716552..a3aca6e 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java
@@ -41,6 +41,7 @@
import android.util.AttributeSet;
import android.util.Log;
import android.util.MathUtils;
+import android.util.Slog;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -53,6 +54,7 @@
import android.widget.RadioGroup;
import android.widget.TextView;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.systemui.Prefs;
@@ -116,8 +118,6 @@
private Callback mCallback;
private ZenModeController mController;
- private boolean mCountdownConditionSupported;
- private boolean mRequestingConditions;
private Condition mExitCondition;
private int mBucketIndex = -1;
private boolean mExpanded;
@@ -126,8 +126,6 @@
private int mAttachedZen;
private boolean mAttached;
private Condition mSessionExitCondition;
- private Condition[] mConditions;
- private Condition mTimeCondition;
private boolean mVoiceCapable;
protected int mZenModeConditionLayoutId;
@@ -155,8 +153,6 @@
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
pw.println("ZenModePanel state:");
- pw.print(" mCountdownConditionSupported="); pw.println(mCountdownConditionSupported);
- pw.print(" mRequestingConditions="); pw.println(mRequestingConditions);
pw.print(" mAttached="); pw.println(mAttached);
pw.print(" mHidden="); pw.println(mHidden);
pw.print(" mExpanded="); pw.println(mExpanded);
@@ -292,7 +288,6 @@
private void onAttach() {
setExpanded(true);
- mAttached = true;
mAttachedZen = mController.getZen();
ZenRule manualRule = mController.getManualRule();
mExitCondition = manualRule != null ? manualRule.condition : null;
@@ -304,23 +299,26 @@
mController.addCallback(mZenCallback);
setSessionExitCondition(copy(mExitCondition));
updateWidgets();
- setRequestingConditions(!mHidden);
- ensureSelection();
+ setAttached(true);
}
private void onDetach() {
if (DEBUG) Log.d(mTag, "onDetach");
setExpanded(false);
checkForAttachedZenChange();
- mAttached = false;
+ setAttached(false);
mAttachedZen = -1;
mSessionZen = -1;
mController.removeCallback(mZenCallback);
setSessionExitCondition(null);
- setRequestingConditions(false);
mTransitionHelper.clear();
}
+ @VisibleForTesting
+ void setAttached(boolean attached) {
+ mAttached = attached;
+ }
+
@Override
public void onVisibilityAggregated(boolean isVisible) {
super.onVisibilityAggregated(isVisible);
@@ -342,7 +340,6 @@
if (mHidden == hidden) return;
if (DEBUG) Log.d(mTag, "hidden=" + hidden);
mHidden = hidden;
- setRequestingConditions(mAttached && !mHidden);
updateWidgets();
}
@@ -365,29 +362,6 @@
fireExpanded();
}
- /** Start or stop requesting relevant zen mode exit conditions */
- private void setRequestingConditions(final boolean requesting) {
- if (mRequestingConditions == requesting) return;
- if (DEBUG) Log.d(mTag, "setRequestingConditions " + requesting);
- mRequestingConditions = requesting;
- if (mRequestingConditions) {
- mTimeCondition = parseExistingTimeCondition(mContext, mExitCondition);
- if (mTimeCondition != null) {
- mBucketIndex = -1;
- } else {
- mBucketIndex = DEFAULT_BUCKET_INDEX;
- mTimeCondition = ZenModeConfig.toTimeCondition(mContext,
- MINUTE_BUCKETS[mBucketIndex], ActivityManager.getCurrentUser());
- }
- if (DEBUG) Log.d(mTag, "Initial bucket index: " + mBucketIndex);
-
- mConditions = null; // reset conditions
- handleUpdateConditions();
- } else {
- hideAllConditions();
- }
- }
-
protected void addZenConditions(int count) {
for (int i = 0; i < count; i++) {
final View rb = mInflater.inflate(mZenModeButtonLayoutId, mEdit, false);
@@ -401,9 +375,7 @@
public void init(ZenModeController controller) {
mController = controller;
- mCountdownConditionSupported = mController.isCountdownConditionSupported();
- final int countdownDelta = mCountdownConditionSupported ? COUNTDOWN_CONDITION_COUNT : 0;
- final int minConditions = 1 /*forever*/ + countdownDelta;
+ final int minConditions = 1 /*forever*/ + COUNTDOWN_CONDITION_COUNT;
addZenConditions(minConditions);
mSessionZen = getSelectedZen(-1);
handleUpdateManualRule(mController.getManualRule());
@@ -426,10 +398,6 @@
return isForever(condition) ? null : getConditionId(condition);
}
- private static boolean sameConditionId(Condition lhs, Condition rhs) {
- return lhs == null ? rhs == null : rhs != null && lhs.id.equals(rhs.id);
- }
-
private static Condition copy(Condition condition) {
return condition == null ? null : condition.copy();
}
@@ -438,17 +406,24 @@
mCallback = callback;
}
- private void handleUpdateManualRule(ZenRule rule) {
+ @VisibleForTesting
+ void handleUpdateManualRule(ZenRule rule) {
final int zen = rule != null ? rule.zenMode : Global.ZEN_MODE_OFF;
handleUpdateZen(zen);
final Condition c = rule == null ? null
: rule.condition != null ? rule.condition
: createCondition(rule.conditionId);
- handleExitConditionChanged(c);
+ handleUpdateConditions(c);
+ setExitCondition(c);
}
private Condition createCondition(Uri conditionId) {
- if (ZenModeConfig.isValidCountdownConditionId(conditionId)) {
+ if (ZenModeConfig.isValidCountdownToAlarmConditionId(conditionId)) {
+ long time = ZenModeConfig.tryParseCountdownConditionId(conditionId);
+ Condition c = ZenModeConfig.toNextAlarmCondition(
+ mContext, time, ActivityManager.getCurrentUser());
+ return c;
+ } else if (ZenModeConfig.isValidCountdownConditionId(conditionId)) {
long time = ZenModeConfig.tryParseCountdownConditionId(conditionId);
int mins = (int) ((time - System.currentTimeMillis() + DateUtils.MINUTE_IN_MILLIS / 2)
/ DateUtils.MINUTE_IN_MILLIS);
@@ -466,48 +441,10 @@
}
mZenButtons.setSelectedValue(zen, false /* fromClick */);
updateWidgets();
- handleUpdateConditions();
- if (mExpanded) {
- final Condition selected = getSelectedCondition();
- if (!Objects.equals(mExitCondition, selected)) {
- select(selected);
- }
- }
}
- private void handleExitConditionChanged(Condition exitCondition) {
- setExitCondition(exitCondition);
- if (DEBUG) Log.d(mTag, "handleExitConditionChanged " + mExitCondition);
- if (exitCondition == null) return;
- final int N = getVisibleConditions();
- for (int i = 0; i < N; i++) {
- final ConditionTag tag = getConditionTagAt(i);
- if (tag != null && sameConditionId(tag.condition, mExitCondition)) {
- bind(exitCondition, mZenRadioGroupContent.getChildAt(i), i);
- tag.rb.setChecked(true);
- return;
- }
- }
- if (mCountdownConditionSupported && ZenModeConfig.isValidCountdownConditionId(
- exitCondition.id)) {
- bind(exitCondition, mZenRadioGroupContent.getChildAt(COUNTDOWN_CONDITION_INDEX),
- COUNTDOWN_CONDITION_INDEX);
- getConditionTagAt(COUNTDOWN_CONDITION_INDEX).rb.setChecked(true);
- }
- }
-
- private Condition getSelectedCondition() {
- final int N = getVisibleConditions();
- for (int i = 0; i < N; i++) {
- final ConditionTag tag = getConditionTagAt(i);
- if (tag != null && tag.rb.isChecked()) {
- return tag.condition;
- }
- }
- return null;
- }
-
- private int getSelectedZen(int defValue) {
+ @VisibleForTesting
+ int getSelectedZen(int defValue) {
final Object zen = mZenButtons.getSelectedValue();
return zen != null ? (Integer) zen : defValue;
}
@@ -575,56 +512,66 @@
return getResources().getString(warningRes, template);
}
- private static Condition parseExistingTimeCondition(Context context, Condition condition) {
- if (condition == null) return null;
- final long time = ZenModeConfig.tryParseCountdownConditionId(condition.id);
- if (time == 0) return null;
- final long now = System.currentTimeMillis();
- final long span = time - now;
- if (span <= 0 || span > MAX_BUCKET_MINUTES * MINUTES_MS) return null;
- return ZenModeConfig.toTimeCondition(context,
- time, Math.round(span / (float) MINUTES_MS), ActivityManager.getCurrentUser(),
- false /*shortVersion*/);
- }
-
- private void handleUpdateConditions() {
+ @VisibleForTesting
+ void handleUpdateConditions(Condition c) {
if (mTransitionHelper.isTransitioning()) {
return;
}
- final int conditionCount = mConditions == null ? 0 : mConditions.length;
- if (DEBUG) Log.d(mTag, "handleUpdateConditions conditionCount=" + conditionCount);
// forever
bind(forever(), mZenRadioGroupContent.getChildAt(FOREVER_CONDITION_INDEX),
FOREVER_CONDITION_INDEX);
- // countdown
- if (mCountdownConditionSupported && mTimeCondition != null) {
- bind(mTimeCondition, mZenRadioGroupContent.getChildAt(COUNTDOWN_CONDITION_INDEX),
- COUNTDOWN_CONDITION_INDEX);
- }
- // countdown until alarm
- if (mCountdownConditionSupported) {
- Condition nextAlarmCondition = getTimeUntilNextAlarmCondition();
- if (nextAlarmCondition != null) {
- mZenRadioGroup.getChildAt(
- COUNTDOWN_ALARM_CONDITION_INDEX).setVisibility(View.VISIBLE);
- mZenRadioGroupContent.getChildAt(
- COUNTDOWN_ALARM_CONDITION_INDEX).setVisibility(View.VISIBLE);
- bind(nextAlarmCondition,
- mZenRadioGroupContent.getChildAt(COUNTDOWN_ALARM_CONDITION_INDEX),
- COUNTDOWN_ALARM_CONDITION_INDEX);
+ if (c == null) {
+ bindGenericCountdown();
+ bindNextAlarm(getTimeUntilNextAlarmCondition());
+ } else if (isForever(c)) {
+ getConditionTagAt(FOREVER_CONDITION_INDEX).rb.setChecked(true);
+ bindGenericCountdown();
+ bindNextAlarm(getTimeUntilNextAlarmCondition());
+ } else {
+ if (isAlarm(c)) {
+ bindGenericCountdown();
+
+ bindNextAlarm(c);
+ getConditionTagAt(COUNTDOWN_ALARM_CONDITION_INDEX).rb.setChecked(true);
+ } else if (isCountdown(c)) {
+ bindNextAlarm(getTimeUntilNextAlarmCondition());
+
+ bind(c, mZenRadioGroupContent.getChildAt(COUNTDOWN_CONDITION_INDEX),
+ COUNTDOWN_CONDITION_INDEX);
+ getConditionTagAt(COUNTDOWN_CONDITION_INDEX).rb.setChecked(true);
} else {
- mZenRadioGroup.getChildAt(COUNTDOWN_ALARM_CONDITION_INDEX).setVisibility(View.GONE);
- mZenRadioGroupContent.getChildAt(
- COUNTDOWN_ALARM_CONDITION_INDEX).setVisibility(View.GONE);
+ Slog.wtf(TAG, "Invalid manual condition: " + c);
}
}
- // ensure something is selected
- if (mExpanded) {
- ensureSelection();
- }
mZenConditions.setVisibility(mSessionZen != Global.ZEN_MODE_OFF ? View.VISIBLE : View.GONE);
}
+ private void bindGenericCountdown() {
+ mBucketIndex = DEFAULT_BUCKET_INDEX;
+ Condition countdown = ZenModeConfig.toTimeCondition(mContext,
+ MINUTE_BUCKETS[mBucketIndex], ActivityManager.getCurrentUser());
+ // don't change the hour condition while the user is viewing the panel
+ if (!mAttached || getConditionTagAt(COUNTDOWN_CONDITION_INDEX).condition == null) {
+ bind(countdown, mZenRadioGroupContent.getChildAt(COUNTDOWN_CONDITION_INDEX),
+ COUNTDOWN_CONDITION_INDEX);
+ }
+ }
+
+ private void bindNextAlarm(Condition c) {
+ View alarmContent = mZenRadioGroupContent.getChildAt(COUNTDOWN_ALARM_CONDITION_INDEX);
+ ConditionTag tag = (ConditionTag) alarmContent.getTag();
+ // Don't change the alarm condition while the user is viewing the panel
+ if (c != null && (!mAttached || tag == null || tag.condition == null)) {
+ bind(c, alarmContent, COUNTDOWN_ALARM_CONDITION_INDEX);
+ }
+
+ tag = (ConditionTag) alarmContent.getTag();
+ boolean showAlarm = tag != null && tag.condition != null;
+ mZenRadioGroup.getChildAt(COUNTDOWN_ALARM_CONDITION_INDEX).setVisibility(
+ showAlarm ? View.VISIBLE : View.GONE);
+ alarmContent.setVisibility(showAlarm ? View.VISIBLE : View.GONE);
+ }
+
private Condition forever() {
return new Condition(mForeverId, foreverSummary(mContext), "", "", 0 /*icon*/,
Condition.STATE_TRUE, 0 /*flags*/);
@@ -637,7 +584,6 @@
// Returns a time condition if the next alarm is within the next week.
private Condition getTimeUntilNextAlarmCondition() {
GregorianCalendar weekRange = new GregorianCalendar();
- final long now = weekRange.getTimeInMillis();
setToMidnight(weekRange);
weekRange.add(Calendar.DATE, 6);
final long nextAlarmMs = mController.getNextAlarm();
@@ -647,9 +593,8 @@
setToMidnight(nextAlarm);
if (weekRange.compareTo(nextAlarm) >= 0) {
- return ZenModeConfig.toTimeCondition(mContext, nextAlarmMs,
- Math.round((nextAlarmMs - now) / (float) MINUTES_MS),
- ActivityManager.getCurrentUser(), true);
+ return ZenModeConfig.toNextAlarmCondition(mContext, nextAlarmMs,
+ ActivityManager.getCurrentUser());
}
}
return null;
@@ -662,11 +607,13 @@
calendar.set(Calendar.MILLISECOND, 0);
}
- private ConditionTag getConditionTagAt(int index) {
+ @VisibleForTesting
+ ConditionTag getConditionTagAt(int index) {
return (ConditionTag) mZenRadioGroupContent.getChildAt(index).getTag();
}
- private int getVisibleConditions() {
+ @VisibleForTesting
+ int getVisibleConditions() {
int rt = 0;
final int N = mZenRadioGroupContent.getChildCount();
for (int i = 0; i < N; i++) {
@@ -682,34 +629,8 @@
}
}
- private void ensureSelection() {
- // are we left without anything selected? if so, set a default
- final int visibleConditions = getVisibleConditions();
- if (visibleConditions == 0) return;
- for (int i = 0; i < visibleConditions; i++) {
- final ConditionTag tag = getConditionTagAt(i);
- if (tag != null && tag.rb.isChecked()) {
- if (DEBUG) Log.d(mTag, "Not selecting a default, checked=" + tag.condition);
- return;
- }
- }
- final ConditionTag foreverTag = getConditionTagAt(FOREVER_CONDITION_INDEX);
- if (foreverTag == null) return;
- if (DEBUG) Log.d(mTag, "Selecting a default");
- final int favoriteIndex = mPrefs.getMinuteIndex();
- if (mExitCondition != null && mExitCondition.equals(mTimeCondition)) {
- getConditionTagAt(COUNTDOWN_CONDITION_INDEX).rb.setChecked(true);
- } else if (favoriteIndex == -1 || !mCountdownConditionSupported ||
- mAttachedZen != Global.ZEN_MODE_OFF) {
- foreverTag.rb.setChecked(true);
- } else {
- mTimeCondition = ZenModeConfig.toTimeCondition(mContext,
- MINUTE_BUCKETS[favoriteIndex], ActivityManager.getCurrentUser());
- mBucketIndex = favoriteIndex;
- bind(mTimeCondition, mZenRadioGroupContent.getChildAt(COUNTDOWN_CONDITION_INDEX),
- COUNTDOWN_CONDITION_INDEX);
- getConditionTagAt(COUNTDOWN_CONDITION_INDEX).rb.setChecked(true);
- }
+ private static boolean isAlarm(Condition c) {
+ return c != null && ZenModeConfig.isValidCountdownToAlarmConditionId(c.id);
}
private static boolean isCountdown(Condition c) {
@@ -877,10 +798,9 @@
newCondition = ZenModeConfig.toTimeCondition(mContext,
MINUTE_BUCKETS[mBucketIndex], ActivityManager.getCurrentUser());
}
- mTimeCondition = newCondition;
- bind(mTimeCondition, row, rowId);
+ bind(newCondition, row, rowId);
tag.rb.setChecked(true);
- select(mTimeCondition);
+ select(newCondition);
announceConditionSelection(tag);
}
@@ -902,7 +822,7 @@
setExitCondition(condition);
if (realConditionId == null) {
mPrefs.setMinuteIndex(-1);
- } else if (isCountdown(condition) && mBucketIndex != -1) {
+ } else if ((isAlarm(condition) || isCountdown(condition)) && mBucketIndex != -1) {
mPrefs.setMinuteIndex(mBucketIndex);
}
setSessionExitCondition(copy(condition));
@@ -951,7 +871,8 @@
}
// used as the view tag on condition rows
- private static class ConditionTag {
+ @VisibleForTesting
+ static class ConditionTag {
RadioButton rb;
View lines;
TextView line1;
diff --git a/packages/SystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java b/packages/SystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java
index b597868..fe23541 100644
--- a/packages/SystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java
+++ b/packages/SystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java
@@ -22,7 +22,6 @@
import android.support.test.internal.runner.ClassPathScanner;
import android.support.test.internal.runner.ClassPathScanner.ChainedClassNameFilter;
import android.support.test.internal.runner.ClassPathScanner.ExternalClassNameFilter;
-import android.support.test.internal.runner.TestLoader;
import android.testing.AndroidTestingRunner;
import android.text.TextUtils;
import android.util.Log;
@@ -32,8 +31,11 @@
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.junit.internal.builders.AllDefaultPossibilitiesBuilder;
import java.io.IOException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
@@ -69,12 +71,11 @@
};
@Test
- public void testAllClassInheritance() {
+ public void testAllClassInheritance() throws Throwable {
boolean anyClassWrong = false;
- TestLoader loader = new TestLoader();
for (String className : getClassNamesFromClassPath()) {
- Class<?> cls = loader.loadIfTest(className);
- if (cls == null) continue;
+ Class<?> cls = Class.forName(className, false, this.getClass().getClassLoader());
+ if (!isTestClass(cls)) continue;
boolean hasParent = false;
for (Class<?> parent : BASE_CLS_WHITELIST) {
@@ -125,4 +126,85 @@
return TextUtils.join(",", Arrays.asList(BASE_CLS_WHITELIST)
.stream().map(cls -> cls.getSimpleName()).toArray());
}
+
+ /**
+ * Determines if given class is a valid test class.
+ *
+ * @param loadedClass
+ * @return <code>true</code> if loadedClass is a test
+ */
+ private boolean isTestClass(Class<?> loadedClass) {
+ try {
+ if (Modifier.isAbstract(loadedClass.getModifiers())) {
+ logDebug(String.format("Skipping abstract class %s: not a test",
+ loadedClass.getName()));
+ return false;
+ }
+ // TODO: try to find upstream junit calls to replace these checks
+ if (junit.framework.Test.class.isAssignableFrom(loadedClass)) {
+ // ensure that if a TestCase, it has at least one test method otherwise
+ // TestSuite will throw error
+ if (junit.framework.TestCase.class.isAssignableFrom(loadedClass)) {
+ return hasJUnit3TestMethod(loadedClass);
+ }
+ return true;
+ }
+ // TODO: look for a 'suite' method?
+ if (loadedClass.isAnnotationPresent(org.junit.runner.RunWith.class)) {
+ return true;
+ }
+ for (Method testMethod : loadedClass.getMethods()) {
+ if (testMethod.isAnnotationPresent(org.junit.Test.class)) {
+ return true;
+ }
+ }
+ logDebug(String.format("Skipping class %s: not a test", loadedClass.getName()));
+ return false;
+ } catch (Exception e) {
+ // Defensively catch exceptions - Will throw runtime exception if it cannot load methods.
+ // For earlier versions of Android (Pre-ICS), Dalvik might try to initialize a class
+ // during getMethods(), fail to do so, hide the error and throw a NoSuchMethodException.
+ // Since the java.lang.Class.getMethods does not declare such an exception, resort to a
+ // generic catch all.
+ // For ICS+, Dalvik will throw a NoClassDefFoundException.
+ Log.w(TAG, String.format("%s in isTestClass for %s", e.toString(),
+ loadedClass.getName()));
+ return false;
+ } catch (Error e) {
+ // defensively catch Errors too
+ Log.w(TAG, String.format("%s in isTestClass for %s", e.toString(),
+ loadedClass.getName()));
+ return false;
+ }
+ }
+
+ private boolean hasJUnit3TestMethod(Class<?> loadedClass) {
+ for (Method testMethod : loadedClass.getMethods()) {
+ if (isPublicTestMethod(testMethod)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ // copied from junit.framework.TestSuite
+ private boolean isPublicTestMethod(Method m) {
+ return isTestMethod(m) && Modifier.isPublic(m.getModifiers());
+ }
+
+ // copied from junit.framework.TestSuite
+ private boolean isTestMethod(Method m) {
+ return m.getParameterTypes().length == 0 && m.getName().startsWith("test")
+ && m.getReturnType().equals(Void.TYPE);
+ }
+
+ /**
+ * Utility method for logging debug messages. Only actually logs a message if TAG is marked
+ * as loggable to limit log spam during normal use.
+ */
+ private void logDebug(String msg) {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, msg);
+ }
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterImplTest.java
new file mode 100644
index 0000000..703b4d5
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterImplTest.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package com.android.systemui.qs;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.support.test.filters.SmallTest;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+import android.testing.TestableLooper.RunWithLooper;
+import android.view.LayoutInflater;
+import android.view.View;
+
+import com.android.systemui.R;
+import com.android.systemui.R.id;
+import com.android.systemui.plugins.ActivityStarter;
+import com.android.systemui.statusbar.policy.DeviceProvisionedController;
+import com.android.systemui.utils.leaks.LeakCheckedTest;
+
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidTestingRunner.class)
+@RunWithLooper
+@SmallTest
+@Ignore("failing")
+public class QSFooterImplTest extends LeakCheckedTest {
+
+ private QSFooterImpl mFooter;
+ private ActivityStarter mActivityStarter;
+ private DeviceProvisionedController mDeviceProvisionedController;
+
+ @Before
+ public void setup() throws Exception {
+ injectLeakCheckedDependencies(ALL_SUPPORTED_CLASSES);
+ mActivityStarter = mDependency.injectMockDependency(ActivityStarter.class);
+ mDeviceProvisionedController = mDependency.injectMockDependency(
+ DeviceProvisionedController.class);
+ TestableLooper.get(this).runWithLooper(
+ () -> mFooter = (QSFooterImpl) LayoutInflater.from(mContext).inflate(
+ R.layout.qs_footer_impl, null));
+ }
+
+ @Test
+ public void testSettings_UserNotSetup() {
+ View settingsButton = mFooter.findViewById(id.settings_button);
+ when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(false);
+
+ mFooter.onClick(settingsButton);
+ // Verify Settings wasn't launched.
+ verify(mActivityStarter, never()).startActivity(any(), anyBoolean());
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterTest.java
deleted file mode 100644
index d25bbe1..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the
- * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-package com.android.systemui.qs;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyBoolean;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.support.test.filters.SmallTest;
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-import android.testing.TestableLooper.RunWithLooper;
-import android.view.LayoutInflater;
-import android.view.View;
-
-import com.android.systemui.R;
-import com.android.systemui.R.id;
-import com.android.systemui.plugins.ActivityStarter;
-import com.android.systemui.statusbar.policy.DeviceProvisionedController;
-import com.android.systemui.utils.leaks.LeakCheckedTest;
-
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidTestingRunner.class)
-@RunWithLooper
-@SmallTest
-@Ignore("failing")
-public class QSFooterTest extends LeakCheckedTest {
-
- private QSFooter mFooter;
- private ActivityStarter mActivityStarter;
- private DeviceProvisionedController mDeviceProvisionedController;
-
- @Before
- public void setup() throws Exception {
- injectLeakCheckedDependencies(ALL_SUPPORTED_CLASSES);
- mActivityStarter = mDependency.injectMockDependency(ActivityStarter.class);
- mDeviceProvisionedController = mDependency.injectMockDependency(
- DeviceProvisionedController.class);
- TestableLooper.get(this).runWithLooper(() -> {
- mFooter = (QSFooter) LayoutInflater.from(mContext).inflate(R.layout.qs_footer, null);
- });
- }
-
- @Test
- public void testSettings_UserNotSetup() {
- View settingsButton = mFooter.findViewById(id.settings_button);
- when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(false);
-
- mFooter.onClick(settingsButton);
- // Verify Settings wasn't launched.
- verify(mActivityStarter, never()).startActivity(any(), anyBoolean());
- }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/car/CarQsFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/car/CarQsFragmentTest.java
new file mode 100644
index 0000000..4f87b02
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/car/CarQsFragmentTest.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+package com.android.systemui.qs.car;
+
+import static org.junit.Assert.assertNotNull;
+
+import android.content.Context;
+import android.support.test.filters.SmallTest;
+import android.testing.AndroidTestingRunner;
+import android.testing.LayoutInflaterBuilder;
+import android.testing.TestableLooper;
+import android.testing.TestableLooper.RunWithLooper;
+import android.view.View;
+import android.widget.FrameLayout;
+
+import com.android.keyguard.CarrierText;
+import com.android.systemui.Dependency;
+import com.android.systemui.SysuiBaseFragmentTest;
+import com.android.systemui.statusbar.policy.Clock;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Tests for {@link CarQSFragment}.
+ */
+@RunWith(AndroidTestingRunner.class)
+@RunWithLooper(setAsMainLooper = true)
+@SmallTest
+public class CarQsFragmentTest extends SysuiBaseFragmentTest {
+ public CarQsFragmentTest() {
+ super(CarQSFragment.class);
+ }
+
+ @Before
+ public void initDependencies() {
+ mContext.addMockSystemService(Context.LAYOUT_INFLATER_SERVICE,
+ new LayoutInflaterBuilder(mContext)
+ .replace("com.android.systemui.statusbar.policy.SplitClockView",
+ FrameLayout.class)
+ .replace("TextClock", View.class)
+ .replace(CarrierText.class, View.class)
+ .replace(Clock.class, View.class)
+ .build());
+
+ mDependency.injectTestDependency(Dependency.BG_LOOPER,
+ TestableLooper.get(this).getLooper());
+ }
+
+ @Test
+ public void testLayoutInflation() {
+ CarQSFragment fragment = (CarQSFragment) mFragment;
+ mFragments.dispatchResume();
+
+ assertNotNull(fragment.getHeader());
+ assertNotNull(fragment.getFooter());
+ }
+
+ @Test
+ public void testListening() {
+ CarQSFragment qs = (CarQSFragment) mFragment;
+ mFragments.dispatchResume();
+ processAllMessages();
+
+ qs.setListening(true);
+ processAllMessages();
+
+ qs.setListening(false);
+ processAllMessages();
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/recents/model/HighResThumbnailLoaderTest.java b/packages/SystemUI/tests/src/com/android/systemui/recents/model/HighResThumbnailLoaderTest.java
index f57b6b3..5a8c6dd 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/recents/model/HighResThumbnailLoaderTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/recents/model/HighResThumbnailLoaderTest.java
@@ -57,7 +57,8 @@
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
- mLoader = new HighResThumbnailLoader(mMockSystemServicesProxy, Looper.getMainLooper());
+ mLoader = new HighResThumbnailLoader(mMockSystemServicesProxy, Looper.getMainLooper(),
+ false);
mTask.key = new TaskKey(0, 0, null, 0, 0, 0);
when(mMockSystemServicesProxy.getTaskThumbnail(anyInt(), anyBoolean()))
.thenReturn(mThumbnailData);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/volume/UtilTest.java b/packages/SystemUI/tests/src/com/android/systemui/volume/UtilTest.java
new file mode 100644
index 0000000..6b20a1e
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/volume/UtilTest.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.systemui.volume;
+
+import android.media.MediaMetadata;
+import android.support.test.filters.SmallTest;
+
+import com.android.systemui.SysuiTestCase;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+
+@SmallTest
+public class UtilTest extends SysuiTestCase {
+
+ @Test
+ public void testMediaMetadataToString_null() {
+ Assert.assertEquals(null, Util.mediaMetadataToString(null));
+ }
+
+ @Test
+ public void testMediaMetadataToString_notNull() {
+ Assert.assertNotNull(Util.mediaMetadataToString(new MediaMetadata.Builder().build()));
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/volume/ZenModePanelTest.java b/packages/SystemUI/tests/src/com/android/systemui/volume/ZenModePanelTest.java
new file mode 100644
index 0000000..0fdbfd1
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/volume/ZenModePanelTest.java
@@ -0,0 +1,217 @@
+/**
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.volume;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.net.Uri;
+import android.provider.Settings;
+import android.service.notification.Condition;
+import android.service.notification.ZenModeConfig;
+import android.support.test.annotation.UiThreadTest;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.view.LayoutInflater;
+
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.statusbar.policy.ZenModeController;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class ZenModePanelTest extends SysuiTestCase {
+
+ ZenModePanel mPanel;
+ ZenModeController mController;
+ Uri mForeverId;
+
+ @Before
+ public void setup() throws Exception {
+ final LayoutInflater layoutInflater = LayoutInflater.from(mContext);
+ mPanel = (ZenModePanel) layoutInflater.inflate(com.android.systemui.R.layout.zen_mode_panel,
+ null);
+ mController = mock(ZenModeController.class);
+ mForeverId = Condition.newId(mContext).appendPath("forever").build();
+
+ mPanel.init(mController);
+ }
+
+ private void assertProperConditionTagTypes(boolean hasAlarm) {
+ final int N = mPanel.getVisibleConditions();
+ assertEquals(hasAlarm ? 3 : 2, N);
+
+ assertEquals(mForeverId, mPanel.getConditionTagAt(0).condition.id);
+ assertTrue(ZenModeConfig.isValidCountdownConditionId(
+ mPanel.getConditionTagAt(1).condition.id));
+ assertFalse(ZenModeConfig.isValidCountdownToAlarmConditionId(
+ mPanel.getConditionTagAt(1).condition.id));
+ if (hasAlarm) {
+ assertTrue(ZenModeConfig.isValidCountdownToAlarmConditionId(
+ mPanel.getConditionTagAt(2).condition.id));
+ }
+ }
+
+ @Test
+ public void testHandleUpdateConditions_foreverSelected_alarmExists() {
+ Condition forever = new Condition(mForeverId, "", Condition.STATE_TRUE);
+
+ when(mController.getNextAlarm()).thenReturn(System.currentTimeMillis() + 1000);
+
+ mPanel.handleUpdateConditions(forever);
+ assertProperConditionTagTypes(true);
+ assertTrue(mPanel.getConditionTagAt(0).rb.isChecked());
+ }
+
+ @Test
+ public void testHandleUpdateConditions_foreverSelected_noAlarm() {
+ Uri foreverId = Condition.newId(mContext).appendPath("forever").build();
+ Condition forever = new Condition(foreverId, "", Condition.STATE_TRUE);
+
+ when(mController.getNextAlarm()).thenReturn((long) 0);
+
+ mPanel.handleUpdateConditions(forever);
+ assertProperConditionTagTypes(false);
+ assertEquals(foreverId, mPanel.getConditionTagAt(0).condition.id);
+ }
+
+ @Test
+ public void testHandleUpdateConditions_countdownSelected_alarmExists() {
+ Uri foreverId = Condition.newId(mContext).appendPath("forever").build();
+
+ Condition countdown = new Condition(ZenModeConfig.toCountdownConditionId(
+ System.currentTimeMillis() + (3 * 60 * 60 * 1000) + 4000, false),
+ "", Condition.STATE_TRUE);
+
+ when(mController.getNextAlarm()).thenReturn(System.currentTimeMillis() + 1000);
+
+ mPanel.handleUpdateConditions(countdown);
+ assertProperConditionTagTypes(true);
+ assertTrue(mPanel.getConditionTagAt(1).rb.isChecked());
+ }
+
+ @Test
+ public void testHandleUpdateConditions_countdownSelected_noAlarm() {
+ Uri foreverId = Condition.newId(mContext).appendPath("forever").build();
+
+ Condition countdown = new Condition(ZenModeConfig.toCountdownConditionId(
+ System.currentTimeMillis() + (3 * 60 * 60 * 1000) + 4000, false),
+ "", Condition.STATE_TRUE);
+
+ when(mController.getNextAlarm()).thenReturn((long) 0);
+
+ mPanel.handleUpdateConditions(countdown);
+ assertProperConditionTagTypes(false);
+ assertTrue(mPanel.getConditionTagAt(1).rb.isChecked());
+ }
+
+ @Test
+ public void testHandleUpdateConditions_nextAlarmSelected() {
+ Uri foreverId = Condition.newId(mContext).appendPath("forever").build();
+
+ Condition alarm = new Condition(ZenModeConfig.toCountdownConditionId(
+ System.currentTimeMillis() + 1000, true),
+ "", Condition.STATE_TRUE);
+ when(mController.getNextAlarm()).thenReturn(System.currentTimeMillis() + 9000);
+
+ mPanel.handleUpdateConditions(alarm);
+
+ assertProperConditionTagTypes(true);
+ assertEquals(alarm, mPanel.getConditionTagAt(2).condition);
+ assertTrue(mPanel.getConditionTagAt(2).rb.isChecked());
+ }
+
+ @Test
+ public void testHandleUpdateConditions_foreverSelected_alarmConditionDoesNotChangeIfAttached() {
+ Uri foreverId = Condition.newId(mContext).appendPath("forever").build();
+ Condition forever = new Condition(foreverId, "", Condition.STATE_TRUE);
+
+ Condition alarm = new Condition(ZenModeConfig.toCountdownConditionId(
+ System.currentTimeMillis() + 9000, true),
+ "", Condition.STATE_TRUE);
+ when(mController.getNextAlarm()).thenReturn(System.currentTimeMillis() + 1000);
+
+ mPanel.handleUpdateConditions(alarm);
+ mPanel.setAttached(true);
+ mPanel.handleUpdateConditions(forever);
+
+ assertProperConditionTagTypes(true);
+ assertEquals(alarm, mPanel.getConditionTagAt(2).condition);
+ assertTrue(mPanel.getConditionTagAt(0).rb.isChecked());
+ }
+
+ @Test
+ public void testHandleUpdateConditions_foreverSelected_timeConditionDoesNotChangeIfAttached() {
+ Uri foreverId = Condition.newId(mContext).appendPath("forever").build();
+ Condition forever = new Condition(foreverId, "", Condition.STATE_TRUE);
+
+ Condition countdown = new Condition(ZenModeConfig.toCountdownConditionId(
+ System.currentTimeMillis() + (3 * 60 * 60 * 1000) + 4000, false),
+ "", Condition.STATE_TRUE);
+ when(mController.getNextAlarm()).thenReturn((long) 0);
+
+ mPanel.handleUpdateConditions(countdown);
+ mPanel.setAttached(true);
+ mPanel.handleUpdateConditions(forever);
+
+ assertProperConditionTagTypes(false);
+ assertEquals(countdown, mPanel.getConditionTagAt(1).condition);
+ assertTrue(mPanel.getConditionTagAt(0).rb.isChecked());
+ }
+
+ @Test
+ @UiThreadTest
+ public void testHandleUpdateManualRule_stillSelectedAfterModeChange() {
+ ZenModeConfig.ZenRule rule = new ZenModeConfig.ZenRule();
+
+ Condition alarm = new Condition(ZenModeConfig.toCountdownConditionId(
+ System.currentTimeMillis() + 1000, true),
+ "", Condition.STATE_TRUE);
+
+ rule.condition = alarm;
+ rule.conditionId = alarm.id;
+ rule.enabled = true;
+ rule.zenMode = Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS;
+
+ mPanel.handleUpdateManualRule(rule);
+
+ assertProperConditionTagTypes(true);
+ assertEquals(alarm, mPanel.getConditionTagAt(2).condition);
+ assertTrue(mPanel.getConditionTagAt(2).rb.isChecked());
+
+ assertEquals(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS,
+ mPanel.getSelectedZen(Settings.Global.ZEN_MODE_OFF));
+
+ rule.zenMode = Settings.Global.ZEN_MODE_NO_INTERRUPTIONS;
+
+ mPanel.handleUpdateManualRule(rule);
+
+ assertProperConditionTagTypes(true);
+ assertEquals(alarm, mPanel.getConditionTagAt(2).condition);
+ assertTrue(mPanel.getConditionTagAt(2).rb.isChecked());
+
+ assertEquals(Settings.Global.ZEN_MODE_NO_INTERRUPTIONS,
+ mPanel.getSelectedZen(Settings.Global.ZEN_MODE_OFF));
+ }
+}
diff --git a/packages/VpnDialogs/res/values-ar/strings.xml b/packages/VpnDialogs/res/values-ar/strings.xml
index d29c407..e36eef4 100644
--- a/packages/VpnDialogs/res/values-ar/strings.xml
+++ b/packages/VpnDialogs/res/values-ar/strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="prompt" msgid="3183836924226407828">"طلب الاتصال"</string>
- <string name="warning" msgid="809658604548412033">"يريد <xliff:g id="APP">%s</xliff:g> إعداد الاتصال بالشبكة الظاهرية الخاصة التي تتيح له مراقبة حركة المرور على الشبكة. فلا توافق إلا إذا كنت تثق في المصدر. <br /> <br /> <img src=vpn_icon /> يظهر في الجزء العلوي من الشاشة عندما تكون الشبكة الظاهرية الخاصة نشطة."</string>
+ <string name="warning" msgid="809658604548412033">"يريد <xliff:g id="APP">%s</xliff:g> إعداد الاتصال بالشبكة الافتراضية الخاصة التي تتيح له مراقبة حركة المرور على الشبكة. فلا توافق إلا إذا كنت تثق في المصدر. <br /> <br /> <img src=vpn_icon /> يظهر في الجزء العلوي من الشاشة عندما تكون الشبكة الافتراضية الخاصة نشطة."</string>
<string name="legacy_title" msgid="192936250066580964">"VPN متصلة"</string>
<string name="configure" msgid="4905518375574791375">"تهيئة"</string>
<string name="disconnect" msgid="971412338304200056">"قطع الاتصال"</string>
diff --git a/packages/WallpaperCropper/Android.mk b/packages/WallpaperCropper/Android.mk
index 09b41fd..0254673 100644
--- a/packages/WallpaperCropper/Android.mk
+++ b/packages/WallpaperCropper/Android.mk
@@ -6,7 +6,6 @@
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_JAVA_LIBRARIES := telephony-common
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4
LOCAL_PACKAGE_NAME := WallpaperCropper
LOCAL_CERTIFICATE := platform
diff --git a/packages/WallpaperCropper/src/com/android/photos/views/TiledImageRenderer.java b/packages/WallpaperCropper/src/com/android/photos/views/TiledImageRenderer.java
index c4e493b..9501073 100644
--- a/packages/WallpaperCropper/src/com/android/photos/views/TiledImageRenderer.java
+++ b/packages/WallpaperCropper/src/com/android/photos/views/TiledImageRenderer.java
@@ -20,7 +20,7 @@
import android.graphics.Bitmap;
import android.graphics.Rect;
import android.graphics.RectF;
-import android.support.v4.util.LongSparseArray;
+import android.util.LongSparseArray;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.Pools.Pool;
diff --git a/packages/services/PacProcessor/jni/com_android_pacprocessor_PacNative.cpp b/packages/services/PacProcessor/jni/com_android_pacprocessor_PacNative.cpp
index 990d770..846ff25 100644
--- a/packages/services/PacProcessor/jni/com_android_pacprocessor_PacNative.cpp
+++ b/packages/services/PacProcessor/jni/com_android_pacprocessor_PacNative.cpp
@@ -21,7 +21,7 @@
#include "android_runtime/AndroidRuntime.h"
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "proxy_resolver_v8.h"
diff --git a/proto/src/ipconnectivity.proto b/proto/src/ipconnectivity.proto
index 76c5418..885896f 100644
--- a/proto/src/ipconnectivity.proto
+++ b/proto/src/ipconnectivity.proto
@@ -23,7 +23,7 @@
// It is not intended to map one to one to the TRANSPORT_* constants defined in
// android.net.NetworkCapabilities. Instead it is intended to be used as
// a dimension field for metrics events and aggregated metrics.
-// Next tag: 7
+// Next tag: 10
enum LinkLayer {
// An unknown link layer technology.
UNKNOWN = 0;
@@ -32,6 +32,9 @@
CELLULAR = 2;
ETHERNET = 3;
WIFI = 4;
+ WIFI_P2P = 7;
+ WIFI_NAN = 8; // Also known as WiFi Aware
+ LOWPAN = 9;
// Indicates that the link layer dimension is not relevant for the metrics or
// event considered.
@@ -47,16 +50,18 @@
optional int32 value = 2;
};
-// Logs changes in the system default network. Changes can be 1) acquiring a
-// default network with no previous default, 2) a switch of the system default
-// network to a new default network, 3) a loss of the system default network.
-// This message is associated to android.net.metrics.DefaultNetworkEvent.
+// An event record when the system default network disconnects or the system
+// switches to a new default network.
+// Next tag: 10.
message DefaultNetworkEvent {
- // A value of 0 means this is a loss of the system default network.
- optional NetworkId network_id = 1;
- // A value of 0 means there was no previous default network.
- optional NetworkId previous_network_id = 2;
+ // Reason why this network stopped being the default.
+ enum LostReason {
+ UNKNOWN = 0;
+ OUTSCORED = 1;
+ INVALIDATION = 2;
+ DISCONNECT = 3;
+ };
// Whether the network supports IPv4, IPv6, or both.
enum IPSupport {
@@ -66,17 +71,52 @@
DUAL = 3;
};
+ // Duration in milliseconds when this network was the default.
+ // Since version 4
+ optional int64 default_network_duration_ms = 5;
+
+ // Duration in milliseconds without a default network before this network
+ // became the default.
+ // Since version 4
+ optional int64 no_default_network_duration_ms = 6;
+
+ // Network score of this network when it became the default network.
+ // Since version 4
+ optional int64 initial_score = 7;
+
+ // Network score of this network when it stopped being the default network.
+ // Since version 4
+ optional int64 final_score = 8;
+
+ // Best available information about IP support of this default network.
+ // Since version 4
+ optional IPSupport ip_support = 9;
+
+
+ // Deprecated fields
+
+ // A value of 0 means this is a loss of the system default network.
+ // Deprecated since version 3. Replaced by top level network_id.
+ optional NetworkId network_id = 1 [deprecated = true];
+
+ // A value of 0 means there was no previous default network.
+ // Deprecated since version 3. Replaced by previous_default_network_id.
+ optional NetworkId previous_network_id = 2 [deprecated = true];
+
// Best available information about IP support of the previous network when
// disconnecting or switching to a new default network.
- optional IPSupport previous_network_ip_support = 3;
+ // Deprecated since version 3. Replaced by ip_support field.
+ optional IPSupport previous_network_ip_support = 3 [deprecated = true];
// The transport types of the new default network, represented by
// TRANSPORT_* constants as defined in NetworkCapabilities.
- repeated int32 transport_types = 4;
+ // Deprecated since version 3. Replaced by top-level transports field.
+ repeated int32 transport_types = 4 [deprecated = true];
};
// Logs IpReachabilityMonitor probe events and NUD_FAILED events.
// This message is associated to android.net.metrics.IpReachabilityEvent.
+// Next tag: 3.
message IpReachabilityEvent {
// The interface name (wlan, rmnet, lo, ...) on which the probe was sent.
// Deprecated since version 2, to be replaced by link_layer field.
@@ -91,6 +131,7 @@
// Logs NetworkMonitor and ConnectivityService events related to the state of
// a network: connection, evaluation, validation, lingering, and disconnection.
// This message is associated to android.net.metrics.NetworkEvent.
+// Next tag: 4.
message NetworkEvent {
// The id of the network on which this event happened.
// Deprecated since version 3.
@@ -108,6 +149,7 @@
// Logs individual captive portal probing events that are performed when
// evaluating or reevaluating networks for Internet connectivity.
// This message is associated to android.net.metrics.ValidationProbeEvent.
+// Next tag: 5.
message ValidationProbeEvent {
// The id of the network for which the probe was sent.
// Deprecated since version 3.
@@ -124,26 +166,64 @@
optional int32 probe_result = 4;
}
-// Logs DNS lookup latencies. Repeated fields must have the same length.
+// Logs DNS lookup latencies.
// This message is associated to android.net.metrics.DnsEvent.
-// Deprecated since version 2.
+// Next tag: 11
message DNSLookupBatch {
+
+ // The time it took for successful DNS lookups to complete.
+ // The number of repeated values can be less than getaddrinfo_query_count
+ // + gethostbyname_query_count in case of event rate-limiting.
+ repeated int32 latencies_ms = 4;
+
+ // The total number of getaddrinfo queries.
+ // Since version 4.
+ optional int64 getaddrinfo_query_count = 5;
+
+ // The total number of gethostbyname queries.
+ // Since version 4.
+ optional int64 gethostbyname_query_count = 6;
+
+ // The total number of getaddrinfo errors.
+ // Since version 4.
+ optional int64 getaddrinfo_error_count = 7;
+
+ // The total number of gethostbyname errors.
+ // Since version 4.
+ optional int64 gethostbyname_error_count = 8;
+
+ // Counts of all errors returned by getaddrinfo.
+ // The Pair key field is the getaddrinfo error value.
+ // The value field is the count for that return value.
+ // Since version 4
+ repeated Pair getaddrinfo_errors = 9;
+
+ // Counts of all errors returned by gethostbyname.
+ // The Pair key field is the gethostbyname errno value.
+ // the Pair value field is the count for that errno code.
+ // Since version 4
+ repeated Pair gethostbyname_errors = 10;
+
+
+ // Deprecated fields
+
// The id of the network on which the DNS lookups took place.
- optional NetworkId network_id = 1;
+ // Deprecated since version 3.
+ optional NetworkId network_id = 1 [deprecated = true];
// The types of the DNS lookups, as defined in android.net.metrics.DnsEvent.
- repeated int32 event_types = 2;
+ // Deprecated since version 3.
+ repeated int32 event_types = 2 [deprecated = true];
// The return values of the DNS resolver for each DNS lookups.
- repeated int32 return_codes = 3;
-
- // The time it took for each DNS lookups to complete.
- repeated int32 latencies_ms = 4;
+ // Deprecated since version 3.
+ repeated int32 return_codes = 3 [deprecated = true];
};
// Represents a collections of DNS lookup latencies and counters for a
// particular combination of DNS query type and return code.
// Since version 2.
+// Next tag: 7.
message DNSLatencies {
// The type of the DNS lookups, as defined in android.net.metrics.DnsEvent.
// Acts as a key for a set of DNS query results.
@@ -203,6 +283,7 @@
// state transition or a response packet parsing error.
// This message is associated to android.net.metrics.DhcpClientEvent and
// android.net.metrics.DhcpErrorEvent.
+// Next tag: 5
message DHCPEvent {
// The interface name (wlan, rmnet, lo, ...) on which the event happened.
// Deprecated since version 2, to be replaced by link_layer field.
@@ -255,7 +336,7 @@
// Represents Router Advertisement listening statistics for an interface with
// Android Packet Filter enabled.
// Since version 1.
-// Next tag: 12
+// Next tag: 15
message ApfStatistics {
// The time interval in milliseconds these stastistics cover.
optional int64 duration_ms = 1;
@@ -288,12 +369,28 @@
// The total number of APF program updates triggered when disabling the
// multicast filter. Since version 3.
+ // Since version 4.
optional int32 program_updates_allowing_multicast = 11;
+
+ // The total number of packets processed by the APF interpreter.
+ // Since version 4.
+ optional int32 total_packet_processed = 12;
+
+ // The total number of packets dropped by the APF interpreter.
+ // Since version 4.
+ optional int32 total_packet_dropped = 13;
+
+ // List of hardware counters collected by the APF interpreter.
+ // The Pair key is the counter id, defined in android.net.metrics.ApfStats.
+ // The Pair value is the counter value.
+ // Since version 4.
+ repeated Pair hardware_counters = 14;
}
// Represents the reception of a Router Advertisement packet for an interface
// with Android Packet Filter enabled.
// Since version 1.
+// Next tag: 7.
message RaEvent {
// All lifetime values are expressed in seconds. The default value for an
// option lifetime that was not present in the RA option list is -1.
@@ -322,6 +419,7 @@
// Represents an IP provisioning event in IpManager and how long the
// provisioning action took.
// This message is associated to android.net.metrics.IpManagerEvent.
+// Next tag: 4.
message IpProvisioningEvent {
// The interface name (wlan, rmnet, lo, ...) on which the probe was sent.
// Deprecated since version 2, to be replaced by link_layer field.
@@ -335,8 +433,48 @@
optional int32 latency_ms = 3;
}
+// Represents statistics from a single android Network.
+// Since version 4. Replace NetworkEvent.
+// Next tag: 9.
+message NetworkStats {
+
+ // Duration of this Network lifecycle in milliseconds.
+ optional int64 duration_ms = 1;
+
+ // Information about IP support of this network.
+ optional DefaultNetworkEvent.IPSupport ip_support = 2;
+
+ // True if the network was validated at least once.
+ optional bool ever_validated = 3;
+
+ // True if a captive portal was found at least once on this network.
+ optional bool portal_found = 4;
+
+ // Total number of times no connectivity was reported for this network.
+ optional int32 no_connectivity_reports = 5;
+
+ // Total number of validation attempts.
+ optional int32 validation_attempts = 6;
+
+ // Results from all validation attempts.
+ // The Pair key is the result:
+ // 0 -> unvalidated
+ // 1 -> validated
+ // 2 -> captive portal
+ // The Pair value is the duration of the validation attempts in milliseconds.
+ repeated Pair validation_events = 7;
+
+ // Time series of validation states in time order.
+ // The Pair key is the state:
+ // 0 -> unvalidated
+ // 1 -> validated
+ // 2 -> captive portal,
+ // The Pair value is the duration of that state in milliseconds.
+ repeated Pair validation_states = 8;
+}
+
// Represents one of the IP connectivity event defined in this file.
-// Next tag: 19
+// Next tag: 20
message IpConnectivityEvent {
// Time in ms when the event was recorded.
optional int64 time_ms = 1;
@@ -370,14 +508,13 @@
oneof event {
// An event about the system default network.
- // The link_layer field is not relevant for this event and set to NONE.
DefaultNetworkEvent default_network_event = 2;
// An IP reachability probe event.
IpReachabilityEvent ip_reachability_event = 3;
// A network lifecycle event.
- NetworkEvent network_event = 4;
+ NetworkEvent network_event = 4 [deprecated = true];
// A batch of DNS lookups.
// Deprecated in the nyc-mr2 release since version 2,and replaced by
@@ -407,10 +544,14 @@
// An RA packet reception event.
RaEvent ra_event = 11;
+
+ // Network statistics.
+ NetworkStats network_stats = 19;
};
};
// The information about IP connectivity events.
+// Next tag: 4.
message IpConnectivityLog {
// An array of IP connectivity events.
repeated IpConnectivityEvent events = 1;
@@ -424,5 +565,6 @@
// nyc-mr1: not populated, implicitly 1.
// nyc-mr2: 2.
// oc: 3.
+ // oc-dr1: 4. (sailfish, marlin, walleye, taimen)
optional int32 version = 3;
};
diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto
index a4849fc..bb6ed74 100644
--- a/proto/src/metrics_constants.proto
+++ b/proto/src/metrics_constants.proto
@@ -3558,7 +3558,7 @@
STORAGE_FILES = 841;
// FIELD - Rank of the clicked Settings search result
- FIELD_SETTINGS_SERACH_RESULT_RANK = 842;
+ FIELD_SETTINGS_SEARCH_RESULT_RANK = 842;
// OPEN: Settings > Apps > Default Apps > Assist > Default assist
DEFAULT_ASSIST_PICKER = 843;
@@ -4051,10 +4051,10 @@
ACTION_SETTINGS_UPDATE_DEFAULT_APP = 1000;
// FIELD - Query length when Settings search result is clicked
- FIELD_SETTINGS_SERACH_QUERY_LENGTH = 1001;
+ FIELD_SETTINGS_SEARCH_QUERY_LENGTH = 1001;
// FIELD - Number of results when Settings search result is clicked
- FIELD_SETTINGS_SERACH_RESULT_COUNT = 1002;
+ FIELD_SETTINGS_SEARCH_RESULT_COUNT = 1002;
// OPEN: Settings > Display > Ambient Display
// CATEGORY: SETTINGS
@@ -4221,6 +4221,47 @@
// ---- End O-DR1 Constants, all O-DR1 constants go above this line ----
+ // ACTION: Settings > Network & Internet > Mobile network > Mobile data
+ // CATEGORY: SETTINGS
+ // OS: O MR
+ ACTION_MOBILE_NETWORK_MOBILE_DATA_TOGGLE = 1081;
+
+ // ACTION: Settings > Network & Internet > Mobile network > Data usage
+ // CATEGORY: SETTINGS
+ // OS: O MR
+ ACTION_MOBILE_NETWORK_DATA_USAGE = 1082;
+
+ // FIELD - State of asynchronous ranking when Settings search result is clicked
+ // CATEGORY: SETTINGS
+ // OS: O MR
+ FIELD_SETTINGS_SEARCH_RESULT_ASYNC_RANKING_STATE = 1083;
+
+ // ACTION: Settings > Connected devices > SMS Mirroring
+ // CATEGORY: SETTINGS
+ // OS: O MR
+ ACTION_SETTINGS_SMS_MIRRORING = 1084;
+
+ // ACTION: Chooser picked a ranked target.
+ // CATEGORY: GLOBAL_SYSTEM_UI
+ // OS: O MR
+ ACTION_TARGET_SELECTED = 1085;
+
+ // FIELD - is category used in Chooser: 1.
+ // Type: int encoded boolean
+ // CATEGORY: GLOBAL_SYSTEM_UI
+ // OS: O MR
+ FIELD_IS_CATEGORY_USED = 1086;
+
+ // FIELD - ranked position of selected target for Chooser.
+ // CATEGORY: GLOBAL_SYSTEM_UI
+ // OS: O MR
+ FIELD_RANKED_POSITION = 1087;
+
+ // OPEN: Settings > Data plan usage
+ // CATEGORY: SETTINGS
+ // OS: O MR
+ DATA_PLAN_USAGE_SUMMARY = 1088;
+
// Add new aosp constants above this line.
// END OF AOSP CONSTANTS
}
diff --git a/rs/java/android/renderscript/Script.java b/rs/java/android/renderscript/Script.java
index 13d5fcd..d0d9a11 100644
--- a/rs/java/android/renderscript/Script.java
+++ b/rs/java/android/renderscript/Script.java
@@ -41,7 +41,6 @@
mScript = s;
mSlot = slot;
mSig = sig;
- guard.open("destroy");
}
}
@@ -119,7 +118,6 @@
super(id, rs);
mScript = s;
mSlot = slot;
- guard.open("destroy");
}
}
diff --git a/rs/jni/android_renderscript_RenderScript.cpp b/rs/jni/android_renderscript_RenderScript.cpp
index ee48289..f9f6bf7 100644
--- a/rs/jni/android_renderscript_RenderScript.cpp
+++ b/rs/jni/android_renderscript_RenderScript.cpp
@@ -30,7 +30,7 @@
#include <android-base/macros.h>
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "android_runtime/AndroidRuntime.h"
#include "android_runtime/android_view_Surface.h"
#include "android_runtime/android_util_AssetManager.h"
diff --git a/services/Android.mk b/services/Android.mk
index c376470..0986e0a 100644
--- a/services/Android.mk
+++ b/services/Android.mk
@@ -7,7 +7,7 @@
LOCAL_MODULE := services
LOCAL_DEX_PREOPT_APP_IMAGE := true
LOCAL_DEX_PREOPT_GENERATE_PROFILE := true
-LOCAL_DEX_PREOPT_PROFILE_CLASS_LISTING := $(LOCAL_PATH)/profile-classes
+LOCAL_DEX_PREOPT_PROFILE_CLASS_LISTING := $(LOCAL_PATH)/art-profile
LOCAL_SRC_FILES := $(call all-java-files-under,java)
@@ -43,6 +43,9 @@
android.hidl.base-V1.0-java-static \
android.hardware.biometrics.fingerprint-V2.1-java-static
+LOCAL_JAVA_LIBRARIES := \
+ android.hidl.manager-V1.0-java
+
ifeq ($(EMMA_INSTRUMENT_FRAMEWORK),true)
LOCAL_EMMA_INSTRUMENT := true
endif
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java
index 0e42e6d..7324b82 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java
@@ -17,6 +17,7 @@
package com.android.server.accessibility;
import android.content.Context;
+import android.os.Handler;
import android.os.PowerManager;
import android.util.Pools.SimplePool;
import android.util.Slog;
@@ -30,6 +31,8 @@
import android.view.WindowManagerPolicy;
import android.view.accessibility.AccessibilityEvent;
+import com.android.server.LocalServices;
+
/**
* This class is an input filter for implementing accessibility features such
* as display magnification and explore by touch.
@@ -425,7 +428,8 @@
}
if ((mEnabledFeatures & FLAG_FEATURE_FILTER_KEY_EVENTS) != 0) {
- mKeyboardInterceptor = new KeyboardInterceptor(mAms);
+ mKeyboardInterceptor = new KeyboardInterceptor(mAms,
+ LocalServices.getService(WindowManagerPolicy.class));
addFirstEventHandler(mKeyboardInterceptor);
}
}
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index a58ba09..a59844d 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -102,6 +102,7 @@
import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.content.PackageMonitor;
import com.android.internal.os.SomeArgs;
import com.android.internal.util.DumpUtils;
@@ -903,7 +904,8 @@
}
}
- boolean notifyKeyEvent(KeyEvent event, int policyFlags) {
+ @VisibleForTesting
+ public boolean notifyKeyEvent(KeyEvent event, int policyFlags) {
synchronized (mLock) {
List<Service> boundServices = getCurrentUserStateLocked().mBoundServices;
if (boundServices.isEmpty()) {
diff --git a/services/accessibility/java/com/android/server/accessibility/KeyboardInterceptor.java b/services/accessibility/java/com/android/server/accessibility/KeyboardInterceptor.java
index bbb25af..f00a954 100644
--- a/services/accessibility/java/com/android/server/accessibility/KeyboardInterceptor.java
+++ b/services/accessibility/java/com/android/server/accessibility/KeyboardInterceptor.java
@@ -16,19 +16,52 @@
package com.android.server.accessibility;
+import android.os.Handler;
+import android.os.Message;
+import android.os.SystemClock;
+import android.util.Pools;
+import android.util.Slog;
import android.view.KeyEvent;
import android.view.MotionEvent;
+import android.view.WindowManagerPolicy;
import android.view.accessibility.AccessibilityEvent;
/**
* Intercepts key events and forwards them to accessibility manager service.
*/
-public class KeyboardInterceptor implements EventStreamTransformation {
- private EventStreamTransformation mNext;
- private AccessibilityManagerService mAms;
+public class KeyboardInterceptor implements EventStreamTransformation, Handler.Callback {
+ private static final int MESSAGE_PROCESS_QUEUED_EVENTS = 1;
+ private static final String LOG_TAG = "KeyboardInterceptor";
- public KeyboardInterceptor(AccessibilityManagerService service) {
+ private final AccessibilityManagerService mAms;
+ private final WindowManagerPolicy mPolicy;
+ private final Handler mHandler;
+
+ private EventStreamTransformation mNext;
+ private KeyEventHolder mEventQueueStart;
+ private KeyEventHolder mEventQueueEnd;
+
+ /**
+ * @param service The service to notify of key events
+ * @param policy The policy to check for keys that may affect a11y
+ */
+ public KeyboardInterceptor(AccessibilityManagerService service, WindowManagerPolicy policy) {
mAms = service;
+ mPolicy = policy;
+ mHandler = new Handler(this);
+ }
+
+ /**
+ * @param service The service to notify of key events
+ * @param policy The policy to check for keys that may affect a11y
+ * @param handler The handler to use. Only used for testing.
+ */
+ public KeyboardInterceptor(AccessibilityManagerService service, WindowManagerPolicy policy,
+ Handler handler) {
+ // Can't combine the constructors without making at least mHandler non-final.
+ mAms = service;
+ mPolicy = policy;
+ mHandler = handler;
}
@Override
@@ -40,6 +73,19 @@
@Override
public void onKeyEvent(KeyEvent event, int policyFlags) {
+ /*
+ * Certain keys have system-level behavior that affects accessibility services.
+ * Let that behavior settle before handling the keys
+ */
+ long eventDelay = getEventDelay(event, policyFlags);
+ if (eventDelay < 0) {
+ return;
+ }
+ if ((eventDelay > 0) || (mEventQueueStart != null)) {
+ addEventToQueue(event, policyFlags, eventDelay);
+ return;
+ }
+
mAms.notifyKeyEvent(event, policyFlags);
}
@@ -65,4 +111,104 @@
@Override
public void onDestroy() {
}
+
+ @Override
+ public boolean handleMessage(Message msg) {
+ if (msg.what != MESSAGE_PROCESS_QUEUED_EVENTS) {
+ Slog.e(LOG_TAG, "Unexpected message type");
+ return false;
+ }
+ processQueuedEvents();
+ if (mEventQueueStart != null) {
+ scheduleProcessQueuedEvents();
+ }
+ return true;
+ }
+
+ private void addEventToQueue(KeyEvent event, int policyFlags, long delay) {
+ long dispatchTime = SystemClock.uptimeMillis() + delay;
+ if (mEventQueueStart == null) {
+ mEventQueueEnd = mEventQueueStart =
+ KeyEventHolder.obtain(event, policyFlags, dispatchTime);
+ scheduleProcessQueuedEvents();
+ return;
+ }
+ final KeyEventHolder holder = KeyEventHolder.obtain(event, policyFlags, dispatchTime);
+ holder.next = mEventQueueStart;
+ mEventQueueStart.previous = holder;
+ mEventQueueStart = holder;
+ }
+
+ private void scheduleProcessQueuedEvents() {
+ if (!mHandler.sendEmptyMessageAtTime(
+ MESSAGE_PROCESS_QUEUED_EVENTS, mEventQueueEnd.dispatchTime)) {
+ Slog.e(LOG_TAG, "Failed to schedule key event");
+ };
+ }
+
+ private void processQueuedEvents() {
+ final long currentTime = SystemClock.uptimeMillis();
+ while ((mEventQueueEnd != null) && (mEventQueueEnd.dispatchTime <= currentTime)) {
+ final long eventDelay = getEventDelay(mEventQueueEnd.event, mEventQueueEnd.policyFlags);
+ if (eventDelay > 0) {
+ // Reschedule the event
+ mEventQueueEnd.dispatchTime = currentTime + eventDelay;
+ return;
+ }
+ // We'll either send or drop the event
+ if (eventDelay == 0) {
+ mAms.notifyKeyEvent(mEventQueueEnd.event, mEventQueueEnd.policyFlags);
+ }
+ final KeyEventHolder eventToBeRecycled = mEventQueueEnd;
+ mEventQueueEnd = mEventQueueEnd.previous;
+ if (mEventQueueEnd != null) {
+ mEventQueueEnd.next = null;
+ }
+ eventToBeRecycled.recycle();
+ if (mEventQueueEnd == null) {
+ mEventQueueStart = null;
+ }
+ }
+ }
+
+ private long getEventDelay(KeyEvent event, int policyFlags) {
+ int keyCode = event.getKeyCode();
+ if ((keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) || (keyCode == KeyEvent.KEYCODE_VOLUME_UP)) {
+ return mPolicy.interceptKeyBeforeDispatching(null, event, policyFlags);
+ }
+ return 0;
+ }
+
+ private static class KeyEventHolder {
+ private static final int MAX_POOL_SIZE = 32;
+ private static final Pools.SimplePool<KeyEventHolder> sPool =
+ new Pools.SimplePool<>(MAX_POOL_SIZE);
+
+ public int policyFlags;
+ public long dispatchTime;
+ public KeyEvent event;
+ public KeyEventHolder next;
+ public KeyEventHolder previous;
+
+ public static KeyEventHolder obtain(KeyEvent event, int policyFlags, long dispatchTime) {
+ KeyEventHolder holder = sPool.acquire();
+ if (holder == null) {
+ holder = new KeyEventHolder();
+ }
+ holder.event = KeyEvent.obtain(event);
+ holder.policyFlags = policyFlags;
+ holder.dispatchTime = dispatchTime;
+ return holder;
+ }
+
+ public void recycle() {
+ event.recycle();
+ event = null;
+ policyFlags = 0;
+ dispatchTime = 0;
+ next = null;
+ previous = null;
+ sPool.release(this);
+ }
+ }
}
diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetService.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetService.java
index 9cc53f0..c9c7adc 100644
--- a/services/appwidget/java/com/android/server/appwidget/AppWidgetService.java
+++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetService.java
@@ -19,6 +19,7 @@
import android.content.Context;
import com.android.server.AppWidgetBackupBridge;
+import com.android.server.FgThread;
import com.android.server.SystemService;
/**
@@ -48,7 +49,7 @@
@Override
public void onUnlockUser(int userHandle) {
- mImpl.onUserUnlocked(userHandle);
+ FgThread.getHandler().post(() -> mImpl.onUserUnlocked(userHandle));
}
@Override
diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
index aad4431..80b5477 100644
--- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
+++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
@@ -68,6 +68,7 @@
import android.os.Process;
import android.os.RemoteException;
import android.os.SystemClock;
+import android.os.Trace;
import android.os.UserHandle;
import android.os.UserManager;
import android.os.storage.StorageManager;
@@ -2644,9 +2645,14 @@
Slog.w(TAG, "User " + userId + " is no longer unlocked - exiting");
return;
}
+ long time = SystemClock.elapsedRealtime();
synchronized (mLock) {
+ Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "appwidget ensure");
ensureGroupStateLoadedLocked(userId);
+ Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
+ Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "appwidget reload");
reloadWidgetsMaskedStateForGroup(mSecurityPolicy.getGroupParent(userId));
+ Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
final int N = mProviders.size();
for (int i = 0; i < N; i++) {
@@ -2658,13 +2664,18 @@
}
if (provider.widgets.size() > 0) {
+ Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,
+ "appwidget init " + provider.info.provider.getPackageName());
sendEnableIntentLocked(provider);
int[] appWidgetIds = getWidgetIds(provider.widgets);
sendUpdateIntentLocked(provider, appWidgetIds);
registerForBroadcastsLocked(provider, appWidgetIds);
+ Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
}
}
}
+ Slog.i(TAG, "Async processing of onUserUnlocked u" + userId + " took "
+ + (SystemClock.elapsedRealtime() - time) + " ms");
}
// only call from initialization -- it assumes that the data structures are all empty
diff --git a/services/art-profile b/services/art-profile
new file mode 100644
index 0000000..140465a
--- /dev/null
+++ b/services/art-profile
@@ -0,0 +1,15625 @@
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->asBinder()Landroid/os/IHwBinder;
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->authenticate(JI)I
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->cancel()I
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->enroll([BII)I
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->enumerate()I
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->getAuthenticatorId()J
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->getHashChain()Ljava/util/ArrayList;
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->interfaceChain()Ljava/util/ArrayList;
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->interfaceDescriptor()Ljava/lang/String;
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->notifySyspropsChanged()V
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->ping()V
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->postEnroll()I
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->preEnroll()J
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->remove(II)I
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->setActiveGroup(ILjava/lang/String;)I
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->setHALInstrumentation()V
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->setNotify(Landroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;)J
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->asBinder()Landroid/os/IHwBinder;
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->getHashChain()Ljava/util/ArrayList;
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->interfaceChain()Ljava/util/ArrayList;
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->interfaceDescriptor()Ljava/lang/String;
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->notifySyspropsChanged()V
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->onAcquired(JII)V
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->onAuthenticated(JIILjava/util/ArrayList;)V
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->onEnrollResult(JIII)V
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->onEnumerate(JIII)V
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->onError(JII)V
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->onRemoved(JIII)V
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->ping()V
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->setHALInstrumentation()V
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
+HPLandroid/hardware/usb/V1_0/IUsb;->asBinder()Landroid/os/IHwBinder;
+HPLandroid/hardware/usb/V1_0/IUsb;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
+HPLandroid/hardware/usb/V1_0/IUsb;->getHashChain()Ljava/util/ArrayList;
+HPLandroid/hardware/usb/V1_0/IUsb;->interfaceChain()Ljava/util/ArrayList;
+HPLandroid/hardware/usb/V1_0/IUsb;->interfaceDescriptor()Ljava/lang/String;
+HPLandroid/hardware/usb/V1_0/IUsb;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+HPLandroid/hardware/usb/V1_0/IUsb;->notifySyspropsChanged()V
+HPLandroid/hardware/usb/V1_0/IUsb;->ping()V
+HPLandroid/hardware/usb/V1_0/IUsb;->queryPortStatus()V
+HPLandroid/hardware/usb/V1_0/IUsb;->setCallback(Landroid/hardware/usb/V1_0/IUsbCallback;)V
+HPLandroid/hardware/usb/V1_0/IUsb;->setHALInstrumentation()V
+HPLandroid/hardware/usb/V1_0/IUsb;->switchRole(Ljava/lang/String;Landroid/hardware/usb/V1_0/PortRole;)V
+HPLandroid/hardware/usb/V1_0/IUsb;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
+HPLandroid/hardware/usb/V1_0/IUsbCallback;->asBinder()Landroid/os/IHwBinder;
+HPLandroid/hardware/usb/V1_0/IUsbCallback;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
+HPLandroid/hardware/usb/V1_0/IUsbCallback;->getHashChain()Ljava/util/ArrayList;
+HPLandroid/hardware/usb/V1_0/IUsbCallback;->interfaceChain()Ljava/util/ArrayList;
+HPLandroid/hardware/usb/V1_0/IUsbCallback;->interfaceDescriptor()Ljava/lang/String;
+HPLandroid/hardware/usb/V1_0/IUsbCallback;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+HPLandroid/hardware/usb/V1_0/IUsbCallback;->notifyPortStatusChange(Ljava/util/ArrayList;I)V
+HPLandroid/hardware/usb/V1_0/IUsbCallback;->notifyRoleSwitchStatus(Ljava/lang/String;Landroid/hardware/usb/V1_0/PortRole;I)V
+HPLandroid/hardware/usb/V1_0/IUsbCallback;->notifySyspropsChanged()V
+HPLandroid/hardware/usb/V1_0/IUsbCallback;->ping()V
+HPLandroid/hardware/usb/V1_0/IUsbCallback;->setHALInstrumentation()V
+HPLandroid/hardware/usb/V1_0/IUsbCallback;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
+HPLandroid/hardware/usb/V1_1/IUsbCallback;->asBinder()Landroid/os/IHwBinder;
+HPLandroid/hardware/usb/V1_1/IUsbCallback;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
+HPLandroid/hardware/usb/V1_1/IUsbCallback;->getHashChain()Ljava/util/ArrayList;
+HPLandroid/hardware/usb/V1_1/IUsbCallback;->interfaceChain()Ljava/util/ArrayList;
+HPLandroid/hardware/usb/V1_1/IUsbCallback;->interfaceDescriptor()Ljava/lang/String;
+HPLandroid/hardware/usb/V1_1/IUsbCallback;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+HPLandroid/hardware/usb/V1_1/IUsbCallback;->notifyPortStatusChange_1_1(Ljava/util/ArrayList;I)V
+HPLandroid/hardware/usb/V1_1/IUsbCallback;->notifySyspropsChanged()V
+HPLandroid/hardware/usb/V1_1/IUsbCallback;->ping()V
+HPLandroid/hardware/usb/V1_1/IUsbCallback;->setHALInstrumentation()V
+HPLandroid/hardware/usb/V1_1/IUsbCallback;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
+HPLandroid/hardware/wifi/V1_0/IWifi$getChipCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/IWifiChip;)V
+HPLandroid/hardware/wifi/V1_0/IWifi$getChipIdsCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+HPLandroid/hardware/wifi/V1_0/IWifi;->asBinder()Landroid/os/IHwBinder;
+HPLandroid/hardware/wifi/V1_0/IWifi;->getChip(ILandroid/hardware/wifi/V1_0/IWifi$getChipCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifi;->getChipIds(Landroid/hardware/wifi/V1_0/IWifi$getChipIdsCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifi;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
+HPLandroid/hardware/wifi/V1_0/IWifi;->getHashChain()Ljava/util/ArrayList;
+HPLandroid/hardware/wifi/V1_0/IWifi;->interfaceChain()Ljava/util/ArrayList;
+HPLandroid/hardware/wifi/V1_0/IWifi;->interfaceDescriptor()Ljava/lang/String;
+HPLandroid/hardware/wifi/V1_0/IWifi;->isStarted()Z
+HPLandroid/hardware/wifi/V1_0/IWifi;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+HPLandroid/hardware/wifi/V1_0/IWifi;->notifySyspropsChanged()V
+HPLandroid/hardware/wifi/V1_0/IWifi;->ping()V
+HPLandroid/hardware/wifi/V1_0/IWifi;->registerEventCallback(Landroid/hardware/wifi/V1_0/IWifiEventCallback;)Landroid/hardware/wifi/V1_0/WifiStatus;
+HPLandroid/hardware/wifi/V1_0/IWifi;->setHALInstrumentation()V
+HPLandroid/hardware/wifi/V1_0/IWifi;->start()Landroid/hardware/wifi/V1_0/WifiStatus;
+HPLandroid/hardware/wifi/V1_0/IWifi;->stop()Landroid/hardware/wifi/V1_0/WifiStatus;
+HPLandroid/hardware/wifi/V1_0/IWifi;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
+HPLandroid/hardware/wifi/V1_0/IWifiChip$createRttControllerCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/IWifiRttController;)V
+HPLandroid/hardware/wifi/V1_0/IWifiChip$createStaIfaceCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/IWifiStaIface;)V
+HPLandroid/hardware/wifi/V1_0/IWifiChip$getApIfaceNamesCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+HPLandroid/hardware/wifi/V1_0/IWifiChip$getAvailableModesCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+HPLandroid/hardware/wifi/V1_0/IWifiChip$getDebugRingBuffersStatusCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+HPLandroid/hardware/wifi/V1_0/IWifiChip$getModeCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;I)V
+HPLandroid/hardware/wifi/V1_0/IWifiChip$getNanIfaceNamesCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+HPLandroid/hardware/wifi/V1_0/IWifiChip$getP2pIfaceNamesCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+HPLandroid/hardware/wifi/V1_0/IWifiChip$getStaIfaceCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/IWifiStaIface;)V
+HPLandroid/hardware/wifi/V1_0/IWifiChip$getStaIfaceNamesCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+HPLandroid/hardware/wifi/V1_0/IWifiChip$requestChipDebugInfoCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/IWifiChip$ChipDebugInfo;)V
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->asBinder()Landroid/os/IHwBinder;
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->configureChip(I)Landroid/hardware/wifi/V1_0/WifiStatus;
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->createApIface(Landroid/hardware/wifi/V1_0/IWifiChip$createApIfaceCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->createNanIface(Landroid/hardware/wifi/V1_0/IWifiChip$createNanIfaceCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->createP2pIface(Landroid/hardware/wifi/V1_0/IWifiChip$createP2pIfaceCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->createRttController(Landroid/hardware/wifi/V1_0/IWifiIface;Landroid/hardware/wifi/V1_0/IWifiChip$createRttControllerCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->createStaIface(Landroid/hardware/wifi/V1_0/IWifiChip$createStaIfaceCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->enableDebugErrorAlerts(Z)Landroid/hardware/wifi/V1_0/WifiStatus;
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->forceDumpToDebugRingBuffer(Ljava/lang/String;)Landroid/hardware/wifi/V1_0/WifiStatus;
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->getApIface(Ljava/lang/String;Landroid/hardware/wifi/V1_0/IWifiChip$getApIfaceCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->getApIfaceNames(Landroid/hardware/wifi/V1_0/IWifiChip$getApIfaceNamesCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->getAvailableModes(Landroid/hardware/wifi/V1_0/IWifiChip$getAvailableModesCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->getCapabilities(Landroid/hardware/wifi/V1_0/IWifiChip$getCapabilitiesCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->getDebugHostWakeReasonStats(Landroid/hardware/wifi/V1_0/IWifiChip$getDebugHostWakeReasonStatsCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->getDebugRingBuffersStatus(Landroid/hardware/wifi/V1_0/IWifiChip$getDebugRingBuffersStatusCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->getHashChain()Ljava/util/ArrayList;
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->getId(Landroid/hardware/wifi/V1_0/IWifiChip$getIdCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->getMode(Landroid/hardware/wifi/V1_0/IWifiChip$getModeCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->getNanIface(Ljava/lang/String;Landroid/hardware/wifi/V1_0/IWifiChip$getNanIfaceCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->getNanIfaceNames(Landroid/hardware/wifi/V1_0/IWifiChip$getNanIfaceNamesCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->getP2pIface(Ljava/lang/String;Landroid/hardware/wifi/V1_0/IWifiChip$getP2pIfaceCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->getP2pIfaceNames(Landroid/hardware/wifi/V1_0/IWifiChip$getP2pIfaceNamesCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->getStaIface(Ljava/lang/String;Landroid/hardware/wifi/V1_0/IWifiChip$getStaIfaceCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->getStaIfaceNames(Landroid/hardware/wifi/V1_0/IWifiChip$getStaIfaceNamesCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->interfaceChain()Ljava/util/ArrayList;
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->interfaceDescriptor()Ljava/lang/String;
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->notifySyspropsChanged()V
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->ping()V
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->registerEventCallback(Landroid/hardware/wifi/V1_0/IWifiChipEventCallback;)Landroid/hardware/wifi/V1_0/WifiStatus;
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->removeApIface(Ljava/lang/String;)Landroid/hardware/wifi/V1_0/WifiStatus;
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->removeNanIface(Ljava/lang/String;)Landroid/hardware/wifi/V1_0/WifiStatus;
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->removeP2pIface(Ljava/lang/String;)Landroid/hardware/wifi/V1_0/WifiStatus;
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->removeStaIface(Ljava/lang/String;)Landroid/hardware/wifi/V1_0/WifiStatus;
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->requestChipDebugInfo(Landroid/hardware/wifi/V1_0/IWifiChip$requestChipDebugInfoCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->requestDriverDebugDump(Landroid/hardware/wifi/V1_0/IWifiChip$requestDriverDebugDumpCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->requestFirmwareDebugDump(Landroid/hardware/wifi/V1_0/IWifiChip$requestFirmwareDebugDumpCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->setHALInstrumentation()V
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->startLoggingToDebugRingBuffer(Ljava/lang/String;III)Landroid/hardware/wifi/V1_0/WifiStatus;
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->stopLoggingToDebugRingBuffer()Landroid/hardware/wifi/V1_0/WifiStatus;
+HPLandroid/hardware/wifi/V1_0/IWifiChip;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
+HPLandroid/hardware/wifi/V1_0/IWifiChipEventCallback$Stub;->onTransact(ILandroid/os/HwParcel;Landroid/os/HwParcel;I)V
+HPLandroid/hardware/wifi/V1_0/IWifiChipEventCallback;->asBinder()Landroid/os/IHwBinder;
+HPLandroid/hardware/wifi/V1_0/IWifiChipEventCallback;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
+HPLandroid/hardware/wifi/V1_0/IWifiChipEventCallback;->getHashChain()Ljava/util/ArrayList;
+HPLandroid/hardware/wifi/V1_0/IWifiChipEventCallback;->interfaceChain()Ljava/util/ArrayList;
+HPLandroid/hardware/wifi/V1_0/IWifiChipEventCallback;->interfaceDescriptor()Ljava/lang/String;
+HPLandroid/hardware/wifi/V1_0/IWifiChipEventCallback;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+HPLandroid/hardware/wifi/V1_0/IWifiChipEventCallback;->notifySyspropsChanged()V
+HPLandroid/hardware/wifi/V1_0/IWifiChipEventCallback;->onChipReconfigureFailure(Landroid/hardware/wifi/V1_0/WifiStatus;)V
+HPLandroid/hardware/wifi/V1_0/IWifiChipEventCallback;->onChipReconfigured(I)V
+HPLandroid/hardware/wifi/V1_0/IWifiChipEventCallback;->onDebugErrorAlert(ILjava/util/ArrayList;)V
+HPLandroid/hardware/wifi/V1_0/IWifiChipEventCallback;->onDebugRingBufferDataAvailable(Landroid/hardware/wifi/V1_0/WifiDebugRingBufferStatus;Ljava/util/ArrayList;)V
+HPLandroid/hardware/wifi/V1_0/IWifiChipEventCallback;->onIfaceAdded(ILjava/lang/String;)V
+HPLandroid/hardware/wifi/V1_0/IWifiChipEventCallback;->onIfaceRemoved(ILjava/lang/String;)V
+HPLandroid/hardware/wifi/V1_0/IWifiChipEventCallback;->ping()V
+HPLandroid/hardware/wifi/V1_0/IWifiChipEventCallback;->setHALInstrumentation()V
+HPLandroid/hardware/wifi/V1_0/IWifiChipEventCallback;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
+HPLandroid/hardware/wifi/V1_0/IWifiEventCallback;->asBinder()Landroid/os/IHwBinder;
+HPLandroid/hardware/wifi/V1_0/IWifiEventCallback;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
+HPLandroid/hardware/wifi/V1_0/IWifiEventCallback;->getHashChain()Ljava/util/ArrayList;
+HPLandroid/hardware/wifi/V1_0/IWifiEventCallback;->interfaceChain()Ljava/util/ArrayList;
+HPLandroid/hardware/wifi/V1_0/IWifiEventCallback;->interfaceDescriptor()Ljava/lang/String;
+HPLandroid/hardware/wifi/V1_0/IWifiEventCallback;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+HPLandroid/hardware/wifi/V1_0/IWifiEventCallback;->notifySyspropsChanged()V
+HPLandroid/hardware/wifi/V1_0/IWifiEventCallback;->onFailure(Landroid/hardware/wifi/V1_0/WifiStatus;)V
+HPLandroid/hardware/wifi/V1_0/IWifiEventCallback;->onStart()V
+HPLandroid/hardware/wifi/V1_0/IWifiEventCallback;->onStop()V
+HPLandroid/hardware/wifi/V1_0/IWifiEventCallback;->ping()V
+HPLandroid/hardware/wifi/V1_0/IWifiEventCallback;->setHALInstrumentation()V
+HPLandroid/hardware/wifi/V1_0/IWifiEventCallback;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
+HPLandroid/hardware/wifi/V1_0/IWifiIface$getNameCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/lang/String;)V
+HPLandroid/hardware/wifi/V1_0/IWifiIface;->asBinder()Landroid/os/IHwBinder;
+HPLandroid/hardware/wifi/V1_0/IWifiIface;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
+HPLandroid/hardware/wifi/V1_0/IWifiIface;->getHashChain()Ljava/util/ArrayList;
+HPLandroid/hardware/wifi/V1_0/IWifiIface;->getName(Landroid/hardware/wifi/V1_0/IWifiIface$getNameCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifiIface;->getType(Landroid/hardware/wifi/V1_0/IWifiIface$getTypeCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifiIface;->interfaceChain()Ljava/util/ArrayList;
+HPLandroid/hardware/wifi/V1_0/IWifiIface;->interfaceDescriptor()Ljava/lang/String;
+HPLandroid/hardware/wifi/V1_0/IWifiIface;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+HPLandroid/hardware/wifi/V1_0/IWifiIface;->notifySyspropsChanged()V
+HPLandroid/hardware/wifi/V1_0/IWifiIface;->ping()V
+HPLandroid/hardware/wifi/V1_0/IWifiIface;->setHALInstrumentation()V
+HPLandroid/hardware/wifi/V1_0/IWifiIface;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
+HPLandroid/hardware/wifi/V1_0/IWifiRttController;->asBinder()Landroid/os/IHwBinder;
+HPLandroid/hardware/wifi/V1_0/IWifiRttController;->disableResponder(I)Landroid/hardware/wifi/V1_0/WifiStatus;
+HPLandroid/hardware/wifi/V1_0/IWifiRttController;->enableResponder(ILandroid/hardware/wifi/V1_0/WifiChannelInfo;ILandroid/hardware/wifi/V1_0/RttResponder;)Landroid/hardware/wifi/V1_0/WifiStatus;
+HPLandroid/hardware/wifi/V1_0/IWifiRttController;->getBoundIface(Landroid/hardware/wifi/V1_0/IWifiRttController$getBoundIfaceCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifiRttController;->getCapabilities(Landroid/hardware/wifi/V1_0/IWifiRttController$getCapabilitiesCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifiRttController;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
+HPLandroid/hardware/wifi/V1_0/IWifiRttController;->getHashChain()Ljava/util/ArrayList;
+HPLandroid/hardware/wifi/V1_0/IWifiRttController;->getResponderInfo(Landroid/hardware/wifi/V1_0/IWifiRttController$getResponderInfoCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifiRttController;->interfaceChain()Ljava/util/ArrayList;
+HPLandroid/hardware/wifi/V1_0/IWifiRttController;->interfaceDescriptor()Ljava/lang/String;
+HPLandroid/hardware/wifi/V1_0/IWifiRttController;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+HPLandroid/hardware/wifi/V1_0/IWifiRttController;->notifySyspropsChanged()V
+HPLandroid/hardware/wifi/V1_0/IWifiRttController;->ping()V
+HPLandroid/hardware/wifi/V1_0/IWifiRttController;->rangeCancel(ILjava/util/ArrayList;)Landroid/hardware/wifi/V1_0/WifiStatus;
+HPLandroid/hardware/wifi/V1_0/IWifiRttController;->rangeRequest(ILjava/util/ArrayList;)Landroid/hardware/wifi/V1_0/WifiStatus;
+HPLandroid/hardware/wifi/V1_0/IWifiRttController;->registerEventCallback(Landroid/hardware/wifi/V1_0/IWifiRttControllerEventCallback;)Landroid/hardware/wifi/V1_0/WifiStatus;
+HPLandroid/hardware/wifi/V1_0/IWifiRttController;->setHALInstrumentation()V
+HPLandroid/hardware/wifi/V1_0/IWifiRttController;->setLci(ILandroid/hardware/wifi/V1_0/RttLciInformation;)Landroid/hardware/wifi/V1_0/WifiStatus;
+HPLandroid/hardware/wifi/V1_0/IWifiRttController;->setLcr(ILandroid/hardware/wifi/V1_0/RttLcrInformation;)Landroid/hardware/wifi/V1_0/WifiStatus;
+HPLandroid/hardware/wifi/V1_0/IWifiRttController;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
+HPLandroid/hardware/wifi/V1_0/IWifiRttControllerEventCallback;->asBinder()Landroid/os/IHwBinder;
+HPLandroid/hardware/wifi/V1_0/IWifiRttControllerEventCallback;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
+HPLandroid/hardware/wifi/V1_0/IWifiRttControllerEventCallback;->getHashChain()Ljava/util/ArrayList;
+HPLandroid/hardware/wifi/V1_0/IWifiRttControllerEventCallback;->interfaceChain()Ljava/util/ArrayList;
+HPLandroid/hardware/wifi/V1_0/IWifiRttControllerEventCallback;->interfaceDescriptor()Ljava/lang/String;
+HPLandroid/hardware/wifi/V1_0/IWifiRttControllerEventCallback;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+HPLandroid/hardware/wifi/V1_0/IWifiRttControllerEventCallback;->notifySyspropsChanged()V
+HPLandroid/hardware/wifi/V1_0/IWifiRttControllerEventCallback;->onResults(ILjava/util/ArrayList;)V
+HPLandroid/hardware/wifi/V1_0/IWifiRttControllerEventCallback;->ping()V
+HPLandroid/hardware/wifi/V1_0/IWifiRttControllerEventCallback;->setHALInstrumentation()V
+HPLandroid/hardware/wifi/V1_0/IWifiRttControllerEventCallback;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface$Proxy;->getLinkLayerStats(Landroid/hardware/wifi/V1_0/IWifiStaIface$getLinkLayerStatsCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface$getApfPacketFilterCapabilitiesCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/StaApfPacketFilterCapabilities;)V
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface$getBackgroundScanCapabilitiesCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/StaBackgroundScanCapabilities;)V
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface$getCapabilitiesCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;I)V
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface$getDebugRxPacketFatesCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface$getDebugTxPacketFatesCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface$getLinkLayerStatsCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/StaLinkLayerStats;)V
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface$getRoamingCapabilitiesCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/StaRoamingCapabilities;)V
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface$getValidFrequenciesForBandCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface;->asBinder()Landroid/os/IHwBinder;
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface;->configureRoaming(Landroid/hardware/wifi/V1_0/StaRoamingConfig;)Landroid/hardware/wifi/V1_0/WifiStatus;
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface;->disableLinkLayerStatsCollection()Landroid/hardware/wifi/V1_0/WifiStatus;
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface;->enableLinkLayerStatsCollection(Z)Landroid/hardware/wifi/V1_0/WifiStatus;
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface;->enableNdOffload(Z)Landroid/hardware/wifi/V1_0/WifiStatus;
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface;->getApfPacketFilterCapabilities(Landroid/hardware/wifi/V1_0/IWifiStaIface$getApfPacketFilterCapabilitiesCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface;->getBackgroundScanCapabilities(Landroid/hardware/wifi/V1_0/IWifiStaIface$getBackgroundScanCapabilitiesCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface;->getCapabilities(Landroid/hardware/wifi/V1_0/IWifiStaIface$getCapabilitiesCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface;->getDebugRxPacketFates(Landroid/hardware/wifi/V1_0/IWifiStaIface$getDebugRxPacketFatesCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface;->getDebugTxPacketFates(Landroid/hardware/wifi/V1_0/IWifiStaIface$getDebugTxPacketFatesCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface;->getHashChain()Ljava/util/ArrayList;
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface;->getLinkLayerStats(Landroid/hardware/wifi/V1_0/IWifiStaIface$getLinkLayerStatsCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface;->getRoamingCapabilities(Landroid/hardware/wifi/V1_0/IWifiStaIface$getRoamingCapabilitiesCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface;->getValidFrequenciesForBand(ILandroid/hardware/wifi/V1_0/IWifiStaIface$getValidFrequenciesForBandCallback;)V
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface;->installApfPacketFilter(ILjava/util/ArrayList;)Landroid/hardware/wifi/V1_0/WifiStatus;
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface;->interfaceChain()Ljava/util/ArrayList;
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface;->interfaceDescriptor()Ljava/lang/String;
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface;->notifySyspropsChanged()V
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface;->ping()V
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface;->registerEventCallback(Landroid/hardware/wifi/V1_0/IWifiStaIfaceEventCallback;)Landroid/hardware/wifi/V1_0/WifiStatus;
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface;->setHALInstrumentation()V
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface;->setRoamingState(B)Landroid/hardware/wifi/V1_0/WifiStatus;
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface;->setScanningMacOui([B)Landroid/hardware/wifi/V1_0/WifiStatus;
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface;->startBackgroundScan(ILandroid/hardware/wifi/V1_0/StaBackgroundScanParameters;)Landroid/hardware/wifi/V1_0/WifiStatus;
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface;->startDebugPacketFateMonitoring()Landroid/hardware/wifi/V1_0/WifiStatus;
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface;->startRssiMonitoring(III)Landroid/hardware/wifi/V1_0/WifiStatus;
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface;->startSendingKeepAlivePackets(ILjava/util/ArrayList;S[B[BI)Landroid/hardware/wifi/V1_0/WifiStatus;
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface;->stopBackgroundScan(I)Landroid/hardware/wifi/V1_0/WifiStatus;
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface;->stopRssiMonitoring(I)Landroid/hardware/wifi/V1_0/WifiStatus;
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface;->stopSendingKeepAlivePackets(I)Landroid/hardware/wifi/V1_0/WifiStatus;
+HPLandroid/hardware/wifi/V1_0/IWifiStaIface;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
+HPLandroid/hardware/wifi/V1_0/IWifiStaIfaceEventCallback;->asBinder()Landroid/os/IHwBinder;
+HPLandroid/hardware/wifi/V1_0/IWifiStaIfaceEventCallback;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
+HPLandroid/hardware/wifi/V1_0/IWifiStaIfaceEventCallback;->getHashChain()Ljava/util/ArrayList;
+HPLandroid/hardware/wifi/V1_0/IWifiStaIfaceEventCallback;->interfaceChain()Ljava/util/ArrayList;
+HPLandroid/hardware/wifi/V1_0/IWifiStaIfaceEventCallback;->interfaceDescriptor()Ljava/lang/String;
+HPLandroid/hardware/wifi/V1_0/IWifiStaIfaceEventCallback;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+HPLandroid/hardware/wifi/V1_0/IWifiStaIfaceEventCallback;->notifySyspropsChanged()V
+HPLandroid/hardware/wifi/V1_0/IWifiStaIfaceEventCallback;->onBackgroundFullScanResult(IILandroid/hardware/wifi/V1_0/StaScanResult;)V
+HPLandroid/hardware/wifi/V1_0/IWifiStaIfaceEventCallback;->onBackgroundScanFailure(I)V
+HPLandroid/hardware/wifi/V1_0/IWifiStaIfaceEventCallback;->onBackgroundScanResults(ILjava/util/ArrayList;)V
+HPLandroid/hardware/wifi/V1_0/IWifiStaIfaceEventCallback;->onRssiThresholdBreached(I[BI)V
+HPLandroid/hardware/wifi/V1_0/IWifiStaIfaceEventCallback;->ping()V
+HPLandroid/hardware/wifi/V1_0/IWifiStaIfaceEventCallback;->setHALInstrumentation()V
+HPLandroid/hardware/wifi/V1_0/IWifiStaIfaceEventCallback;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
+HPLandroid/hardware/wifi/V1_0/StaLinkLayerIfacePacketStats;->readEmbeddedFromParcel(Landroid/os/HwParcel;Landroid/os/HwBlob;J)V
+HPLandroid/hardware/wifi/V1_0/StaLinkLayerRadioStats;->readEmbeddedFromParcel(Landroid/os/HwParcel;Landroid/os/HwBlob;J)V
+HPLandroid/hardware/wifi/V1_0/StaLinkLayerStats;->readEmbeddedFromParcel(Landroid/os/HwParcel;Landroid/os/HwBlob;J)V
+HPLandroid/hardware/wifi/V1_0/WifiDebugPacketFateFrameInfo;->readEmbeddedFromParcel(Landroid/os/HwParcel;Landroid/os/HwBlob;J)V
+HPLandroid/hardware/wifi/V1_0/WifiDebugRingBufferStatus;-><init>()V
+HPLandroid/hardware/wifi/V1_0/WifiDebugRingBufferStatus;->readEmbeddedFromParcel(Landroid/os/HwParcel;Landroid/os/HwBlob;J)V
+HPLandroid/hardware/wifi/V1_0/WifiDebugRingBufferStatus;->readFromParcel(Landroid/os/HwParcel;)V
+HPLandroid/hardware/wifi/V1_0/WifiStatus;->readEmbeddedFromParcel(Landroid/os/HwParcel;Landroid/os/HwBlob;J)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicant;->asBinder()Landroid/os/IHwBinder;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicant;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicant;->getDebugLevel()I
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicant;->getHashChain()Ljava/util/ArrayList;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicant;->getInterface(Landroid/hardware/wifi/supplicant/V1_0/ISupplicant$IfaceInfo;Landroid/hardware/wifi/supplicant/V1_0/ISupplicant$getInterfaceCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicant;->interfaceChain()Ljava/util/ArrayList;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicant;->interfaceDescriptor()Ljava/lang/String;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicant;->isDebugShowKeysEnabled()Z
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicant;->isDebugShowTimestampEnabled()Z
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicant;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicant;->listInterfaces(Landroid/hardware/wifi/supplicant/V1_0/ISupplicant$listInterfacesCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicant;->notifySyspropsChanged()V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicant;->ping()V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicant;->registerCallback(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantCallback;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicant;->setConcurrencyPriority(I)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicant;->setDebugParams(IZZ)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicant;->setHALInstrumentation()V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicant;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantIface$addNetworkCallback;->onValues(Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;Landroid/hardware/wifi/supplicant/V1_0/ISupplicantNetwork;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface$getDeviceAddressCallback;->onValues(Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;[B)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->addBonjourService(Ljava/util/ArrayList;Ljava/util/ArrayList;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->addGroup(ZI)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->addUpnpService(ILjava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->asBinder()Landroid/os/IHwBinder;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->cancelConnect()Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->cancelServiceDiscovery(J)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->cancelWps(Ljava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->configureExtListen(II)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->connect([BILjava/lang/String;ZZILandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface$connectCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->createNfcHandoverRequestMessage(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface$createNfcHandoverRequestMessageCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->createNfcHandoverSelectMessage(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface$createNfcHandoverSelectMessageCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->enableWfd(Z)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->find(I)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->flush()Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->flushServices()Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->getDeviceAddress(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface$getDeviceAddressCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->getGroupCapability([BLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface$getGroupCapabilityCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->getHashChain()Ljava/util/ArrayList;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->getSsid([BLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface$getSsidCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->interfaceChain()Ljava/util/ArrayList;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->interfaceDescriptor()Ljava/lang/String;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->invite(Ljava/lang/String;[B[B)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->notifySyspropsChanged()V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->ping()V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->provisionDiscovery([BI)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->registerCallback(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIfaceCallback;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->reinvoke(I[B)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->reject([B)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->removeBonjourService(Ljava/util/ArrayList;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->removeGroup(Ljava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->removeUpnpService(ILjava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->reportNfcHandoverInitiation(Ljava/util/ArrayList;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->reportNfcHandoverResponse(Ljava/util/ArrayList;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->requestServiceDiscovery([BLjava/util/ArrayList;Landroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface$requestServiceDiscoveryCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->saveConfig()Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->setDisallowedFrequencies(Ljava/util/ArrayList;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->setGroupIdle(Ljava/lang/String;I)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->setHALInstrumentation()V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->setListenChannel(II)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->setMiracastMode(B)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->setPowerSave(Ljava/lang/String;Z)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->setSsidPostfix(Ljava/util/ArrayList;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->setWfdDeviceInfo([B)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->startWpsPbc(Ljava/lang/String;[B)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->startWpsPinDisplay(Ljava/lang/String;[BLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface$startWpsPinDisplayCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->startWpsPinKeypad(Ljava/lang/String;Ljava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->stopFind()Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIfaceCallback;->asBinder()Landroid/os/IHwBinder;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIfaceCallback;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIfaceCallback;->getHashChain()Ljava/util/ArrayList;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIfaceCallback;->interfaceChain()Ljava/util/ArrayList;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIfaceCallback;->interfaceDescriptor()Ljava/lang/String;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIfaceCallback;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIfaceCallback;->notifySyspropsChanged()V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIfaceCallback;->onDeviceFound([B[B[BLjava/lang/String;SBI[B)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIfaceCallback;->onDeviceLost([B)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIfaceCallback;->onFindStopped()V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIfaceCallback;->onGoNegotiationCompleted(I)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIfaceCallback;->onGoNegotiationRequest([BS)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIfaceCallback;->onGroupFormationFailure(Ljava/lang/String;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIfaceCallback;->onGroupFormationSuccess()V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIfaceCallback;->onGroupRemoved(Ljava/lang/String;Z)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIfaceCallback;->onGroupStarted(Ljava/lang/String;ZLjava/util/ArrayList;I[BLjava/lang/String;[BZ)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIfaceCallback;->onInvitationReceived([B[B[BII)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIfaceCallback;->onInvitationResult([BI)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIfaceCallback;->onNetworkAdded(I)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIfaceCallback;->onNetworkRemoved(I)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIfaceCallback;->onProvisionDiscoveryCompleted([BZBSLjava/lang/String;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIfaceCallback;->onServiceDiscoveryResponse([BSLjava/util/ArrayList;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIfaceCallback;->onStaAuthorized([B[B)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIfaceCallback;->onStaDeauthorized([B[B)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIfaceCallback;->ping()V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIfaceCallback;->setHALInstrumentation()V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIfaceCallback;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface$getMacAddressCallback;->onValues(Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;[B)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->addExtRadioWork(Ljava/lang/String;IILandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface$addExtRadioWorkCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->addRxFilter(B)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->asBinder()Landroid/os/IHwBinder;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->cancelWps()Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->disconnect()Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->enableAutoReconnect(Z)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->getHashChain()Ljava/util/ArrayList;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->getMacAddress(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface$getMacAddressCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->initiateAnqpQuery([BLjava/util/ArrayList;Ljava/util/ArrayList;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->initiateHs20IconQuery([BLjava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->initiateTdlsDiscover([B)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->initiateTdlsSetup([B)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->initiateTdlsTeardown([B)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->interfaceChain()Ljava/util/ArrayList;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->interfaceDescriptor()Ljava/lang/String;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->notifySyspropsChanged()V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->ping()V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->reassociate()Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->reconnect()Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->registerCallback(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->removeExtRadioWork(I)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->removeRxFilter(B)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->setBtCoexistenceMode(B)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->setBtCoexistenceScanModeEnabled(Z)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->setCountryCode([B)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->setExternalSim(Z)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->setHALInstrumentation()V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->setPowerSave(Z)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->setSuspendModeEnabled(Z)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->startRxFilter()Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->startWpsPbc([B)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->startWpsPinDisplay([BLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface$startWpsPinDisplayCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->startWpsPinKeypad(Ljava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->startWpsRegistrar([BLjava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->stopRxFilter()Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->asBinder()Landroid/os/IHwBinder;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->getHashChain()Ljava/util/ArrayList;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->interfaceChain()Ljava/util/ArrayList;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->interfaceDescriptor()Ljava/lang/String;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->notifySyspropsChanged()V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->onAnqpQueryDone([BLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback$AnqpData;Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback$Hs20AnqpData;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->onAssociationRejected([BIZ)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->onAuthenticationTimeout([B)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->onBssidChanged(B[B)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->onDisconnected([BZI)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->onEapFailure()V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->onExtRadioWorkStart(I)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->onExtRadioWorkTimeout(I)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->onHs20DeauthImminentNotice([BIILjava/lang/String;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->onHs20IconQueryDone([BLjava/lang/String;Ljava/util/ArrayList;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->onHs20SubscriptionRemediation([BBLjava/lang/String;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->onNetworkAdded(I)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->onNetworkRemoved(I)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->onStateChanged(I[BILjava/util/ArrayList;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->onWpsEventFail([BSS)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->onWpsEventPbcOverlap()V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->onWpsEventSuccess()V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->ping()V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->setHALInstrumentation()V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->asBinder()Landroid/os/IHwBinder;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->disable()Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->enable(Z)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getAuthAlg(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getAuthAlgCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getBssid(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getBssidCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getEapAltSubjectMatch(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getEapAltSubjectMatchCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getEapAnonymousIdentity(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getEapAnonymousIdentityCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getEapCACert(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getEapCACertCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getEapCAPath(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getEapCAPathCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getEapClientCert(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getEapClientCertCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getEapDomainSuffixMatch(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getEapDomainSuffixMatchCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getEapEngine(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getEapEngineCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getEapEngineID(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getEapEngineIDCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getEapIdentity(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getEapIdentityCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getEapMethod(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getEapMethodCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getEapPassword(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getEapPasswordCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getEapPhase2Method(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getEapPhase2MethodCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getEapPrivateKeyId(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getEapPrivateKeyIdCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getEapSubjectMatch(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getEapSubjectMatchCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getGroupCipher(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getGroupCipherCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getHashChain()Ljava/util/ArrayList;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getIdStr(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getIdStrCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getKeyMgmt(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getKeyMgmtCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getPairwiseCipher(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getPairwiseCipherCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getProto(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getProtoCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getPsk(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getPskCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getPskPassphrase(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getPskPassphraseCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getRequirePmf(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getRequirePmfCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getScanSsid(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getScanSsidCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getSsid(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getSsidCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getWepKey(ILandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getWepKeyCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getWepTxKeyIdx(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getWepTxKeyIdxCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getWpsNfcConfigurationToken(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getWpsNfcConfigurationTokenCallback;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->interfaceChain()Ljava/util/ArrayList;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->interfaceDescriptor()Ljava/lang/String;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->notifySyspropsChanged()V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->ping()V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->registerCallback(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->select()Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->sendNetworkEapIdentityResponse(Ljava/util/ArrayList;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->sendNetworkEapSimGsmAuthFailure()Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->sendNetworkEapSimGsmAuthResponse(Ljava/util/ArrayList;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->sendNetworkEapSimUmtsAuthFailure()Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->sendNetworkEapSimUmtsAuthResponse(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$NetworkResponseEapSimUmtsAuthParams;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->sendNetworkEapSimUmtsAutsResponse([B)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setAuthAlg(I)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setBssid([B)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setEapAltSubjectMatch(Ljava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setEapAnonymousIdentity(Ljava/util/ArrayList;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setEapCACert(Ljava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setEapCAPath(Ljava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setEapClientCert(Ljava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setEapDomainSuffixMatch(Ljava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setEapEngine(Z)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setEapEngineID(Ljava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setEapIdentity(Ljava/util/ArrayList;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setEapMethod(I)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setEapPassword(Ljava/util/ArrayList;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setEapPhase2Method(I)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setEapPrivateKeyId(Ljava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setEapSubjectMatch(Ljava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setGroupCipher(I)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setHALInstrumentation()V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setIdStr(Ljava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setKeyMgmt(I)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setPairwiseCipher(I)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setProactiveKeyCaching(Z)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setProto(I)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setPsk([B)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setPskPassphrase(Ljava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setRequirePmf(Z)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setScanSsid(Z)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setSsid(Ljava/util/ArrayList;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setUpdateIdentifier(I)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setWepKey(ILjava/util/ArrayList;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setWepTxKeyIdx(I)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback;->asBinder()Landroid/os/IHwBinder;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback;->getHashChain()Ljava/util/ArrayList;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback;->interfaceChain()Ljava/util/ArrayList;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback;->interfaceDescriptor()Ljava/lang/String;
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback;->notifySyspropsChanged()V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback;->onNetworkEapIdentityRequest()V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback;->onNetworkEapSimGsmAuthRequest(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback$NetworkRequestEapSimGsmAuthParams;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback;->onNetworkEapSimUmtsAuthRequest(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback$NetworkRequestEapSimUmtsAuthParams;)V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback;->ping()V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback;->setHALInstrumentation()V
+HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
+HPLandroid/net/apf/ApfFilter$Ra;->matches([BI)Z
+HPLandroid/net/apf/ApfGenerator$Instruction;->calculateTargetLabelOffset()I
+HPLandroid/net/apf/ApfGenerator$Instruction;->generatedImmSize()B
+HPLandroid/net/apf/ApfGenerator$Instruction;->shrink()Z
+HPLandroid/net/apf/ApfGenerator$Instruction;->size()I
+HPLandroid/net/apf/ApfGenerator;->generate()[B
+HPLandroid/net/apf/ApfGenerator;->updateInstructionOffsets()I
+HPLandroid/net/ip/IpReachabilityMonitor$Callback;->notifyLost(Ljava/net/InetAddress;Ljava/lang/String;)V
+HPLandroid/net/metrics/INetdEventListener;->onConnectEvent(IIILjava/lang/String;II)V
+HPLandroid/net/metrics/INetdEventListener;->onDnsEvent(IIIILjava/lang/String;[Ljava/lang/String;II)V
+HPLandroid/net/metrics/INetdEventListener;->onWakeupEvent(Ljava/lang/String;IIJ)V
+HPLandroid/net/netlink/StructNlAttr;->peek(Ljava/nio/ByteBuffer;)Landroid/net/netlink/StructNlAttr;
+HPLandroid/net/util/BlockingSocketReader;->createSocket()Ljava/io/FileDescriptor;
+HPLandroid/net/util/ConnectivityPacketSummary;->getMacAddressString(Ljava/nio/ByteBuffer;)Ljava/lang/String;
+HPLandroid/net/wifi/IClientInterface;->disableSupplicant()Z
+HPLandroid/net/wifi/IClientInterface;->enableSupplicant()Z
+HPLandroid/net/wifi/IClientInterface;->getInterfaceName()Ljava/lang/String;
+HPLandroid/net/wifi/IClientInterface;->getMacAddress()[B
+HPLandroid/net/wifi/IClientInterface;->getPacketCounters()[I
+HPLandroid/net/wifi/IClientInterface;->getWifiScannerImpl()Landroid/net/wifi/IWifiScannerImpl;
+HPLandroid/net/wifi/IClientInterface;->requestANQP([BLandroid/net/wifi/IANQPDoneCallback;)Z
+HPLandroid/net/wifi/IClientInterface;->signalPoll()[I
+HPLandroid/net/wifi/IInterfaceEventCallback;->OnApInterfaceReady(Landroid/net/wifi/IApInterface;)V
+HPLandroid/net/wifi/IInterfaceEventCallback;->OnApTorndownEvent(Landroid/net/wifi/IApInterface;)V
+HPLandroid/net/wifi/IInterfaceEventCallback;->OnClientInterfaceReady(Landroid/net/wifi/IClientInterface;)V
+HPLandroid/net/wifi/IInterfaceEventCallback;->OnClientTorndownEvent(Landroid/net/wifi/IClientInterface;)V
+HPLandroid/net/wifi/IPnoScanEvent;->OnPnoNetworkFound()V
+HPLandroid/net/wifi/IPnoScanEvent;->OnPnoScanFailed()V
+HPLandroid/net/wifi/IScanEvent;->OnScanFailed()V
+HPLandroid/net/wifi/IScanEvent;->OnScanResultReady()V
+HPLandroid/net/wifi/IWifiScannerImpl;->abortScan()V
+HPLandroid/net/wifi/IWifiScannerImpl;->getAvailable2gChannels()[I
+HPLandroid/net/wifi/IWifiScannerImpl;->getAvailable5gNonDFSChannels()[I
+HPLandroid/net/wifi/IWifiScannerImpl;->getAvailableDFSChannels()[I
+HPLandroid/net/wifi/IWifiScannerImpl;->getScanResults()[Lcom/android/server/wifi/wificond/NativeScanResult;
+HPLandroid/net/wifi/IWifiScannerImpl;->scan(Lcom/android/server/wifi/wificond/SingleScanSettings;)Z
+HPLandroid/net/wifi/IWifiScannerImpl;->startPnoScan(Lcom/android/server/wifi/wificond/PnoSettings;)Z
+HPLandroid/net/wifi/IWifiScannerImpl;->stopPnoScan()Z
+HPLandroid/net/wifi/IWifiScannerImpl;->subscribePnoScanEvents(Landroid/net/wifi/IPnoScanEvent;)V
+HPLandroid/net/wifi/IWifiScannerImpl;->subscribeScanEvents(Landroid/net/wifi/IScanEvent;)V
+HPLandroid/net/wifi/IWifiScannerImpl;->unsubscribePnoScanEvents()V
+HPLandroid/net/wifi/IWifiScannerImpl;->unsubscribeScanEvents()V
+HPLandroid/net/wifi/IWificond;->GetApInterfaces()Ljava/util/List;
+HPLandroid/net/wifi/IWificond;->GetClientInterfaces()Ljava/util/List;
+HPLandroid/net/wifi/IWificond;->RegisterCallback(Landroid/net/wifi/IInterfaceEventCallback;)V
+HPLandroid/net/wifi/IWificond;->UnregisterCallback(Landroid/net/wifi/IInterfaceEventCallback;)V
+HPLandroid/net/wifi/IWificond;->createApInterface()Landroid/net/wifi/IApInterface;
+HPLandroid/net/wifi/IWificond;->createClientInterface()Landroid/net/wifi/IClientInterface;
+HPLandroid/net/wifi/IWificond;->registerRttClient(Landroid/net/wifi/IRttClient;)Landroid/net/wifi/IRttController;
+HPLandroid/net/wifi/IWificond;->tearDownInterfaces()V
+HPLandroid/net/wifi/IWificond;->unregisterRttClient(Landroid/net/wifi/IRttClient;)V
+HPLcom/android/server/AlarmManagerService$2;->set(Ljava/lang/String;IJJJILandroid/app/PendingIntent;Landroid/app/IAlarmListener;Ljava/lang/String;Landroid/os/WorkSource;Landroid/app/AlarmManager$AlarmClockInfo;)V
+HPLcom/android/server/AlarmManagerService$Alarm;->matches(Landroid/app/PendingIntent;Landroid/app/IAlarmListener;)Z
+HPLcom/android/server/AlarmManagerService$Batch;-><init>(Lcom/android/server/AlarmManagerService;Lcom/android/server/AlarmManagerService$Alarm;)V
+HPLcom/android/server/AlarmManagerService$Batch;->add(Lcom/android/server/AlarmManagerService$Alarm;)Z
+HPLcom/android/server/AlarmManagerService$Batch;->canHold(JJ)Z
+HPLcom/android/server/AlarmManagerService$Batch;->get(I)Lcom/android/server/AlarmManagerService$Alarm;
+HPLcom/android/server/AlarmManagerService$Batch;->remove(Landroid/app/PendingIntent;Landroid/app/IAlarmListener;)Z
+HPLcom/android/server/AlarmManagerService$Batch;->size()I
+HPLcom/android/server/AlarmManagerService$BatchTimeOrder;->compare(Lcom/android/server/AlarmManagerService$Batch;Lcom/android/server/AlarmManagerService$Batch;)I
+HPLcom/android/server/AlarmManagerService$BatchTimeOrder;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+HPLcom/android/server/AlarmManagerService$IncreasingTimeOrder;->compare(Lcom/android/server/AlarmManagerService$Alarm;Lcom/android/server/AlarmManagerService$Alarm;)I
+HPLcom/android/server/AlarmManagerService$IncreasingTimeOrder;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+HPLcom/android/server/AlarmManagerService;->addBatchLocked(Ljava/util/ArrayList;Lcom/android/server/AlarmManagerService$Batch;)Z
+HPLcom/android/server/AlarmManagerService;->attemptCoalesceLocked(JJ)I
+HPLcom/android/server/AlarmManagerService;->convertToElapsed(JI)J
+HPLcom/android/server/AlarmManagerService;->reAddAlarmLocked(Lcom/android/server/AlarmManagerService$Alarm;JZ)V
+HPLcom/android/server/AlarmManagerService;->rebatchAllAlarmsLocked(Z)V
+HPLcom/android/server/AlarmManagerService;->removeLocked(Landroid/app/PendingIntent;Landroid/app/IAlarmListener;)V
+HPLcom/android/server/AlarmManagerService;->rescheduleKernelAlarmsLocked()V
+HPLcom/android/server/AlarmManagerService;->setImpl(IJJJLandroid/app/PendingIntent;Landroid/app/IAlarmListener;Ljava/lang/String;ILandroid/os/WorkSource;Landroid/app/AlarmManager$AlarmClockInfo;ILjava/lang/String;)V
+HPLcom/android/server/AlarmManagerService;->setImplLocked(Lcom/android/server/AlarmManagerService$Alarm;ZZ)V
+HPLcom/android/server/AnyMotionDetector$DeviceIdleCallback;->onAnyMotionResult(I)V
+HPLcom/android/server/AppOpsService;->checkPackage(ILjava/lang/String;)I
+HPLcom/android/server/AppOpsService;->finishOperationLocked(Lcom/android/server/AppOpsService$Op;)V
+HPLcom/android/server/AppOpsService;->getOpLocked(Lcom/android/server/AppOpsService$Ops;IZ)Lcom/android/server/AppOpsService$Op;
+HPLcom/android/server/AppOpsService;->getOpsRawLocked(ILjava/lang/String;Z)Lcom/android/server/AppOpsService$Ops;
+HPLcom/android/server/AppOpsService;->getPackagesForOps([I)Ljava/util/List;
+HPLcom/android/server/AppOpsService;->isOpRestrictedLocked(IILjava/lang/String;)Z
+HPLcom/android/server/AppOpsService;->noteOperation(IILjava/lang/String;)I
+HPLcom/android/server/AppOpsService;->noteOperationUnchecked(IILjava/lang/String;ILjava/lang/String;)I
+HPLcom/android/server/AppOpsService;->noteProxyOperation(ILjava/lang/String;ILjava/lang/String;)I
+HPLcom/android/server/AppOpsService;->startOperation(Landroid/os/IBinder;IILjava/lang/String;)I
+HPLcom/android/server/AppOpsService;->verifyIncomingUid(I)V
+HPLcom/android/server/AppOpsService;->writeState()V
+HPLcom/android/server/ConnectivityService;->filterNetworkStateForUid(Landroid/net/NetworkState;IZ)V
+HPLcom/android/server/ConnectivityService;->getActiveNetworkInfo()Landroid/net/NetworkInfo;
+HPLcom/android/server/ConnectivityService;->getActiveNetworkInfoForUid(IZ)Landroid/net/NetworkInfo;
+HPLcom/android/server/ConnectivityService;->getDefaultNetwork()Lcom/android/server/connectivity/NetworkAgentInfo;
+HPLcom/android/server/ConnectivityService;->getUnfilteredActiveNetworkState(I)Landroid/net/NetworkState;
+HPLcom/android/server/ConnectivityService;->getVpnUnderlyingNetworks(I)[Landroid/net/Network;
+HPLcom/android/server/ConnectivityService;->isNetworkWithLinkPropertiesBlocked(Landroid/net/LinkProperties;IZ)Z
+HPLcom/android/server/ConnectivityService;->maybeLogBlockedNetworkInfo(Landroid/net/NetworkInfo;I)V
+HPLcom/android/server/ConnectivityService;->processListenRequests(Lcom/android/server/connectivity/NetworkAgentInfo;Z)V
+HPLcom/android/server/DropBoxManagerService$EntryFile;-><init>(Ljava/io/File;I)V
+HPLcom/android/server/DropBoxManagerService$EntryFile;->compareTo(Lcom/android/server/DropBoxManagerService$EntryFile;)I
+HPLcom/android/server/DropBoxManagerService$EntryFile;->compareTo(Ljava/lang/Object;)I
+HPLcom/android/server/DropBoxManagerService;->add(Landroid/os/DropBoxManager$Entry;)V
+HPLcom/android/server/DropBoxManagerService;->getNextEntry(Ljava/lang/String;J)Landroid/os/DropBoxManager$Entry;
+HPLcom/android/server/DropBoxManagerService;->init()V
+HPLcom/android/server/DropBoxManagerService;->isTagEnabled(Ljava/lang/String;)Z
+HPLcom/android/server/IntentResolver$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+HPLcom/android/server/IntentResolver;->addFilter(Landroid/content/IntentFilter;)V
+HPLcom/android/server/IntentResolver;->addFilter(Landroid/util/ArrayMap;Ljava/lang/String;Landroid/content/IntentFilter;)V
+HPLcom/android/server/IntentResolver;->buildResolveList(Landroid/content/Intent;Landroid/util/FastImmutableArraySet;ZZLjava/lang/String;Ljava/lang/String;[Landroid/content/IntentFilter;Ljava/util/List;I)V
+HPLcom/android/server/IntentResolver;->filterResults(Ljava/util/List;)V
+HPLcom/android/server/IntentResolver;->getFastIntentCategories(Landroid/content/Intent;)Landroid/util/FastImmutableArraySet;
+HPLcom/android/server/IntentResolver;->queryIntent(Landroid/content/Intent;Ljava/lang/String;ZI)Ljava/util/List;
+HPLcom/android/server/IntentResolver;->queryIntentFromList(Landroid/content/Intent;Ljava/lang/String;ZLjava/util/ArrayList;I)Ljava/util/List;
+HPLcom/android/server/IntentResolver;->register_intent_filter(Landroid/content/IntentFilter;Ljava/util/Iterator;Landroid/util/ArrayMap;Ljava/lang/String;)I
+HPLcom/android/server/IntentResolver;->register_mime_types(Landroid/content/IntentFilter;Ljava/lang/String;)I
+HPLcom/android/server/IntentResolver;->remove_all_objects(Landroid/util/ArrayMap;Ljava/lang/String;Ljava/lang/Object;)V
+HPLcom/android/server/LocationManagerService$5;->onUidImportance(II)V
+HPLcom/android/server/NativeDaemonConnector;->appendEscaped(Ljava/lang/StringBuilder;Ljava/lang/String;)V
+HPLcom/android/server/NativeDaemonConnector;->executeForList(JLjava/lang/String;[Ljava/lang/Object;)[Lcom/android/server/NativeDaemonEvent;
+HPLcom/android/server/NativeDaemonConnector;->listenToSocket()V
+HPLcom/android/server/NativeDaemonConnector;->makeCommand(Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;ILjava/lang/String;[Ljava/lang/Object;)V
+HPLcom/android/server/NativeDaemonConnector;->uptimeMillisInt()I
+HPLcom/android/server/NativeDaemonEvent;->parseRawEvent(Ljava/lang/String;[Ljava/io/FileDescriptor;)Lcom/android/server/NativeDaemonEvent;
+HPLcom/android/server/NativeDaemonEvent;->unescapeArgs(Ljava/lang/String;)[Ljava/lang/String;
+HPLcom/android/server/NetworkManagementInternal;->isNetworkRestrictedForUid(I)Z
+HPLcom/android/server/NetworkManagementService$LocalService;->isNetworkRestrictedForUid(I)Z
+HPLcom/android/server/NetworkManagementService;->-get2(Lcom/android/server/NetworkManagementService;)Z
+HPLcom/android/server/NetworkManagementService;->-get4(Lcom/android/server/NetworkManagementService;)Ljava/lang/Object;
+HPLcom/android/server/NetworkManagementService;->-get9(Lcom/android/server/NetworkManagementService;)Landroid/util/SparseBooleanArray;
+HPLcom/android/server/NetworkManagementService;->-wrap1(Lcom/android/server/NetworkManagementService;I)Z
+HPLcom/android/server/NetworkManagementService;->getFirewallChainState(I)Z
+HPLcom/android/server/NetworkManagementService;->invokeForAllObservers(Lcom/android/server/NetworkManagementService$NetworkManagementEventCallback;)V
+HPLcom/android/server/NsdService$DaemonConnectionSupplier;->get(Lcom/android/server/NsdService$NativeCallbackReceiver;)Lcom/android/server/NsdService$DaemonConnection;
+HPLcom/android/server/NsdService$NsdSettings;->isEnabled()Z
+HPLcom/android/server/NsdService$NsdSettings;->putEnabledStatus(Z)V
+HPLcom/android/server/NsdService$NsdSettings;->registerContentObserver(Landroid/net/Uri;Landroid/database/ContentObserver;)V
+HPLcom/android/server/PersistentDataBlockManagerInternal;->getFrpCredentialHandle()[B
+HPLcom/android/server/PersistentDataBlockManagerInternal;->setFrpCredentialHandle([B)V
+HPLcom/android/server/StorageManagerService$StorageManagerInternalImpl;->hasExternalStorage(ILjava/lang/String;)Z
+HPLcom/android/server/StorageManagerService;->getVolumeList(ILjava/lang/String;I)[Landroid/os/storage/StorageVolume;
+HPLcom/android/server/StorageManagerService;->getVolumes(I)[Landroid/os/storage/VolumeInfo;
+HPLcom/android/server/ThreadPriorityBooster;->boost()V
+HPLcom/android/server/ThreadPriorityBooster;->reset()V
+HPLcom/android/server/accessibility/FingerprintGestureDispatcher$FingerprintGestureClient;->isCapturingFingerprintGestures()Z
+HPLcom/android/server/accessibility/FingerprintGestureDispatcher$FingerprintGestureClient;->onFingerprintGesture(I)V
+HPLcom/android/server/accessibility/FingerprintGestureDispatcher$FingerprintGestureClient;->onFingerprintGestureDetectionActiveChanged(Z)V
+HPLcom/android/server/accessibility/KeyEventDispatcher$KeyEventFilter;->onKeyEvent(Landroid/view/KeyEvent;I)Z
+HPLcom/android/server/accounts/AccountManagerService;->checkPackageSignature(Ljava/lang/String;II)I
+HPLcom/android/server/accounts/AccountManagerService;->filterAccounts(Lcom/android/server/accounts/AccountManagerService$UserAccounts;[Landroid/accounts/Account;ILjava/lang/String;Z)[Landroid/accounts/Account;
+HPLcom/android/server/accounts/AccountManagerService;->getAccountsAsUserForPackage(Ljava/lang/String;ILjava/lang/String;ILjava/lang/String;Z)[Landroid/accounts/Account;
+HPLcom/android/server/accounts/AccountManagerService;->getAccountsFromCache(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Ljava/lang/String;ILjava/lang/String;Z)[Landroid/accounts/Account;
+HPLcom/android/server/accounts/AccountManagerService;->getAccountsInternal(Lcom/android/server/accounts/AccountManagerService$UserAccounts;ILjava/lang/String;Ljava/util/List;Z)[Landroid/accounts/Account;
+HPLcom/android/server/accounts/AccountManagerService;->getTypesForCaller(IIZ)Ljava/util/List;
+HPLcom/android/server/accounts/AccountManagerService;->getUserData(Landroid/accounts/Account;Ljava/lang/String;)Ljava/lang/String;
+HPLcom/android/server/accounts/AccountManagerService;->isPermittedForPackage(Ljava/lang/String;II[Ljava/lang/String;)Z
+HPLcom/android/server/accounts/AccountManagerService;->isPreOApplication(Ljava/lang/String;)Z
+HPLcom/android/server/accounts/AccountManagerService;->resolveAccountVisibility(Landroid/accounts/Account;Ljava/lang/String;Lcom/android/server/accounts/AccountManagerService$UserAccounts;)Ljava/lang/Integer;
+HPLcom/android/server/accounts/IAccountAuthenticatorCache;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;I)V
+HPLcom/android/server/accounts/IAccountAuthenticatorCache;->getAllServices(I)Ljava/util/Collection;
+HPLcom/android/server/accounts/IAccountAuthenticatorCache;->getServiceInfo(Landroid/accounts/AuthenticatorDescription;I)Landroid/content/pm/RegisteredServicesCache$ServiceInfo;
+HPLcom/android/server/accounts/IAccountAuthenticatorCache;->invalidateCache(I)V
+HPLcom/android/server/accounts/IAccountAuthenticatorCache;->setListener(Landroid/content/pm/RegisteredServicesCacheListener;Landroid/os/Handler;)V
+HPLcom/android/server/accounts/IAccountAuthenticatorCache;->updateServices(I)V
+HPLcom/android/server/am/ActiveServices$ServiceMap;->ensureNotStartingBackgroundLocked(Lcom/android/server/am/ServiceRecord;)V
+HPLcom/android/server/am/ActiveServices;->bindServiceLocked(Landroid/app/IApplicationThread;Landroid/os/IBinder;Landroid/content/Intent;Ljava/lang/String;Landroid/app/IServiceConnection;ILjava/lang/String;I)I
+HPLcom/android/server/am/ActiveServices;->bringDownServiceLocked(Lcom/android/server/am/ServiceRecord;)V
+HPLcom/android/server/am/ActiveServices;->bringUpServiceLocked(Lcom/android/server/am/ServiceRecord;IZZZ)Ljava/lang/String;
+HPLcom/android/server/am/ActiveServices;->bumpServiceExecutingLocked(Lcom/android/server/am/ServiceRecord;ZLjava/lang/String;)V
+HPLcom/android/server/am/ActiveServices;->getServiceMapLocked(I)Lcom/android/server/am/ActiveServices$ServiceMap;
+HPLcom/android/server/am/ActiveServices;->publishServiceLocked(Lcom/android/server/am/ServiceRecord;Landroid/content/Intent;Landroid/os/IBinder;)V
+HPLcom/android/server/am/ActiveServices;->realStartServiceLocked(Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ProcessRecord;Z)V
+HPLcom/android/server/am/ActiveServices;->removeConnectionLocked(Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ActivityRecord;)V
+HPLcom/android/server/am/ActiveServices;->retrieveServiceLocked(Landroid/content/Intent;Ljava/lang/String;Ljava/lang/String;IIIZZZ)Lcom/android/server/am/ActiveServices$ServiceLookupResult;
+HPLcom/android/server/am/ActiveServices;->scheduleServiceTimeoutLocked(Lcom/android/server/am/ProcessRecord;)V
+HPLcom/android/server/am/ActiveServices;->sendServiceArgsLocked(Lcom/android/server/am/ServiceRecord;ZZ)V
+HPLcom/android/server/am/ActiveServices;->serviceDoneExecutingLocked(Lcom/android/server/am/ServiceRecord;III)V
+HPLcom/android/server/am/ActiveServices;->serviceDoneExecutingLocked(Lcom/android/server/am/ServiceRecord;ZZ)V
+HPLcom/android/server/am/ActiveServices;->startServiceInnerLocked(Lcom/android/server/am/ActiveServices$ServiceMap;Landroid/content/Intent;Lcom/android/server/am/ServiceRecord;ZZ)Landroid/content/ComponentName;
+HPLcom/android/server/am/ActiveServices;->startServiceLocked(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;IIZLjava/lang/String;I)Landroid/content/ComponentName;
+HPLcom/android/server/am/ActiveServices;->stopServiceTokenLocked(Landroid/content/ComponentName;Landroid/os/IBinder;I)Z
+HPLcom/android/server/am/ActiveServices;->unbindServiceLocked(Landroid/app/IServiceConnection;)Z
+HPLcom/android/server/am/ActiveServices;->updateServiceClientActivitiesLocked(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ConnectionRecord;Z)Z
+HPLcom/android/server/am/ActiveServices;->updateServiceForegroundLocked(Lcom/android/server/am/ProcessRecord;Z)V
+HPLcom/android/server/am/ActivityManagerService$1;->allowFilterResult(Lcom/android/server/am/BroadcastFilter;Ljava/util/List;)Z
+HPLcom/android/server/am/ActivityManagerService$1;->isPackageForFilter(Ljava/lang/String;Landroid/content/IntentFilter;)Z
+HPLcom/android/server/am/ActivityManagerService$1;->isPackageForFilter(Ljava/lang/String;Lcom/android/server/am/BroadcastFilter;)Z
+HPLcom/android/server/am/ActivityManagerService$2;->handleMessage(Landroid/os/Message;)V
+HPLcom/android/server/am/ActivityManagerService$Injector;->ensureHasNetworkManagementInternal()Z
+HPLcom/android/server/am/ActivityManagerService$Injector;->isNetworkRestrictedForUid(I)Z
+HPLcom/android/server/am/ActivityManagerService;->appendDropBoxProcessHeaders(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Ljava/lang/StringBuilder;)V
+HPLcom/android/server/am/ActivityManagerService;->applyOomAdjLocked(Lcom/android/server/am/ProcessRecord;ZJJ)Z
+HPLcom/android/server/am/ActivityManagerService;->attachApplicationLocked(Landroid/app/IApplicationThread;I)Z
+HPLcom/android/server/am/ActivityManagerService;->boostPriorityForLockedSection()V
+HPLcom/android/server/am/ActivityManagerService;->broadcastIntent(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;[Ljava/lang/String;ILandroid/os/Bundle;ZZI)I
+HPLcom/android/server/am/ActivityManagerService;->broadcastIntentLocked(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;[Ljava/lang/String;ILandroid/os/Bundle;ZZIII)I
+HPLcom/android/server/am/ActivityManagerService;->checkCallingPermission(Ljava/lang/String;)I
+HPLcom/android/server/am/ActivityManagerService;->checkComponentPermission(Ljava/lang/String;IIIZ)I
+HPLcom/android/server/am/ActivityManagerService;->checkContentProviderAccess(Ljava/lang/String;I)Ljava/lang/String;
+HPLcom/android/server/am/ActivityManagerService;->checkContentProviderPermissionLocked(Landroid/content/pm/ProviderInfo;Lcom/android/server/am/ProcessRecord;IZ)Ljava/lang/String;
+HPLcom/android/server/am/ActivityManagerService;->checkPermission(Ljava/lang/String;II)I
+HPLcom/android/server/am/ActivityManagerService;->checkTime(JLjava/lang/String;)V
+HPLcom/android/server/am/ActivityManagerService;->collectReceiverComponents(Landroid/content/Intent;Ljava/lang/String;I[I)Ljava/util/List;
+HPLcom/android/server/am/ActivityManagerService;->computeOomAdjLocked(Lcom/android/server/am/ProcessRecord;ILcom/android/server/am/ProcessRecord;ZJ)I
+HPLcom/android/server/am/ActivityManagerService;->createRecentTaskInfoFromTaskRecord(Lcom/android/server/am/TaskRecord;)Landroid/app/ActivityManager$RecentTaskInfo;
+HPLcom/android/server/am/ActivityManagerService;->decProviderCountLocked(Lcom/android/server/am/ContentProviderConnection;Lcom/android/server/am/ContentProviderRecord;Landroid/os/IBinder;Z)Z
+HPLcom/android/server/am/ActivityManagerService;->dispatchUidsChanged()V
+HPLcom/android/server/am/ActivityManagerService;->dispatchUidsChangedForObserver(Landroid/app/IUidObserver;Lcom/android/server/am/ActivityManagerService$UidObserverRegistration;I)V
+HPLcom/android/server/am/ActivityManagerService;->enforceNotIsolatedCaller(Ljava/lang/String;)V
+HPLcom/android/server/am/ActivityManagerService;->enqueueUidChangeLocked(Lcom/android/server/am/UidRecord;II)V
+HPLcom/android/server/am/ActivityManagerService;->findAppProcess(Landroid/os/IBinder;Ljava/lang/String;)Lcom/android/server/am/ProcessRecord;
+HPLcom/android/server/am/ActivityManagerService;->finishReceiver(Landroid/os/IBinder;ILjava/lang/String;Landroid/os/Bundle;ZI)V
+HPLcom/android/server/am/ActivityManagerService;->getAppStartModeLocked(ILjava/lang/String;IIZZ)I
+HPLcom/android/server/am/ActivityManagerService;->getContentProviderImpl(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/os/IBinder;ZI)Landroid/app/ContentProviderHolder;
+HPLcom/android/server/am/ActivityManagerService;->getIntentSender(ILjava/lang/String;Landroid/os/IBinder;Ljava/lang/String;I[Landroid/content/Intent;[Ljava/lang/String;ILandroid/os/Bundle;I)Landroid/content/IIntentSender;
+HPLcom/android/server/am/ActivityManagerService;->getIntentSenderLocked(ILjava/lang/String;IILandroid/os/IBinder;Ljava/lang/String;I[Landroid/content/Intent;[Ljava/lang/String;ILandroid/os/Bundle;)Landroid/content/IIntentSender;
+HPLcom/android/server/am/ActivityManagerService;->getLRURecordIndexForAppLocked(Landroid/app/IApplicationThread;)I
+HPLcom/android/server/am/ActivityManagerService;->getRecentTasks(III)Landroid/content/pm/ParceledListSlice;
+HPLcom/android/server/am/ActivityManagerService;->getRecordForAppLocked(Landroid/app/IApplicationThread;)Lcom/android/server/am/ProcessRecord;
+HPLcom/android/server/am/ActivityManagerService;->getRunningAppProcesses()Ljava/util/List;
+HPLcom/android/server/am/ActivityManagerService;->grantEphemeralAccessLocked(ILandroid/content/Intent;II)V
+HPLcom/android/server/am/ActivityManagerService;->handleApplicationStrictModeViolation(Landroid/os/IBinder;ILandroid/os/StrictMode$ViolationInfo;)V
+HPLcom/android/server/am/ActivityManagerService;->incProviderCountLocked(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ContentProviderRecord;Landroid/os/IBinder;Z)Lcom/android/server/am/ContentProviderConnection;
+HPLcom/android/server/am/ActivityManagerService;->incrementProcStateSeqAndNotifyAppsLocked()V
+HPLcom/android/server/am/ActivityManagerService;->isInstantApp(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;I)Z
+HPLcom/android/server/am/ActivityManagerService;->isProcessAliveLocked(Lcom/android/server/am/ProcessRecord;)Z
+HPLcom/android/server/am/ActivityManagerService;->isReceivingBroadcastLocked(Lcom/android/server/am/ProcessRecord;Landroid/util/ArraySet;)Z
+HPLcom/android/server/am/ActivityManagerService;->isSleepingLocked()Z
+HPLcom/android/server/am/ActivityManagerService;->logStrictModeViolationToDropBox(Lcom/android/server/am/ProcessRecord;Landroid/os/StrictMode$ViolationInfo;)V
+HPLcom/android/server/am/ActivityManagerService;->maybeUpdateProviderUsageStatsLocked(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Ljava/lang/String;)V
+HPLcom/android/server/am/ActivityManagerService;->maybeUpdateUsageStatsLocked(Lcom/android/server/am/ProcessRecord;J)V
+HPLcom/android/server/am/ActivityManagerService;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+HPLcom/android/server/am/ActivityManagerService;->publishContentProviders(Landroid/app/IApplicationThread;Ljava/util/List;)V
+HPLcom/android/server/am/ActivityManagerService;->refContentProvider(Landroid/os/IBinder;II)Z
+HPLcom/android/server/am/ActivityManagerService;->registerReceiver(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/content/IIntentReceiver;Landroid/content/IntentFilter;Ljava/lang/String;II)Landroid/content/Intent;
+HPLcom/android/server/am/ActivityManagerService;->removeContentProvider(Landroid/os/IBinder;Z)V
+HPLcom/android/server/am/ActivityManagerService;->resetPriorityAfterLockedSection()V
+HPLcom/android/server/am/ActivityManagerService;->resumedAppLocked()Lcom/android/server/am/ActivityRecord;
+HPLcom/android/server/am/ActivityManagerService;->rotateBroadcastStatsIfNeededLocked()V
+HPLcom/android/server/am/ActivityManagerService;->serviceDoneExecuting(Landroid/os/IBinder;III)V
+HPLcom/android/server/am/ActivityManagerService;->startProcessLocked(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V
+HPLcom/android/server/am/ActivityManagerService;->startService(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;ZLjava/lang/String;I)Landroid/content/ComponentName;
+HPLcom/android/server/am/ActivityManagerService;->updateCpuStats()V
+HPLcom/android/server/am/ActivityManagerService;->updateLruProcessInternalLocked(Lcom/android/server/am/ProcessRecord;JILjava/lang/String;Ljava/lang/Object;Lcom/android/server/am/ProcessRecord;)I
+HPLcom/android/server/am/ActivityManagerService;->updateLruProcessLocked(Lcom/android/server/am/ProcessRecord;ZLcom/android/server/am/ProcessRecord;)V
+HPLcom/android/server/am/ActivityManagerService;->updateOomAdjLocked()V
+HPLcom/android/server/am/ActivityManagerService;->updateOomAdjLocked(Lcom/android/server/am/ProcessRecord;ILcom/android/server/am/ProcessRecord;ZJ)Z
+HPLcom/android/server/am/ActivityManagerService;->updateOomAdjLocked(Lcom/android/server/am/ProcessRecord;Z)Z
+HPLcom/android/server/am/ActivityRecord;->getStack()Lcom/android/server/am/ActivityStack;
+HPLcom/android/server/am/ActivityRecord;->okToShowLocked()Z
+HPLcom/android/server/am/ActivityStack;->checkKeyguardVisibility(Lcom/android/server/am/ActivityRecord;ZZ)Z
+HPLcom/android/server/am/ActivityStack;->ensureActivitiesVisibleLocked(Lcom/android/server/am/ActivityRecord;IZ)V
+HPLcom/android/server/am/ActivityStack;->shouldBeVisible(Lcom/android/server/am/ActivityRecord;)I
+HPLcom/android/server/am/ActivityStack;->topRunningActivityLocked()Lcom/android/server/am/ActivityRecord;
+HPLcom/android/server/am/ActivityStack;->topRunningActivityLocked(Z)Lcom/android/server/am/ActivityRecord;
+HPLcom/android/server/am/ActivityStackSupervisor;->getResumedActivityLocked()Lcom/android/server/am/ActivityRecord;
+HPLcom/android/server/am/BatteryStatsService;->enforceCallingPermission()V
+HPLcom/android/server/am/BatteryStatsService;->noteStartWakelock(IILjava/lang/String;Ljava/lang/String;IZ)V
+HPLcom/android/server/am/BatteryStatsService;->noteStopWakelock(IILjava/lang/String;Ljava/lang/String;I)V
+HPLcom/android/server/am/BroadcastQueue;->addBroadcastToHistoryLocked(Lcom/android/server/am/BroadcastRecord;)V
+HPLcom/android/server/am/BroadcastQueue;->deliverToRegisteredReceiverLocked(Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastFilter;ZI)V
+HPLcom/android/server/am/BroadcastQueue;->enqueueBroadcastHelper(Lcom/android/server/am/BroadcastRecord;)V
+HPLcom/android/server/am/BroadcastQueue;->finishReceiverLocked(Lcom/android/server/am/BroadcastRecord;ILjava/lang/String;Landroid/os/Bundle;ZZ)Z
+HPLcom/android/server/am/BroadcastQueue;->processCurBroadcastLocked(Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/ProcessRecord;)V
+HPLcom/android/server/am/BroadcastQueue;->processNextBroadcast(Z)V
+HPLcom/android/server/am/BroadcastRecord;->cleanupDisabledPackageReceiversLocked(Ljava/lang/String;Ljava/util/Set;IZ)Z
+HPLcom/android/server/am/CompatModePackages;->compatibilityInfoForPackageLocked(Landroid/content/pm/ApplicationInfo;)Landroid/content/res/CompatibilityInfo;
+HPLcom/android/server/am/ContentProviderConnection;-><init>(Lcom/android/server/am/ContentProviderRecord;Lcom/android/server/am/ProcessRecord;)V
+HPLcom/android/server/am/ContentProviderRecord;->hasExternalProcessHandles()Z
+HPLcom/android/server/am/ProcessList;->procStatesDifferForMem(II)Z
+HPLcom/android/server/am/ProcessList;->setOomAdj(III)V
+HPLcom/android/server/am/ProcessList;->writeLmkd(Ljava/nio/ByteBuffer;)V
+HPLcom/android/server/am/ProcessRecord;->getPackageList()[Ljava/lang/String;
+HPLcom/android/server/am/ProcessRecord;->modifyRawOomAdj(I)I
+HPLcom/android/server/am/ProcessStatsService;->getMemFactorLocked()I
+HPLcom/android/server/am/ProcessStatsService;->setMemFactorLocked(IZJ)Z
+HPLcom/android/server/am/ServiceRecord;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/internal/os/BatteryStatsImpl$Uid$Pkg$Serv;Landroid/content/ComponentName;Landroid/content/Intent$FilterComparison;Landroid/content/pm/ServiceInfo;ZLjava/lang/Runnable;)V
+HPLcom/android/server/am/ServiceRecord;->findDeliveredStart(IZ)Lcom/android/server/am/ServiceRecord$StartItem;
+HPLcom/android/server/am/ServiceRecord;->hasAutoCreateConnections()Z
+HPLcom/android/server/am/ServiceRecord;->retrieveAppBindingLocked(Landroid/content/Intent;Lcom/android/server/am/ProcessRecord;)Lcom/android/server/am/AppBindRecord;
+HPLcom/android/server/am/TaskRecord;->getStack()Lcom/android/server/am/ActivityStack;
+HPLcom/android/server/am/TaskRecord;->restoreFromXml(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/am/ActivityStackSupervisor;)Lcom/android/server/am/TaskRecord;
+HPLcom/android/server/am/TaskRecord;->topRunningActivityLocked()Lcom/android/server/am/ActivityRecord;
+HPLcom/android/server/am/UidRecord;->reset()V
+HPLcom/android/server/am/UserController;->getStartedUserStateLocked(I)Lcom/android/server/am/UserState;
+HPLcom/android/server/am/UserController;->handleIncomingUser(IIIZILjava/lang/String;Ljava/lang/String;)I
+HPLcom/android/server/am/UserController;->isUserStoppingOrShuttingDownLocked(I)Z
+HPLcom/android/server/appwidget/AppWidgetServiceImpl;->isBoundWidgetPackage(Ljava/lang/String;I)Z
+HPLcom/android/server/autofill/RemoteFillService$FillServiceCallbacks;->onFillRequestFailure(Ljava/lang/CharSequence;Ljava/lang/String;)V
+HPLcom/android/server/autofill/RemoteFillService$FillServiceCallbacks;->onFillRequestSuccess(ILandroid/service/autofill/FillResponse;ILjava/lang/String;)V
+HPLcom/android/server/autofill/RemoteFillService$FillServiceCallbacks;->onSaveRequestFailure(Ljava/lang/CharSequence;Ljava/lang/String;)V
+HPLcom/android/server/autofill/RemoteFillService$FillServiceCallbacks;->onSaveRequestSuccess(Ljava/lang/String;)V
+HPLcom/android/server/autofill/RemoteFillService$FillServiceCallbacks;->onServiceDied(Lcom/android/server/autofill/RemoteFillService;)V
+HPLcom/android/server/autofill/RemoteFillService$PendingRequest;->fail(Lcom/android/server/autofill/RemoteFillService;)V
+HPLcom/android/server/autofill/ViewState$Listener;->onFillReady(Landroid/service/autofill/FillResponse;Landroid/view/autofill/AutofillId;Landroid/view/autofill/AutofillValue;)V
+HPLcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;->authenticate(IILandroid/content/IntentSender;Landroid/os/Bundle;)V
+HPLcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;->cancelSave()V
+HPLcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;->fill(IILandroid/service/autofill/Dataset;)V
+HPLcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;->requestHideFillUi(Landroid/view/autofill/AutofillId;)V
+HPLcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;->requestShowFillUi(Landroid/view/autofill/AutofillId;IILandroid/view/autofill/IAutofillWindowPresenter;)V
+HPLcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;->save()V
+HPLcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;->startIntentSender(Landroid/content/IntentSender;)V
+HPLcom/android/server/backup/BackupManagerService;->dataChangedTargets(Ljava/lang/String;)Ljava/util/HashSet;
+HPLcom/android/server/backup/BackupManagerServiceInterface;->acknowledgeAdbBackupOrRestore(IZLjava/lang/String;Ljava/lang/String;Landroid/app/backup/IFullBackupRestoreObserver;)V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->adbBackup(Landroid/os/ParcelFileDescriptor;ZZZZZZZZ[Ljava/lang/String;)V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->adbRestore(Landroid/os/ParcelFileDescriptor;)V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->agentConnected(Ljava/lang/String;Landroid/os/IBinder;)V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->agentDisconnected(Ljava/lang/String;)V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->backupNow()V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->beginFullBackup(Lcom/android/server/backup/FullBackupJob;)Z
+HPLcom/android/server/backup/BackupManagerServiceInterface;->beginRestoreSession(Ljava/lang/String;Ljava/lang/String;)Landroid/app/backup/IRestoreSession;
+HPLcom/android/server/backup/BackupManagerServiceInterface;->bindToAgentSynchronous(Landroid/content/pm/ApplicationInfo;I)Landroid/app/IBackupAgent;
+HPLcom/android/server/backup/BackupManagerServiceInterface;->cancelBackups()V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->clearBackupData(Ljava/lang/String;Ljava/lang/String;)V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->dataChanged(Ljava/lang/String;)V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->endFullBackup()V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->fullTransportBackup([Ljava/lang/String;)V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->generateRandomIntegerToken()I
+HPLcom/android/server/backup/BackupManagerServiceInterface;->getAvailableRestoreToken(Ljava/lang/String;)J
+HPLcom/android/server/backup/BackupManagerServiceInterface;->getBackupManagerBinder()Landroid/app/backup/IBackupManager;
+HPLcom/android/server/backup/BackupManagerServiceInterface;->getConfigurationIntent(Ljava/lang/String;)Landroid/content/Intent;
+HPLcom/android/server/backup/BackupManagerServiceInterface;->getCurrentTransport()Ljava/lang/String;
+HPLcom/android/server/backup/BackupManagerServiceInterface;->getDataManagementIntent(Ljava/lang/String;)Landroid/content/Intent;
+HPLcom/android/server/backup/BackupManagerServiceInterface;->getDataManagementLabel(Ljava/lang/String;)Ljava/lang/String;
+HPLcom/android/server/backup/BackupManagerServiceInterface;->getDestinationString(Ljava/lang/String;)Ljava/lang/String;
+HPLcom/android/server/backup/BackupManagerServiceInterface;->getTransportWhitelist()[Ljava/lang/String;
+HPLcom/android/server/backup/BackupManagerServiceInterface;->hasBackupPassword()Z
+HPLcom/android/server/backup/BackupManagerServiceInterface;->isAppEligibleForBackup(Ljava/lang/String;)Z
+HPLcom/android/server/backup/BackupManagerServiceInterface;->isBackupEnabled()Z
+HPLcom/android/server/backup/BackupManagerServiceInterface;->listAllTransportComponents()[Landroid/content/ComponentName;
+HPLcom/android/server/backup/BackupManagerServiceInterface;->listAllTransports()[Ljava/lang/String;
+HPLcom/android/server/backup/BackupManagerServiceInterface;->opComplete(IJ)V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->prepareOperationTimeout(IJLcom/android/server/backup/BackupRestoreTask;I)V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->requestBackup([Ljava/lang/String;Landroid/app/backup/IBackupObserver;I)I
+HPLcom/android/server/backup/BackupManagerServiceInterface;->requestBackup([Ljava/lang/String;Landroid/app/backup/IBackupObserver;Landroid/app/backup/IBackupManagerMonitor;I)I
+HPLcom/android/server/backup/BackupManagerServiceInterface;->restoreAtInstall(Ljava/lang/String;I)V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->selectBackupTransport(Ljava/lang/String;)Ljava/lang/String;
+HPLcom/android/server/backup/BackupManagerServiceInterface;->selectBackupTransportAsync(Landroid/content/ComponentName;Landroid/app/backup/ISelectBackupTransportCallback;)V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->setAutoRestore(Z)V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->setBackupEnabled(Z)V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->setBackupPassword(Ljava/lang/String;Ljava/lang/String;)Z
+HPLcom/android/server/backup/BackupManagerServiceInterface;->setBackupProvisioned(Z)V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->tearDownAgentAndKill(Landroid/content/pm/ApplicationInfo;)V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->waitUntilOperationComplete(I)Z
+HPLcom/android/server/backup/TransportManager$TransportBoundListener;->onTransportBound(Lcom/android/internal/backup/IBackupTransport;)Z
+HPLcom/android/server/companion/CompanionDeviceManagerService;->getCallingUserId()I
+HPLcom/android/server/connectivity/NetworkAgentInfo;->getNetworkState()Landroid/net/NetworkState;
+HPLcom/android/server/connectivity/PermissionMonitor;->hasPermission(Landroid/content/pm/PackageInfo;Ljava/lang/String;)Z
+HPLcom/android/server/connectivity/Vpn;->appliesToUid(I)Z
+HPLcom/android/server/content/ContentService$ObserverNode$ObserverEntry;-><init>(Lcom/android/server/content/ContentService$ObserverNode;Landroid/database/IContentObserver;ZLjava/lang/Object;III)V
+HPLcom/android/server/content/ContentService$ObserverNode;->addObserverLocked(Landroid/net/Uri;ILandroid/database/IContentObserver;ZLjava/lang/Object;III)V
+HPLcom/android/server/content/ContentService$ObserverNode;->collectMyObserversLocked(ZLandroid/database/IContentObserver;ZIILjava/util/ArrayList;)V
+HPLcom/android/server/content/ContentService$ObserverNode;->collectObserversLocked(Landroid/net/Uri;ILandroid/database/IContentObserver;ZIILjava/util/ArrayList;)V
+HPLcom/android/server/content/ContentService$ObserverNode;->countUriSegments(Landroid/net/Uri;)I
+HPLcom/android/server/content/ContentService$ObserverNode;->getUriSegment(Landroid/net/Uri;I)Ljava/lang/String;
+HPLcom/android/server/content/ContentService$ObserverNode;->removeObserverLocked(Landroid/database/IContentObserver;)Z
+HPLcom/android/server/content/ContentService;->notifyChange(Landroid/net/Uri;Landroid/database/IContentObserver;ZIII)V
+HPLcom/android/server/content/ContentService;->registerContentObserver(Landroid/net/Uri;ZLandroid/database/IContentObserver;II)V
+HPLcom/android/server/content/SyncManager;->scheduleSync(Landroid/accounts/Account;IILjava/lang/String;Landroid/os/Bundle;IJ)V
+HPLcom/android/server/content/SyncOperation;->maybeCreateFromJobExtras(Landroid/os/PersistableBundle;)Lcom/android/server/content/SyncOperation;
+HPLcom/android/server/content/SyncOperation;->toKey()Ljava/lang/String;
+HPLcom/android/server/content/SyncStorageEngine$OnAuthorityRemovedListener;->onAuthorityRemoved(Lcom/android/server/content/SyncStorageEngine$EndPoint;)V
+HPLcom/android/server/content/SyncStorageEngine$OnSyncRequestListener;->onSyncRequest(Lcom/android/server/content/SyncStorageEngine$EndPoint;ILandroid/os/Bundle;)V
+HPLcom/android/server/content/SyncStorageEngine$PeriodicSyncAddedListener;->onPeriodicSyncAdded(Lcom/android/server/content/SyncStorageEngine$EndPoint;Landroid/os/Bundle;JJ)V
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->binderGetCallingUid()I
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->userHandleGetCallingUserId()I
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getActiveAdmins(I)Ljava/util/List;
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->packageHasActiveAdmins(Ljava/lang/String;I)Z
+HPLcom/android/server/display/AutomaticBrightnessController$1;->onSensorChanged(Landroid/hardware/SensorEvent;)V
+HPLcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;->getLux(I)F
+HPLcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;->getTime(I)J
+HPLcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;->offsetOf(I)I
+HPLcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;->size()I
+HPLcom/android/server/display/AutomaticBrightnessController$Callbacks;->updateBrightness()V
+HPLcom/android/server/display/AutomaticBrightnessController;->calculateAmbientLux(J)F
+HPLcom/android/server/display/AutomaticBrightnessController;->calculateWeight(JJ)F
+HPLcom/android/server/display/AutomaticBrightnessController;->handleLightSensorEvent(JF)V
+HPLcom/android/server/display/AutomaticBrightnessController;->nextAmbientLightBrighteningTransition(J)J
+HPLcom/android/server/display/AutomaticBrightnessController;->nextAmbientLightDarkeningTransition(J)J
+HPLcom/android/server/display/AutomaticBrightnessController;->updateAmbientLux(J)V
+HPLcom/android/server/display/AutomaticBrightnessController;->weightIntegral(J)F
+HPLcom/android/server/display/DisplayBlanker;->requestDisplayState(II)V
+HPLcom/android/server/display/DisplayManagerService$LocalService;->requestPowerState(Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;Z)Z
+HPLcom/android/server/display/DisplayPowerController;->requestPowerState(Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;Z)Z
+HPLcom/android/server/display/NightDisplayService$ColorMatrixEvaluator;->evaluate(F[F[F)[F
+HPLcom/android/server/display/RampAnimator$Listener;->onAnimationEnd()V
+HPLcom/android/server/display/VirtualDisplayAdapter$SurfaceControlDisplayFactory;->createDisplay(Ljava/lang/String;Z)Landroid/os/IBinder;
+HPLcom/android/server/dreams/DreamController$Listener;->onDreamStopped(Landroid/os/Binder;)V
+HPLcom/android/server/dreams/DreamManagerService;->-wrap3(Lcom/android/server/dreams/DreamManagerService;)Z
+HPLcom/android/server/dreams/DreamManagerService;->isDreamingInternal()Z
+HPLcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;->queryByComponent(Landroid/content/ComponentName;Ljava/util/List;)V
+HPLcom/android/server/firewall/IntentFirewall;->checkBroadcast(Landroid/content/Intent;IILjava/lang/String;I)Z
+HPLcom/android/server/firewall/IntentFirewall;->checkIntent(Lcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;Landroid/content/ComponentName;ILandroid/content/Intent;IILjava/lang/String;I)Z
+HPLcom/android/server/input/InputManagerService$KeyboardLayoutVisitor;->visitKeyboardLayout(Landroid/content/res/Resources;ILandroid/hardware/input/KeyboardLayout;)V
+HPLcom/android/server/input/InputManagerService$WindowManagerCallbacks;->dispatchUnhandledKey(Lcom/android/server/input/InputWindowHandle;Landroid/view/KeyEvent;I)Landroid/view/KeyEvent;
+HPLcom/android/server/input/InputManagerService$WindowManagerCallbacks;->getPointerLayer()I
+HPLcom/android/server/input/InputManagerService$WindowManagerCallbacks;->interceptKeyBeforeDispatching(Lcom/android/server/input/InputWindowHandle;Landroid/view/KeyEvent;I)J
+HPLcom/android/server/input/InputManagerService$WindowManagerCallbacks;->interceptKeyBeforeQueueing(Landroid/view/KeyEvent;I)I
+HPLcom/android/server/input/InputManagerService$WindowManagerCallbacks;->interceptMotionBeforeQueueingNonInteractive(JI)I
+HPLcom/android/server/input/InputManagerService$WindowManagerCallbacks;->notifyANR(Lcom/android/server/input/InputApplicationHandle;Lcom/android/server/input/InputWindowHandle;Ljava/lang/String;)J
+HPLcom/android/server/input/InputManagerService$WindowManagerCallbacks;->notifyCameraLensCoverSwitchChanged(JZ)V
+HPLcom/android/server/input/InputManagerService$WindowManagerCallbacks;->notifyConfigurationChanged()V
+HPLcom/android/server/input/InputManagerService$WindowManagerCallbacks;->notifyInputChannelBroken(Lcom/android/server/input/InputWindowHandle;)V
+HPLcom/android/server/input/InputManagerService$WindowManagerCallbacks;->notifyLidSwitchChanged(JZ)V
+HPLcom/android/server/input/InputManagerService$WiredAccessoryCallbacks;->notifyWiredAccessoryChanged(JII)V
+HPLcom/android/server/input/InputManagerService$WiredAccessoryCallbacks;->systemReady()V
+HPLcom/android/server/input/InputManagerService;->setInputWindows([Lcom/android/server/input/InputWindowHandle;Lcom/android/server/input/InputWindowHandle;)V
+HPLcom/android/server/input/InputManagerService;->visitKeyboardLayoutsInPackage(Landroid/content/pm/PackageManager;Landroid/content/pm/ActivityInfo;Ljava/lang/String;ILcom/android/server/input/InputManagerService$KeyboardLayoutVisitor;)V
+HPLcom/android/server/job/JobCompletedListener;->onJobCompletedLocked(Lcom/android/server/job/controllers/JobStatus;Z)V
+HPLcom/android/server/job/JobSchedulerInternal;->addBackingUpUid(I)V
+HPLcom/android/server/job/JobSchedulerInternal;->clearAllBackingUpUids()V
+HPLcom/android/server/job/JobSchedulerInternal;->getSystemScheduledPendingJobs()Ljava/util/List;
+HPLcom/android/server/job/JobSchedulerInternal;->removeBackingUpUid(I)V
+HPLcom/android/server/job/JobSchedulerService$3;->process(Lcom/android/server/job/controllers/JobStatus;)V
+HPLcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;->process(Lcom/android/server/job/controllers/JobStatus;)V
+HPLcom/android/server/job/JobSchedulerService$ReadyJobQueueFunctor;->process(Lcom/android/server/job/controllers/JobStatus;)V
+HPLcom/android/server/job/JobSchedulerService;->-wrap1(Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/controllers/JobStatus;)Z
+HPLcom/android/server/job/JobSchedulerService;->assignJobsToContextsLocked()V
+HPLcom/android/server/job/JobSchedulerService;->isCurrentlyActiveLocked(Lcom/android/server/job/controllers/JobStatus;)Z
+HPLcom/android/server/job/JobSchedulerService;->isReadyToBeExecutedLocked(Lcom/android/server/job/controllers/JobStatus;)Z
+HPLcom/android/server/job/JobSchedulerService;->reportActiveLocked()V
+HPLcom/android/server/job/JobSchedulerService;->startTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V
+HPLcom/android/server/job/JobSchedulerService;->stopNonReadyActiveJobsLocked()V
+HPLcom/android/server/job/JobServiceContext;->getRunningJobLocked()Lcom/android/server/job/controllers/JobStatus;
+HPLcom/android/server/job/JobStore$JobSet;->forEachJob(Lcom/android/server/job/JobStore$JobStatusFunctor;)V
+HPLcom/android/server/job/JobStore$ReadJobMapFromDiskRunnable;->buildExecutionTimesFromXml(Lorg/xmlpull/v1/XmlPullParser;)Landroid/util/Pair;
+HPLcom/android/server/job/JobStore$ReadJobMapFromDiskRunnable;->restoreJobFromXml(Lorg/xmlpull/v1/XmlPullParser;)Lcom/android/server/job/controllers/JobStatus;
+HPLcom/android/server/job/JobStore$WriteJobsMapToDiskRunnable$1;->process(Lcom/android/server/job/controllers/JobStatus;)V
+HPLcom/android/server/job/JobStore$WriteJobsMapToDiskRunnable;->addAttributesToJobTag(Lorg/xmlpull/v1/XmlSerializer;Lcom/android/server/job/controllers/JobStatus;)V
+HPLcom/android/server/job/JobStore$WriteJobsMapToDiskRunnable;->deepCopyBundle(Landroid/os/PersistableBundle;I)Landroid/os/PersistableBundle;
+HPLcom/android/server/job/JobStore$WriteJobsMapToDiskRunnable;->writeBundleToXml(Landroid/os/PersistableBundle;Lorg/xmlpull/v1/XmlSerializer;)V
+HPLcom/android/server/job/JobStore$WriteJobsMapToDiskRunnable;->writeConstraintsToXml(Lorg/xmlpull/v1/XmlSerializer;Lcom/android/server/job/controllers/JobStatus;)V
+HPLcom/android/server/job/JobStore$WriteJobsMapToDiskRunnable;->writeExecutionCriteriaToXml(Lorg/xmlpull/v1/XmlSerializer;Lcom/android/server/job/controllers/JobStatus;)V
+HPLcom/android/server/job/JobStore$WriteJobsMapToDiskRunnable;->writeJobsMapImpl(Ljava/util/List;)V
+HPLcom/android/server/job/StateChangedListener;->onControllerStateChanged()V
+HPLcom/android/server/job/StateChangedListener;->onDeviceIdleStateChanged(Z)V
+HPLcom/android/server/job/StateChangedListener;->onRunJobNow(Lcom/android/server/job/controllers/JobStatus;)V
+HPLcom/android/server/job/controllers/AppIdleController$PackageUpdateFunc;->process(Lcom/android/server/job/controllers/JobStatus;)V
+HPLcom/android/server/job/controllers/ConnectivityController;->updateConstraintsSatisfied(Lcom/android/server/job/controllers/JobStatus;Landroid/net/NetworkCapabilities;)Z
+HPLcom/android/server/job/controllers/ConnectivityController;->updateTrackedJobs(ILandroid/net/NetworkCapabilities;)V
+HPLcom/android/server/job/controllers/JobStatus;-><init>(Landroid/app/job/JobInfo;ILjava/lang/String;ILjava/lang/String;IJJ)V
+HPLcom/android/server/job/controllers/JobStatus;-><init>(Lcom/android/server/job/controllers/JobStatus;)V
+HPLcom/android/server/job/controllers/JobStatus;->getEarliestRunTime()J
+HPLcom/android/server/job/controllers/JobStatus;->getFlags()I
+HPLcom/android/server/job/controllers/JobStatus;->getJob()Landroid/app/job/JobInfo;
+HPLcom/android/server/job/controllers/JobStatus;->getJobId()I
+HPLcom/android/server/job/controllers/JobStatus;->getLatestRunTimeElapsed()J
+HPLcom/android/server/job/controllers/JobStatus;->getNumFailures()I
+HPLcom/android/server/job/controllers/JobStatus;->getPriority()I
+HPLcom/android/server/job/controllers/JobStatus;->getServiceComponent()Landroid/content/ComponentName;
+HPLcom/android/server/job/controllers/JobStatus;->getSourcePackageName()Ljava/lang/String;
+HPLcom/android/server/job/controllers/JobStatus;->getSourceTag()Ljava/lang/String;
+HPLcom/android/server/job/controllers/JobStatus;->getSourceUid()I
+HPLcom/android/server/job/controllers/JobStatus;->getSourceUserId()I
+HPLcom/android/server/job/controllers/JobStatus;->getUid()I
+HPLcom/android/server/job/controllers/JobStatus;->hasBatteryNotLowConstraint()Z
+HPLcom/android/server/job/controllers/JobStatus;->hasChargingConstraint()Z
+HPLcom/android/server/job/controllers/JobStatus;->hasDeadlineConstraint()Z
+HPLcom/android/server/job/controllers/JobStatus;->hasIdleConstraint()Z
+HPLcom/android/server/job/controllers/JobStatus;->hasTimingDelayConstraint()Z
+HPLcom/android/server/job/controllers/JobStatus;->isConstraintSatisfied(I)Z
+HPLcom/android/server/job/controllers/JobStatus;->isConstraintsSatisfied()Z
+HPLcom/android/server/job/controllers/JobStatus;->isPersisted()Z
+HPLcom/android/server/job/controllers/JobStatus;->isReady()Z
+HPLcom/android/server/job/controllers/JobStatus;->needsAnyConnectivity()Z
+HPLcom/android/server/job/controllers/JobStatus;->needsMeteredConnectivity()Z
+HPLcom/android/server/job/controllers/JobStatus;->needsNonRoamingConnectivity()Z
+HPLcom/android/server/job/controllers/JobStatus;->needsUnmeteredConnectivity()Z
+HPLcom/android/server/job/controllers/JobStatus;->setConstraintSatisfied(IZ)Z
+HPLcom/android/server/job/controllers/TimeController;->checkExpiredDelaysAndResetAlarm()V
+HPLcom/android/server/job/controllers/TimeController;->evaluateTimingDelayConstraint(Lcom/android/server/job/controllers/JobStatus;J)Z
+HPLcom/android/server/job/controllers/TimeController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V
+HPLcom/android/server/location/CountryDetectorBase;->detectCountry()Landroid/location/Country;
+HPLcom/android/server/location/CountryDetectorBase;->stop()V
+HPLcom/android/server/location/GnssLocationProvider$GnssBatchingProvider;->flush()V
+HPLcom/android/server/location/GnssLocationProvider$GnssBatchingProvider;->getSize()I
+HPLcom/android/server/location/GnssLocationProvider$GnssBatchingProvider;->start(JZ)Z
+HPLcom/android/server/location/GnssLocationProvider$GnssBatchingProvider;->stop()Z
+HPLcom/android/server/location/GnssLocationProvider$GnssMetricsProvider;->getGnssMetricsAsProtoString()Ljava/lang/String;
+HPLcom/android/server/location/GnssLocationProvider$GnssSystemInfoProvider;->getGnssYearOfHardware()I
+HPLcom/android/server/location/GnssLocationProvider$SetCarrierProperty;->set(I)Z
+HPLcom/android/server/location/RemoteListenerHelper$ListenerOperation;->execute(Landroid/os/IInterface;)V
+HPLcom/android/server/locksettings/LockSettingsStorage$Callback;->initialize(Landroid/database/sqlite/SQLiteDatabase;)V
+HPLcom/android/server/media/AudioPlaybackMonitor$OnAudioPlaybackStartedListener;->onAudioPlaybackStarted(I)V
+HPLcom/android/server/media/MediaSessionStack$OnMediaButtonSessionChangedListener;->onMediaButtonSessionChanged(Lcom/android/server/media/MediaSessionRecord;Lcom/android/server/media/MediaSessionRecord;)V
+HPLcom/android/server/media/RemoteDisplayProviderProxy$Callback;->onDisplayStateChanged(Lcom/android/server/media/RemoteDisplayProviderProxy;Landroid/media/RemoteDisplayState;)V
+HPLcom/android/server/media/RemoteDisplayProviderWatcher$Callback;->addProvider(Lcom/android/server/media/RemoteDisplayProviderProxy;)V
+HPLcom/android/server/media/RemoteDisplayProviderWatcher$Callback;->removeProvider(Lcom/android/server/media/RemoteDisplayProviderProxy;)V
+HPLcom/android/server/net/NetworkIdentitySet;->isAnyMemberMetered()Z
+HPLcom/android/server/net/NetworkIdentitySet;->isAnyMemberRoaming()Z
+HPLcom/android/server/net/NetworkIdentitySet;->writeToStream(Ljava/io/DataOutputStream;)V
+HPLcom/android/server/net/NetworkPolicyManagerInternal;->isUidNetworkingBlocked(ILjava/lang/String;)Z
+HPLcom/android/server/net/NetworkPolicyManagerInternal;->isUidRestrictedOnMeteredNetworks(I)Z
+HPLcom/android/server/net/NetworkPolicyManagerInternal;->resetUserState(I)V
+HPLcom/android/server/net/NetworkPolicyManagerService$NetworkPolicyManagerInternalImpl;->isUidNetworkingBlocked(ILjava/lang/String;)Z
+HPLcom/android/server/net/NetworkPolicyManagerService;->findPolicyForNetworkNL(Landroid/net/NetworkIdentity;)Landroid/net/NetworkPolicy;
+HPLcom/android/server/net/NetworkPolicyManagerService;->handleUidChanged(IIJ)V
+HPLcom/android/server/net/NetworkPolicyManagerService;->isNetworkMetered(Landroid/net/NetworkState;)Z
+HPLcom/android/server/net/NetworkPolicyManagerService;->updateUidStateUL(II)V
+HPLcom/android/server/net/NetworkStatsCollection$Key;-><init>(Lcom/android/server/net/NetworkIdentitySet;III)V
+HPLcom/android/server/net/NetworkStatsCollection;->findOrCreateHistory(Lcom/android/server/net/NetworkIdentitySet;III)Landroid/net/NetworkStatsHistory;
+HPLcom/android/server/net/NetworkStatsCollection;->getSummary(Landroid/net/NetworkTemplate;JJI)Landroid/net/NetworkStats;
+HPLcom/android/server/net/NetworkStatsCollection;->getSummary(Landroid/net/NetworkTemplate;JJII)Landroid/net/NetworkStats;
+HPLcom/android/server/net/NetworkStatsCollection;->recordData(Lcom/android/server/net/NetworkIdentitySet;IIIJJLandroid/net/NetworkStats$Entry;)V
+HPLcom/android/server/net/NetworkStatsCollection;->templateMatches(Landroid/net/NetworkTemplate;Lcom/android/server/net/NetworkIdentitySet;)Z
+HPLcom/android/server/net/NetworkStatsCollection;->write(Ljava/io/DataOutputStream;)V
+HPLcom/android/server/net/NetworkStatsRecorder;->recordSnapshotLocked(Landroid/net/NetworkStats;Ljava/util/Map;[Lcom/android/internal/net/VpnInfo;J)V
+HPLcom/android/server/net/NetworkStatsService$NetworkStatsSettings;->getDevConfig()Lcom/android/server/net/NetworkStatsService$NetworkStatsSettings$Config;
+HPLcom/android/server/net/NetworkStatsService$NetworkStatsSettings;->getDevPersistBytes(J)J
+HPLcom/android/server/net/NetworkStatsService$NetworkStatsSettings;->getGlobalAlertBytes(J)J
+HPLcom/android/server/net/NetworkStatsService$NetworkStatsSettings;->getPollInterval()J
+HPLcom/android/server/net/NetworkStatsService$NetworkStatsSettings;->getSampleEnabled()Z
+HPLcom/android/server/net/NetworkStatsService$NetworkStatsSettings;->getTimeCacheMaxAge()J
+HPLcom/android/server/net/NetworkStatsService$NetworkStatsSettings;->getUidConfig()Lcom/android/server/net/NetworkStatsService$NetworkStatsSettings$Config;
+HPLcom/android/server/net/NetworkStatsService$NetworkStatsSettings;->getUidPersistBytes(J)J
+HPLcom/android/server/net/NetworkStatsService$NetworkStatsSettings;->getUidTagConfig()Lcom/android/server/net/NetworkStatsService$NetworkStatsSettings$Config;
+HPLcom/android/server/net/NetworkStatsService$NetworkStatsSettings;->getUidTagPersistBytes(J)J
+HPLcom/android/server/net/NetworkStatsService$NetworkStatsSettings;->getXtConfig()Lcom/android/server/net/NetworkStatsService$NetworkStatsSettings$Config;
+HPLcom/android/server/net/NetworkStatsService$NetworkStatsSettings;->getXtPersistBytes(J)J
+HPLcom/android/server/notification/CalendarTracker$Callback;->onChanged()V
+HPLcom/android/server/notification/ConditionProviders$Callback;->onBootComplete()V
+HPLcom/android/server/notification/ConditionProviders$Callback;->onConditionChanged(Landroid/net/Uri;Landroid/service/notification/Condition;)V
+HPLcom/android/server/notification/ConditionProviders$Callback;->onServiceAdded(Landroid/content/ComponentName;)V
+HPLcom/android/server/notification/ConditionProviders$Callback;->onUserSwitched()V
+HPLcom/android/server/notification/GlobalSortKeyComparator;->compare(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;)I
+HPLcom/android/server/notification/GroupHelper$Callback;->addAutoGroup(Ljava/lang/String;)V
+HPLcom/android/server/notification/GroupHelper$Callback;->addAutoGroupSummary(ILjava/lang/String;Ljava/lang/String;)V
+HPLcom/android/server/notification/GroupHelper$Callback;->removeAutoGroup(Ljava/lang/String;)V
+HPLcom/android/server/notification/GroupHelper$Callback;->removeAutoGroupSummary(ILjava/lang/String;)V
+HPLcom/android/server/notification/NotificationComparator;->compare(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;)I
+HPLcom/android/server/notification/NotificationDelegate;->clearEffects()V
+HPLcom/android/server/notification/NotificationDelegate;->onClearAll(III)V
+HPLcom/android/server/notification/NotificationDelegate;->onNotificationActionClick(IILjava/lang/String;I)V
+HPLcom/android/server/notification/NotificationDelegate;->onNotificationClear(IILjava/lang/String;Ljava/lang/String;II)V
+HPLcom/android/server/notification/NotificationDelegate;->onNotificationClick(IILjava/lang/String;)V
+HPLcom/android/server/notification/NotificationDelegate;->onNotificationError(IILjava/lang/String;Ljava/lang/String;IIILjava/lang/String;I)V
+HPLcom/android/server/notification/NotificationDelegate;->onNotificationExpansionChanged(Ljava/lang/String;ZZ)V
+HPLcom/android/server/notification/NotificationDelegate;->onNotificationVisibilityChanged([Lcom/android/internal/statusbar/NotificationVisibility;[Lcom/android/internal/statusbar/NotificationVisibility;)V
+HPLcom/android/server/notification/NotificationDelegate;->onPanelHidden()V
+HPLcom/android/server/notification/NotificationDelegate;->onPanelRevealed(ZI)V
+HPLcom/android/server/notification/NotificationDelegate;->onSetDisabled(I)V
+HPLcom/android/server/notification/NotificationManagerInternal;->enqueueNotification(Ljava/lang/String;Ljava/lang/String;IILjava/lang/String;ILandroid/app/Notification;I)V
+HPLcom/android/server/notification/NotificationManagerInternal;->removeForegroundServiceFlagFromNotification(Ljava/lang/String;II)V
+HPLcom/android/server/notification/NotificationManagerService$5;->cancelNotificationWithTag(Ljava/lang/String;Ljava/lang/String;II)V
+HPLcom/android/server/notification/NotificationManagerService$FlagChecker;->apply(I)Z
+HPLcom/android/server/notification/NotificationManagerService;->checkCallerIsSameApp(Ljava/lang/String;)V
+HPLcom/android/server/notification/NotificationManagerService;->hasCompanionDevice(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Z
+HPLcom/android/server/notification/NotificationManagerService;->isCallerSystemOrPhone()Z
+HPLcom/android/server/notification/NotificationManagerService;->makeRankingUpdateLocked(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Landroid/service/notification/NotificationRankingUpdate;
+HPLcom/android/server/notification/NotificationRecord;->getGlobalSortKey()Ljava/lang/String;
+HPLcom/android/server/notification/NotificationRecord;->getImportance()I
+HPLcom/android/server/notification/NotificationRecord;->getNotification()Landroid/app/Notification;
+HPLcom/android/server/notification/NotificationUsageStats;->getOrCreateAggregatedStatsLocked(Ljava/lang/String;)Lcom/android/server/notification/NotificationUsageStats$AggregatedStats;
+HPLcom/android/server/notification/RankingConfig;->badgingEnabled(Landroid/os/UserHandle;)Z
+HPLcom/android/server/notification/RankingConfig;->canShowBadge(Ljava/lang/String;I)Z
+HPLcom/android/server/notification/RankingConfig;->createNotificationChannel(Ljava/lang/String;ILandroid/app/NotificationChannel;Z)V
+HPLcom/android/server/notification/RankingConfig;->createNotificationChannelGroup(Ljava/lang/String;ILandroid/app/NotificationChannelGroup;Z)V
+HPLcom/android/server/notification/RankingConfig;->deleteNotificationChannel(Ljava/lang/String;ILjava/lang/String;)V
+HPLcom/android/server/notification/RankingConfig;->getImportance(Ljava/lang/String;I)I
+HPLcom/android/server/notification/RankingConfig;->getNotificationChannel(Ljava/lang/String;ILjava/lang/String;Z)Landroid/app/NotificationChannel;
+HPLcom/android/server/notification/RankingConfig;->getNotificationChannelGroups(Ljava/lang/String;I)Ljava/util/Collection;
+HPLcom/android/server/notification/RankingConfig;->getNotificationChannelGroups(Ljava/lang/String;IZ)Landroid/content/pm/ParceledListSlice;
+HPLcom/android/server/notification/RankingConfig;->getNotificationChannels(Ljava/lang/String;IZ)Landroid/content/pm/ParceledListSlice;
+HPLcom/android/server/notification/RankingConfig;->permanentlyDeleteNotificationChannel(Ljava/lang/String;ILjava/lang/String;)V
+HPLcom/android/server/notification/RankingConfig;->permanentlyDeleteNotificationChannels(Ljava/lang/String;I)V
+HPLcom/android/server/notification/RankingConfig;->setImportance(Ljava/lang/String;II)V
+HPLcom/android/server/notification/RankingConfig;->setShowBadge(Ljava/lang/String;IZ)V
+HPLcom/android/server/notification/RankingConfig;->updateNotificationChannel(Ljava/lang/String;ILandroid/app/NotificationChannel;)V
+HPLcom/android/server/notification/RankingHandler;->requestReconsideration(Lcom/android/server/notification/RankingReconsideration;)V
+HPLcom/android/server/notification/RankingHandler;->requestSort(Z)V
+HPLcom/android/server/notification/RankingHelper;->getOrCreateRecord(Ljava/lang/String;IIIIZ)Lcom/android/server/notification/RankingHelper$Record;
+HPLcom/android/server/notification/RankingHelper;->readXml(Lorg/xmlpull/v1/XmlPullParser;Z)V
+HPLcom/android/server/notification/RankingHelper;->recordKey(Ljava/lang/String;I)Ljava/lang/String;
+HPLcom/android/server/notification/RankingHelper;->safeInt(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;I)I
+HPLcom/android/server/notification/RankingHelper;->sort(Ljava/util/ArrayList;)V
+HPLcom/android/server/notification/RankingHelper;->tryParseInt(Ljava/lang/String;I)I
+HPLcom/android/server/notification/RankingHelper;->writeXml(Lorg/xmlpull/v1/XmlSerializer;Z)V
+HPLcom/android/server/notification/RankingReconsideration;->applyChangesLocked(Lcom/android/server/notification/NotificationRecord;)V
+HPLcom/android/server/notification/RankingReconsideration;->work()V
+HPLcom/android/server/notification/SnoozeHelper$Callback;->repost(ILcom/android/server/notification/NotificationRecord;)V
+HPLcom/android/server/om/OverlayManagerServiceImpl$OverlayChangeListener;->onOverlaysChanged(Ljava/lang/String;I)V
+HPLcom/android/server/om/OverlayManagerServiceImpl$PackageManagerHelper;->getOverlayPackages(I)Ljava/util/List;
+HPLcom/android/server/om/OverlayManagerServiceImpl$PackageManagerHelper;->getPackageInfo(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;
+HPLcom/android/server/om/OverlayManagerServiceImpl$PackageManagerHelper;->signaturesMatching(Ljava/lang/String;Ljava/lang/String;I)Z
+HPLcom/android/server/pm/AbstractStatsBase;->maybeWriteAsync(Ljava/lang/Object;)Z
+HPLcom/android/server/pm/BasePermission;->isRuntimeOnly()Z
+HPLcom/android/server/pm/PackageManagerService$2;->compare(Landroid/content/pm/ResolveInfo;Landroid/content/pm/ResolveInfo;)I
+HPLcom/android/server/pm/PackageManagerService$2;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+HPLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->addActivity(Landroid/content/pm/PackageParser$Activity;Ljava/lang/String;)V
+HPLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->allowFilterResult(Landroid/content/IntentFilter;Ljava/util/List;)Z
+HPLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->allowFilterResult(Landroid/content/pm/PackageParser$ActivityIntentInfo;Ljava/util/List;)Z
+HPLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->isFilterStopped(Landroid/content/IntentFilter;I)Z
+HPLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->isFilterStopped(Landroid/content/pm/PackageParser$ActivityIntentInfo;I)Z
+HPLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->isPackageForFilter(Ljava/lang/String;Landroid/content/IntentFilter;)Z
+HPLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->isPackageForFilter(Ljava/lang/String;Landroid/content/pm/PackageParser$ActivityIntentInfo;)Z
+HPLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->newResult(Landroid/content/pm/PackageParser$ActivityIntentInfo;II)Landroid/content/pm/ResolveInfo;
+HPLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->queryIntentForPackage(Landroid/content/Intent;Ljava/lang/String;ILjava/util/ArrayList;I)Ljava/util/List;
+HPLcom/android/server/pm/PackageManagerService$HandlerParams;->handleReturnCode()V
+HPLcom/android/server/pm/PackageManagerService$HandlerParams;->handleServiceError()V
+HPLcom/android/server/pm/PackageManagerService$HandlerParams;->handleStartCopy()V
+HPLcom/android/server/pm/PackageManagerService$InstallArgs;->cleanUpResourcesLI()V
+HPLcom/android/server/pm/PackageManagerService$InstallArgs;->copyApk(Lcom/android/internal/app/IMediaContainerService;Z)I
+HPLcom/android/server/pm/PackageManagerService$InstallArgs;->doPostDeleteLI(Z)Z
+HPLcom/android/server/pm/PackageManagerService$InstallArgs;->doPostInstall(II)I
+HPLcom/android/server/pm/PackageManagerService$InstallArgs;->doPreInstall(I)I
+HPLcom/android/server/pm/PackageManagerService$InstallArgs;->doRename(ILandroid/content/pm/PackageParser$Package;Ljava/lang/String;)Z
+HPLcom/android/server/pm/PackageManagerService$InstallArgs;->getCodePath()Ljava/lang/String;
+HPLcom/android/server/pm/PackageManagerService$InstallArgs;->getResourcePath()Ljava/lang/String;
+HPLcom/android/server/pm/PackageManagerService$IntentFilterVerifier;->addOneIntentFilterVerification(IIILandroid/content/IntentFilter;Ljava/lang/String;)Z
+HPLcom/android/server/pm/PackageManagerService$IntentFilterVerifier;->receiveVerificationResponse(I)V
+HPLcom/android/server/pm/PackageManagerService$IntentFilterVerifier;->startVerifications(I)V
+HPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->grantEphemeralAccess(ILandroid/content/Intent;II)V
+HPLcom/android/server/pm/PackageManagerService$ServiceIntentResolver;->addService(Landroid/content/pm/PackageParser$Service;)V
+HPLcom/android/server/pm/PackageManagerService$ServiceIntentResolver;->allowFilterResult(Landroid/content/IntentFilter;Ljava/util/List;)Z
+HPLcom/android/server/pm/PackageManagerService$ServiceIntentResolver;->allowFilterResult(Landroid/content/pm/PackageParser$ServiceIntentInfo;Ljava/util/List;)Z
+HPLcom/android/server/pm/PackageManagerService$ServiceIntentResolver;->isPackageForFilter(Ljava/lang/String;Landroid/content/IntentFilter;)Z
+HPLcom/android/server/pm/PackageManagerService$ServiceIntentResolver;->isPackageForFilter(Ljava/lang/String;Landroid/content/pm/PackageParser$ServiceIntentInfo;)Z
+HPLcom/android/server/pm/PackageManagerService$ServiceIntentResolver;->newResult(Landroid/content/IntentFilter;II)Ljava/lang/Object;
+HPLcom/android/server/pm/PackageManagerService$ServiceIntentResolver;->newResult(Landroid/content/pm/PackageParser$ServiceIntentInfo;II)Landroid/content/pm/ResolveInfo;
+HPLcom/android/server/pm/PackageManagerService$ServiceIntentResolver;->queryIntentForPackage(Landroid/content/Intent;Ljava/lang/String;ILjava/util/ArrayList;I)Ljava/util/List;
+HPLcom/android/server/pm/PackageManagerService;->checkPermission(Ljava/lang/String;Ljava/lang/String;I)I
+HPLcom/android/server/pm/PackageManagerService;->checkUidPermission(Ljava/lang/String;I)I
+HPLcom/android/server/pm/PackageManagerService;->checkUidSignatures(II)I
+HPLcom/android/server/pm/PackageManagerService;->commitPackageSettings(Landroid/content/pm/PackageParser$Package;Lcom/android/server/pm/PackageSetting;Landroid/os/UserHandle;IZ)V
+HPLcom/android/server/pm/PackageManagerService;->compareSignatures([Landroid/content/pm/Signature;[Landroid/content/pm/Signature;)I
+HPLcom/android/server/pm/PackageManagerService;->enforceCrossUserPermission(IIZZLjava/lang/String;)V
+HPLcom/android/server/pm/PackageManagerService;->filterAppAccessLPr(Lcom/android/server/pm/PackageSetting;II)Z
+HPLcom/android/server/pm/PackageManagerService;->filterAppAccessLPr(Lcom/android/server/pm/PackageSetting;ILandroid/content/ComponentName;II)Z
+HPLcom/android/server/pm/PackageManagerService;->filterSharedLibPackageLPr(Lcom/android/server/pm/PackageSetting;III)Z
+HPLcom/android/server/pm/PackageManagerService;->findPermissionTreeLP(Ljava/lang/String;)Lcom/android/server/pm/BasePermission;
+HPLcom/android/server/pm/PackageManagerService;->fixProcessName(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
+HPLcom/android/server/pm/PackageManagerService;->generatePackageInfo(Lcom/android/server/pm/PackageSetting;II)Landroid/content/pm/PackageInfo;
+HPLcom/android/server/pm/PackageManagerService;->getApplicationEnabledSetting(Ljava/lang/String;I)I
+HPLcom/android/server/pm/PackageManagerService;->getApplicationInfo(Ljava/lang/String;II)Landroid/content/pm/ApplicationInfo;
+HPLcom/android/server/pm/PackageManagerService;->getApplicationInfoInternal(Ljava/lang/String;III)Landroid/content/pm/ApplicationInfo;
+HPLcom/android/server/pm/PackageManagerService;->getInstalledApplications(II)Landroid/content/pm/ParceledListSlice;
+HPLcom/android/server/pm/PackageManagerService;->getInstalledPackages(II)Landroid/content/pm/ParceledListSlice;
+HPLcom/android/server/pm/PackageManagerService;->getInstantAppPackageName(I)Ljava/lang/String;
+HPLcom/android/server/pm/PackageManagerService;->getPackageInfo(Ljava/lang/String;II)Landroid/content/pm/PackageInfo;
+HPLcom/android/server/pm/PackageManagerService;->getPackageInfoInternal(Ljava/lang/String;IIII)Landroid/content/pm/PackageInfo;
+HPLcom/android/server/pm/PackageManagerService;->getPackageUid(Ljava/lang/String;II)I
+HPLcom/android/server/pm/PackageManagerService;->getPackagesForUid(I)[Ljava/lang/String;
+HPLcom/android/server/pm/PackageManagerService;->getServiceInfo(Landroid/content/ComponentName;II)Landroid/content/pm/ServiceInfo;
+HPLcom/android/server/pm/PackageManagerService;->getUserManagerInternal()Landroid/os/UserManagerInternal;
+HPLcom/android/server/pm/PackageManagerService;->grantPermissionsLPw(Landroid/content/pm/PackageParser$Package;ZLjava/lang/String;)V
+HPLcom/android/server/pm/PackageManagerService;->grantSignaturePermission(Ljava/lang/String;Landroid/content/pm/PackageParser$Package;Lcom/android/server/pm/BasePermission;Lcom/android/server/pm/PermissionsState;)Z
+HPLcom/android/server/pm/PackageManagerService;->isCallerSameApp(Ljava/lang/String;I)Z
+HPLcom/android/server/pm/PackageManagerService;->isInstantApp(Ljava/lang/String;I)Z
+HPLcom/android/server/pm/PackageManagerService;->isPackageAvailable(Ljava/lang/String;I)Z
+HPLcom/android/server/pm/PackageManagerService;->isPackageSuspendedForUser(Ljava/lang/String;I)Z
+HPLcom/android/server/pm/PackageManagerService;->isSystemApp(Lcom/android/server/pm/PackageSetting;)Z
+HPLcom/android/server/pm/PackageManagerService;->notifyPackageUse(Ljava/lang/String;I)V
+HPLcom/android/server/pm/PackageManagerService;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+HPLcom/android/server/pm/PackageManagerService;->performDexOptInternal(Ljava/lang/String;ZLjava/lang/String;ZZ)I
+HPLcom/android/server/pm/PackageManagerService;->queryContentProviders(Ljava/lang/String;IILjava/lang/String;)Landroid/content/pm/ParceledListSlice;
+HPLcom/android/server/pm/PackageManagerService;->queryIntentActivitiesInternal(Landroid/content/Intent;Ljava/lang/String;II)Ljava/util/List;
+HPLcom/android/server/pm/PackageManagerService;->queryIntentActivitiesInternal(Landroid/content/Intent;Ljava/lang/String;IIIZ)Ljava/util/List;
+HPLcom/android/server/pm/PackageManagerService;->queryIntentReceiversInternal(Landroid/content/Intent;Ljava/lang/String;II)Ljava/util/List;
+HPLcom/android/server/pm/PackageManagerService;->queryIntentServices(Landroid/content/Intent;Ljava/lang/String;II)Landroid/content/pm/ParceledListSlice;
+HPLcom/android/server/pm/PackageManagerService;->queryIntentServicesInternal(Landroid/content/Intent;Ljava/lang/String;IIIZ)Ljava/util/List;
+HPLcom/android/server/pm/PackageManagerService;->reconcileApps(Ljava/lang/String;)V
+HPLcom/android/server/pm/PackageManagerService;->resolveContentProvider(Ljava/lang/String;II)Landroid/content/pm/ProviderInfo;
+HPLcom/android/server/pm/PackageManagerService;->resolveExternalPackageNameLPr(Landroid/content/pm/PackageParser$Package;)Ljava/lang/String;
+HPLcom/android/server/pm/PackageManagerService;->resolveInternalPackageNameLPr(Ljava/lang/String;I)Ljava/lang/String;
+HPLcom/android/server/pm/PackageManagerService;->resolveServiceInternal(Landroid/content/Intent;Ljava/lang/String;III)Landroid/content/pm/ResolveInfo;
+HPLcom/android/server/pm/PackageManagerService;->scanPackageDirtyLI(Landroid/content/pm/PackageParser$Package;IIJLandroid/os/UserHandle;)Landroid/content/pm/PackageParser$Package;
+HPLcom/android/server/pm/PackageManagerService;->setEnabledSetting(Ljava/lang/String;Ljava/lang/String;IIILjava/lang/String;)V
+HPLcom/android/server/pm/PackageManagerService;->setPackageStoppedState(Ljava/lang/String;ZI)V
+HPLcom/android/server/pm/PackageManagerService;->updateFlags(II)I
+HPLcom/android/server/pm/PackageManagerService;->updateFlagsForApplication(IILjava/lang/Object;)I
+HPLcom/android/server/pm/PackageManagerService;->updateFlagsForComponent(IILjava/lang/Object;)I
+HPLcom/android/server/pm/PackageManagerService;->updateFlagsForPackage(IILjava/lang/Object;)I
+HPLcom/android/server/pm/PackageManagerService;->updateFlagsForResolve(IILandroid/content/Intent;IZ)I
+HPLcom/android/server/pm/PackageManagerService;->updateFlagsForResolve(IILandroid/content/Intent;IZZ)I
+HPLcom/android/server/pm/PackageManagerService;->updatePermissionsLPw(Ljava/lang/String;Landroid/content/pm/PackageParser$Package;Ljava/lang/String;I)V
+HPLcom/android/server/pm/PackageManagerService;->userNeedsBadging(I)Z
+HPLcom/android/server/pm/PackageSettingBase;->getInstalled(I)Z
+HPLcom/android/server/pm/PackageSettingBase;->getInstantApp(I)Z
+HPLcom/android/server/pm/PackageSettingBase;->readUserState(I)Landroid/content/pm/PackageUserState;
+HPLcom/android/server/pm/PackageSignatures;->writeXml(Lorg/xmlpull/v1/XmlSerializer;Ljava/lang/String;Ljava/util/ArrayList;)V
+HPLcom/android/server/pm/PackageUsage;->readToken(Ljava/io/InputStream;Ljava/lang/StringBuffer;C)Ljava/lang/String;
+HPLcom/android/server/pm/PermissionsState$PermissionData;-><init>(Lcom/android/server/pm/PermissionsState$PermissionData;)V
+HPLcom/android/server/pm/PermissionsState$PermissionData;->getPermissionState(I)Lcom/android/server/pm/PermissionsState$PermissionState;
+HPLcom/android/server/pm/PermissionsState$PermissionState;-><init>(Lcom/android/server/pm/PermissionsState$PermissionState;)V
+HPLcom/android/server/pm/PermissionsState$PermissionState;->getFlags()I
+HPLcom/android/server/pm/PermissionsState$PermissionState;->getName()Ljava/lang/String;
+HPLcom/android/server/pm/PermissionsState$PermissionState;->isGranted()Z
+HPLcom/android/server/pm/PermissionsState;->copyFrom(Lcom/android/server/pm/PermissionsState;)V
+HPLcom/android/server/pm/PermissionsState;->getPermissionState(Ljava/lang/String;I)Lcom/android/server/pm/PermissionsState$PermissionState;
+HPLcom/android/server/pm/PermissionsState;->getPermissionStatesInternal(I)Ljava/util/List;
+HPLcom/android/server/pm/PermissionsState;->getPermissions(I)Ljava/util/Set;
+HPLcom/android/server/pm/PermissionsState;->getRuntimePermissionState(Ljava/lang/String;I)Lcom/android/server/pm/PermissionsState$PermissionState;
+HPLcom/android/server/pm/PermissionsState;->hasInstallPermission(Ljava/lang/String;)Z
+HPLcom/android/server/pm/PermissionsState;->hasRuntimePermission(Ljava/lang/String;I)Z
+HPLcom/android/server/pm/PreferredComponent$Callbacks;->onReadTag(Ljava/lang/String;Lorg/xmlpull/v1/XmlPullParser;)Z
+HPLcom/android/server/pm/SELinuxMMAC;->assignSeInfoValue(Landroid/content/pm/PackageParser$Package;)V
+HPLcom/android/server/pm/Settings$RuntimePermissionPersistence;->writePermissions(Lorg/xmlpull/v1/XmlSerializer;Ljava/util/List;)V
+HPLcom/android/server/pm/Settings$RuntimePermissionPersistence;->writePermissionsSync(I)V
+HPLcom/android/server/pm/Settings;->getAllUsers(Lcom/android/server/pm/UserManagerService;)Ljava/util/List;
+HPLcom/android/server/pm/Settings;->getRenamedPackageLPr(Ljava/lang/String;)Ljava/lang/String;
+HPLcom/android/server/pm/Settings;->getUserIdLPr(I)Ljava/lang/Object;
+HPLcom/android/server/pm/Settings;->isEnabledAndMatchLPr(Landroid/content/pm/ComponentInfo;II)Z
+HPLcom/android/server/pm/Settings;->readPackageRestrictionsLPr(I)V
+HPLcom/android/server/pm/Settings;->setPackageStoppedStateLPw(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;ZZII)Z
+HPLcom/android/server/pm/Settings;->writeIntToFile(Ljava/io/File;I)V
+HPLcom/android/server/pm/Settings;->writeKernelMappingLPr()V
+HPLcom/android/server/pm/Settings;->writeKernelMappingLPr(Lcom/android/server/pm/PackageSetting;)V
+HPLcom/android/server/pm/Settings;->writeLPr()V
+HPLcom/android/server/pm/Settings;->writePackageLPr(Lorg/xmlpull/v1/XmlSerializer;Lcom/android/server/pm/PackageSetting;)V
+HPLcom/android/server/pm/Settings;->writePackageListLPr(I)V
+HPLcom/android/server/pm/Settings;->writePackageRestrictionsLPr(I)V
+HPLcom/android/server/pm/Settings;->writePermissionLPr(Lorg/xmlpull/v1/XmlSerializer;Lcom/android/server/pm/BasePermission;)V
+HPLcom/android/server/pm/Settings;->writePermissionsLPr(Lorg/xmlpull/v1/XmlSerializer;Ljava/util/List;)V
+HPLcom/android/server/pm/Settings;->writeSigningKeySetLPr(Lorg/xmlpull/v1/XmlSerializer;Lcom/android/server/pm/PackageKeySetData;)V
+HPLcom/android/server/pm/ShortcutPackage;->saveShortcut(Lorg/xmlpull/v1/XmlSerializer;Landroid/content/pm/ShortcutInfo;Z)V
+HPLcom/android/server/pm/ShortcutService;->injectElapsedRealtime()J
+HPLcom/android/server/pm/ShortcutService;->writeAttr(Lorg/xmlpull/v1/XmlSerializer;Ljava/lang/String;J)V
+HPLcom/android/server/pm/ShortcutService;->writeAttr(Lorg/xmlpull/v1/XmlSerializer;Ljava/lang/String;Ljava/lang/CharSequence;)V
+HPLcom/android/server/pm/UserManagerService$LocalService;->isUserUnlockingOrUnlocked(I)Z
+HPLcom/android/server/pm/UserManagerService;->-get9(Lcom/android/server/pm/UserManagerService;)Landroid/util/SparseIntArray;
+HPLcom/android/server/pm/UserManagerService;->exists(I)Z
+HPLcom/android/server/pm/UserManagerService;->getInstance()Lcom/android/server/pm/UserManagerService;
+HPLcom/android/server/pm/UserManagerService;->getProfileIds(IZ)[I
+HPLcom/android/server/pm/UserManagerService;->getUserIds()[I
+HPLcom/android/server/pm/UserManagerService;->getUserInfo(I)Landroid/content/pm/UserInfo;
+HPLcom/android/server/pm/UserManagerService;->getUserInfoLU(I)Landroid/content/pm/UserInfo;
+HPLcom/android/server/pm/UserManagerService;->getUserInfoNoChecks(I)Landroid/content/pm/UserInfo;
+HPLcom/android/server/pm/UserManagerService;->hasManageUsersPermission()Z
+HPLcom/android/server/pm/UserManagerService;->hasManagedProfile(I)Z
+HPLcom/android/server/pm/dex/DexManager$PackageCodeLocations;->searchDex(Ljava/lang/String;I)I
+HPLcom/android/server/pm/dex/DexManager;->-get3()I
+HPLcom/android/server/pm/dex/DexManager;->getDexPackage(Landroid/content/pm/ApplicationInfo;Ljava/lang/String;I)Lcom/android/server/pm/dex/DexManager$DexSearchResult;
+HPLcom/android/server/policy/BarController$OnBarVisibilityChangedListener;->onBarVisibilityChanged(Z)V
+HPLcom/android/server/policy/BarController;->applyTranslucentFlagLw(Landroid/view/WindowManagerPolicy$WindowState;II)I
+HPLcom/android/server/policy/BarController;->isTransientShowRequested()Z
+HPLcom/android/server/policy/BarController;->isTransientShowing()Z
+HPLcom/android/server/policy/BarController;->setBarShowingLw(Z)Z
+HPLcom/android/server/policy/BarController;->updateVisibilityLw(ZII)I
+HPLcom/android/server/policy/PhoneWindowManager;->applyKeyguardPolicyLw(Landroid/view/WindowManagerPolicy$WindowState;Landroid/view/WindowManagerPolicy$WindowState;)V
+HPLcom/android/server/policy/PhoneWindowManager;->applyPostLayoutPolicyLw(Landroid/view/WindowManagerPolicy$WindowState;Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManagerPolicy$WindowState;Landroid/view/WindowManagerPolicy$WindowState;)V
+HPLcom/android/server/policy/PhoneWindowManager;->beginLayoutLw(ZIIII)V
+HPLcom/android/server/policy/PhoneWindowManager;->canBeHiddenByKeyguardLw(Landroid/view/WindowManagerPolicy$WindowState;)Z
+HPLcom/android/server/policy/PhoneWindowManager;->finishPostLayoutPolicyLw()I
+HPLcom/android/server/policy/PhoneWindowManager;->inKeyguardRestrictedKeyInputMode()Z
+HPLcom/android/server/policy/PhoneWindowManager;->isKeyguardLocked()Z
+HPLcom/android/server/policy/PhoneWindowManager;->isKeyguardShowingAndNotOccluded()Z
+HPLcom/android/server/policy/PhoneWindowManager;->isScreenOn()Z
+HPLcom/android/server/policy/PhoneWindowManager;->isStatusBarKeyguard()Z
+HPLcom/android/server/policy/PhoneWindowManager;->keyguardOn()Z
+HPLcom/android/server/policy/PhoneWindowManager;->layoutWindowLw(Landroid/view/WindowManagerPolicy$WindowState;Landroid/view/WindowManagerPolicy$WindowState;)V
+HPLcom/android/server/policy/PhoneWindowManager;->shouldBeHiddenByKeyguard(Landroid/view/WindowManagerPolicy$WindowState;Landroid/view/WindowManagerPolicy$WindowState;)Z
+HPLcom/android/server/policy/PhoneWindowManager;->updateLightStatusBarLw(ILandroid/view/WindowManagerPolicy$WindowState;Landroid/view/WindowManagerPolicy$WindowState;)I
+HPLcom/android/server/policy/PhoneWindowManager;->updateSystemBarsLw(Landroid/view/WindowManagerPolicy$WindowState;II)I
+HPLcom/android/server/policy/PhoneWindowManager;->updateSystemUiVisibilityLw()I
+HPLcom/android/server/policy/PolicyControl;->getSystemUiVisibility(Landroid/view/WindowManagerPolicy$WindowState;Landroid/view/WindowManager$LayoutParams;)I
+HPLcom/android/server/policy/PolicyControl;->getWindowFlags(Landroid/view/WindowManagerPolicy$WindowState;Landroid/view/WindowManager$LayoutParams;)I
+HPLcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;->onDebug()V
+HPLcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;->onDown()V
+HPLcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;->onFling(I)V
+HPLcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;->onMouseHoverAtBottom()V
+HPLcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;->onMouseHoverAtTop()V
+HPLcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;->onMouseLeaveFromEdge()V
+HPLcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;->onSwipeFromBottom()V
+HPLcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;->onSwipeFromLeft()V
+HPLcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;->onSwipeFromRight()V
+HPLcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;->onSwipeFromTop()V
+HPLcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;->onUpOrCancel()V
+HPLcom/android/server/policy/SystemGesturesPointerEventListener;->detectSwipe(Landroid/view/MotionEvent;)I
+HPLcom/android/server/policy/WakeGestureListener;->onWakeUp()V
+HPLcom/android/server/policy/WindowOrientationListener$OrientationJudge;->dumpLocked(Ljava/io/PrintWriter;Ljava/lang/String;)V
+HPLcom/android/server/policy/WindowOrientationListener$OrientationJudge;->getProposedRotationLocked()I
+HPLcom/android/server/policy/WindowOrientationListener$OrientationJudge;->onAccuracyChanged(Landroid/hardware/Sensor;I)V
+HPLcom/android/server/policy/WindowOrientationListener$OrientationJudge;->onSensorChanged(Landroid/hardware/SensorEvent;)V
+HPLcom/android/server/policy/WindowOrientationListener$OrientationJudge;->onTouchEndLocked(J)V
+HPLcom/android/server/policy/WindowOrientationListener$OrientationJudge;->onTouchStartLocked()V
+HPLcom/android/server/policy/WindowOrientationListener$OrientationJudge;->resetLocked(Z)V
+HPLcom/android/server/policy/WindowOrientationListener;->onProposedRotationChanged(I)V
+HPLcom/android/server/policy/keyguard/KeyguardServiceDelegate$DrawnListener;->onDrawn()V
+HPLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->isInputRestricted()Z
+HPLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->isShowing()Z
+HPLcom/android/server/policy/keyguard/KeyguardServiceWrapper;->isInputRestricted()Z
+HPLcom/android/server/policy/keyguard/KeyguardServiceWrapper;->isShowing()Z
+HPLcom/android/server/policy/keyguard/KeyguardStateMonitor$StateCallback;->onTrustedChanged()V
+HPLcom/android/server/power/Notifier;->onWakeLockAcquired(ILjava/lang/String;Ljava/lang/String;IILandroid/os/WorkSource;Ljava/lang/String;)V
+HPLcom/android/server/power/Notifier;->onWakeLockReleased(ILjava/lang/String;Ljava/lang/String;IILandroid/os/WorkSource;Ljava/lang/String;)V
+HPLcom/android/server/power/PowerManagerService$BinderService;->acquireWakeLock(Landroid/os/IBinder;ILjava/lang/String;Ljava/lang/String;Landroid/os/WorkSource;Ljava/lang/String;)V
+HPLcom/android/server/power/PowerManagerService$BinderService;->powerHint(II)V
+HPLcom/android/server/power/PowerManagerService$BinderService;->releaseWakeLock(Landroid/os/IBinder;I)V
+HPLcom/android/server/power/PowerManagerService$BinderService;->updateWakeLockWorkSource(Landroid/os/IBinder;Landroid/os/WorkSource;Ljava/lang/String;)V
+HPLcom/android/server/power/PowerManagerService$LocalService;->finishUidChanges()V
+HPLcom/android/server/power/PowerManagerService$LocalService;->startUidChanges()V
+HPLcom/android/server/power/PowerManagerService$PowerManagerHandler;->handleMessage(Landroid/os/Message;)V
+HPLcom/android/server/power/PowerManagerService;->-get1(Lcom/android/server/power/PowerManagerService;)Landroid/content/Context;
+HPLcom/android/server/power/PowerManagerService;->-wrap22(Lcom/android/server/power/PowerManagerService;II)V
+HPLcom/android/server/power/PowerManagerService;->acquireWakeLockInternal(Landroid/os/IBinder;ILjava/lang/String;Ljava/lang/String;Landroid/os/WorkSource;Ljava/lang/String;II)V
+HPLcom/android/server/power/PowerManagerService;->findWakeLockIndexLocked(Landroid/os/IBinder;)I
+HPLcom/android/server/power/PowerManagerService;->getScreenDimDurationLocked(I)I
+HPLcom/android/server/power/PowerManagerService;->getScreenOffTimeoutLocked(I)I
+HPLcom/android/server/power/PowerManagerService;->handleSandman()V
+HPLcom/android/server/power/PowerManagerService;->isItBedTimeYetLocked()Z
+HPLcom/android/server/power/PowerManagerService;->isValidBrightness(I)Z
+HPLcom/android/server/power/PowerManagerService;->needDisplaySuspendBlockerLocked()Z
+HPLcom/android/server/power/PowerManagerService;->powerHintInternal(II)V
+HPLcom/android/server/power/PowerManagerService;->releaseWakeLockInternal(Landroid/os/IBinder;I)V
+HPLcom/android/server/power/PowerManagerService;->removeWakeLockLocked(Lcom/android/server/power/PowerManagerService$WakeLock;I)V
+HPLcom/android/server/power/PowerManagerService;->restartNofifyLongTimerLocked(Lcom/android/server/power/PowerManagerService$WakeLock;)V
+HPLcom/android/server/power/PowerManagerService;->scheduleSandmanLocked()V
+HPLcom/android/server/power/PowerManagerService;->updateDisplayPowerStateLocked(I)Z
+HPLcom/android/server/power/PowerManagerService;->updateDreamLocked(IZ)V
+HPLcom/android/server/power/PowerManagerService;->updatePowerRequestFromBatterySaverPolicy(Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;)V
+HPLcom/android/server/power/PowerManagerService;->updatePowerStateLocked()V
+HPLcom/android/server/power/PowerManagerService;->updateSuspendBlockerLocked()V
+HPLcom/android/server/power/PowerManagerService;->updateUserActivitySummaryLocked(JI)V
+HPLcom/android/server/power/PowerManagerService;->updateWakeLockSummaryLocked(I)V
+HPLcom/android/server/power/PowerManagerService;->updateWakefulnessLocked(I)Z
+HPLcom/android/server/print/RemotePrintService$PrintServiceCallbacks;->onCustomPrinterIconLoaded(Landroid/print/PrinterId;Landroid/graphics/drawable/Icon;)V
+HPLcom/android/server/print/RemotePrintService$PrintServiceCallbacks;->onPrintersAdded(Ljava/util/List;)V
+HPLcom/android/server/print/RemotePrintService$PrintServiceCallbacks;->onPrintersRemoved(Ljava/util/List;)V
+HPLcom/android/server/print/RemotePrintService$PrintServiceCallbacks;->onServiceDied(Lcom/android/server/print/RemotePrintService;)V
+HPLcom/android/server/print/RemotePrintServiceRecommendationService$RemotePrintServiceRecommendationServiceCallbacks;->onPrintServiceRecommendationsUpdated(Ljava/util/List;)V
+HPLcom/android/server/print/RemotePrintSpooler$PrintSpoolerCallbacks;->onAllPrintJobsForServiceHandled(Landroid/content/ComponentName;)V
+HPLcom/android/server/print/RemotePrintSpooler$PrintSpoolerCallbacks;->onPrintJobQueued(Landroid/print/PrintJobInfo;)V
+HPLcom/android/server/print/RemotePrintSpooler$PrintSpoolerCallbacks;->onPrintJobStateChanged(Landroid/print/PrintJobInfo;)V
+HPLcom/android/server/soundtrigger/SoundTriggerInternal;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
+HPLcom/android/server/soundtrigger/SoundTriggerInternal;->getModuleProperties()Landroid/hardware/soundtrigger/SoundTrigger$ModuleProperties;
+HPLcom/android/server/soundtrigger/SoundTriggerInternal;->startRecognition(ILandroid/hardware/soundtrigger/SoundTrigger$KeyphraseSoundModel;Landroid/hardware/soundtrigger/IRecognitionStatusCallback;Landroid/hardware/soundtrigger/SoundTrigger$RecognitionConfig;)I
+HPLcom/android/server/soundtrigger/SoundTriggerInternal;->stopRecognition(ILandroid/hardware/soundtrigger/IRecognitionStatusCallback;)I
+HPLcom/android/server/soundtrigger/SoundTriggerInternal;->unloadKeyphraseModel(I)I
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->appTransitionCancelled()V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->appTransitionFinished()V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->appTransitionPending()V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->appTransitionStarting(JJ)V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->cancelPreloadRecentApps()V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->dismissKeyboardShortcutsMenu()V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->hideRecentApps(ZZ)V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->onCameraLaunchGestureDetected(I)V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->preloadRecentApps()V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->setCurrentUser(I)V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->setGlobalActionsListener(Lcom/android/server/statusbar/StatusBarManagerInternal$GlobalActionsListener;)V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->setNotificationDelegate(Lcom/android/server/notification/NotificationDelegate;)V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->setSystemUiVisibility(IIIILandroid/graphics/Rect;Landroid/graphics/Rect;Ljava/lang/String;)V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->setWindowState(II)V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->showAssistDisclosure()V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->showGlobalActions()V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->showPictureInPictureMenu()V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->showRecentApps(ZZ)V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->showScreenPinningRequest(I)V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->startAssist(Landroid/os/Bundle;)V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->toggleKeyboardShortcutsMenu(I)V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->toggleRecentApps()V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->toggleSplitScreen()V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->topAppWindowChanged(Z)V
+HPLcom/android/server/storage/DeviceStorageMonitorInternal;->checkMemory()V
+HPLcom/android/server/storage/DeviceStorageMonitorInternal;->getMemoryLowThreshold()J
+HPLcom/android/server/storage/DeviceStorageMonitorInternal;->isMemoryLow()Z
+HPLcom/android/server/twilight/TwilightListener;->onTwilightStateChanged(Lcom/android/server/twilight/TwilightState;)V
+HPLcom/android/server/twilight/TwilightManager;->getLastTwilightState()Lcom/android/server/twilight/TwilightState;
+HPLcom/android/server/twilight/TwilightManager;->registerListener(Lcom/android/server/twilight/TwilightListener;Landroid/os/Handler;)V
+HPLcom/android/server/twilight/TwilightManager;->unregisterListener(Lcom/android/server/twilight/TwilightListener;)V
+HPLcom/android/server/usage/AppIdleHistory;->isIdle(Ljava/lang/String;IJ)Z
+HPLcom/android/server/usage/IntervalStats;->getOrCreateUsageStats(Ljava/lang/String;)Landroid/app/usage/UsageStats;
+HPLcom/android/server/usage/IntervalStats;->update(Ljava/lang/String;JI)V
+HPLcom/android/server/usage/UsageStatsService$2;->onUidStateChanged(IIJ)V
+HPLcom/android/server/usage/UsageStatsService$BinderService;->isAppInactive(Ljava/lang/String;I)Z
+HPLcom/android/server/usage/UsageStatsService$LocalService;->isAppIdle(Ljava/lang/String;II)Z
+HPLcom/android/server/usage/UsageStatsService$LocalService;->reportEvent(Ljava/lang/String;II)V
+HPLcom/android/server/usage/UsageStatsService;->checkAndGetTimeLocked()J
+HPLcom/android/server/usage/UsageStatsService;->isActiveNetworkScorer(Ljava/lang/String;)Z
+HPLcom/android/server/usage/UsageStatsService;->isAppIdleFiltered(Ljava/lang/String;IIJ)Z
+HPLcom/android/server/usage/UsageStatsService;->isDeviceProvisioningPackage(Ljava/lang/String;)Z
+HPLcom/android/server/usage/UsageStatsService;->reportEvent(Landroid/app/usage/UsageEvents$Event;I)V
+HPLcom/android/server/usage/UsageStatsXmlV1;->read(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/usage/IntervalStats;)V
+HPLcom/android/server/usage/UserUsageStatsService$StatsUpdatedListener;->onNewUpdate(I)V
+HPLcom/android/server/usage/UserUsageStatsService$StatsUpdatedListener;->onStatsReloaded()V
+HPLcom/android/server/usage/UserUsageStatsService$StatsUpdatedListener;->onStatsUpdated()V
+HPLcom/android/server/usage/UserUsageStatsService;->reportEvent(Landroid/app/usage/UsageEvents$Event;)V
+HPLcom/android/server/usb/MtpNotificationManager$OnOpenInAppListener;->onOpenInApp(Landroid/hardware/usb/UsbDevice;)V
+HPLcom/android/server/utils/ManagedApplicationService$BinderChecker;->asInterface(Landroid/os/IBinder;)Landroid/os/IInterface;
+HPLcom/android/server/utils/ManagedApplicationService$BinderChecker;->checkType(Landroid/os/IInterface;)Z
+HPLcom/android/server/voiceinteraction/VoiceInteractionSessionConnection$Callback;->onSessionHidden(Lcom/android/server/voiceinteraction/VoiceInteractionSessionConnection;)V
+HPLcom/android/server/voiceinteraction/VoiceInteractionSessionConnection$Callback;->onSessionShown(Lcom/android/server/voiceinteraction/VoiceInteractionSessionConnection;)V
+HPLcom/android/server/voiceinteraction/VoiceInteractionSessionConnection$Callback;->sessionConnectionGone(Lcom/android/server/voiceinteraction/VoiceInteractionSessionConnection;)V
+HPLcom/android/server/vr/SettingsObserver$SettingChangeListener;->onSettingChanged()V
+HPLcom/android/server/vr/SettingsObserver$SettingChangeListener;->onSettingRestored(Ljava/lang/String;Ljava/lang/String;I)V
+HPLcom/android/server/vr/VrManagerInternal;->addPersistentVrModeStateListener(Landroid/service/vr/IPersistentVrStateCallbacks;)V
+HPLcom/android/server/vr/VrManagerInternal;->getVr2dDisplayId()I
+HPLcom/android/server/vr/VrManagerInternal;->hasVrPackage(Landroid/content/ComponentName;I)I
+HPLcom/android/server/vr/VrManagerInternal;->isCurrentVrListener(Ljava/lang/String;I)Z
+HPLcom/android/server/vr/VrManagerInternal;->onScreenStateChanged(Z)V
+HPLcom/android/server/vr/VrManagerInternal;->onSleepStateChanged(Z)V
+HPLcom/android/server/vr/VrManagerInternal;->setPersistentVrModeEnabled(Z)V
+HPLcom/android/server/vr/VrManagerInternal;->setVr2dDisplayProperties(Landroid/app/Vr2dDisplayProperties;)V
+HPLcom/android/server/vr/VrManagerInternal;->setVrMode(ZLandroid/content/ComponentName;ILandroid/content/ComponentName;)V
+HPLcom/android/server/webkit/SystemInterface;->enableFallbackLogic(Z)V
+HPLcom/android/server/webkit/SystemInterface;->enablePackageForAllUsers(Landroid/content/Context;Ljava/lang/String;Z)V
+HPLcom/android/server/webkit/SystemInterface;->enablePackageForUser(Ljava/lang/String;ZI)V
+HPLcom/android/server/webkit/SystemInterface;->getFactoryPackageVersion(Ljava/lang/String;)I
+HPLcom/android/server/webkit/SystemInterface;->getMultiProcessSetting(Landroid/content/Context;)I
+HPLcom/android/server/webkit/SystemInterface;->getPackageInfoForProvider(Landroid/webkit/WebViewProviderInfo;)Landroid/content/pm/PackageInfo;
+HPLcom/android/server/webkit/SystemInterface;->getPackageInfoForProviderAllUsers(Landroid/content/Context;Landroid/webkit/WebViewProviderInfo;)Ljava/util/List;
+HPLcom/android/server/webkit/SystemInterface;->getUserChosenWebViewProvider(Landroid/content/Context;)Ljava/lang/String;
+HPLcom/android/server/webkit/SystemInterface;->getWebViewPackages()[Landroid/webkit/WebViewProviderInfo;
+HPLcom/android/server/webkit/SystemInterface;->isFallbackLogicEnabled()Z
+HPLcom/android/server/webkit/SystemInterface;->isMultiProcessDefaultEnabled()Z
+HPLcom/android/server/webkit/SystemInterface;->killPackageDependents(Ljava/lang/String;)V
+HPLcom/android/server/webkit/SystemInterface;->notifyZygote(Z)V
+HPLcom/android/server/webkit/SystemInterface;->onWebViewProviderChanged(Landroid/content/pm/PackageInfo;)I
+HPLcom/android/server/webkit/SystemInterface;->setMultiProcessSetting(Landroid/content/Context;I)V
+HPLcom/android/server/webkit/SystemInterface;->systemIsDebuggable()Z
+HPLcom/android/server/webkit/SystemInterface;->uninstallAndDisablePackageForAllUsers(Landroid/content/Context;Ljava/lang/String;)V
+HPLcom/android/server/webkit/SystemInterface;->updateUserSetting(Landroid/content/Context;Ljava/lang/String;)V
+HPLcom/android/server/wifi/BuildProperties;->isEngBuild()Z
+HPLcom/android/server/wifi/BuildProperties;->isUserBuild()Z
+HPLcom/android/server/wifi/BuildProperties;->isUserdebugBuild()Z
+HPLcom/android/server/wifi/HalDeviceManager$ListenerProxy;->action()V
+HPLcom/android/server/wifi/HalDeviceManager$ManagerStatusListener;->onStatusChanged()V
+HPLcom/android/server/wifi/LogcatLog$RealLogMessage;-><init>(ILjava/lang/String;Ljava/lang/String;)V
+HPLcom/android/server/wifi/LogcatLog$RealLogMessage;->c(J)Lcom/android/server/wifi/WifiLog$LogMessage;
+HPLcom/android/server/wifi/LogcatLog$RealLogMessage;->copyUntilPlaceholder()V
+HPLcom/android/server/wifi/LogcatLog$RealLogMessage;->flush()V
+HPLcom/android/server/wifi/LogcatLog;->makeLogMessage(ILjava/lang/String;)Lcom/android/server/wifi/WifiLog$LogMessage;
+HPLcom/android/server/wifi/LogcatLog;->trace(Ljava/lang/String;)Lcom/android/server/wifi/WifiLog$LogMessage;
+HPLcom/android/server/wifi/PropertyService;->get(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
+HPLcom/android/server/wifi/PropertyService;->getBoolean(Ljava/lang/String;Z)Z
+HPLcom/android/server/wifi/PropertyService;->set(Ljava/lang/String;Ljava/lang/String;)V
+HPLcom/android/server/wifi/ScanDetail;-><init>(Lcom/android/server/wifi/hotspot2/NetworkDetail;Landroid/net/wifi/WifiSsid;Ljava/lang/String;Ljava/lang/String;IIJ[Landroid/net/wifi/ScanResult$InformationElement;Ljava/util/List;)V
+HPLcom/android/server/wifi/ScanDetail;->getScanResult()Landroid/net/wifi/ScanResult;
+HPLcom/android/server/wifi/ScanDetailCache;->getVisibilityByRssi(J)Landroid/net/wifi/WifiConfiguration$Visibility;
+HPLcom/android/server/wifi/WifiConfigManager$OnSavedNetworkUpdateListener;->onSavedNetworkAdded(I)V
+HPLcom/android/server/wifi/WifiConfigManager$OnSavedNetworkUpdateListener;->onSavedNetworkEnabled(I)V
+HPLcom/android/server/wifi/WifiConfigManager$OnSavedNetworkUpdateListener;->onSavedNetworkPermanentlyDisabled(I)V
+HPLcom/android/server/wifi/WifiConfigManager$OnSavedNetworkUpdateListener;->onSavedNetworkRemoved(I)V
+HPLcom/android/server/wifi/WifiConfigManager$OnSavedNetworkUpdateListener;->onSavedNetworkTemporarilyDisabled(I)V
+HPLcom/android/server/wifi/WifiConfigManager$OnSavedNetworkUpdateListener;->onSavedNetworkUpdated(I)V
+HPLcom/android/server/wifi/WifiConfigurationUtil$WifiConfigurationComparator;->compareNetworksWithSameStatus(Landroid/net/wifi/WifiConfiguration;Landroid/net/wifi/WifiConfiguration;)I
+HPLcom/android/server/wifi/WifiDiagnostics;->onRingBufferData(Lcom/android/server/wifi/WifiNative$RingBufferStatus;[B)V
+HPLcom/android/server/wifi/WifiMetrics;->countScanResults(Ljava/util/List;)V
+HPLcom/android/server/wifi/WifiMulticastLockManager$FilterController;->startFilteringMulticastPackets()V
+HPLcom/android/server/wifi/WifiMulticastLockManager$FilterController;->stopFilteringMulticastPackets()V
+HPLcom/android/server/wifi/WifiNative$PnoEventHandler;->onPnoNetworkFound([Landroid/net/wifi/ScanResult;)V
+HPLcom/android/server/wifi/WifiNative$PnoEventHandler;->onPnoScanFailed()V
+HPLcom/android/server/wifi/WifiNative$RttEventHandler;->onRttResults([Landroid/net/wifi/RttManager$RttResult;)V
+HPLcom/android/server/wifi/WifiNative$VendorHalDeathEventHandler;->onDeath()V
+HPLcom/android/server/wifi/WifiNative$WifiLoggerEventHandler;->onRingBufferData(Lcom/android/server/wifi/WifiNative$RingBufferStatus;[B)V
+HPLcom/android/server/wifi/WifiNative$WifiLoggerEventHandler;->onWifiAlert(I[B)V
+HPLcom/android/server/wifi/WifiNative$WifiRssiEventHandler;->onRssiThresholdBreached(B)V
+HPLcom/android/server/wifi/WifiNetworkSelector;->filterScanResults(Ljava/util/List;Ljava/util/HashSet;ZLjava/lang/String;)Ljava/util/List;
+HPLcom/android/server/wifi/WifiServiceImpl;->getConnectionInfo()Landroid/net/wifi/WifiInfo;
+HPLcom/android/server/wifi/WifiStateMachine;->getWiFiInfoForUid(I)Landroid/net/wifi/WifiInfo;
+HPLcom/android/server/wifi/WifiStateMachine;->syncRequestConnectionInfo()Landroid/net/wifi/WifiInfo;
+HPLcom/android/server/wifi/WifiVendorHal$ChipEventCallback;->lambda$-com_android_server_wifi_WifiVendorHal$ChipEventCallback_95009(Landroid/hardware/wifi/V1_0/WifiDebugRingBufferStatus;Ljava/util/ArrayList;)V
+HPLcom/android/server/wifi/WifiVendorHal$ChipEventCallback;->onDebugRingBufferDataAvailable(Landroid/hardware/wifi/V1_0/WifiDebugRingBufferStatus;Ljava/util/ArrayList;)V
+HPLcom/android/server/wifi/WifiVendorHal;->frameworkFromHalLinkLayerStats(Landroid/hardware/wifi/V1_0/StaLinkLayerStats;)Landroid/net/wifi/WifiLinkLayerStats;
+HPLcom/android/server/wifi/WifiVendorHal;->frameworkRingBufferFlagsFromHal(I)I
+HPLcom/android/server/wifi/WifiVendorHal;->ringBufferStatus(Landroid/hardware/wifi/V1_0/WifiDebugRingBufferStatus;)Lcom/android/server/wifi/WifiNative$RingBufferStatus;
+HPLcom/android/server/wifi/WificondControl;->getScanResults()Ljava/util/ArrayList;
+HPLcom/android/server/wifi/hotspot2/NetworkDetail;-><init>(Ljava/lang/String;[Landroid/net/wifi/ScanResult$InformationElement;Ljava/util/List;I)V
+HPLcom/android/server/wifi/hotspot2/NetworkDetail;->getTrimmedSSID()Ljava/lang/String;
+HPLcom/android/server/wifi/hotspot2/PasspointConfigStoreData$DataSource;->getProviderIndex()J
+HPLcom/android/server/wifi/hotspot2/PasspointConfigStoreData$DataSource;->getProviders()Ljava/util/List;
+HPLcom/android/server/wifi/hotspot2/PasspointConfigStoreData$DataSource;->setProviderIndex(J)V
+HPLcom/android/server/wifi/hotspot2/PasspointConfigStoreData$DataSource;->setProviders(Ljava/util/List;)V
+HPLcom/android/server/wifi/hotspot2/PasspointEventHandler$Callbacks;->onANQPResponse(JLjava/util/Map;)V
+HPLcom/android/server/wifi/hotspot2/PasspointEventHandler$Callbacks;->onIconResponse(JLjava/lang/String;[B)V
+HPLcom/android/server/wifi/hotspot2/PasspointEventHandler$Callbacks;->onWnmFrameReceived(Lcom/android/server/wifi/hotspot2/WnmData;)V
+HPLcom/android/server/wifi/hotspot2/Utils;->fromHex(CZ)I
+HPLcom/android/server/wifi/hotspot2/Utils;->parseMac(Ljava/lang/String;)J
+HPLcom/android/server/wifi/scanner/ChannelHelper$ChannelCollection;->addBand(I)V
+HPLcom/android/server/wifi/scanner/ChannelHelper$ChannelCollection;->addChannel(I)V
+HPLcom/android/server/wifi/scanner/ChannelHelper$ChannelCollection;->clear()V
+HPLcom/android/server/wifi/scanner/ChannelHelper$ChannelCollection;->containsBand(I)Z
+HPLcom/android/server/wifi/scanner/ChannelHelper$ChannelCollection;->containsChannel(I)Z
+HPLcom/android/server/wifi/scanner/ChannelHelper$ChannelCollection;->fillBucketSettings(Lcom/android/server/wifi/WifiNative$BucketSettings;I)V
+HPLcom/android/server/wifi/scanner/ChannelHelper$ChannelCollection;->getChannelSet()Ljava/util/Set;
+HPLcom/android/server/wifi/scanner/ChannelHelper$ChannelCollection;->getContainingChannelsFromBand(I)Ljava/util/Set;
+HPLcom/android/server/wifi/scanner/ChannelHelper$ChannelCollection;->getMissingChannelsFromBand(I)Ljava/util/Set;
+HPLcom/android/server/wifi/scanner/ChannelHelper$ChannelCollection;->getScanFreqs()Ljava/util/Set;
+HPLcom/android/server/wifi/scanner/ChannelHelper$ChannelCollection;->isAllChannels()Z
+HPLcom/android/server/wifi/scanner/ChannelHelper$ChannelCollection;->isEmpty()Z
+HPLcom/android/server/wifi/scanner/ChannelHelper$ChannelCollection;->partiallyContainsBand(I)Z
+HPLcom/android/server/wifi/scanner/ChannelHelper;->createChannelCollection()Lcom/android/server/wifi/scanner/ChannelHelper$ChannelCollection;
+HPLcom/android/server/wifi/scanner/ChannelHelper;->estimateScanDuration(Landroid/net/wifi/WifiScanner$ScanSettings;)I
+HPLcom/android/server/wifi/scanner/ChannelHelper;->getAvailableScanChannels(I)[Landroid/net/wifi/WifiScanner$ChannelSpec;
+HPLcom/android/server/wifi/scanner/ChannelHelper;->settingsContainChannel(Landroid/net/wifi/WifiScanner$ScanSettings;I)Z
+HPLcom/android/server/wifi/scanner/KnownBandsChannelHelper;->settingsContainChannel(Landroid/net/wifi/WifiScanner$ScanSettings;I)Z
+HPLcom/android/server/wifi/scanner/WifiScannerImpl$2;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+HPLcom/android/server/wifi/scanner/WifiScannerImpl$WifiScannerImplFactory;->create(Landroid/content/Context;Landroid/os/Looper;Lcom/android/server/wifi/Clock;)Lcom/android/server/wifi/scanner/WifiScannerImpl;
+HPLcom/android/server/wifi/scanner/WifiScanningServiceImpl$ClientInfo;->reportEvent(IIILjava/lang/Object;)V
+HPLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine;->reportFullScanResult(Landroid/net/wifi/ScanResult;I)V
+HPLcom/android/server/wifi/scanner/WificondScannerImpl$HwPnoDebouncer$Listener;->onPnoScanFailed()V
+HPLcom/android/server/wifi/scanner/WificondScannerImpl;->pollLatestScanData()V
+HPLcom/android/server/wifi/util/BitMask;->testAndClear(I)Z
+HPLcom/android/server/wifi/util/ByteArrayRingBuffer;->appendBuffer([B)Z
+HPLcom/android/server/wifi/util/ByteArrayRingBuffer;->pruneToSize(I)V
+HPLcom/android/server/wifi/util/InformationElementUtil$BssLoad;-><init>()V
+HPLcom/android/server/wifi/util/InformationElementUtil$BssLoad;->from(Landroid/net/wifi/ScanResult$InformationElement;)V
+HPLcom/android/server/wifi/util/InformationElementUtil$Capabilities;->from([Landroid/net/wifi/ScanResult$InformationElement;Ljava/util/BitSet;)V
+HPLcom/android/server/wifi/util/InformationElementUtil$Capabilities;->generateCapabilitiesString()Ljava/lang/String;
+HPLcom/android/server/wifi/util/InformationElementUtil$Capabilities;->isWpaOneElement(Landroid/net/wifi/ScanResult$InformationElement;)Z
+HPLcom/android/server/wifi/util/InformationElementUtil$Capabilities;->isWpsElement(Landroid/net/wifi/ScanResult$InformationElement;)Z
+HPLcom/android/server/wifi/util/InformationElementUtil$Capabilities;->parseRsnElement(Landroid/net/wifi/ScanResult$InformationElement;)V
+HPLcom/android/server/wifi/util/InformationElementUtil$ExtendedCapabilities;-><init>()V
+HPLcom/android/server/wifi/util/InformationElementUtil$ExtendedCapabilities;->from(Landroid/net/wifi/ScanResult$InformationElement;)V
+HPLcom/android/server/wifi/util/InformationElementUtil$HtOperation;-><init>()V
+HPLcom/android/server/wifi/util/InformationElementUtil$Interworking;-><init>()V
+HPLcom/android/server/wifi/util/InformationElementUtil$RoamingConsortium;-><init>()V
+HPLcom/android/server/wifi/util/InformationElementUtil$SupportedRates;-><init>()V
+HPLcom/android/server/wifi/util/InformationElementUtil$SupportedRates;->from(Landroid/net/wifi/ScanResult$InformationElement;)V
+HPLcom/android/server/wifi/util/InformationElementUtil$SupportedRates;->getRateFromByte(I)I
+HPLcom/android/server/wifi/util/InformationElementUtil$SupportedRates;->isValid()Z
+HPLcom/android/server/wifi/util/InformationElementUtil$TrafficIndicationMap;-><init>()V
+HPLcom/android/server/wifi/util/InformationElementUtil$TrafficIndicationMap;->from(Landroid/net/wifi/ScanResult$InformationElement;)V
+HPLcom/android/server/wifi/util/InformationElementUtil$VhtOperation;-><init>()V
+HPLcom/android/server/wifi/util/InformationElementUtil$VhtOperation;->isValid()Z
+HPLcom/android/server/wifi/util/InformationElementUtil$Vsa;-><init>()V
+HPLcom/android/server/wifi/util/InformationElementUtil$Vsa;->from(Landroid/net/wifi/ScanResult$InformationElement;)V
+HPLcom/android/server/wifi/util/InformationElementUtil;->parseInformationElements([B)[Landroid/net/wifi/ScanResult$InformationElement;
+HPLcom/android/server/wifi/util/NativeUtil;->byteArrayFromArrayList(Ljava/util/ArrayList;)[B
+HPLcom/android/server/wifi/util/NativeUtil;->byteArrayToArrayList([B)Ljava/util/ArrayList;
+HPLcom/android/server/wifi/util/NativeUtil;->macAddressFromByteArray([B)Ljava/lang/String;
+HPLcom/android/server/wifi/util/WifiAsyncChannel;->sendMessage(Landroid/os/Message;)V
+HPLcom/android/server/wifi/wificond/NativeScanResult$1;->createFromParcel(Landroid/os/Parcel;)Lcom/android/server/wifi/wificond/NativeScanResult;
+HPLcom/android/server/wm/-$Lambda$YIZfR4m-B8z_tYbP2x4OJ3o7OYE;->$m$17(Ljava/lang/Object;)V
+HPLcom/android/server/wm/-$Lambda$YIZfR4m-B8z_tYbP2x4OJ3o7OYE;->$m$3(Ljava/lang/Object;)V
+HPLcom/android/server/wm/-$Lambda$YIZfR4m-B8z_tYbP2x4OJ3o7OYE;->$m$4(Ljava/lang/Object;)V
+HPLcom/android/server/wm/-$Lambda$YIZfR4m-B8z_tYbP2x4OJ3o7OYE;->$m$6(Ljava/lang/Object;)V
+HPLcom/android/server/wm/-$Lambda$YIZfR4m-B8z_tYbP2x4OJ3o7OYE;->$m$7(Ljava/lang/Object;)V
+HPLcom/android/server/wm/-$Lambda$YIZfR4m-B8z_tYbP2x4OJ3o7OYE;->$m$8(Ljava/lang/Object;)V
+HPLcom/android/server/wm/-$Lambda$YIZfR4m-B8z_tYbP2x4OJ3o7OYE;->$m$9(Ljava/lang/Object;)V
+HPLcom/android/server/wm/-$Lambda$YIZfR4m-B8z_tYbP2x4OJ3o7OYE;->accept(Ljava/lang/Object;)V
+HPLcom/android/server/wm/-$Lambda$hCYoJeHmvymNpgtwuNPQ6z-HGjQ;->$m$0(Ljava/lang/Object;)V
+HPLcom/android/server/wm/-$Lambda$hCYoJeHmvymNpgtwuNPQ6z-HGjQ;->accept(Ljava/lang/Object;)V
+HPLcom/android/server/wm/-$Lambda$lpBUCbECLvWBIi8CcvaEY5AB7jM;->apply(Ljava/lang/Object;)Z
+HPLcom/android/server/wm/AppTransition;->isTransitionSet()Z
+HPLcom/android/server/wm/AppWindowAnimator;->getStackClip()I
+HPLcom/android/server/wm/AppWindowAnimator;->isAnimating()Z
+HPLcom/android/server/wm/AppWindowAnimator;->stepAnimationLocked(J)Z
+HPLcom/android/server/wm/AppWindowToken;->checkAppWindowsReadyToShow()V
+HPLcom/android/server/wm/AppWindowToken;->containsDismissKeyguardWindow()Z
+HPLcom/android/server/wm/AppWindowToken;->containsShowWhenLockedWindow()Z
+HPLcom/android/server/wm/AppWindowToken;->forAllWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z
+HPLcom/android/server/wm/AppWindowToken;->forAllWindowsUnchecked(Lcom/android/internal/util/ToBooleanFunction;Z)Z
+HPLcom/android/server/wm/AppWindowToken;->getTask()Lcom/android/server/wm/Task;
+HPLcom/android/server/wm/AppWindowToken;->stepAppWindowsAnimation(J)V
+HPLcom/android/server/wm/AppWindowToken;->updateDrawnWindowStates(Lcom/android/server/wm/WindowState;)Z
+HPLcom/android/server/wm/AppWindowToken;->windowsAreFocusable()Z
+HPLcom/android/server/wm/BoundsAnimationTarget;->onAnimationEnd(ZLandroid/graphics/Rect;Z)V
+HPLcom/android/server/wm/BoundsAnimationTarget;->onAnimationStart(Z)V
+HPLcom/android/server/wm/BoundsAnimationTarget;->setPinnedStackSize(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z
+HPLcom/android/server/wm/DimLayer;->hide()V
+HPLcom/android/server/wm/DimLayer;->isDimming()Z
+HPLcom/android/server/wm/DimLayerController;->animateDimLayers()Z
+HPLcom/android/server/wm/DimLayerController;->animateDimLayers(Lcom/android/server/wm/DimLayer$DimLayerUser;)Z
+HPLcom/android/server/wm/DimLayerController;->isDimming(Lcom/android/server/wm/DimLayer$DimLayerUser;Lcom/android/server/wm/WindowStateAnimator;)Z
+HPLcom/android/server/wm/DimLayerController;->resetDimming()V
+HPLcom/android/server/wm/DimLayerController;->stopDimmingIfNeeded()V
+HPLcom/android/server/wm/DimLayerController;->stopDimmingIfNeeded(Lcom/android/server/wm/DimLayer$DimLayerUser;)V
+HPLcom/android/server/wm/DisplayContent$DisplayChildWindowContainer;->get(I)Lcom/android/server/wm/WindowContainer;
+HPLcom/android/server/wm/DisplayContent$DisplayChildWindowContainer;->size()I
+HPLcom/android/server/wm/DisplayContent$Screenshoter;->screenshot(Landroid/graphics/Rect;IIIIZI)Ljava/lang/Object;
+HPLcom/android/server/wm/DisplayContent$TaskStackContainers;->forAllExitingAppTokenWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z
+HPLcom/android/server/wm/DisplayContent$TaskStackContainers;->forAllWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z
+HPLcom/android/server/wm/DisplayContent$TaskStackContainers;->removeExistingAppTokensIfPossible()V
+HPLcom/android/server/wm/DisplayContent$TaskStackContainers;->setExitingTokensHasVisible(Z)V
+HPLcom/android/server/wm/DisplayContent;->adjustForImeIfNeeded()V
+HPLcom/android/server/wm/DisplayContent;->applySurfaceChangesTransaction(Z)Z
+HPLcom/android/server/wm/DisplayContent;->forAllWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z
+HPLcom/android/server/wm/DisplayContent;->getAppWindowToken(Landroid/os/IBinder;)Lcom/android/server/wm/AppWindowToken;
+HPLcom/android/server/wm/DisplayContent;->getDisplayId()I
+HPLcom/android/server/wm/DisplayContent;->getDisplayInfo()Landroid/view/DisplayInfo;
+HPLcom/android/server/wm/DisplayContent;->getDockedStackLocked()Lcom/android/server/wm/TaskStack;
+HPLcom/android/server/wm/DisplayContent;->getHomeStack()Lcom/android/server/wm/TaskStack;
+HPLcom/android/server/wm/DisplayContent;->getLogicalDisplayRect(Landroid/graphics/Rect;)V
+HPLcom/android/server/wm/DisplayContent;->getStackById(I)Lcom/android/server/wm/TaskStack;
+HPLcom/android/server/wm/DisplayContent;->isStackVisible(I)Z
+HPLcom/android/server/wm/DisplayContent;->lambda$-com_android_server_wm_DisplayContent_16024(Lcom/android/server/wm/WindowState;)V
+HPLcom/android/server/wm/DisplayContent;->lambda$-com_android_server_wm_DisplayContent_18337(Lcom/android/server/wm/WindowState;)V
+HPLcom/android/server/wm/DisplayContent;->lambda$-com_android_server_wm_DisplayContent_22837(Lcom/android/server/wm/WindowState;)V
+HPLcom/android/server/wm/DisplayContent;->lambda$-com_android_server_wm_DisplayContent_22943(Lcom/android/server/wm/WindowState;)V
+HPLcom/android/server/wm/DisplayContent;->lambda$-com_android_server_wm_DisplayContent_26486(Lcom/android/server/wm/WindowState;)V
+HPLcom/android/server/wm/DisplayContent;->lambda$-com_android_server_wm_DisplayContent_28510(Lcom/android/server/wm/WindowState;)V
+HPLcom/android/server/wm/DisplayContent;->lambda$-com_android_server_wm_DisplayContent_28715(Lcom/android/server/wm/WindowState;)V
+HPLcom/android/server/wm/DisplayContent;->performLayout(ZZ)V
+HPLcom/android/server/wm/DisplayContent;->resetAnimationBackgroundAnimator()V
+HPLcom/android/server/wm/DisplayContent;->setTouchExcludeRegion(Lcom/android/server/wm/Task;)V
+HPLcom/android/server/wm/DockedStackDividerController;->isResizing()Z
+HPLcom/android/server/wm/DockedStackDividerController;->setResizeDimLayer(ZIF)V
+HPLcom/android/server/wm/InputMonitor$UpdateInputForAllWindowsConsumer;->accept(Lcom/android/server/wm/WindowState;)V
+HPLcom/android/server/wm/InputMonitor$UpdateInputForAllWindowsConsumer;->accept(Ljava/lang/Object;)V
+HPLcom/android/server/wm/InputMonitor$UpdateInputForAllWindowsConsumer;->updateInputWindows(Z)V
+HPLcom/android/server/wm/InputMonitor;->-get0(Lcom/android/server/wm/InputMonitor;)Z
+HPLcom/android/server/wm/InputMonitor;->-get2(Lcom/android/server/wm/InputMonitor;)Z
+HPLcom/android/server/wm/InputMonitor;->-get5(Lcom/android/server/wm/InputMonitor;)Lcom/android/server/wm/WindowState;
+HPLcom/android/server/wm/InputMonitor;->addInputWindowHandle(Lcom/android/server/input/InputWindowHandle;)V
+HPLcom/android/server/wm/InputMonitor;->addInputWindowHandle(Lcom/android/server/input/InputWindowHandle;Lcom/android/server/wm/WindowState;IIZZZ)V
+HPLcom/android/server/wm/InputMonitor;->clearInputWindowHandlesLw()V
+HPLcom/android/server/wm/InputMonitor;->getInputConsumer(Ljava/lang/String;I)Lcom/android/server/wm/InputConsumerImpl;
+HPLcom/android/server/wm/PointerEventDispatcher;->onInputEvent(Landroid/view/InputEvent;)V
+HPLcom/android/server/wm/RootWindowContainer;->getAppWindowToken(Landroid/os/IBinder;)Lcom/android/server/wm/AppWindowToken;
+HPLcom/android/server/wm/RootWindowContainer;->getDisplayContent(I)Lcom/android/server/wm/DisplayContent;
+HPLcom/android/server/wm/RootWindowContainer;->getDisplayContentOrCreate(I)Lcom/android/server/wm/DisplayContent;
+HPLcom/android/server/wm/RootWindowContainer;->getStackById(I)Lcom/android/server/wm/TaskStack;
+HPLcom/android/server/wm/RootWindowContainer;->handleNotObscuredLocked(Lcom/android/server/wm/WindowState;ZZ)Z
+HPLcom/android/server/wm/RootWindowContainer;->hasPendingLayoutChanges(Lcom/android/server/wm/WindowAnimator;)Z
+HPLcom/android/server/wm/RootWindowContainer;->isLayoutNeeded()Z
+HPLcom/android/server/wm/RootWindowContainer;->performSurfacePlacement(Z)V
+HPLcom/android/server/wm/StackWindowListener;->requestResize(Landroid/graphics/Rect;)V
+HPLcom/android/server/wm/Task;->cropWindowsToStackBounds()Z
+HPLcom/android/server/wm/Task;->dimFullscreen()Z
+HPLcom/android/server/wm/Task;->getDimBounds(Landroid/graphics/Rect;)V
+HPLcom/android/server/wm/Task;->getDisplayContent()Lcom/android/server/wm/DisplayContent;
+HPLcom/android/server/wm/Task;->getTopVisibleAppToken()Lcom/android/server/wm/AppWindowToken;
+HPLcom/android/server/wm/Task;->inFreeformWorkspace()Z
+HPLcom/android/server/wm/Task;->inPinnedWorkspace()Z
+HPLcom/android/server/wm/Task;->isAttachedToDisplay()Z
+HPLcom/android/server/wm/Task;->isFullscreen()Z
+HPLcom/android/server/wm/Task;->isResizeable()Z
+HPLcom/android/server/wm/Task;->useCurrentBounds()Z
+HPLcom/android/server/wm/TaskSnapshotPersister$DirectoryResolver;->getSystemDirectoryForUser(I)Ljava/io/File;
+HPLcom/android/server/wm/TaskStack;->dimFullscreen()Z
+HPLcom/android/server/wm/TaskStack;->fillsParent()Z
+HPLcom/android/server/wm/TaskStack;->getBounds(Landroid/graphics/Rect;)V
+HPLcom/android/server/wm/TaskStack;->getDimBounds(Landroid/graphics/Rect;)V
+HPLcom/android/server/wm/TaskStack;->getDisplayContent()Lcom/android/server/wm/DisplayContent;
+HPLcom/android/server/wm/TaskStack;->isAdjustedForMinimizedDockedStack()Z
+HPLcom/android/server/wm/TaskStack;->resetAnimationBackgroundAnimator()V
+HPLcom/android/server/wm/TaskStack;->setTouchExcludeRegion(Lcom/android/server/wm/Task;ILandroid/graphics/Region;Landroid/graphics/Rect;Landroid/graphics/Rect;)V
+HPLcom/android/server/wm/TaskStack;->shouldIgnoreInput()Z
+HPLcom/android/server/wm/TaskStack;->stepAppWindowsAnimation(J)V
+HPLcom/android/server/wm/TaskStack;->updateAdjustedBounds()V
+HPLcom/android/server/wm/TaskStack;->useCurrentBounds()Z
+HPLcom/android/server/wm/WallpaperController;->getWallpaperTarget()Lcom/android/server/wm/WindowState;
+HPLcom/android/server/wm/WallpaperController;->isWallpaperTarget(Lcom/android/server/wm/WindowState;)Z
+HPLcom/android/server/wm/WindowAnimator;->animate(J)V
+HPLcom/android/server/wm/WindowAnimator;->getDisplayContentsAnimatorLocked(I)Lcom/android/server/wm/WindowAnimator$DisplayContentsAnimator;
+HPLcom/android/server/wm/WindowAnimator;->getScreenRotationAnimationLocked(I)Lcom/android/server/wm/ScreenRotationAnimation;
+HPLcom/android/server/wm/WindowAnimator;->lambda$-com_android_server_wm_WindowAnimator_4018(J)V
+HPLcom/android/server/wm/WindowAnimator;->orAnimating(Z)V
+HPLcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;->apply(Lcom/android/server/wm/WindowState;)Z
+HPLcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;->apply(Ljava/lang/Object;)Z
+HPLcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;->release()V
+HPLcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;->setConsumer(Ljava/util/function/Consumer;)V
+HPLcom/android/server/wm/WindowContainer;->-get0(Lcom/android/server/wm/WindowContainer;)Landroid/util/Pools$SynchronizedPool;
+HPLcom/android/server/wm/WindowContainer;->checkAppWindowsReadyToShow()V
+HPLcom/android/server/wm/WindowContainer;->checkCompleteDeferredRemoval()Z
+HPLcom/android/server/wm/WindowContainer;->forAllWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z
+HPLcom/android/server/wm/WindowContainer;->forAllWindows(Ljava/util/function/Consumer;Z)V
+HPLcom/android/server/wm/WindowContainer;->getConfiguration()Landroid/content/res/Configuration;
+HPLcom/android/server/wm/WindowContainer;->getOrientation(I)I
+HPLcom/android/server/wm/WindowContainer;->getParent()Lcom/android/server/wm/WindowContainer;
+HPLcom/android/server/wm/WindowContainer;->getWindow(Ljava/util/function/Predicate;)Lcom/android/server/wm/WindowState;
+HPLcom/android/server/wm/WindowContainer;->isAnimating()Z
+HPLcom/android/server/wm/WindowContainer;->obtainConsumerWrapper(Ljava/util/function/Consumer;)Lcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;
+HPLcom/android/server/wm/WindowContainer;->stepAppWindowsAnimation(J)V
+HPLcom/android/server/wm/WindowLayersController;->assignAnimLayer(Lcom/android/server/wm/WindowState;I)V
+HPLcom/android/server/wm/WindowLayersController;->collectSpecialWindows(Lcom/android/server/wm/WindowState;)V
+HPLcom/android/server/wm/WindowLayersController;->lambda$-com_android_server_wm_WindowLayersController_3457(Lcom/android/server/wm/WindowState;)V
+HPLcom/android/server/wm/WindowManagerService$AppFreezeListener;->onAppFreezeTimeout()V
+HPLcom/android/server/wm/WindowManagerService$LocalService;->isStackVisible(I)Z
+HPLcom/android/server/wm/WindowManagerService;->boostPriorityForLockedSection()V
+HPLcom/android/server/wm/WindowManagerService;->closeSurfaceTransaction()V
+HPLcom/android/server/wm/WindowManagerService;->closeSurfaceTransaction(Z)V
+HPLcom/android/server/wm/WindowManagerService;->getDefaultDisplayContentLocked()Lcom/android/server/wm/DisplayContent;
+HPLcom/android/server/wm/WindowManagerService;->getImeFocusStackLocked()Lcom/android/server/wm/TaskStack;
+HPLcom/android/server/wm/WindowManagerService;->getStackBounds(ILandroid/graphics/Rect;)V
+HPLcom/android/server/wm/WindowManagerService;->markForSeamlessRotation(Lcom/android/server/wm/WindowState;Z)V
+HPLcom/android/server/wm/WindowManagerService;->okToDisplay()Z
+HPLcom/android/server/wm/WindowManagerService;->openSurfaceTransaction()V
+HPLcom/android/server/wm/WindowManagerService;->relayoutWindow(Lcom/android/server/wm/Session;Landroid/view/IWindow;ILandroid/view/WindowManager$LayoutParams;IIIILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/util/MergedConfiguration;Landroid/view/Surface;)I
+HPLcom/android/server/wm/WindowManagerService;->resetPriorityAfterLockedSection()V
+HPLcom/android/server/wm/WindowManagerService;->setResizeDimLayer(ZIF)V
+HPLcom/android/server/wm/WindowManagerService;->updateOrientationFromAppTokensLocked(ZI)Z
+HPLcom/android/server/wm/WindowManagerThreadPriorityBooster;->boost()V
+HPLcom/android/server/wm/WindowManagerThreadPriorityBooster;->reset()V
+HPLcom/android/server/wm/WindowState;->applyDimLayerIfNeeded()V
+HPLcom/android/server/wm/WindowState;->applyGravityAndUpdateFrame(Landroid/graphics/Rect;Landroid/graphics/Rect;)V
+HPLcom/android/server/wm/WindowState;->applyInOrderWithImeWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z
+HPLcom/android/server/wm/WindowState;->calculatePolicyCrop(Landroid/graphics/Rect;)V
+HPLcom/android/server/wm/WindowState;->calculateSystemDecorRect(Landroid/graphics/Rect;)V
+HPLcom/android/server/wm/WindowState;->canAddInternalSystemWindow()Z
+HPLcom/android/server/wm/WindowState;->canAffectSystemUiFlags()Z
+HPLcom/android/server/wm/WindowState;->canReceiveKeys()Z
+HPLcom/android/server/wm/WindowState;->canReceiveTouchInput()Z
+HPLcom/android/server/wm/WindowState;->computeDragResizing()Z
+HPLcom/android/server/wm/WindowState;->computeFrameLw(Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;)V
+HPLcom/android/server/wm/WindowState;->cropRegionToStackBoundsIfNeeded(Landroid/graphics/Region;)V
+HPLcom/android/server/wm/WindowState;->expandForSurfaceInsets(Landroid/graphics/Rect;)V
+HPLcom/android/server/wm/WindowState;->fillsDisplay()Z
+HPLcom/android/server/wm/WindowState;->forAllWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z
+HPLcom/android/server/wm/WindowState;->getAnimLayerAdjustment()I
+HPLcom/android/server/wm/WindowState;->getAppToken()Landroid/view/IApplicationToken;
+HPLcom/android/server/wm/WindowState;->getAttrs()Landroid/view/WindowManager$LayoutParams;
+HPLcom/android/server/wm/WindowState;->getBaseType()I
+HPLcom/android/server/wm/WindowState;->getConfiguration()Landroid/content/res/Configuration;
+HPLcom/android/server/wm/WindowState;->getDimLayerUser()Lcom/android/server/wm/DimLayer$DimLayerUser;
+HPLcom/android/server/wm/WindowState;->getDisplayContent()Lcom/android/server/wm/DisplayContent;
+HPLcom/android/server/wm/WindowState;->getDisplayId()I
+HPLcom/android/server/wm/WindowState;->getDisplayInfo()Landroid/view/DisplayInfo;
+HPLcom/android/server/wm/WindowState;->getInputDispatchingTimeoutNanos()J
+HPLcom/android/server/wm/WindowState;->getParentWindow()Lcom/android/server/wm/WindowState;
+HPLcom/android/server/wm/WindowState;->getSpecialWindowAnimLayerAdjustment()I
+HPLcom/android/server/wm/WindowState;->getStack()Lcom/android/server/wm/TaskStack;
+HPLcom/android/server/wm/WindowState;->getStackId()I
+HPLcom/android/server/wm/WindowState;->getTask()Lcom/android/server/wm/Task;
+HPLcom/android/server/wm/WindowState;->getTopParentWindow()Lcom/android/server/wm/WindowState;
+HPLcom/android/server/wm/WindowState;->getTouchableRegion(Landroid/graphics/Region;)V
+HPLcom/android/server/wm/WindowState;->getTouchableRegion(Landroid/graphics/Region;I)I
+HPLcom/android/server/wm/WindowState;->getWindow(Ljava/util/function/Predicate;)Lcom/android/server/wm/WindowState;
+HPLcom/android/server/wm/WindowState;->getWindowTag()Ljava/lang/CharSequence;
+HPLcom/android/server/wm/WindowState;->handleWindowMovedIfNeeded()V
+HPLcom/android/server/wm/WindowState;->hasMoved()Z
+HPLcom/android/server/wm/WindowState;->hasSavedSurface()Z
+HPLcom/android/server/wm/WindowState;->inFreeformWorkspace()Z
+HPLcom/android/server/wm/WindowState;->inFullscreenContainer()Z
+HPLcom/android/server/wm/WindowState;->inPinnedWorkspace()Z
+HPLcom/android/server/wm/WindowState;->isAnimating()Z
+HPLcom/android/server/wm/WindowState;->isAnimatingLw()Z
+HPLcom/android/server/wm/WindowState;->isChildWindow()Z
+HPLcom/android/server/wm/WindowState;->isConfigChanged()Z
+HPLcom/android/server/wm/WindowState;->isDefaultDisplay()Z
+HPLcom/android/server/wm/WindowState;->isDimming()Z
+HPLcom/android/server/wm/WindowState;->isDisplayedLw()Z
+HPLcom/android/server/wm/WindowState;->isDockedResizing()Z
+HPLcom/android/server/wm/WindowState;->isDragResizeChanged()Z
+HPLcom/android/server/wm/WindowState;->isDragResizing()Z
+HPLcom/android/server/wm/WindowState;->isDrawnLw()Z
+HPLcom/android/server/wm/WindowState;->isGoneForLayoutLw()Z
+HPLcom/android/server/wm/WindowState;->isHiddenFromUserLocked()Z
+HPLcom/android/server/wm/WindowState;->isInMultiWindowMode()Z
+HPLcom/android/server/wm/WindowState;->isObscuringDisplay()Z
+HPLcom/android/server/wm/WindowState;->isOnScreen()Z
+HPLcom/android/server/wm/WindowState;->isOpaqueDrawn()Z
+HPLcom/android/server/wm/WindowState;->isParentWindowHidden()Z
+HPLcom/android/server/wm/WindowState;->isResizedWhileNotDragResizing()Z
+HPLcom/android/server/wm/WindowState;->isVisible()Z
+HPLcom/android/server/wm/WindowState;->isVisibleLw()Z
+HPLcom/android/server/wm/WindowState;->isVisibleOrAdding()Z
+HPLcom/android/server/wm/WindowState;->setReportResizeHints()Z
+HPLcom/android/server/wm/WindowState;->showLw(Z)Z
+HPLcom/android/server/wm/WindowState;->showLw(ZZ)Z
+HPLcom/android/server/wm/WindowState;->toString()Ljava/lang/String;
+HPLcom/android/server/wm/WindowState;->transformClipRectFromScreenToSurfaceSpace(Landroid/graphics/Rect;)V
+HPLcom/android/server/wm/WindowState;->updateResizingWindowIfNeeded()V
+HPLcom/android/server/wm/WindowState;->wouldBeVisibleIfPolicyIgnored()Z
+HPLcom/android/server/wm/WindowStateAnimator;->adjustCropToStackBounds(Landroid/graphics/Rect;Z)V
+HPLcom/android/server/wm/WindowStateAnimator;->applyCrop(Landroid/graphics/Rect;Landroid/graphics/Rect;Z)V
+HPLcom/android/server/wm/WindowStateAnimator;->calculateCrop(Landroid/graphics/Rect;)Z
+HPLcom/android/server/wm/WindowStateAnimator;->calculateFinalCrop(Landroid/graphics/Rect;)Z
+HPLcom/android/server/wm/WindowStateAnimator;->calculateSurfaceBounds(Lcom/android/server/wm/WindowState;Landroid/view/WindowManager$LayoutParams;)V
+HPLcom/android/server/wm/WindowStateAnimator;->computeShownFrameLocked()V
+HPLcom/android/server/wm/WindowStateAnimator;->getMagnificationSpec()Landroid/view/MagnificationSpec;
+HPLcom/android/server/wm/WindowStateAnimator;->getShown()Z
+HPLcom/android/server/wm/WindowStateAnimator;->hasSurface()Z
+HPLcom/android/server/wm/WindowStateAnimator;->isAnimationSet()Z
+HPLcom/android/server/wm/WindowStateAnimator;->isAnimationStarting()Z
+HPLcom/android/server/wm/WindowStateAnimator;->isForceScaled()Z
+HPLcom/android/server/wm/WindowStateAnimator;->isWaitingForOpening()Z
+HPLcom/android/server/wm/WindowStateAnimator;->prepareSurfaceLocked(Z)V
+HPLcom/android/server/wm/WindowStateAnimator;->resolveStackClip()I
+HPLcom/android/server/wm/WindowStateAnimator;->setSurfaceBoundariesLocked(Z)V
+HPLcom/android/server/wm/WindowStateAnimator;->shouldCropToStackBounds()Z
+HPLcom/android/server/wm/WindowStateAnimator;->stepAnimationLocked(J)Z
+HPLcom/android/server/wm/WindowStateAnimator;->useFinalClipRect()Z
+HPLcom/android/server/wm/WindowSurfaceController;->clearCropInTransaction(Z)V
+HPLcom/android/server/wm/WindowSurfaceController;->getHeight()F
+HPLcom/android/server/wm/WindowSurfaceController;->getWidth()F
+HPLcom/android/server/wm/WindowSurfaceController;->hasSurface()Z
+HPLcom/android/server/wm/WindowSurfaceController;->setMatrixInTransaction(FFFFZ)V
+HPLcom/android/server/wm/WindowSurfaceController;->setPositionInTransaction(FFZ)V
+HPLcom/android/server/wm/WindowSurfacePlacer;->destroyPendingSurfaces()V
+HPLcom/android/server/wm/WindowSurfacePlacer;->performSurfacePlacementLoop()V
+HPLcom/android/server/wm/WindowToken;->getDisplayContent()Lcom/android/server/wm/DisplayContent;
+HSLcom/android/server/location/LocationProviderInterface;->disable()V
+HSLcom/android/server/location/LocationProviderInterface;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
+HSLcom/android/server/location/LocationProviderInterface;->enable()V
+HSLcom/android/server/location/LocationProviderInterface;->getName()Ljava/lang/String;
+HSLcom/android/server/location/LocationProviderInterface;->getProperties()Lcom/android/internal/location/ProviderProperties;
+HSLcom/android/server/location/LocationProviderInterface;->getStatus(Landroid/os/Bundle;)I
+HSLcom/android/server/location/LocationProviderInterface;->getStatusUpdateTime()J
+HSLcom/android/server/location/LocationProviderInterface;->isEnabled()Z
+HSLcom/android/server/location/LocationProviderInterface;->sendExtraCommand(Ljava/lang/String;Landroid/os/Bundle;)Z
+HSLcom/android/server/location/LocationProviderInterface;->setRequest(Lcom/android/internal/location/ProviderRequest;Landroid/os/WorkSource;)V
+HSPLcom/android/server/-$Lambda$6PBiitFNzy52xbrUpcD5i5xBLLY;->$m$1()V
+HSPLcom/android/server/-$Lambda$6PBiitFNzy52xbrUpcD5i5xBLLY;-><init>(BLjava/lang/Object;Ljava/lang/Object;)V
+HSPLcom/android/server/-$Lambda$6PBiitFNzy52xbrUpcD5i5xBLLY;->run()V
+HSPLcom/android/server/-$Lambda$T7cKu_OKm_Fk2kBNthmo_uUJTSo;->$m$0()V
+HSPLcom/android/server/-$Lambda$T7cKu_OKm_Fk2kBNthmo_uUJTSo;-><init>(B)V
+HSPLcom/android/server/-$Lambda$T7cKu_OKm_Fk2kBNthmo_uUJTSo;->run()V
+HSPLcom/android/server/AppOpsService$1;-><init>(Lcom/android/server/AppOpsService;)V
+HSPLcom/android/server/AppOpsService$Callback;-><init>(Lcom/android/server/AppOpsService;Lcom/android/internal/app/IAppOpsCallback;)V
+HSPLcom/android/server/AppOpsService$Op;-><init>(ILjava/lang/String;I)V
+HSPLcom/android/server/AppOpsService$Ops;-><init>(Ljava/lang/String;Lcom/android/server/AppOpsService$UidState;Z)V
+HSPLcom/android/server/AppOpsService$UidState;-><init>(I)V
+HSPLcom/android/server/AppOpsService;-><init>(Ljava/io/File;Landroid/os/Handler;)V
+HSPLcom/android/server/AppOpsService;->getUidStateLocked(IZ)Lcom/android/server/AppOpsService$UidState;
+HSPLcom/android/server/AppOpsService;->publish(Landroid/content/Context;)V
+HSPLcom/android/server/AppOpsService;->readPackage(Lorg/xmlpull/v1/XmlPullParser;)V
+HSPLcom/android/server/AppOpsService;->readState()V
+HSPLcom/android/server/AppOpsService;->readUid(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)V
+HSPLcom/android/server/AppOpsService;->readUidOps(Lorg/xmlpull/v1/XmlPullParser;)V
+HSPLcom/android/server/AppOpsService;->startWatchingMode(ILjava/lang/String;Lcom/android/internal/app/IAppOpsCallback;)V
+HSPLcom/android/server/DisplayThread;-><init>()V
+HSPLcom/android/server/DisplayThread;->ensureThreadLocked()V
+HSPLcom/android/server/DisplayThread;->get()Lcom/android/server/DisplayThread;
+HSPLcom/android/server/DisplayThread;->getHandler()Landroid/os/Handler;
+HSPLcom/android/server/FgThread;-><init>()V
+HSPLcom/android/server/FgThread;->ensureThreadLocked()V
+HSPLcom/android/server/FgThread;->get()Lcom/android/server/FgThread;
+HSPLcom/android/server/FgThread;->getHandler()Landroid/os/Handler;
+HSPLcom/android/server/IntentResolver$1;-><init>()V
+HSPLcom/android/server/IntentResolver;-><init>()V
+HSPLcom/android/server/IntentResolver;->filterSet()Ljava/util/Set;
+HSPLcom/android/server/IoThread;-><init>()V
+HSPLcom/android/server/IoThread;->ensureThreadLocked()V
+HSPLcom/android/server/IoThread;->getHandler()Landroid/os/Handler;
+HSPLcom/android/server/LockGuard;->installLock(Ljava/lang/Object;I)Ljava/lang/Object;
+HSPLcom/android/server/LockGuard;->installNewLock(I)Ljava/lang/Object;
+HSPLcom/android/server/RecoverySystemService$BinderService;-><init>(Lcom/android/server/RecoverySystemService;)V
+HSPLcom/android/server/RecoverySystemService$BinderService;-><init>(Lcom/android/server/RecoverySystemService;Lcom/android/server/RecoverySystemService$BinderService;)V
+HSPLcom/android/server/RecoverySystemService;-><init>(Landroid/content/Context;)V
+HSPLcom/android/server/RecoverySystemService;->onStart()V
+HSPLcom/android/server/RescueParty$BootThreshold;-><init>()V
+HSPLcom/android/server/RescueParty$Threshold;-><init>(IIJ)V
+HSPLcom/android/server/RescueParty$Threshold;->getCount()I
+HSPLcom/android/server/RescueParty$Threshold;->getStart()J
+HSPLcom/android/server/RescueParty$Threshold;->setCount(I)V
+HSPLcom/android/server/RescueParty$Threshold;->setStart(J)V
+HSPLcom/android/server/RescueParty;->isDisabled()Z
+HSPLcom/android/server/RescueParty;->isUsbActive()Z
+HSPLcom/android/server/RescueParty;->noteBoot(Landroid/content/Context;)V
+HSPLcom/android/server/ServiceThread;-><init>(Ljava/lang/String;IZ)V
+HSPLcom/android/server/ServiceThread;->run()V
+HSPLcom/android/server/SystemServer;->-com_android_server_SystemServer-mthref-0()V
+HSPLcom/android/server/SystemServer;-><init>()V
+HSPLcom/android/server/SystemServer;->createSystemContext()V
+HSPLcom/android/server/SystemServer;->main([Ljava/lang/String;)V
+HSPLcom/android/server/SystemServer;->performPendingShutdown()V
+HSPLcom/android/server/SystemServer;->run()V
+HSPLcom/android/server/SystemServer;->startBootstrapServices()V
+HSPLcom/android/server/SystemServer;->traceBeginAndSlog(Ljava/lang/String;)V
+HSPLcom/android/server/SystemServer;->traceEnd()V
+HSPLcom/android/server/SystemServerInitThreadPool;-><init>()V
+HSPLcom/android/server/SystemServerInitThreadPool;->get()Lcom/android/server/SystemServerInitThreadPool;
+HSPLcom/android/server/SystemServerInitThreadPool;->lambda$-com_android_server_SystemServerInitThreadPool_2249(Ljava/lang/String;Ljava/lang/Runnable;)V
+HSPLcom/android/server/SystemServerInitThreadPool;->submit(Ljava/lang/Runnable;Ljava/lang/String;)Ljava/util/concurrent/Future;
+HSPLcom/android/server/SystemService;-><init>(Landroid/content/Context;)V
+HSPLcom/android/server/SystemService;->getContext()Landroid/content/Context;
+HSPLcom/android/server/SystemService;->onBootPhase(I)V
+HSPLcom/android/server/SystemService;->publishBinderService(Ljava/lang/String;Landroid/os/IBinder;)V
+HSPLcom/android/server/SystemService;->publishBinderService(Ljava/lang/String;Landroid/os/IBinder;Z)V
+HSPLcom/android/server/SystemService;->publishLocalService(Ljava/lang/Class;Ljava/lang/Object;)V
+HSPLcom/android/server/SystemServiceManager;-><init>(Landroid/content/Context;)V
+HSPLcom/android/server/SystemServiceManager;->setRuntimeRestarted(Z)V
+HSPLcom/android/server/SystemServiceManager;->startBootPhase(I)V
+HSPLcom/android/server/SystemServiceManager;->startService(Lcom/android/server/SystemService;)V
+HSPLcom/android/server/SystemServiceManager;->startService(Ljava/lang/Class;)Lcom/android/server/SystemService;
+HSPLcom/android/server/SystemServiceManager;->warnIfTooLong(JLcom/android/server/SystemService;Ljava/lang/String;)V
+HSPLcom/android/server/ThreadPriorityBooster$1;-><init>(Lcom/android/server/ThreadPriorityBooster;)V
+HSPLcom/android/server/ThreadPriorityBooster;-><init>(II)V
+HSPLcom/android/server/UiThread;-><init>()V
+HSPLcom/android/server/UiThread;->ensureThreadLocked()V
+HSPLcom/android/server/UiThread;->get()Lcom/android/server/UiThread;
+HSPLcom/android/server/UiThread;->getHandler()Landroid/os/Handler;
+HSPLcom/android/server/UiThread;->run()V
+HSPLcom/android/server/Watchdog$BinderThreadMonitor;-><init>()V
+HSPLcom/android/server/Watchdog$BinderThreadMonitor;-><init>(Lcom/android/server/Watchdog$BinderThreadMonitor;)V
+HSPLcom/android/server/Watchdog$HandlerChecker;-><init>(Lcom/android/server/Watchdog;Landroid/os/Handler;Ljava/lang/String;J)V
+HSPLcom/android/server/Watchdog$HandlerChecker;->addMonitor(Lcom/android/server/Watchdog$Monitor;)V
+HSPLcom/android/server/Watchdog;-><init>()V
+HSPLcom/android/server/Watchdog;->addMonitor(Lcom/android/server/Watchdog$Monitor;)V
+HSPLcom/android/server/Watchdog;->addThread(Landroid/os/Handler;)V
+HSPLcom/android/server/Watchdog;->addThread(Landroid/os/Handler;J)V
+HSPLcom/android/server/Watchdog;->getInstance()Lcom/android/server/Watchdog;
+HSPLcom/android/server/am/-$Lambda$FqYE94sGA9-gF3KGIicLxzMb89s;-><init>(B)V
+HSPLcom/android/server/am/-$Lambda$pTkujrAbcljW_zZtzXt4TxsgOZU;->$m$0(Ljava/lang/Runnable;)Ljava/lang/Thread;
+HSPLcom/android/server/am/-$Lambda$pTkujrAbcljW_zZtzXt4TxsgOZU;-><init>()V
+HSPLcom/android/server/am/-$Lambda$pTkujrAbcljW_zZtzXt4TxsgOZU;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread;
+HSPLcom/android/server/am/ActiveServices$1;-><init>(Lcom/android/server/am/ActiveServices;)V
+HSPLcom/android/server/am/ActiveServices;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+HSPLcom/android/server/am/ActivityManagerConstants;-><init>(Lcom/android/server/am/ActivityManagerService;Landroid/os/Handler;)V
+HSPLcom/android/server/am/ActivityManagerConstants;->computeEmptyProcessLimit(I)I
+HSPLcom/android/server/am/ActivityManagerConstants;->updateMaxCachedProcesses()V
+HSPLcom/android/server/am/ActivityManagerService$1;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+HSPLcom/android/server/am/ActivityManagerService$2;-><init>(Lcom/android/server/am/ActivityManagerService;Landroid/os/Looper;)V
+HSPLcom/android/server/am/ActivityManagerService$3;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+HSPLcom/android/server/am/ActivityManagerService$4;-><init>(Lcom/android/server/am/ActivityManagerService;Ljava/lang/String;)V
+HSPLcom/android/server/am/ActivityManagerService$4;->run()V
+HSPLcom/android/server/am/ActivityManagerService$Injector;-><init>()V
+HSPLcom/android/server/am/ActivityManagerService$Injector;->getAppOpsService(Ljava/io/File;Landroid/os/Handler;)Lcom/android/server/AppOpsService;
+HSPLcom/android/server/am/ActivityManagerService$Injector;->getUiHandler(Lcom/android/server/am/ActivityManagerService;)Landroid/os/Handler;
+HSPLcom/android/server/am/ActivityManagerService$IntentFirewallInterface;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+HSPLcom/android/server/am/ActivityManagerService$IntentFirewallInterface;->getAMSLock()Ljava/lang/Object;
+HSPLcom/android/server/am/ActivityManagerService$KillHandler;-><init>(Lcom/android/server/am/ActivityManagerService;Landroid/os/Looper;)V
+HSPLcom/android/server/am/ActivityManagerService$Lifecycle;-><init>(Landroid/content/Context;)V
+HSPLcom/android/server/am/ActivityManagerService$Lifecycle;->getService()Lcom/android/server/am/ActivityManagerService;
+HSPLcom/android/server/am/ActivityManagerService$Lifecycle;->onStart()V
+HSPLcom/android/server/am/ActivityManagerService$LocalService;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+HSPLcom/android/server/am/ActivityManagerService$MainHandler;-><init>(Lcom/android/server/am/ActivityManagerService;Landroid/os/Looper;)V
+HSPLcom/android/server/am/ActivityManagerService$UiHandler;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+HSPLcom/android/server/am/ActivityManagerService$UpdateConfigurationResult;-><init>()V
+HSPLcom/android/server/am/ActivityManagerService$UpdateConfigurationResult;-><init>(Lcom/android/server/am/ActivityManagerService$UpdateConfigurationResult;)V
+HSPLcom/android/server/am/ActivityManagerService;->-wrap10(Lcom/android/server/am/ActivityManagerService;)V
+HSPLcom/android/server/am/ActivityManagerService;-><init>(Landroid/content/Context;)V
+HSPLcom/android/server/am/ActivityManagerService;->createStackSupervisor()Lcom/android/server/am/ActivityStackSupervisor;
+HSPLcom/android/server/am/ActivityManagerService;->initPowerManagement()V
+HSPLcom/android/server/am/ActivityManagerService;->setInstaller(Lcom/android/server/pm/Installer;)V
+HSPLcom/android/server/am/ActivityManagerService;->setSystemServiceManager(Lcom/android/server/SystemServiceManager;)V
+HSPLcom/android/server/am/ActivityManagerService;->start()V
+HSPLcom/android/server/am/ActivityManagerService;->updateCpuStatsNow()V
+HSPLcom/android/server/am/ActivityMetricsLogger;-><init>(Lcom/android/server/am/ActivityStackSupervisor;Landroid/content/Context;)V
+HSPLcom/android/server/am/ActivityStackSupervisor$ActivityStackSupervisorHandler;-><init>(Lcom/android/server/am/ActivityStackSupervisor;Landroid/os/Looper;)V
+HSPLcom/android/server/am/ActivityStackSupervisor$FindTaskResult;-><init>()V
+HSPLcom/android/server/am/ActivityStackSupervisor;-><init>(Lcom/android/server/am/ActivityManagerService;Landroid/os/Looper;)V
+HSPLcom/android/server/am/ActivityStackSupervisor;->getChildCount()I
+HSPLcom/android/server/am/ActivityStackSupervisor;->initPowerManagement()V
+HSPLcom/android/server/am/ActivityStackSupervisor;->setRecentTasks(Lcom/android/server/am/RecentTasks;)V
+HSPLcom/android/server/am/ActivityStartInterceptor;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityStackSupervisor;)V
+HSPLcom/android/server/am/ActivityStarter;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityStackSupervisor;)V
+HSPLcom/android/server/am/AppErrors;-><init>(Landroid/content/Context;Lcom/android/server/am/ActivityManagerService;)V
+HSPLcom/android/server/am/BatteryExternalStatsWorker$1;-><init>(Lcom/android/server/am/BatteryExternalStatsWorker;)V
+HSPLcom/android/server/am/BatteryExternalStatsWorker$1;->run()V
+HSPLcom/android/server/am/BatteryExternalStatsWorker$2;-><init>(Lcom/android/server/am/BatteryExternalStatsWorker;)V
+HSPLcom/android/server/am/BatteryExternalStatsWorker$2;->run()V
+HSPLcom/android/server/am/BatteryExternalStatsWorker;->-get0(Lcom/android/server/am/BatteryExternalStatsWorker;)Ljava/lang/String;
+HSPLcom/android/server/am/BatteryExternalStatsWorker;->-get1(Lcom/android/server/am/BatteryExternalStatsWorker;)Lcom/android/internal/os/BatteryStatsImpl;
+HSPLcom/android/server/am/BatteryExternalStatsWorker;->-get2(Lcom/android/server/am/BatteryExternalStatsWorker;)Landroid/util/IntArray;
+HSPLcom/android/server/am/BatteryExternalStatsWorker;->-get3(Lcom/android/server/am/BatteryExternalStatsWorker;)I
+HSPLcom/android/server/am/BatteryExternalStatsWorker;->-get4(Lcom/android/server/am/BatteryExternalStatsWorker;)Ljava/lang/Object;
+HSPLcom/android/server/am/BatteryExternalStatsWorker;->-set0(Lcom/android/server/am/BatteryExternalStatsWorker;Ljava/util/concurrent/Future;)Ljava/util/concurrent/Future;
+HSPLcom/android/server/am/BatteryExternalStatsWorker;->-set1(Lcom/android/server/am/BatteryExternalStatsWorker;Ljava/lang/String;)Ljava/lang/String;
+HSPLcom/android/server/am/BatteryExternalStatsWorker;->-set2(Lcom/android/server/am/BatteryExternalStatsWorker;I)I
+HSPLcom/android/server/am/BatteryExternalStatsWorker;->-wrap0(Lcom/android/server/am/BatteryExternalStatsWorker;Ljava/lang/String;I)V
+HSPLcom/android/server/am/BatteryExternalStatsWorker;-><init>(Landroid/content/Context;Lcom/android/internal/os/BatteryStatsImpl;)V
+HSPLcom/android/server/am/BatteryExternalStatsWorker;->awaitControllerInfo(Landroid/os/SynchronousResultReceiver;)Landroid/os/Parcelable;
+HSPLcom/android/server/am/BatteryExternalStatsWorker;->lambda$-com_android_server_am_BatteryExternalStatsWorker_2607(Ljava/lang/Runnable;)Ljava/lang/Thread;
+HSPLcom/android/server/am/BatteryExternalStatsWorker;->scheduleSyncLocked(Ljava/lang/String;I)Ljava/util/concurrent/Future;
+HSPLcom/android/server/am/BatteryExternalStatsWorker;->scheduleWrite()Ljava/util/concurrent/Future;
+HSPLcom/android/server/am/BatteryExternalStatsWorker;->updateExternalStatsLocked(Ljava/lang/String;I)V
+HSPLcom/android/server/am/BatteryStatsService$WakeupReasonThread;-><init>(Lcom/android/server/am/BatteryStatsService;)V
+HSPLcom/android/server/am/BatteryStatsService$WakeupReasonThread;->run()V
+HSPLcom/android/server/am/BatteryStatsService$WakeupReasonThread;->waitWakeup()Ljava/lang/String;
+HSPLcom/android/server/am/BatteryStatsService;->-wrap0(Ljava/nio/ByteBuffer;)I
+HSPLcom/android/server/am/BatteryStatsService;-><init>(Landroid/content/Context;Ljava/io/File;Landroid/os/Handler;)V
+HSPLcom/android/server/am/BatteryStatsService;->getActiveStatistics()Lcom/android/internal/os/BatteryStatsImpl;
+HSPLcom/android/server/am/BatteryStatsService;->initPowerManagement()V
+HSPLcom/android/server/am/BatteryStatsService;->publish()V
+HSPLcom/android/server/am/BatteryStatsService;->scheduleWriteToDisk()V
+HSPLcom/android/server/am/BroadcastQueue$BroadcastHandler;-><init>(Lcom/android/server/am/BroadcastQueue;Landroid/os/Looper;)V
+HSPLcom/android/server/am/BroadcastQueue;-><init>(Lcom/android/server/am/ActivityManagerService;Landroid/os/Handler;Ljava/lang/String;JZ)V
+HSPLcom/android/server/am/CompatModePackages$CompatHandler;-><init>(Lcom/android/server/am/CompatModePackages;Landroid/os/Looper;)V
+HSPLcom/android/server/am/CompatModePackages;-><init>(Lcom/android/server/am/ActivityManagerService;Ljava/io/File;Landroid/os/Handler;)V
+HSPLcom/android/server/am/ConfigurationContainer;-><init>()V
+HSPLcom/android/server/am/ConfigurationContainer;->onConfigurationChanged(Landroid/content/res/Configuration;)V
+HSPLcom/android/server/am/InstrumentationReporter;-><init>()V
+HSPLcom/android/server/am/KeyguardController;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityStackSupervisor;)V
+HSPLcom/android/server/am/ProcessList;-><init>()V
+HSPLcom/android/server/am/ProcessList;->getMemLevel(I)J
+HSPLcom/android/server/am/ProcessList;->updateOomLevels(IIZ)V
+HSPLcom/android/server/am/ProcessStatsService$1;-><init>(Lcom/android/server/am/ProcessStatsService;)V
+HSPLcom/android/server/am/ProcessStatsService;-><init>(Lcom/android/server/am/ActivityManagerService;Ljava/io/File;)V
+HSPLcom/android/server/am/ProcessStatsService;->updateFile()V
+HSPLcom/android/server/am/ProviderMap;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+HSPLcom/android/server/am/RecentTasks$1;-><init>()V
+HSPLcom/android/server/am/RecentTasks;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityStackSupervisor;)V
+HSPLcom/android/server/am/TaskChangeNotificationController$MainHandler;-><init>(Lcom/android/server/am/TaskChangeNotificationController;Landroid/os/Looper;)V
+HSPLcom/android/server/am/TaskChangeNotificationController$TaskStackConsumer;->accept(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
+HSPLcom/android/server/am/TaskChangeNotificationController;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityStackSupervisor;Landroid/os/Handler;)V
+HSPLcom/android/server/am/TaskPersister$LazyTaskWriterThread;-><init>(Lcom/android/server/am/TaskPersister;Ljava/lang/String;)V
+HSPLcom/android/server/am/TaskPersister;-><init>(Ljava/io/File;Lcom/android/server/am/ActivityStackSupervisor;Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/RecentTasks;)V
+HSPLcom/android/server/am/UserController$Injector;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+HSPLcom/android/server/am/UserController$Injector;->getContext()Landroid/content/Context;
+HSPLcom/android/server/am/UserController$Injector;->getHandler()Landroid/os/Handler;
+HSPLcom/android/server/am/UserController$Injector;->getLock()Ljava/lang/Object;
+HSPLcom/android/server/am/UserController$Injector;->getLockPatternUtils()Lcom/android/internal/widget/LockPatternUtils;
+HSPLcom/android/server/am/UserController;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+HSPLcom/android/server/am/UserController;-><init>(Lcom/android/server/am/UserController$Injector;)V
+HSPLcom/android/server/am/UserController;->updateStartedUserArrayLocked()V
+HSPLcom/android/server/am/UserState;-><init>(Landroid/os/UserHandle;)V
+HSPLcom/android/server/am/VrController$1;-><init>(Lcom/android/server/am/VrController;)V
+HSPLcom/android/server/am/VrController;-><init>(Ljava/lang/Object;)V
+HSPLcom/android/server/display/DisplayAdapter$1;-><init>(Lcom/android/server/display/DisplayAdapter;Lcom/android/server/display/DisplayDevice;I)V
+HSPLcom/android/server/display/DisplayAdapter$1;->run()V
+HSPLcom/android/server/display/DisplayAdapter$2;-><init>(Lcom/android/server/display/DisplayAdapter;)V
+HSPLcom/android/server/display/DisplayAdapter$2;->run()V
+HSPLcom/android/server/display/DisplayAdapter$Listener;->onDisplayDeviceEvent(Lcom/android/server/display/DisplayDevice;I)V
+HSPLcom/android/server/display/DisplayAdapter$Listener;->onTraversalRequested()V
+HSPLcom/android/server/display/DisplayAdapter;->-get0(Lcom/android/server/display/DisplayAdapter;)Lcom/android/server/display/DisplayAdapter$Listener;
+HSPLcom/android/server/display/DisplayAdapter;-><init>(Lcom/android/server/display/DisplayManagerService$SyncRoot;Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/display/DisplayAdapter$Listener;Ljava/lang/String;)V
+HSPLcom/android/server/display/DisplayAdapter;->createMode(IIF)Landroid/view/Display$Mode;
+HSPLcom/android/server/display/DisplayAdapter;->getContext()Landroid/content/Context;
+HSPLcom/android/server/display/DisplayAdapter;->getHandler()Landroid/os/Handler;
+HSPLcom/android/server/display/DisplayAdapter;->registerLocked()V
+HSPLcom/android/server/display/DisplayAdapter;->sendDisplayDeviceEventLocked(Lcom/android/server/display/DisplayDevice;I)V
+HSPLcom/android/server/display/DisplayAdapter;->sendTraversalRequestLocked()V
+HSPLcom/android/server/display/DisplayDevice;-><init>(Lcom/android/server/display/DisplayAdapter;Landroid/os/IBinder;Ljava/lang/String;)V
+HSPLcom/android/server/display/DisplayDevice;->getDisplayDeviceInfoLocked()Lcom/android/server/display/DisplayDeviceInfo;
+HSPLcom/android/server/display/DisplayDevice;->getDisplayTokenLocked()Landroid/os/IBinder;
+HSPLcom/android/server/display/DisplayDevice;->getUniqueId()Ljava/lang/String;
+HSPLcom/android/server/display/DisplayDevice;->hasStableUniqueId()Z
+HSPLcom/android/server/display/DisplayDeviceInfo;-><init>()V
+HSPLcom/android/server/display/DisplayDeviceInfo;->diff(Lcom/android/server/display/DisplayDeviceInfo;)I
+HSPLcom/android/server/display/DisplayDeviceInfo;->equals(Lcom/android/server/display/DisplayDeviceInfo;)Z
+HSPLcom/android/server/display/DisplayDeviceInfo;->equals(Ljava/lang/Object;)Z
+HSPLcom/android/server/display/DisplayDeviceInfo;->flagsToString(I)Ljava/lang/String;
+HSPLcom/android/server/display/DisplayDeviceInfo;->toString()Ljava/lang/String;
+HSPLcom/android/server/display/DisplayDeviceInfo;->touchToString(I)Ljava/lang/String;
+HSPLcom/android/server/display/DisplayManagerService$BinderService;-><init>(Lcom/android/server/display/DisplayManagerService;)V
+HSPLcom/android/server/display/DisplayManagerService$BinderService;->getDisplayInfo(I)Landroid/view/DisplayInfo;
+HSPLcom/android/server/display/DisplayManagerService$BinderService;->registerCallback(Landroid/hardware/display/IDisplayManagerCallback;)V
+HSPLcom/android/server/display/DisplayManagerService$CallbackRecord;-><init>(Lcom/android/server/display/DisplayManagerService;ILandroid/hardware/display/IDisplayManagerCallback;)V
+HSPLcom/android/server/display/DisplayManagerService$DisplayAdapterListener;-><init>(Lcom/android/server/display/DisplayManagerService;)V
+HSPLcom/android/server/display/DisplayManagerService$DisplayAdapterListener;-><init>(Lcom/android/server/display/DisplayManagerService;Lcom/android/server/display/DisplayManagerService$DisplayAdapterListener;)V
+HSPLcom/android/server/display/DisplayManagerService$DisplayAdapterListener;->onDisplayDeviceEvent(Lcom/android/server/display/DisplayDevice;I)V
+HSPLcom/android/server/display/DisplayManagerService$DisplayAdapterListener;->onTraversalRequested()V
+HSPLcom/android/server/display/DisplayManagerService$DisplayManagerHandler;-><init>(Lcom/android/server/display/DisplayManagerService;Landroid/os/Looper;)V
+HSPLcom/android/server/display/DisplayManagerService$DisplayManagerHandler;->handleMessage(Landroid/os/Message;)V
+HSPLcom/android/server/display/DisplayManagerService$Injector;-><init>()V
+HSPLcom/android/server/display/DisplayManagerService$LocalService;-><init>(Lcom/android/server/display/DisplayManagerService;)V
+HSPLcom/android/server/display/DisplayManagerService$LocalService;-><init>(Lcom/android/server/display/DisplayManagerService;Lcom/android/server/display/DisplayManagerService$LocalService;)V
+HSPLcom/android/server/display/DisplayManagerService$SyncRoot;-><init>()V
+HSPLcom/android/server/display/DisplayManagerService;->-get5(Lcom/android/server/display/DisplayManagerService;)Lcom/android/server/display/DisplayManagerService$SyncRoot;
+HSPLcom/android/server/display/DisplayManagerService;->-wrap12(Lcom/android/server/display/DisplayManagerService;Lcom/android/server/display/DisplayDevice;)V
+HSPLcom/android/server/display/DisplayManagerService;->-wrap13(Lcom/android/server/display/DisplayManagerService;Lcom/android/server/display/DisplayDevice;)V
+HSPLcom/android/server/display/DisplayManagerService;->-wrap18(Lcom/android/server/display/DisplayManagerService;Landroid/hardware/display/IDisplayManagerCallback;I)V
+HSPLcom/android/server/display/DisplayManagerService;->-wrap19(Lcom/android/server/display/DisplayManagerService;)V
+HSPLcom/android/server/display/DisplayManagerService;->-wrap2(Lcom/android/server/display/DisplayManagerService;II)Landroid/view/DisplayInfo;
+HSPLcom/android/server/display/DisplayManagerService;->-wrap27(Lcom/android/server/display/DisplayManagerService;Z)V
+HSPLcom/android/server/display/DisplayManagerService;->-wrap7(Lcom/android/server/display/DisplayManagerService;II)V
+HSPLcom/android/server/display/DisplayManagerService;-><init>(Landroid/content/Context;)V
+HSPLcom/android/server/display/DisplayManagerService;-><init>(Landroid/content/Context;Lcom/android/server/display/DisplayManagerService$Injector;)V
+HSPLcom/android/server/display/DisplayManagerService;->addLogicalDisplayLocked(Lcom/android/server/display/DisplayDevice;)Lcom/android/server/display/LogicalDisplay;
+HSPLcom/android/server/display/DisplayManagerService;->assignDisplayIdLocked(Z)I
+HSPLcom/android/server/display/DisplayManagerService;->assignLayerStackLocked(I)I
+HSPLcom/android/server/display/DisplayManagerService;->deliverDisplayEvent(II)V
+HSPLcom/android/server/display/DisplayManagerService;->getDisplayInfoInternal(II)Landroid/view/DisplayInfo;
+HSPLcom/android/server/display/DisplayManagerService;->handleDisplayDeviceAdded(Lcom/android/server/display/DisplayDevice;)V
+HSPLcom/android/server/display/DisplayManagerService;->handleDisplayDeviceAddedLocked(Lcom/android/server/display/DisplayDevice;)V
+HSPLcom/android/server/display/DisplayManagerService;->handleDisplayDeviceChanged(Lcom/android/server/display/DisplayDevice;)V
+HSPLcom/android/server/display/DisplayManagerService;->onBootPhase(I)V
+HSPLcom/android/server/display/DisplayManagerService;->onStart()V
+HSPLcom/android/server/display/DisplayManagerService;->registerCallbackInternal(Landroid/hardware/display/IDisplayManagerCallback;I)V
+HSPLcom/android/server/display/DisplayManagerService;->registerDefaultDisplayAdapter()V
+HSPLcom/android/server/display/DisplayManagerService;->registerDisplayAdapterLocked(Lcom/android/server/display/DisplayAdapter;)V
+HSPLcom/android/server/display/DisplayManagerService;->scheduleTraversalLocked(Z)V
+HSPLcom/android/server/display/DisplayManagerService;->sendDisplayEventLocked(II)V
+HSPLcom/android/server/display/DisplayManagerService;->updateDisplayStateLocked(Lcom/android/server/display/DisplayDevice;)Ljava/lang/Runnable;
+HSPLcom/android/server/display/DisplayManagerService;->updateLogicalDisplaysLocked()Z
+HSPLcom/android/server/display/DisplayTransformManager;-><init>()V
+HSPLcom/android/server/display/LocalDisplayAdapter$DisplayModeRecord;-><init>(Landroid/view/SurfaceControl$PhysicalDisplayInfo;)V
+HSPLcom/android/server/display/LocalDisplayAdapter$DisplayModeRecord;->hasMatchingMode(Landroid/view/SurfaceControl$PhysicalDisplayInfo;)Z
+HSPLcom/android/server/display/LocalDisplayAdapter$HotplugDisplayEventReceiver;-><init>(Lcom/android/server/display/LocalDisplayAdapter;Landroid/os/Looper;)V
+HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice$1;-><init>(Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;IIZIILandroid/os/IBinder;)V
+HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice$1;->run()V
+HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice$1;->setDisplayBrightness(I)V
+HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice$1;->setDisplayState(I)V
+HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->-get0(Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;)Lcom/android/server/lights/Light;
+HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;-><init>(Lcom/android/server/display/LocalDisplayAdapter;Landroid/os/IBinder;I[Landroid/view/SurfaceControl$PhysicalDisplayInfo;I[II)V
+HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->applyPendingDisplayDeviceInfoChangesLocked()V
+HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->findDisplayInfoIndexLocked(I)I
+HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->findDisplayModeRecord(Landroid/view/SurfaceControl$PhysicalDisplayInfo;)Lcom/android/server/display/LocalDisplayAdapter$DisplayModeRecord;
+HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->getDisplayDeviceInfoLocked()Lcom/android/server/display/DisplayDeviceInfo;
+HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->hasStableUniqueId()Z
+HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->requestDisplayStateLocked(II)Ljava/lang/Runnable;
+HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->updateColorModesLocked([II)Z
+HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->updateDeviceInfoLocked()V
+HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->updatePhysicalDisplayInfoLocked([Landroid/view/SurfaceControl$PhysicalDisplayInfo;I[II)Z
+HSPLcom/android/server/display/LocalDisplayAdapter;-><init>(Lcom/android/server/display/DisplayManagerService$SyncRoot;Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/display/DisplayAdapter$Listener;)V
+HSPLcom/android/server/display/LocalDisplayAdapter;->getPowerModeForState(I)I
+HSPLcom/android/server/display/LocalDisplayAdapter;->registerLocked()V
+HSPLcom/android/server/display/LocalDisplayAdapter;->tryConnectDisplayLocked(I)V
+HSPLcom/android/server/display/LogicalDisplay;-><init>(IILcom/android/server/display/DisplayDevice;)V
+HSPLcom/android/server/display/LogicalDisplay;->getDisplayInfoLocked()Landroid/view/DisplayInfo;
+HSPLcom/android/server/display/LogicalDisplay;->getPrimaryDisplayDeviceLocked()Lcom/android/server/display/DisplayDevice;
+HSPLcom/android/server/display/LogicalDisplay;->isValidLocked()Z
+HSPLcom/android/server/display/LogicalDisplay;->setRequestedColorModeLocked(I)V
+HSPLcom/android/server/display/LogicalDisplay;->updateLocked(Ljava/util/List;)V
+HSPLcom/android/server/display/PersistentDataStore;-><init>()V
+HSPLcom/android/server/display/PersistentDataStore;->clearState()V
+HSPLcom/android/server/display/PersistentDataStore;->getColorMode(Lcom/android/server/display/DisplayDevice;)I
+HSPLcom/android/server/display/PersistentDataStore;->getDisplayState(Ljava/lang/String;Z)Lcom/android/server/display/PersistentDataStore$DisplayState;
+HSPLcom/android/server/display/PersistentDataStore;->load()V
+HSPLcom/android/server/display/PersistentDataStore;->loadIfNeeded()V
+HSPLcom/android/server/firewall/AndFilter$1;-><init>(Ljava/lang/String;)V
+HSPLcom/android/server/firewall/CategoryFilter$1;-><init>(Ljava/lang/String;)V
+HSPLcom/android/server/firewall/FilterFactory;-><init>(Ljava/lang/String;)V
+HSPLcom/android/server/firewall/FilterFactory;->getTagName()Ljava/lang/String;
+HSPLcom/android/server/firewall/IntentFirewall$AMSInterface;->checkComponentPermission(Ljava/lang/String;IIIZ)I
+HSPLcom/android/server/firewall/IntentFirewall$AMSInterface;->getAMSLock()Ljava/lang/Object;
+HSPLcom/android/server/firewall/IntentFirewall$FirewallHandler;-><init>(Lcom/android/server/firewall/IntentFirewall;Landroid/os/Looper;)V
+HSPLcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;-><init>()V
+HSPLcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;-><init>(Lcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;)V
+HSPLcom/android/server/firewall/IntentFirewall$RuleObserver;-><init>(Lcom/android/server/firewall/IntentFirewall;Ljava/io/File;)V
+HSPLcom/android/server/firewall/IntentFirewall;-><init>(Lcom/android/server/firewall/IntentFirewall$AMSInterface;Landroid/os/Handler;)V
+HSPLcom/android/server/firewall/IntentFirewall;->getRulesDir()Ljava/io/File;
+HSPLcom/android/server/firewall/IntentFirewall;->readRulesDir(Ljava/io/File;)V
+HSPLcom/android/server/firewall/NotFilter$1;-><init>(Ljava/lang/String;)V
+HSPLcom/android/server/firewall/OrFilter$1;-><init>(Ljava/lang/String;)V
+HSPLcom/android/server/firewall/PortFilter$1;-><init>(Ljava/lang/String;)V
+HSPLcom/android/server/firewall/SenderFilter$1;-><init>(Ljava/lang/String;)V
+HSPLcom/android/server/firewall/SenderFilter$2;-><init>()V
+HSPLcom/android/server/firewall/SenderFilter$3;-><init>()V
+HSPLcom/android/server/firewall/SenderFilter$4;-><init>()V
+HSPLcom/android/server/firewall/SenderFilter$5;-><init>()V
+HSPLcom/android/server/firewall/SenderPackageFilter$1;-><init>(Ljava/lang/String;)V
+HSPLcom/android/server/firewall/SenderPermissionFilter$1;-><init>(Ljava/lang/String;)V
+HSPLcom/android/server/firewall/StringFilter$10;-><init>(Ljava/lang/String;)V
+HSPLcom/android/server/firewall/StringFilter$1;-><init>(Ljava/lang/String;)V
+HSPLcom/android/server/firewall/StringFilter$2;-><init>(Ljava/lang/String;)V
+HSPLcom/android/server/firewall/StringFilter$3;-><init>(Ljava/lang/String;)V
+HSPLcom/android/server/firewall/StringFilter$4;-><init>(Ljava/lang/String;)V
+HSPLcom/android/server/firewall/StringFilter$5;-><init>(Ljava/lang/String;)V
+HSPLcom/android/server/firewall/StringFilter$6;-><init>(Ljava/lang/String;)V
+HSPLcom/android/server/firewall/StringFilter$7;-><init>(Ljava/lang/String;)V
+HSPLcom/android/server/firewall/StringFilter$8;-><init>(Ljava/lang/String;)V
+HSPLcom/android/server/firewall/StringFilter$9;-><init>(Ljava/lang/String;)V
+HSPLcom/android/server/firewall/StringFilter$ValueProvider;-><init>(Ljava/lang/String;)V
+HSPLcom/android/server/lights/Light;-><init>()V
+HSPLcom/android/server/lights/Light;->pulse()V
+HSPLcom/android/server/lights/Light;->pulse(II)V
+HSPLcom/android/server/lights/Light;->setBrightness(I)V
+HSPLcom/android/server/lights/Light;->setBrightness(II)V
+HSPLcom/android/server/lights/Light;->setColor(I)V
+HSPLcom/android/server/lights/Light;->setFlashing(IIII)V
+HSPLcom/android/server/lights/Light;->setVrMode(Z)V
+HSPLcom/android/server/lights/Light;->turnOff()V
+HSPLcom/android/server/lights/LightsManager;-><init>()V
+HSPLcom/android/server/lights/LightsManager;->getLight(I)Lcom/android/server/lights/Light;
+HSPLcom/android/server/lights/LightsService$1;-><init>(Lcom/android/server/lights/LightsService;)V
+HSPLcom/android/server/lights/LightsService$1;->getLight(I)Lcom/android/server/lights/Light;
+HSPLcom/android/server/lights/LightsService$2;-><init>(Lcom/android/server/lights/LightsService;)V
+HSPLcom/android/server/lights/LightsService$LightImpl;-><init>(Lcom/android/server/lights/LightsService;I)V
+HSPLcom/android/server/lights/LightsService$LightImpl;-><init>(Lcom/android/server/lights/LightsService;ILcom/android/server/lights/LightsService$LightImpl;)V
+HSPLcom/android/server/lights/LightsService$LightImpl;->setBrightness(I)V
+HSPLcom/android/server/lights/LightsService$LightImpl;->setBrightness(II)V
+HSPLcom/android/server/lights/LightsService$LightImpl;->setLightLocked(IIIII)V
+HSPLcom/android/server/lights/LightsService$LightImpl;->shouldBeInLowPersistenceMode()Z
+HSPLcom/android/server/lights/LightsService;-><init>(Landroid/content/Context;)V
+HSPLcom/android/server/lights/LightsService;->onBootPhase(I)V
+HSPLcom/android/server/lights/LightsService;->onStart()V
+HSPLcom/android/server/os/DeviceIdentifiersPolicyService$DeviceIdentifiersPolicy;-><init>(Landroid/content/Context;)V
+HSPLcom/android/server/os/DeviceIdentifiersPolicyService;-><init>(Landroid/content/Context;)V
+HSPLcom/android/server/os/DeviceIdentifiersPolicyService;->onStart()V
+HSPLcom/android/server/pm/AbstractStatsBase;-><init>(Ljava/lang/String;Ljava/lang/String;Z)V
+HSPLcom/android/server/pm/BasePermission;-><init>(Ljava/lang/String;Ljava/lang/String;I)V
+HSPLcom/android/server/pm/BasePermission;->computeGids(I)[I
+HSPLcom/android/server/pm/BasePermission;->setGids([IZ)V
+HSPLcom/android/server/pm/CompilerStats;-><init>()V
+HSPLcom/android/server/pm/DefaultPermissionGrantPolicy$1;-><init>(Lcom/android/server/pm/DefaultPermissionGrantPolicy;Landroid/os/Looper;)V
+HSPLcom/android/server/pm/DefaultPermissionGrantPolicy;-><init>(Lcom/android/server/pm/PackageManagerService;)V
+HSPLcom/android/server/pm/Installer$1;-><init>(Lcom/android/server/pm/Installer;)V
+HSPLcom/android/server/pm/Installer;-><init>(Landroid/content/Context;)V
+HSPLcom/android/server/pm/Installer;-><init>(Landroid/content/Context;Z)V
+HSPLcom/android/server/pm/Installer;->checkBeforeRemote()Z
+HSPLcom/android/server/pm/Installer;->connect()V
+HSPLcom/android/server/pm/Installer;->invalidateMounts()V
+HSPLcom/android/server/pm/Installer;->onStart()V
+HSPLcom/android/server/pm/InstantAppRegistry$CookiePersistence;-><init>(Lcom/android/server/pm/InstantAppRegistry;Landroid/os/Looper;)V
+HSPLcom/android/server/pm/InstantAppRegistry;-><init>(Lcom/android/server/pm/PackageManagerService;)V
+HSPLcom/android/server/pm/KeySetManagerService;-><init>(Landroid/util/ArrayMap;)V
+HSPLcom/android/server/pm/PackageDexOptimizer;-><init>(Lcom/android/server/pm/Installer;Ljava/lang/Object;Landroid/content/Context;Ljava/lang/String;)V
+HSPLcom/android/server/pm/PackageKeySetData;-><init>()V
+HSPLcom/android/server/pm/PackageKeySetData;->setProperSigningKeySet(J)V
+HSPLcom/android/server/pm/PackageManagerService$1;-><init>(Lcom/android/server/pm/PackageManagerService;)V
+HSPLcom/android/server/pm/PackageManagerService$2;-><init>()V
+HSPLcom/android/server/pm/PackageManagerService$3;-><init>()V
+HSPLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;-><init>(Lcom/android/server/pm/PackageManagerService;)V
+HSPLcom/android/server/pm/PackageManagerService$DefaultContainerConnection;-><init>(Lcom/android/server/pm/PackageManagerService;)V
+HSPLcom/android/server/pm/PackageManagerService$MoveCallbacks;-><init>(Landroid/os/Looper;)V
+HSPLcom/android/server/pm/PackageManagerService$OnPermissionChangeListeners;-><init>(Landroid/os/Looper;)V
+HSPLcom/android/server/pm/PackageManagerService$PackageHandler;-><init>(Lcom/android/server/pm/PackageManagerService;Landroid/os/Looper;)V
+HSPLcom/android/server/pm/PackageManagerService$PackageParserCallback;-><init>(Lcom/android/server/pm/PackageManagerService;)V
+HSPLcom/android/server/pm/PackageManagerService$ParallelPackageParserCallback;-><init>(Lcom/android/server/pm/PackageManagerService;)V
+HSPLcom/android/server/pm/PackageManagerService$PendingPackageBroadcasts;-><init>()V
+HSPLcom/android/server/pm/PackageManagerService$ProviderIntentResolver;-><init>(Lcom/android/server/pm/PackageManagerService;)V
+HSPLcom/android/server/pm/PackageManagerService$ProviderIntentResolver;-><init>(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService$ProviderIntentResolver;)V
+HSPLcom/android/server/pm/PackageManagerService$ServiceIntentResolver;-><init>(Lcom/android/server/pm/PackageManagerService;)V
+HSPLcom/android/server/pm/PackageManagerService$ServiceIntentResolver;-><init>(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService$ServiceIntentResolver;)V
+HSPLcom/android/server/pm/PackageManagerService$SharedLibraryEntry;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IILjava/lang/String;I)V
+HSPLcom/android/server/pm/PackageManagerService;-><init>(Landroid/content/Context;Lcom/android/server/pm/Installer;ZZ)V
+HSPLcom/android/server/pm/PackageManagerService;->addSharedLibraryLPw(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IILjava/lang/String;I)Z
+HSPLcom/android/server/pm/PackageManagerService;->getDefaultDisplayMetrics(Landroid/content/Context;Landroid/util/DisplayMetrics;)V
+HSPLcom/android/server/pm/PackageManagerService;->main(Landroid/content/Context;Lcom/android/server/pm/Installer;ZZ)Lcom/android/server/pm/PackageManagerService;
+HSPLcom/android/server/pm/PackageManagerServiceCompilerMapping;->checkProperties()V
+HSPLcom/android/server/pm/PackageManagerServiceCompilerMapping;->getAndCheckValidity(I)Ljava/lang/String;
+HSPLcom/android/server/pm/PackageManagerServiceCompilerMapping;->getSystemPropertyName(I)Ljava/lang/String;
+HSPLcom/android/server/pm/PackageSender;->sendPackageAddedForNewUsers(Ljava/lang/String;ZI[I)V
+HSPLcom/android/server/pm/PackageSender;->sendPackageBroadcast(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;ILjava/lang/String;Landroid/content/IIntentReceiver;[I)V
+HSPLcom/android/server/pm/PackageSetting;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/io/File;Ljava/io/File;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IIILjava/lang/String;Ljava/util/List;I[Ljava/lang/String;[I)V
+HSPLcom/android/server/pm/PackageSetting;->getPermissionsState()Lcom/android/server/pm/PermissionsState;
+HSPLcom/android/server/pm/PackageSettingBase;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/io/File;Ljava/io/File;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IIILjava/lang/String;Ljava/util/List;[Ljava/lang/String;[I)V
+HSPLcom/android/server/pm/PackageSettingBase;->init(Ljava/io/File;Ljava/io/File;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V
+HSPLcom/android/server/pm/PackageSettingBase;->modifyUserState(I)Landroid/content/pm/PackageUserState;
+HSPLcom/android/server/pm/PackageSettingBase;->setEnabled(IILjava/lang/String;)V
+HSPLcom/android/server/pm/PackageSettingBase;->setIntentFilterVerificationInfo(Landroid/content/pm/IntentFilterVerificationInfo;)V
+HSPLcom/android/server/pm/PackageSettingBase;->setTimeStamp(J)V
+HSPLcom/android/server/pm/PackageSignatures;-><init>()V
+HSPLcom/android/server/pm/PackageSignatures;->readXml(Lorg/xmlpull/v1/XmlPullParser;Ljava/util/ArrayList;)V
+HSPLcom/android/server/pm/PackageUsage;-><init>()V
+HSPLcom/android/server/pm/PermissionsState$PermissionData;-><init>(Lcom/android/server/pm/BasePermission;)V
+HSPLcom/android/server/pm/PermissionsState$PermissionData;->computeGids(I)[I
+HSPLcom/android/server/pm/PermissionsState$PermissionData;->getFlags(I)I
+HSPLcom/android/server/pm/PermissionsState$PermissionData;->grant(I)Z
+HSPLcom/android/server/pm/PermissionsState$PermissionData;->isCompatibleUserId(I)Z
+HSPLcom/android/server/pm/PermissionsState$PermissionData;->isDefault()Z
+HSPLcom/android/server/pm/PermissionsState$PermissionData;->isGranted(I)Z
+HSPLcom/android/server/pm/PermissionsState$PermissionData;->isInstallPermission()Z
+HSPLcom/android/server/pm/PermissionsState$PermissionData;->isInstallPermissionKey(I)Z
+HSPLcom/android/server/pm/PermissionsState$PermissionData;->updateFlags(III)Z
+HSPLcom/android/server/pm/PermissionsState$PermissionState;->-get0(Lcom/android/server/pm/PermissionsState$PermissionState;)I
+HSPLcom/android/server/pm/PermissionsState$PermissionState;->-get1(Lcom/android/server/pm/PermissionsState$PermissionState;)Z
+HSPLcom/android/server/pm/PermissionsState$PermissionState;->-set0(Lcom/android/server/pm/PermissionsState$PermissionState;I)I
+HSPLcom/android/server/pm/PermissionsState$PermissionState;->-set1(Lcom/android/server/pm/PermissionsState$PermissionState;Z)Z
+HSPLcom/android/server/pm/PermissionsState$PermissionState;-><init>(Ljava/lang/String;)V
+HSPLcom/android/server/pm/PermissionsState$PermissionState;->isDefault()Z
+HSPLcom/android/server/pm/PermissionsState;-><init>()V
+HSPLcom/android/server/pm/PermissionsState;->appendInts([I[I)[I
+HSPLcom/android/server/pm/PermissionsState;->computeGids(I)[I
+HSPLcom/android/server/pm/PermissionsState;->enforceValidUserId(I)V
+HSPLcom/android/server/pm/PermissionsState;->ensurePermissionData(Lcom/android/server/pm/BasePermission;)Lcom/android/server/pm/PermissionsState$PermissionData;
+HSPLcom/android/server/pm/PermissionsState;->grantInstallPermission(Lcom/android/server/pm/BasePermission;)I
+HSPLcom/android/server/pm/PermissionsState;->grantPermission(Lcom/android/server/pm/BasePermission;I)I
+HSPLcom/android/server/pm/PermissionsState;->hasPermission(Ljava/lang/String;I)Z
+HSPLcom/android/server/pm/PermissionsState;->updatePermissionFlags(Lcom/android/server/pm/BasePermission;III)Z
+HSPLcom/android/server/pm/Policy$PolicyBuilder;->-get0(Lcom/android/server/pm/Policy$PolicyBuilder;)Ljava/util/Set;
+HSPLcom/android/server/pm/Policy$PolicyBuilder;->-get1(Lcom/android/server/pm/Policy$PolicyBuilder;)Ljava/util/Map;
+HSPLcom/android/server/pm/Policy$PolicyBuilder;->-get2(Lcom/android/server/pm/Policy$PolicyBuilder;)Ljava/lang/String;
+HSPLcom/android/server/pm/Policy$PolicyBuilder;-><init>()V
+HSPLcom/android/server/pm/Policy$PolicyBuilder;->addInnerPackageMapOrThrow(Ljava/lang/String;Ljava/lang/String;)Lcom/android/server/pm/Policy$PolicyBuilder;
+HSPLcom/android/server/pm/Policy$PolicyBuilder;->addSignature(Ljava/lang/String;)Lcom/android/server/pm/Policy$PolicyBuilder;
+HSPLcom/android/server/pm/Policy$PolicyBuilder;->build()Lcom/android/server/pm/Policy;
+HSPLcom/android/server/pm/Policy$PolicyBuilder;->setGlobalSeinfoOrThrow(Ljava/lang/String;)Lcom/android/server/pm/Policy$PolicyBuilder;
+HSPLcom/android/server/pm/Policy$PolicyBuilder;->validateValue(Ljava/lang/String;)Z
+HSPLcom/android/server/pm/Policy;->-get0(Lcom/android/server/pm/Policy;)Ljava/util/Set;
+HSPLcom/android/server/pm/Policy;->-get1(Lcom/android/server/pm/Policy;)Ljava/util/Map;
+HSPLcom/android/server/pm/Policy;->-get2(Lcom/android/server/pm/Policy;)Ljava/lang/String;
+HSPLcom/android/server/pm/Policy;-><init>(Lcom/android/server/pm/Policy$PolicyBuilder;)V
+HSPLcom/android/server/pm/Policy;-><init>(Lcom/android/server/pm/Policy$PolicyBuilder;Lcom/android/server/pm/Policy;)V
+HSPLcom/android/server/pm/Policy;->getSignatures()Ljava/util/Set;
+HSPLcom/android/server/pm/Policy;->hasInnerPackages()Z
+HSPLcom/android/server/pm/PolicyComparator;-><init>()V
+HSPLcom/android/server/pm/PolicyComparator;->compare(Lcom/android/server/pm/Policy;Lcom/android/server/pm/Policy;)I
+HSPLcom/android/server/pm/PolicyComparator;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+HSPLcom/android/server/pm/PolicyComparator;->foundDuplicate()Z
+HSPLcom/android/server/pm/ProcessLoggingHandler;-><init>()V
+HSPLcom/android/server/pm/ProtectedPackages;-><init>(Landroid/content/Context;)V
+HSPLcom/android/server/pm/SELinuxMMAC;->readInstallPolicy()Z
+HSPLcom/android/server/pm/SELinuxMMAC;->readPackageOrThrow(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/pm/Policy$PolicyBuilder;)V
+HSPLcom/android/server/pm/SELinuxMMAC;->readSeinfo(Lorg/xmlpull/v1/XmlPullParser;)V
+HSPLcom/android/server/pm/SELinuxMMAC;->readSignerOrThrow(Lorg/xmlpull/v1/XmlPullParser;)Lcom/android/server/pm/Policy;
+HSPLcom/android/server/pm/SettingBase;-><init>(II)V
+HSPLcom/android/server/pm/SettingBase;->getPermissionsState()Lcom/android/server/pm/PermissionsState;
+HSPLcom/android/server/pm/SettingBase;->setFlags(I)V
+HSPLcom/android/server/pm/SettingBase;->setPrivateFlags(I)V
+HSPLcom/android/server/pm/Settings$RuntimePermissionPersistence$MyHandler;-><init>(Lcom/android/server/pm/Settings$RuntimePermissionPersistence;)V
+HSPLcom/android/server/pm/Settings$RuntimePermissionPersistence;-><init>(Lcom/android/server/pm/Settings;Ljava/lang/Object;)V
+HSPLcom/android/server/pm/Settings$VersionInfo;-><init>()V
+HSPLcom/android/server/pm/Settings;-><init>(Ljava/io/File;Ljava/lang/Object;)V
+HSPLcom/android/server/pm/Settings;-><init>(Ljava/lang/Object;)V
+HSPLcom/android/server/pm/Settings;->addPackageLPw(Ljava/lang/String;Ljava/lang/String;Ljava/io/File;Ljava/io/File;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IIIILjava/lang/String;Ljava/util/List;[Ljava/lang/String;[I)Lcom/android/server/pm/PackageSetting;
+HSPLcom/android/server/pm/Settings;->addSharedUserLPw(Ljava/lang/String;III)Lcom/android/server/pm/SharedUserSetting;
+HSPLcom/android/server/pm/Settings;->addUserIdLPw(ILjava/lang/Object;Ljava/lang/Object;)Z
+HSPLcom/android/server/pm/Settings;->findOrCreateVersion(Ljava/lang/String;)Lcom/android/server/pm/Settings$VersionInfo;
+HSPLcom/android/server/pm/Settings;->readDomainVerificationLPw(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/pm/PackageSettingBase;)V
+HSPLcom/android/server/pm/Settings;->readInstallPermissionsLPr(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/pm/PermissionsState;)V
+HSPLcom/android/server/pm/Settings;->readInt(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;Ljava/lang/String;I)I
+HSPLcom/android/server/pm/Settings;->readLPw(Ljava/util/List;)Z
+HSPLcom/android/server/pm/Settings;->readPackageLPw(Lorg/xmlpull/v1/XmlPullParser;)V
+HSPLcom/android/server/pm/Settings;->readPermissionsLPw(Landroid/util/ArrayMap;Lorg/xmlpull/v1/XmlPullParser;)V
+HSPLcom/android/server/pm/SharedUserSetting;-><init>(Ljava/lang/String;II)V
+HSPLcom/android/server/pm/UserDataPreparer;-><init>(Lcom/android/server/pm/Installer;Ljava/lang/Object;Landroid/content/Context;Z)V
+HSPLcom/android/server/pm/UserManagerService$1;-><init>(Lcom/android/server/pm/UserManagerService;)V
+HSPLcom/android/server/pm/UserManagerService$LocalService;-><init>(Lcom/android/server/pm/UserManagerService;)V
+HSPLcom/android/server/pm/UserManagerService$LocalService;-><init>(Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService$LocalService;)V
+HSPLcom/android/server/pm/UserManagerService$MainHandler;-><init>(Lcom/android/server/pm/UserManagerService;)V
+HSPLcom/android/server/pm/UserManagerService$UserData;-><init>()V
+HSPLcom/android/server/pm/UserManagerService;-><init>(Landroid/content/Context;Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/UserDataPreparer;Ljava/lang/Object;)V
+HSPLcom/android/server/pm/UserManagerService;-><init>(Landroid/content/Context;Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/UserDataPreparer;Ljava/lang/Object;Ljava/io/File;)V
+HSPLcom/android/server/pm/UserManagerService;->checkManageOrCreateUsersPermission(Ljava/lang/String;)V
+HSPLcom/android/server/pm/UserManagerService;->getUsers(Z)Ljava/util/List;
+HSPLcom/android/server/pm/UserManagerService;->hasManageOrCreateUsersPermission()Z
+HSPLcom/android/server/pm/UserManagerService;->initDefaultGuestRestrictions()V
+HSPLcom/android/server/pm/UserManagerService;->readIntAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;I)I
+HSPLcom/android/server/pm/UserManagerService;->readLongAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;J)J
+HSPLcom/android/server/pm/UserManagerService;->readUserLP(I)Lcom/android/server/pm/UserManagerService$UserData;
+HSPLcom/android/server/pm/UserManagerService;->readUserLP(ILjava/io/InputStream;)Lcom/android/server/pm/UserManagerService$UserData;
+HSPLcom/android/server/pm/UserManagerService;->readUserListLP()V
+HSPLcom/android/server/pm/UserManagerService;->updateUserIds()V
+HSPLcom/android/server/pm/UserManagerService;->upgradeIfNecessaryLP(Landroid/os/Bundle;)V
+HSPLcom/android/server/pm/UserManagerService;->userWithName(Landroid/content/pm/UserInfo;)Landroid/content/pm/UserInfo;
+HSPLcom/android/server/pm/UserRestrictionsUtils;->newSetWithUniqueCheck([Ljava/lang/String;)Ljava/util/Set;
+HSPLcom/android/server/pm/UserRestrictionsUtils;->readRestrictions(Lorg/xmlpull/v1/XmlPullParser;)Landroid/os/Bundle;
+HSPLcom/android/server/pm/UserRestrictionsUtils;->readRestrictions(Lorg/xmlpull/v1/XmlPullParser;Landroid/os/Bundle;)V
+HSPLcom/android/server/pm/dex/DexManager;-><init>(Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageDexOptimizer;Lcom/android/server/pm/Installer;Ljava/lang/Object;)V
+HSPLcom/android/server/pm/dex/PackageDexUsage;-><init>()V
+HSPLcom/android/server/power/BatterySaverPolicy;-><init>(Landroid/os/Handler;)V
+HSPLcom/android/server/power/BatterySaverPolicy;->getBatterySaverPolicy(IZ)Landroid/os/PowerSaveState;
+HSPLcom/android/server/power/PowerManagerService$1;-><init>(Lcom/android/server/power/PowerManagerService;)V
+HSPLcom/android/server/power/PowerManagerService$2;-><init>(Lcom/android/server/power/PowerManagerService;)V
+HSPLcom/android/server/power/PowerManagerService$BinderService;-><init>(Lcom/android/server/power/PowerManagerService;)V
+HSPLcom/android/server/power/PowerManagerService$BinderService;-><init>(Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService$BinderService;)V
+HSPLcom/android/server/power/PowerManagerService$Constants;-><init>(Lcom/android/server/power/PowerManagerService;Landroid/os/Handler;)V
+HSPLcom/android/server/power/PowerManagerService$LocalService;-><init>(Lcom/android/server/power/PowerManagerService;)V
+HSPLcom/android/server/power/PowerManagerService$LocalService;-><init>(Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService$LocalService;)V
+HSPLcom/android/server/power/PowerManagerService$LocalService;->getLowPowerState(I)Landroid/os/PowerSaveState;
+HSPLcom/android/server/power/PowerManagerService$LocalService;->registerLowPowerModeObserver(Landroid/os/PowerManagerInternal$LowPowerModeListener;)V
+HSPLcom/android/server/power/PowerManagerService$PowerManagerHandler;-><init>(Lcom/android/server/power/PowerManagerService;Landroid/os/Looper;)V
+HSPLcom/android/server/power/PowerManagerService$SuspendBlockerImpl;-><init>(Lcom/android/server/power/PowerManagerService;Ljava/lang/String;)V
+HSPLcom/android/server/power/PowerManagerService$SuspendBlockerImpl;->acquire()V
+HSPLcom/android/server/power/PowerManagerService;->-get0(Lcom/android/server/power/PowerManagerService;)Lcom/android/server/power/BatterySaverPolicy;
+HSPLcom/android/server/power/PowerManagerService;->-get10(Lcom/android/server/power/PowerManagerService;)Z
+HSPLcom/android/server/power/PowerManagerService;->-get11(Lcom/android/server/power/PowerManagerService;)Ljava/util/ArrayList;
+HSPLcom/android/server/power/PowerManagerService;->-get9(Lcom/android/server/power/PowerManagerService;)Ljava/lang/Object;
+HSPLcom/android/server/power/PowerManagerService;->-wrap20(Ljava/lang/String;)V
+HSPLcom/android/server/power/PowerManagerService;-><init>(Landroid/content/Context;)V
+HSPLcom/android/server/power/PowerManagerService;->createSuspendBlockerLocked(Ljava/lang/String;)Lcom/android/server/power/SuspendBlocker;
+HSPLcom/android/server/power/PowerManagerService;->onBootPhase(I)V
+HSPLcom/android/server/power/PowerManagerService;->onStart()V
+HSPLcom/android/server/power/SuspendBlocker;->acquire()V
+HSPLcom/android/server/power/SuspendBlocker;->release()V
+HSPLcom/android/server/power/SuspendBlocker;->writeToProto(Landroid/util/proto/ProtoOutputStream;J)V
+HSPLcom/android/server/vr/EnabledComponentsObserver$EnabledComponentChangeListener;->onEnabledComponentChanged()V
+HSPLcom/android/server/wm/AppWindowContainerListener;->keyDispatchingTimedOut(Ljava/lang/String;I)Z
+HSPLcom/android/server/wm/AppWindowContainerListener;->onStartingWindowDrawn()V
+HSPLcom/android/server/wm/AppWindowContainerListener;->onWindowsDrawn()V
+HSPLcom/android/server/wm/AppWindowContainerListener;->onWindowsGone()V
+HSPLcom/android/server/wm/AppWindowContainerListener;->onWindowsVisible()V
+HSPLcom/android/server/wm/TaskWindowContainerListener;->onSnapshotChanged(Landroid/app/ActivityManager$TaskSnapshot;)V
+HSPLcom/android/server/wm/TaskWindowContainerListener;->requestResize(Landroid/graphics/Rect;I)V
+Lcom/android/server/-$Lambda$6PBiitFNzy52xbrUpcD5i5xBLLY;
+Lcom/android/server/-$Lambda$T7cKu_OKm_Fk2kBNthmo_uUJTSo;
+Lcom/android/server/AlarmManagerService;
+Lcom/android/server/AppOpsService$1;
+Lcom/android/server/AppOpsService$Callback;
+Lcom/android/server/AppOpsService$Op;
+Lcom/android/server/AppOpsService$Ops;
+Lcom/android/server/AppOpsService$UidState;
+Lcom/android/server/AppOpsService;
+Lcom/android/server/ConsumerIrService;
+Lcom/android/server/DisplayThread;
+Lcom/android/server/FgThread;
+Lcom/android/server/GraphicsStatsService;
+Lcom/android/server/HardwarePropertiesManagerService;
+Lcom/android/server/IntentResolver$1;
+Lcom/android/server/IntentResolver;
+Lcom/android/server/IoThread;
+Lcom/android/server/LockGuard;
+Lcom/android/server/PersistentDataBlockService;
+Lcom/android/server/RecoverySystemService$BinderService;
+Lcom/android/server/RecoverySystemService;
+Lcom/android/server/RescueParty$BootThreshold;
+Lcom/android/server/RescueParty$Threshold;
+Lcom/android/server/RescueParty;
+Lcom/android/server/SerialService;
+Lcom/android/server/ServiceThread;
+Lcom/android/server/SystemServer;
+Lcom/android/server/SystemServerInitThreadPool;
+Lcom/android/server/SystemService;
+Lcom/android/server/SystemServiceManager;
+Lcom/android/server/ThreadPriorityBooster$1;
+Lcom/android/server/ThreadPriorityBooster;
+Lcom/android/server/UiThread;
+Lcom/android/server/VibratorService;
+Lcom/android/server/Watchdog$BinderThreadMonitor;
+Lcom/android/server/Watchdog$HandlerChecker;
+Lcom/android/server/Watchdog$Monitor;
+Lcom/android/server/Watchdog;
+Lcom/android/server/am/-$Lambda$FqYE94sGA9-gF3KGIicLxzMb89s;
+Lcom/android/server/am/-$Lambda$pTkujrAbcljW_zZtzXt4TxsgOZU;
+Lcom/android/server/am/ActiveInstrumentation;
+Lcom/android/server/am/ActiveServices$1;
+Lcom/android/server/am/ActiveServices;
+Lcom/android/server/am/ActivityManagerConstants;
+Lcom/android/server/am/ActivityManagerDebugConfig;
+Lcom/android/server/am/ActivityManagerService$1;
+Lcom/android/server/am/ActivityManagerService$2;
+Lcom/android/server/am/ActivityManagerService$3;
+Lcom/android/server/am/ActivityManagerService$4;
+Lcom/android/server/am/ActivityManagerService$Injector;
+Lcom/android/server/am/ActivityManagerService$IntentFirewallInterface;
+Lcom/android/server/am/ActivityManagerService$KillHandler;
+Lcom/android/server/am/ActivityManagerService$Lifecycle;
+Lcom/android/server/am/ActivityManagerService$LocalService;
+Lcom/android/server/am/ActivityManagerService$MainHandler;
+Lcom/android/server/am/ActivityManagerService$ProcessChangeItem;
+Lcom/android/server/am/ActivityManagerService$UiHandler;
+Lcom/android/server/am/ActivityManagerService$UpdateConfigurationResult;
+Lcom/android/server/am/ActivityManagerService;
+Lcom/android/server/am/ActivityMetricsLogger;
+Lcom/android/server/am/ActivityRecord;
+Lcom/android/server/am/ActivityStackSupervisor$ActivityStackSupervisorHandler;
+Lcom/android/server/am/ActivityStackSupervisor$FindTaskResult;
+Lcom/android/server/am/ActivityStackSupervisor;
+Lcom/android/server/am/ActivityStartInterceptor;
+Lcom/android/server/am/ActivityStarter;
+Lcom/android/server/am/AppErrorDialog$Data;
+Lcom/android/server/am/AppErrorDialog;
+Lcom/android/server/am/AppErrorResult;
+Lcom/android/server/am/AppErrors$BadProcessInfo;
+Lcom/android/server/am/AppErrors;
+Lcom/android/server/am/AppNotRespondingDialog;
+Lcom/android/server/am/BaseErrorDialog;
+Lcom/android/server/am/BatteryExternalStatsWorker$1;
+Lcom/android/server/am/BatteryExternalStatsWorker$2;
+Lcom/android/server/am/BatteryExternalStatsWorker;
+Lcom/android/server/am/BatteryStatsService$WakeupReasonThread;
+Lcom/android/server/am/BatteryStatsService;
+Lcom/android/server/am/BroadcastQueue$BroadcastHandler;
+Lcom/android/server/am/BroadcastQueue;
+Lcom/android/server/am/BroadcastRecord;
+Lcom/android/server/am/CompatModePackages$CompatHandler;
+Lcom/android/server/am/CompatModePackages;
+Lcom/android/server/am/ConfigurationContainer;
+Lcom/android/server/am/InstrumentationReporter;
+Lcom/android/server/am/KeyguardController;
+Lcom/android/server/am/ProcessList;
+Lcom/android/server/am/ProcessRecord;
+Lcom/android/server/am/ProcessStatsService$1;
+Lcom/android/server/am/ProcessStatsService;
+Lcom/android/server/am/ProviderMap;
+Lcom/android/server/am/RecentTasks$1;
+Lcom/android/server/am/RecentTasks;
+Lcom/android/server/am/ServiceRecord;
+Lcom/android/server/am/TaskChangeNotificationController$MainHandler;
+Lcom/android/server/am/TaskChangeNotificationController$TaskStackConsumer;
+Lcom/android/server/am/TaskChangeNotificationController;
+Lcom/android/server/am/TaskPersister$LazyTaskWriterThread;
+Lcom/android/server/am/TaskPersister;
+Lcom/android/server/am/TaskRecord;
+Lcom/android/server/am/UidRecord$ChangeItem;
+Lcom/android/server/am/UserController$Injector;
+Lcom/android/server/am/UserController;
+Lcom/android/server/am/UserState;
+Lcom/android/server/am/VrController$1;
+Lcom/android/server/am/VrController;
+Lcom/android/server/connectivity/Vpn;
+Lcom/android/server/connectivity/tethering/OffloadHardwareInterface;
+Lcom/android/server/display/DisplayAdapter$1;
+Lcom/android/server/display/DisplayAdapter$2;
+Lcom/android/server/display/DisplayAdapter$Listener;
+Lcom/android/server/display/DisplayAdapter;
+Lcom/android/server/display/DisplayDevice;
+Lcom/android/server/display/DisplayDeviceInfo;
+Lcom/android/server/display/DisplayManagerService$BinderService;
+Lcom/android/server/display/DisplayManagerService$CallbackRecord;
+Lcom/android/server/display/DisplayManagerService$DisplayAdapterListener;
+Lcom/android/server/display/DisplayManagerService$DisplayManagerHandler;
+Lcom/android/server/display/DisplayManagerService$Injector;
+Lcom/android/server/display/DisplayManagerService$LocalService;
+Lcom/android/server/display/DisplayManagerService$SyncRoot;
+Lcom/android/server/display/DisplayManagerService;
+Lcom/android/server/display/DisplayTransformManager;
+Lcom/android/server/display/LocalDisplayAdapter$DisplayModeRecord;
+Lcom/android/server/display/LocalDisplayAdapter$HotplugDisplayEventReceiver;
+Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice$1;
+Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;
+Lcom/android/server/display/LocalDisplayAdapter;
+Lcom/android/server/display/LogicalDisplay;
+Lcom/android/server/display/PersistentDataStore$DisplayState;
+Lcom/android/server/display/PersistentDataStore;
+Lcom/android/server/firewall/AndFilter$1;
+Lcom/android/server/firewall/AndFilter;
+Lcom/android/server/firewall/CategoryFilter$1;
+Lcom/android/server/firewall/CategoryFilter;
+Lcom/android/server/firewall/Filter;
+Lcom/android/server/firewall/FilterFactory;
+Lcom/android/server/firewall/FilterList;
+Lcom/android/server/firewall/IntentFirewall$AMSInterface;
+Lcom/android/server/firewall/IntentFirewall$FirewallHandler;
+Lcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;
+Lcom/android/server/firewall/IntentFirewall$RuleObserver;
+Lcom/android/server/firewall/IntentFirewall;
+Lcom/android/server/firewall/NotFilter$1;
+Lcom/android/server/firewall/NotFilter;
+Lcom/android/server/firewall/OrFilter$1;
+Lcom/android/server/firewall/OrFilter;
+Lcom/android/server/firewall/PortFilter$1;
+Lcom/android/server/firewall/PortFilter;
+Lcom/android/server/firewall/SenderFilter$1;
+Lcom/android/server/firewall/SenderFilter$2;
+Lcom/android/server/firewall/SenderFilter$3;
+Lcom/android/server/firewall/SenderFilter$4;
+Lcom/android/server/firewall/SenderFilter$5;
+Lcom/android/server/firewall/SenderFilter;
+Lcom/android/server/firewall/SenderPackageFilter$1;
+Lcom/android/server/firewall/SenderPackageFilter;
+Lcom/android/server/firewall/SenderPermissionFilter$1;
+Lcom/android/server/firewall/SenderPermissionFilter;
+Lcom/android/server/firewall/StringFilter$10;
+Lcom/android/server/firewall/StringFilter$1;
+Lcom/android/server/firewall/StringFilter$2;
+Lcom/android/server/firewall/StringFilter$3;
+Lcom/android/server/firewall/StringFilter$4;
+Lcom/android/server/firewall/StringFilter$5;
+Lcom/android/server/firewall/StringFilter$6;
+Lcom/android/server/firewall/StringFilter$7;
+Lcom/android/server/firewall/StringFilter$8;
+Lcom/android/server/firewall/StringFilter$9;
+Lcom/android/server/firewall/StringFilter$ValueProvider;
+Lcom/android/server/firewall/StringFilter;
+Lcom/android/server/hdmi/HdmiCecController;
+Lcom/android/server/input/InputApplicationHandle;
+Lcom/android/server/input/InputManagerService;
+Lcom/android/server/input/InputWindowHandle;
+Lcom/android/server/lights/Light;
+Lcom/android/server/lights/LightsManager;
+Lcom/android/server/lights/LightsService$1;
+Lcom/android/server/lights/LightsService$2;
+Lcom/android/server/lights/LightsService$LightImpl;
+Lcom/android/server/lights/LightsService;
+Lcom/android/server/location/ContextHubService;
+Lcom/android/server/location/GnssLocationProvider;
+Lcom/android/server/location/LocationProviderInterface;
+Lcom/android/server/locksettings/SyntheticPasswordManager;
+Lcom/android/server/os/DeviceIdentifiersPolicyService$DeviceIdentifiersPolicy;
+Lcom/android/server/os/DeviceIdentifiersPolicyService;
+Lcom/android/server/pm/AbstractStatsBase;
+Lcom/android/server/pm/BasePermission;
+Lcom/android/server/pm/CompilerStats;
+Lcom/android/server/pm/DefaultPermissionGrantPolicy$1;
+Lcom/android/server/pm/DefaultPermissionGrantPolicy;
+Lcom/android/server/pm/Installer$1;
+Lcom/android/server/pm/Installer$InstallerException;
+Lcom/android/server/pm/Installer;
+Lcom/android/server/pm/InstantAppRegistry$CookiePersistence;
+Lcom/android/server/pm/InstantAppRegistry;
+Lcom/android/server/pm/KeySetManagerService;
+Lcom/android/server/pm/PackageDexOptimizer;
+Lcom/android/server/pm/PackageKeySetData;
+Lcom/android/server/pm/PackageManagerException;
+Lcom/android/server/pm/PackageManagerService$1;
+Lcom/android/server/pm/PackageManagerService$2;
+Lcom/android/server/pm/PackageManagerService$3;
+Lcom/android/server/pm/PackageManagerService$ActivityIntentResolver;
+Lcom/android/server/pm/PackageManagerService$DefaultContainerConnection;
+Lcom/android/server/pm/PackageManagerService$MoveCallbacks;
+Lcom/android/server/pm/PackageManagerService$OnPermissionChangeListeners;
+Lcom/android/server/pm/PackageManagerService$PackageHandler;
+Lcom/android/server/pm/PackageManagerService$PackageParserCallback;
+Lcom/android/server/pm/PackageManagerService$ParallelPackageParserCallback;
+Lcom/android/server/pm/PackageManagerService$PendingPackageBroadcasts;
+Lcom/android/server/pm/PackageManagerService$ProviderIntentResolver;
+Lcom/android/server/pm/PackageManagerService$ServiceIntentResolver;
+Lcom/android/server/pm/PackageManagerService$SharedLibraryEntry;
+Lcom/android/server/pm/PackageManagerService;
+Lcom/android/server/pm/PackageManagerServiceCompilerMapping;
+Lcom/android/server/pm/PackageSender;
+Lcom/android/server/pm/PackageSetting;
+Lcom/android/server/pm/PackageSettingBase;
+Lcom/android/server/pm/PackageSignatures;
+Lcom/android/server/pm/PackageUsage;
+Lcom/android/server/pm/PermissionsState$PermissionData;
+Lcom/android/server/pm/PermissionsState$PermissionState;
+Lcom/android/server/pm/PermissionsState;
+Lcom/android/server/pm/Policy$PolicyBuilder;
+Lcom/android/server/pm/Policy;
+Lcom/android/server/pm/PolicyComparator;
+Lcom/android/server/pm/ProcessLoggingHandler;
+Lcom/android/server/pm/ProtectedPackages;
+Lcom/android/server/pm/SELinuxMMAC;
+Lcom/android/server/pm/SettingBase;
+Lcom/android/server/pm/Settings$RuntimePermissionPersistence$MyHandler;
+Lcom/android/server/pm/Settings$RuntimePermissionPersistence;
+Lcom/android/server/pm/Settings$VersionInfo;
+Lcom/android/server/pm/Settings;
+Lcom/android/server/pm/SharedUserSetting;
+Lcom/android/server/pm/UserDataPreparer;
+Lcom/android/server/pm/UserManagerService$1;
+Lcom/android/server/pm/UserManagerService$LocalService;
+Lcom/android/server/pm/UserManagerService$MainHandler;
+Lcom/android/server/pm/UserManagerService$UserData;
+Lcom/android/server/pm/UserManagerService;
+Lcom/android/server/pm/UserRestrictionsUtils;
+Lcom/android/server/pm/dex/DexManager;
+Lcom/android/server/pm/dex/PackageDexUsage;
+Lcom/android/server/power/BatterySaverPolicy;
+Lcom/android/server/power/PowerManagerService$1;
+Lcom/android/server/power/PowerManagerService$2;
+Lcom/android/server/power/PowerManagerService$BinderService;
+Lcom/android/server/power/PowerManagerService$Constants;
+Lcom/android/server/power/PowerManagerService$LocalService;
+Lcom/android/server/power/PowerManagerService$PowerManagerHandler;
+Lcom/android/server/power/PowerManagerService$SuspendBlockerImpl;
+Lcom/android/server/power/PowerManagerService;
+Lcom/android/server/power/SuspendBlocker;
+Lcom/android/server/radio/RadioService;
+Lcom/android/server/radio/Tuner;
+Lcom/android/server/radio/TunerCallback;
+Lcom/android/server/storage/AppFuseBridge;
+Lcom/android/server/tv/TvInputHal;
+Lcom/android/server/tv/UinputBridge;
+Lcom/android/server/usb/UsbDeviceManager;
+Lcom/android/server/usb/UsbHostManager;
+Lcom/android/server/usb/UsbMidiDevice;
+Lcom/android/server/vr/EnabledComponentsObserver$EnabledComponentChangeListener;
+Lcom/android/server/vr/VrManagerService;
+Lcom/android/server/wm/AppWindowContainerListener;
+Lcom/android/server/wm/TaskWindowContainerListener;
+Lcom/android/server/wm/WindowContainerListener;
+PLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint$Proxy;-><init>(Landroid/os/IHwBinder;)V
+PLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint$Proxy;->asBinder()Landroid/os/IHwBinder;
+PLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint$Proxy;->interfaceChain()Ljava/util/ArrayList;
+PLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint$Proxy;->setActiveGroup(ILjava/lang/String;)I
+PLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint$Proxy;->setNotify(Landroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;)J
+PLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->asInterface(Landroid/os/IHwBinder;)Landroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;
+PLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->getService()Landroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;
+PLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback$Stub;-><init>()V
+PLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback$Stub;->asBinder()Landroid/os/IHwBinder;
+PLandroid/hardware/oemlock/V1_0/IOemLock;->getService()Landroid/hardware/oemlock/V1_0/IOemLock;
+PLandroid/hardware/usb/V1_0/IUsb$Proxy;-><init>(Landroid/os/IHwBinder;)V
+PLandroid/hardware/usb/V1_0/IUsb$Proxy;->interfaceChain()Ljava/util/ArrayList;
+PLandroid/hardware/usb/V1_0/IUsb$Proxy;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+PLandroid/hardware/usb/V1_0/IUsb$Proxy;->queryPortStatus()V
+PLandroid/hardware/usb/V1_0/IUsb$Proxy;->setCallback(Landroid/hardware/usb/V1_0/IUsbCallback;)V
+PLandroid/hardware/usb/V1_0/IUsb;->asInterface(Landroid/os/IHwBinder;)Landroid/hardware/usb/V1_0/IUsb;
+PLandroid/hardware/usb/V1_0/IUsb;->getService()Landroid/hardware/usb/V1_0/IUsb;
+PLandroid/hardware/usb/V1_0/PortStatus;-><init>()V
+PLandroid/hardware/usb/V1_0/PortStatus;->readEmbeddedFromParcel(Landroid/os/HwParcel;Landroid/os/HwBlob;J)V
+PLandroid/hardware/usb/V1_1/IUsbCallback$Stub;-><init>()V
+PLandroid/hardware/usb/V1_1/IUsbCallback$Stub;->asBinder()Landroid/os/IHwBinder;
+PLandroid/hardware/usb/V1_1/IUsbCallback$Stub;->interfaceChain()Ljava/util/ArrayList;
+PLandroid/hardware/usb/V1_1/IUsbCallback$Stub;->onTransact(ILandroid/os/HwParcel;Landroid/os/HwParcel;I)V
+PLandroid/hardware/usb/V1_1/PortStatus_1_1;-><init>()V
+PLandroid/hardware/usb/V1_1/PortStatus_1_1;->readEmbeddedFromParcel(Landroid/os/HwParcel;Landroid/os/HwBlob;J)V
+PLandroid/hardware/usb/V1_1/PortStatus_1_1;->readVectorFromParcel(Landroid/os/HwParcel;)Ljava/util/ArrayList;
+PLandroid/hardware/weaver/V1_0/IWeaver;->getService()Landroid/hardware/weaver/V1_0/IWeaver;
+PLandroid/hardware/wifi/V1_0/IWifi$Proxy;-><init>(Landroid/os/IHwBinder;)V
+PLandroid/hardware/wifi/V1_0/IWifi$Proxy;->getChip(ILandroid/hardware/wifi/V1_0/IWifi$getChipCallback;)V
+PLandroid/hardware/wifi/V1_0/IWifi$Proxy;->getChipIds(Landroid/hardware/wifi/V1_0/IWifi$getChipIdsCallback;)V
+PLandroid/hardware/wifi/V1_0/IWifi$Proxy;->interfaceChain()Ljava/util/ArrayList;
+PLandroid/hardware/wifi/V1_0/IWifi$Proxy;->isStarted()Z
+PLandroid/hardware/wifi/V1_0/IWifi$Proxy;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+PLandroid/hardware/wifi/V1_0/IWifi$Proxy;->registerEventCallback(Landroid/hardware/wifi/V1_0/IWifiEventCallback;)Landroid/hardware/wifi/V1_0/WifiStatus;
+PLandroid/hardware/wifi/V1_0/IWifi$Proxy;->start()Landroid/hardware/wifi/V1_0/WifiStatus;
+PLandroid/hardware/wifi/V1_0/IWifi$Proxy;->stop()Landroid/hardware/wifi/V1_0/WifiStatus;
+PLandroid/hardware/wifi/V1_0/IWifi;->asInterface(Landroid/os/IHwBinder;)Landroid/hardware/wifi/V1_0/IWifi;
+PLandroid/hardware/wifi/V1_0/IWifi;->getService()Landroid/hardware/wifi/V1_0/IWifi;
+PLandroid/hardware/wifi/V1_0/IWifiChip$ChipDebugInfo;-><init>()V
+PLandroid/hardware/wifi/V1_0/IWifiChip$ChipDebugInfo;->readEmbeddedFromParcel(Landroid/os/HwParcel;Landroid/os/HwBlob;J)V
+PLandroid/hardware/wifi/V1_0/IWifiChip$ChipDebugInfo;->readFromParcel(Landroid/os/HwParcel;)V
+PLandroid/hardware/wifi/V1_0/IWifiChip$ChipIfaceCombination;-><init>()V
+PLandroid/hardware/wifi/V1_0/IWifiChip$ChipIfaceCombination;->readEmbeddedFromParcel(Landroid/os/HwParcel;Landroid/os/HwBlob;J)V
+PLandroid/hardware/wifi/V1_0/IWifiChip$ChipIfaceCombinationLimit;-><init>()V
+PLandroid/hardware/wifi/V1_0/IWifiChip$ChipIfaceCombinationLimit;->readEmbeddedFromParcel(Landroid/os/HwParcel;Landroid/os/HwBlob;J)V
+PLandroid/hardware/wifi/V1_0/IWifiChip$ChipMode;-><init>()V
+PLandroid/hardware/wifi/V1_0/IWifiChip$ChipMode;->readEmbeddedFromParcel(Landroid/os/HwParcel;Landroid/os/HwBlob;J)V
+PLandroid/hardware/wifi/V1_0/IWifiChip$ChipMode;->readVectorFromParcel(Landroid/os/HwParcel;)Ljava/util/ArrayList;
+PLandroid/hardware/wifi/V1_0/IWifiChip$Proxy;-><init>(Landroid/os/IHwBinder;)V
+PLandroid/hardware/wifi/V1_0/IWifiChip$Proxy;->configureChip(I)Landroid/hardware/wifi/V1_0/WifiStatus;
+PLandroid/hardware/wifi/V1_0/IWifiChip$Proxy;->createRttController(Landroid/hardware/wifi/V1_0/IWifiIface;Landroid/hardware/wifi/V1_0/IWifiChip$createRttControllerCallback;)V
+PLandroid/hardware/wifi/V1_0/IWifiChip$Proxy;->createStaIface(Landroid/hardware/wifi/V1_0/IWifiChip$createStaIfaceCallback;)V
+PLandroid/hardware/wifi/V1_0/IWifiChip$Proxy;->enableDebugErrorAlerts(Z)Landroid/hardware/wifi/V1_0/WifiStatus;
+PLandroid/hardware/wifi/V1_0/IWifiChip$Proxy;->getApIfaceNames(Landroid/hardware/wifi/V1_0/IWifiChip$getApIfaceNamesCallback;)V
+PLandroid/hardware/wifi/V1_0/IWifiChip$Proxy;->getAvailableModes(Landroid/hardware/wifi/V1_0/IWifiChip$getAvailableModesCallback;)V
+PLandroid/hardware/wifi/V1_0/IWifiChip$Proxy;->getDebugRingBuffersStatus(Landroid/hardware/wifi/V1_0/IWifiChip$getDebugRingBuffersStatusCallback;)V
+PLandroid/hardware/wifi/V1_0/IWifiChip$Proxy;->getMode(Landroid/hardware/wifi/V1_0/IWifiChip$getModeCallback;)V
+PLandroid/hardware/wifi/V1_0/IWifiChip$Proxy;->getNanIfaceNames(Landroid/hardware/wifi/V1_0/IWifiChip$getNanIfaceNamesCallback;)V
+PLandroid/hardware/wifi/V1_0/IWifiChip$Proxy;->getP2pIfaceNames(Landroid/hardware/wifi/V1_0/IWifiChip$getP2pIfaceNamesCallback;)V
+PLandroid/hardware/wifi/V1_0/IWifiChip$Proxy;->getStaIface(Ljava/lang/String;Landroid/hardware/wifi/V1_0/IWifiChip$getStaIfaceCallback;)V
+PLandroid/hardware/wifi/V1_0/IWifiChip$Proxy;->getStaIfaceNames(Landroid/hardware/wifi/V1_0/IWifiChip$getStaIfaceNamesCallback;)V
+PLandroid/hardware/wifi/V1_0/IWifiChip$Proxy;->interfaceChain()Ljava/util/ArrayList;
+PLandroid/hardware/wifi/V1_0/IWifiChip$Proxy;->registerEventCallback(Landroid/hardware/wifi/V1_0/IWifiChipEventCallback;)Landroid/hardware/wifi/V1_0/WifiStatus;
+PLandroid/hardware/wifi/V1_0/IWifiChip$Proxy;->requestChipDebugInfo(Landroid/hardware/wifi/V1_0/IWifiChip$requestChipDebugInfoCallback;)V
+PLandroid/hardware/wifi/V1_0/IWifiChip$Proxy;->startLoggingToDebugRingBuffer(Ljava/lang/String;III)Landroid/hardware/wifi/V1_0/WifiStatus;
+PLandroid/hardware/wifi/V1_0/IWifiChip;->asInterface(Landroid/os/IHwBinder;)Landroid/hardware/wifi/V1_0/IWifiChip;
+PLandroid/hardware/wifi/V1_0/IWifiChipEventCallback$Stub;-><init>()V
+PLandroid/hardware/wifi/V1_0/IWifiChipEventCallback$Stub;->asBinder()Landroid/os/IHwBinder;
+PLandroid/hardware/wifi/V1_0/IWifiEventCallback$Stub;-><init>()V
+PLandroid/hardware/wifi/V1_0/IWifiEventCallback$Stub;->asBinder()Landroid/os/IHwBinder;
+PLandroid/hardware/wifi/V1_0/IWifiEventCallback$Stub;->onTransact(ILandroid/os/HwParcel;Landroid/os/HwParcel;I)V
+PLandroid/hardware/wifi/V1_0/IWifiRttController$Proxy;-><init>(Landroid/os/IHwBinder;)V
+PLandroid/hardware/wifi/V1_0/IWifiRttController$Proxy;->interfaceChain()Ljava/util/ArrayList;
+PLandroid/hardware/wifi/V1_0/IWifiRttController$Proxy;->registerEventCallback(Landroid/hardware/wifi/V1_0/IWifiRttControllerEventCallback;)Landroid/hardware/wifi/V1_0/WifiStatus;
+PLandroid/hardware/wifi/V1_0/IWifiRttController;->asInterface(Landroid/os/IHwBinder;)Landroid/hardware/wifi/V1_0/IWifiRttController;
+PLandroid/hardware/wifi/V1_0/IWifiRttControllerEventCallback$Stub;-><init>()V
+PLandroid/hardware/wifi/V1_0/IWifiRttControllerEventCallback$Stub;->asBinder()Landroid/os/IHwBinder;
+PLandroid/hardware/wifi/V1_0/IWifiStaIface$Proxy;-><init>(Landroid/os/IHwBinder;)V
+PLandroid/hardware/wifi/V1_0/IWifiStaIface$Proxy;->asBinder()Landroid/os/IHwBinder;
+PLandroid/hardware/wifi/V1_0/IWifiStaIface$Proxy;->configureRoaming(Landroid/hardware/wifi/V1_0/StaRoamingConfig;)Landroid/hardware/wifi/V1_0/WifiStatus;
+PLandroid/hardware/wifi/V1_0/IWifiStaIface$Proxy;->enableLinkLayerStatsCollection(Z)Landroid/hardware/wifi/V1_0/WifiStatus;
+PLandroid/hardware/wifi/V1_0/IWifiStaIface$Proxy;->enableNdOffload(Z)Landroid/hardware/wifi/V1_0/WifiStatus;
+PLandroid/hardware/wifi/V1_0/IWifiStaIface$Proxy;->getApfPacketFilterCapabilities(Landroid/hardware/wifi/V1_0/IWifiStaIface$getApfPacketFilterCapabilitiesCallback;)V
+PLandroid/hardware/wifi/V1_0/IWifiStaIface$Proxy;->getBackgroundScanCapabilities(Landroid/hardware/wifi/V1_0/IWifiStaIface$getBackgroundScanCapabilitiesCallback;)V
+PLandroid/hardware/wifi/V1_0/IWifiStaIface$Proxy;->getCapabilities(Landroid/hardware/wifi/V1_0/IWifiStaIface$getCapabilitiesCallback;)V
+PLandroid/hardware/wifi/V1_0/IWifiStaIface$Proxy;->getDebugRxPacketFates(Landroid/hardware/wifi/V1_0/IWifiStaIface$getDebugRxPacketFatesCallback;)V
+PLandroid/hardware/wifi/V1_0/IWifiStaIface$Proxy;->getDebugTxPacketFates(Landroid/hardware/wifi/V1_0/IWifiStaIface$getDebugTxPacketFatesCallback;)V
+PLandroid/hardware/wifi/V1_0/IWifiStaIface$Proxy;->getName(Landroid/hardware/wifi/V1_0/IWifiIface$getNameCallback;)V
+PLandroid/hardware/wifi/V1_0/IWifiStaIface$Proxy;->getRoamingCapabilities(Landroid/hardware/wifi/V1_0/IWifiStaIface$getRoamingCapabilitiesCallback;)V
+PLandroid/hardware/wifi/V1_0/IWifiStaIface$Proxy;->getValidFrequenciesForBand(ILandroid/hardware/wifi/V1_0/IWifiStaIface$getValidFrequenciesForBandCallback;)V
+PLandroid/hardware/wifi/V1_0/IWifiStaIface$Proxy;->installApfPacketFilter(ILjava/util/ArrayList;)Landroid/hardware/wifi/V1_0/WifiStatus;
+PLandroid/hardware/wifi/V1_0/IWifiStaIface$Proxy;->interfaceChain()Ljava/util/ArrayList;
+PLandroid/hardware/wifi/V1_0/IWifiStaIface$Proxy;->registerEventCallback(Landroid/hardware/wifi/V1_0/IWifiStaIfaceEventCallback;)Landroid/hardware/wifi/V1_0/WifiStatus;
+PLandroid/hardware/wifi/V1_0/IWifiStaIface$Proxy;->setScanningMacOui([B)Landroid/hardware/wifi/V1_0/WifiStatus;
+PLandroid/hardware/wifi/V1_0/IWifiStaIface$Proxy;->startDebugPacketFateMonitoring()Landroid/hardware/wifi/V1_0/WifiStatus;
+PLandroid/hardware/wifi/V1_0/IWifiStaIface$Proxy;->stopRssiMonitoring(I)Landroid/hardware/wifi/V1_0/WifiStatus;
+PLandroid/hardware/wifi/V1_0/IWifiStaIface;->asInterface(Landroid/os/IHwBinder;)Landroid/hardware/wifi/V1_0/IWifiStaIface;
+PLandroid/hardware/wifi/V1_0/IWifiStaIfaceEventCallback$Stub;-><init>()V
+PLandroid/hardware/wifi/V1_0/IWifiStaIfaceEventCallback$Stub;->asBinder()Landroid/os/IHwBinder;
+PLandroid/hardware/wifi/V1_0/StaApfPacketFilterCapabilities;-><init>()V
+PLandroid/hardware/wifi/V1_0/StaApfPacketFilterCapabilities;->readEmbeddedFromParcel(Landroid/os/HwParcel;Landroid/os/HwBlob;J)V
+PLandroid/hardware/wifi/V1_0/StaApfPacketFilterCapabilities;->readFromParcel(Landroid/os/HwParcel;)V
+PLandroid/hardware/wifi/V1_0/StaBackgroundScanCapabilities;-><init>()V
+PLandroid/hardware/wifi/V1_0/StaBackgroundScanCapabilities;->readEmbeddedFromParcel(Landroid/os/HwParcel;Landroid/os/HwBlob;J)V
+PLandroid/hardware/wifi/V1_0/StaBackgroundScanCapabilities;->readFromParcel(Landroid/os/HwParcel;)V
+PLandroid/hardware/wifi/V1_0/StaBackgroundScanCapabilities;->toString()Ljava/lang/String;
+PLandroid/hardware/wifi/V1_0/StaLinkLayerIfacePacketStats;-><init>()V
+PLandroid/hardware/wifi/V1_0/StaLinkLayerIfaceStats;-><init>()V
+PLandroid/hardware/wifi/V1_0/StaLinkLayerIfaceStats;->readEmbeddedFromParcel(Landroid/os/HwParcel;Landroid/os/HwBlob;J)V
+PLandroid/hardware/wifi/V1_0/StaLinkLayerRadioStats;-><init>()V
+PLandroid/hardware/wifi/V1_0/StaLinkLayerStats;-><init>()V
+PLandroid/hardware/wifi/V1_0/StaLinkLayerStats;->readFromParcel(Landroid/os/HwParcel;)V
+PLandroid/hardware/wifi/V1_0/StaRoamingCapabilities;-><init>()V
+PLandroid/hardware/wifi/V1_0/StaRoamingCapabilities;->readEmbeddedFromParcel(Landroid/os/HwParcel;Landroid/os/HwBlob;J)V
+PLandroid/hardware/wifi/V1_0/StaRoamingCapabilities;->readFromParcel(Landroid/os/HwParcel;)V
+PLandroid/hardware/wifi/V1_0/StaRoamingConfig;-><init>()V
+PLandroid/hardware/wifi/V1_0/StaRoamingConfig;->writeEmbeddedToBlob(Landroid/os/HwBlob;J)V
+PLandroid/hardware/wifi/V1_0/StaRoamingConfig;->writeToParcel(Landroid/os/HwParcel;)V
+PLandroid/hardware/wifi/V1_0/WifiDebugPacketFateFrameInfo;-><init>()V
+PLandroid/hardware/wifi/V1_0/WifiDebugRingBufferStatus;->readVectorFromParcel(Landroid/os/HwParcel;)Ljava/util/ArrayList;
+PLandroid/hardware/wifi/V1_0/WifiDebugRxPacketFateReport;-><init>()V
+PLandroid/hardware/wifi/V1_0/WifiDebugRxPacketFateReport;->readEmbeddedFromParcel(Landroid/os/HwParcel;Landroid/os/HwBlob;J)V
+PLandroid/hardware/wifi/V1_0/WifiDebugRxPacketFateReport;->readVectorFromParcel(Landroid/os/HwParcel;)Ljava/util/ArrayList;
+PLandroid/hardware/wifi/V1_0/WifiDebugTxPacketFateReport;-><init>()V
+PLandroid/hardware/wifi/V1_0/WifiDebugTxPacketFateReport;->readEmbeddedFromParcel(Landroid/os/HwParcel;Landroid/os/HwBlob;J)V
+PLandroid/hardware/wifi/V1_0/WifiDebugTxPacketFateReport;->readVectorFromParcel(Landroid/os/HwParcel;)Ljava/util/ArrayList;
+PLandroid/hardware/wifi/V1_0/WifiStatus;-><init>()V
+PLandroid/hardware/wifi/V1_0/WifiStatus;->readFromParcel(Landroid/os/HwParcel;)V
+PLandroid/hardware/wifi/V1_0/WifiStatus;->toString()Ljava/lang/String;
+PLandroid/hardware/wifi/V1_0/WifiStatusCode;->toString(I)Ljava/lang/String;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicant$IfaceInfo;-><init>()V
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicant$IfaceInfo;->readEmbeddedFromParcel(Landroid/os/HwParcel;Landroid/os/HwBlob;J)V
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicant$IfaceInfo;->readVectorFromParcel(Landroid/os/HwParcel;)Ljava/util/ArrayList;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicant$IfaceInfo;->writeEmbeddedToBlob(Landroid/os/HwBlob;J)V
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicant$IfaceInfo;->writeToParcel(Landroid/os/HwParcel;)V
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicant$Proxy;-><init>(Landroid/os/IHwBinder;)V
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicant$Proxy;->getInterface(Landroid/hardware/wifi/supplicant/V1_0/ISupplicant$IfaceInfo;Landroid/hardware/wifi/supplicant/V1_0/ISupplicant$getInterfaceCallback;)V
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicant$Proxy;->interfaceChain()Ljava/util/ArrayList;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicant$Proxy;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicant$Proxy;->listInterfaces(Landroid/hardware/wifi/supplicant/V1_0/ISupplicant$listInterfacesCallback;)V
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicant$Proxy;->setConcurrencyPriority(I)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicant$Proxy;->setDebugParams(IZZ)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicant;->asInterface(Landroid/os/IHwBinder;)Landroid/hardware/wifi/supplicant/V1_0/ISupplicant;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicant;->getService()Landroid/hardware/wifi/supplicant/V1_0/ISupplicant;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantIface$Proxy;-><init>(Landroid/os/IHwBinder;)V
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantIface$Proxy;->asBinder()Landroid/os/IHwBinder;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantIface$Proxy;->interfaceChain()Ljava/util/ArrayList;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantIface$Proxy;->interfaceDescriptor()Ljava/lang/String;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantIface$Proxy;->toString()Ljava/lang/String;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantIface;->asInterface(Landroid/os/IHwBinder;)Landroid/hardware/wifi/supplicant/V1_0/ISupplicantIface;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantNetwork$Proxy;-><init>(Landroid/os/IHwBinder;)V
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantNetwork$Proxy;->asBinder()Landroid/os/IHwBinder;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantNetwork$Proxy;->interfaceChain()Ljava/util/ArrayList;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantNetwork;->asInterface(Landroid/os/IHwBinder;)Landroid/hardware/wifi/supplicant/V1_0/ISupplicantNetwork;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface$Proxy;-><init>(Landroid/os/IHwBinder;)V
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface$Proxy;->flush()Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface$Proxy;->flushServices()Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface$Proxy;->getDeviceAddress(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface$getDeviceAddressCallback;)V
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface$Proxy;->interfaceChain()Ljava/util/ArrayList;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface$Proxy;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface$Proxy;->listNetworks(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantIface$listNetworksCallback;)V
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface$Proxy;->registerCallback(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIfaceCallback;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface$Proxy;->saveConfig()Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface$Proxy;->setSsidPostfix(Ljava/util/ArrayList;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface$Proxy;->setWpsConfigMethods(S)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface$Proxy;->setWpsDeviceName(Ljava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface$Proxy;->setWpsDeviceType([B)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;->asInterface(Landroid/os/IHwBinder;)Landroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIfaceCallback$Stub;-><init>()V
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIfaceCallback$Stub;->asBinder()Landroid/os/IHwBinder;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface$Proxy;-><init>(Landroid/os/IHwBinder;)V
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface$Proxy;->addNetwork(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantIface$addNetworkCallback;)V
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface$Proxy;->addRxFilter(B)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface$Proxy;->disconnect()Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface$Proxy;->enableAutoReconnect(Z)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface$Proxy;->getMacAddress(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface$getMacAddressCallback;)V
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface$Proxy;->interfaceChain()Ljava/util/ArrayList;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface$Proxy;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface$Proxy;->listNetworks(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantIface$listNetworksCallback;)V
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface$Proxy;->registerCallback(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface$Proxy;->setBtCoexistenceMode(B)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface$Proxy;->setBtCoexistenceScanModeEnabled(Z)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface$Proxy;->setCountryCode([B)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface$Proxy;->setExternalSim(Z)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface$Proxy;->setPowerSave(Z)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface$Proxy;->setSuspendModeEnabled(Z)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface$Proxy;->setWpsConfigMethods(S)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface$Proxy;->setWpsDeviceName(Ljava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface$Proxy;->setWpsDeviceType([B)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface$Proxy;->setWpsManufacturer(Ljava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface$Proxy;->setWpsModelName(Ljava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface$Proxy;->setWpsModelNumber(Ljava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface$Proxy;->setWpsSerialNumber(Ljava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface$Proxy;->startRxFilter()Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface$Proxy;->stopRxFilter()Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->asInterface(Landroid/os/IHwBinder;)Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback$Stub;-><init>()V
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback$Stub;->asBinder()Landroid/os/IHwBinder;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback$Stub;->onTransact(ILandroid/os/HwParcel;Landroid/os/HwParcel;I)V
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$Proxy;-><init>(Landroid/os/IHwBinder;)V
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$Proxy;->interfaceChain()Ljava/util/ArrayList;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$Proxy;->registerCallback(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$Proxy;->select()Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$Proxy;->setAuthAlg(I)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$Proxy;->setBssid([B)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$Proxy;->setGroupCipher(I)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$Proxy;->setIdStr(Ljava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$Proxy;->setKeyMgmt(I)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$Proxy;->setPairwiseCipher(I)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$Proxy;->setProto(I)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$Proxy;->setRequirePmf(Z)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$Proxy;->setScanSsid(Z)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$Proxy;->setSsid(Ljava/util/ArrayList;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->asInterface(Landroid/os/IHwBinder;)Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback$Stub;-><init>()V
+PLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback$Stub;->asBinder()Landroid/os/IHwBinder;
+PLandroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;-><init>()V
+PLandroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;->readEmbeddedFromParcel(Landroid/os/HwParcel;Landroid/os/HwBlob;J)V
+PLandroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;->readFromParcel(Landroid/os/HwParcel;)V
+PLandroid/net/apf/ApfCapabilities;-><init>(III)V
+PLandroid/net/apf/ApfCapabilities;->toString()Ljava/lang/String;
+PLandroid/net/apf/ApfFilter$ProcessRaResult;-><init>(Ljava/lang/String;I)V
+PLandroid/net/apf/ApfFilter$ProcessRaResult;->values()[Landroid/net/apf/ApfFilter$ProcessRaResult;
+PLandroid/net/apf/ApfFilter$Ra;-><init>(Landroid/net/apf/ApfFilter;[BI)V
+PLandroid/net/apf/ApfFilter$Ra;->IPv6AddresstoString(I)Ljava/lang/String;
+PLandroid/net/apf/ApfFilter$Ra;->addNonLifetime(III)I
+PLandroid/net/apf/ApfFilter$Ra;->addNonLifetimeU32(I)I
+PLandroid/net/apf/ApfFilter$Ra;->currentLifetime()J
+PLandroid/net/apf/ApfFilter$Ra;->generateFilterLocked(Landroid/net/apf/ApfGenerator;)J
+PLandroid/net/apf/ApfFilter$Ra;->isExpired()Z
+PLandroid/net/apf/ApfFilter$Ra;->minLifetime([BI)J
+PLandroid/net/apf/ApfFilter$Ra;->prefixOptionToString(Ljava/lang/StringBuffer;I)V
+PLandroid/net/apf/ApfFilter$Ra;->rdnssOptionToString(Ljava/lang/StringBuffer;I)V
+PLandroid/net/apf/ApfFilter$Ra;->toString()Ljava/lang/String;
+PLandroid/net/apf/ApfFilter$ReceiveThread;->-getandroid-net-apf-ApfFilter$ProcessRaResultSwitchesValues()[I
+PLandroid/net/apf/ApfFilter$ReceiveThread;-><init>(Landroid/net/apf/ApfFilter;Ljava/io/FileDescriptor;)V
+PLandroid/net/apf/ApfFilter$ReceiveThread;->run()V
+PLandroid/net/apf/ApfFilter$ReceiveThread;->updateStats(Landroid/net/apf/ApfFilter$ProcessRaResult;)V
+PLandroid/net/apf/ApfFilter;->-get1(Landroid/net/apf/ApfFilter;)Landroid/net/metrics/IpConnectivityLog;
+PLandroid/net/apf/ApfFilter;->-wrap0(Landroid/net/apf/ApfFilter;)J
+PLandroid/net/apf/ApfFilter;->-wrap2(Landroid/net/apf/ApfFilter;Ljava/lang/String;)V
+PLandroid/net/apf/ApfFilter;-><init>(Landroid/net/apf/ApfCapabilities;Ljava/net/NetworkInterface;Landroid/net/ip/IpManager$Callback;ZLandroid/net/metrics/IpConnectivityLog;)V
+PLandroid/net/apf/ApfFilter;->beginProgramLocked()Landroid/net/apf/ApfGenerator;
+PLandroid/net/apf/ApfFilter;->currentTimeSeconds()J
+PLandroid/net/apf/ApfFilter;->findIPv4LinkAddress(Landroid/net/LinkProperties;)Landroid/net/LinkAddress;
+PLandroid/net/apf/ApfFilter;->generateArpFilterLocked(Landroid/net/apf/ApfGenerator;)V
+PLandroid/net/apf/ApfFilter;->generateIPv4FilterLocked(Landroid/net/apf/ApfGenerator;)V
+PLandroid/net/apf/ApfFilter;->generateIPv6FilterLocked(Landroid/net/apf/ApfGenerator;)V
+PLandroid/net/apf/ApfFilter;->getUniqueNumberLocked()J
+PLandroid/net/apf/ApfFilter;->installNewProgramLocked()V
+PLandroid/net/apf/ApfFilter;->ipv4BroadcastAddress([BI)I
+PLandroid/net/apf/ApfFilter;->log(Ljava/lang/String;)V
+PLandroid/net/apf/ApfFilter;->logApfProgramEventLocked(J)V
+PLandroid/net/apf/ApfFilter;->maybeCreate(Landroid/net/apf/ApfCapabilities;Ljava/net/NetworkInterface;Landroid/net/ip/IpManager$Callback;Z)Landroid/net/apf/ApfFilter;
+PLandroid/net/apf/ApfFilter;->maybeStartFilter()V
+PLandroid/net/apf/ApfFilter;->processRa([BI)Landroid/net/apf/ApfFilter$ProcessRaResult;
+PLandroid/net/apf/ApfFilter;->purgeExpiredRasLocked()V
+PLandroid/net/apf/ApfFilter;->setLinkProperties(Landroid/net/LinkProperties;)V
+PLandroid/net/apf/ApfFilter;->setMulticastFilter(Z)V
+PLandroid/net/apf/ApfFilter;->shouldInstallnewProgram()Z
+PLandroid/net/apf/ApfGenerator$ExtendedOpcodes;-><init>(Ljava/lang/String;II)V
+PLandroid/net/apf/ApfGenerator$Instruction;-><init>(Landroid/net/apf/ApfGenerator;Landroid/net/apf/ApfGenerator$Opcodes;)V
+PLandroid/net/apf/ApfGenerator$Instruction;-><init>(Landroid/net/apf/ApfGenerator;Landroid/net/apf/ApfGenerator$Opcodes;Landroid/net/apf/ApfGenerator$Register;)V
+PLandroid/net/apf/ApfGenerator$Instruction;->calculateImmSize(IZ)B
+PLandroid/net/apf/ApfGenerator$Instruction;->generate([B)V
+PLandroid/net/apf/ApfGenerator$Instruction;->generateImmSizeField()B
+PLandroid/net/apf/ApfGenerator$Instruction;->generateInstructionByte()B
+PLandroid/net/apf/ApfGenerator$Instruction;->setCompareBytes([B)V
+PLandroid/net/apf/ApfGenerator$Instruction;->setImm(IZ)V
+PLandroid/net/apf/ApfGenerator$Instruction;->setLabel(Ljava/lang/String;)V
+PLandroid/net/apf/ApfGenerator$Instruction;->setSignedImm(I)V
+PLandroid/net/apf/ApfGenerator$Instruction;->setTargetLabel(Ljava/lang/String;)V
+PLandroid/net/apf/ApfGenerator$Instruction;->setUnsignedImm(I)V
+PLandroid/net/apf/ApfGenerator$Instruction;->writeValue(I[BI)I
+PLandroid/net/apf/ApfGenerator$Opcodes;-><init>(Ljava/lang/String;II)V
+PLandroid/net/apf/ApfGenerator$Register;-><init>(Ljava/lang/String;II)V
+PLandroid/net/apf/ApfGenerator;->-get0(Landroid/net/apf/ApfGenerator;)Landroid/net/apf/ApfGenerator$Instruction;
+PLandroid/net/apf/ApfGenerator;->-get1(Landroid/net/apf/ApfGenerator;)Ljava/util/HashMap;
+PLandroid/net/apf/ApfGenerator;->-get2(Landroid/net/apf/ApfGenerator;)Landroid/net/apf/ApfGenerator$Instruction;
+PLandroid/net/apf/ApfGenerator;-><init>()V
+PLandroid/net/apf/ApfGenerator;->addAddR1()Landroid/net/apf/ApfGenerator;
+PLandroid/net/apf/ApfGenerator;->addAnd(I)Landroid/net/apf/ApfGenerator;
+PLandroid/net/apf/ApfGenerator;->addInstruction(Landroid/net/apf/ApfGenerator$Instruction;)V
+PLandroid/net/apf/ApfGenerator;->addJump(Ljava/lang/String;)Landroid/net/apf/ApfGenerator;
+PLandroid/net/apf/ApfGenerator;->addJumpIfBytesNotEqual(Landroid/net/apf/ApfGenerator$Register;[BLjava/lang/String;)Landroid/net/apf/ApfGenerator;
+PLandroid/net/apf/ApfGenerator;->addJumpIfR0AnyBitsSet(ILjava/lang/String;)Landroid/net/apf/ApfGenerator;
+PLandroid/net/apf/ApfGenerator;->addJumpIfR0Equals(ILjava/lang/String;)Landroid/net/apf/ApfGenerator;
+PLandroid/net/apf/ApfGenerator;->addJumpIfR0GreaterThan(ILjava/lang/String;)Landroid/net/apf/ApfGenerator;
+PLandroid/net/apf/ApfGenerator;->addJumpIfR0LessThan(ILjava/lang/String;)Landroid/net/apf/ApfGenerator;
+PLandroid/net/apf/ApfGenerator;->addJumpIfR0NotEquals(ILjava/lang/String;)Landroid/net/apf/ApfGenerator;
+PLandroid/net/apf/ApfGenerator;->addLoad16(Landroid/net/apf/ApfGenerator$Register;I)Landroid/net/apf/ApfGenerator;
+PLandroid/net/apf/ApfGenerator;->addLoad16Indexed(Landroid/net/apf/ApfGenerator$Register;I)Landroid/net/apf/ApfGenerator;
+PLandroid/net/apf/ApfGenerator;->addLoad32(Landroid/net/apf/ApfGenerator$Register;I)Landroid/net/apf/ApfGenerator;
+PLandroid/net/apf/ApfGenerator;->addLoad8(Landroid/net/apf/ApfGenerator$Register;I)Landroid/net/apf/ApfGenerator;
+PLandroid/net/apf/ApfGenerator;->addLoadFromMemory(Landroid/net/apf/ApfGenerator$Register;I)Landroid/net/apf/ApfGenerator;
+PLandroid/net/apf/ApfGenerator;->addLoadImmediate(Landroid/net/apf/ApfGenerator$Register;I)Landroid/net/apf/ApfGenerator;
+PLandroid/net/apf/ApfGenerator;->defineLabel(Ljava/lang/String;)Landroid/net/apf/ApfGenerator;
+PLandroid/net/apf/ApfGenerator;->programLengthOverEstimate()I
+PLandroid/net/apf/ApfGenerator;->setApfVersion(I)Z
+PLandroid/net/dhcp/DhcpAckPacket;-><init>(ISZLjava/net/Inet4Address;Ljava/net/Inet4Address;Ljava/net/Inet4Address;[B)V
+PLandroid/net/dhcp/DhcpAckPacket;->toString()Ljava/lang/String;
+PLandroid/net/dhcp/DhcpClient$ConfiguringInterfaceState;-><init>(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient$ConfiguringInterfaceState;->enter()V
+PLandroid/net/dhcp/DhcpClient$ConfiguringInterfaceState;->processMessage(Landroid/os/Message;)Z
+PLandroid/net/dhcp/DhcpClient$DhcpBoundState;-><init>(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient$DhcpBoundState;->enter()V
+PLandroid/net/dhcp/DhcpClient$DhcpBoundState;->logTimeToBoundState()V
+PLandroid/net/dhcp/DhcpClient$DhcpHaveLeaseState;-><init>(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient$DhcpHaveLeaseState;->processMessage(Landroid/os/Message;)Z
+PLandroid/net/dhcp/DhcpClient$DhcpInitRebootState;-><init>(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient$DhcpInitState;-><init>(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient$DhcpInitState;->enter()V
+PLandroid/net/dhcp/DhcpClient$DhcpInitState;->receivePacket(Landroid/net/dhcp/DhcpPacket;)V
+PLandroid/net/dhcp/DhcpClient$DhcpInitState;->sendPacket()Z
+PLandroid/net/dhcp/DhcpClient$DhcpReacquiringState;-><init>(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient$DhcpRebindingState;-><init>(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient$DhcpRebootingState;-><init>(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient$DhcpRenewingState;-><init>(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient$DhcpRequestingState;-><init>(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient$DhcpRequestingState;->receivePacket(Landroid/net/dhcp/DhcpPacket;)V
+PLandroid/net/dhcp/DhcpClient$DhcpRequestingState;->sendPacket()Z
+PLandroid/net/dhcp/DhcpClient$DhcpSelectingState;-><init>(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient$DhcpState;-><init>(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient$DhcpState;->enter()V
+PLandroid/net/dhcp/DhcpClient$DhcpState;->processMessage(Landroid/os/Message;)Z
+PLandroid/net/dhcp/DhcpClient$LoggingState;-><init>(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient$LoggingState;->enter()V
+PLandroid/net/dhcp/DhcpClient$LoggingState;->exit()V
+PLandroid/net/dhcp/DhcpClient$LoggingState;->getName()Ljava/lang/String;
+PLandroid/net/dhcp/DhcpClient$LoggingState;->processMessage(Landroid/os/Message;)Z
+PLandroid/net/dhcp/DhcpClient$PacketRetransmittingState;-><init>(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient$PacketRetransmittingState;->enter()V
+PLandroid/net/dhcp/DhcpClient$PacketRetransmittingState;->exit()V
+PLandroid/net/dhcp/DhcpClient$PacketRetransmittingState;->initTimer()V
+PLandroid/net/dhcp/DhcpClient$PacketRetransmittingState;->jitterTimer(I)I
+PLandroid/net/dhcp/DhcpClient$PacketRetransmittingState;->maybeInitTimeout()V
+PLandroid/net/dhcp/DhcpClient$PacketRetransmittingState;->processMessage(Landroid/os/Message;)Z
+PLandroid/net/dhcp/DhcpClient$PacketRetransmittingState;->scheduleKick()V
+PLandroid/net/dhcp/DhcpClient$ReceiveThread;-><init>(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient$ReceiveThread;->run()V
+PLandroid/net/dhcp/DhcpClient$StoppedState;-><init>(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient$StoppedState;->processMessage(Landroid/os/Message;)Z
+PLandroid/net/dhcp/DhcpClient$WaitBeforeOtherState;-><init>(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient$WaitBeforeOtherState;->enter()V
+PLandroid/net/dhcp/DhcpClient$WaitBeforeOtherState;->processMessage(Landroid/os/Message;)Z
+PLandroid/net/dhcp/DhcpClient$WaitBeforeRenewalState;-><init>(Landroid/net/dhcp/DhcpClient;Lcom/android/internal/util/State;)V
+PLandroid/net/dhcp/DhcpClient$WaitBeforeStartState;-><init>(Landroid/net/dhcp/DhcpClient;Lcom/android/internal/util/State;)V
+PLandroid/net/dhcp/DhcpClient;->-get0(Landroid/net/dhcp/DhcpClient;)Lcom/android/internal/util/State;
+PLandroid/net/dhcp/DhcpClient;->-get1(Landroid/net/dhcp/DhcpClient;)Lcom/android/internal/util/StateMachine;
+PLandroid/net/dhcp/DhcpClient;->-get10(Landroid/net/dhcp/DhcpClient;)J
+PLandroid/net/dhcp/DhcpClient;->-get11(Landroid/net/dhcp/DhcpClient;)J
+PLandroid/net/dhcp/DhcpClient;->-get12(Landroid/net/dhcp/DhcpClient;)Landroid/net/DhcpResults;
+PLandroid/net/dhcp/DhcpClient;->-get13(Landroid/net/dhcp/DhcpClient;)Ljava/io/FileDescriptor;
+PLandroid/net/dhcp/DhcpClient;->-get14(Landroid/net/dhcp/DhcpClient;)Ljava/util/Random;
+PLandroid/net/dhcp/DhcpClient;->-get16(Landroid/net/dhcp/DhcpClient;)Landroid/net/dhcp/DhcpClient$ReceiveThread;
+PLandroid/net/dhcp/DhcpClient;->-get17(Landroid/net/dhcp/DhcpClient;)Z
+PLandroid/net/dhcp/DhcpClient;->-get2(Landroid/net/dhcp/DhcpClient;)Lcom/android/internal/util/State;
+PLandroid/net/dhcp/DhcpClient;->-get20(Landroid/net/dhcp/DhcpClient;)Lcom/android/internal/util/WakeupMessage;
+PLandroid/net/dhcp/DhcpClient;->-get23(Landroid/net/dhcp/DhcpClient;)Lcom/android/internal/util/State;
+PLandroid/net/dhcp/DhcpClient;->-get4(Landroid/net/dhcp/DhcpClient;)Landroid/net/DhcpResults;
+PLandroid/net/dhcp/DhcpClient;->-get7(Landroid/net/dhcp/DhcpClient;)Lcom/android/internal/util/State;
+PLandroid/net/dhcp/DhcpClient;->-get9(Landroid/net/dhcp/DhcpClient;)Lcom/android/internal/util/WakeupMessage;
+PLandroid/net/dhcp/DhcpClient;->-set1(Landroid/net/dhcp/DhcpClient;J)J
+PLandroid/net/dhcp/DhcpClient;->-set2(Landroid/net/dhcp/DhcpClient;Landroid/net/DhcpResults;)Landroid/net/DhcpResults;
+PLandroid/net/dhcp/DhcpClient;->-set3(Landroid/net/dhcp/DhcpClient;Landroid/net/dhcp/DhcpClient$ReceiveThread;)Landroid/net/dhcp/DhcpClient$ReceiveThread;
+PLandroid/net/dhcp/DhcpClient;->-wrap0(Landroid/net/dhcp/DhcpClient;Ljava/net/Inet4Address;)Z
+PLandroid/net/dhcp/DhcpClient;->-wrap1(Landroid/net/dhcp/DhcpClient;)Z
+PLandroid/net/dhcp/DhcpClient;->-wrap11(Landroid/net/dhcp/DhcpClient;Ljava/lang/String;I)V
+PLandroid/net/dhcp/DhcpClient;->-wrap13(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient;->-wrap14(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient;->-wrap2(Landroid/net/dhcp/DhcpClient;)Z
+PLandroid/net/dhcp/DhcpClient;->-wrap4(Landroid/net/dhcp/DhcpClient;)Z
+PLandroid/net/dhcp/DhcpClient;->-wrap5(Landroid/net/dhcp/DhcpClient;Ljava/net/Inet4Address;Ljava/net/Inet4Address;Ljava/net/Inet4Address;Ljava/net/Inet4Address;)Z
+PLandroid/net/dhcp/DhcpClient;->-wrap6(Landroid/net/dhcp/DhcpClient;Landroid/net/DhcpResults;Ljava/lang/String;)V
+PLandroid/net/dhcp/DhcpClient;->-wrap7(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient;-><init>(Landroid/content/Context;Lcom/android/internal/util/StateMachine;Ljava/lang/String;)V
+PLandroid/net/dhcp/DhcpClient;->acceptDhcpResults(Landroid/net/DhcpResults;Ljava/lang/String;)V
+PLandroid/net/dhcp/DhcpClient;->clearDhcpState()V
+PLandroid/net/dhcp/DhcpClient;->connectUdpSock(Ljava/net/Inet4Address;)Z
+PLandroid/net/dhcp/DhcpClient;->getSecs()S
+PLandroid/net/dhcp/DhcpClient;->initInterface()Z
+PLandroid/net/dhcp/DhcpClient;->initPacketSocket()Z
+PLandroid/net/dhcp/DhcpClient;->initSockets()Z
+PLandroid/net/dhcp/DhcpClient;->initUdpSocket()Z
+PLandroid/net/dhcp/DhcpClient;->isValidPacket(Landroid/net/dhcp/DhcpPacket;)Z
+PLandroid/net/dhcp/DhcpClient;->logState(Ljava/lang/String;I)V
+PLandroid/net/dhcp/DhcpClient;->makeDhcpClient(Landroid/content/Context;Lcom/android/internal/util/StateMachine;Ljava/lang/String;)Landroid/net/dhcp/DhcpClient;
+PLandroid/net/dhcp/DhcpClient;->makeWakeupMessage(Ljava/lang/String;I)Lcom/android/internal/util/WakeupMessage;
+PLandroid/net/dhcp/DhcpClient;->notifySuccess()V
+PLandroid/net/dhcp/DhcpClient;->registerForPreDhcpNotification()V
+PLandroid/net/dhcp/DhcpClient;->scheduleLeaseTimers()V
+PLandroid/net/dhcp/DhcpClient;->sendDiscoverPacket()Z
+PLandroid/net/dhcp/DhcpClient;->sendRequestPacket(Ljava/net/Inet4Address;Ljava/net/Inet4Address;Ljava/net/Inet4Address;Ljava/net/Inet4Address;)Z
+PLandroid/net/dhcp/DhcpClient;->setDhcpLeaseExpiry(Landroid/net/dhcp/DhcpPacket;)V
+PLandroid/net/dhcp/DhcpClient;->startNewTransaction()V
+PLandroid/net/dhcp/DhcpClient;->transmitPacket(Ljava/nio/ByteBuffer;Ljava/lang/String;ILjava/net/Inet4Address;)Z
+PLandroid/net/dhcp/DhcpDiscoverPacket;-><init>(IS[BZ)V
+PLandroid/net/dhcp/DhcpDiscoverPacket;->buildPacket(ISS)Ljava/nio/ByteBuffer;
+PLandroid/net/dhcp/DhcpDiscoverPacket;->finishPacket(Ljava/nio/ByteBuffer;)V
+PLandroid/net/dhcp/DhcpDiscoverPacket;->toString()Ljava/lang/String;
+PLandroid/net/dhcp/DhcpOfferPacket;-><init>(ISZLjava/net/Inet4Address;Ljava/net/Inet4Address;Ljava/net/Inet4Address;[B)V
+PLandroid/net/dhcp/DhcpOfferPacket;->toString()Ljava/lang/String;
+PLandroid/net/dhcp/DhcpPacket;-><init>(ISLjava/net/Inet4Address;Ljava/net/Inet4Address;Ljava/net/Inet4Address;Ljava/net/Inet4Address;[BZ)V
+PLandroid/net/dhcp/DhcpPacket;->addCommonClientTlvs(Ljava/nio/ByteBuffer;)V
+PLandroid/net/dhcp/DhcpPacket;->addTlv(Ljava/nio/ByteBuffer;BB)V
+PLandroid/net/dhcp/DhcpPacket;->addTlv(Ljava/nio/ByteBuffer;BLjava/lang/Short;)V
+PLandroid/net/dhcp/DhcpPacket;->addTlv(Ljava/nio/ByteBuffer;BLjava/lang/String;)V
+PLandroid/net/dhcp/DhcpPacket;->addTlv(Ljava/nio/ByteBuffer;BLjava/net/Inet4Address;)V
+PLandroid/net/dhcp/DhcpPacket;->addTlv(Ljava/nio/ByteBuffer;B[B)V
+PLandroid/net/dhcp/DhcpPacket;->addTlvEnd(Ljava/nio/ByteBuffer;)V
+PLandroid/net/dhcp/DhcpPacket;->buildDiscoverPacket(IIS[BZ[B)Ljava/nio/ByteBuffer;
+PLandroid/net/dhcp/DhcpPacket;->buildRequestPacket(IISLjava/net/Inet4Address;Z[BLjava/net/Inet4Address;Ljava/net/Inet4Address;[BLjava/lang/String;)Ljava/nio/ByteBuffer;
+PLandroid/net/dhcp/DhcpPacket;->checksum(Ljava/nio/ByteBuffer;III)I
+PLandroid/net/dhcp/DhcpPacket;->decodeFullPacket(Ljava/nio/ByteBuffer;I)Landroid/net/dhcp/DhcpPacket;
+PLandroid/net/dhcp/DhcpPacket;->decodeFullPacket([BII)Landroid/net/dhcp/DhcpPacket;
+PLandroid/net/dhcp/DhcpPacket;->fillInPacket(ILjava/net/Inet4Address;Ljava/net/Inet4Address;SSLjava/nio/ByteBuffer;BZ)V
+PLandroid/net/dhcp/DhcpPacket;->getClientId()[B
+PLandroid/net/dhcp/DhcpPacket;->getClientMac()[B
+PLandroid/net/dhcp/DhcpPacket;->getHostname()Ljava/lang/String;
+PLandroid/net/dhcp/DhcpPacket;->getLeaseTimeMillis()J
+PLandroid/net/dhcp/DhcpPacket;->getTransactionId()I
+PLandroid/net/dhcp/DhcpPacket;->getVendorId()Ljava/lang/String;
+PLandroid/net/dhcp/DhcpPacket;->intAbs(S)I
+PLandroid/net/dhcp/DhcpPacket;->isPacketToOrFromClient(SS)Z
+PLandroid/net/dhcp/DhcpPacket;->macToString([B)Ljava/lang/String;
+PLandroid/net/dhcp/DhcpPacket;->readAsciiString(Ljava/nio/ByteBuffer;IZ)Ljava/lang/String;
+PLandroid/net/dhcp/DhcpPacket;->readIpAddress(Ljava/nio/ByteBuffer;)Ljava/net/Inet4Address;
+PLandroid/net/dhcp/DhcpPacket;->toDhcpResults()Landroid/net/DhcpResults;
+PLandroid/net/dhcp/DhcpPacket;->toString()Ljava/lang/String;
+PLandroid/net/dhcp/DhcpRequestPacket;-><init>(ISLjava/net/Inet4Address;[BZ)V
+PLandroid/net/dhcp/DhcpRequestPacket;->buildPacket(ISS)Ljava/nio/ByteBuffer;
+PLandroid/net/dhcp/DhcpRequestPacket;->finishPacket(Ljava/nio/ByteBuffer;)V
+PLandroid/net/dhcp/DhcpRequestPacket;->toString()Ljava/lang/String;
+PLandroid/net/ip/-$Lambda$EIaFPv5OO8Upo9X60vMtrcUNUEQ;->$m$0()V
+PLandroid/net/ip/-$Lambda$EIaFPv5OO8Upo9X60vMtrcUNUEQ;->$m$1()V
+PLandroid/net/ip/-$Lambda$EIaFPv5OO8Upo9X60vMtrcUNUEQ;-><init>(BLjava/lang/Object;Ljava/lang/Object;)V
+PLandroid/net/ip/-$Lambda$EIaFPv5OO8Upo9X60vMtrcUNUEQ;->run()V
+PLandroid/net/ip/-$Lambda$Ew7nO2XMmp8bwulVlFTiHphyunQ;-><init>(Ljava/lang/Object;)V
+PLandroid/net/ip/ConnectivityPacketTracker$PacketListener;-><init>(Landroid/net/ip/ConnectivityPacketTracker;I[BI)V
+PLandroid/net/ip/ConnectivityPacketTracker$PacketListener;->addLogEntry(Ljava/lang/String;)V
+PLandroid/net/ip/ConnectivityPacketTracker$PacketListener;->createSocket()Ljava/io/FileDescriptor;
+PLandroid/net/ip/ConnectivityPacketTracker$PacketListener;->handlePacket([BI)V
+PLandroid/net/ip/ConnectivityPacketTracker$PacketListener;->lambda$-android_net_ip_ConnectivityPacketTracker$PacketListener_4824(Ljava/lang/String;)V
+PLandroid/net/ip/ConnectivityPacketTracker;->-get0(Landroid/net/ip/ConnectivityPacketTracker;)Landroid/os/Handler;
+PLandroid/net/ip/ConnectivityPacketTracker;->-get1(Landroid/net/ip/ConnectivityPacketTracker;)Landroid/util/LocalLog;
+PLandroid/net/ip/ConnectivityPacketTracker;-><init>(Ljava/net/NetworkInterface;Landroid/util/LocalLog;)V
+PLandroid/net/ip/ConnectivityPacketTracker;->start()V
+PLandroid/net/ip/IpManager$1;-><init>(Landroid/net/ip/IpManager;)V
+PLandroid/net/ip/IpManager$1;->update()V
+PLandroid/net/ip/IpManager$2;-><init>(Landroid/net/ip/IpManager;Ljava/lang/String;Lcom/android/server/net/NetlinkTracker$Callback;)V
+PLandroid/net/ip/IpManager$2;->interfaceAdded(Ljava/lang/String;)V
+PLandroid/net/ip/IpManager$2;->interfaceRemoved(Ljava/lang/String;)V
+PLandroid/net/ip/IpManager$2;->lambda$-android_net_ip_IpManager$2_18952(Ljava/lang/String;)V
+PLandroid/net/ip/IpManager$2;->logMsg(Ljava/lang/String;)V
+PLandroid/net/ip/IpManager$3;-><init>(Landroid/net/ip/IpManager;)V
+PLandroid/net/ip/IpManager$Callback;-><init>()V
+PLandroid/net/ip/IpManager$LoggingCallbackWrapper;-><init>(Landroid/net/ip/IpManager;Landroid/net/ip/IpManager$Callback;)V
+PLandroid/net/ip/IpManager$LoggingCallbackWrapper;->installPacketFilter([B)V
+PLandroid/net/ip/IpManager$LoggingCallbackWrapper;->log(Ljava/lang/String;)V
+PLandroid/net/ip/IpManager$LoggingCallbackWrapper;->onLinkPropertiesChange(Landroid/net/LinkProperties;)V
+PLandroid/net/ip/IpManager$LoggingCallbackWrapper;->onNewDhcpResults(Landroid/net/DhcpResults;)V
+PLandroid/net/ip/IpManager$LoggingCallbackWrapper;->onPostDhcpAction()V
+PLandroid/net/ip/IpManager$LoggingCallbackWrapper;->onPreDhcpAction()V
+PLandroid/net/ip/IpManager$LoggingCallbackWrapper;->onProvisioningSuccess(Landroid/net/LinkProperties;)V
+PLandroid/net/ip/IpManager$LoggingCallbackWrapper;->setNeighborDiscoveryOffload(Z)V
+PLandroid/net/ip/IpManager$MessageHandlingLogger;-><init>()V
+PLandroid/net/ip/IpManager$MessageHandlingLogger;-><init>(Landroid/net/ip/IpManager$MessageHandlingLogger;)V
+PLandroid/net/ip/IpManager$MessageHandlingLogger;->handled(Lcom/android/internal/util/State;Lcom/android/internal/util/IState;)V
+PLandroid/net/ip/IpManager$MessageHandlingLogger;->reset()V
+PLandroid/net/ip/IpManager$MessageHandlingLogger;->toString()Ljava/lang/String;
+PLandroid/net/ip/IpManager$ProvisioningConfiguration$Builder;-><init>()V
+PLandroid/net/ip/IpManager$ProvisioningConfiguration$Builder;->build()Landroid/net/ip/IpManager$ProvisioningConfiguration;
+PLandroid/net/ip/IpManager$ProvisioningConfiguration$Builder;->withApfCapabilities(Landroid/net/apf/ApfCapabilities;)Landroid/net/ip/IpManager$ProvisioningConfiguration$Builder;
+PLandroid/net/ip/IpManager$ProvisioningConfiguration$Builder;->withPreDhcpAction()Landroid/net/ip/IpManager$ProvisioningConfiguration$Builder;
+PLandroid/net/ip/IpManager$ProvisioningConfiguration;-><init>()V
+PLandroid/net/ip/IpManager$ProvisioningConfiguration;-><init>(Landroid/net/ip/IpManager$ProvisioningConfiguration;)V
+PLandroid/net/ip/IpManager$ProvisioningConfiguration;->toString()Ljava/lang/String;
+PLandroid/net/ip/IpManager$RunningState;-><init>(Landroid/net/ip/IpManager;)V
+PLandroid/net/ip/IpManager$RunningState;->createPacketTracker()Landroid/net/ip/ConnectivityPacketTracker;
+PLandroid/net/ip/IpManager$RunningState;->ensureDhcpAction()V
+PLandroid/net/ip/IpManager$RunningState;->enter()V
+PLandroid/net/ip/IpManager$RunningState;->processMessage(Landroid/os/Message;)Z
+PLandroid/net/ip/IpManager$RunningState;->stopDhcpAction()V
+PLandroid/net/ip/IpManager$StartedState;-><init>(Landroid/net/ip/IpManager;)V
+PLandroid/net/ip/IpManager$StartedState;->enter()V
+PLandroid/net/ip/IpManager$StartedState;->readyToProceed()Z
+PLandroid/net/ip/IpManager$StoppedState;-><init>(Landroid/net/ip/IpManager;)V
+PLandroid/net/ip/IpManager$StoppedState;->enter()V
+PLandroid/net/ip/IpManager$StoppedState;->processMessage(Landroid/os/Message;)Z
+PLandroid/net/ip/IpManager$StoppingState;-><init>(Landroid/net/ip/IpManager;)V
+PLandroid/net/ip/IpManager;->-get0(Landroid/net/ip/IpManager;)Landroid/net/apf/ApfFilter;
+PLandroid/net/ip/IpManager;->-get1(Landroid/net/ip/IpManager;)Ljava/lang/String;
+PLandroid/net/ip/IpManager;->-get10(Landroid/net/ip/IpManager;)Landroid/net/ip/IpManager$MessageHandlingLogger;
+PLandroid/net/ip/IpManager;->-get11(Landroid/net/ip/IpManager;)Z
+PLandroid/net/ip/IpManager;->-get12(Landroid/net/ip/IpManager;)Ljava/net/NetworkInterface;
+PLandroid/net/ip/IpManager;->-get13(Landroid/net/ip/IpManager;)Lcom/android/internal/util/WakeupMessage;
+PLandroid/net/ip/IpManager;->-get14(Landroid/net/ip/IpManager;)Lcom/android/internal/util/State;
+PLandroid/net/ip/IpManager;->-get15(Landroid/net/ip/IpManager;)J
+PLandroid/net/ip/IpManager;->-get16(Landroid/net/ip/IpManager;)Lcom/android/internal/util/State;
+PLandroid/net/ip/IpManager;->-get19(Landroid/net/ip/IpManager;)Ljava/lang/String;
+PLandroid/net/ip/IpManager;->-get2(Landroid/net/ip/IpManager;)Landroid/net/ip/IpManager$ProvisioningConfiguration;
+PLandroid/net/ip/IpManager;->-get3(Landroid/net/ip/IpManager;)Landroid/util/LocalLog;
+PLandroid/net/ip/IpManager;->-get4(Landroid/net/ip/IpManager;)Lcom/android/internal/util/WakeupMessage;
+PLandroid/net/ip/IpManager;->-get5(Landroid/net/ip/IpManager;)Landroid/net/dhcp/DhcpClient;
+PLandroid/net/ip/IpManager;->-get6(Landroid/net/ip/IpManager;)Ljava/lang/String;
+PLandroid/net/ip/IpManager;->-get7(Landroid/net/ip/IpManager;)Landroid/net/ip/IpReachabilityMonitor;
+PLandroid/net/ip/IpManager;->-get8(Landroid/net/ip/IpManager;)Landroid/net/LinkProperties;
+PLandroid/net/ip/IpManager;->-get9(Landroid/net/ip/IpManager;)Landroid/util/LocalLog;
+PLandroid/net/ip/IpManager;->-getandroid-net-LinkProperties$ProvisioningChangeSwitchesValues()[I
+PLandroid/net/ip/IpManager;->-set0(Landroid/net/ip/IpManager;Landroid/net/apf/ApfFilter;)Landroid/net/apf/ApfFilter;
+PLandroid/net/ip/IpManager;->-set1(Landroid/net/ip/IpManager;Landroid/net/ip/IpManager$ProvisioningConfiguration;)Landroid/net/ip/IpManager$ProvisioningConfiguration;
+PLandroid/net/ip/IpManager;->-set3(Landroid/net/ip/IpManager;Landroid/net/ProxyInfo;)Landroid/net/ProxyInfo;
+PLandroid/net/ip/IpManager;->-set5(Landroid/net/ip/IpManager;Z)Z
+PLandroid/net/ip/IpManager;->-set6(Landroid/net/ip/IpManager;J)J
+PLandroid/net/ip/IpManager;->-set7(Landroid/net/ip/IpManager;Ljava/lang/String;)Ljava/lang/String;
+PLandroid/net/ip/IpManager;->-wrap0(Landroid/net/ip/IpManager;Z)Z
+PLandroid/net/ip/IpManager;->-wrap1(Landroid/net/ip/IpManager;Landroid/net/LinkAddress;)Z
+PLandroid/net/ip/IpManager;->-wrap13(Landroid/net/ip/IpManager;)V
+PLandroid/net/ip/IpManager;->-wrap14(Landroid/net/ip/IpManager;)V
+PLandroid/net/ip/IpManager;->-wrap2(Landroid/net/ip/IpManager;)Z
+PLandroid/net/ip/IpManager;->-wrap3(Landroid/net/ip/IpManager;)Z
+PLandroid/net/ip/IpManager;->-wrap4(Landroid/net/ip/IpManager;)Z
+PLandroid/net/ip/IpManager;->-wrap9(Landroid/net/ip/IpManager;Landroid/net/DhcpResults;)V
+PLandroid/net/ip/IpManager;-><init>(Landroid/content/Context;Ljava/lang/String;Landroid/net/ip/IpManager$Callback;)V
+PLandroid/net/ip/IpManager;-><init>(Landroid/content/Context;Ljava/lang/String;Landroid/net/ip/IpManager$Callback;Landroid/os/INetworkManagementService;)V
+PLandroid/net/ip/IpManager;->addAllReachableDnsServers(Landroid/net/LinkProperties;Ljava/lang/Iterable;)V
+PLandroid/net/ip/IpManager;->assembleLinkProperties()Landroid/net/LinkProperties;
+PLandroid/net/ip/IpManager;->buildProvisioningConfiguration()Landroid/net/ip/IpManager$ProvisioningConfiguration$Builder;
+PLandroid/net/ip/IpManager;->compareProvisioning(Landroid/net/LinkProperties;Landroid/net/LinkProperties;)Landroid/net/LinkProperties$ProvisioningChange;
+PLandroid/net/ip/IpManager;->completedPreDhcpAction()V
+PLandroid/net/ip/IpManager;->configureAndStartStateMachine()V
+PLandroid/net/ip/IpManager;->confirmConfiguration()V
+PLandroid/net/ip/IpManager;->dispatchCallback(Landroid/net/LinkProperties$ProvisioningChange;Landroid/net/LinkProperties;)V
+PLandroid/net/ip/IpManager;->getLogRecString(Landroid/os/Message;)Ljava/lang/String;
+PLandroid/net/ip/IpManager;->getNetworkInterface()V
+PLandroid/net/ip/IpManager;->getWhatToString(I)Ljava/lang/String;
+PLandroid/net/ip/IpManager;->handleIPv4Success(Landroid/net/DhcpResults;)V
+PLandroid/net/ip/IpManager;->handleLinkPropertiesUpdate(Z)Z
+PLandroid/net/ip/IpManager;->isProvisioned(Landroid/net/LinkProperties;)Z
+PLandroid/net/ip/IpManager;->linkPropertiesUnchanged(Landroid/net/LinkProperties;)Z
+PLandroid/net/ip/IpManager;->recordLogRec(Landroid/os/Message;)Z
+PLandroid/net/ip/IpManager;->recordMetric(I)V
+PLandroid/net/ip/IpManager;->resetLinkProperties()V
+PLandroid/net/ip/IpManager;->setHttpProxy(Landroid/net/ProxyInfo;)V
+PLandroid/net/ip/IpManager;->setIPv4Address(Landroid/net/LinkAddress;)Z
+PLandroid/net/ip/IpManager;->setLinkProperties(Landroid/net/LinkProperties;)Landroid/net/LinkProperties$ProvisioningChange;
+PLandroid/net/ip/IpManager;->setMulticastFilter(Z)V
+PLandroid/net/ip/IpManager;->setTcpBufferSizes(Ljava/lang/String;)V
+PLandroid/net/ip/IpManager;->startIPv4()Z
+PLandroid/net/ip/IpManager;->startIPv6()Z
+PLandroid/net/ip/IpManager;->startIpReachabilityMonitor()Z
+PLandroid/net/ip/IpManager;->startProvisioning(Landroid/net/ip/IpManager$ProvisioningConfiguration;)V
+PLandroid/net/ip/IpManager;->startStateMachineUpdaters()V
+PLandroid/net/ip/IpManager;->stop()V
+PLandroid/net/ip/IpManager;->stopAllIP()V
+PLandroid/net/ip/IpReachabilityMonitor$NetlinkSocketObserver;-><init>(Landroid/net/ip/IpReachabilityMonitor;)V
+PLandroid/net/ip/IpReachabilityMonitor$NetlinkSocketObserver;-><init>(Landroid/net/ip/IpReachabilityMonitor;Landroid/net/ip/IpReachabilityMonitor$NetlinkSocketObserver;)V
+PLandroid/net/ip/IpReachabilityMonitor$NetlinkSocketObserver;->clearNetlinkSocket()V
+PLandroid/net/ip/IpReachabilityMonitor$NetlinkSocketObserver;->evaluateRtNetlinkNeighborMessage(Landroid/net/netlink/RtNetlinkNeighborMessage;J)V
+PLandroid/net/ip/IpReachabilityMonitor$NetlinkSocketObserver;->parseNetlinkMessageBuffer(Ljava/nio/ByteBuffer;J)V
+PLandroid/net/ip/IpReachabilityMonitor$NetlinkSocketObserver;->recvKernelReply()Ljava/nio/ByteBuffer;
+PLandroid/net/ip/IpReachabilityMonitor$NetlinkSocketObserver;->run()V
+PLandroid/net/ip/IpReachabilityMonitor$NetlinkSocketObserver;->setupNetlinkSocket()V
+PLandroid/net/ip/IpReachabilityMonitor;->-get0(Landroid/net/ip/IpReachabilityMonitor;)I
+PLandroid/net/ip/IpReachabilityMonitor;->-get1(Landroid/net/ip/IpReachabilityMonitor;)Ljava/util/Map;
+PLandroid/net/ip/IpReachabilityMonitor;->-get2(Landroid/net/ip/IpReachabilityMonitor;)Ljava/lang/Object;
+PLandroid/net/ip/IpReachabilityMonitor;->-get3(Landroid/net/ip/IpReachabilityMonitor;)Z
+PLandroid/net/ip/IpReachabilityMonitor;->-set0(Landroid/net/ip/IpReachabilityMonitor;Z)Z
+PLandroid/net/ip/IpReachabilityMonitor;->-wrap0(Landroid/net/ip/IpReachabilityMonitor;Ljava/net/InetAddress;)Z
+PLandroid/net/ip/IpReachabilityMonitor;-><init>(Landroid/content/Context;Ljava/lang/String;Landroid/net/ip/IpReachabilityMonitor$Callback;Landroid/net/util/MultinetworkPolicyTracker;)V
+PLandroid/net/ip/IpReachabilityMonitor;->getNeighborStateLocked(Ljava/net/InetAddress;)S
+PLandroid/net/ip/IpReachabilityMonitor;->isOnLink(Ljava/util/List;Ljava/net/InetAddress;)Z
+PLandroid/net/ip/IpReachabilityMonitor;->isWatching(Ljava/net/InetAddress;)Z
+PLandroid/net/ip/IpReachabilityMonitor;->probeAll()V
+PLandroid/net/ip/IpReachabilityMonitor;->updateLinkProperties(Landroid/net/LinkProperties;)V
+PLandroid/net/metrics/INetdEventListener$Stub;-><init>()V
+PLandroid/net/metrics/INetdEventListener$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+PLandroid/net/netlink/NetlinkConstants;->alignedLengthOf(I)I
+PLandroid/net/netlink/NetlinkConstants;->alignedLengthOf(S)I
+PLandroid/net/netlink/NetlinkConstants;->hexify([B)Ljava/lang/String;
+PLandroid/net/netlink/NetlinkConstants;->stringForNlMsgType(S)Ljava/lang/String;
+PLandroid/net/netlink/NetlinkMessage;-><init>(Landroid/net/netlink/StructNlMsgHdr;)V
+PLandroid/net/netlink/NetlinkMessage;->getHeader()Landroid/net/netlink/StructNlMsgHdr;
+PLandroid/net/netlink/NetlinkMessage;->parse(Ljava/nio/ByteBuffer;)Landroid/net/netlink/NetlinkMessage;
+PLandroid/net/netlink/NetlinkSocket;-><init>(I)V
+PLandroid/net/netlink/NetlinkSocket;->bind(Landroid/system/NetlinkSocketAddress;)V
+PLandroid/net/netlink/NetlinkSocket;->checkTimeout(J)V
+PLandroid/net/netlink/NetlinkSocket;->recvMessage(IJ)Ljava/nio/ByteBuffer;
+PLandroid/net/netlink/NetlinkSocket;->recvMessage(J)Ljava/nio/ByteBuffer;
+PLandroid/net/netlink/RtNetlinkNeighborMessage;-><init>(Landroid/net/netlink/StructNlMsgHdr;)V
+PLandroid/net/netlink/RtNetlinkNeighborMessage;->findNextAttrOfType(SLjava/nio/ByteBuffer;)Landroid/net/netlink/StructNlAttr;
+PLandroid/net/netlink/RtNetlinkNeighborMessage;->getDestination()Ljava/net/InetAddress;
+PLandroid/net/netlink/RtNetlinkNeighborMessage;->getLinkLayerAddress()[B
+PLandroid/net/netlink/RtNetlinkNeighborMessage;->getNdHeader()Landroid/net/netlink/StructNdMsg;
+PLandroid/net/netlink/RtNetlinkNeighborMessage;->parse(Landroid/net/netlink/StructNlMsgHdr;Ljava/nio/ByteBuffer;)Landroid/net/netlink/RtNetlinkNeighborMessage;
+PLandroid/net/netlink/StructNdMsg;-><init>()V
+PLandroid/net/netlink/StructNdMsg;->hasAvailableSpace(Ljava/nio/ByteBuffer;)Z
+PLandroid/net/netlink/StructNdMsg;->parse(Ljava/nio/ByteBuffer;)Landroid/net/netlink/StructNdMsg;
+PLandroid/net/netlink/StructNdMsg;->stringForNudState(S)Ljava/lang/String;
+PLandroid/net/netlink/StructNdaCacheInfo;-><init>()V
+PLandroid/net/netlink/StructNdaCacheInfo;->hasAvailableSpace(Ljava/nio/ByteBuffer;)Z
+PLandroid/net/netlink/StructNdaCacheInfo;->parse(Ljava/nio/ByteBuffer;)Landroid/net/netlink/StructNdaCacheInfo;
+PLandroid/net/netlink/StructNlAttr;-><init>()V
+PLandroid/net/netlink/StructNlAttr;->getAlignedLength()I
+PLandroid/net/netlink/StructNlAttr;->getValueAsByteBuffer()Ljava/nio/ByteBuffer;
+PLandroid/net/netlink/StructNlAttr;->getValueAsInetAddress()Ljava/net/InetAddress;
+PLandroid/net/netlink/StructNlAttr;->getValueAsInt(I)I
+PLandroid/net/netlink/StructNlAttr;->parse(Ljava/nio/ByteBuffer;)Landroid/net/netlink/StructNlAttr;
+PLandroid/net/netlink/StructNlMsgHdr;-><init>()V
+PLandroid/net/netlink/StructNlMsgHdr;->hasAvailableSpace(Ljava/nio/ByteBuffer;)Z
+PLandroid/net/netlink/StructNlMsgHdr;->parse(Ljava/nio/ByteBuffer;)Landroid/net/netlink/StructNlMsgHdr;
+PLandroid/net/util/-$Lambda$uAc0-SfvAbf39zjOK01b1lQkeVs;->$m$0()V
+PLandroid/net/util/-$Lambda$uAc0-SfvAbf39zjOK01b1lQkeVs;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
+PLandroid/net/util/-$Lambda$uAc0-SfvAbf39zjOK01b1lQkeVs;->run()V
+PLandroid/net/util/-$Lambda$uJqW9o1MiZ5yyXhSTG2zE-YhRn0;->$m$0()V
+PLandroid/net/util/-$Lambda$uJqW9o1MiZ5yyXhSTG2zE-YhRn0;-><init>(Ljava/lang/Object;)V
+PLandroid/net/util/-$Lambda$uJqW9o1MiZ5yyXhSTG2zE-YhRn0;->run()V
+PLandroid/net/util/BlockingSocketReader;-><init>(I)V
+PLandroid/net/util/BlockingSocketReader;->isRunning()Z
+PLandroid/net/util/BlockingSocketReader;->lambda$-android_net_util_BlockingSocketReader_2194()V
+PLandroid/net/util/BlockingSocketReader;->mainLoop()V
+PLandroid/net/util/BlockingSocketReader;->start()Z
+PLandroid/net/util/ConnectivityPacketSummary;-><init>([B[BI)V
+PLandroid/net/util/ConnectivityPacketSummary;->getIPv4AddressString(Ljava/nio/ByteBuffer;)Ljava/lang/String;
+PLandroid/net/util/ConnectivityPacketSummary;->getIPv6AddressString(Ljava/nio/ByteBuffer;)Ljava/lang/String;
+PLandroid/net/util/ConnectivityPacketSummary;->getIpAddressString(Ljava/nio/ByteBuffer;I)Ljava/lang/String;
+PLandroid/net/util/ConnectivityPacketSummary;->parseARP(Ljava/util/StringJoiner;)V
+PLandroid/net/util/ConnectivityPacketSummary;->parseDHCPv4(Ljava/util/StringJoiner;)V
+PLandroid/net/util/ConnectivityPacketSummary;->parseEther(Ljava/util/StringJoiner;)V
+PLandroid/net/util/ConnectivityPacketSummary;->parseICMPv6(Ljava/util/StringJoiner;)V
+PLandroid/net/util/ConnectivityPacketSummary;->parseICMPv6NeighborDiscoveryOptions(Ljava/util/StringJoiner;)V
+PLandroid/net/util/ConnectivityPacketSummary;->parseICMPv6NeighborMessage(Ljava/util/StringJoiner;)V
+PLandroid/net/util/ConnectivityPacketSummary;->parseICMPv6RouterAdvertisement(Ljava/util/StringJoiner;)V
+PLandroid/net/util/ConnectivityPacketSummary;->parseICMPv6RouterSolicitation(Ljava/util/StringJoiner;)V
+PLandroid/net/util/ConnectivityPacketSummary;->parseIPv4(Ljava/util/StringJoiner;)V
+PLandroid/net/util/ConnectivityPacketSummary;->parseIPv6(Ljava/util/StringJoiner;)V
+PLandroid/net/util/ConnectivityPacketSummary;->parseUDP(Ljava/util/StringJoiner;)V
+PLandroid/net/util/ConnectivityPacketSummary;->summarize([B[BI)Ljava/lang/String;
+PLandroid/net/util/ConnectivityPacketSummary;->toString()Ljava/lang/String;
+PLandroid/net/util/MultinetworkPolicyTracker$1;-><init>(Landroid/net/util/MultinetworkPolicyTracker;)V
+PLandroid/net/util/MultinetworkPolicyTracker$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLandroid/net/util/MultinetworkPolicyTracker$SettingObserver;-><init>(Landroid/net/util/MultinetworkPolicyTracker;)V
+PLandroid/net/util/MultinetworkPolicyTracker;-><init>(Landroid/content/Context;Landroid/os/Handler;Ljava/lang/Runnable;)V
+PLandroid/net/util/MultinetworkPolicyTracker;->configMeteredMultipathPreference()I
+PLandroid/net/util/MultinetworkPolicyTracker;->configRestrictsAvoidBadWifi()Z
+PLandroid/net/util/MultinetworkPolicyTracker;->getAvoidBadWifi()Z
+PLandroid/net/util/MultinetworkPolicyTracker;->getAvoidBadWifiSetting()Ljava/lang/String;
+PLandroid/net/util/MultinetworkPolicyTracker;->lambda$-android_net_util_MultinetworkPolicyTracker_2908(Ljava/lang/Runnable;)V
+PLandroid/net/util/MultinetworkPolicyTracker;->reevaluate()V
+PLandroid/net/util/MultinetworkPolicyTracker;->start()V
+PLandroid/net/util/MultinetworkPolicyTracker;->updateAvoidBadWifi()Z
+PLandroid/net/util/MultinetworkPolicyTracker;->updateMeteredMultipathPreference()V
+PLandroid/net/util/NetworkConstants;->asByte(I)B
+PLandroid/net/util/NetworkConstants;->asString(I)Ljava/lang/String;
+PLandroid/net/util/NetworkConstants;->asUint(B)I
+PLandroid/net/util/NetworkConstants;->asUint(S)I
+PLandroid/net/util/SharedLog$Category;-><init>(Ljava/lang/String;I)V
+PLandroid/net/util/SharedLog;-><init>(ILjava/lang/String;)V
+PLandroid/net/util/SharedLog;-><init>(Landroid/util/LocalLog;Ljava/lang/String;Ljava/lang/String;)V
+PLandroid/net/util/SharedLog;-><init>(Ljava/lang/String;)V
+PLandroid/net/util/SharedLog;->forSubComponent(Ljava/lang/String;)Landroid/net/util/SharedLog;
+PLandroid/net/util/SharedLog;->isRootLogInstance()Z
+PLandroid/net/util/SharedLog;->log(Ljava/lang/String;)V
+PLandroid/net/util/SharedLog;->logLine(Landroid/net/util/SharedLog$Category;Ljava/lang/String;)Ljava/lang/String;
+PLandroid/net/util/SharedLog;->mark(Ljava/lang/String;)V
+PLandroid/net/util/SharedLog;->record(Landroid/net/util/SharedLog$Category;Ljava/lang/String;)Ljava/lang/String;
+PLandroid/net/util/Stopwatch;-><init>()V
+PLandroid/net/util/Stopwatch;->isRunning()Z
+PLandroid/net/util/Stopwatch;->isStarted()Z
+PLandroid/net/util/Stopwatch;->isStopped()Z
+PLandroid/net/util/Stopwatch;->reset()V
+PLandroid/net/util/Stopwatch;->start()Landroid/net/util/Stopwatch;
+PLandroid/net/util/Stopwatch;->stop()J
+PLandroid/net/wifi/IClientInterface$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+PLandroid/net/wifi/IClientInterface$Stub$Proxy;->asBinder()Landroid/os/IBinder;
+PLandroid/net/wifi/IClientInterface$Stub$Proxy;->enableSupplicant()Z
+PLandroid/net/wifi/IClientInterface$Stub$Proxy;->getInterfaceName()Ljava/lang/String;
+PLandroid/net/wifi/IClientInterface$Stub$Proxy;->getWifiScannerImpl()Landroid/net/wifi/IWifiScannerImpl;
+PLandroid/net/wifi/IClientInterface$Stub$Proxy;->signalPoll()[I
+PLandroid/net/wifi/IClientInterface$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/IClientInterface;
+PLandroid/net/wifi/IInterfaceEventCallback$Stub;-><init>()V
+PLandroid/net/wifi/IInterfaceEventCallback$Stub;->asBinder()Landroid/os/IBinder;
+PLandroid/net/wifi/IPnoScanEvent$Stub;-><init>()V
+PLandroid/net/wifi/IPnoScanEvent$Stub;->asBinder()Landroid/os/IBinder;
+PLandroid/net/wifi/IScanEvent$Stub;-><init>()V
+PLandroid/net/wifi/IScanEvent$Stub;->asBinder()Landroid/os/IBinder;
+PLandroid/net/wifi/IScanEvent$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+PLandroid/net/wifi/IWifiScannerImpl$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+PLandroid/net/wifi/IWifiScannerImpl$Stub$Proxy;->abortScan()V
+PLandroid/net/wifi/IWifiScannerImpl$Stub$Proxy;->asBinder()Landroid/os/IBinder;
+PLandroid/net/wifi/IWifiScannerImpl$Stub$Proxy;->getScanResults()[Lcom/android/server/wifi/wificond/NativeScanResult;
+PLandroid/net/wifi/IWifiScannerImpl$Stub$Proxy;->scan(Lcom/android/server/wifi/wificond/SingleScanSettings;)Z
+PLandroid/net/wifi/IWifiScannerImpl$Stub$Proxy;->subscribePnoScanEvents(Landroid/net/wifi/IPnoScanEvent;)V
+PLandroid/net/wifi/IWifiScannerImpl$Stub$Proxy;->subscribeScanEvents(Landroid/net/wifi/IScanEvent;)V
+PLandroid/net/wifi/IWifiScannerImpl$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/IWifiScannerImpl;
+PLandroid/net/wifi/IWificond$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+PLandroid/net/wifi/IWificond$Stub$Proxy;->GetClientInterfaces()Ljava/util/List;
+PLandroid/net/wifi/IWificond$Stub$Proxy;->RegisterCallback(Landroid/net/wifi/IInterfaceEventCallback;)V
+PLandroid/net/wifi/IWificond$Stub$Proxy;->createClientInterface()Landroid/net/wifi/IClientInterface;
+PLandroid/net/wifi/IWificond$Stub$Proxy;->tearDownInterfaces()V
+PLandroid/net/wifi/IWificond$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/IWificond;
+PLcom/android/server/-$Lambda$9jO-pgghrn5IhueuFzPwKVTwWXg$1;->$m$0(Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/-$Lambda$9jO-pgghrn5IhueuFzPwKVTwWXg$1;->$m$1(Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/-$Lambda$9jO-pgghrn5IhueuFzPwKVTwWXg$1;->$m$2(Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/-$Lambda$9jO-pgghrn5IhueuFzPwKVTwWXg$1;-><init>(BLjava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/-$Lambda$9jO-pgghrn5IhueuFzPwKVTwWXg$1;->sendCallback(Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/-$Lambda$9jO-pgghrn5IhueuFzPwKVTwWXg$2;->$m$0(Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/-$Lambda$9jO-pgghrn5IhueuFzPwKVTwWXg$2;-><init>(JLjava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/-$Lambda$9jO-pgghrn5IhueuFzPwKVTwWXg$2;->sendCallback(Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/-$Lambda$9jO-pgghrn5IhueuFzPwKVTwWXg$3;->$m$0(Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/-$Lambda$9jO-pgghrn5IhueuFzPwKVTwWXg$3;-><init>(BZLjava/lang/Object;)V
+PLcom/android/server/-$Lambda$9jO-pgghrn5IhueuFzPwKVTwWXg$3;->sendCallback(Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/-$Lambda$9jO-pgghrn5IhueuFzPwKVTwWXg$4;->$m$0(Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/-$Lambda$9jO-pgghrn5IhueuFzPwKVTwWXg$4;-><init>(ZIJ)V
+PLcom/android/server/-$Lambda$9jO-pgghrn5IhueuFzPwKVTwWXg$4;->sendCallback(Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/-$Lambda$9jO-pgghrn5IhueuFzPwKVTwWXg;->$m$0(Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/-$Lambda$9jO-pgghrn5IhueuFzPwKVTwWXg;->$m$1(Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/-$Lambda$9jO-pgghrn5IhueuFzPwKVTwWXg;->$m$2(Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/-$Lambda$9jO-pgghrn5IhueuFzPwKVTwWXg;->$m$3(Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/-$Lambda$9jO-pgghrn5IhueuFzPwKVTwWXg;-><init>(BLjava/lang/Object;)V
+PLcom/android/server/-$Lambda$9jO-pgghrn5IhueuFzPwKVTwWXg;->sendCallback(Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/-$Lambda$AZbCJpvy__SzB8YDjhldiwCtqD8;->$m$0(Lcom/android/server/NsdService$NativeCallbackReceiver;)Lcom/android/server/NsdService$DaemonConnection;
+PLcom/android/server/-$Lambda$AZbCJpvy__SzB8YDjhldiwCtqD8;-><init>()V
+PLcom/android/server/-$Lambda$AZbCJpvy__SzB8YDjhldiwCtqD8;->get(Lcom/android/server/NsdService$NativeCallbackReceiver;)Lcom/android/server/NsdService$DaemonConnection;
+PLcom/android/server/-$Lambda$Ash-36Gr90yYPZEIENlguvJE7uk;->$m$0(Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/android/server/-$Lambda$Ash-36Gr90yYPZEIENlguvJE7uk;-><init>()V
+PLcom/android/server/-$Lambda$Ash-36Gr90yYPZEIENlguvJE7uk;->apply(Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/android/server/-$Lambda$T7cKu_OKm_Fk2kBNthmo_uUJTSo$1;->$m$0()V
+PLcom/android/server/-$Lambda$T7cKu_OKm_Fk2kBNthmo_uUJTSo$1;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/-$Lambda$T7cKu_OKm_Fk2kBNthmo_uUJTSo$1;->run()V
+PLcom/android/server/-$Lambda$T7cKu_OKm_Fk2kBNthmo_uUJTSo$2;->$m$0()V
+PLcom/android/server/-$Lambda$T7cKu_OKm_Fk2kBNthmo_uUJTSo$2;-><init>(Ljava/lang/Object;)V
+PLcom/android/server/-$Lambda$T7cKu_OKm_Fk2kBNthmo_uUJTSo$2;->run()V
+PLcom/android/server/-$Lambda$T7cKu_OKm_Fk2kBNthmo_uUJTSo;->$m$1()V
+PLcom/android/server/-$Lambda$T7cKu_OKm_Fk2kBNthmo_uUJTSo;->$m$2()V
+PLcom/android/server/-$Lambda$T7cKu_OKm_Fk2kBNthmo_uUJTSo;->$m$3()V
+PLcom/android/server/-$Lambda$VaVGUZuNs2jqHMhhxPzwNl4zK-M;->$m$3()V
+PLcom/android/server/-$Lambda$VaVGUZuNs2jqHMhhxPzwNl4zK-M;->$m$4()V
+PLcom/android/server/-$Lambda$VaVGUZuNs2jqHMhhxPzwNl4zK-M;-><init>(BLjava/lang/Object;)V
+PLcom/android/server/-$Lambda$VaVGUZuNs2jqHMhhxPzwNl4zK-M;->run()V
+PLcom/android/server/-$Lambda$o3e2BPeEiY4LSvdQI9l_B7RsPtQ;-><init>(Ljava/lang/Object;)V
+PLcom/android/server/-$Lambda$qXtDhnbBL0MhXoSy7vXxLi-Juu4;-><init>(Ljava/lang/Object;)V
+PLcom/android/server/AlarmManagerService$1;-><init>(Lcom/android/server/AlarmManagerService;)V
+PLcom/android/server/AlarmManagerService$1;->compare(Lcom/android/server/AlarmManagerService$Alarm;Lcom/android/server/AlarmManagerService$Alarm;)I
+PLcom/android/server/AlarmManagerService$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+PLcom/android/server/AlarmManagerService$2;-><init>(Lcom/android/server/AlarmManagerService;)V
+PLcom/android/server/AlarmManagerService$2;->getNextAlarmClock(I)Landroid/app/AlarmManager$AlarmClockInfo;
+PLcom/android/server/AlarmManagerService$2;->remove(Landroid/app/PendingIntent;Landroid/app/IAlarmListener;)V
+PLcom/android/server/AlarmManagerService$2;->setTime(J)Z
+PLcom/android/server/AlarmManagerService$Alarm;-><init>(IJJJJJLandroid/app/PendingIntent;Landroid/app/IAlarmListener;Ljava/lang/String;Landroid/os/WorkSource;ILandroid/app/AlarmManager$AlarmClockInfo;ILjava/lang/String;)V
+PLcom/android/server/AlarmManagerService$Alarm;->makeTag(Landroid/app/PendingIntent;Ljava/lang/String;I)Ljava/lang/String;
+PLcom/android/server/AlarmManagerService$AlarmHandler;-><init>(Lcom/android/server/AlarmManagerService;)V
+PLcom/android/server/AlarmManagerService$AlarmHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/AlarmManagerService$AlarmThread;-><init>(Lcom/android/server/AlarmManagerService;)V
+PLcom/android/server/AlarmManagerService$AlarmThread;->run()V
+PLcom/android/server/AlarmManagerService$Batch;->hasWakeups()Z
+PLcom/android/server/AlarmManagerService$BatchTimeOrder;-><init>()V
+PLcom/android/server/AlarmManagerService$BroadcastStats;-><init>(ILjava/lang/String;)V
+PLcom/android/server/AlarmManagerService$ClockReceiver;-><init>(Lcom/android/server/AlarmManagerService;)V
+PLcom/android/server/AlarmManagerService$ClockReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/AlarmManagerService$ClockReceiver;->scheduleDateChangedEvent()V
+PLcom/android/server/AlarmManagerService$ClockReceiver;->scheduleTimeTickEvent()V
+PLcom/android/server/AlarmManagerService$Constants;-><init>(Lcom/android/server/AlarmManagerService;Landroid/os/Handler;)V
+PLcom/android/server/AlarmManagerService$Constants;->start(Landroid/content/ContentResolver;)V
+PLcom/android/server/AlarmManagerService$Constants;->updateAllowWhileIdleMinTimeLocked()V
+PLcom/android/server/AlarmManagerService$Constants;->updateAllowWhileIdleWhitelistDurationLocked()V
+PLcom/android/server/AlarmManagerService$Constants;->updateConstants()V
+PLcom/android/server/AlarmManagerService$DeliveryTracker;-><init>(Lcom/android/server/AlarmManagerService;)V
+PLcom/android/server/AlarmManagerService$DeliveryTracker;->alarmComplete(Landroid/os/IBinder;)V
+PLcom/android/server/AlarmManagerService$DeliveryTracker;->deliverLocked(Lcom/android/server/AlarmManagerService$Alarm;JZ)V
+PLcom/android/server/AlarmManagerService$DeliveryTracker;->onSendFinished(Landroid/app/PendingIntent;Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;)V
+PLcom/android/server/AlarmManagerService$DeliveryTracker;->removeLocked(Landroid/app/PendingIntent;Landroid/content/Intent;)Lcom/android/server/AlarmManagerService$InFlight;
+PLcom/android/server/AlarmManagerService$DeliveryTracker;->removeLocked(Landroid/os/IBinder;)Lcom/android/server/AlarmManagerService$InFlight;
+PLcom/android/server/AlarmManagerService$DeliveryTracker;->updateStatsLocked(Lcom/android/server/AlarmManagerService$InFlight;)V
+PLcom/android/server/AlarmManagerService$DeliveryTracker;->updateTrackingLocked(Lcom/android/server/AlarmManagerService$InFlight;)V
+PLcom/android/server/AlarmManagerService$FilterStats;-><init>(Lcom/android/server/AlarmManagerService$BroadcastStats;Ljava/lang/String;)V
+PLcom/android/server/AlarmManagerService$InFlight;-><init>(Lcom/android/server/AlarmManagerService;Landroid/app/PendingIntent;Landroid/app/IAlarmListener;Landroid/os/WorkSource;ILjava/lang/String;ILjava/lang/String;J)V
+PLcom/android/server/AlarmManagerService$IncreasingTimeOrder;-><init>()V
+PLcom/android/server/AlarmManagerService$InteractiveStateReceiver;-><init>(Lcom/android/server/AlarmManagerService;)V
+PLcom/android/server/AlarmManagerService$LocalService;-><init>(Lcom/android/server/AlarmManagerService;)V
+PLcom/android/server/AlarmManagerService$LocalService;->setDeviceIdleUserWhitelist([I)V
+PLcom/android/server/AlarmManagerService$PriorityClass;-><init>(Lcom/android/server/AlarmManagerService;)V
+PLcom/android/server/AlarmManagerService$UidObserver;-><init>(Lcom/android/server/AlarmManagerService;)V
+PLcom/android/server/AlarmManagerService$UidObserver;->onUidIdle(IZ)V
+PLcom/android/server/AlarmManagerService$UninstallReceiver;-><init>(Lcom/android/server/AlarmManagerService;)V
+PLcom/android/server/AlarmManagerService;->-get0(Lcom/android/server/AlarmManagerService;)Landroid/content/Intent;
+PLcom/android/server/AlarmManagerService;->-set0(Lcom/android/server/AlarmManagerService;J)J
+PLcom/android/server/AlarmManagerService;->-wrap0(Lcom/android/server/AlarmManagerService;Landroid/app/PendingIntent;)Lcom/android/server/AlarmManagerService$BroadcastStats;
+PLcom/android/server/AlarmManagerService;->-wrap1(Lcom/android/server/AlarmManagerService;ILjava/lang/String;)Lcom/android/server/AlarmManagerService$BroadcastStats;
+PLcom/android/server/AlarmManagerService;->-wrap2(Lcom/android/server/AlarmManagerService;JJ)I
+PLcom/android/server/AlarmManagerService;->-wrap4(Lcom/android/server/AlarmManagerService;J)I
+PLcom/android/server/AlarmManagerService;->-wrap5(Lcom/android/server/AlarmManagerService;Landroid/app/PendingIntent;Landroid/app/IAlarmListener;)V
+PLcom/android/server/AlarmManagerService;->-wrap7(Lcom/android/server/AlarmManagerService;)V
+PLcom/android/server/AlarmManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/AlarmManagerService;->calculateDeliveryPriorities(Ljava/util/ArrayList;)V
+PLcom/android/server/AlarmManagerService;->checkAllowNonWakeupDelayLocked(J)Z
+PLcom/android/server/AlarmManagerService;->deliverAlarmsLocked(Ljava/util/ArrayList;J)V
+PLcom/android/server/AlarmManagerService;->findFirstWakeupBatchLocked()Lcom/android/server/AlarmManagerService$Batch;
+PLcom/android/server/AlarmManagerService;->getNextAlarmClockImpl(I)Landroid/app/AlarmManager$AlarmClockInfo;
+PLcom/android/server/AlarmManagerService;->getStatsLocked(ILjava/lang/String;)Lcom/android/server/AlarmManagerService$BroadcastStats;
+PLcom/android/server/AlarmManagerService;->getStatsLocked(Landroid/app/PendingIntent;)Lcom/android/server/AlarmManagerService$BroadcastStats;
+PLcom/android/server/AlarmManagerService;->maxTriggerTime(JJJ)J
+PLcom/android/server/AlarmManagerService;->onBootPhase(I)V
+PLcom/android/server/AlarmManagerService;->onStart()V
+PLcom/android/server/AlarmManagerService;->rebatchAllAlarms()V
+PLcom/android/server/AlarmManagerService;->removeImpl(Landroid/app/PendingIntent;)V
+PLcom/android/server/AlarmManagerService;->setDeviceIdleUserWhitelistImpl([I)V
+PLcom/android/server/AlarmManagerService;->setImplLocked(IJJJJJLandroid/app/PendingIntent;Landroid/app/IAlarmListener;Ljava/lang/String;IZLandroid/os/WorkSource;Landroid/app/AlarmManager$AlarmClockInfo;ILjava/lang/String;)V
+PLcom/android/server/AlarmManagerService;->setLocked(IJ)V
+PLcom/android/server/AlarmManagerService;->setTimeZoneImpl(Ljava/lang/String;)V
+PLcom/android/server/AlarmManagerService;->setWakelockWorkSource(Landroid/app/PendingIntent;Landroid/os/WorkSource;ILjava/lang/String;IZ)V
+PLcom/android/server/AlarmManagerService;->triggerAlarmsLocked(Ljava/util/ArrayList;JJ)Z
+PLcom/android/server/AlarmManagerService;->updateNextAlarmClockLocked()V
+PLcom/android/server/AnimationThread;-><init>()V
+PLcom/android/server/AnimationThread;->ensureThreadLocked()V
+PLcom/android/server/AnimationThread;->get()Lcom/android/server/AnimationThread;
+PLcom/android/server/AnimationThread;->getHandler()Landroid/os/Handler;
+PLcom/android/server/AnyMotionDetector$1;-><init>(Lcom/android/server/AnyMotionDetector;)V
+PLcom/android/server/AnyMotionDetector$2;-><init>(Lcom/android/server/AnyMotionDetector;)V
+PLcom/android/server/AnyMotionDetector$3;-><init>(Lcom/android/server/AnyMotionDetector;)V
+PLcom/android/server/AnyMotionDetector$4;-><init>(Lcom/android/server/AnyMotionDetector;)V
+PLcom/android/server/AnyMotionDetector$RunningSignalStats;-><init>()V
+PLcom/android/server/AnyMotionDetector$RunningSignalStats;->reset()V
+PLcom/android/server/AnyMotionDetector$Vector3;-><init>(JFFF)V
+PLcom/android/server/AnyMotionDetector;-><init>(Landroid/os/PowerManager;Landroid/os/Handler;Landroid/hardware/SensorManager;Lcom/android/server/AnyMotionDetector$DeviceIdleCallback;F)V
+PLcom/android/server/AppOpsService$1$1;-><init>(Lcom/android/server/AppOpsService$1;)V
+PLcom/android/server/AppOpsService$1$1;->doInBackground([Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/android/server/AppOpsService$1$1;->doInBackground([Ljava/lang/Void;)Ljava/lang/Void;
+PLcom/android/server/AppOpsService$1;->run()V
+PLcom/android/server/AppOpsService$2;-><init>(Lcom/android/server/AppOpsService;)V
+PLcom/android/server/AppOpsService$3;-><init>(Lcom/android/server/AppOpsService;)V
+PLcom/android/server/AppOpsService$3;->getMountMode(ILjava/lang/String;)I
+PLcom/android/server/AppOpsService$3;->hasExternalStorage(ILjava/lang/String;)Z
+PLcom/android/server/AppOpsService$Callback;->unlinkToDeath()V
+PLcom/android/server/AppOpsService$ClientRestrictionState;-><init>(Lcom/android/server/AppOpsService;Landroid/os/IBinder;)V
+PLcom/android/server/AppOpsService$ClientRestrictionState;->destroy()V
+PLcom/android/server/AppOpsService$ClientRestrictionState;->isDefault()Z
+PLcom/android/server/AppOpsService$ClientRestrictionState;->setRestriction(IZ[Ljava/lang/String;I)Z
+PLcom/android/server/AppOpsService$ClientState;-><init>(Lcom/android/server/AppOpsService;Landroid/os/IBinder;)V
+PLcom/android/server/AppOpsService$UidState;->clear()V
+PLcom/android/server/AppOpsService$UidState;->isDefault()Z
+PLcom/android/server/AppOpsService;->checkAudioOperation(IIILjava/lang/String;)I
+PLcom/android/server/AppOpsService;->checkOperation(IILjava/lang/String;)I
+PLcom/android/server/AppOpsService;->checkRestrictionLocked(IIILjava/lang/String;)I
+PLcom/android/server/AppOpsService;->checkSystemUid(Ljava/lang/String;)V
+PLcom/android/server/AppOpsService;->collectOps(Lcom/android/server/AppOpsService$Ops;[I)Ljava/util/ArrayList;
+PLcom/android/server/AppOpsService;->finishOperation(Landroid/os/IBinder;IILjava/lang/String;)V
+PLcom/android/server/AppOpsService;->getOpLocked(IILjava/lang/String;Z)Lcom/android/server/AppOpsService$Op;
+PLcom/android/server/AppOpsService;->getPackagesForUid(I)[Ljava/lang/String;
+PLcom/android/server/AppOpsService;->getToken(Landroid/os/IBinder;)Landroid/os/IBinder;
+PLcom/android/server/AppOpsService;->isOperationActive(IILjava/lang/String;)Z
+PLcom/android/server/AppOpsService;->isPackageSuspendedForUser(Ljava/lang/String;I)Z
+PLcom/android/server/AppOpsService;->notifyWatchersOfChange(I)V
+PLcom/android/server/AppOpsService;->resolvePackageName(ILjava/lang/String;)Ljava/lang/String;
+PLcom/android/server/AppOpsService;->scheduleFastWriteLocked()V
+PLcom/android/server/AppOpsService;->scheduleWriteLocked()V
+PLcom/android/server/AppOpsService;->setAudioRestriction(IIII[Ljava/lang/String;)V
+PLcom/android/server/AppOpsService;->setUidMode(III)V
+PLcom/android/server/AppOpsService;->setUserRestrictionNoCheck(IZLandroid/os/IBinder;I[Ljava/lang/String;)V
+PLcom/android/server/AppOpsService;->setUserRestrictions(Landroid/os/Bundle;Landroid/os/IBinder;I)V
+PLcom/android/server/AppOpsService;->stopWatchingMode(Lcom/android/internal/app/IAppOpsCallback;)V
+PLcom/android/server/AppOpsService;->systemReady()V
+PLcom/android/server/AppOpsService;->verifyIncomingOp(I)V
+PLcom/android/server/AttributeCache$Entry;-><init>(Landroid/content/Context;Landroid/content/res/TypedArray;)V
+PLcom/android/server/AttributeCache$Package;->-get0(Lcom/android/server/AttributeCache$Package;)Landroid/util/SparseArray;
+PLcom/android/server/AttributeCache$Package;-><init>(Landroid/content/Context;)V
+PLcom/android/server/AttributeCache;-><init>(Landroid/content/Context;)V
+PLcom/android/server/AttributeCache;->get(Ljava/lang/String;I[II)Lcom/android/server/AttributeCache$Entry;
+PLcom/android/server/AttributeCache;->init(Landroid/content/Context;)V
+PLcom/android/server/AttributeCache;->instance()Lcom/android/server/AttributeCache;
+PLcom/android/server/AttributeCache;->updateConfiguration(Landroid/content/res/Configuration;)V
+PLcom/android/server/BatteryService$2;-><init>(Lcom/android/server/BatteryService;Landroid/os/Handler;)V
+PLcom/android/server/BatteryService$9;-><init>(Lcom/android/server/BatteryService;Landroid/content/Intent;)V
+PLcom/android/server/BatteryService$9;->run()V
+PLcom/android/server/BatteryService$BatteryListener;-><init>(Lcom/android/server/BatteryService;)V
+PLcom/android/server/BatteryService$BatteryListener;-><init>(Lcom/android/server/BatteryService;Lcom/android/server/BatteryService$BatteryListener;)V
+PLcom/android/server/BatteryService$BatteryListener;->batteryPropertiesChanged(Landroid/os/BatteryProperties;)V
+PLcom/android/server/BatteryService$BinderService;-><init>(Lcom/android/server/BatteryService;)V
+PLcom/android/server/BatteryService$BinderService;-><init>(Lcom/android/server/BatteryService;Lcom/android/server/BatteryService$BinderService;)V
+PLcom/android/server/BatteryService$Led;-><init>(Lcom/android/server/BatteryService;Landroid/content/Context;Lcom/android/server/lights/LightsManager;)V
+PLcom/android/server/BatteryService$Led;->updateLightsLocked()V
+PLcom/android/server/BatteryService$LocalService;-><init>(Lcom/android/server/BatteryService;)V
+PLcom/android/server/BatteryService$LocalService;-><init>(Lcom/android/server/BatteryService;Lcom/android/server/BatteryService$LocalService;)V
+PLcom/android/server/BatteryService$LocalService;->getBatteryLevel()I
+PLcom/android/server/BatteryService$LocalService;->getBatteryLevelLow()Z
+PLcom/android/server/BatteryService$LocalService;->getPlugType()I
+PLcom/android/server/BatteryService$LocalService;->isPowered(I)Z
+PLcom/android/server/BatteryService;->-get2(Lcom/android/server/BatteryService;)Z
+PLcom/android/server/BatteryService;->-get3(Lcom/android/server/BatteryService;)Landroid/os/BatteryProperties;
+PLcom/android/server/BatteryService;->-get6(Lcom/android/server/BatteryService;)Ljava/lang/Object;
+PLcom/android/server/BatteryService;->-get7(Lcom/android/server/BatteryService;)I
+PLcom/android/server/BatteryService;->-get8(Lcom/android/server/BatteryService;)I
+PLcom/android/server/BatteryService;->-wrap0(Lcom/android/server/BatteryService;I)Z
+PLcom/android/server/BatteryService;->-wrap4(Lcom/android/server/BatteryService;Landroid/os/BatteryProperties;)V
+PLcom/android/server/BatteryService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/BatteryService;->getIconLocked(I)I
+PLcom/android/server/BatteryService;->isPoweredLocked(I)Z
+PLcom/android/server/BatteryService;->onBootPhase(I)V
+PLcom/android/server/BatteryService;->onStart()V
+PLcom/android/server/BatteryService;->processValuesLocked(Z)V
+PLcom/android/server/BatteryService;->sendIntentLocked()V
+PLcom/android/server/BatteryService;->shouldSendBatteryLowLocked()Z
+PLcom/android/server/BatteryService;->shutdownIfNoPowerLocked()V
+PLcom/android/server/BatteryService;->shutdownIfOverTempLocked()V
+PLcom/android/server/BatteryService;->update(Landroid/os/BatteryProperties;)V
+PLcom/android/server/BatteryService;->updateBatteryWarningLevelLocked()V
+PLcom/android/server/BluetoothManagerService$1;-><init>(Lcom/android/server/BluetoothManagerService;)V
+PLcom/android/server/BluetoothManagerService$1;->onBluetoothStateChange(II)V
+PLcom/android/server/BluetoothManagerService$2;-><init>(Lcom/android/server/BluetoothManagerService;)V
+PLcom/android/server/BluetoothManagerService$2;->onUserRestrictionsChanged(ILandroid/os/Bundle;Landroid/os/Bundle;)V
+PLcom/android/server/BluetoothManagerService$3;-><init>(Lcom/android/server/BluetoothManagerService;Landroid/os/Handler;)V
+PLcom/android/server/BluetoothManagerService$4;-><init>(Lcom/android/server/BluetoothManagerService;)V
+PLcom/android/server/BluetoothManagerService$4;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/BluetoothManagerService$5;-><init>(Lcom/android/server/BluetoothManagerService;Landroid/os/Handler;)V
+PLcom/android/server/BluetoothManagerService$ActiveLog;-><init>(Lcom/android/server/BluetoothManagerService;Ljava/lang/String;ZJ)V
+PLcom/android/server/BluetoothManagerService$BluetoothHandler;-><init>(Lcom/android/server/BluetoothManagerService;Landroid/os/Looper;)V
+PLcom/android/server/BluetoothManagerService$BluetoothHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/BluetoothManagerService$BluetoothServiceConnection;-><init>(Lcom/android/server/BluetoothManagerService;)V
+PLcom/android/server/BluetoothManagerService$BluetoothServiceConnection;-><init>(Lcom/android/server/BluetoothManagerService;Lcom/android/server/BluetoothManagerService$BluetoothServiceConnection;)V
+PLcom/android/server/BluetoothManagerService$BluetoothServiceConnection;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/BluetoothManagerService$ProfileServiceConnections;->-wrap0(Lcom/android/server/BluetoothManagerService$ProfileServiceConnections;)Z
+PLcom/android/server/BluetoothManagerService$ProfileServiceConnections;->-wrap1(Lcom/android/server/BluetoothManagerService$ProfileServiceConnections;Landroid/bluetooth/IBluetoothProfileServiceConnection;)V
+PLcom/android/server/BluetoothManagerService$ProfileServiceConnections;-><init>(Lcom/android/server/BluetoothManagerService;Landroid/content/Intent;)V
+PLcom/android/server/BluetoothManagerService$ProfileServiceConnections;->addProxy(Landroid/bluetooth/IBluetoothProfileServiceConnection;)V
+PLcom/android/server/BluetoothManagerService$ProfileServiceConnections;->bindService()Z
+PLcom/android/server/BluetoothManagerService$ProfileServiceConnections;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/BluetoothManagerService;->-get0(Lcom/android/server/BluetoothManagerService;)Z
+PLcom/android/server/BluetoothManagerService;->-get1(Lcom/android/server/BluetoothManagerService;)Landroid/bluetooth/IBluetooth;
+PLcom/android/server/BluetoothManagerService;->-get10(Lcom/android/server/BluetoothManagerService;)Lcom/android/server/BluetoothManagerService$BluetoothHandler;
+PLcom/android/server/BluetoothManagerService;->-get11(Lcom/android/server/BluetoothManagerService;)Ljava/util/Map;
+PLcom/android/server/BluetoothManagerService;->-get12(Lcom/android/server/BluetoothManagerService;)Z
+PLcom/android/server/BluetoothManagerService;->-get15(Lcom/android/server/BluetoothManagerService;)Landroid/os/RemoteCallbackList;
+PLcom/android/server/BluetoothManagerService;->-get2(Lcom/android/server/BluetoothManagerService;)Landroid/bluetooth/IBluetoothCallback;
+PLcom/android/server/BluetoothManagerService;->-get3(Lcom/android/server/BluetoothManagerService;)Ljava/util/concurrent/locks/ReentrantReadWriteLock;
+PLcom/android/server/BluetoothManagerService;->-get4(Lcom/android/server/BluetoothManagerService;)Landroid/os/RemoteCallbackList;
+PLcom/android/server/BluetoothManagerService;->-get7(Lcom/android/server/BluetoothManagerService;)Z
+PLcom/android/server/BluetoothManagerService;->-get9(Lcom/android/server/BluetoothManagerService;)I
+PLcom/android/server/BluetoothManagerService;->-set0(Lcom/android/server/BluetoothManagerService;Z)Z
+PLcom/android/server/BluetoothManagerService;->-set1(Lcom/android/server/BluetoothManagerService;Landroid/bluetooth/IBluetooth;)Landroid/bluetooth/IBluetooth;
+PLcom/android/server/BluetoothManagerService;->-set2(Lcom/android/server/BluetoothManagerService;Landroid/os/IBinder;)Landroid/os/IBinder;
+PLcom/android/server/BluetoothManagerService;->-set3(Lcom/android/server/BluetoothManagerService;Landroid/bluetooth/IBluetoothGatt;)Landroid/bluetooth/IBluetoothGatt;
+PLcom/android/server/BluetoothManagerService;->-set4(Lcom/android/server/BluetoothManagerService;Z)Z
+PLcom/android/server/BluetoothManagerService;->-set7(Lcom/android/server/BluetoothManagerService;Z)Z
+PLcom/android/server/BluetoothManagerService;->-set8(Lcom/android/server/BluetoothManagerService;I)I
+PLcom/android/server/BluetoothManagerService;->-wrap11(Lcom/android/server/BluetoothManagerService;Z)V
+PLcom/android/server/BluetoothManagerService;->-wrap12(Lcom/android/server/BluetoothManagerService;)V
+PLcom/android/server/BluetoothManagerService;->-wrap16(Lcom/android/server/BluetoothManagerService;)V
+PLcom/android/server/BluetoothManagerService;->-wrap19(Lcom/android/server/BluetoothManagerService;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/BluetoothManagerService;->-wrap2(Lcom/android/server/BluetoothManagerService;)Z
+PLcom/android/server/BluetoothManagerService;->-wrap7(Lcom/android/server/BluetoothManagerService;II)V
+PLcom/android/server/BluetoothManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/BluetoothManagerService;->addActiveLog(Ljava/lang/String;Z)V
+PLcom/android/server/BluetoothManagerService;->bindBluetoothProfileService(ILandroid/bluetooth/IBluetoothProfileServiceConnection;)Z
+PLcom/android/server/BluetoothManagerService;->bluetoothStateChangeHandler(II)V
+PLcom/android/server/BluetoothManagerService;->checkIfCallerIsForegroundUser()Z
+PLcom/android/server/BluetoothManagerService;->doBind(Landroid/content/Intent;Landroid/content/ServiceConnection;ILandroid/os/UserHandle;)Z
+PLcom/android/server/BluetoothManagerService;->getAddress()Ljava/lang/String;
+PLcom/android/server/BluetoothManagerService;->getBluetoothGatt()Landroid/bluetooth/IBluetoothGatt;
+PLcom/android/server/BluetoothManagerService;->handleEnable(Z)V
+PLcom/android/server/BluetoothManagerService;->handleOnBootPhase()V
+PLcom/android/server/BluetoothManagerService;->handleOnUnlockUser(I)V
+PLcom/android/server/BluetoothManagerService;->isAirplaneModeOn()Z
+PLcom/android/server/BluetoothManagerService;->isBleScanAlwaysAvailable()Z
+PLcom/android/server/BluetoothManagerService;->isBluetoothDisallowed()Z
+PLcom/android/server/BluetoothManagerService;->isBluetoothPersistedStateOn()Z
+PLcom/android/server/BluetoothManagerService;->isBluetoothPersistedStateOnBluetooth()Z
+PLcom/android/server/BluetoothManagerService;->isNameAndAddressSet()Z
+PLcom/android/server/BluetoothManagerService;->loadStoredNameAndAddress()V
+PLcom/android/server/BluetoothManagerService;->onBluetoothGattServiceUp()V
+PLcom/android/server/BluetoothManagerService;->persistBluetoothSetting(I)V
+PLcom/android/server/BluetoothManagerService;->registerAdapter(Landroid/bluetooth/IBluetoothManagerCallback;)Landroid/bluetooth/IBluetooth;
+PLcom/android/server/BluetoothManagerService;->registerForBleScanModeChange()V
+PLcom/android/server/BluetoothManagerService;->registerStateChangeCallback(Landroid/bluetooth/IBluetoothStateChangeCallback;)V
+PLcom/android/server/BluetoothManagerService;->sendBleStateChanged(II)V
+PLcom/android/server/BluetoothManagerService;->sendBluetoothServiceUpCallback()V
+PLcom/android/server/BluetoothManagerService;->sendBluetoothStateCallback(Z)V
+PLcom/android/server/BluetoothManagerService;->sendEnableMsg(ZLjava/lang/String;)V
+PLcom/android/server/BluetoothManagerService;->storeNameAndAddress(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/BluetoothService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/BluetoothService;->onBootPhase(I)V
+PLcom/android/server/BluetoothService;->onStart()V
+PLcom/android/server/BluetoothService;->onUnlockUser(I)V
+PLcom/android/server/CertBlacklister$BlacklistObserver;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentResolver;)V
+PLcom/android/server/CertBlacklister;-><init>(Landroid/content/Context;)V
+PLcom/android/server/CertBlacklister;->buildPubkeyObserver(Landroid/content/ContentResolver;)Lcom/android/server/CertBlacklister$BlacklistObserver;
+PLcom/android/server/CertBlacklister;->buildSerialObserver(Landroid/content/ContentResolver;)Lcom/android/server/CertBlacklister$BlacklistObserver;
+PLcom/android/server/CertBlacklister;->registerObservers(Landroid/content/ContentResolver;)V
+PLcom/android/server/CommonTimeManagementService$1;-><init>(Lcom/android/server/CommonTimeManagementService;)V
+PLcom/android/server/CommonTimeManagementService$2;-><init>(Lcom/android/server/CommonTimeManagementService;)V
+PLcom/android/server/CommonTimeManagementService$InterfaceScoreRule;-><init>(Ljava/lang/String;B)V
+PLcom/android/server/CommonTimeManagementService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/CommonTimeManagementService;->systemRunning()V
+PLcom/android/server/ConnectivityService$1;-><init>(Lcom/android/server/ConnectivityService;)V
+PLcom/android/server/ConnectivityService$1;->interfaceClassDataActivityChanged(Ljava/lang/String;ZJ)V
+PLcom/android/server/ConnectivityService$2;-><init>(Lcom/android/server/ConnectivityService;)V
+PLcom/android/server/ConnectivityService$2;->onMeteredIfacesChanged([Ljava/lang/String;)V
+PLcom/android/server/ConnectivityService$2;->onUidRulesChanged(II)V
+PLcom/android/server/ConnectivityService$3;-><init>(Lcom/android/server/ConnectivityService;)V
+PLcom/android/server/ConnectivityService$3;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/ConnectivityService$4;-><init>(Lcom/android/server/ConnectivityService;)V
+PLcom/android/server/ConnectivityService$4;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/ConnectivityService$InternalHandler;-><init>(Lcom/android/server/ConnectivityService;Landroid/os/Looper;)V
+PLcom/android/server/ConnectivityService$InternalHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/ConnectivityService$LegacyTypeTracker;-><init>(Lcom/android/server/ConnectivityService;)V
+PLcom/android/server/ConnectivityService$LegacyTypeTracker;->add(ILcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/ConnectivityService$LegacyTypeTracker;->addSupportedType(I)V
+PLcom/android/server/ConnectivityService$LegacyTypeTracker;->getNetworkForType(I)Lcom/android/server/connectivity/NetworkAgentInfo;
+PLcom/android/server/ConnectivityService$LegacyTypeTracker;->isTypeSupported(I)Z
+PLcom/android/server/ConnectivityService$LegacyTypeTracker;->maybeLogBroadcast(Lcom/android/server/connectivity/NetworkAgentInfo;Landroid/net/NetworkInfo$DetailedState;IZ)V
+PLcom/android/server/ConnectivityService$NetworkFactoryInfo;-><init>(Ljava/lang/String;Landroid/os/Messenger;Lcom/android/internal/util/AsyncChannel;)V
+PLcom/android/server/ConnectivityService$NetworkRequestInfo;-><init>(Lcom/android/server/ConnectivityService;Landroid/os/Messenger;Landroid/net/NetworkRequest;Landroid/os/IBinder;)V
+PLcom/android/server/ConnectivityService$NetworkRequestInfo;->binderDied()V
+PLcom/android/server/ConnectivityService$NetworkRequestInfo;->enforceRequestCountLimit()V
+PLcom/android/server/ConnectivityService$NetworkRequestInfo;->toString()Ljava/lang/String;
+PLcom/android/server/ConnectivityService$NetworkRequestInfo;->unlinkDeathRecipient()V
+PLcom/android/server/ConnectivityService$NetworkStateTrackerHandler;-><init>(Lcom/android/server/ConnectivityService;Landroid/os/Looper;)V
+PLcom/android/server/ConnectivityService$NetworkStateTrackerHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/ConnectivityService$NetworkStateTrackerHandler;->maybeHandleAsyncChannelMessage(Landroid/os/Message;)Z
+PLcom/android/server/ConnectivityService$NetworkStateTrackerHandler;->maybeHandleNetworkAgentInfoMessage(Landroid/os/Message;)Z
+PLcom/android/server/ConnectivityService$NetworkStateTrackerHandler;->maybeHandleNetworkAgentMessage(Landroid/os/Message;)V
+PLcom/android/server/ConnectivityService$NetworkStateTrackerHandler;->maybeHandleNetworkMonitorMessage(Landroid/os/Message;)Z
+PLcom/android/server/ConnectivityService$ReapUnvalidatedNetworks;-><init>(Ljava/lang/String;I)V
+PLcom/android/server/ConnectivityService$SettingsObserver;-><init>(Landroid/content/Context;Landroid/os/Handler;)V
+PLcom/android/server/ConnectivityService$SettingsObserver;->observe(Landroid/net/Uri;I)V
+PLcom/android/server/ConnectivityService$UnneededFor;-><init>(Ljava/lang/String;I)V
+PLcom/android/server/ConnectivityService$UnneededFor;->values()[Lcom/android/server/ConnectivityService$UnneededFor;
+PLcom/android/server/ConnectivityService$ValidationLog;-><init>(Landroid/net/Network;Ljava/lang/String;Landroid/util/LocalLog$ReadOnlyLocalLog;)V
+PLcom/android/server/ConnectivityService;->-get1(Lcom/android/server/ConnectivityService;)Landroid/content/Context;
+PLcom/android/server/ConnectivityService;->-get4(Lcom/android/server/ConnectivityService;)Ljava/util/HashMap;
+PLcom/android/server/ConnectivityService;->-get5(Lcom/android/server/ConnectivityService;)Landroid/util/SparseArray;
+PLcom/android/server/ConnectivityService;->-get6(Lcom/android/server/ConnectivityService;)Lcom/android/server/connectivity/NetworkNotificationManager;
+PLcom/android/server/ConnectivityService;->-get8(Lcom/android/server/ConnectivityService;)Landroid/util/SparseIntArray;
+PLcom/android/server/ConnectivityService;->-getcom-android-server-ConnectivityService$UnneededForSwitchesValues()[I
+PLcom/android/server/ConnectivityService;->-wrap0(Lcom/android/server/ConnectivityService;Lcom/android/server/connectivity/NetworkAgentInfo;)Z
+PLcom/android/server/ConnectivityService;->-wrap10(Lcom/android/server/ConnectivityService;)V
+PLcom/android/server/ConnectivityService;->-wrap12(Lcom/android/server/ConnectivityService;Landroid/net/Network;)V
+PLcom/android/server/ConnectivityService;->-wrap13(Lcom/android/server/ConnectivityService;Lcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/ConnectivityService;->-wrap14(Lcom/android/server/ConnectivityService;Lcom/android/server/ConnectivityService$NetworkFactoryInfo;)V
+PLcom/android/server/ConnectivityService;->-wrap16(Lcom/android/server/ConnectivityService;Lcom/android/server/ConnectivityService$NetworkRequestInfo;)V
+PLcom/android/server/ConnectivityService;->-wrap18(Lcom/android/server/ConnectivityService;Landroid/net/NetworkRequest;I)V
+PLcom/android/server/ConnectivityService;->-wrap2(I)Z
+PLcom/android/server/ConnectivityService;->-wrap20(Lcom/android/server/ConnectivityService;Landroid/net/Network;IZ)V
+PLcom/android/server/ConnectivityService;->-wrap25(Ljava/lang/String;)V
+PLcom/android/server/ConnectivityService;->-wrap29(Lcom/android/server/ConnectivityService;I)V
+PLcom/android/server/ConnectivityService;->-wrap31(Lcom/android/server/ConnectivityService;I)V
+PLcom/android/server/ConnectivityService;->-wrap32(Lcom/android/server/ConnectivityService;IZJ)V
+PLcom/android/server/ConnectivityService;->-wrap33(Lcom/android/server/ConnectivityService;Lcom/android/server/connectivity/NetworkAgentInfo;Landroid/net/NetworkInfo$DetailedState;I)V
+PLcom/android/server/ConnectivityService;->-wrap34(Lcom/android/server/ConnectivityService;Lcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/ConnectivityService;->-wrap36(Lcom/android/server/ConnectivityService;ILcom/android/server/connectivity/NetworkAgentInfo;Landroid/net/NetworkCapabilities;)V
+PLcom/android/server/ConnectivityService;->-wrap37(Lcom/android/server/ConnectivityService;Lcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/ConnectivityService;->-wrap38(Lcom/android/server/ConnectivityService;Lcom/android/server/connectivity/NetworkAgentInfo;Landroid/net/LinkProperties;)V
+PLcom/android/server/ConnectivityService;->-wrap39(Lcom/android/server/ConnectivityService;Lcom/android/server/connectivity/NetworkAgentInfo;Landroid/net/NetworkInfo;)V
+PLcom/android/server/ConnectivityService;->-wrap4(Lcom/android/server/ConnectivityService;Landroid/net/NetworkRequest;)V
+PLcom/android/server/ConnectivityService;->-wrap40(Lcom/android/server/ConnectivityService;Lcom/android/server/connectivity/NetworkAgentInfo;I)V
+PLcom/android/server/ConnectivityService;->-wrap7(Lcom/android/server/ConnectivityService;Landroid/os/Message;)V
+PLcom/android/server/ConnectivityService;->-wrap8(Lcom/android/server/ConnectivityService;)V
+PLcom/android/server/ConnectivityService;-><init>(Landroid/content/Context;Landroid/os/INetworkManagementService;Landroid/net/INetworkStatsService;Landroid/net/INetworkPolicyManager;)V
+PLcom/android/server/ConnectivityService;-><init>(Landroid/content/Context;Landroid/os/INetworkManagementService;Landroid/net/INetworkStatsService;Landroid/net/INetworkPolicyManager;Landroid/net/metrics/IpConnectivityLog;)V
+PLcom/android/server/ConnectivityService;->addValidationLogs(Landroid/util/LocalLog$ReadOnlyLocalLog;Landroid/net/Network;Ljava/lang/String;)V
+PLcom/android/server/ConnectivityService;->avoidBadWifi()Z
+PLcom/android/server/ConnectivityService;->callCallbackForRequest(Lcom/android/server/ConnectivityService$NetworkRequestInfo;Lcom/android/server/connectivity/NetworkAgentInfo;II)V
+PLcom/android/server/ConnectivityService;->canonicalizeProxyInfo(Landroid/net/ProxyInfo;)Landroid/net/ProxyInfo;
+PLcom/android/server/ConnectivityService;->createInternetRequestForTransport(ILandroid/net/NetworkRequest$Type;)Landroid/net/NetworkRequest;
+PLcom/android/server/ConnectivityService;->createMultinetworkPolicyTracker(Landroid/content/Context;Landroid/os/Handler;Ljava/lang/Runnable;)Landroid/net/util/MultinetworkPolicyTracker;
+PLcom/android/server/ConnectivityService;->createNetworkMonitor(Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/connectivity/NetworkAgentInfo;Landroid/net/NetworkRequest;)Lcom/android/server/connectivity/NetworkMonitor;
+PLcom/android/server/ConnectivityService;->createVpnInfo(Lcom/android/server/connectivity/Vpn;)Lcom/android/internal/net/VpnInfo;
+PLcom/android/server/ConnectivityService;->encodeBool(Z)I
+PLcom/android/server/ConnectivityService;->enforceAccessPermission()V
+PLcom/android/server/ConnectivityService;->enforceConnectivityInternalPermission()V
+PLcom/android/server/ConnectivityService;->enforceCrossUserPermission(I)V
+PLcom/android/server/ConnectivityService;->enforceInternetPermission()V
+PLcom/android/server/ConnectivityService;->enforceTetherAccessPermission()V
+PLcom/android/server/ConnectivityService;->ensureNetworkRequestHasType(Landroid/net/NetworkRequest;)V
+PLcom/android/server/ConnectivityService;->ensureRequestableCapabilities(Landroid/net/NetworkCapabilities;)V
+PLcom/android/server/ConnectivityService;->ensureValidNetworkSpecifier(Landroid/net/NetworkCapabilities;)V
+PLcom/android/server/ConnectivityService;->flushVmDnsCache()V
+PLcom/android/server/ConnectivityService;->getActiveLinkProperties()Landroid/net/LinkProperties;
+PLcom/android/server/ConnectivityService;->getActiveNetwork()Landroid/net/Network;
+PLcom/android/server/ConnectivityService;->getActiveNetworkForUid(IZ)Landroid/net/Network;
+PLcom/android/server/ConnectivityService;->getActiveNetworkForUidInternal(IZ)Landroid/net/Network;
+PLcom/android/server/ConnectivityService;->getAllNetworkInfo()[Landroid/net/NetworkInfo;
+PLcom/android/server/ConnectivityService;->getAllNetworkState()[Landroid/net/NetworkState;
+PLcom/android/server/ConnectivityService;->getAllNetworks()[Landroid/net/Network;
+PLcom/android/server/ConnectivityService;->getAllVpnInfo()[Lcom/android/internal/net/VpnInfo;
+PLcom/android/server/ConnectivityService;->getDefaultNetworkCapabilitiesForUser(I)[Landroid/net/NetworkCapabilities;
+PLcom/android/server/ConnectivityService;->getDefaultProxy()Landroid/net/ProxyInfo;
+PLcom/android/server/ConnectivityService;->getFilteredNetworkState(IIZ)Landroid/net/NetworkState;
+PLcom/android/server/ConnectivityService;->getGlobalProxy()Landroid/net/ProxyInfo;
+PLcom/android/server/ConnectivityService;->getLinkProperties(Landroid/net/Network;)Landroid/net/LinkProperties;
+PLcom/android/server/ConnectivityService;->getLinkProperties(Lcom/android/server/connectivity/NetworkAgentInfo;)Landroid/net/LinkProperties;
+PLcom/android/server/ConnectivityService;->getNetworkAgentInfoForNetwork(Landroid/net/Network;)Lcom/android/server/connectivity/NetworkAgentInfo;
+PLcom/android/server/ConnectivityService;->getNetworkCapabilities(Landroid/net/Network;)Landroid/net/NetworkCapabilities;
+PLcom/android/server/ConnectivityService;->getNetworkCapabilitiesInternal(Lcom/android/server/connectivity/NetworkAgentInfo;)Landroid/net/NetworkCapabilities;
+PLcom/android/server/ConnectivityService;->getNetworkInfo(I)Landroid/net/NetworkInfo;
+PLcom/android/server/ConnectivityService;->getNetworkInfoForUid(Landroid/net/Network;IZ)Landroid/net/NetworkInfo;
+PLcom/android/server/ConnectivityService;->getNetworkPermission(Landroid/net/NetworkCapabilities;)Ljava/lang/String;
+PLcom/android/server/ConnectivityService;->getNriForAppRequest(Landroid/net/NetworkRequest;ILjava/lang/String;)Lcom/android/server/ConnectivityService$NetworkRequestInfo;
+PLcom/android/server/ConnectivityService;->getProxyForNetwork(Landroid/net/Network;)Landroid/net/ProxyInfo;
+PLcom/android/server/ConnectivityService;->getSignalStrengthThresholds(Lcom/android/server/connectivity/NetworkAgentInfo;)Ljava/util/ArrayList;
+PLcom/android/server/ConnectivityService;->getSystemProperties()Lcom/android/server/connectivity/MockableSystemProperties;
+PLcom/android/server/ConnectivityService;->getVpnConfig(I)Lcom/android/internal/net/VpnConfig;
+PLcom/android/server/ConnectivityService;->handleApplyDefaultProxy(Landroid/net/ProxyInfo;)V
+PLcom/android/server/ConnectivityService;->handleAsyncChannelHalfConnect(Landroid/os/Message;)V
+PLcom/android/server/ConnectivityService;->handleDeprecatedGlobalHttpProxy()V
+PLcom/android/server/ConnectivityService;->handleMobileDataAlwaysOn()V
+PLcom/android/server/ConnectivityService;->handlePromptUnvalidated(Landroid/net/Network;)V
+PLcom/android/server/ConnectivityService;->handleRegisterNetworkAgent(Lcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/ConnectivityService;->handleRegisterNetworkFactory(Lcom/android/server/ConnectivityService$NetworkFactoryInfo;)V
+PLcom/android/server/ConnectivityService;->handleRegisterNetworkRequest(Lcom/android/server/ConnectivityService$NetworkRequestInfo;)V
+PLcom/android/server/ConnectivityService;->handleReleaseNetworkRequest(Landroid/net/NetworkRequest;I)V
+PLcom/android/server/ConnectivityService;->handleRemoveNetworkRequest(Lcom/android/server/ConnectivityService$NetworkRequestInfo;)V
+PLcom/android/server/ConnectivityService;->handleReportNetworkConnectivity(Landroid/net/Network;IZ)V
+PLcom/android/server/ConnectivityService;->hasWifiNetworkListenPermission(Landroid/net/NetworkCapabilities;)Z
+PLcom/android/server/ConnectivityService;->isActiveNetworkMetered()Z
+PLcom/android/server/ConnectivityService;->isDefaultNetwork(Lcom/android/server/connectivity/NetworkAgentInfo;)Z
+PLcom/android/server/ConnectivityService;->isDefaultRequest(Lcom/android/server/ConnectivityService$NetworkRequestInfo;)Z
+PLcom/android/server/ConnectivityService;->isNetworkSupported(I)Z
+PLcom/android/server/ConnectivityService;->isSystem(I)Z
+PLcom/android/server/ConnectivityService;->isTetheringSupported()Z
+PLcom/android/server/ConnectivityService;->listenForNetwork(Landroid/net/NetworkCapabilities;Landroid/os/Messenger;Landroid/os/IBinder;)Landroid/net/NetworkRequest;
+PLcom/android/server/ConnectivityService;->loadGlobalProxy()V
+PLcom/android/server/ConnectivityService;->log(Ljava/lang/String;)V
+PLcom/android/server/ConnectivityService;->logDefaultNetworkEvent(Lcom/android/server/connectivity/NetworkAgentInfo;Lcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/ConnectivityService;->makeDefault(Lcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/ConnectivityService;->makeGeneralIntent(Landroid/net/NetworkInfo;Ljava/lang/String;)Landroid/content/Intent;
+PLcom/android/server/ConnectivityService;->makeTethering()Lcom/android/server/connectivity/Tethering;
+PLcom/android/server/ConnectivityService;->nextNetworkRequestId()I
+PLcom/android/server/ConnectivityService;->notifyIfacesChangedForNetworkStats()V
+PLcom/android/server/ConnectivityService;->notifyLockdownVpn(Lcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/ConnectivityService;->notifyNetworkAvailable(Lcom/android/server/connectivity/NetworkAgentInfo;Lcom/android/server/ConnectivityService$NetworkRequestInfo;)V
+PLcom/android/server/ConnectivityService;->notifyNetworkCallbacks(Lcom/android/server/connectivity/NetworkAgentInfo;I)V
+PLcom/android/server/ConnectivityService;->notifyNetworkCallbacks(Lcom/android/server/connectivity/NetworkAgentInfo;II)V
+PLcom/android/server/ConnectivityService;->onUserStart(I)V
+PLcom/android/server/ConnectivityService;->onUserUnlocked(I)V
+PLcom/android/server/ConnectivityService;->proxyInfoEqual(Landroid/net/ProxyInfo;Landroid/net/ProxyInfo;)Z
+PLcom/android/server/ConnectivityService;->putParcelable(Landroid/os/Bundle;Landroid/os/Parcelable;)V
+PLcom/android/server/ConnectivityService;->registerNetworkAgent(Landroid/os/Messenger;Landroid/net/NetworkInfo;Landroid/net/LinkProperties;Landroid/net/NetworkCapabilities;ILandroid/net/NetworkMisc;)I
+PLcom/android/server/ConnectivityService;->registerNetworkFactory(Landroid/os/Messenger;Ljava/lang/String;)V
+PLcom/android/server/ConnectivityService;->registerSettingsCallbacks()V
+PLcom/android/server/ConnectivityService;->releaseNetworkRequest(Landroid/net/NetworkRequest;)V
+PLcom/android/server/ConnectivityService;->rematchAllNetworksAndRequests(Lcom/android/server/connectivity/NetworkAgentInfo;I)V
+PLcom/android/server/ConnectivityService;->rematchNetworkAndRequests(Lcom/android/server/connectivity/NetworkAgentInfo;Lcom/android/server/ConnectivityService$ReapUnvalidatedNetworks;J)V
+PLcom/android/server/ConnectivityService;->reportNetworkConnectivity(Landroid/net/Network;Z)V
+PLcom/android/server/ConnectivityService;->requestNetwork(Landroid/net/NetworkCapabilities;Landroid/os/Messenger;ILandroid/os/IBinder;I)Landroid/net/NetworkRequest;
+PLcom/android/server/ConnectivityService;->reserveNetId()I
+PLcom/android/server/ConnectivityService;->scheduleReleaseNetworkTransitionWakelock()V
+PLcom/android/server/ConnectivityService;->scheduleUnvalidatedPrompt(Lcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/ConnectivityService;->sendConnectedBroadcast(Landroid/net/NetworkInfo;)V
+PLcom/android/server/ConnectivityService;->sendDataActivityBroadcast(IZJ)V
+PLcom/android/server/ConnectivityService;->sendGeneralBroadcast(Landroid/net/NetworkInfo;Ljava/lang/String;)V
+PLcom/android/server/ConnectivityService;->sendInetConditionBroadcast(Landroid/net/NetworkInfo;)V
+PLcom/android/server/ConnectivityService;->sendLegacyNetworkBroadcast(Lcom/android/server/connectivity/NetworkAgentInfo;Landroid/net/NetworkInfo$DetailedState;I)V
+PLcom/android/server/ConnectivityService;->sendStickyBroadcast(Landroid/content/Intent;)V
+PLcom/android/server/ConnectivityService;->sendUpdatedScoreToFactories(Landroid/net/NetworkRequest;I)V
+PLcom/android/server/ConnectivityService;->sendUpdatedScoreToFactories(Lcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/ConnectivityService;->setDefaultDnsSystemProperties(Ljava/util/Collection;)V
+PLcom/android/server/ConnectivityService;->setLockdownTracker(Lcom/android/server/net/LockdownVpnTracker;)V
+PLcom/android/server/ConnectivityService;->setNetDnsProperty(ILjava/lang/String;)V
+PLcom/android/server/ConnectivityService;->setupDataActivityTracking(Lcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/ConnectivityService;->startAlwaysOnVpn(I)Z
+PLcom/android/server/ConnectivityService;->systemReady()V
+PLcom/android/server/ConnectivityService;->toBool(I)Z
+PLcom/android/server/ConnectivityService;->unneeded(Lcom/android/server/connectivity/NetworkAgentInfo;Lcom/android/server/ConnectivityService$UnneededFor;)Z
+PLcom/android/server/ConnectivityService;->updateCapabilities(ILcom/android/server/connectivity/NetworkAgentInfo;Landroid/net/NetworkCapabilities;)V
+PLcom/android/server/ConnectivityService;->updateClat(Landroid/net/LinkProperties;Landroid/net/LinkProperties;Lcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/ConnectivityService;->updateDnses(Landroid/net/LinkProperties;Landroid/net/LinkProperties;I)V
+PLcom/android/server/ConnectivityService;->updateInetCondition(Lcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/ConnectivityService;->updateInterfaces(Landroid/net/LinkProperties;Landroid/net/LinkProperties;ILandroid/net/NetworkCapabilities;)V
+PLcom/android/server/ConnectivityService;->updateLingerState(Lcom/android/server/connectivity/NetworkAgentInfo;J)V
+PLcom/android/server/ConnectivityService;->updateLinkProperties(Lcom/android/server/connectivity/NetworkAgentInfo;Landroid/net/LinkProperties;)V
+PLcom/android/server/ConnectivityService;->updateLockdownVpn()Z
+PLcom/android/server/ConnectivityService;->updateMtu(Landroid/net/LinkProperties;Landroid/net/LinkProperties;)V
+PLcom/android/server/ConnectivityService;->updateNetworkInfo(Lcom/android/server/connectivity/NetworkAgentInfo;Landroid/net/NetworkInfo;)V
+PLcom/android/server/ConnectivityService;->updateNetworkScore(Lcom/android/server/connectivity/NetworkAgentInfo;I)V
+PLcom/android/server/ConnectivityService;->updateProxy(Landroid/net/LinkProperties;Landroid/net/LinkProperties;Lcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/ConnectivityService;->updateRoutes(Landroid/net/LinkProperties;Landroid/net/LinkProperties;I)Z
+PLcom/android/server/ConnectivityService;->updateSignalStrengthThresholds(Lcom/android/server/connectivity/NetworkAgentInfo;Ljava/lang/String;Landroid/net/NetworkRequest;)V
+PLcom/android/server/ConnectivityService;->updateTcpBufferSizes(Lcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/ConnectivityService;->wakeupAddInterface(Ljava/lang/String;Landroid/net/NetworkCapabilities;)V
+PLcom/android/server/ConsumerIrService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/ContextHubSystemService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/ContextHubSystemService;->onBootPhase(I)V
+PLcom/android/server/ContextHubSystemService;->onStart()V
+PLcom/android/server/CountryDetectorService$1;-><init>(Lcom/android/server/CountryDetectorService;)V
+PLcom/android/server/CountryDetectorService$2;-><init>(Lcom/android/server/CountryDetectorService;Landroid/location/CountryListener;)V
+PLcom/android/server/CountryDetectorService$2;->run()V
+PLcom/android/server/CountryDetectorService$Receiver;-><init>(Lcom/android/server/CountryDetectorService;Landroid/location/ICountryListener;)V
+PLcom/android/server/CountryDetectorService;->-get0(Lcom/android/server/CountryDetectorService;)Lcom/android/server/location/ComprehensiveCountryDetector;
+PLcom/android/server/CountryDetectorService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/CountryDetectorService;->addCountryListener(Landroid/location/ICountryListener;)V
+PLcom/android/server/CountryDetectorService;->addListener(Landroid/location/ICountryListener;)V
+PLcom/android/server/CountryDetectorService;->detectCountry()Landroid/location/Country;
+PLcom/android/server/CountryDetectorService;->initialize()V
+PLcom/android/server/CountryDetectorService;->run()V
+PLcom/android/server/CountryDetectorService;->setCountryListener(Landroid/location/CountryListener;)V
+PLcom/android/server/CountryDetectorService;->systemRunning()V
+PLcom/android/server/DeviceIdleController$1;-><init>(Lcom/android/server/DeviceIdleController;)V
+PLcom/android/server/DeviceIdleController$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/DeviceIdleController$2;-><init>(Lcom/android/server/DeviceIdleController;)V
+PLcom/android/server/DeviceIdleController$3;-><init>(Lcom/android/server/DeviceIdleController;)V
+PLcom/android/server/DeviceIdleController$4;-><init>(Lcom/android/server/DeviceIdleController;)V
+PLcom/android/server/DeviceIdleController$5;-><init>(Lcom/android/server/DeviceIdleController;)V
+PLcom/android/server/DeviceIdleController$6;-><init>(Lcom/android/server/DeviceIdleController;)V
+PLcom/android/server/DeviceIdleController$7;-><init>(Lcom/android/server/DeviceIdleController;)V
+PLcom/android/server/DeviceIdleController$8;-><init>(Lcom/android/server/DeviceIdleController;)V
+PLcom/android/server/DeviceIdleController$BinderService;-><init>(Lcom/android/server/DeviceIdleController;)V
+PLcom/android/server/DeviceIdleController$BinderService;-><init>(Lcom/android/server/DeviceIdleController;Lcom/android/server/DeviceIdleController$BinderService;)V
+PLcom/android/server/DeviceIdleController$BinderService;->getAppIdTempWhitelist()[I
+PLcom/android/server/DeviceIdleController$BinderService;->getAppIdWhitelist()[I
+PLcom/android/server/DeviceIdleController$BinderService;->getAppIdWhitelistExceptIdle()[I
+PLcom/android/server/DeviceIdleController$BinderService;->isPowerSaveWhitelistApp(Ljava/lang/String;)Z
+PLcom/android/server/DeviceIdleController$BinderService;->isPowerSaveWhitelistExceptIdleApp(Ljava/lang/String;)Z
+PLcom/android/server/DeviceIdleController$Constants;-><init>(Lcom/android/server/DeviceIdleController;Landroid/os/Handler;Landroid/content/ContentResolver;)V
+PLcom/android/server/DeviceIdleController$Constants;->updateConstants()V
+PLcom/android/server/DeviceIdleController$LocalService;-><init>(Lcom/android/server/DeviceIdleController;)V
+PLcom/android/server/DeviceIdleController$LocalService;->addPowerSaveTempWhitelistApp(ILjava/lang/String;JIZLjava/lang/String;)V
+PLcom/android/server/DeviceIdleController$LocalService;->getNotificationWhitelistDuration()J
+PLcom/android/server/DeviceIdleController$LocalService;->setAlarmsActive(Z)V
+PLcom/android/server/DeviceIdleController$LocalService;->setJobsActive(Z)V
+PLcom/android/server/DeviceIdleController$LocalService;->setNetworkPolicyTempWhitelistCallback(Ljava/lang/Runnable;)V
+PLcom/android/server/DeviceIdleController$MotionListener;-><init>(Lcom/android/server/DeviceIdleController;)V
+PLcom/android/server/DeviceIdleController$MotionListener;-><init>(Lcom/android/server/DeviceIdleController;Lcom/android/server/DeviceIdleController$MotionListener;)V
+PLcom/android/server/DeviceIdleController$MyHandler;-><init>(Lcom/android/server/DeviceIdleController;Landroid/os/Looper;)V
+PLcom/android/server/DeviceIdleController$MyHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/DeviceIdleController;->-get1(Lcom/android/server/DeviceIdleController;)Lcom/android/server/DeviceIdleController$Constants;
+PLcom/android/server/DeviceIdleController;->-get7(Lcom/android/server/DeviceIdleController;)Landroid/os/RemoteCallbackList;
+PLcom/android/server/DeviceIdleController;-><init>(Landroid/content/Context;)V
+PLcom/android/server/DeviceIdleController;->addPowerSaveTempWhitelistAppDirectInternal(IIJZLjava/lang/String;)V
+PLcom/android/server/DeviceIdleController;->addPowerSaveTempWhitelistAppInternal(ILjava/lang/String;JIZLjava/lang/String;)V
+PLcom/android/server/DeviceIdleController;->becomeActiveLocked(Ljava/lang/String;I)V
+PLcom/android/server/DeviceIdleController;->buildAppIdArray(Landroid/util/ArrayMap;Landroid/util/ArrayMap;Landroid/util/SparseBooleanArray;)[I
+PLcom/android/server/DeviceIdleController;->checkTempAppWhitelistTimeout(I)V
+PLcom/android/server/DeviceIdleController;->exitMaintenanceEarlyIfNeededLocked()V
+PLcom/android/server/DeviceIdleController;->getAppIdTempWhitelistInternal()[I
+PLcom/android/server/DeviceIdleController;->getAppIdWhitelistExceptIdleInternal()[I
+PLcom/android/server/DeviceIdleController;->getAppIdWhitelistInternal()[I
+PLcom/android/server/DeviceIdleController;->getSystemDir()Ljava/io/File;
+PLcom/android/server/DeviceIdleController;->isPowerSaveWhitelistAppInternal(Ljava/lang/String;)Z
+PLcom/android/server/DeviceIdleController;->isPowerSaveWhitelistExceptIdleAppInternal(Ljava/lang/String;)Z
+PLcom/android/server/DeviceIdleController;->onBootPhase(I)V
+PLcom/android/server/DeviceIdleController;->onStart()V
+PLcom/android/server/DeviceIdleController;->postTempActiveTimeoutMessage(IJ)V
+PLcom/android/server/DeviceIdleController;->readConfigFileLocked()V
+PLcom/android/server/DeviceIdleController;->reportMaintenanceActivityIfNeededLocked()V
+PLcom/android/server/DeviceIdleController;->reportTempWhitelistChangedLocked()V
+PLcom/android/server/DeviceIdleController;->setAlarmsActive(Z)V
+PLcom/android/server/DeviceIdleController;->setJobsActive(Z)V
+PLcom/android/server/DeviceIdleController;->setNetworkPolicyTempWhitelistCallbackInternal(Ljava/lang/Runnable;)V
+PLcom/android/server/DeviceIdleController;->updateChargingLocked(Z)V
+PLcom/android/server/DeviceIdleController;->updateConnectivityState(Landroid/content/Intent;)V
+PLcom/android/server/DeviceIdleController;->updateDisplayLocked()V
+PLcom/android/server/DeviceIdleController;->updateTempWhitelistAppIdsLocked(IZ)V
+PLcom/android/server/DeviceIdleController;->updateWhitelistAppIdsLocked()V
+PLcom/android/server/DiskStatsService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/DockObserver$1;-><init>(Lcom/android/server/DockObserver;Z)V
+PLcom/android/server/DockObserver$2;-><init>(Lcom/android/server/DockObserver;)V
+PLcom/android/server/DockObserver$BinderService;-><init>(Lcom/android/server/DockObserver;)V
+PLcom/android/server/DockObserver$BinderService;-><init>(Lcom/android/server/DockObserver;Lcom/android/server/DockObserver$BinderService;)V
+PLcom/android/server/DockObserver;-><init>(Landroid/content/Context;)V
+PLcom/android/server/DockObserver;->init()V
+PLcom/android/server/DockObserver;->onBootPhase(I)V
+PLcom/android/server/DockObserver;->onStart()V
+PLcom/android/server/DropBoxManagerService$1$1;-><init>(Lcom/android/server/DropBoxManagerService$1;)V
+PLcom/android/server/DropBoxManagerService$1$1;->run()V
+PLcom/android/server/DropBoxManagerService$1;-><init>(Lcom/android/server/DropBoxManagerService;)V
+PLcom/android/server/DropBoxManagerService$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/DropBoxManagerService$2;-><init>(Lcom/android/server/DropBoxManagerService;)V
+PLcom/android/server/DropBoxManagerService$2;->add(Landroid/os/DropBoxManager$Entry;)V
+PLcom/android/server/DropBoxManagerService$2;->getNextEntry(Ljava/lang/String;J)Landroid/os/DropBoxManager$Entry;
+PLcom/android/server/DropBoxManagerService$2;->isTagEnabled(Ljava/lang/String;)Z
+PLcom/android/server/DropBoxManagerService$3;-><init>(Lcom/android/server/DropBoxManagerService;)V
+PLcom/android/server/DropBoxManagerService$3;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/DropBoxManagerService$4;-><init>(Lcom/android/server/DropBoxManagerService;Landroid/os/Handler;)V
+PLcom/android/server/DropBoxManagerService$4;->onChange(Z)V
+PLcom/android/server/DropBoxManagerService$EntryFile;-><init>(J)V
+PLcom/android/server/DropBoxManagerService$EntryFile;-><init>(Ljava/io/File;Ljava/io/File;Ljava/lang/String;JII)V
+PLcom/android/server/DropBoxManagerService$FileList;-><init>()V
+PLcom/android/server/DropBoxManagerService$FileList;-><init>(Lcom/android/server/DropBoxManagerService$FileList;)V
+PLcom/android/server/DropBoxManagerService;->-get0(Lcom/android/server/DropBoxManagerService;)Landroid/content/BroadcastReceiver;
+PLcom/android/server/DropBoxManagerService;->-set0(Lcom/android/server/DropBoxManagerService;J)J
+PLcom/android/server/DropBoxManagerService;->-wrap0(Lcom/android/server/DropBoxManagerService;)J
+PLcom/android/server/DropBoxManagerService;->-wrap1(Lcom/android/server/DropBoxManagerService;)V
+PLcom/android/server/DropBoxManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/DropBoxManagerService;-><init>(Landroid/content/Context;Ljava/io/File;)V
+PLcom/android/server/DropBoxManagerService;->createEntry(Ljava/io/File;Ljava/lang/String;I)J
+PLcom/android/server/DropBoxManagerService;->enrollEntry(Lcom/android/server/DropBoxManagerService$EntryFile;)V
+PLcom/android/server/DropBoxManagerService;->onBootPhase(I)V
+PLcom/android/server/DropBoxManagerService;->onStart()V
+PLcom/android/server/DropBoxManagerService;->trimToFit()J
+PLcom/android/server/EntropyMixer$1;-><init>(Lcom/android/server/EntropyMixer;)V
+PLcom/android/server/EntropyMixer$2;-><init>(Lcom/android/server/EntropyMixer;)V
+PLcom/android/server/EntropyMixer;-><init>(Landroid/content/Context;)V
+PLcom/android/server/EntropyMixer;-><init>(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/EntropyMixer;->addDeviceSpecificEntropy()V
+PLcom/android/server/EntropyMixer;->addHwRandomEntropy()V
+PLcom/android/server/EntropyMixer;->getSystemDir()Ljava/lang/String;
+PLcom/android/server/EntropyMixer;->loadInitialEntropy()V
+PLcom/android/server/EntropyMixer;->scheduleEntropyWriter()V
+PLcom/android/server/EntropyMixer;->writeEntropy()V
+PLcom/android/server/EventLogTags;->writeNetstatsMobileSample(JJJJJJJJJJJJJ)V
+PLcom/android/server/EventLogTags;->writeNetstatsWifiSample(JJJJJJJJJJJJJ)V
+PLcom/android/server/EventLogTags;->writeNotificationCancelAll(IILjava/lang/String;IIIILjava/lang/String;)V
+PLcom/android/server/EventLogTags;->writeNotificationCanceled(Ljava/lang/String;IIII)V
+PLcom/android/server/EventLogTags;->writeNotificationEnqueue(IILjava/lang/String;ILjava/lang/String;ILjava/lang/String;I)V
+PLcom/android/server/EventLogTags;->writeNotificationExpansion(Ljava/lang/String;IIIII)V
+PLcom/android/server/EventLogTags;->writeNotificationPanelHidden()V
+PLcom/android/server/EventLogTags;->writeNotificationPanelRevealed(I)V
+PLcom/android/server/EventLogTags;->writeNotificationVisibility(Ljava/lang/String;IIIII)V
+PLcom/android/server/EventLogTags;->writeStorageState(Ljava/lang/String;IIJJ)V
+PLcom/android/server/EventLogTags;->writeStreamDevicesChanged(III)V
+PLcom/android/server/EventLogTags;->writeVolumeChanged(IIIILjava/lang/String;)V
+PLcom/android/server/GestureLauncherService$1;-><init>(Lcom/android/server/GestureLauncherService;)V
+PLcom/android/server/GestureLauncherService$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/GestureLauncherService$2;-><init>(Lcom/android/server/GestureLauncherService;Landroid/os/Handler;)V
+PLcom/android/server/GestureLauncherService$CameraLiftTriggerEventListener;-><init>(Lcom/android/server/GestureLauncherService;)V
+PLcom/android/server/GestureLauncherService$CameraLiftTriggerEventListener;-><init>(Lcom/android/server/GestureLauncherService;Lcom/android/server/GestureLauncherService$CameraLiftTriggerEventListener;)V
+PLcom/android/server/GestureLauncherService$GestureEventListener;-><init>(Lcom/android/server/GestureLauncherService;)V
+PLcom/android/server/GestureLauncherService$GestureEventListener;-><init>(Lcom/android/server/GestureLauncherService;Lcom/android/server/GestureLauncherService$GestureEventListener;)V
+PLcom/android/server/GestureLauncherService;->-get10(Lcom/android/server/GestureLauncherService;)Landroid/content/Context;
+PLcom/android/server/GestureLauncherService;->-get14(Lcom/android/server/GestureLauncherService;)Landroid/database/ContentObserver;
+PLcom/android/server/GestureLauncherService;->-set5(Lcom/android/server/GestureLauncherService;I)I
+PLcom/android/server/GestureLauncherService;->-wrap0(Lcom/android/server/GestureLauncherService;)V
+PLcom/android/server/GestureLauncherService;->-wrap1(Lcom/android/server/GestureLauncherService;)V
+PLcom/android/server/GestureLauncherService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/GestureLauncherService;-><init>(Landroid/content/Context;Lcom/android/internal/logging/MetricsLogger;)V
+PLcom/android/server/GestureLauncherService;->isCameraDoubleTapPowerEnabled(Landroid/content/res/Resources;)Z
+PLcom/android/server/GestureLauncherService;->isCameraDoubleTapPowerSettingEnabled(Landroid/content/Context;I)Z
+PLcom/android/server/GestureLauncherService;->isCameraLaunchEnabled(Landroid/content/res/Resources;)Z
+PLcom/android/server/GestureLauncherService;->isCameraLaunchSettingEnabled(Landroid/content/Context;I)Z
+PLcom/android/server/GestureLauncherService;->isCameraLiftTriggerEnabled(Landroid/content/res/Resources;)Z
+PLcom/android/server/GestureLauncherService;->isCameraLiftTriggerSettingEnabled(Landroid/content/Context;I)Z
+PLcom/android/server/GestureLauncherService;->isGestureLauncherEnabled(Landroid/content/res/Resources;)Z
+PLcom/android/server/GestureLauncherService;->onBootPhase(I)V
+PLcom/android/server/GestureLauncherService;->onStart()V
+PLcom/android/server/GestureLauncherService;->registerContentObservers()V
+PLcom/android/server/GestureLauncherService;->unregisterCameraLaunchGesture()V
+PLcom/android/server/GestureLauncherService;->unregisterCameraLiftTrigger()V
+PLcom/android/server/GestureLauncherService;->updateCameraDoubleTapPowerEnabled()V
+PLcom/android/server/GestureLauncherService;->updateCameraRegistered()V
+PLcom/android/server/GraphicsStatsService$1;-><init>(Lcom/android/server/GraphicsStatsService;)V
+PLcom/android/server/GraphicsStatsService$1;->handleMessage(Landroid/os/Message;)Z
+PLcom/android/server/GraphicsStatsService$ActiveBuffer;-><init>(Lcom/android/server/GraphicsStatsService;Landroid/view/IGraphicsStatsCallback;IILjava/lang/String;I)V
+PLcom/android/server/GraphicsStatsService$ActiveBuffer;->binderDied()V
+PLcom/android/server/GraphicsStatsService$ActiveBuffer;->closeAllBuffers()V
+PLcom/android/server/GraphicsStatsService$BufferInfo;-><init>(Lcom/android/server/GraphicsStatsService;Ljava/lang/String;IJ)V
+PLcom/android/server/GraphicsStatsService$HistoricalBuffer;-><init>(Lcom/android/server/GraphicsStatsService;Lcom/android/server/GraphicsStatsService$ActiveBuffer;)V
+PLcom/android/server/GraphicsStatsService;->-get0(Lcom/android/server/GraphicsStatsService;)I
+PLcom/android/server/GraphicsStatsService;->-get1(Lcom/android/server/GraphicsStatsService;)[B
+PLcom/android/server/GraphicsStatsService;->-wrap1(Lcom/android/server/GraphicsStatsService;Lcom/android/server/GraphicsStatsService$ActiveBuffer;)V
+PLcom/android/server/GraphicsStatsService;->-wrap2(Lcom/android/server/GraphicsStatsService;Lcom/android/server/GraphicsStatsService$HistoricalBuffer;)V
+PLcom/android/server/GraphicsStatsService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/GraphicsStatsService;->addToSaveQueue(Lcom/android/server/GraphicsStatsService$ActiveBuffer;)V
+PLcom/android/server/GraphicsStatsService;->fetchActiveBuffersLocked(Landroid/view/IGraphicsStatsCallback;IILjava/lang/String;I)Lcom/android/server/GraphicsStatsService$ActiveBuffer;
+PLcom/android/server/GraphicsStatsService;->getPfd(Landroid/os/MemoryFile;)Landroid/os/ParcelFileDescriptor;
+PLcom/android/server/GraphicsStatsService;->normalizeDate(J)Ljava/util/Calendar;
+PLcom/android/server/GraphicsStatsService;->pathForApp(Lcom/android/server/GraphicsStatsService$BufferInfo;)Ljava/io/File;
+PLcom/android/server/GraphicsStatsService;->processDied(Lcom/android/server/GraphicsStatsService$ActiveBuffer;)V
+PLcom/android/server/GraphicsStatsService;->requestBufferForProcess(Ljava/lang/String;Landroid/view/IGraphicsStatsCallback;)Landroid/os/ParcelFileDescriptor;
+PLcom/android/server/GraphicsStatsService;->requestBufferForProcessLocked(Landroid/view/IGraphicsStatsCallback;IILjava/lang/String;I)Landroid/os/ParcelFileDescriptor;
+PLcom/android/server/GraphicsStatsService;->saveBuffer(Lcom/android/server/GraphicsStatsService$HistoricalBuffer;)V
+PLcom/android/server/GraphicsStatsService;->scheduleRotateLocked()V
+PLcom/android/server/HardwarePropertiesManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/HardwarePropertiesManagerService;->enforceHardwarePropertiesRetrievalAllowed(Ljava/lang/String;)V
+PLcom/android/server/HardwarePropertiesManagerService;->getDeviceTemperatures(Ljava/lang/String;II)[F
+PLcom/android/server/InputMethodManagerService$1;-><init>(Lcom/android/server/InputMethodManagerService;)V
+PLcom/android/server/InputMethodManagerService$1;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/InputMethodManagerService$2;-><init>(Lcom/android/server/InputMethodManagerService;)V
+PLcom/android/server/InputMethodManagerService$ClientState;-><init>(Lcom/android/internal/view/IInputMethodClient;Lcom/android/internal/view/IInputContext;II)V
+PLcom/android/server/InputMethodManagerService$ClientState;->toString()Ljava/lang/String;
+PLcom/android/server/InputMethodManagerService$HardKeyboardListener;-><init>(Lcom/android/server/InputMethodManagerService;)V
+PLcom/android/server/InputMethodManagerService$HardKeyboardListener;-><init>(Lcom/android/server/InputMethodManagerService;Lcom/android/server/InputMethodManagerService$HardKeyboardListener;)V
+PLcom/android/server/InputMethodManagerService$ImmsBroadcastReceiver;-><init>(Lcom/android/server/InputMethodManagerService;)V
+PLcom/android/server/InputMethodManagerService$ImmsBroadcastReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/InputMethodManagerService$InputMethodFileManager;-><init>(Ljava/util/HashMap;I)V
+PLcom/android/server/InputMethodManagerService$InputMethodFileManager;->addInputMethodSubtypes(Landroid/view/inputmethod/InputMethodInfo;[Landroid/view/inputmethod/InputMethodSubtype;)V
+PLcom/android/server/InputMethodManagerService$InputMethodFileManager;->getAllAdditionalInputMethodSubtypes()Ljava/util/HashMap;
+PLcom/android/server/InputMethodManagerService$InputMethodFileManager;->readAdditionalInputMethodSubtypes(Ljava/util/HashMap;Landroid/util/AtomicFile;)V
+PLcom/android/server/InputMethodManagerService$InputMethodFileManager;->writeAdditionalInputMethodSubtypes(Ljava/util/HashMap;Landroid/util/AtomicFile;Ljava/util/HashMap;)V
+PLcom/android/server/InputMethodManagerService$Lifecycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/InputMethodManagerService$Lifecycle;->onBootPhase(I)V
+PLcom/android/server/InputMethodManagerService$Lifecycle;->onStart()V
+PLcom/android/server/InputMethodManagerService$Lifecycle;->onUnlockUser(I)V
+PLcom/android/server/InputMethodManagerService$LocalServiceImpl;-><init>(Landroid/os/Handler;)V
+PLcom/android/server/InputMethodManagerService$MethodCallback;-><init>(Lcom/android/server/InputMethodManagerService;Lcom/android/internal/view/IInputMethod;Landroid/view/InputChannel;)V
+PLcom/android/server/InputMethodManagerService$MethodCallback;->sessionCreated(Lcom/android/internal/view/IInputMethodSession;)V
+PLcom/android/server/InputMethodManagerService$MyPackageMonitor;-><init>(Lcom/android/server/InputMethodManagerService;)V
+PLcom/android/server/InputMethodManagerService$MyPackageMonitor;->addKnownImePackageNameLocked(Ljava/lang/String;)V
+PLcom/android/server/InputMethodManagerService$MyPackageMonitor;->clearKnownImePackageNamesLocked()V
+PLcom/android/server/InputMethodManagerService$MyPackageMonitor;->clearPackageChangeState()V
+PLcom/android/server/InputMethodManagerService$MyPackageMonitor;->isChangingPackagesOfCurrentUserLocked()Z
+PLcom/android/server/InputMethodManagerService$MyPackageMonitor;->onBeginPackageChanges()V
+PLcom/android/server/InputMethodManagerService$MyPackageMonitor;->onFinishPackageChanges()V
+PLcom/android/server/InputMethodManagerService$MyPackageMonitor;->onFinishPackageChangesInternal()V
+PLcom/android/server/InputMethodManagerService$MyPackageMonitor;->onPackageAppeared(Ljava/lang/String;I)V
+PLcom/android/server/InputMethodManagerService$MyPackageMonitor;->onPackageModified(Ljava/lang/String;)V
+PLcom/android/server/InputMethodManagerService$MyPackageMonitor;->shouldRebuildInputMethodListLocked()Z
+PLcom/android/server/InputMethodManagerService$SessionState;-><init>(Lcom/android/server/InputMethodManagerService$ClientState;Lcom/android/internal/view/IInputMethod;Lcom/android/internal/view/IInputMethodSession;Landroid/view/InputChannel;)V
+PLcom/android/server/InputMethodManagerService$SettingsObserver;-><init>(Lcom/android/server/InputMethodManagerService;Landroid/os/Handler;)V
+PLcom/android/server/InputMethodManagerService$SettingsObserver;->registerContentObserverLocked(I)V
+PLcom/android/server/InputMethodManagerService$StartInputHistory$Entry;-><init>(Lcom/android/server/InputMethodManagerService$StartInputInfo;)V
+PLcom/android/server/InputMethodManagerService$StartInputHistory$Entry;->set(Lcom/android/server/InputMethodManagerService$StartInputInfo;)V
+PLcom/android/server/InputMethodManagerService$StartInputHistory;-><init>()V
+PLcom/android/server/InputMethodManagerService$StartInputHistory;-><init>(Lcom/android/server/InputMethodManagerService$StartInputHistory;)V
+PLcom/android/server/InputMethodManagerService$StartInputHistory;->addEntry(Lcom/android/server/InputMethodManagerService$StartInputInfo;)V
+PLcom/android/server/InputMethodManagerService$StartInputHistory;->getEntrySize()I
+PLcom/android/server/InputMethodManagerService$StartInputInfo;-><init>(Landroid/os/IBinder;Ljava/lang/String;IZLandroid/os/IBinder;Landroid/view/inputmethod/EditorInfo;II)V
+PLcom/android/server/InputMethodManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/InputMethodManagerService;->addClient(Lcom/android/internal/view/IInputMethodClient;Lcom/android/internal/view/IInputContext;II)V
+PLcom/android/server/InputMethodManagerService;->attachNewInputLocked(IZ)Lcom/android/internal/view/InputBindResult;
+PLcom/android/server/InputMethodManagerService;->bindCurrentInputMethodService(Landroid/content/Intent;Landroid/content/ServiceConnection;I)Z
+PLcom/android/server/InputMethodManagerService;->buildInputMethodListLocked(Z)V
+PLcom/android/server/InputMethodManagerService;->calledFromValidUser()Z
+PLcom/android/server/InputMethodManagerService;->calledWithValidToken(Landroid/os/IBinder;)Z
+PLcom/android/server/InputMethodManagerService;->clearClientSessionLocked(Lcom/android/server/InputMethodManagerService$ClientState;)V
+PLcom/android/server/InputMethodManagerService;->clearCurMethodLocked()V
+PLcom/android/server/InputMethodManagerService;->executeOrSendMessage(Landroid/os/IInterface;Landroid/os/Message;)V
+PLcom/android/server/InputMethodManagerService;->finishInput(Lcom/android/internal/view/IInputMethodClient;)V
+PLcom/android/server/InputMethodManagerService;->finishSessionLocked(Lcom/android/server/InputMethodManagerService$SessionState;)V
+PLcom/android/server/InputMethodManagerService;->getAppShowFlags()I
+PLcom/android/server/InputMethodManagerService;->getCurrentInputMethodSubtype()Landroid/view/inputmethod/InputMethodSubtype;
+PLcom/android/server/InputMethodManagerService;->getCurrentInputMethodSubtypeLocked()Landroid/view/inputmethod/InputMethodSubtype;
+PLcom/android/server/InputMethodManagerService;->getEnabledInputMethodList()Ljava/util/List;
+PLcom/android/server/InputMethodManagerService;->getEnabledInputMethodSubtypeList(Ljava/lang/String;Z)Ljava/util/List;
+PLcom/android/server/InputMethodManagerService;->getImeShowFlags()I
+PLcom/android/server/InputMethodManagerService;->getInputMethodList()Ljava/util/List;
+PLcom/android/server/InputMethodManagerService;->getInputMethodWindowVisibleHeight()I
+PLcom/android/server/InputMethodManagerService;->handleMessage(Landroid/os/Message;)Z
+PLcom/android/server/InputMethodManagerService;->hideCurrentInputLocked(ILandroid/os/ResultReceiver;)Z
+PLcom/android/server/InputMethodManagerService;->hideInputMethodMenu()V
+PLcom/android/server/InputMethodManagerService;->hideInputMethodMenuLocked()V
+PLcom/android/server/InputMethodManagerService;->hideSoftInput(Lcom/android/internal/view/IInputMethodClient;ILandroid/os/ResultReceiver;)Z
+PLcom/android/server/InputMethodManagerService;->isKeyguardLocked()Z
+PLcom/android/server/InputMethodManagerService;->isScreenLocked()Z
+PLcom/android/server/InputMethodManagerService;->notifyInputMethodSubtypeChanged(ILandroid/view/inputmethod/InputMethodInfo;Landroid/view/inputmethod/InputMethodSubtype;)V
+PLcom/android/server/InputMethodManagerService;->notifyUserAction(I)V
+PLcom/android/server/InputMethodManagerService;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/InputMethodManagerService;->onSessionCreated(Lcom/android/internal/view/IInputMethod;Lcom/android/internal/view/IInputMethodSession;Landroid/view/InputChannel;)V
+PLcom/android/server/InputMethodManagerService;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+PLcom/android/server/InputMethodManagerService;->onUnlockUser(I)V
+PLcom/android/server/InputMethodManagerService;->removeClient(Lcom/android/internal/view/IInputMethodClient;)V
+PLcom/android/server/InputMethodManagerService;->reportFullscreenMode(Landroid/os/IBinder;Z)V
+PLcom/android/server/InputMethodManagerService;->requestClientSessionLocked(Lcom/android/server/InputMethodManagerService$ClientState;)V
+PLcom/android/server/InputMethodManagerService;->resetDefaultImeLocked(Landroid/content/Context;)V
+PLcom/android/server/InputMethodManagerService;->setAdditionalInputMethodSubtypes(Ljava/lang/String;[Landroid/view/inputmethod/InputMethodSubtype;)V
+PLcom/android/server/InputMethodManagerService;->setEnabledSessionInMainThread(Lcom/android/server/InputMethodManagerService$SessionState;)V
+PLcom/android/server/InputMethodManagerService;->setImeWindowStatus(Landroid/os/IBinder;Landroid/os/IBinder;II)V
+PLcom/android/server/InputMethodManagerService;->setInputMethodEnabledLocked(Ljava/lang/String;Z)Z
+PLcom/android/server/InputMethodManagerService;->setInputMethodLocked(Ljava/lang/String;I)V
+PLcom/android/server/InputMethodManagerService;->setSelectedInputMethodAndSubtypeLocked(Landroid/view/inputmethod/InputMethodInfo;IZ)V
+PLcom/android/server/InputMethodManagerService;->shouldOfferSwitchingToNextInputMethod(Landroid/os/IBinder;)Z
+PLcom/android/server/InputMethodManagerService;->shouldShowImeSwitcherLocked(I)Z
+PLcom/android/server/InputMethodManagerService;->showCurrentInputLocked(ILandroid/os/ResultReceiver;)Z
+PLcom/android/server/InputMethodManagerService;->showSoftInput(Lcom/android/internal/view/IInputMethodClient;ILandroid/os/ResultReceiver;)Z
+PLcom/android/server/InputMethodManagerService;->startInput(ILcom/android/internal/view/IInputMethodClient;Lcom/android/internal/view/IInputContext;ILandroid/view/inputmethod/EditorInfo;I)Lcom/android/internal/view/InputBindResult;
+PLcom/android/server/InputMethodManagerService;->startInputInnerLocked()Lcom/android/internal/view/InputBindResult;
+PLcom/android/server/InputMethodManagerService;->startInputLocked(ILcom/android/internal/view/IInputMethodClient;Lcom/android/internal/view/IInputContext;ILandroid/view/inputmethod/EditorInfo;I)Lcom/android/internal/view/InputBindResult;
+PLcom/android/server/InputMethodManagerService;->startInputOrWindowGainedFocus(ILcom/android/internal/view/IInputMethodClient;Landroid/os/IBinder;IIILandroid/view/inputmethod/EditorInfo;Lcom/android/internal/view/IInputContext;I)Lcom/android/internal/view/InputBindResult;
+PLcom/android/server/InputMethodManagerService;->startInputUncheckedLocked(Lcom/android/server/InputMethodManagerService$ClientState;Lcom/android/internal/view/IInputContext;ILandroid/view/inputmethod/EditorInfo;II)Lcom/android/internal/view/InputBindResult;
+PLcom/android/server/InputMethodManagerService;->systemRunning(Lcom/android/server/statusbar/StatusBarManagerService;)V
+PLcom/android/server/InputMethodManagerService;->unbindCurrentClientLocked(I)V
+PLcom/android/server/InputMethodManagerService;->unbindCurrentMethodLocked(Z)V
+PLcom/android/server/InputMethodManagerService;->updateCurrentProfileIds()V
+PLcom/android/server/InputMethodManagerService;->updateFromSettingsLocked(Z)V
+PLcom/android/server/InputMethodManagerService;->updateInputMethodsFromSettingsLocked(Z)V
+PLcom/android/server/InputMethodManagerService;->updateKeyboardFromSettingsLocked()V
+PLcom/android/server/InputMethodManagerService;->updateStatusIcon(Landroid/os/IBinder;Ljava/lang/String;I)V
+PLcom/android/server/InputMethodManagerService;->updateSystemUiLocked(Landroid/os/IBinder;II)V
+PLcom/android/server/InputMethodManagerService;->windowGainedFocus(ILcom/android/internal/view/IInputMethodClient;Landroid/os/IBinder;IIILandroid/view/inputmethod/EditorInfo;Lcom/android/internal/view/IInputContext;I)Lcom/android/internal/view/InputBindResult;
+PLcom/android/server/IntentResolver;->collectFilters([Landroid/content/IntentFilter;Landroid/content/IntentFilter;)Ljava/util/ArrayList;
+PLcom/android/server/IntentResolver;->filterEquals(Landroid/content/IntentFilter;Landroid/content/IntentFilter;)Z
+PLcom/android/server/IntentResolver;->findFilters(Landroid/content/IntentFilter;)Ljava/util/ArrayList;
+PLcom/android/server/IntentResolver;->isFilterStopped(Landroid/content/IntentFilter;I)Z
+PLcom/android/server/IntentResolver;->newResult(Landroid/content/IntentFilter;II)Ljava/lang/Object;
+PLcom/android/server/IntentResolver;->removeFilter(Landroid/content/IntentFilter;)V
+PLcom/android/server/IntentResolver;->removeFilterInternal(Landroid/content/IntentFilter;)V
+PLcom/android/server/IntentResolver;->sortResults(Ljava/util/List;)V
+PLcom/android/server/IntentResolver;->unregister_intent_filter(Landroid/content/IntentFilter;Ljava/util/Iterator;Landroid/util/ArrayMap;Ljava/lang/String;)I
+PLcom/android/server/IntentResolver;->unregister_mime_types(Landroid/content/IntentFilter;Ljava/lang/String;)I
+PLcom/android/server/IoThread;->get()Lcom/android/server/IoThread;
+PLcom/android/server/LocationManagerService$1;-><init>(Lcom/android/server/LocationManagerService;)V
+PLcom/android/server/LocationManagerService$2;-><init>(Lcom/android/server/LocationManagerService;)V
+PLcom/android/server/LocationManagerService$3;-><init>(Lcom/android/server/LocationManagerService;)V
+PLcom/android/server/LocationManagerService$4;-><init>(Lcom/android/server/LocationManagerService;)V
+PLcom/android/server/LocationManagerService$5;-><init>(Lcom/android/server/LocationManagerService;)V
+PLcom/android/server/LocationManagerService$6;-><init>(Lcom/android/server/LocationManagerService;Landroid/os/Handler;)V
+PLcom/android/server/LocationManagerService$7;-><init>(Lcom/android/server/LocationManagerService;Landroid/os/Handler;)V
+PLcom/android/server/LocationManagerService$8;-><init>(Lcom/android/server/LocationManagerService;Landroid/os/Handler;)V
+PLcom/android/server/LocationManagerService$9;-><init>(Lcom/android/server/LocationManagerService;)V
+PLcom/android/server/LocationManagerService$9;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/LocationManagerService$Identity;-><init>(IILjava/lang/String;)V
+PLcom/android/server/LocationManagerService$LocationWorkerHandler;-><init>(Lcom/android/server/LocationManagerService;Landroid/os/Looper;)V
+PLcom/android/server/LocationManagerService$Receiver;-><init>(Lcom/android/server/LocationManagerService;Landroid/location/ILocationListener;Landroid/app/PendingIntent;IILjava/lang/String;Landroid/os/WorkSource;Z)V
+PLcom/android/server/LocationManagerService$Receiver;->clearPendingBroadcastsLocked()V
+PLcom/android/server/LocationManagerService$Receiver;->getListener()Landroid/location/ILocationListener;
+PLcom/android/server/LocationManagerService$Receiver;->isListener()Z
+PLcom/android/server/LocationManagerService$Receiver;->updateMonitoring(Z)V
+PLcom/android/server/LocationManagerService$Receiver;->updateMonitoring(ZZI)Z
+PLcom/android/server/LocationManagerService$UpdateRecord;-><init>(Lcom/android/server/LocationManagerService;Ljava/lang/String;Landroid/location/LocationRequest;Lcom/android/server/LocationManagerService$Receiver;)V
+PLcom/android/server/LocationManagerService$UpdateRecord;->disposeLocked(Z)V
+PLcom/android/server/LocationManagerService;->-get0(Lcom/android/server/LocationManagerService;)Landroid/app/ActivityManager;
+PLcom/android/server/LocationManagerService;->-get1(Lcom/android/server/LocationManagerService;)Landroid/app/AppOpsManager;
+PLcom/android/server/LocationManagerService;->-get10(Lcom/android/server/LocationManagerService;)Landroid/os/PowerManager;
+PLcom/android/server/LocationManagerService;->-get11(Lcom/android/server/LocationManagerService;)Ljava/util/HashMap;
+PLcom/android/server/LocationManagerService;->-get13(Lcom/android/server/LocationManagerService;)Ljava/util/HashMap;
+PLcom/android/server/LocationManagerService;->-get14(Lcom/android/server/LocationManagerService;)Lcom/android/server/location/LocationRequestStatistics;
+PLcom/android/server/LocationManagerService;->-get4(Lcom/android/server/LocationManagerService;)Landroid/util/ArrayMap;
+PLcom/android/server/LocationManagerService;->-get6(Lcom/android/server/LocationManagerService;)Landroid/util/ArrayMap;
+PLcom/android/server/LocationManagerService;->-get9(Lcom/android/server/LocationManagerService;)Ljava/lang/Object;
+PLcom/android/server/LocationManagerService;->-wrap0(Lcom/android/server/LocationManagerService;Ljava/lang/String;)Z
+PLcom/android/server/LocationManagerService;->-wrap1(I)Z
+PLcom/android/server/LocationManagerService;->-wrap10(Lcom/android/server/LocationManagerService;I)V
+PLcom/android/server/LocationManagerService;->-wrap3(Lcom/android/server/LocationManagerService;II)I
+PLcom/android/server/LocationManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/LocationManagerService;->addProviderLocked(Lcom/android/server/location/LocationProviderInterface;)V
+PLcom/android/server/LocationManagerService;->applyRequirementsLocked(Ljava/lang/String;)V
+PLcom/android/server/LocationManagerService;->checkDeviceStatsAllowed()V
+PLcom/android/server/LocationManagerService;->checkListenerOrIntentLocked(Landroid/location/ILocationListener;Landroid/app/PendingIntent;IILjava/lang/String;Landroid/os/WorkSource;Z)Lcom/android/server/LocationManagerService$Receiver;
+PLcom/android/server/LocationManagerService;->checkLocationAccess(IILjava/lang/String;I)Z
+PLcom/android/server/LocationManagerService;->checkPackageName(Ljava/lang/String;)V
+PLcom/android/server/LocationManagerService;->checkResolutionLevelIsSufficientForProviderUse(ILjava/lang/String;)V
+PLcom/android/server/LocationManagerService;->checkUpdateAppOpsAllowed()V
+PLcom/android/server/LocationManagerService;->createSanitizedRequest(Landroid/location/LocationRequest;I)Landroid/location/LocationRequest;
+PLcom/android/server/LocationManagerService;->ensureFallbackFusedProviderPresentLocked(Ljava/util/ArrayList;)V
+PLcom/android/server/LocationManagerService;->geocoderIsPresent()Z
+PLcom/android/server/LocationManagerService;->getAllowedResolutionLevel(II)I
+PLcom/android/server/LocationManagerService;->getCallerAllowedResolutionLevel()I
+PLcom/android/server/LocationManagerService;->getLastLocation(Landroid/location/LocationRequest;Ljava/lang/String;)Landroid/location/Location;
+PLcom/android/server/LocationManagerService;->getMinimumResolutionLevelForProviderUse(Ljava/lang/String;)I
+PLcom/android/server/LocationManagerService;->getProviderProperties(Ljava/lang/String;)Lcom/android/internal/location/ProviderProperties;
+PLcom/android/server/LocationManagerService;->getProviders(Landroid/location/Criteria;Z)Ljava/util/List;
+PLcom/android/server/LocationManagerService;->getReceiverLocked(Landroid/location/ILocationListener;IILjava/lang/String;Landroid/os/WorkSource;Z)Lcom/android/server/LocationManagerService$Receiver;
+PLcom/android/server/LocationManagerService;->hasGnssPermissions(Ljava/lang/String;)Z
+PLcom/android/server/LocationManagerService;->isAllowedByCurrentUserSettingsLocked(Ljava/lang/String;)Z
+PLcom/android/server/LocationManagerService;->isAllowedByUserSettingsLocked(Ljava/lang/String;I)Z
+PLcom/android/server/LocationManagerService;->isCurrentProfile(I)Z
+PLcom/android/server/LocationManagerService;->isImportanceForeground(I)Z
+PLcom/android/server/LocationManagerService;->isProviderEnabled(Ljava/lang/String;)Z
+PLcom/android/server/LocationManagerService;->isThrottlingExemptLocked(Lcom/android/server/LocationManagerService$Identity;)Z
+PLcom/android/server/LocationManagerService;->loadProvidersLocked()V
+PLcom/android/server/LocationManagerService;->registerGnssStatusCallback(Landroid/location/IGnssStatusListener;Ljava/lang/String;)Z
+PLcom/android/server/LocationManagerService;->removeUpdates(Landroid/location/ILocationListener;Landroid/app/PendingIntent;Ljava/lang/String;)V
+PLcom/android/server/LocationManagerService;->removeUpdatesLocked(Lcom/android/server/LocationManagerService$Receiver;)V
+PLcom/android/server/LocationManagerService;->reportLocationAccessNoThrow(IILjava/lang/String;I)Z
+PLcom/android/server/LocationManagerService;->requestLocationUpdates(Landroid/location/LocationRequest;Landroid/location/ILocationListener;Landroid/app/PendingIntent;Ljava/lang/String;)V
+PLcom/android/server/LocationManagerService;->requestLocationUpdatesLocked(Landroid/location/LocationRequest;Lcom/android/server/LocationManagerService$Receiver;IILjava/lang/String;)V
+PLcom/android/server/LocationManagerService;->resolutionLevelToOp(I)I
+PLcom/android/server/LocationManagerService;->switchUser(I)V
+PLcom/android/server/LocationManagerService;->systemRunning()V
+PLcom/android/server/LocationManagerService;->unregisterGnssStatusCallback(Landroid/location/IGnssStatusListener;)V
+PLcom/android/server/LocationManagerService;->updateBackgroundThrottlingWhitelistLocked()V
+PLcom/android/server/LocationManagerService;->updateProviderListenersLocked(Ljava/lang/String;Z)V
+PLcom/android/server/LocationManagerService;->updateProvidersLocked()V
+PLcom/android/server/LocationManagerService;->updateUserProfiles(I)V
+PLcom/android/server/MmsServiceBroker$1;-><init>(Lcom/android/server/MmsServiceBroker;)V
+PLcom/android/server/MmsServiceBroker$2;-><init>(Lcom/android/server/MmsServiceBroker;)V
+PLcom/android/server/MmsServiceBroker$3;-><init>(Lcom/android/server/MmsServiceBroker;)V
+PLcom/android/server/MmsServiceBroker$BinderService;-><init>(Lcom/android/server/MmsServiceBroker;)V
+PLcom/android/server/MmsServiceBroker$BinderService;-><init>(Lcom/android/server/MmsServiceBroker;Lcom/android/server/MmsServiceBroker$BinderService;)V
+PLcom/android/server/MmsServiceBroker;-><init>(Landroid/content/Context;)V
+PLcom/android/server/MmsServiceBroker;->onStart()V
+PLcom/android/server/MmsServiceBroker;->systemRunning()V
+PLcom/android/server/MountServiceIdler;->scheduleIdlePass(Landroid/content/Context;)V
+PLcom/android/server/MountServiceIdler;->tomorrowMidnight()Ljava/util/Calendar;
+PLcom/android/server/NativeDaemonConnector$Command;->-get0(Lcom/android/server/NativeDaemonConnector$Command;)Ljava/util/ArrayList;
+PLcom/android/server/NativeDaemonConnector$Command;->-get1(Lcom/android/server/NativeDaemonConnector$Command;)Ljava/lang/String;
+PLcom/android/server/NativeDaemonConnector$Command;-><init>(Ljava/lang/String;[Ljava/lang/Object;)V
+PLcom/android/server/NativeDaemonConnector$Command;->appendArg(Ljava/lang/Object;)Lcom/android/server/NativeDaemonConnector$Command;
+PLcom/android/server/NativeDaemonConnector$ResponseQueue$PendingCmd;-><init>(ILjava/lang/String;)V
+PLcom/android/server/NativeDaemonConnector$ResponseQueue;-><init>(I)V
+PLcom/android/server/NativeDaemonConnector$ResponseQueue;->add(ILcom/android/server/NativeDaemonEvent;)V
+PLcom/android/server/NativeDaemonConnector$ResponseQueue;->remove(IJLjava/lang/String;)Lcom/android/server/NativeDaemonEvent;
+PLcom/android/server/NativeDaemonConnector$SensitiveArg;-><init>(Ljava/lang/Object;)V
+PLcom/android/server/NativeDaemonConnector$SensitiveArg;->toString()Ljava/lang/String;
+PLcom/android/server/NativeDaemonConnector;-><init>(Lcom/android/server/INativeDaemonConnectorCallbacks;Ljava/lang/String;ILjava/lang/String;ILandroid/os/PowerManager$WakeLock;)V
+PLcom/android/server/NativeDaemonConnector;-><init>(Lcom/android/server/INativeDaemonConnectorCallbacks;Ljava/lang/String;ILjava/lang/String;ILandroid/os/PowerManager$WakeLock;Landroid/os/Looper;)V
+PLcom/android/server/NativeDaemonConnector;->determineSocketAddress()Landroid/net/LocalSocketAddress;
+PLcom/android/server/NativeDaemonConnector;->execute(JLjava/lang/String;[Ljava/lang/Object;)Lcom/android/server/NativeDaemonEvent;
+PLcom/android/server/NativeDaemonConnector;->execute(Lcom/android/server/NativeDaemonConnector$Command;)Lcom/android/server/NativeDaemonEvent;
+PLcom/android/server/NativeDaemonConnector;->execute(Ljava/lang/String;[Ljava/lang/Object;)Lcom/android/server/NativeDaemonEvent;
+PLcom/android/server/NativeDaemonConnector;->executeForList(Ljava/lang/String;[Ljava/lang/Object;)[Lcom/android/server/NativeDaemonEvent;
+PLcom/android/server/NativeDaemonConnector;->handleMessage(Landroid/os/Message;)Z
+PLcom/android/server/NativeDaemonConnector;->log(Ljava/lang/String;)V
+PLcom/android/server/NativeDaemonConnector;->loge(Ljava/lang/String;)V
+PLcom/android/server/NativeDaemonConnector;->monitor()V
+PLcom/android/server/NativeDaemonConnector;->run()V
+PLcom/android/server/NativeDaemonConnector;->setDebug(Z)V
+PLcom/android/server/NativeDaemonConnector;->setWarnIfHeld(Ljava/lang/Object;)V
+PLcom/android/server/NativeDaemonEvent;-><init>(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/io/FileDescriptor;)V
+PLcom/android/server/NativeDaemonEvent;->checkCode(I)V
+PLcom/android/server/NativeDaemonEvent;->filterMessageList([Lcom/android/server/NativeDaemonEvent;I)[Ljava/lang/String;
+PLcom/android/server/NativeDaemonEvent;->getCmdNumber()I
+PLcom/android/server/NativeDaemonEvent;->getCode()I
+PLcom/android/server/NativeDaemonEvent;->getMessage()Ljava/lang/String;
+PLcom/android/server/NativeDaemonEvent;->getRawEvent()Ljava/lang/String;
+PLcom/android/server/NativeDaemonEvent;->isClassClientError()Z
+PLcom/android/server/NativeDaemonEvent;->isClassContinue()Z
+PLcom/android/server/NativeDaemonEvent;->isClassServerError()Z
+PLcom/android/server/NativeDaemonEvent;->isClassUnsolicited()Z
+PLcom/android/server/NativeDaemonEvent;->isClassUnsolicited(I)Z
+PLcom/android/server/NativeDaemonEvent;->toString()Ljava/lang/String;
+PLcom/android/server/NetworkManagementInternal;-><init>()V
+PLcom/android/server/NetworkManagementService$1;-><init>(Lcom/android/server/NetworkManagementService;I)V
+PLcom/android/server/NetworkManagementService$1;->run()V
+PLcom/android/server/NetworkManagementService$IdleTimerParams;-><init>(II)V
+PLcom/android/server/NetworkManagementService$LocalService;-><init>(Lcom/android/server/NetworkManagementService;)V
+PLcom/android/server/NetworkManagementService$NetdCallbackReceiver;-><init>(Lcom/android/server/NetworkManagementService;)V
+PLcom/android/server/NetworkManagementService$NetdCallbackReceiver;-><init>(Lcom/android/server/NetworkManagementService;Lcom/android/server/NetworkManagementService$NetdCallbackReceiver;)V
+PLcom/android/server/NetworkManagementService$NetdCallbackReceiver;->onCheckHoldWakeLock(I)Z
+PLcom/android/server/NetworkManagementService$NetdCallbackReceiver;->onDaemonConnected()V
+PLcom/android/server/NetworkManagementService$NetdCallbackReceiver;->onEvent(ILjava/lang/String;[Ljava/lang/String;)Z
+PLcom/android/server/NetworkManagementService;->-get1(Lcom/android/server/NetworkManagementService;)Ljava/util/concurrent/CountDownLatch;
+PLcom/android/server/NetworkManagementService;->-get8(Lcom/android/server/NetworkManagementService;)Landroid/util/SparseIntArray;
+PLcom/android/server/NetworkManagementService;->-set0(Lcom/android/server/NetworkManagementService;Ljava/util/concurrent/CountDownLatch;)Ljava/util/concurrent/CountDownLatch;
+PLcom/android/server/NetworkManagementService;->-wrap11(Lcom/android/server/NetworkManagementService;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/NetworkManagementService;->-wrap12(Lcom/android/server/NetworkManagementService;Ljava/lang/String;Landroid/net/RouteInfo;)V
+PLcom/android/server/NetworkManagementService;->-wrap3(Lcom/android/server/NetworkManagementService;Ljava/lang/String;Landroid/net/LinkAddress;)V
+PLcom/android/server/NetworkManagementService;->-wrap4(Lcom/android/server/NetworkManagementService;Ljava/lang/String;Landroid/net/LinkAddress;)V
+PLcom/android/server/NetworkManagementService;->-wrap5(Lcom/android/server/NetworkManagementService;Ljava/lang/String;)V
+PLcom/android/server/NetworkManagementService;->-wrap6(Lcom/android/server/NetworkManagementService;IIJIZ)V
+PLcom/android/server/NetworkManagementService;->-wrap7(Lcom/android/server/NetworkManagementService;Ljava/lang/String;J[Ljava/lang/String;)V
+PLcom/android/server/NetworkManagementService;->-wrap8(Lcom/android/server/NetworkManagementService;Ljava/lang/String;Z)V
+PLcom/android/server/NetworkManagementService;->-wrap9(Lcom/android/server/NetworkManagementService;Ljava/lang/String;)V
+PLcom/android/server/NetworkManagementService;-><init>(Landroid/content/Context;Ljava/lang/String;)V
+PLcom/android/server/NetworkManagementService;->addIdleTimer(Ljava/lang/String;II)V
+PLcom/android/server/NetworkManagementService;->addInterfaceToNetwork(Ljava/lang/String;I)V
+PLcom/android/server/NetworkManagementService;->addRoute(ILandroid/net/RouteInfo;)V
+PLcom/android/server/NetworkManagementService;->clearInterfaceAddresses(Ljava/lang/String;)V
+PLcom/android/server/NetworkManagementService;->closeSocketsForFirewallChainLocked(ILjava/lang/String;)V
+PLcom/android/server/NetworkManagementService;->connectNativeNetdService()V
+PLcom/android/server/NetworkManagementService;->create(Landroid/content/Context;)Lcom/android/server/NetworkManagementService;
+PLcom/android/server/NetworkManagementService;->create(Landroid/content/Context;Ljava/lang/String;)Lcom/android/server/NetworkManagementService;
+PLcom/android/server/NetworkManagementService;->createPhysicalNetwork(ILjava/lang/String;)V
+PLcom/android/server/NetworkManagementService;->disableIpv6(Ljava/lang/String;)V
+PLcom/android/server/NetworkManagementService;->enableIpv6(Ljava/lang/String;)V
+PLcom/android/server/NetworkManagementService;->enforceSystemUid()V
+PLcom/android/server/NetworkManagementService;->getBatteryStats()Lcom/android/internal/app/IBatteryStats;
+PLcom/android/server/NetworkManagementService;->getFirewallChainName(I)Ljava/lang/String;
+PLcom/android/server/NetworkManagementService;->getFirewallRuleName(II)Ljava/lang/String;
+PLcom/android/server/NetworkManagementService;->getFirewallType(I)I
+PLcom/android/server/NetworkManagementService;->getInterfaceConfig(Ljava/lang/String;)Landroid/net/InterfaceConfiguration;
+PLcom/android/server/NetworkManagementService;->getNetdService()Landroid/net/INetd;
+PLcom/android/server/NetworkManagementService;->getNetworkStatsSummaryDev()Landroid/net/NetworkStats;
+PLcom/android/server/NetworkManagementService;->getNetworkStatsSummaryXt()Landroid/net/NetworkStats;
+PLcom/android/server/NetworkManagementService;->getNetworkStatsTethering()Landroid/net/NetworkStats;
+PLcom/android/server/NetworkManagementService;->getNetworkStatsUidDetail(I)Landroid/net/NetworkStats;
+PLcom/android/server/NetworkManagementService;->getUidFirewallRulesLR(I)Landroid/util/SparseIntArray;
+PLcom/android/server/NetworkManagementService;->isBandwidthControlEnabled()Z
+PLcom/android/server/NetworkManagementService;->lambda$-com_android_server_NetworkManagementService_17509(Ljava/lang/String;ZLandroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/NetworkManagementService;->lambda$-com_android_server_NetworkManagementService_17716(Ljava/lang/String;Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/NetworkManagementService;->lambda$-com_android_server_NetworkManagementService_18101(Ljava/lang/String;Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/NetworkManagementService;->lambda$-com_android_server_NetworkManagementService_18305(Ljava/lang/String;Ljava/lang/String;Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/NetworkManagementService;->lambda$-com_android_server_NetworkManagementService_20521(IZJLandroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/NetworkManagementService;->lambda$-com_android_server_NetworkManagementService_27982(Ljava/lang/String;Landroid/net/LinkAddress;Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/NetworkManagementService;->lambda$-com_android_server_NetworkManagementService_28210(Ljava/lang/String;Landroid/net/LinkAddress;Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/NetworkManagementService;->lambda$-com_android_server_NetworkManagementService_28464(Ljava/lang/String;J[Ljava/lang/String;Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/NetworkManagementService;->lambda$-com_android_server_NetworkManagementService_28737(Landroid/net/RouteInfo;Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/NetworkManagementService;->lambda$-com_android_server_NetworkManagementService_28817(Landroid/net/RouteInfo;Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/NetworkManagementService;->listInterfaces()[Ljava/lang/String;
+PLcom/android/server/NetworkManagementService;->modifyInterfaceInNetwork(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/NetworkManagementService;->modifyRoute(Ljava/lang/String;Ljava/lang/String;Landroid/net/RouteInfo;)V
+PLcom/android/server/NetworkManagementService;->monitor()V
+PLcom/android/server/NetworkManagementService;->notifyAddressRemoved(Ljava/lang/String;Landroid/net/LinkAddress;)V
+PLcom/android/server/NetworkManagementService;->notifyAddressUpdated(Ljava/lang/String;Landroid/net/LinkAddress;)V
+PLcom/android/server/NetworkManagementService;->notifyInterfaceAdded(Ljava/lang/String;)V
+PLcom/android/server/NetworkManagementService;->notifyInterfaceClassActivity(IIJIZ)V
+PLcom/android/server/NetworkManagementService;->notifyInterfaceDnsServerInfo(Ljava/lang/String;J[Ljava/lang/String;)V
+PLcom/android/server/NetworkManagementService;->notifyInterfaceLinkStateChanged(Ljava/lang/String;Z)V
+PLcom/android/server/NetworkManagementService;->notifyInterfaceRemoved(Ljava/lang/String;)V
+PLcom/android/server/NetworkManagementService;->notifyLimitReached(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/NetworkManagementService;->notifyRouteChange(Ljava/lang/String;Landroid/net/RouteInfo;)V
+PLcom/android/server/NetworkManagementService;->prepareNativeDaemon()V
+PLcom/android/server/NetworkManagementService;->registerObserver(Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/NetworkManagementService;->reportNetworkActive()V
+PLcom/android/server/NetworkManagementService;->setDataSaverModeEnabled(Z)Z
+PLcom/android/server/NetworkManagementService;->setDefaultNetId(I)V
+PLcom/android/server/NetworkManagementService;->setDnsConfigurationForNetwork(I[Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/NetworkManagementService;->setFirewallChainEnabled(IZ)V
+PLcom/android/server/NetworkManagementService;->setFirewallChainState(IZ)V
+PLcom/android/server/NetworkManagementService;->setFirewallEnabled(Z)V
+PLcom/android/server/NetworkManagementService;->setFirewallUidRule(III)V
+PLcom/android/server/NetworkManagementService;->setFirewallUidRuleLocked(III)V
+PLcom/android/server/NetworkManagementService;->setFirewallUidRules(I[I[I)V
+PLcom/android/server/NetworkManagementService;->setGlobalAlert(J)V
+PLcom/android/server/NetworkManagementService;->setInterfaceConfig(Ljava/lang/String;Landroid/net/InterfaceConfiguration;)V
+PLcom/android/server/NetworkManagementService;->setInterfaceIpv6PrivacyExtensions(Ljava/lang/String;Z)V
+PLcom/android/server/NetworkManagementService;->setInterfaceUp(Ljava/lang/String;)V
+PLcom/android/server/NetworkManagementService;->setPermission(Ljava/lang/String;[I)V
+PLcom/android/server/NetworkManagementService;->setUidCleartextNetworkPolicy(II)V
+PLcom/android/server/NetworkManagementService;->setUidMeteredNetworkWhitelist(IZ)V
+PLcom/android/server/NetworkManagementService;->setUidOnMeteredNetworkList(IZZ)V
+PLcom/android/server/NetworkManagementService;->startClatd(Ljava/lang/String;)V
+PLcom/android/server/NetworkManagementService;->stopClatd(Ljava/lang/String;)V
+PLcom/android/server/NetworkManagementService;->syncFirewallChainLocked(ILjava/lang/String;)V
+PLcom/android/server/NetworkManagementService;->systemReady()V
+PLcom/android/server/NetworkManagementService;->updateFirewallUidRuleLocked(III)Z
+PLcom/android/server/NetworkScoreService$1;-><init>(Lcom/android/server/NetworkScoreService;)V
+PLcom/android/server/NetworkScoreService$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/NetworkScoreService$CurrentNetworkScoreCacheFilter;-><init>(Ljava/util/function/Supplier;)V
+PLcom/android/server/NetworkScoreService$CurrentNetworkScoreCacheFilter;->apply(Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/android/server/NetworkScoreService$CurrentNetworkScoreCacheFilter;->apply(Ljava/util/List;)Ljava/util/List;
+PLcom/android/server/NetworkScoreService$DispatchingContentObserver;-><init>(Landroid/content/Context;Landroid/os/Handler;)V
+PLcom/android/server/NetworkScoreService$DispatchingContentObserver;->observe(Landroid/net/Uri;I)V
+PLcom/android/server/NetworkScoreService$FilteringCacheUpdatingConsumer;-><init>(Landroid/content/Context;Ljava/util/List;ILjava/util/function/UnaryOperator;Ljava/util/function/UnaryOperator;)V
+PLcom/android/server/NetworkScoreService$FilteringCacheUpdatingConsumer;->accept(Landroid/net/INetworkScoreCache;Ljava/lang/Object;)V
+PLcom/android/server/NetworkScoreService$FilteringCacheUpdatingConsumer;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/NetworkScoreService$FilteringCacheUpdatingConsumer;->create(Landroid/content/Context;Ljava/util/List;I)Lcom/android/server/NetworkScoreService$FilteringCacheUpdatingConsumer;
+PLcom/android/server/NetworkScoreService$FilteringCacheUpdatingConsumer;->filterScores(Ljava/util/List;I)Ljava/util/List;
+PLcom/android/server/NetworkScoreService$NetworkScorerPackageMonitor;-><init>(Lcom/android/server/NetworkScoreService;Ljava/lang/String;)V
+PLcom/android/server/NetworkScoreService$NetworkScorerPackageMonitor;-><init>(Lcom/android/server/NetworkScoreService;Ljava/lang/String;Lcom/android/server/NetworkScoreService$NetworkScorerPackageMonitor;)V
+PLcom/android/server/NetworkScoreService$NetworkScorerPackageMonitor;->evaluateBinding(Ljava/lang/String;Z)V
+PLcom/android/server/NetworkScoreService$NetworkScorerPackageMonitor;->onPackageAdded(Ljava/lang/String;I)V
+PLcom/android/server/NetworkScoreService$NetworkScorerPackageMonitor;->onPackageModified(Ljava/lang/String;)V
+PLcom/android/server/NetworkScoreService$ScoringServiceConnection;-><init>(Landroid/net/NetworkScorerAppData;)V
+PLcom/android/server/NetworkScoreService$ScoringServiceConnection;->bind(Landroid/content/Context;)V
+PLcom/android/server/NetworkScoreService$ScoringServiceConnection;->getAppData()Landroid/net/NetworkScorerAppData;
+PLcom/android/server/NetworkScoreService$ScoringServiceConnection;->getPackageName()Ljava/lang/String;
+PLcom/android/server/NetworkScoreService$ScoringServiceConnection;->getRecommendationProvider()Landroid/net/INetworkRecommendationProvider;
+PLcom/android/server/NetworkScoreService$ScoringServiceConnection;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/NetworkScoreService$ServiceHandler;-><init>(Lcom/android/server/NetworkScoreService;Landroid/os/Looper;)V
+PLcom/android/server/NetworkScoreService$WifiInfoSupplier;-><init>(Landroid/content/Context;)V
+PLcom/android/server/NetworkScoreService$WifiInfoSupplier;->get()Landroid/net/wifi/WifiInfo;
+PLcom/android/server/NetworkScoreService$WifiInfoSupplier;->get()Ljava/lang/Object;
+PLcom/android/server/NetworkScoreService;->-com_android_server_NetworkScoreService-mthref-0(Landroid/net/NetworkScorerAppData;)Lcom/android/server/NetworkScoreService$ScoringServiceConnection;
+PLcom/android/server/NetworkScoreService;->-get0()Z
+PLcom/android/server/NetworkScoreService;->-get2(Lcom/android/server/NetworkScoreService;)Lcom/android/server/NetworkScorerAppManager;
+PLcom/android/server/NetworkScoreService;->-wrap0(Lcom/android/server/NetworkScoreService;Landroid/net/NetworkScorerAppData;)V
+PLcom/android/server/NetworkScoreService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/NetworkScoreService;-><init>(Landroid/content/Context;Lcom/android/server/NetworkScorerAppManager;Ljava/util/function/Function;Landroid/os/Looper;)V
+PLcom/android/server/NetworkScoreService;->bindToScoringServiceIfNeeded()V
+PLcom/android/server/NetworkScoreService;->bindToScoringServiceIfNeeded(Landroid/net/NetworkScorerAppData;)V
+PLcom/android/server/NetworkScoreService;->getActiveScorerPackage()Ljava/lang/String;
+PLcom/android/server/NetworkScoreService;->getRecommendationProvider()Landroid/net/INetworkRecommendationProvider;
+PLcom/android/server/NetworkScoreService;->isCallerActiveScorer(I)Z
+PLcom/android/server/NetworkScoreService;->onUserUnlocked(I)V
+PLcom/android/server/NetworkScoreService;->refreshBinding()V
+PLcom/android/server/NetworkScoreService;->registerNetworkScoreCache(ILandroid/net/INetworkScoreCache;I)V
+PLcom/android/server/NetworkScoreService;->registerPackageMonitorIfNeeded()V
+PLcom/android/server/NetworkScoreService;->registerRecommendationSettingsObserver()V
+PLcom/android/server/NetworkScoreService;->requestScores([Landroid/net/NetworkKey;)Z
+PLcom/android/server/NetworkScoreService;->sendCacheUpdateCallback(Ljava/util/function/BiConsumer;Ljava/util/Collection;)V
+PLcom/android/server/NetworkScoreService;->systemReady()V
+PLcom/android/server/NetworkScoreService;->systemRunning()V
+PLcom/android/server/NetworkScoreService;->updateScores([Landroid/net/ScoredNetwork;)Z
+PLcom/android/server/NetworkScorerAppManager$SettingsFacade;-><init>()V
+PLcom/android/server/NetworkScorerAppManager$SettingsFacade;->getInt(Landroid/content/Context;Ljava/lang/String;I)I
+PLcom/android/server/NetworkScorerAppManager$SettingsFacade;->getString(Landroid/content/Context;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/NetworkScorerAppManager$SettingsFacade;->putInt(Landroid/content/Context;Ljava/lang/String;I)Z
+PLcom/android/server/NetworkScorerAppManager;-><init>(Landroid/content/Context;)V
+PLcom/android/server/NetworkScorerAppManager;-><init>(Landroid/content/Context;Lcom/android/server/NetworkScorerAppManager$SettingsFacade;)V
+PLcom/android/server/NetworkScorerAppManager;->findUseOpenWifiNetworksActivity(Landroid/content/pm/ServiceInfo;)Landroid/content/ComponentName;
+PLcom/android/server/NetworkScorerAppManager;->getActiveScorer()Landroid/net/NetworkScorerAppData;
+PLcom/android/server/NetworkScorerAppManager;->getAllValidScorers()Ljava/util/List;
+PLcom/android/server/NetworkScorerAppManager;->getNetworkAvailableNotificationChannelId(Landroid/content/pm/ServiceInfo;)Ljava/lang/String;
+PLcom/android/server/NetworkScorerAppManager;->getNetworkRecommendationsEnabledSetting()I
+PLcom/android/server/NetworkScorerAppManager;->getNetworkRecommendationsPackage()Ljava/lang/String;
+PLcom/android/server/NetworkScorerAppManager;->getRecommendationServiceLabel(Landroid/content/pm/ServiceInfo;Landroid/content/pm/PackageManager;)Ljava/lang/String;
+PLcom/android/server/NetworkScorerAppManager;->getScorer(Ljava/lang/String;)Landroid/net/NetworkScorerAppData;
+PLcom/android/server/NetworkScorerAppManager;->hasPermissions(Ljava/lang/String;)Z
+PLcom/android/server/NetworkScorerAppManager;->migrateNetworkScorerAppSettingIfNeeded()V
+PLcom/android/server/NetworkScorerAppManager;->setNetworkRecommendationsEnabledSetting(I)V
+PLcom/android/server/NetworkScorerAppManager;->updateState()V
+PLcom/android/server/NetworkTimeUpdateService$1;-><init>(Lcom/android/server/NetworkTimeUpdateService;)V
+PLcom/android/server/NetworkTimeUpdateService$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/NetworkTimeUpdateService$2;-><init>(Lcom/android/server/NetworkTimeUpdateService;)V
+PLcom/android/server/NetworkTimeUpdateService$MyHandler;-><init>(Lcom/android/server/NetworkTimeUpdateService;Landroid/os/Looper;)V
+PLcom/android/server/NetworkTimeUpdateService$NetworkTimeUpdateCallback;-><init>(Lcom/android/server/NetworkTimeUpdateService;)V
+PLcom/android/server/NetworkTimeUpdateService$NetworkTimeUpdateCallback;-><init>(Lcom/android/server/NetworkTimeUpdateService;Lcom/android/server/NetworkTimeUpdateService$NetworkTimeUpdateCallback;)V
+PLcom/android/server/NetworkTimeUpdateService$NetworkTimeUpdateCallback;->onAvailable(Landroid/net/Network;)V
+PLcom/android/server/NetworkTimeUpdateService$SettingsObserver;-><init>(Landroid/os/Handler;I)V
+PLcom/android/server/NetworkTimeUpdateService$SettingsObserver;->observe(Landroid/content/Context;)V
+PLcom/android/server/NetworkTimeUpdateService;->-set0(Lcom/android/server/NetworkTimeUpdateService;Landroid/net/Network;)Landroid/net/Network;
+PLcom/android/server/NetworkTimeUpdateService;->-set1(Lcom/android/server/NetworkTimeUpdateService;J)J
+PLcom/android/server/NetworkTimeUpdateService;->-wrap0(Lcom/android/server/NetworkTimeUpdateService;I)V
+PLcom/android/server/NetworkTimeUpdateService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/NetworkTimeUpdateService;->isAutomaticTimeRequested()Z
+PLcom/android/server/NetworkTimeUpdateService;->onPollNetworkTime(I)V
+PLcom/android/server/NetworkTimeUpdateService;->onPollNetworkTimeUnderWakeLock(I)V
+PLcom/android/server/NetworkTimeUpdateService;->registerForAlarms()V
+PLcom/android/server/NetworkTimeUpdateService;->registerForTelephonyIntents()V
+PLcom/android/server/NetworkTimeUpdateService;->resetAlarm(J)V
+PLcom/android/server/NetworkTimeUpdateService;->systemRunning()V
+PLcom/android/server/NsdService$DaemonConnection;-><init>(Lcom/android/server/NsdService$NativeCallbackReceiver;)V
+PLcom/android/server/NsdService$NativeCallbackReceiver;-><init>(Lcom/android/server/NsdService;)V
+PLcom/android/server/NsdService$NativeCallbackReceiver;->awaitConnection()V
+PLcom/android/server/NsdService$NativeCallbackReceiver;->onDaemonConnected()V
+PLcom/android/server/NsdService$NsdSettings$1;-><init>(Landroid/content/ContentResolver;)V
+PLcom/android/server/NsdService$NsdSettings$1;->isEnabled()Z
+PLcom/android/server/NsdService$NsdSettings$1;->registerContentObserver(Landroid/net/Uri;Landroid/database/ContentObserver;)V
+PLcom/android/server/NsdService$NsdSettings;->makeDefault(Landroid/content/Context;)Lcom/android/server/NsdService$NsdSettings;
+PLcom/android/server/NsdService$NsdStateMachine$1;-><init>(Lcom/android/server/NsdService$NsdStateMachine;Landroid/os/Handler;)V
+PLcom/android/server/NsdService$NsdStateMachine$DefaultState;-><init>(Lcom/android/server/NsdService$NsdStateMachine;)V
+PLcom/android/server/NsdService$NsdStateMachine$DisabledState;-><init>(Lcom/android/server/NsdService$NsdStateMachine;)V
+PLcom/android/server/NsdService$NsdStateMachine$EnabledState;-><init>(Lcom/android/server/NsdService$NsdStateMachine;)V
+PLcom/android/server/NsdService$NsdStateMachine$EnabledState;->enter()V
+PLcom/android/server/NsdService$NsdStateMachine;-><init>(Lcom/android/server/NsdService;Ljava/lang/String;Landroid/os/Handler;)V
+PLcom/android/server/NsdService$NsdStateMachine;->registerForNsdSetting()V
+PLcom/android/server/NsdService;->-com_android_server_NsdService-mthref-0(Lcom/android/server/NsdService$NativeCallbackReceiver;)Lcom/android/server/NsdService$DaemonConnection;
+PLcom/android/server/NsdService;->-get0(Lcom/android/server/NsdService;)Ljava/util/HashMap;
+PLcom/android/server/NsdService;->-get4(Lcom/android/server/NsdService;)Lcom/android/server/NsdService$NsdSettings;
+PLcom/android/server/NsdService;->-wrap15(Lcom/android/server/NsdService;Z)V
+PLcom/android/server/NsdService;->-wrap2(Lcom/android/server/NsdService;)Z
+PLcom/android/server/NsdService;-><init>(Landroid/content/Context;Lcom/android/server/NsdService$NsdSettings;Landroid/os/Handler;Lcom/android/server/NsdService$DaemonConnectionSupplier;)V
+PLcom/android/server/NsdService;->create(Landroid/content/Context;)Lcom/android/server/NsdService;
+PLcom/android/server/NsdService;->isNsdEnabled()Z
+PLcom/android/server/NsdService;->sendNsdStateChangeBroadcast(Z)V
+PLcom/android/server/PersistentDataBlockService$1;-><init>(Lcom/android/server/PersistentDataBlockService;)V
+PLcom/android/server/PersistentDataBlockService$1;->getFlashLockState()I
+PLcom/android/server/PersistentDataBlockService$1;->getMaximumDataBlockSize()J
+PLcom/android/server/PersistentDataBlockService$1;->read()[B
+PLcom/android/server/PersistentDataBlockService$1;->write([B)I
+PLcom/android/server/PersistentDataBlockService$2;-><init>(Lcom/android/server/PersistentDataBlockService;)V
+PLcom/android/server/PersistentDataBlockService;->-get2(Lcom/android/server/PersistentDataBlockService;)Ljava/lang/String;
+PLcom/android/server/PersistentDataBlockService;->-get4(Lcom/android/server/PersistentDataBlockService;)Z
+PLcom/android/server/PersistentDataBlockService;->-get5(Lcom/android/server/PersistentDataBlockService;)Ljava/lang/Object;
+PLcom/android/server/PersistentDataBlockService;->-wrap0(Lcom/android/server/PersistentDataBlockService;)Z
+PLcom/android/server/PersistentDataBlockService;->-wrap10(Lcom/android/server/PersistentDataBlockService;I)V
+PLcom/android/server/PersistentDataBlockService;->-wrap2(Lcom/android/server/PersistentDataBlockService;)Z
+PLcom/android/server/PersistentDataBlockService;->-wrap3(Lcom/android/server/PersistentDataBlockService;Ljava/io/DataInputStream;)I
+PLcom/android/server/PersistentDataBlockService;->-wrap5(Lcom/android/server/PersistentDataBlockService;)J
+PLcom/android/server/PersistentDataBlockService;->-wrap8(Lcom/android/server/PersistentDataBlockService;)V
+PLcom/android/server/PersistentDataBlockService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/PersistentDataBlockService;->computeAndWriteDigestLocked()Z
+PLcom/android/server/PersistentDataBlockService;->computeDigestLocked([B)[B
+PLcom/android/server/PersistentDataBlockService;->doGetOemUnlockEnabled()Z
+PLcom/android/server/PersistentDataBlockService;->enforceChecksumValidity()Z
+PLcom/android/server/PersistentDataBlockService;->enforceOemUnlockReadPermission()V
+PLcom/android/server/PersistentDataBlockService;->enforceUid(I)V
+PLcom/android/server/PersistentDataBlockService;->formatIfOemUnlockEnabled()V
+PLcom/android/server/PersistentDataBlockService;->getAllowedUid(I)I
+PLcom/android/server/PersistentDataBlockService;->getBlockDeviceSize()J
+PLcom/android/server/PersistentDataBlockService;->getTotalDataSizeLocked(Ljava/io/DataInputStream;)I
+PLcom/android/server/PersistentDataBlockService;->lambda$-com_android_server_PersistentDataBlockService_5033()V
+PLcom/android/server/PersistentDataBlockService;->onBootPhase(I)V
+PLcom/android/server/PersistentDataBlockService;->onStart()V
+PLcom/android/server/PinnerService$1;-><init>(Lcom/android/server/PinnerService;)V
+PLcom/android/server/PinnerService$BinderService;-><init>(Lcom/android/server/PinnerService;)V
+PLcom/android/server/PinnerService$BinderService;-><init>(Lcom/android/server/PinnerService;Lcom/android/server/PinnerService$BinderService;)V
+PLcom/android/server/PinnerService$PinnedFile;-><init>(JJLjava/lang/String;)V
+PLcom/android/server/PinnerService$PinnerHandler;-><init>(Lcom/android/server/PinnerService;Landroid/os/Looper;)V
+PLcom/android/server/PinnerService$PinnerHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/PinnerService;->-wrap0(Lcom/android/server/PinnerService;I)V
+PLcom/android/server/PinnerService;->-wrap1(Lcom/android/server/PinnerService;)V
+PLcom/android/server/PinnerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/PinnerService;->getCameraInfo(I)Landroid/content/pm/ApplicationInfo;
+PLcom/android/server/PinnerService;->handlePinCamera(I)V
+PLcom/android/server/PinnerService;->handlePinOnStart()V
+PLcom/android/server/PinnerService;->isResolverActivity(Landroid/content/pm/ActivityInfo;)Z
+PLcom/android/server/PinnerService;->onStart()V
+PLcom/android/server/PinnerService;->pinCamera(I)Z
+PLcom/android/server/PinnerService;->pinFile(Ljava/lang/String;JJJ)Lcom/android/server/PinnerService$PinnedFile;
+PLcom/android/server/PinnerService;->unpinCameraApp()V
+PLcom/android/server/PinnerService;->update(Landroid/util/ArraySet;)V
+PLcom/android/server/PruneInstantAppsJobService;->schedule(Landroid/content/Context;)V
+PLcom/android/server/RandomBlock;-><init>()V
+PLcom/android/server/RandomBlock;->close(Ljava/io/Closeable;)V
+PLcom/android/server/RandomBlock;->fromFile(Ljava/lang/String;)Lcom/android/server/RandomBlock;
+PLcom/android/server/RandomBlock;->fromStream(Ljava/io/InputStream;)Lcom/android/server/RandomBlock;
+PLcom/android/server/RandomBlock;->toDataOut(Ljava/io/DataOutput;)V
+PLcom/android/server/RandomBlock;->toFile(Ljava/lang/String;Z)V
+PLcom/android/server/RandomBlock;->truncateIfPossible(Ljava/io/RandomAccessFile;)V
+PLcom/android/server/RescueParty;->executeRescueLevel(Landroid/content/Context;)V
+PLcom/android/server/RescueParty;->onSettingsProviderPublished(Landroid/content/Context;)V
+PLcom/android/server/SensorNotificationService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/SensorNotificationService;->onBootPhase(I)V
+PLcom/android/server/SensorNotificationService;->onStart()V
+PLcom/android/server/SerialService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/ServiceWatcher$1;-><init>(Lcom/android/server/ServiceWatcher;)V
+PLcom/android/server/ServiceWatcher$1;->onPackageAdded(Ljava/lang/String;I)V
+PLcom/android/server/ServiceWatcher$1;->onPackageChanged(Ljava/lang/String;I[Ljava/lang/String;)Z
+PLcom/android/server/ServiceWatcher$2;-><init>(Lcom/android/server/ServiceWatcher;)V
+PLcom/android/server/ServiceWatcher$2;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/ServiceWatcher;->-get0(Lcom/android/server/ServiceWatcher;)Ljava/lang/String;
+PLcom/android/server/ServiceWatcher;->-get1(Lcom/android/server/ServiceWatcher;)Ljava/lang/Object;
+PLcom/android/server/ServiceWatcher;->-wrap0(Lcom/android/server/ServiceWatcher;Ljava/lang/String;Z)Z
+PLcom/android/server/ServiceWatcher;-><init>(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;IIILjava/lang/Runnable;Landroid/os/Handler;)V
+PLcom/android/server/ServiceWatcher;->bindBestPackageLocked(Ljava/lang/String;Z)Z
+PLcom/android/server/ServiceWatcher;->bindToPackageLocked(Landroid/content/ComponentName;II)V
+PLcom/android/server/ServiceWatcher;->getBinder()Landroid/os/IBinder;
+PLcom/android/server/ServiceWatcher;->getSignatureSets(Landroid/content/Context;Ljava/util/List;)Ljava/util/ArrayList;
+PLcom/android/server/ServiceWatcher;->isServiceMissing()Z
+PLcom/android/server/ServiceWatcher;->isSignatureMatch([Landroid/content/pm/Signature;)Z
+PLcom/android/server/ServiceWatcher;->isSignatureMatch([Landroid/content/pm/Signature;Ljava/util/List;)Z
+PLcom/android/server/ServiceWatcher;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/ServiceWatcher;->start()Z
+PLcom/android/server/ServiceWatcher;->switchUser(I)V
+PLcom/android/server/ServiceWatcher;->unbindLocked()V
+PLcom/android/server/ServiceWatcher;->unlockUser(I)V
+PLcom/android/server/StorageManagerService$1;-><init>(Lcom/android/server/StorageManagerService;)V
+PLcom/android/server/StorageManagerService$Callbacks;->-wrap2(Lcom/android/server/StorageManagerService$Callbacks;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/StorageManagerService$Callbacks;->-wrap5(Lcom/android/server/StorageManagerService$Callbacks;Landroid/os/storage/VolumeInfo;II)V
+PLcom/android/server/StorageManagerService$Callbacks;-><init>(Landroid/os/Looper;)V
+PLcom/android/server/StorageManagerService$Callbacks;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/StorageManagerService$Callbacks;->invokeCallback(Landroid/os/storage/IStorageEventListener;ILcom/android/internal/os/SomeArgs;)V
+PLcom/android/server/StorageManagerService$Callbacks;->notifyStorageStateChanged(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/StorageManagerService$Callbacks;->notifyVolumeStateChanged(Landroid/os/storage/VolumeInfo;II)V
+PLcom/android/server/StorageManagerService$Callbacks;->register(Landroid/os/storage/IStorageEventListener;)V
+PLcom/android/server/StorageManagerService$DefaultContainerConnection;-><init>(Lcom/android/server/StorageManagerService;)V
+PLcom/android/server/StorageManagerService$Lifecycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/StorageManagerService$Lifecycle;->onBootPhase(I)V
+PLcom/android/server/StorageManagerService$Lifecycle;->onStart()V
+PLcom/android/server/StorageManagerService$Lifecycle;->onUnlockUser(I)V
+PLcom/android/server/StorageManagerService$ObbActionHandler;-><init>(Lcom/android/server/StorageManagerService;Landroid/os/Looper;)V
+PLcom/android/server/StorageManagerService$StorageManagerInternalImpl;-><init>(Lcom/android/server/StorageManagerService;)V
+PLcom/android/server/StorageManagerService$StorageManagerInternalImpl;-><init>(Lcom/android/server/StorageManagerService;Lcom/android/server/StorageManagerService$StorageManagerInternalImpl;)V
+PLcom/android/server/StorageManagerService$StorageManagerInternalImpl;->addExternalStoragePolicy(Landroid/os/storage/StorageManagerInternal$ExternalStorageMountPolicy;)V
+PLcom/android/server/StorageManagerService$StorageManagerInternalImpl;->getExternalStorageMountMode(ILjava/lang/String;)I
+PLcom/android/server/StorageManagerService$StorageManagerServiceHandler;-><init>(Lcom/android/server/StorageManagerService;Landroid/os/Looper;)V
+PLcom/android/server/StorageManagerService$StorageManagerServiceHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/StorageManagerService;->-get0(Lcom/android/server/StorageManagerService;)Lcom/android/server/NativeDaemonConnector;
+PLcom/android/server/StorageManagerService;->-get2(Lcom/android/server/StorageManagerService;)Landroid/content/Context;
+PLcom/android/server/StorageManagerService;->-wrap0(Lcom/android/server/StorageManagerService;Landroid/os/storage/VolumeInfo;)Z
+PLcom/android/server/StorageManagerService;->-wrap10(Lcom/android/server/StorageManagerService;I)V
+PLcom/android/server/StorageManagerService;->-wrap14(Lcom/android/server/StorageManagerService;)V
+PLcom/android/server/StorageManagerService;->-wrap15(Lcom/android/server/StorageManagerService;)V
+PLcom/android/server/StorageManagerService;->-wrap5(Lcom/android/server/StorageManagerService;)V
+PLcom/android/server/StorageManagerService;->-wrap7(Lcom/android/server/StorageManagerService;)V
+PLcom/android/server/StorageManagerService;->-wrap8(Lcom/android/server/StorageManagerService;)V
+PLcom/android/server/StorageManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/StorageManagerService;->addInternalVolumeLocked()V
+PLcom/android/server/StorageManagerService;->adjustAllocateFlags(IILjava/lang/String;)I
+PLcom/android/server/StorageManagerService;->allocateBytes(Ljava/lang/String;JILjava/lang/String;)V
+PLcom/android/server/StorageManagerService;->bootCompleted()V
+PLcom/android/server/StorageManagerService;->clearPassword()V
+PLcom/android/server/StorageManagerService;->copyLocaleFromMountService()V
+PLcom/android/server/StorageManagerService;->encodeBytes([B)Lcom/android/server/NativeDaemonConnector$SensitiveArg;
+PLcom/android/server/StorageManagerService;->enforcePermission(Ljava/lang/String;)V
+PLcom/android/server/StorageManagerService;->escapeNull(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/StorageManagerService;->getAllocatableBytes(Ljava/lang/String;ILjava/lang/String;)J
+PLcom/android/server/StorageManagerService;->getDefaultPrimaryStorageUuid()Ljava/lang/String;
+PLcom/android/server/StorageManagerService;->getDisks()[Landroid/os/storage/DiskInfo;
+PLcom/android/server/StorageManagerService;->getField(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/StorageManagerService;->getPassword()Ljava/lang/String;
+PLcom/android/server/StorageManagerService;->getSecureContainerList()[Ljava/lang/String;
+PLcom/android/server/StorageManagerService;->getVolumeRecords(I)[Landroid/os/storage/VolumeRecord;
+PLcom/android/server/StorageManagerService;->handleDaemonConnected()V
+PLcom/android/server/StorageManagerService;->handleSystemReady()V
+PLcom/android/server/StorageManagerService;->initIfReadyAndConnected()V
+PLcom/android/server/StorageManagerService;->isMountDisallowed(Landroid/os/storage/VolumeInfo;)Z
+PLcom/android/server/StorageManagerService;->isReady()Z
+PLcom/android/server/StorageManagerService;->isUserKeyUnlocked(I)Z
+PLcom/android/server/StorageManagerService;->killMediaProvider(Ljava/util/List;)V
+PLcom/android/server/StorageManagerService;->lastMaintenance()J
+PLcom/android/server/StorageManagerService;->onCheckHoldWakeLock(I)Z
+PLcom/android/server/StorageManagerService;->onDaemonConnected()V
+PLcom/android/server/StorageManagerService;->onEvent(ILjava/lang/String;[Ljava/lang/String;)Z
+PLcom/android/server/StorageManagerService;->onEventLocked(ILjava/lang/String;[Ljava/lang/String;)Z
+PLcom/android/server/StorageManagerService;->onUnlockUser(I)V
+PLcom/android/server/StorageManagerService;->onVolumeCreatedLocked(Landroid/os/storage/VolumeInfo;)V
+PLcom/android/server/StorageManagerService;->onVolumeStateChangedLocked(Landroid/os/storage/VolumeInfo;II)V
+PLcom/android/server/StorageManagerService;->prepareUserStorage(Ljava/lang/String;III)V
+PLcom/android/server/StorageManagerService;->readSettingsLocked()V
+PLcom/android/server/StorageManagerService;->registerListener(Landroid/os/storage/IStorageEventListener;)V
+PLcom/android/server/StorageManagerService;->resetIfReadyAndConnected()V
+PLcom/android/server/StorageManagerService;->start()V
+PLcom/android/server/StorageManagerService;->systemReady()V
+PLcom/android/server/StorageManagerService;->unlockUserKey(II[B[B)V
+PLcom/android/server/StorageManagerService;->waitForAsecScan()V
+PLcom/android/server/StorageManagerService;->waitForLatch(Ljava/util/concurrent/CountDownLatch;Ljava/lang/String;)V
+PLcom/android/server/StorageManagerService;->waitForLatch(Ljava/util/concurrent/CountDownLatch;Ljava/lang/String;J)V
+PLcom/android/server/StorageManagerService;->waitForReady()V
+PLcom/android/server/StorageManagerService;->warnOnNotMounted()V
+PLcom/android/server/SystemServer;->lambda$-com_android_server_SystemServer_28929()V
+PLcom/android/server/SystemServer;->lambda$-com_android_server_SystemServer_34065()V
+PLcom/android/server/SystemServer;->lambda$-com_android_server_SystemServer_38654()V
+PLcom/android/server/SystemServer;->lambda$-com_android_server_SystemServer_74165(Landroid/content/Context;Lcom/android/server/wm/WindowManagerService;Lcom/android/server/NetworkScoreService;Lcom/android/server/NetworkManagementService;Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkStatsService;Lcom/android/server/ConnectivityService;Lcom/android/server/LocationManagerService;Lcom/android/server/CountryDetectorService;Lcom/android/server/NetworkTimeUpdateService;Lcom/android/server/CommonTimeManagementService;Lcom/android/server/input/InputManagerService;Lcom/android/server/TelephonyRegistry;Lcom/android/server/media/MediaRouterService;Lcom/android/server/MmsServiceBroker;)V
+PLcom/android/server/SystemServer;->lambda$-com_android_server_SystemServer_75070()V
+PLcom/android/server/SystemServer;->startCoreServices()V
+PLcom/android/server/SystemServer;->startOtherServices()V
+PLcom/android/server/SystemServer;->startSystemUi(Landroid/content/Context;Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/SystemServerInitThreadPool;->shutdown()V
+PLcom/android/server/SystemService;->getBinderService(Ljava/lang/String;)Landroid/os/IBinder;
+PLcom/android/server/SystemService;->getLocalService(Ljava/lang/Class;)Ljava/lang/Object;
+PLcom/android/server/SystemService;->getManager()Lcom/android/server/SystemServiceManager;
+PLcom/android/server/SystemService;->isSafeMode()Z
+PLcom/android/server/SystemService;->onStartUser(I)V
+PLcom/android/server/SystemService;->onUnlockUser(I)V
+PLcom/android/server/SystemServiceManager;->isBootCompleted()Z
+PLcom/android/server/SystemServiceManager;->isRuntimeRestarted()Z
+PLcom/android/server/SystemServiceManager;->isSafeMode()Z
+PLcom/android/server/SystemServiceManager;->setSafeMode(Z)V
+PLcom/android/server/SystemServiceManager;->startService(Ljava/lang/String;)Lcom/android/server/SystemService;
+PLcom/android/server/SystemServiceManager;->startUser(I)V
+PLcom/android/server/SystemServiceManager;->unlockUser(I)V
+PLcom/android/server/TelephonyRegistry$1;-><init>(Lcom/android/server/TelephonyRegistry;)V
+PLcom/android/server/TelephonyRegistry$1;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/TelephonyRegistry$2;-><init>(Lcom/android/server/TelephonyRegistry;)V
+PLcom/android/server/TelephonyRegistry$2;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/TelephonyRegistry$Record;-><init>()V
+PLcom/android/server/TelephonyRegistry$Record;-><init>(Lcom/android/server/TelephonyRegistry$Record;)V
+PLcom/android/server/TelephonyRegistry$Record;->matchOnSubscriptionsChangedListener()Z
+PLcom/android/server/TelephonyRegistry$Record;->matchPhoneStateListenerEvent(I)Z
+PLcom/android/server/TelephonyRegistry;->-get0(Lcom/android/server/TelephonyRegistry;)[Landroid/os/Bundle;
+PLcom/android/server/TelephonyRegistry;->-get3(Lcom/android/server/TelephonyRegistry;)Landroid/os/Handler;
+PLcom/android/server/TelephonyRegistry;-><init>(Landroid/content/Context;)V
+PLcom/android/server/TelephonyRegistry;->addOnSubscriptionsChangedListener(Ljava/lang/String;Lcom/android/internal/telephony/IOnSubscriptionsChangedListener;)V
+PLcom/android/server/TelephonyRegistry;->broadcastDataConnectionStateChanged(IZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/net/LinkProperties;Landroid/net/NetworkCapabilities;ZI)V
+PLcom/android/server/TelephonyRegistry;->broadcastPreciseDataConnectionStateChanged(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/net/LinkProperties;Ljava/lang/String;)V
+PLcom/android/server/TelephonyRegistry;->broadcastServiceStateChanged(Landroid/telephony/ServiceState;II)V
+PLcom/android/server/TelephonyRegistry;->broadcastSignalStrengthChanged(Landroid/telephony/SignalStrength;II)V
+PLcom/android/server/TelephonyRegistry;->canReadPhoneState(Ljava/lang/String;)Z
+PLcom/android/server/TelephonyRegistry;->checkListenerPermission(I)V
+PLcom/android/server/TelephonyRegistry;->checkNotifyPermission()Z
+PLcom/android/server/TelephonyRegistry;->checkNotifyPermission(Ljava/lang/String;)Z
+PLcom/android/server/TelephonyRegistry;->handleRemoveListLocked()V
+PLcom/android/server/TelephonyRegistry;->idMatch(III)Z
+PLcom/android/server/TelephonyRegistry;->listen(Ljava/lang/String;Lcom/android/internal/telephony/IPhoneStateListener;IZI)V
+PLcom/android/server/TelephonyRegistry;->listenForSubscriber(ILjava/lang/String;Lcom/android/internal/telephony/IPhoneStateListener;IZ)V
+PLcom/android/server/TelephonyRegistry;->log(Ljava/lang/String;)V
+PLcom/android/server/TelephonyRegistry;->notifyCellLocationForSubscriber(ILandroid/os/Bundle;)V
+PLcom/android/server/TelephonyRegistry;->notifyDataActivityForSubscriber(II)V
+PLcom/android/server/TelephonyRegistry;->notifyDataConnectionForSubscriber(IIZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/net/LinkProperties;Landroid/net/NetworkCapabilities;IZ)V
+PLcom/android/server/TelephonyRegistry;->notifyMessageWaitingChangedForPhoneId(IIZ)V
+PLcom/android/server/TelephonyRegistry;->notifyOemHookRawEventForSubscriber(I[B)V
+PLcom/android/server/TelephonyRegistry;->notifyOtaspChanged(I)V
+PLcom/android/server/TelephonyRegistry;->notifyServiceStateForPhoneId(IILandroid/telephony/ServiceState;)V
+PLcom/android/server/TelephonyRegistry;->notifySignalStrengthForPhoneId(IILandroid/telephony/SignalStrength;)V
+PLcom/android/server/TelephonyRegistry;->notifySimActivationStateChangedForPhoneId(IIII)V
+PLcom/android/server/TelephonyRegistry;->notifySubscriptionInfoChanged()V
+PLcom/android/server/TelephonyRegistry;->remove(Landroid/os/IBinder;)V
+PLcom/android/server/TelephonyRegistry;->systemRunning()V
+PLcom/android/server/TelephonyRegistry;->validatePhoneId(I)Z
+PLcom/android/server/TextServicesManagerService$Lifecycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/TextServicesManagerService$Lifecycle;->onBootPhase(I)V
+PLcom/android/server/TextServicesManagerService$Lifecycle;->onStart()V
+PLcom/android/server/TextServicesManagerService$Lifecycle;->onUnlockUser(I)V
+PLcom/android/server/TextServicesManagerService$TextServicesBroadcastReceiver;-><init>(Lcom/android/server/TextServicesManagerService;)V
+PLcom/android/server/TextServicesManagerService$TextServicesBroadcastReceiver;-><init>(Lcom/android/server/TextServicesManagerService;Lcom/android/server/TextServicesManagerService$TextServicesBroadcastReceiver;)V
+PLcom/android/server/TextServicesManagerService$TextServicesMonitor;-><init>(Lcom/android/server/TextServicesManagerService;)V
+PLcom/android/server/TextServicesManagerService$TextServicesMonitor;-><init>(Lcom/android/server/TextServicesManagerService;Lcom/android/server/TextServicesManagerService$TextServicesMonitor;)V
+PLcom/android/server/TextServicesManagerService$TextServicesMonitor;->isChangingPackagesOfCurrentUser()Z
+PLcom/android/server/TextServicesManagerService$TextServicesMonitor;->onSomePackagesChanged()V
+PLcom/android/server/TextServicesManagerService$TextServicesSettings;-><init>(Landroid/content/ContentResolver;IZ)V
+PLcom/android/server/TextServicesManagerService$TextServicesSettings;->getCurrentUserId()I
+PLcom/android/server/TextServicesManagerService$TextServicesSettings;->getSelectedSpellChecker()Ljava/lang/String;
+PLcom/android/server/TextServicesManagerService$TextServicesSettings;->getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/TextServicesManagerService$TextServicesSettings;->setCurrentProfileIds([I)V
+PLcom/android/server/TextServicesManagerService$TextServicesSettings;->switchCurrentUser(IZ)V
+PLcom/android/server/TextServicesManagerService;->-get1(Lcom/android/server/TextServicesManagerService;)Landroid/content/Context;
+PLcom/android/server/TextServicesManagerService;->-get2(Lcom/android/server/TextServicesManagerService;)Lcom/android/server/TextServicesManagerService$TextServicesSettings;
+PLcom/android/server/TextServicesManagerService;->-get4(Lcom/android/server/TextServicesManagerService;)Ljava/util/ArrayList;
+PLcom/android/server/TextServicesManagerService;->-get5(Lcom/android/server/TextServicesManagerService;)Ljava/util/HashMap;
+PLcom/android/server/TextServicesManagerService;->-wrap1(Landroid/content/Context;Ljava/util/ArrayList;Ljava/util/HashMap;Lcom/android/server/TextServicesManagerService$TextServicesSettings;)V
+PLcom/android/server/TextServicesManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/TextServicesManagerService;->buildSpellCheckerMapLocked(Landroid/content/Context;Ljava/util/ArrayList;Ljava/util/HashMap;Lcom/android/server/TextServicesManagerService$TextServicesSettings;)V
+PLcom/android/server/TextServicesManagerService;->calledFromValidUser()Z
+PLcom/android/server/TextServicesManagerService;->findAvailSpellCheckerLocked(Ljava/lang/String;)Landroid/view/textservice/SpellCheckerInfo;
+PLcom/android/server/TextServicesManagerService;->getCurrentSpellChecker(Ljava/lang/String;)Landroid/view/textservice/SpellCheckerInfo;
+PLcom/android/server/TextServicesManagerService;->getCurrentSpellCheckerWithoutVerification()Landroid/view/textservice/SpellCheckerInfo;
+PLcom/android/server/TextServicesManagerService;->onUnlockUser(I)V
+PLcom/android/server/TextServicesManagerService;->resetInternalState(I)V
+PLcom/android/server/TextServicesManagerService;->systemRunning()V
+PLcom/android/server/TextServicesManagerService;->unbindServiceLocked()V
+PLcom/android/server/TextServicesManagerService;->updateCurrentProfileIds()V
+PLcom/android/server/ThreadPriorityBooster$1;->initialValue()Lcom/android/server/ThreadPriorityBooster$PriorityState;
+PLcom/android/server/ThreadPriorityBooster$1;->initialValue()Ljava/lang/Object;
+PLcom/android/server/ThreadPriorityBooster$PriorityState;-><init>()V
+PLcom/android/server/ThreadPriorityBooster$PriorityState;-><init>(Lcom/android/server/ThreadPriorityBooster$PriorityState;)V
+PLcom/android/server/ThreadPriorityBooster;->setBoostToPriority(I)V
+PLcom/android/server/UiModeManagerService$1;-><init>(Lcom/android/server/UiModeManagerService;)V
+PLcom/android/server/UiModeManagerService$2;-><init>(Lcom/android/server/UiModeManagerService;)V
+PLcom/android/server/UiModeManagerService$3;-><init>(Lcom/android/server/UiModeManagerService;)V
+PLcom/android/server/UiModeManagerService$3;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/UiModeManagerService$4;-><init>(Lcom/android/server/UiModeManagerService;)V
+PLcom/android/server/UiModeManagerService$5;-><init>(Lcom/android/server/UiModeManagerService;)V
+PLcom/android/server/UiModeManagerService$6;-><init>(Lcom/android/server/UiModeManagerService;)V
+PLcom/android/server/UiModeManagerService$6;->getCurrentModeType()I
+PLcom/android/server/UiModeManagerService;->-set0(Lcom/android/server/UiModeManagerService;Z)Z
+PLcom/android/server/UiModeManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/UiModeManagerService;->isDeskDockState(I)Z
+PLcom/android/server/UiModeManagerService;->lambda$-com_android_server_UiModeManagerService_9177()V
+PLcom/android/server/UiModeManagerService;->onBootPhase(I)V
+PLcom/android/server/UiModeManagerService;->onStart()V
+PLcom/android/server/UiModeManagerService;->registerVrStateListener()V
+PLcom/android/server/UiModeManagerService;->sendConfigurationAndStartDreamOrDockAppLocked(Ljava/lang/String;)V
+PLcom/android/server/UiModeManagerService;->sendConfigurationLocked()V
+PLcom/android/server/UiModeManagerService;->updateComputedNightModeLocked()V
+PLcom/android/server/UiModeManagerService;->updateConfigurationLocked()V
+PLcom/android/server/UiModeManagerService;->updateLocked(II)V
+PLcom/android/server/UpdateLockService$LockWatcher;-><init>(Lcom/android/server/UpdateLockService;Landroid/os/Handler;Ljava/lang/String;)V
+PLcom/android/server/UpdateLockService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/UpdateLockService;->sendLockChangedBroadcast(Z)V
+PLcom/android/server/VibratorService$1;-><init>(Lcom/android/server/VibratorService;)V
+PLcom/android/server/VibratorService$1;->run()V
+PLcom/android/server/VibratorService$2;-><init>(Lcom/android/server/VibratorService;)V
+PLcom/android/server/VibratorService$3;-><init>(Lcom/android/server/VibratorService;)V
+PLcom/android/server/VibratorService$4;-><init>(Lcom/android/server/VibratorService;)V
+PLcom/android/server/VibratorService$4;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/VibratorService$SettingsObserver;-><init>(Lcom/android/server/VibratorService;Landroid/os/Handler;)V
+PLcom/android/server/VibratorService$VibrateThread;-><init>(Lcom/android/server/VibratorService;Landroid/os/VibrationEffect$Waveform;II)V
+PLcom/android/server/VibratorService$VibrateThread;->cancel()V
+PLcom/android/server/VibratorService$VibrateThread;->delayLocked(J)J
+PLcom/android/server/VibratorService$VibrateThread;->getTotalOnDuration([J[III)J
+PLcom/android/server/VibratorService$VibrateThread;->playWaveform()Z
+PLcom/android/server/VibratorService$VibrateThread;->run()V
+PLcom/android/server/VibratorService$Vibration;->-get0(Lcom/android/server/VibratorService$Vibration;)Landroid/os/VibrationEffect;
+PLcom/android/server/VibratorService$Vibration;->-get1(Lcom/android/server/VibratorService$Vibration;)Ljava/lang/String;
+PLcom/android/server/VibratorService$Vibration;->-get2(Lcom/android/server/VibratorService$Vibration;)J
+PLcom/android/server/VibratorService$Vibration;->-get4(Lcom/android/server/VibratorService$Vibration;)I
+PLcom/android/server/VibratorService$Vibration;->-get5(Lcom/android/server/VibratorService$Vibration;)I
+PLcom/android/server/VibratorService$Vibration;-><init>(Lcom/android/server/VibratorService;Landroid/os/IBinder;Landroid/os/VibrationEffect;IILjava/lang/String;)V
+PLcom/android/server/VibratorService$Vibration;-><init>(Lcom/android/server/VibratorService;Landroid/os/IBinder;Landroid/os/VibrationEffect;IILjava/lang/String;Lcom/android/server/VibratorService$Vibration;)V
+PLcom/android/server/VibratorService$VibrationInfo;-><init>(JLandroid/os/VibrationEffect;IILjava/lang/String;)V
+PLcom/android/server/VibratorService;->-get2(Lcom/android/server/VibratorService;)Lcom/android/server/VibratorService$VibrateThread;
+PLcom/android/server/VibratorService;->-get3(Lcom/android/server/VibratorService;)Landroid/os/WorkSource;
+PLcom/android/server/VibratorService;->-get4(Lcom/android/server/VibratorService;)Landroid/os/PowerManager$WakeLock;
+PLcom/android/server/VibratorService;->-wrap1(Lcom/android/server/VibratorService;JIII)V
+PLcom/android/server/VibratorService;->-wrap3(Lcom/android/server/VibratorService;)V
+PLcom/android/server/VibratorService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/VibratorService;->addToPreviousVibrationsLocked(Lcom/android/server/VibratorService$Vibration;)V
+PLcom/android/server/VibratorService;->cancelVibrate(Landroid/os/IBinder;)V
+PLcom/android/server/VibratorService;->createEffect([J)Landroid/os/VibrationEffect;
+PLcom/android/server/VibratorService;->doCancelVibrateLocked()V
+PLcom/android/server/VibratorService;->doVibratorExists()Z
+PLcom/android/server/VibratorService;->doVibratorOff()V
+PLcom/android/server/VibratorService;->doVibratorOn(JIII)V
+PLcom/android/server/VibratorService;->doVibratorPrebakedEffectLocked(Lcom/android/server/VibratorService$Vibration;)J
+PLcom/android/server/VibratorService;->doVibratorSetAmplitude(I)V
+PLcom/android/server/VibratorService;->getAppOpMode(Lcom/android/server/VibratorService$Vibration;)I
+PLcom/android/server/VibratorService;->getLongIntArray(Landroid/content/res/Resources;I)[J
+PLcom/android/server/VibratorService;->hasVibrator()Z
+PLcom/android/server/VibratorService;->isAllowedToVibrate(Lcom/android/server/VibratorService$Vibration;)Z
+PLcom/android/server/VibratorService;->noteVibratorOffLocked()V
+PLcom/android/server/VibratorService;->noteVibratorOnLocked(IJ)V
+PLcom/android/server/VibratorService;->onVibrationFinished()V
+PLcom/android/server/VibratorService;->reportFinishVibrationLocked()V
+PLcom/android/server/VibratorService;->startVibrationInnerLocked(Lcom/android/server/VibratorService$Vibration;)V
+PLcom/android/server/VibratorService;->startVibrationLocked(Lcom/android/server/VibratorService$Vibration;)V
+PLcom/android/server/VibratorService;->systemReady()V
+PLcom/android/server/VibratorService;->updateInputDeviceVibratorsLocked()Z
+PLcom/android/server/VibratorService;->updateLowPowerModeLocked()Z
+PLcom/android/server/VibratorService;->updateVibrators()V
+PLcom/android/server/VibratorService;->verifyIncomingUid(I)V
+PLcom/android/server/VibratorService;->verifyVibrationEffect(Landroid/os/VibrationEffect;)Z
+PLcom/android/server/VibratorService;->vibrate(ILjava/lang/String;Landroid/os/VibrationEffect;ILandroid/os/IBinder;)V
+PLcom/android/server/Watchdog$BinderThreadMonitor;->monitor()V
+PLcom/android/server/Watchdog$HandlerChecker;->getCompletionStateLocked()I
+PLcom/android/server/Watchdog$HandlerChecker;->run()V
+PLcom/android/server/Watchdog$HandlerChecker;->scheduleCheckLocked()V
+PLcom/android/server/Watchdog$RebootRequestReceiver;-><init>(Lcom/android/server/Watchdog;)V
+PLcom/android/server/Watchdog;->evaluateCheckerCompletionLocked()I
+PLcom/android/server/Watchdog;->init(Landroid/content/Context;Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/Watchdog;->processStarted(Ljava/lang/String;I)V
+PLcom/android/server/Watchdog;->run()V
+PLcom/android/server/WiredAccessoryManager$1;-><init>(Lcom/android/server/WiredAccessoryManager;Landroid/os/Looper;Landroid/os/Handler$Callback;Z)V
+PLcom/android/server/WiredAccessoryManager$1;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/WiredAccessoryManager$WiredAccessoryObserver$UEventInfo;-><init>(Lcom/android/server/WiredAccessoryManager$WiredAccessoryObserver;Ljava/lang/String;III)V
+PLcom/android/server/WiredAccessoryManager$WiredAccessoryObserver$UEventInfo;->checkSwitchExists()Z
+PLcom/android/server/WiredAccessoryManager$WiredAccessoryObserver$UEventInfo;->getDevPath()Ljava/lang/String;
+PLcom/android/server/WiredAccessoryManager$WiredAccessoryObserver$UEventInfo;->getSwitchStatePath()Ljava/lang/String;
+PLcom/android/server/WiredAccessoryManager$WiredAccessoryObserver;-><init>(Lcom/android/server/WiredAccessoryManager;)V
+PLcom/android/server/WiredAccessoryManager$WiredAccessoryObserver;->init()V
+PLcom/android/server/WiredAccessoryManager$WiredAccessoryObserver;->makeObservedUEventList()Ljava/util/List;
+PLcom/android/server/WiredAccessoryManager;->-get0()Ljava/lang/String;
+PLcom/android/server/WiredAccessoryManager;->-get2(Lcom/android/server/WiredAccessoryManager;)Ljava/lang/Object;
+PLcom/android/server/WiredAccessoryManager;->-get3(Lcom/android/server/WiredAccessoryManager;)Z
+PLcom/android/server/WiredAccessoryManager;->-get4(Lcom/android/server/WiredAccessoryManager;)Landroid/os/PowerManager$WakeLock;
+PLcom/android/server/WiredAccessoryManager;->-wrap0(Lcom/android/server/WiredAccessoryManager;)V
+PLcom/android/server/WiredAccessoryManager;-><init>(Landroid/content/Context;Lcom/android/server/input/InputManagerService;)V
+PLcom/android/server/WiredAccessoryManager;->notifyWiredAccessoryChanged(JII)V
+PLcom/android/server/WiredAccessoryManager;->onSystemReady()V
+PLcom/android/server/WiredAccessoryManager;->switchCodeToString(II)Ljava/lang/String;
+PLcom/android/server/WiredAccessoryManager;->systemReady()V
+PLcom/android/server/WiredAccessoryManager;->updateLocked(Ljava/lang/String;I)V
+PLcom/android/server/accessibility/-$Lambda$kXhldx_ZxidxR4suyNIbZ545MMw$1;->$m$0()V
+PLcom/android/server/accessibility/-$Lambda$kXhldx_ZxidxR4suyNIbZ545MMw$1;-><init>(ILjava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/accessibility/-$Lambda$kXhldx_ZxidxR4suyNIbZ545MMw$1;->run()V
+PLcom/android/server/accessibility/-$Lambda$kXhldx_ZxidxR4suyNIbZ545MMw;->$m$1(Ljava/lang/Object;)V
+PLcom/android/server/accessibility/-$Lambda$kXhldx_ZxidxR4suyNIbZ545MMw;->$m$2(Ljava/lang/Object;)V
+PLcom/android/server/accessibility/-$Lambda$kXhldx_ZxidxR4suyNIbZ545MMw;-><init>(BI)V
+PLcom/android/server/accessibility/-$Lambda$kXhldx_ZxidxR4suyNIbZ545MMw;->accept(Ljava/lang/Object;)V
+PLcom/android/server/accessibility/AccessibilityManagerService$1;-><init>(Lcom/android/server/accessibility/AccessibilityManagerService;)V
+PLcom/android/server/accessibility/AccessibilityManagerService$1;->onSomePackagesChanged()V
+PLcom/android/server/accessibility/AccessibilityManagerService$2;-><init>(Lcom/android/server/accessibility/AccessibilityManagerService;)V
+PLcom/android/server/accessibility/AccessibilityManagerService$2;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/accessibility/AccessibilityManagerService$AccessibilityConnectionWrapper;-><init>(Lcom/android/server/accessibility/AccessibilityManagerService;ILandroid/view/accessibility/IAccessibilityInteractionConnection;I)V
+PLcom/android/server/accessibility/AccessibilityManagerService$AccessibilityConnectionWrapper;->linkToDeath()V
+PLcom/android/server/accessibility/AccessibilityManagerService$AccessibilityConnectionWrapper;->unlinkToDeath()V
+PLcom/android/server/accessibility/AccessibilityManagerService$AccessibilityContentObserver;-><init>(Lcom/android/server/accessibility/AccessibilityManagerService;Landroid/os/Handler;)V
+PLcom/android/server/accessibility/AccessibilityManagerService$AccessibilityContentObserver;->register(Landroid/content/ContentResolver;)V
+PLcom/android/server/accessibility/AccessibilityManagerService$MainHandler;-><init>(Lcom/android/server/accessibility/AccessibilityManagerService;Landroid/os/Looper;)V
+PLcom/android/server/accessibility/AccessibilityManagerService$MainHandler;->getUserClientsForId(I)Landroid/os/RemoteCallbackList;
+PLcom/android/server/accessibility/AccessibilityManagerService$MainHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/accessibility/AccessibilityManagerService$MainHandler;->lambda$-com_android_server_accessibility_AccessibilityManagerService$MainHandler_113337(ILandroid/view/accessibility/IAccessibilityManagerClient;)V
+PLcom/android/server/accessibility/AccessibilityManagerService$MainHandler;->sendStateToClients(ILandroid/os/RemoteCallbackList;)V
+PLcom/android/server/accessibility/AccessibilityManagerService$SecurityPolicy;->-wrap3(Lcom/android/server/accessibility/AccessibilityManagerService$SecurityPolicy;I)I
+PLcom/android/server/accessibility/AccessibilityManagerService$SecurityPolicy;->-wrap4(Lcom/android/server/accessibility/AccessibilityManagerService$SecurityPolicy;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/accessibility/AccessibilityManagerService$SecurityPolicy;-><init>(Lcom/android/server/accessibility/AccessibilityManagerService;)V
+PLcom/android/server/accessibility/AccessibilityManagerService$SecurityPolicy;->enforceCallingPermission(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/accessibility/AccessibilityManagerService$SecurityPolicy;->hasPermission(Ljava/lang/String;)Z
+PLcom/android/server/accessibility/AccessibilityManagerService$SecurityPolicy;->isCallerInteractingAcrossUsers(I)Z
+PLcom/android/server/accessibility/AccessibilityManagerService$SecurityPolicy;->notifyWindowsChanged()V
+PLcom/android/server/accessibility/AccessibilityManagerService$SecurityPolicy;->resolveCallingUserIdEnforcingPermissionsLocked(I)I
+PLcom/android/server/accessibility/AccessibilityManagerService$SecurityPolicy;->resolveProfileParentLocked(I)I
+PLcom/android/server/accessibility/AccessibilityManagerService$UserState$1;-><init>(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService$UserState;->-get1(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)Lcom/android/server/accessibility/AccessibilityManagerService$Service;
+PLcom/android/server/accessibility/AccessibilityManagerService$UserState;-><init>(Lcom/android/server/accessibility/AccessibilityManagerService;I)V
+PLcom/android/server/accessibility/AccessibilityManagerService$UserState;->getClientState()I
+PLcom/android/server/accessibility/AccessibilityManagerService$UserState;->isHandlingAccessibilityEvents()Z
+PLcom/android/server/accessibility/AccessibilityManagerService$UserState;->isUiAutomationSuppressingOtherServices()Z
+PLcom/android/server/accessibility/AccessibilityManagerService$UserState;->onSwitchToAnotherUser()V
+PLcom/android/server/accessibility/AccessibilityManagerService;->-get0()I
+PLcom/android/server/accessibility/AccessibilityManagerService;->-get1(Lcom/android/server/accessibility/AccessibilityManagerService;)Landroid/content/Context;
+PLcom/android/server/accessibility/AccessibilityManagerService;->-get19(Lcom/android/server/accessibility/AccessibilityManagerService;)Lcom/android/server/accessibility/AccessibilityManagerService$WindowsForAccessibilityCallback;
+PLcom/android/server/accessibility/AccessibilityManagerService;->-get2(Lcom/android/server/accessibility/AccessibilityManagerService;)I
+PLcom/android/server/accessibility/AccessibilityManagerService;->-get4(Lcom/android/server/accessibility/AccessibilityManagerService;)Landroid/os/RemoteCallbackList;
+PLcom/android/server/accessibility/AccessibilityManagerService;->-get8(Lcom/android/server/accessibility/AccessibilityManagerService;)Ljava/lang/Object;
+PLcom/android/server/accessibility/AccessibilityManagerService;->-wrap12(Lcom/android/server/accessibility/AccessibilityManagerService;)Lcom/android/server/accessibility/AccessibilityManagerService$UserState;
+PLcom/android/server/accessibility/AccessibilityManagerService;->-wrap13(Lcom/android/server/accessibility/AccessibilityManagerService;I)Lcom/android/server/accessibility/AccessibilityManagerService$UserState;
+PLcom/android/server/accessibility/AccessibilityManagerService;->-wrap20(Lcom/android/server/accessibility/AccessibilityManagerService;Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->-wrap28(Lcom/android/server/accessibility/AccessibilityManagerService;I)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->-wrap29(Lcom/android/server/accessibility/AccessibilityManagerService;Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->-wrap30(Lcom/android/server/accessibility/AccessibilityManagerService;I)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->-wrap33(Lcom/android/server/accessibility/AccessibilityManagerService;Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->-wrap34(Lcom/android/server/accessibility/AccessibilityManagerService;Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->-wrap4(Lcom/android/server/accessibility/AccessibilityManagerService;Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)Z
+PLcom/android/server/accessibility/AccessibilityManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->addClient(Landroid/view/accessibility/IAccessibilityManagerClient;I)J
+PLcom/android/server/accessibility/AccessibilityManagerService;->broadcastToClients(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;Ljava/util/function/Consumer;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->getCurrentUserStateLocked()Lcom/android/server/accessibility/AccessibilityManagerService$UserState;
+PLcom/android/server/accessibility/AccessibilityManagerService;->getEnabledAccessibilityServiceList(II)Ljava/util/List;
+PLcom/android/server/accessibility/AccessibilityManagerService;->getInstalledAccessibilityServiceList(I)Ljava/util/List;
+PLcom/android/server/accessibility/AccessibilityManagerService;->getUserStateLocked(I)Lcom/android/server/accessibility/AccessibilityManagerService$UserState;
+PLcom/android/server/accessibility/AccessibilityManagerService;->lambda$-com_android_server_accessibility_AccessibilityManagerService_61351(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;I)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->lambda$-com_android_server_accessibility_AccessibilityManagerService_61405(ILandroid/view/accessibility/IAccessibilityManagerClient;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->onUserStateChangedLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->readAccessibilityButtonSettingsLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)Z
+PLcom/android/server/accessibility/AccessibilityManagerService;->readAccessibilityShortcutSettingLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)Z
+PLcom/android/server/accessibility/AccessibilityManagerService;->readAutoclickEnabledSettingLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)Z
+PLcom/android/server/accessibility/AccessibilityManagerService;->readComponentNamesFromSettingLocked(Ljava/lang/String;ILjava/util/Set;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->readComponentNamesFromStringLocked(Ljava/lang/String;Ljava/util/Set;Z)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->readConfigurationForUserStateLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)Z
+PLcom/android/server/accessibility/AccessibilityManagerService;->readEnabledAccessibilityServicesLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)Z
+PLcom/android/server/accessibility/AccessibilityManagerService;->readHighTextContrastEnabledSettingLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)Z
+PLcom/android/server/accessibility/AccessibilityManagerService;->readInstalledAccessibilityServiceLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)Z
+PLcom/android/server/accessibility/AccessibilityManagerService;->readMagnificationEnabledSettingsLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)Z
+PLcom/android/server/accessibility/AccessibilityManagerService;->readTouchExplorationEnabledSettingLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)Z
+PLcom/android/server/accessibility/AccessibilityManagerService;->readTouchExplorationGrantedAccessibilityServicesLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)Z
+PLcom/android/server/accessibility/AccessibilityManagerService;->registerBroadcastReceivers()V
+PLcom/android/server/accessibility/AccessibilityManagerService;->scheduleUpdateClientsIfNeededLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->scheduleUpdateFingerprintGestureHandling(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->scheduleUpdateInputFilter(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->setPictureInPictureActionReplacingConnection(Landroid/view/accessibility/IAccessibilityInteractionConnection;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->switchUser(I)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->unbindAllServicesLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->unlockUser(I)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->updateAccessibilityButtonTargets(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->updateAccessibilityEnabledSetting(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->updateAccessibilityFocusBehaviorLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->updateAccessibilityShortcutLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->updateDisplayDaltonizerLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->updateDisplayInversionLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->updateFilterKeyEventsLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->updateFingerprintGestureHandling(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->updateInputFilter(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->updateLegacyCapabilitiesLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->updateMagnificationLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->updatePerformGesturesLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->updateRelevantEventsLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->updateServicesLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->updateSoftKeyboardShowModeLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->updateTouchExplorationLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->updateWindowsForAccessibilityCallbackLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->userHasListeningMagnificationServicesLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)Z
+PLcom/android/server/accessibility/AccessibilityManagerService;->userHasMagnificationServicesLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)Z
+PLcom/android/server/accessibility/DisplayAdjustmentUtils;->applyDaltonizerSetting(Landroid/content/Context;I)V
+PLcom/android/server/accessibility/DisplayAdjustmentUtils;->applyInversionSetting(Landroid/content/Context;I)V
+PLcom/android/server/accounts/-$Lambda$JwXVQhqSYlVkCeKB5Nx7U6RsZlU;-><init>(Ljava/lang/Object;)V
+PLcom/android/server/accounts/AccountAuthenticatorCache$MySerializer;-><init>()V
+PLcom/android/server/accounts/AccountAuthenticatorCache$MySerializer;-><init>(Lcom/android/server/accounts/AccountAuthenticatorCache$MySerializer;)V
+PLcom/android/server/accounts/AccountAuthenticatorCache$MySerializer;->createFromXml(Lorg/xmlpull/v1/XmlPullParser;)Landroid/accounts/AuthenticatorDescription;
+PLcom/android/server/accounts/AccountAuthenticatorCache$MySerializer;->createFromXml(Lorg/xmlpull/v1/XmlPullParser;)Ljava/lang/Object;
+PLcom/android/server/accounts/AccountAuthenticatorCache;-><init>(Landroid/content/Context;)V
+PLcom/android/server/accounts/AccountAuthenticatorCache;->getServiceInfo(Landroid/accounts/AuthenticatorDescription;I)Landroid/content/pm/RegisteredServicesCache$ServiceInfo;
+PLcom/android/server/accounts/AccountAuthenticatorCache;->parseServiceAttributes(Landroid/content/res/Resources;Ljava/lang/String;Landroid/util/AttributeSet;)Landroid/accounts/AuthenticatorDescription;
+PLcom/android/server/accounts/AccountAuthenticatorCache;->parseServiceAttributes(Landroid/content/res/Resources;Ljava/lang/String;Landroid/util/AttributeSet;)Ljava/lang/Object;
+PLcom/android/server/accounts/AccountManagerService$1;-><init>(Lcom/android/server/accounts/AccountManagerService;)V
+PLcom/android/server/accounts/AccountManagerService$2;-><init>(Lcom/android/server/accounts/AccountManagerService;)V
+PLcom/android/server/accounts/AccountManagerService$2;->onPackageAdded(Ljava/lang/String;I)V
+PLcom/android/server/accounts/AccountManagerService$3;-><init>(Lcom/android/server/accounts/AccountManagerService;)V
+PLcom/android/server/accounts/AccountManagerService$7;-><init>(Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/IAccountManagerResponse;Ljava/lang/String;ZZLjava/lang/String;ZLandroid/os/Bundle;Landroid/accounts/Account;Ljava/lang/String;ZZIZLjava/lang/String;[BLcom/android/server/accounts/AccountManagerService$UserAccounts;)V
+PLcom/android/server/accounts/AccountManagerService$7;->onResult(Landroid/os/Bundle;)V
+PLcom/android/server/accounts/AccountManagerService$7;->run()V
+PLcom/android/server/accounts/AccountManagerService$AccountManagerInternalImpl;-><init>(Lcom/android/server/accounts/AccountManagerService;)V
+PLcom/android/server/accounts/AccountManagerService$AccountManagerInternalImpl;-><init>(Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService$AccountManagerInternalImpl;)V
+PLcom/android/server/accounts/AccountManagerService$AccountManagerInternalImpl;->addOnAppPermissionChangeListener(Landroid/accounts/AccountManagerInternal$OnAppPermissionChangeListener;)V
+PLcom/android/server/accounts/AccountManagerService$GetAccountsByTypeAndFeatureSession;-><init>(Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/IAccountManagerResponse;Ljava/lang/String;[Ljava/lang/String;ILjava/lang/String;Z)V
+PLcom/android/server/accounts/AccountManagerService$GetAccountsByTypeAndFeatureSession;->checkAccount()V
+PLcom/android/server/accounts/AccountManagerService$GetAccountsByTypeAndFeatureSession;->onResult(Landroid/os/Bundle;)V
+PLcom/android/server/accounts/AccountManagerService$GetAccountsByTypeAndFeatureSession;->run()V
+PLcom/android/server/accounts/AccountManagerService$GetAccountsByTypeAndFeatureSession;->sendResult()V
+PLcom/android/server/accounts/AccountManagerService$Injector;-><init>(Landroid/content/Context;)V
+PLcom/android/server/accounts/AccountManagerService$Injector;->addLocalService(Landroid/accounts/AccountManagerInternal;)V
+PLcom/android/server/accounts/AccountManagerService$Injector;->getAccountAuthenticatorCache()Lcom/android/server/accounts/IAccountAuthenticatorCache;
+PLcom/android/server/accounts/AccountManagerService$Injector;->getCeDatabaseName(I)Ljava/lang/String;
+PLcom/android/server/accounts/AccountManagerService$Injector;->getContext()Landroid/content/Context;
+PLcom/android/server/accounts/AccountManagerService$Injector;->getDeDatabaseName(I)Ljava/lang/String;
+PLcom/android/server/accounts/AccountManagerService$Injector;->getMessageHandlerLooper()Landroid/os/Looper;
+PLcom/android/server/accounts/AccountManagerService$Injector;->getNotificationManager()Landroid/app/INotificationManager;
+PLcom/android/server/accounts/AccountManagerService$Injector;->getPreNDatabaseName(I)Ljava/lang/String;
+PLcom/android/server/accounts/AccountManagerService$Lifecycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/accounts/AccountManagerService$Lifecycle;->onStart()V
+PLcom/android/server/accounts/AccountManagerService$Lifecycle;->onUnlockUser(I)V
+PLcom/android/server/accounts/AccountManagerService$MessageHandler;-><init>(Lcom/android/server/accounts/AccountManagerService;Landroid/os/Looper;)V
+PLcom/android/server/accounts/AccountManagerService$NotificationId;->-get0(Lcom/android/server/accounts/AccountManagerService$NotificationId;)I
+PLcom/android/server/accounts/AccountManagerService$NotificationId;-><init>(Ljava/lang/String;I)V
+PLcom/android/server/accounts/AccountManagerService$Session;-><init>(Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/IAccountManagerResponse;Ljava/lang/String;ZZLjava/lang/String;Z)V
+PLcom/android/server/accounts/AccountManagerService$Session;-><init>(Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/IAccountManagerResponse;Ljava/lang/String;ZZLjava/lang/String;ZZ)V
+PLcom/android/server/accounts/AccountManagerService$Session;->bind()V
+PLcom/android/server/accounts/AccountManagerService$Session;->bindToAuthenticator(Ljava/lang/String;)Z
+PLcom/android/server/accounts/AccountManagerService$Session;->cancelTimeout()V
+PLcom/android/server/accounts/AccountManagerService$Session;->close()V
+PLcom/android/server/accounts/AccountManagerService$Session;->getResponseAndClose()Landroid/accounts/IAccountManagerResponse;
+PLcom/android/server/accounts/AccountManagerService$Session;->onResult(Landroid/os/Bundle;)V
+PLcom/android/server/accounts/AccountManagerService$Session;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/accounts/AccountManagerService$Session;->unbind()V
+PLcom/android/server/accounts/AccountManagerService$TestFeaturesSession;-><init>(Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/IAccountManagerResponse;Landroid/accounts/Account;[Ljava/lang/String;)V
+PLcom/android/server/accounts/AccountManagerService$TestFeaturesSession;->onResult(Landroid/os/Bundle;)V
+PLcom/android/server/accounts/AccountManagerService$TestFeaturesSession;->run()V
+PLcom/android/server/accounts/AccountManagerService$UserAccounts;->-get0(Lcom/android/server/accounts/AccountManagerService$UserAccounts;)Lcom/android/server/accounts/TokenCache;
+PLcom/android/server/accounts/AccountManagerService$UserAccounts;->-get1(Lcom/android/server/accounts/AccountManagerService$UserAccounts;)Ljava/util/Map;
+PLcom/android/server/accounts/AccountManagerService$UserAccounts;->-get10(Lcom/android/server/accounts/AccountManagerService$UserAccounts;)Ljava/util/Map;
+PLcom/android/server/accounts/AccountManagerService$UserAccounts;->-get4(Lcom/android/server/accounts/AccountManagerService$UserAccounts;)Ljava/util/Map;
+PLcom/android/server/accounts/AccountManagerService$UserAccounts;->-get6(Lcom/android/server/accounts/AccountManagerService$UserAccounts;)Ljava/util/HashMap;
+PLcom/android/server/accounts/AccountManagerService$UserAccounts;->-get8(Lcom/android/server/accounts/AccountManagerService$UserAccounts;)Ljava/util/Map;
+PLcom/android/server/accounts/AccountManagerService$UserAccounts;->-get9(Lcom/android/server/accounts/AccountManagerService$UserAccounts;)I
+PLcom/android/server/accounts/AccountManagerService$UserAccounts;->-set0(Lcom/android/server/accounts/AccountManagerService$UserAccounts;I)I
+PLcom/android/server/accounts/AccountManagerService$UserAccounts;->-set1(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/database/sqlite/SQLiteStatement;)Landroid/database/sqlite/SQLiteStatement;
+PLcom/android/server/accounts/AccountManagerService$UserAccounts;-><init>(Landroid/content/Context;ILjava/io/File;Ljava/io/File;)V
+PLcom/android/server/accounts/AccountManagerService;->-get1(Lcom/android/server/accounts/AccountManagerService;)Ljava/util/concurrent/CopyOnWriteArrayList;
+PLcom/android/server/accounts/AccountManagerService;->-get2(Lcom/android/server/accounts/AccountManagerService;)Lcom/android/server/accounts/IAccountAuthenticatorCache;
+PLcom/android/server/accounts/AccountManagerService;->-get5(Lcom/android/server/accounts/AccountManagerService;)Ljava/util/LinkedHashMap;
+PLcom/android/server/accounts/AccountManagerService;->-wrap11(Lcom/android/server/accounts/AccountManagerService;IZ)V
+PLcom/android/server/accounts/AccountManagerService;->-wrap13(Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService$NotificationId;Landroid/os/UserHandle;)V
+PLcom/android/server/accounts/AccountManagerService;->-wrap21(Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;Ljava/lang/String;[BLjava/lang/String;Ljava/lang/String;J)V
+PLcom/android/server/accounts/AccountManagerService;->-wrap4(Lcom/android/server/accounts/AccountManagerService;I)Z
+PLcom/android/server/accounts/AccountManagerService;->-wrap9(Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;)Lcom/android/server/accounts/AccountManagerService$NotificationId;
+PLcom/android/server/accounts/AccountManagerService;-><init>(Lcom/android/server/accounts/AccountManagerService$Injector;)V
+PLcom/android/server/accounts/AccountManagerService;->accountExistsCache(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;)Z
+PLcom/android/server/accounts/AccountManagerService;->accountTypeManagesContacts(Ljava/lang/String;I)Z
+PLcom/android/server/accounts/AccountManagerService;->calculatePackageSignatureDigest(Ljava/lang/String;)[B
+PLcom/android/server/accounts/AccountManagerService;->cancelAccountAccessRequestNotificationIfNeeded(IZ)V
+PLcom/android/server/accounts/AccountManagerService;->cancelAccountAccessRequestNotificationIfNeeded(Landroid/accounts/Account;ILjava/lang/String;Z)V
+PLcom/android/server/accounts/AccountManagerService;->cancelAccountAccessRequestNotificationIfNeeded(Landroid/accounts/Account;IZ)V
+PLcom/android/server/accounts/AccountManagerService;->cancelNotification(Lcom/android/server/accounts/AccountManagerService$NotificationId;Landroid/os/UserHandle;)V
+PLcom/android/server/accounts/AccountManagerService;->cancelNotification(Lcom/android/server/accounts/AccountManagerService$NotificationId;Ljava/lang/String;Landroid/os/UserHandle;)V
+PLcom/android/server/accounts/AccountManagerService;->checkGetAccountsPermission(Ljava/lang/String;II)Z
+PLcom/android/server/accounts/AccountManagerService;->checkReadAccountsPermitted(ILjava/lang/String;ILjava/lang/String;)V
+PLcom/android/server/accounts/AccountManagerService;->checkReadContactsPermission(Ljava/lang/String;II)Z
+PLcom/android/server/accounts/AccountManagerService;->filterSharedAccounts(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Ljava/util/Map;ILjava/lang/String;)Ljava/util/Map;
+PLcom/android/server/accounts/AccountManagerService;->getAccountVisibilityFromCache(Landroid/accounts/Account;Ljava/lang/String;Lcom/android/server/accounts/AccountManagerService$UserAccounts;)I
+PLcom/android/server/accounts/AccountManagerService;->getAccounts(ILjava/lang/String;)[Landroid/accounts/Account;
+PLcom/android/server/accounts/AccountManagerService;->getAccounts(Ljava/lang/String;Ljava/lang/String;)[Landroid/accounts/Account;
+PLcom/android/server/accounts/AccountManagerService;->getAccounts([I)[Landroid/accounts/AccountAndUser;
+PLcom/android/server/accounts/AccountManagerService;->getAccountsAsUser(Ljava/lang/String;ILjava/lang/String;)[Landroid/accounts/Account;
+PLcom/android/server/accounts/AccountManagerService;->getAccountsByFeatures(Landroid/accounts/IAccountManagerResponse;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/accounts/AccountManagerService;->getAccountsByTypeForPackage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)[Landroid/accounts/Account;
+PLcom/android/server/accounts/AccountManagerService;->getAllAccounts()[Landroid/accounts/AccountAndUser;
+PLcom/android/server/accounts/AccountManagerService;->getAuthToken(Landroid/accounts/IAccountManagerResponse;Landroid/accounts/Account;Ljava/lang/String;ZZLandroid/os/Bundle;)V
+PLcom/android/server/accounts/AccountManagerService;->getAuthenticatorTypeAndUIDForUser(Lcom/android/server/accounts/IAccountAuthenticatorCache;I)Ljava/util/HashMap;
+PLcom/android/server/accounts/AccountManagerService;->getPackageNameForUid(I)Ljava/lang/String;
+PLcom/android/server/accounts/AccountManagerService;->getPackagesAndVisibilityForAccountLocked(Landroid/accounts/Account;Lcom/android/server/accounts/AccountManagerService$UserAccounts;)Ljava/util/Map;
+PLcom/android/server/accounts/AccountManagerService;->getPassword(Landroid/accounts/Account;)Ljava/lang/String;
+PLcom/android/server/accounts/AccountManagerService;->getRunningAccounts()[Landroid/accounts/AccountAndUser;
+PLcom/android/server/accounts/AccountManagerService;->getSigninRequiredNotificationId(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;)Lcom/android/server/accounts/AccountManagerService$NotificationId;
+PLcom/android/server/accounts/AccountManagerService;->getSingleton()Lcom/android/server/accounts/AccountManagerService;
+PLcom/android/server/accounts/AccountManagerService;->getTypesManagedByCaller(II)Ljava/util/List;
+PLcom/android/server/accounts/AccountManagerService;->getTypesVisibleToCaller(IILjava/lang/String;)Ljava/util/List;
+PLcom/android/server/accounts/AccountManagerService;->getUidsOfInstalledOrUpdatedPackagesAsUser(I)Landroid/util/SparseBooleanArray;
+PLcom/android/server/accounts/AccountManagerService;->getUserAccounts(I)Lcom/android/server/accounts/AccountManagerService$UserAccounts;
+PLcom/android/server/accounts/AccountManagerService;->getUserManager()Landroid/os/UserManager;
+PLcom/android/server/accounts/AccountManagerService;->hasAccountAccess(Landroid/accounts/Account;Ljava/lang/String;I)Z
+PLcom/android/server/accounts/AccountManagerService;->hasAccountAccess(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/UserHandle;)Z
+PLcom/android/server/accounts/AccountManagerService;->hasExplicitlyGrantedPermission(Landroid/accounts/Account;Ljava/lang/String;I)Z
+PLcom/android/server/accounts/AccountManagerService;->hasFeatures(Landroid/accounts/IAccountManagerResponse;Landroid/accounts/Account;[Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/accounts/AccountManagerService;->initializeDebugDbSizeAndCompileSqlStatementForLogging(Lcom/android/server/accounts/AccountManagerService$UserAccounts;)V
+PLcom/android/server/accounts/AccountManagerService;->invalidateAuthToken(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/accounts/AccountManagerService;->invalidateAuthTokenLocked(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Ljava/lang/String;Ljava/lang/String;)Ljava/util/List;
+PLcom/android/server/accounts/AccountManagerService;->isAccountManagedByCaller(Ljava/lang/String;II)Z
+PLcom/android/server/accounts/AccountManagerService;->isAccountVisibleToCaller(Ljava/lang/String;IILjava/lang/String;)Z
+PLcom/android/server/accounts/AccountManagerService;->isLocalUnlockedUser(I)Z
+PLcom/android/server/accounts/AccountManagerService;->isPrivileged(I)Z
+PLcom/android/server/accounts/AccountManagerService;->isProfileOwner(I)Z
+PLcom/android/server/accounts/AccountManagerService;->onAccountAccessed(Ljava/lang/String;)V
+PLcom/android/server/accounts/AccountManagerService;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+PLcom/android/server/accounts/AccountManagerService;->onUnlockUser(I)V
+PLcom/android/server/accounts/AccountManagerService;->peekAuthToken(Landroid/accounts/Account;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/accounts/AccountManagerService;->permissionIsGranted(Landroid/accounts/Account;Ljava/lang/String;II)Z
+PLcom/android/server/accounts/AccountManagerService;->purgeOldGrants(Lcom/android/server/accounts/AccountManagerService$UserAccounts;)V
+PLcom/android/server/accounts/AccountManagerService;->readAuthTokenInternal(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/accounts/AccountManagerService;->readCachedTokenInternal(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;[B)Ljava/lang/String;
+PLcom/android/server/accounts/AccountManagerService;->readPasswordInternal(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;)Ljava/lang/String;
+PLcom/android/server/accounts/AccountManagerService;->readUserDataInternal(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/accounts/AccountManagerService;->registerAccountListener([Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/accounts/AccountManagerService;->registerAccountListener([Ljava/lang/String;Ljava/lang/String;Lcom/android/server/accounts/AccountManagerService$UserAccounts;)V
+PLcom/android/server/accounts/AccountManagerService;->saveAuthTokenToDatabase(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;)Z
+PLcom/android/server/accounts/AccountManagerService;->saveCachedToken(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;Ljava/lang/String;[BLjava/lang/String;Ljava/lang/String;J)V
+PLcom/android/server/accounts/AccountManagerService;->setAuthToken(Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/accounts/AccountManagerService;->setUserData(Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/accounts/AccountManagerService;->setUserdataInternal(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/accounts/AccountManagerService;->syncDeCeAccountsLocked(Lcom/android/server/accounts/AccountManagerService$UserAccounts;)V
+PLcom/android/server/accounts/AccountManagerService;->validateAccounts(I)V
+PLcom/android/server/accounts/AccountManagerService;->validateAccountsInternal(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Z)V
+PLcom/android/server/accounts/AccountManagerService;->writeAuthTokenIntoCacheLocked(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/accounts/AccountManagerService;->writeUserDataIntoCacheLocked(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/accounts/AccountsDb$CeDatabaseHelper;-><init>(Landroid/content/Context;Ljava/lang/String;)V
+PLcom/android/server/accounts/AccountsDb$CeDatabaseHelper;->create(Landroid/content/Context;Ljava/io/File;Ljava/io/File;)Lcom/android/server/accounts/AccountsDb$CeDatabaseHelper;
+PLcom/android/server/accounts/AccountsDb$CeDatabaseHelper;->onOpen(Landroid/database/sqlite/SQLiteDatabase;)V
+PLcom/android/server/accounts/AccountsDb$DeDatabaseHelper;->-get0(Lcom/android/server/accounts/AccountsDb$DeDatabaseHelper;)Z
+PLcom/android/server/accounts/AccountsDb$DeDatabaseHelper;->-set0(Lcom/android/server/accounts/AccountsDb$DeDatabaseHelper;Z)Z
+PLcom/android/server/accounts/AccountsDb$DeDatabaseHelper;-><init>(Landroid/content/Context;ILjava/lang/String;)V
+PLcom/android/server/accounts/AccountsDb$DeDatabaseHelper;-><init>(Landroid/content/Context;ILjava/lang/String;Lcom/android/server/accounts/AccountsDb$DeDatabaseHelper;)V
+PLcom/android/server/accounts/AccountsDb$DeDatabaseHelper;->getReadableDatabaseUserIsUnlocked()Landroid/database/sqlite/SQLiteDatabase;
+PLcom/android/server/accounts/AccountsDb$DeDatabaseHelper;->getWritableDatabaseUserIsUnlocked()Landroid/database/sqlite/SQLiteDatabase;
+PLcom/android/server/accounts/AccountsDb$DeDatabaseHelper;->onOpen(Landroid/database/sqlite/SQLiteDatabase;)V
+PLcom/android/server/accounts/AccountsDb;-><init>(Lcom/android/server/accounts/AccountsDb$DeDatabaseHelper;Landroid/content/Context;Ljava/io/File;)V
+PLcom/android/server/accounts/AccountsDb;->attachCeDatabase(Ljava/io/File;)V
+PLcom/android/server/accounts/AccountsDb;->beginTransaction()V
+PLcom/android/server/accounts/AccountsDb;->calculateDebugTableInsertionPoint()I
+PLcom/android/server/accounts/AccountsDb;->compileSqlStatementForLogging()Landroid/database/sqlite/SQLiteStatement;
+PLcom/android/server/accounts/AccountsDb;->create(Landroid/content/Context;ILjava/io/File;Ljava/io/File;)Lcom/android/server/accounts/AccountsDb;
+PLcom/android/server/accounts/AccountsDb;->deleteAuthToken(Ljava/lang/String;)Z
+PLcom/android/server/accounts/AccountsDb;->deleteAuthtokensByAccountIdAndType(JLjava/lang/String;)Z
+PLcom/android/server/accounts/AccountsDb;->endTransaction()V
+PLcom/android/server/accounts/AccountsDb;->findAccountPasswordByNameAndType(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/accounts/AccountsDb;->findAllDeAccounts()Ljava/util/Map;
+PLcom/android/server/accounts/AccountsDb;->findAllUidGrants()Ljava/util/List;
+PLcom/android/server/accounts/AccountsDb;->findAllVisibilityValues()Ljava/util/Map;
+PLcom/android/server/accounts/AccountsDb;->findAuthTokensByAccount(Landroid/accounts/Account;)Ljava/util/Map;
+PLcom/android/server/accounts/AccountsDb;->findAuthtokenForAllAccounts(Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;
+PLcom/android/server/accounts/AccountsDb;->findCeAccountsNotInDe()Ljava/util/List;
+PLcom/android/server/accounts/AccountsDb;->findDeAccountId(Landroid/accounts/Account;)J
+PLcom/android/server/accounts/AccountsDb;->findExtrasIdByAccountId(JLjava/lang/String;)J
+PLcom/android/server/accounts/AccountsDb;->findMatchingGrantsCountAnyToken(ILandroid/accounts/Account;)J
+PLcom/android/server/accounts/AccountsDb;->findMetaAuthUid()Ljava/util/Map;
+PLcom/android/server/accounts/AccountsDb;->findUserExtrasForAccount(Landroid/accounts/Account;)Ljava/util/Map;
+PLcom/android/server/accounts/AccountsDb;->insertAuthToken(JLjava/lang/String;Ljava/lang/String;)J
+PLcom/android/server/accounts/AccountsDb;->isCeDatabaseAttached()Z
+PLcom/android/server/accounts/AccountsDb;->setTransactionSuccessful()V
+PLcom/android/server/accounts/AccountsDb;->updateExtra(JLjava/lang/String;)Z
+PLcom/android/server/accounts/TokenCache$Key;-><init>(Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;[B)V
+PLcom/android/server/accounts/TokenCache$Key;->hashCode()I
+PLcom/android/server/accounts/TokenCache$TokenLruCache$Evictor;-><init>(Lcom/android/server/accounts/TokenCache$TokenLruCache;)V
+PLcom/android/server/accounts/TokenCache$TokenLruCache$Evictor;->add(Lcom/android/server/accounts/TokenCache$Key;)V
+PLcom/android/server/accounts/TokenCache$TokenLruCache;-><init>()V
+PLcom/android/server/accounts/TokenCache$TokenLruCache;->evict(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/accounts/TokenCache$TokenLruCache;->putToken(Lcom/android/server/accounts/TokenCache$Key;Lcom/android/server/accounts/TokenCache$Value;)V
+PLcom/android/server/accounts/TokenCache$TokenLruCache;->sizeOf(Lcom/android/server/accounts/TokenCache$Key;Lcom/android/server/accounts/TokenCache$Value;)I
+PLcom/android/server/accounts/TokenCache$TokenLruCache;->sizeOf(Ljava/lang/Object;Ljava/lang/Object;)I
+PLcom/android/server/accounts/TokenCache$Value;-><init>(Ljava/lang/String;J)V
+PLcom/android/server/accounts/TokenCache;-><init>()V
+PLcom/android/server/accounts/TokenCache;->get(Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;[B)Ljava/lang/String;
+PLcom/android/server/accounts/TokenCache;->put(Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[BJ)V
+PLcom/android/server/accounts/TokenCache;->remove(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/am/-$Lambda$-Oweh9FamEB8lkqsrsDtt1mh9YE;->$m$1()V
+PLcom/android/server/am/-$Lambda$-Oweh9FamEB8lkqsrsDtt1mh9YE;-><init>(BIIIIIIIILjava/lang/Object;)V
+PLcom/android/server/am/-$Lambda$-Oweh9FamEB8lkqsrsDtt1mh9YE;->run()V
+PLcom/android/server/am/-$Lambda$FqYE94sGA9-gF3KGIicLxzMb89s;->$m$0(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
+PLcom/android/server/am/-$Lambda$FqYE94sGA9-gF3KGIicLxzMb89s;->$m$1(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
+PLcom/android/server/am/-$Lambda$FqYE94sGA9-gF3KGIicLxzMb89s;->$m$10(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
+PLcom/android/server/am/-$Lambda$FqYE94sGA9-gF3KGIicLxzMb89s;->$m$11(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
+PLcom/android/server/am/-$Lambda$FqYE94sGA9-gF3KGIicLxzMb89s;->$m$12(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
+PLcom/android/server/am/-$Lambda$FqYE94sGA9-gF3KGIicLxzMb89s;->$m$13(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
+PLcom/android/server/am/-$Lambda$FqYE94sGA9-gF3KGIicLxzMb89s;->$m$8(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
+PLcom/android/server/am/-$Lambda$FqYE94sGA9-gF3KGIicLxzMb89s;->$m$9(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
+PLcom/android/server/am/-$Lambda$FqYE94sGA9-gF3KGIicLxzMb89s;->accept(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
+PLcom/android/server/am/-$Lambda$njIALZ9XLXuT-vhmazyQkVX7Z0U;->$m$0(Lcom/android/internal/os/ProcessCpuTracker$Stats;)Z
+PLcom/android/server/am/-$Lambda$njIALZ9XLXuT-vhmazyQkVX7Z0U;-><init>(B)V
+PLcom/android/server/am/-$Lambda$njIALZ9XLXuT-vhmazyQkVX7Z0U;->needed(Lcom/android/internal/os/ProcessCpuTracker$Stats;)Z
+PLcom/android/server/am/ActiveServices$ActiveForegroundApp;-><init>()V
+PLcom/android/server/am/ActiveServices$ServiceLookupResult;-><init>(Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ServiceRecord;Ljava/lang/String;)V
+PLcom/android/server/am/ActiveServices$ServiceMap;-><init>(Lcom/android/server/am/ActiveServices;Landroid/os/Looper;I)V
+PLcom/android/server/am/ActiveServices$ServiceMap;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/am/ActiveServices$ServiceMap;->rescheduleDelayedStartsLocked()V
+PLcom/android/server/am/ActiveServices$ServiceRestarter;-><init>(Lcom/android/server/am/ActiveServices;)V
+PLcom/android/server/am/ActiveServices$ServiceRestarter;-><init>(Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices$ServiceRestarter;)V
+PLcom/android/server/am/ActiveServices$ServiceRestarter;->run()V
+PLcom/android/server/am/ActiveServices$ServiceRestarter;->setService(Lcom/android/server/am/ServiceRecord;)V
+PLcom/android/server/am/ActiveServices;->-get0()Ljava/lang/String;
+PLcom/android/server/am/ActiveServices;->attachApplicationLocked(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;)Z
+PLcom/android/server/am/ActiveServices;->bringDownDisabledPackageServicesLocked(Ljava/lang/String;Ljava/util/Set;IZZZ)Z
+PLcom/android/server/am/ActiveServices;->bringDownServiceIfNeededLocked(Lcom/android/server/am/ServiceRecord;ZZ)V
+PLcom/android/server/am/ActiveServices;->cancelForegroundNotificationLocked(Lcom/android/server/am/ServiceRecord;)V
+PLcom/android/server/am/ActiveServices;->cleanUpRemovedTaskLocked(Lcom/android/server/am/TaskRecord;Landroid/content/ComponentName;Landroid/content/Intent;)V
+PLcom/android/server/am/ActiveServices;->clearRestartingIfNeededLocked(Lcom/android/server/am/ServiceRecord;)V
+PLcom/android/server/am/ActiveServices;->collectPackageServicesLocked(Ljava/lang/String;Ljava/util/Set;ZZZLandroid/util/ArrayMap;)Z
+PLcom/android/server/am/ActiveServices;->decActiveForegroundAppLocked(Lcom/android/server/am/ActiveServices$ServiceMap;Lcom/android/server/am/ServiceRecord;)V
+PLcom/android/server/am/ActiveServices;->findServiceLocked(Landroid/content/ComponentName;Landroid/os/IBinder;I)Lcom/android/server/am/ServiceRecord;
+PLcom/android/server/am/ActiveServices;->forceStopPackageLocked(Ljava/lang/String;I)V
+PLcom/android/server/am/ActiveServices;->foregroundServiceProcStateChangedLocked(Lcom/android/server/am/UidRecord;)V
+PLcom/android/server/am/ActiveServices;->getRunningServiceInfoLocked(IIIZZ)Ljava/util/List;
+PLcom/android/server/am/ActiveServices;->getServiceByNameLocked(Landroid/content/ComponentName;I)Lcom/android/server/am/ServiceRecord;
+PLcom/android/server/am/ActiveServices;->getServicesLocked(I)Landroid/util/ArrayMap;
+PLcom/android/server/am/ActiveServices;->hasBackgroundServicesLocked(I)Z
+PLcom/android/server/am/ActiveServices;->isServiceNeededLocked(Lcom/android/server/am/ServiceRecord;ZZ)Z
+PLcom/android/server/am/ActiveServices;->killServicesLocked(Lcom/android/server/am/ProcessRecord;Z)V
+PLcom/android/server/am/ActiveServices;->makeRunningServiceInfoLocked(Lcom/android/server/am/ServiceRecord;)Landroid/app/ActivityManager$RunningServiceInfo;
+PLcom/android/server/am/ActiveServices;->performServiceRestartLocked(Lcom/android/server/am/ServiceRecord;)V
+PLcom/android/server/am/ActiveServices;->requestServiceBindingLocked(Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/IntentBindRecord;ZZ)Z
+PLcom/android/server/am/ActiveServices;->requestServiceBindingsLocked(Lcom/android/server/am/ServiceRecord;Z)V
+PLcom/android/server/am/ActiveServices;->requestUpdateActiveForegroundAppsLocked(Lcom/android/server/am/ActiveServices$ServiceMap;J)V
+PLcom/android/server/am/ActiveServices;->scheduleServiceRestartLocked(Lcom/android/server/am/ServiceRecord;Z)Z
+PLcom/android/server/am/ActiveServices;->setServiceForegroundInnerLocked(Lcom/android/server/am/ServiceRecord;ILandroid/app/Notification;I)V
+PLcom/android/server/am/ActiveServices;->setServiceForegroundLocked(Landroid/content/ComponentName;Landroid/os/IBinder;ILandroid/app/Notification;I)V
+PLcom/android/server/am/ActiveServices;->stopInBackgroundLocked(I)V
+PLcom/android/server/am/ActiveServices;->stopServiceLocked(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;I)I
+PLcom/android/server/am/ActiveServices;->stopServiceLocked(Lcom/android/server/am/ServiceRecord;)V
+PLcom/android/server/am/ActiveServices;->unbindFinishedLocked(Lcom/android/server/am/ServiceRecord;Landroid/content/Intent;Z)V
+PLcom/android/server/am/ActiveServices;->unscheduleServiceRestartLocked(Lcom/android/server/am/ServiceRecord;IZ)Z
+PLcom/android/server/am/ActiveServices;->updateForegroundApps(Lcom/android/server/am/ActiveServices$ServiceMap;)V
+PLcom/android/server/am/ActiveServices;->updateScreenStateLocked(Z)V
+PLcom/android/server/am/ActiveServices;->updateServiceConnectionActivitiesLocked(Lcom/android/server/am/ProcessRecord;)V
+PLcom/android/server/am/ActiveServices;->updateWhitelistManagerLocked(Lcom/android/server/am/ProcessRecord;)V
+PLcom/android/server/am/ActivityManagerConstants;->start(Landroid/content/ContentResolver;)V
+PLcom/android/server/am/ActivityManagerConstants;->updateConstants()V
+PLcom/android/server/am/ActivityManagerService$10;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/am/ActivityManagerService$10;->performReceive(Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;ZZI)V
+PLcom/android/server/am/ActivityManagerService$18;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/am/ActivityManagerService$18;->performReceive(Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;ZZI)V
+PLcom/android/server/am/ActivityManagerService$19;-><init>(Lcom/android/server/am/ActivityManagerService;Ljava/lang/String;Ljava/lang/StringBuilder;Landroid/os/DropBoxManager;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService$19;->run()V
+PLcom/android/server/am/ActivityManagerService$1;->allowFilterResult(Landroid/content/IntentFilter;Ljava/util/List;)Z
+PLcom/android/server/am/ActivityManagerService$1;->newArray(I)[Landroid/content/IntentFilter;
+PLcom/android/server/am/ActivityManagerService$1;->newArray(I)[Lcom/android/server/am/BroadcastFilter;
+PLcom/android/server/am/ActivityManagerService$1;->newResult(Landroid/content/IntentFilter;II)Ljava/lang/Object;
+PLcom/android/server/am/ActivityManagerService$1;->newResult(Lcom/android/server/am/BroadcastFilter;II)Lcom/android/server/am/BroadcastFilter;
+PLcom/android/server/am/ActivityManagerService$20;-><init>(Lcom/android/server/am/ActivityManagerService;Ljava/lang/String;Landroid/os/DropBoxManager;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService$20;->run()V
+PLcom/android/server/am/ActivityManagerService$21;-><init>(Lcom/android/server/am/ActivityManagerService;IILandroid/os/IBinder;Ljava/lang/String;Landroid/app/ApplicationErrorReport$ParcelableCrashInfo;)V
+PLcom/android/server/am/ActivityManagerService$21;->run()V
+PLcom/android/server/am/ActivityManagerService$22;-><init>(Lcom/android/server/am/ActivityManagerService;Ljava/lang/String;Ljava/lang/String;Ljava/lang/StringBuilder;Ljava/lang/String;Ljava/io/File;Landroid/app/ApplicationErrorReport$CrashInfo;Landroid/os/DropBoxManager;)V
+PLcom/android/server/am/ActivityManagerService$22;->run()V
+PLcom/android/server/am/ActivityManagerService$2;->lambda$-com_android_server_am_ActivityManagerService$2_103032(Lcom/android/internal/os/ProcessCpuTracker$Stats;)Z
+PLcom/android/server/am/ActivityManagerService$8;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/am/ActivityManagerService$9;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/am/ActivityManagerService$AppDeathRecipient;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ProcessRecord;ILandroid/app/IApplicationThread;)V
+PLcom/android/server/am/ActivityManagerService$AppDeathRecipient;->binderDied()V
+PLcom/android/server/am/ActivityManagerService$AppTaskImpl;-><init>(Lcom/android/server/am/ActivityManagerService;II)V
+PLcom/android/server/am/ActivityManagerService$AppTaskImpl;->checkCaller()V
+PLcom/android/server/am/ActivityManagerService$AppTaskImpl;->getTaskInfo()Landroid/app/ActivityManager$RecentTaskInfo;
+PLcom/android/server/am/ActivityManagerService$AppTaskImpl;->setExcludeFromRecents(Z)V
+PLcom/android/server/am/ActivityManagerService$CpuBinder;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/am/ActivityManagerService$DbBinder;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/am/ActivityManagerService$FontScaleSettingObserver;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/am/ActivityManagerService$GrantUri;-><init>(ILandroid/net/Uri;Z)V
+PLcom/android/server/am/ActivityManagerService$GrantUri;->hashCode()I
+PLcom/android/server/am/ActivityManagerService$GrantUri;->resolve(ILandroid/net/Uri;)Lcom/android/server/am/ActivityManagerService$GrantUri;
+PLcom/android/server/am/ActivityManagerService$GraphicsBinder;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/am/ActivityManagerService$KillHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/am/ActivityManagerService$LocalService;->checkContentProviderAccess(Ljava/lang/String;I)Ljava/lang/String;
+PLcom/android/server/am/ActivityManagerService$LocalService;->getUidProcessState(I)I
+PLcom/android/server/am/ActivityManagerService$LocalService;->isSystemReady()Z
+PLcom/android/server/am/ActivityManagerService$LocalService;->notifyAppTransitionCancelled()V
+PLcom/android/server/am/ActivityManagerService$LocalService;->notifyAppTransitionFinished()V
+PLcom/android/server/am/ActivityManagerService$LocalService;->notifyAppTransitionStarting(Landroid/util/SparseIntArray;)V
+PLcom/android/server/am/ActivityManagerService$LocalService;->notifyDockedStackMinimizedChanged(Z)V
+PLcom/android/server/am/ActivityManagerService$LocalService;->notifyKeyguardFlagsChanged(Ljava/lang/Runnable;)V
+PLcom/android/server/am/ActivityManagerService$LocalService;->notifyKeyguardTrustedChanged()V
+PLcom/android/server/am/ActivityManagerService$LocalService;->notifyNetworkPolicyRulesUpdated(IJ)V
+PLcom/android/server/am/ActivityManagerService$LocalService;->setDeviceIdleWhitelist([I)V
+PLcom/android/server/am/ActivityManagerService$LocalService;->setHasOverlayUi(IZ)V
+PLcom/android/server/am/ActivityManagerService$LocalService;->setPendingIntentWhitelistDuration(Landroid/content/IIntentSender;Landroid/os/IBinder;J)V
+PLcom/android/server/am/ActivityManagerService$LocalService;->startIsolatedProcess(Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Runnable;)I
+PLcom/android/server/am/ActivityManagerService$LocalService;->updateDeviceIdleTempWhitelist([IIZ)V
+PLcom/android/server/am/ActivityManagerService$MainHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/am/ActivityManagerService$MemBinder;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/am/ActivityManagerService$PendingAssistExtras;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityRecord;Landroid/os/Bundle;Landroid/content/Intent;Ljava/lang/String;Lcom/android/internal/os/IResultReceiver;Landroid/os/Bundle;I)V
+PLcom/android/server/am/ActivityManagerService$PermissionController;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/am/ActivityManagerService$PermissionController;->checkPermission(Ljava/lang/String;II)Z
+PLcom/android/server/am/ActivityManagerService$ProcessChangeItem;-><init>()V
+PLcom/android/server/am/ActivityManagerService$ProcessInfoService;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/am/ActivityManagerService$ProcessInfoService;->getProcessStatesAndOomScoresFromPids([I[I[I)V
+PLcom/android/server/am/ActivityManagerService$UiHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/am/ActivityManagerService$UidObserverRegistration;-><init>(ILjava/lang/String;II)V
+PLcom/android/server/am/ActivityManagerService;->-get0()Ljava/lang/String;
+PLcom/android/server/am/ActivityManagerService;->-get2(Lcom/android/server/am/ActivityManagerService;)Lcom/android/server/am/KeyguardController;
+PLcom/android/server/am/ActivityManagerService;->-get5(Lcom/android/server/am/ActivityManagerService;)Ljava/lang/StringBuilder;
+PLcom/android/server/am/ActivityManagerService;->-get6(Lcom/android/server/am/ActivityManagerService;)Lcom/android/server/am/VrController;
+PLcom/android/server/am/ActivityManagerService;->-wrap0(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/TaskRecord;)Landroid/app/ActivityManager$RecentTaskInfo;
+PLcom/android/server/am/ActivityManagerService;->-wrap2(Lcom/android/server/am/ActivityManagerService;II)V
+PLcom/android/server/am/ActivityManagerService;->-wrap3(Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/am/ActivityManagerService;->-wrap5(Lcom/android/server/am/ActivityManagerService;I)V
+PLcom/android/server/am/ActivityManagerService;->-wrap6(Lcom/android/server/am/ActivityManagerService;Z)V
+PLcom/android/server/am/ActivityManagerService;->-wrap7(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ProcessRecord;)V
+PLcom/android/server/am/ActivityManagerService;->-wrap9(Lcom/android/server/am/ActivityManagerService;I)V
+PLcom/android/server/am/ActivityManagerService;->activityDestroyed(Landroid/os/IBinder;)V
+PLcom/android/server/am/ActivityManagerService;->activityIdle(Landroid/os/IBinder;Landroid/content/res/Configuration;Z)V
+PLcom/android/server/am/ActivityManagerService;->activityPaused(Landroid/os/IBinder;)V
+PLcom/android/server/am/ActivityManagerService;->activityResumed(Landroid/os/IBinder;)V
+PLcom/android/server/am/ActivityManagerService;->activitySlept(Landroid/os/IBinder;)V
+PLcom/android/server/am/ActivityManagerService;->activityStopped(Landroid/os/IBinder;Landroid/os/Bundle;Landroid/os/PersistableBundle;Ljava/lang/CharSequence;)V
+PLcom/android/server/am/ActivityManagerService;->addAppLocked(Landroid/content/pm/ApplicationInfo;Ljava/lang/String;ZLjava/lang/String;)Lcom/android/server/am/ProcessRecord;
+PLcom/android/server/am/ActivityManagerService;->addBackgroundCheckViolationLocked(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->addBroadcastStatLocked(Ljava/lang/String;Ljava/lang/String;IIJ)V
+PLcom/android/server/am/ActivityManagerService;->addErrorToDropBox(Ljava/lang/String;Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Lcom/android/server/am/ActivityRecord;Lcom/android/server/am/ActivityRecord;Ljava/lang/String;Ljava/lang/String;Ljava/io/File;Landroid/app/ApplicationErrorReport$CrashInfo;)V
+PLcom/android/server/am/ActivityManagerService;->addPackageDependency(Ljava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->addProcessNameLocked(Lcom/android/server/am/ProcessRecord;)V
+PLcom/android/server/am/ActivityManagerService;->appDiedLocked(Lcom/android/server/am/ProcessRecord;ILandroid/app/IApplicationThread;Z)V
+PLcom/android/server/am/ActivityManagerService;->appRestrictedInBackgroundLocked(ILjava/lang/String;I)I
+PLcom/android/server/am/ActivityManagerService;->appServicesRestrictedInBackgroundLocked(ILjava/lang/String;I)I
+PLcom/android/server/am/ActivityManagerService;->applyUpdateLockStateLocked(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityManagerService;->applyUpdateVrModeLocked(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityManagerService;->attachApplication(Landroid/app/IApplicationThread;)V
+PLcom/android/server/am/ActivityManagerService;->backgroundServicesFinishedLocked(I)V
+PLcom/android/server/am/ActivityManagerService;->batteryNeedsCpuUpdate()V
+PLcom/android/server/am/ActivityManagerService;->bindService(Landroid/app/IApplicationThread;Landroid/os/IBinder;Landroid/content/Intent;Ljava/lang/String;Landroid/app/IServiceConnection;ILjava/lang/String;I)I
+PLcom/android/server/am/ActivityManagerService;->bootAnimationComplete()V
+PLcom/android/server/am/ActivityManagerService;->broadcastIntentInPackage(Ljava/lang/String;ILandroid/content/Intent;Ljava/lang/String;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;Ljava/lang/String;Landroid/os/Bundle;ZZI)I
+PLcom/android/server/am/ActivityManagerService;->broadcastQueueForIntent(Landroid/content/Intent;)Lcom/android/server/am/BroadcastQueue;
+PLcom/android/server/am/ActivityManagerService;->buildAssistBundleLocked(Lcom/android/server/am/ActivityManagerService$PendingAssistExtras;Landroid/os/Bundle;)V
+PLcom/android/server/am/ActivityManagerService;->canClearIdentity(III)Z
+PLcom/android/server/am/ActivityManagerService;->cancelIntentSender(Landroid/content/IIntentSender;)V
+PLcom/android/server/am/ActivityManagerService;->cancelIntentSenderLocked(Lcom/android/server/am/PendingIntentRecord;Z)V
+PLcom/android/server/am/ActivityManagerService;->cancelTaskThumbnailTransition(I)V
+PLcom/android/server/am/ActivityManagerService;->cancelTaskWindowTransition(I)V
+PLcom/android/server/am/ActivityManagerService;->checkAppInLaunchingProvidersLocked(Lcom/android/server/am/ProcessRecord;)Z
+PLcom/android/server/am/ActivityManagerService;->checkAppSwitchAllowedLocked(IIIILjava/lang/String;)Z
+PLcom/android/server/am/ActivityManagerService;->checkAuthorityGrants(ILandroid/content/pm/ProviderInfo;IZ)Z
+PLcom/android/server/am/ActivityManagerService;->checkBroadcastFromSystem(Landroid/content/Intent;Lcom/android/server/am/ProcessRecord;Ljava/lang/String;IZLjava/util/List;)V
+PLcom/android/server/am/ActivityManagerService;->checkExcessivePowerUsageLocked(Z)V
+PLcom/android/server/am/ActivityManagerService;->checkGrantUriPermissionFromIntentLocked(ILjava/lang/String;Landroid/content/Intent;ILcom/android/server/am/ActivityManagerService$NeededUriGrants;I)Lcom/android/server/am/ActivityManagerService$NeededUriGrants;
+PLcom/android/server/am/ActivityManagerService;->checkGrantUriPermissionLocked(ILjava/lang/String;Lcom/android/server/am/ActivityManagerService$GrantUri;II)I
+PLcom/android/server/am/ActivityManagerService;->checkHoldingPermissionsInternalLocked(Landroid/content/pm/IPackageManager;Landroid/content/pm/ProviderInfo;Lcom/android/server/am/ActivityManagerService$GrantUri;IIZ)Z
+PLcom/android/server/am/ActivityManagerService;->checkHoldingPermissionsLocked(Landroid/content/pm/IPackageManager;Landroid/content/pm/ProviderInfo;Lcom/android/server/am/ActivityManagerService$GrantUri;II)Z
+PLcom/android/server/am/ActivityManagerService;->checkPermissionWithToken(Ljava/lang/String;IILandroid/os/IBinder;)I
+PLcom/android/server/am/ActivityManagerService;->checkUriPermission(Landroid/net/Uri;IIIILandroid/os/IBinder;)I
+PLcom/android/server/am/ActivityManagerService;->checkUriPermissionLocked(Lcom/android/server/am/ActivityManagerService$GrantUri;II)Z
+PLcom/android/server/am/ActivityManagerService;->cleanUpApplicationRecordLocked(Lcom/android/server/am/ProcessRecord;ZZIZ)Z
+PLcom/android/server/am/ActivityManagerService;->cleanupAppInLaunchingProvidersLocked(Lcom/android/server/am/ProcessRecord;Z)Z
+PLcom/android/server/am/ActivityManagerService;->cleanupDisabledPackageComponentsLocked(Ljava/lang/String;IZ[Ljava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->cleanupDisabledPackageTasksLocked(Ljava/lang/String;Ljava/util/Set;I)V
+PLcom/android/server/am/ActivityManagerService;->closeSystemDialogs(Ljava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->closeSystemDialogsLocked(Ljava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->compatibilityInfoForPackageLocked(Landroid/content/pm/ApplicationInfo;)Landroid/content/res/CompatibilityInfo;
+PLcom/android/server/am/ActivityManagerService;->dispatchProcessDied(II)V
+PLcom/android/server/am/ActivityManagerService;->dispatchProcessesChanged()V
+PLcom/android/server/am/ActivityManagerService;->doLowMemReportIfNeededLocked(Lcom/android/server/am/ProcessRecord;)V
+PLcom/android/server/am/ActivityManagerService;->doStopUidLocked(ILcom/android/server/am/UidRecord;)V
+PLcom/android/server/am/ActivityManagerService;->enableScreenAfterBoot()V
+PLcom/android/server/am/ActivityManagerService;->enforceCallingPermission(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->enqueueAssistContext(ILandroid/content/Intent;Ljava/lang/String;Lcom/android/internal/os/IResultReceiver;Landroid/os/Bundle;Landroid/os/IBinder;ZZILandroid/os/Bundle;JI)Lcom/android/server/am/ActivityManagerService$PendingAssistExtras;
+PLcom/android/server/am/ActivityManagerService;->ensureConfigAndVisibilityAfterUpdate(Lcom/android/server/am/ActivityRecord;I)Z
+PLcom/android/server/am/ActivityManagerService;->fillInProcMemInfo(Lcom/android/server/am/ProcessRecord;Landroid/app/ActivityManager$RunningAppProcessInfo;I)V
+PLcom/android/server/am/ActivityManagerService;->findOrCreateUriPermissionLocked(Ljava/lang/String;Ljava/lang/String;ILcom/android/server/am/ActivityManagerService$GrantUri;)Lcom/android/server/am/UriPermission;
+PLcom/android/server/am/ActivityManagerService;->finishActivity(Landroid/os/IBinder;ILandroid/content/Intent;I)Z
+PLcom/android/server/am/ActivityManagerService;->finishBooting()V
+PLcom/android/server/am/ActivityManagerService;->finishRunningVoiceLocked()V
+PLcom/android/server/am/ActivityManagerService;->forceStopPackageLocked(Ljava/lang/String;IZZZZZILjava/lang/String;)Z
+PLcom/android/server/am/ActivityManagerService;->generateApplicationProvidersLocked(Lcom/android/server/am/ProcessRecord;)Ljava/util/List;
+PLcom/android/server/am/ActivityManagerService;->getActivityDisplayId(Landroid/os/IBinder;)I
+PLcom/android/server/am/ActivityManagerService;->getActivityOptions(Landroid/os/IBinder;)Landroid/os/Bundle;
+PLcom/android/server/am/ActivityManagerService;->getActivityStackId(Landroid/os/IBinder;)I
+PLcom/android/server/am/ActivityManagerService;->getAllStackInfos()Ljava/util/List;
+PLcom/android/server/am/ActivityManagerService;->getAppInfoForUser(Landroid/content/pm/ApplicationInfo;I)Landroid/content/pm/ApplicationInfo;
+PLcom/android/server/am/ActivityManagerService;->getAppOpsService()Lcom/android/internal/app/IAppOpsService;
+PLcom/android/server/am/ActivityManagerService;->getAppTasks(Ljava/lang/String;)Ljava/util/List;
+PLcom/android/server/am/ActivityManagerService;->getBackgroundLaunchBroadcasts()Landroid/util/ArraySet;
+PLcom/android/server/am/ActivityManagerService;->getCallingActivity(Landroid/os/IBinder;)Landroid/content/ComponentName;
+PLcom/android/server/am/ActivityManagerService;->getCallingRecordLocked(Landroid/os/IBinder;)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityManagerService;->getCommonServicesLocked(Z)Ljava/util/HashMap;
+PLcom/android/server/am/ActivityManagerService;->getConfiguration()Landroid/content/res/Configuration;
+PLcom/android/server/am/ActivityManagerService;->getContentProvider(Landroid/app/IApplicationThread;Ljava/lang/String;IZ)Landroid/app/ContentProviderHolder;
+PLcom/android/server/am/ActivityManagerService;->getContentProviderExternalUnchecked(Ljava/lang/String;Landroid/os/IBinder;I)Landroid/app/ContentProviderHolder;
+PLcom/android/server/am/ActivityManagerService;->getCurrentUser()Landroid/content/pm/UserInfo;
+PLcom/android/server/am/ActivityManagerService;->getDeviceConfigurationInfo()Landroid/content/pm/ConfigurationInfo;
+PLcom/android/server/am/ActivityManagerService;->getFocusedStack()Lcom/android/server/am/ActivityStack;
+PLcom/android/server/am/ActivityManagerService;->getFocusedStackId()I
+PLcom/android/server/am/ActivityManagerService;->getGlobalConfiguration()Landroid/content/res/Configuration;
+PLcom/android/server/am/ActivityManagerService;->getHomeIntent()Landroid/content/Intent;
+PLcom/android/server/am/ActivityManagerService;->getInputDispatchingTimeoutLocked(Lcom/android/server/am/ActivityRecord;)J
+PLcom/android/server/am/ActivityManagerService;->getInputDispatchingTimeoutLocked(Lcom/android/server/am/ProcessRecord;)J
+PLcom/android/server/am/ActivityManagerService;->getIntentForIntentSender(Landroid/content/IIntentSender;)Landroid/content/Intent;
+PLcom/android/server/am/ActivityManagerService;->getLastResumedActivityUserId()I
+PLcom/android/server/am/ActivityManagerService;->getLockTaskModeState()I
+PLcom/android/server/am/ActivityManagerService;->getMemoryInfo(Landroid/app/ActivityManager$MemoryInfo;)V
+PLcom/android/server/am/ActivityManagerService;->getMemoryTrimLevel()I
+PLcom/android/server/am/ActivityManagerService;->getMyMemoryState(Landroid/app/ActivityManager$RunningAppProcessInfo;)V
+PLcom/android/server/am/ActivityManagerService;->getPackageForIntentSender(Landroid/content/IIntentSender;)Ljava/lang/String;
+PLcom/android/server/am/ActivityManagerService;->getPackageManagerInternalLocked()Landroid/content/pm/PackageManagerInternal;
+PLcom/android/server/am/ActivityManagerService;->getPackageProcessState(Ljava/lang/String;Ljava/lang/String;)I
+PLcom/android/server/am/ActivityManagerService;->getProcessMemoryInfo([I)[Landroid/os/Debug$MemoryInfo;
+PLcom/android/server/am/ActivityManagerService;->getProcessRecordLocked(Ljava/lang/String;IZ)Lcom/android/server/am/ProcessRecord;
+PLcom/android/server/am/ActivityManagerService;->getProcessStatesAndOomScoresForPIDs([I[I[I)V
+PLcom/android/server/am/ActivityManagerService;->getProviderInfoLocked(Ljava/lang/String;II)Landroid/content/pm/ProviderInfo;
+PLcom/android/server/am/ActivityManagerService;->getProviderMimeType(Landroid/net/Uri;I)Ljava/lang/String;
+PLcom/android/server/am/ActivityManagerService;->getRequestedOrientation(Landroid/os/IBinder;)I
+PLcom/android/server/am/ActivityManagerService;->getRunningUserIds()[I
+PLcom/android/server/am/ActivityManagerService;->getServices(II)Ljava/util/List;
+PLcom/android/server/am/ActivityManagerService;->getStackInfo(I)Landroid/app/ActivityManager$StackInfo;
+PLcom/android/server/am/ActivityManagerService;->getTagForIntentSender(Landroid/content/IIntentSender;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/am/ActivityManagerService;->getTagForIntentSenderLocked(Lcom/android/server/am/PendingIntentRecord;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/am/ActivityManagerService;->getTaskForActivity(Landroid/os/IBinder;Z)I
+PLcom/android/server/am/ActivityManagerService;->getTaskSnapshot(IZ)Landroid/app/ActivityManager$TaskSnapshot;
+PLcom/android/server/am/ActivityManagerService;->getTasks(II)Ljava/util/List;
+PLcom/android/server/am/ActivityManagerService;->getUidForIntentSender(Landroid/content/IIntentSender;)I
+PLcom/android/server/am/ActivityManagerService;->getUidFromIntent(Landroid/content/Intent;)I
+PLcom/android/server/am/ActivityManagerService;->getUidState(I)I
+PLcom/android/server/am/ActivityManagerService;->getUidStateLocked(I)I
+PLcom/android/server/am/ActivityManagerService;->grantUriPermission(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/net/Uri;II)V
+PLcom/android/server/am/ActivityManagerService;->grantUriPermissionFromIntentLocked(ILjava/lang/String;Landroid/content/Intent;Lcom/android/server/am/UriPermissionOwner;I)V
+PLcom/android/server/am/ActivityManagerService;->grantUriPermissionLocked(ILjava/lang/String;Lcom/android/server/am/ActivityManagerService$GrantUri;ILcom/android/server/am/UriPermissionOwner;I)V
+PLcom/android/server/am/ActivityManagerService;->grantUriPermissionUncheckedLocked(ILjava/lang/String;Lcom/android/server/am/ActivityManagerService$GrantUri;ILcom/android/server/am/UriPermissionOwner;)V
+PLcom/android/server/am/ActivityManagerService;->handleAppDiedLocked(Lcom/android/server/am/ProcessRecord;ZZ)V
+PLcom/android/server/am/ActivityManagerService;->handleApplicationWtf(Landroid/os/IBinder;Ljava/lang/String;ZLandroid/app/ApplicationErrorReport$ParcelableCrashInfo;)Z
+PLcom/android/server/am/ActivityManagerService;->handleApplicationWtfInner(IILandroid/os/IBinder;Ljava/lang/String;Landroid/app/ApplicationErrorReport$CrashInfo;)Lcom/android/server/am/ProcessRecord;
+PLcom/android/server/am/ActivityManagerService;->handleIncomingUser(IIIZZLjava/lang/String;Ljava/lang/String;)I
+PLcom/android/server/am/ActivityManagerService;->hasUsageStatsPermission(Ljava/lang/String;)Z
+PLcom/android/server/am/ActivityManagerService;->idleUids()V
+PLcom/android/server/am/ActivityManagerService;->installEncryptionUnawareProviders(I)V
+PLcom/android/server/am/ActivityManagerService;->installSystemProviders()V
+PLcom/android/server/am/ActivityManagerService;->isAllowedWhileBooting(Landroid/content/pm/ApplicationInfo;)Z
+PLcom/android/server/am/ActivityManagerService;->isAppStartModeDisabled(ILjava/lang/String;)Z
+PLcom/android/server/am/ActivityManagerService;->isGetTasksAllowed(Ljava/lang/String;II)Z
+PLcom/android/server/am/ActivityManagerService;->isInLockTaskMode()Z
+PLcom/android/server/am/ActivityManagerService;->isInMultiWindowMode(Landroid/os/IBinder;)Z
+PLcom/android/server/am/ActivityManagerService;->isKeyguardLocked()Z
+PLcom/android/server/am/ActivityManagerService;->isNextTransitionForward()Z
+PLcom/android/server/am/ActivityManagerService;->isOnDeviceIdleWhitelistLocked(I)Z
+PLcom/android/server/am/ActivityManagerService;->isPendingBroadcastProcessLocked(I)Z
+PLcom/android/server/am/ActivityManagerService;->isShuttingDownLocked()Z
+PLcom/android/server/am/ActivityManagerService;->isSingleton(Ljava/lang/String;Landroid/content/pm/ApplicationInfo;Ljava/lang/String;I)Z
+PLcom/android/server/am/ActivityManagerService;->isSleepingOrShuttingDownLocked()Z
+PLcom/android/server/am/ActivityManagerService;->isTopOfTask(Landroid/os/IBinder;)Z
+PLcom/android/server/am/ActivityManagerService;->isUserAMonkey()Z
+PLcom/android/server/am/ActivityManagerService;->isUserRunning(II)Z
+PLcom/android/server/am/ActivityManagerService;->keyguardGoingAway(I)V
+PLcom/android/server/am/ActivityManagerService;->killAllBackgroundProcessesExcept(II)V
+PLcom/android/server/am/ActivityManagerService;->killApplication(Ljava/lang/String;IILjava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->killPackageProcessesLocked(Ljava/lang/String;IIIZZZZLjava/lang/String;)Z
+PLcom/android/server/am/ActivityManagerService;->killProcessGroup(II)V
+PLcom/android/server/am/ActivityManagerService;->logAppTooSlow(Lcom/android/server/am/ProcessRecord;JLjava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->makeIntentSenderCanceledLocked(Lcom/android/server/am/PendingIntentRecord;)V
+PLcom/android/server/am/ActivityManagerService;->monitor()V
+PLcom/android/server/am/ActivityManagerService;->moveTaskToFrontLocked(IILandroid/os/Bundle;Z)V
+PLcom/android/server/am/ActivityManagerService;->newProcessRecordLocked(Landroid/content/pm/ApplicationInfo;Ljava/lang/String;ZI)Lcom/android/server/am/ProcessRecord;
+PLcom/android/server/am/ActivityManagerService;->newUriPermissionOwner(Ljava/lang/String;)Landroid/os/IBinder;
+PLcom/android/server/am/ActivityManagerService;->noteAlarmFinish(Landroid/content/IIntentSender;ILjava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->noteAlarmStart(Landroid/content/IIntentSender;ILjava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->noteUidProcessState(II)V
+PLcom/android/server/am/ActivityManagerService;->noteWakeupAlarm(Landroid/content/IIntentSender;ILjava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->notifyActivityDrawn(Landroid/os/IBinder;)V
+PLcom/android/server/am/ActivityManagerService;->notifyEnterAnimationComplete(Landroid/os/IBinder;)V
+PLcom/android/server/am/ActivityManagerService;->notifyPackageUse(Ljava/lang/String;I)V
+PLcom/android/server/am/ActivityManagerService;->notifyTaskPersisterLocked(Lcom/android/server/am/TaskRecord;Z)V
+PLcom/android/server/am/ActivityManagerService;->notifyVrManagerOfSleepState(Z)V
+PLcom/android/server/am/ActivityManagerService;->onCoreSettingsChange(Landroid/os/Bundle;)V
+PLcom/android/server/am/ActivityManagerService;->overridePendingTransition(Landroid/os/IBinder;Ljava/lang/String;II)V
+PLcom/android/server/am/ActivityManagerService;->performDisplayOverrideConfigUpdate(Landroid/content/res/Configuration;ZI)I
+PLcom/android/server/am/ActivityManagerService;->postFinishBooting(ZZ)V
+PLcom/android/server/am/ActivityManagerService;->procStateToImportance(IILandroid/app/ActivityManager$RunningAppProcessInfo;I)I
+PLcom/android/server/am/ActivityManagerService;->processClass(Lcom/android/server/am/ProcessRecord;)Ljava/lang/String;
+PLcom/android/server/am/ActivityManagerService;->processContentProviderPublishTimedOutLocked(Lcom/android/server/am/ProcessRecord;)V
+PLcom/android/server/am/ActivityManagerService;->publishService(Landroid/os/IBinder;Landroid/content/Intent;Landroid/os/IBinder;)V
+PLcom/android/server/am/ActivityManagerService;->readGrantedUriPermissionsLocked()V
+PLcom/android/server/am/ActivityManagerService;->recordPssSampleLocked(Lcom/android/server/am/ProcessRecord;IJJJJ)V
+PLcom/android/server/am/ActivityManagerService;->registerProcessObserver(Landroid/app/IProcessObserver;)V
+PLcom/android/server/am/ActivityManagerService;->registerTaskStackListener(Landroid/app/ITaskStackListener;)V
+PLcom/android/server/am/ActivityManagerService;->registerUidObserver(Landroid/app/IUidObserver;IILjava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->registerUserSwitchObserver(Landroid/app/IUserSwitchObserver;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->removeContentProviderExternalUnchecked(Ljava/lang/String;Landroid/os/IBinder;I)V
+PLcom/android/server/am/ActivityManagerService;->removeDyingProviderLocked(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ContentProviderRecord;Z)Z
+PLcom/android/server/am/ActivityManagerService;->removeLruProcessLocked(Lcom/android/server/am/ProcessRecord;)V
+PLcom/android/server/am/ActivityManagerService;->removeProcessLocked(Lcom/android/server/am/ProcessRecord;ZZLjava/lang/String;)Z
+PLcom/android/server/am/ActivityManagerService;->removeProcessNameLocked(Ljava/lang/String;I)Lcom/android/server/am/ProcessRecord;
+PLcom/android/server/am/ActivityManagerService;->removeProcessNameLocked(Ljava/lang/String;ILcom/android/server/am/ProcessRecord;)Lcom/android/server/am/ProcessRecord;
+PLcom/android/server/am/ActivityManagerService;->removeReceiverLocked(Lcom/android/server/am/ReceiverList;)V
+PLcom/android/server/am/ActivityManagerService;->removeUriPermissionsForPackageLocked(Ljava/lang/String;IZ)V
+PLcom/android/server/am/ActivityManagerService;->reportAssistContextExtras(Landroid/os/IBinder;Landroid/os/Bundle;Landroid/app/assist/AssistStructure;Landroid/app/assist/AssistContent;Landroid/net/Uri;)V
+PLcom/android/server/am/ActivityManagerService;->reportSizeConfigurations(Landroid/os/IBinder;[I[I[I)V
+PLcom/android/server/am/ActivityManagerService;->requestAutofillData(Lcom/android/internal/os/IResultReceiver;Landroid/os/Bundle;Landroid/os/IBinder;I)Z
+PLcom/android/server/am/ActivityManagerService;->requestPssAllProcsLocked(JZZ)V
+PLcom/android/server/am/ActivityManagerService;->requestPssLocked(Lcom/android/server/am/ProcessRecord;I)V
+PLcom/android/server/am/ActivityManagerService;->resolveActivityInfo(Landroid/content/Intent;II)Landroid/content/pm/ActivityInfo;
+PLcom/android/server/am/ActivityManagerService;->retrieveSettings()V
+PLcom/android/server/am/ActivityManagerService;->revokeUriPermission(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/net/Uri;II)V
+PLcom/android/server/am/ActivityManagerService;->revokeUriPermissionLocked(Ljava/lang/String;ILcom/android/server/am/ActivityManagerService$GrantUri;I)V
+PLcom/android/server/am/ActivityManagerService;->scheduleAppGcsLocked()V
+PLcom/android/server/am/ActivityManagerService;->scheduleApplicationInfoChanged(Ljava/util/List;I)V
+PLcom/android/server/am/ActivityManagerService;->scheduleStartProfilesLocked()V
+PLcom/android/server/am/ActivityManagerService;->sendIntentSender(Landroid/content/IIntentSender;Landroid/os/IBinder;ILandroid/content/Intent;Ljava/lang/String;Landroid/content/IIntentReceiver;Ljava/lang/String;Landroid/os/Bundle;)I
+PLcom/android/server/am/ActivityManagerService;->sendNotifyVrManagerOfSleepState(Z)V
+PLcom/android/server/am/ActivityManagerService;->sendPendingBroadcastsLocked(Lcom/android/server/am/ProcessRecord;)Z
+PLcom/android/server/am/ActivityManagerService;->setAppIdTempWhitelistStateLocked(IZ)V
+PLcom/android/server/am/ActivityManagerService;->setDisablePreviewScreenshots(Landroid/os/IBinder;Z)V
+PLcom/android/server/am/ActivityManagerService;->setHasTopUi(Z)V
+PLcom/android/server/am/ActivityManagerService;->setLockScreenShown(Z)V
+PLcom/android/server/am/ActivityManagerService;->setProcessTrackerStateLocked(Lcom/android/server/am/ProcessRecord;IJ)V
+PLcom/android/server/am/ActivityManagerService;->setRenderThread(I)V
+PLcom/android/server/am/ActivityManagerService;->setRequestedOrientation(Landroid/os/IBinder;I)V
+PLcom/android/server/am/ActivityManagerService;->setResumedActivityUncheckLocked(Lcom/android/server/am/ActivityRecord;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->setServiceForeground(Landroid/content/ComponentName;Landroid/os/IBinder;ILandroid/app/Notification;I)V
+PLcom/android/server/am/ActivityManagerService;->setSystemProcess()V
+PLcom/android/server/am/ActivityManagerService;->setTaskDescription(Landroid/os/IBinder;Landroid/app/ActivityManager$TaskDescription;)V
+PLcom/android/server/am/ActivityManagerService;->setUsageStatsManager(Landroid/app/usage/UsageStatsManagerInternal;)V
+PLcom/android/server/am/ActivityManagerService;->setWindowManager(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/am/ActivityManagerService;->shouldDisableNonVrUiLocked()Z
+PLcom/android/server/am/ActivityManagerService;->shouldShowDialogs(Landroid/content/res/Configuration;)Z
+PLcom/android/server/am/ActivityManagerService;->shouldSleepLocked()Z
+PLcom/android/server/am/ActivityManagerService;->showAskCompatModeDialogLocked(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityManagerService;->showUnsupportedZoomDialogIfNeededLocked(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityManagerService;->skipCurrentReceiverLocked(Lcom/android/server/am/ProcessRecord;)V
+PLcom/android/server/am/ActivityManagerService;->startActivity(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;IILandroid/app/ProfilerInfo;Landroid/os/Bundle;)I
+PLcom/android/server/am/ActivityManagerService;->startActivityAsUser(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;IILandroid/app/ProfilerInfo;Landroid/os/Bundle;I)I
+PLcom/android/server/am/ActivityManagerService;->startActivityFromRecents(ILandroid/os/Bundle;)I
+PLcom/android/server/am/ActivityManagerService;->startAssociationLocked(ILjava/lang/String;IILandroid/content/ComponentName;Ljava/lang/String;)Lcom/android/server/am/ActivityManagerService$Association;
+PLcom/android/server/am/ActivityManagerService;->startHomeActivityLocked(ILjava/lang/String;)Z
+PLcom/android/server/am/ActivityManagerService;->startIsolatedProcess(Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Runnable;)I
+PLcom/android/server/am/ActivityManagerService;->startObservingNativeCrashes()V
+PLcom/android/server/am/ActivityManagerService;->startPersistentApps(I)V
+PLcom/android/server/am/ActivityManagerService;->startProcessLocked(Ljava/lang/String;Landroid/content/pm/ApplicationInfo;ZILjava/lang/String;Landroid/content/ComponentName;ZZIZLjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/Runnable;)Lcom/android/server/am/ProcessRecord;
+PLcom/android/server/am/ActivityManagerService;->startProcessLocked(Ljava/lang/String;Landroid/content/pm/ApplicationInfo;ZILjava/lang/String;Landroid/content/ComponentName;ZZZ)Lcom/android/server/am/ProcessRecord;
+PLcom/android/server/am/ActivityManagerService;->startServiceInPackage(ILandroid/content/Intent;Ljava/lang/String;ZLjava/lang/String;I)Landroid/content/ComponentName;
+PLcom/android/server/am/ActivityManagerService;->startSetupActivityLocked()V
+PLcom/android/server/am/ActivityManagerService;->startTimeTrackingFocusedActivityLocked()V
+PLcom/android/server/am/ActivityManagerService;->stopAppSwitches()V
+PLcom/android/server/am/ActivityManagerService;->stopAssociationLocked(ILjava/lang/String;ILandroid/content/ComponentName;)V
+PLcom/android/server/am/ActivityManagerService;->stopService(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;I)I
+PLcom/android/server/am/ActivityManagerService;->stopServiceToken(Landroid/content/ComponentName;Landroid/os/IBinder;I)Z
+PLcom/android/server/am/ActivityManagerService;->systemReady(Ljava/lang/Runnable;Landroid/util/BootTimingsTraceLog;)V
+PLcom/android/server/am/ActivityManagerService;->trimApplications()V
+PLcom/android/server/am/ActivityManagerService;->uidOnBackgroundWhitelist(I)Z
+PLcom/android/server/am/ActivityManagerService;->unbindFinished(Landroid/os/IBinder;Landroid/content/Intent;Z)V
+PLcom/android/server/am/ActivityManagerService;->unbindService(Landroid/app/IServiceConnection;)Z
+PLcom/android/server/am/ActivityManagerService;->unbroadcastIntent(Landroid/app/IApplicationThread;Landroid/content/Intent;I)V
+PLcom/android/server/am/ActivityManagerService;->unregisterReceiver(Landroid/content/IIntentReceiver;)V
+PLcom/android/server/am/ActivityManagerService;->updateApplicationInfoLocked(Ljava/util/List;I)V
+PLcom/android/server/am/ActivityManagerService;->updateConfiguration(Landroid/content/res/Configuration;)Z
+PLcom/android/server/am/ActivityManagerService;->updateConfigurationLocked(Landroid/content/res/Configuration;Lcom/android/server/am/ActivityRecord;Z)Z
+PLcom/android/server/am/ActivityManagerService;->updateConfigurationLocked(Landroid/content/res/Configuration;Lcom/android/server/am/ActivityRecord;ZZ)Z
+PLcom/android/server/am/ActivityManagerService;->updateConfigurationLocked(Landroid/content/res/Configuration;Lcom/android/server/am/ActivityRecord;ZZIZ)Z
+PLcom/android/server/am/ActivityManagerService;->updateConfigurationLocked(Landroid/content/res/Configuration;Lcom/android/server/am/ActivityRecord;ZZIZLcom/android/server/am/ActivityManagerService$UpdateConfigurationResult;)Z
+PLcom/android/server/am/ActivityManagerService;->updateDisplayOverrideConfiguration(Landroid/content/res/Configuration;I)Z
+PLcom/android/server/am/ActivityManagerService;->updateDisplayOverrideConfigurationLocked(Landroid/content/res/Configuration;Lcom/android/server/am/ActivityRecord;ZI)Z
+PLcom/android/server/am/ActivityManagerService;->updateDisplayOverrideConfigurationLocked(Landroid/content/res/Configuration;Lcom/android/server/am/ActivityRecord;ZILcom/android/server/am/ActivityManagerService$UpdateConfigurationResult;)Z
+PLcom/android/server/am/ActivityManagerService;->updateEventDispatchingLocked()V
+PLcom/android/server/am/ActivityManagerService;->updateGlobalConfiguration(Landroid/content/res/Configuration;ZZIZ)I
+PLcom/android/server/am/ActivityManagerService;->updateLockTaskPackages(I[Ljava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->updateProcessForegroundLocked(Lcom/android/server/am/ProcessRecord;ZZ)V
+PLcom/android/server/am/ActivityManagerService;->updateSleepIfNeededLocked()V
+PLcom/android/server/am/ActivityManagerService;->updateUsageStats(Lcom/android/server/am/ActivityRecord;Z)V
+PLcom/android/server/am/ActivityManagerService;->verifyBroadcastLocked(Landroid/content/Intent;)Landroid/content/Intent;
+PLcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;->-get0(Lcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;)I
+PLcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;->-get1(Lcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;)Z
+PLcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;->-get2(Lcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;->-get3(Lcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;)Z
+PLcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;->-get4(Lcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;)Z
+PLcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;->-get5(Lcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;)I
+PLcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;->-get6(Lcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;)I
+PLcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;->-get7(Lcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;)I
+PLcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;->-get8(Lcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;)I
+PLcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;->-set0(Lcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;I)I
+PLcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;->-set1(Lcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;Z)Z
+PLcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;->-set2(Lcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;Lcom/android/server/am/ActivityRecord;)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;->-set3(Lcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;Z)Z
+PLcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;->-set4(Lcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;Z)Z
+PLcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;->-set5(Lcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;I)I
+PLcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;->-set6(Lcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;I)I
+PLcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;->-set7(Lcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;I)I
+PLcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;->-set8(Lcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;I)I
+PLcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;-><init>(Lcom/android/server/am/ActivityMetricsLogger;)V
+PLcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;-><init>(Lcom/android/server/am/ActivityMetricsLogger;Lcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;)V
+PLcom/android/server/am/ActivityMetricsLogger;->allStacksWindowsDrawn()Z
+PLcom/android/server/am/ActivityMetricsLogger;->calculateCurrentDelay()I
+PLcom/android/server/am/ActivityMetricsLogger;->getTransitionType(Lcom/android/server/am/ActivityMetricsLogger$StackTransitionInfo;)I
+PLcom/android/server/am/ActivityMetricsLogger;->hasStartedActivity(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ActivityRecord;)Z
+PLcom/android/server/am/ActivityMetricsLogger;->isAnyTransitionActive()Z
+PLcom/android/server/am/ActivityMetricsLogger;->logAppTransitionMultiEvents()V
+PLcom/android/server/am/ActivityMetricsLogger;->logWindowState()V
+PLcom/android/server/am/ActivityMetricsLogger;->notifyActivityLaunched(ILcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityMetricsLogger;->notifyActivityLaunched(ILcom/android/server/am/ActivityRecord;ZZ)V
+PLcom/android/server/am/ActivityMetricsLogger;->notifyActivityLaunching()V
+PLcom/android/server/am/ActivityMetricsLogger;->notifyBindApplication(Lcom/android/server/am/ProcessRecord;)V
+PLcom/android/server/am/ActivityMetricsLogger;->notifyStartingWindowDrawn(I)V
+PLcom/android/server/am/ActivityMetricsLogger;->notifyTransitionStarting(Landroid/util/SparseIntArray;)V
+PLcom/android/server/am/ActivityMetricsLogger;->notifyVisibilityChanged(Lcom/android/server/am/ActivityRecord;Z)V
+PLcom/android/server/am/ActivityMetricsLogger;->notifyWindowsDrawn(I)V
+PLcom/android/server/am/ActivityMetricsLogger;->reset(Z)V
+PLcom/android/server/am/ActivityRecord$Token;->-wrap0(Lcom/android/server/am/ActivityRecord$Token;)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityRecord$Token;-><init>(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityRecord$Token;->toString()Ljava/lang/String;
+PLcom/android/server/am/ActivityRecord$Token;->tokenToActivityRecordLocked(Lcom/android/server/am/ActivityRecord$Token;)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityRecord;->-getcom-android-server-am-ActivityStack$ActivityStateSwitchesValues()[I
+PLcom/android/server/am/ActivityRecord;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ProcessRecord;IILjava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/content/pm/ActivityInfo;Landroid/content/res/Configuration;Lcom/android/server/am/ActivityRecord;Ljava/lang/String;IZZLcom/android/server/am/ActivityStackSupervisor;Lcom/android/server/am/ActivityStackSupervisor$ActivityContainer;Landroid/app/ActivityOptions;Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityRecord;->activityResumedLocked(Landroid/os/IBinder;)V
+PLcom/android/server/am/ActivityRecord;->activityStoppedLocked(Landroid/os/Bundle;Landroid/os/PersistableBundle;Ljava/lang/CharSequence;)V
+PLcom/android/server/am/ActivityRecord;->addNewIntentLocked(Lcom/android/internal/content/ReferrerIntent;)V
+PLcom/android/server/am/ActivityRecord;->addResultLocked(Lcom/android/server/am/ActivityRecord;Ljava/lang/String;IILandroid/content/Intent;)V
+PLcom/android/server/am/ActivityRecord;->allowTaskSnapshot()Z
+PLcom/android/server/am/ActivityRecord;->applyOptionsLocked()V
+PLcom/android/server/am/ActivityRecord;->canLaunchHomeActivity(ILcom/android/server/am/ActivityRecord;)Z
+PLcom/android/server/am/ActivityRecord;->checkEnterPictureInPictureAppOpsState()Z
+PLcom/android/server/am/ActivityRecord;->checkEnterPictureInPictureState(Ljava/lang/String;ZZ)Z
+PLcom/android/server/am/ActivityRecord;->clearOptionsLocked()V
+PLcom/android/server/am/ActivityRecord;->completeResumeLocked()V
+PLcom/android/server/am/ActivityRecord;->computeBounds(Landroid/graphics/Rect;)V
+PLcom/android/server/am/ActivityRecord;->continueLaunchTickingLocked()Z
+PLcom/android/server/am/ActivityRecord;->createWindowContainer()V
+PLcom/android/server/am/ActivityRecord;->deliverNewIntentLocked(ILandroid/content/Intent;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityRecord;->ensureActivityConfigurationLocked(IZ)Z
+PLcom/android/server/am/ActivityRecord;->finishLaunchTickingLocked()V
+PLcom/android/server/am/ActivityRecord;->forTokenLocked(Landroid/os/IBinder;)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityRecord;->getChildCount()I
+PLcom/android/server/am/ActivityRecord;->getDisplayId()I
+PLcom/android/server/am/ActivityRecord;->getOptionsForTargetActivityLocked()Landroid/app/ActivityOptions;
+PLcom/android/server/am/ActivityRecord;->getParent()Lcom/android/server/am/ConfigurationContainer;
+PLcom/android/server/am/ActivityRecord;->getRequestedOrientation()I
+PLcom/android/server/am/ActivityRecord;->getStackId()I
+PLcom/android/server/am/ActivityRecord;->getStackLocked(Landroid/os/IBinder;)Lcom/android/server/am/ActivityStack;
+PLcom/android/server/am/ActivityRecord;->getTask()Lcom/android/server/am/TaskRecord;
+PLcom/android/server/am/ActivityRecord;->getTaskForActivityLocked(Landroid/os/IBinder;Z)I
+PLcom/android/server/am/ActivityRecord;->getUriPermissionsLocked()Lcom/android/server/am/UriPermissionOwner;
+PLcom/android/server/am/ActivityRecord;->getWindowContainerController()Lcom/android/server/wm/AppWindowContainerController;
+PLcom/android/server/am/ActivityRecord;->handleAlreadyVisible()Z
+PLcom/android/server/am/ActivityRecord;->hasDismissKeyguardWindows()Z
+PLcom/android/server/am/ActivityRecord;->hasShowWhenLockedWindows()Z
+PLcom/android/server/am/ActivityRecord;->isAlwaysFocusable()Z
+PLcom/android/server/am/ActivityRecord;->isAssistantActivity()Z
+PLcom/android/server/am/ActivityRecord;->isConfigurationCompatible(Landroid/content/res/Configuration;)Z
+PLcom/android/server/am/ActivityRecord;->isFocusable()Z
+PLcom/android/server/am/ActivityRecord;->isFreeform()Z
+PLcom/android/server/am/ActivityRecord;->isHomeActivity()Z
+PLcom/android/server/am/ActivityRecord;->isHomeIntent(Landroid/content/Intent;)Z
+PLcom/android/server/am/ActivityRecord;->isInHistory()Z
+PLcom/android/server/am/ActivityRecord;->isInStackLocked(Landroid/os/IBinder;)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityRecord;->isMainIntent(Landroid/content/Intent;)Z
+PLcom/android/server/am/ActivityRecord;->isNoHistory()Z
+PLcom/android/server/am/ActivityRecord;->isPersistable()Z
+PLcom/android/server/am/ActivityRecord;->isProcessRunning()Z
+PLcom/android/server/am/ActivityRecord;->isRecentsActivity()Z
+PLcom/android/server/am/ActivityRecord;->isResizeable()Z
+PLcom/android/server/am/ActivityRecord;->isResolverActivity()Z
+PLcom/android/server/am/ActivityRecord;->makeFinishingLocked()V
+PLcom/android/server/am/ActivityRecord;->makeVisibleIfNeeded(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityRecord;->mayFreezeScreenLocked(Lcom/android/server/am/ProcessRecord;)Z
+PLcom/android/server/am/ActivityRecord;->notifyAppResumed(Z)V
+PLcom/android/server/am/ActivityRecord;->notifyUnknownVisibilityLaunched()V
+PLcom/android/server/am/ActivityRecord;->onOverrideConfigurationChanged(Landroid/content/res/Configuration;)V
+PLcom/android/server/am/ActivityRecord;->onOverrideConfigurationSent()V
+PLcom/android/server/am/ActivityRecord;->onStartingWindowDrawn()V
+PLcom/android/server/am/ActivityRecord;->onWindowsDrawn()V
+PLcom/android/server/am/ActivityRecord;->onWindowsGone()V
+PLcom/android/server/am/ActivityRecord;->onWindowsVisible()V
+PLcom/android/server/am/ActivityRecord;->pauseKeyDispatchingLocked()V
+PLcom/android/server/am/ActivityRecord;->removeOrphanedStartingWindow(Z)V
+PLcom/android/server/am/ActivityRecord;->removeUriPermissionsLocked()V
+PLcom/android/server/am/ActivityRecord;->removeWindowContainer()V
+PLcom/android/server/am/ActivityRecord;->reportLaunchTimeLocked(J)V
+PLcom/android/server/am/ActivityRecord;->resumeKeyDispatchingLocked()V
+PLcom/android/server/am/ActivityRecord;->screenshotActivityLocked()Landroid/graphics/Bitmap;
+PLcom/android/server/am/ActivityRecord;->setActivityType(ZILandroid/content/Intent;Landroid/app/ActivityOptions;Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityRecord;->setDeferHidingClient(Z)V
+PLcom/android/server/am/ActivityRecord;->setDisablePreviewScreenshots(Z)V
+PLcom/android/server/am/ActivityRecord;->setLastReportedConfiguration(Landroid/util/MergedConfiguration;)V
+PLcom/android/server/am/ActivityRecord;->setLastReportedGlobalConfiguration(Landroid/content/res/Configuration;)V
+PLcom/android/server/am/ActivityRecord;->setRequestedOrientation(I)V
+PLcom/android/server/am/ActivityRecord;->setSizeConfigurations([I[I[I)V
+PLcom/android/server/am/ActivityRecord;->setSleeping(Z)V
+PLcom/android/server/am/ActivityRecord;->setSleeping(ZZ)V
+PLcom/android/server/am/ActivityRecord;->setTask(Lcom/android/server/am/TaskRecord;)V
+PLcom/android/server/am/ActivityRecord;->setTask(Lcom/android/server/am/TaskRecord;Z)V
+PLcom/android/server/am/ActivityRecord;->setTaskDescription(Landroid/app/ActivityManager$TaskDescription;)V
+PLcom/android/server/am/ActivityRecord;->setVisibility(Z)V
+PLcom/android/server/am/ActivityRecord;->setVisible(Z)V
+PLcom/android/server/am/ActivityRecord;->shouldBeVisibleIgnoringKeyguard(ZZLcom/android/server/am/ActivityRecord;Z)Z
+PLcom/android/server/am/ActivityRecord;->showStartingWindow(Lcom/android/server/am/ActivityRecord;ZZ)V
+PLcom/android/server/am/ActivityRecord;->showStartingWindow(Lcom/android/server/am/ActivityRecord;ZZZ)V
+PLcom/android/server/am/ActivityRecord;->startFreezingScreenLocked(Lcom/android/server/am/ProcessRecord;I)V
+PLcom/android/server/am/ActivityRecord;->startLaunchTickingLocked()V
+PLcom/android/server/am/ActivityRecord;->stopFreezingScreenLocked(Z)V
+PLcom/android/server/am/ActivityRecord;->supportsPictureInPicture()Z
+PLcom/android/server/am/ActivityRecord;->takeFromHistory()V
+PLcom/android/server/am/ActivityRecord;->toString()Ljava/lang/String;
+PLcom/android/server/am/ActivityRecord;->updateOptionsLocked(Landroid/app/ActivityOptions;)V
+PLcom/android/server/am/ActivityRecord;->updateOverrideConfiguration()V
+PLcom/android/server/am/ActivityRecord;->updateThumbnailLocked(Landroid/graphics/Bitmap;Ljava/lang/CharSequence;)V
+PLcom/android/server/am/ActivityResult;-><init>(Lcom/android/server/am/ActivityRecord;Ljava/lang/String;IILandroid/content/Intent;)V
+PLcom/android/server/am/ActivityStack$ActivityStackHandler;-><init>(Lcom/android/server/am/ActivityStack;Landroid/os/Looper;)V
+PLcom/android/server/am/ActivityStack$ActivityStackHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/am/ActivityStack$ActivityState;-><init>(Ljava/lang/String;I)V
+PLcom/android/server/am/ActivityStack$ActivityState;->values()[Lcom/android/server/am/ActivityStack$ActivityState;
+PLcom/android/server/am/ActivityStack;->-get0()Ljava/lang/String;
+PLcom/android/server/am/ActivityStack;->-getcom-android-server-am-ActivityStack$ActivityStateSwitchesValues()[I
+PLcom/android/server/am/ActivityStack;-><init>(Lcom/android/server/am/ActivityStackSupervisor$ActivityContainer;Lcom/android/server/am/RecentTasks;Z)V
+PLcom/android/server/am/ActivityStack;->activityDestroyedLocked(Landroid/os/IBinder;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityStack;->activityPausedLocked(Landroid/os/IBinder;Z)V
+PLcom/android/server/am/ActivityStack;->addStartingWindowsForVisibleActivities(Z)V
+PLcom/android/server/am/ActivityStack;->addTask(Lcom/android/server/am/TaskRecord;IZLjava/lang/String;)V
+PLcom/android/server/am/ActivityStack;->addTask(Lcom/android/server/am/TaskRecord;ZLjava/lang/String;)V
+PLcom/android/server/am/ActivityStack;->addToStopping(Lcom/android/server/am/ActivityRecord;ZZ)V
+PLcom/android/server/am/ActivityStack;->adjustFocusedActivityStackLocked(Lcom/android/server/am/ActivityRecord;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityStack;->awakeFromSleepingLocked()V
+PLcom/android/server/am/ActivityStack;->canShowWithInsecureKeyguard()Z
+PLcom/android/server/am/ActivityStack;->cancelInitializingActivities()V
+PLcom/android/server/am/ActivityStack;->checkReadyForSleepLocked()Z
+PLcom/android/server/am/ActivityStack;->checkTranslucentActivityWaiting(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStack;->cleanUpActivityLocked(Lcom/android/server/am/ActivityRecord;ZZ)V
+PLcom/android/server/am/ActivityStack;->cleanUpActivityServicesLocked(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStack;->clearLaunchTime(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStack;->closeSystemDialogsLocked()V
+PLcom/android/server/am/ActivityStack;->completePauseLocked(ZLcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStack;->continueUpdateBounds()V
+PLcom/android/server/am/ActivityStack;->createStackWindowController(IZLandroid/graphics/Rect;)Lcom/android/server/wm/StackWindowController;
+PLcom/android/server/am/ActivityStack;->createTaskRecord(ILandroid/content/pm/ActivityInfo;Landroid/content/Intent;Landroid/service/voice/IVoiceInteractionSession;Lcom/android/internal/app/IVoiceInteractor;ZI)Lcom/android/server/am/TaskRecord;
+PLcom/android/server/am/ActivityStack;->destroyActivityLocked(Lcom/android/server/am/ActivityRecord;ZLjava/lang/String;)Z
+PLcom/android/server/am/ActivityStack;->executeAppTransition(Landroid/app/ActivityOptions;)V
+PLcom/android/server/am/ActivityStack;->findActivityLocked(Landroid/content/Intent;Landroid/content/pm/ActivityInfo;Z)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityStack;->findStackInsertIndex(Z)I
+PLcom/android/server/am/ActivityStack;->findTaskLocked(Lcom/android/server/am/ActivityRecord;Lcom/android/server/am/ActivityStackSupervisor$FindTaskResult;)V
+PLcom/android/server/am/ActivityStack;->finishActivityLocked(Lcom/android/server/am/ActivityRecord;ILandroid/content/Intent;Ljava/lang/String;Z)Z
+PLcom/android/server/am/ActivityStack;->finishActivityLocked(Lcom/android/server/am/ActivityRecord;ILandroid/content/Intent;Ljava/lang/String;ZZ)Z
+PLcom/android/server/am/ActivityStack;->finishActivityResultsLocked(Lcom/android/server/am/ActivityRecord;ILandroid/content/Intent;)V
+PLcom/android/server/am/ActivityStack;->finishCurrentActivityLocked(Lcom/android/server/am/ActivityRecord;IZ)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityStack;->finishDisabledPackageActivitiesLocked(Ljava/lang/String;Ljava/util/Set;ZZI)Z
+PLcom/android/server/am/ActivityStack;->getAdjustedPositionForTask(Lcom/android/server/am/TaskRecord;ILcom/android/server/am/ActivityRecord;)I
+PLcom/android/server/am/ActivityStack;->getAllTasks()Ljava/util/ArrayList;
+PLcom/android/server/am/ActivityStack;->getChildCount()I
+PLcom/android/server/am/ActivityStack;->getNextTask(Lcom/android/server/am/TaskRecord;)Lcom/android/server/am/TaskRecord;
+PLcom/android/server/am/ActivityStack;->getParent()Lcom/android/server/am/ConfigurationContainer;
+PLcom/android/server/am/ActivityStack;->getStackId()I
+PLcom/android/server/am/ActivityStack;->getTasksLocked(Ljava/util/List;IZ)V
+PLcom/android/server/am/ActivityStack;->getTopDismissingKeyguardActivity()Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityStack;->getTopStackOnDisplay()Lcom/android/server/am/ActivityStack;
+PLcom/android/server/am/ActivityStack;->getVisibleBehindActivity()Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityStack;->getWindowContainerBounds(Landroid/graphics/Rect;)V
+PLcom/android/server/am/ActivityStack;->getWindowContainerController()Lcom/android/server/wm/StackWindowController;
+PLcom/android/server/am/ActivityStack;->goToSleep()V
+PLcom/android/server/am/ActivityStack;->handleAppDiedLocked(Lcom/android/server/am/ProcessRecord;)Z
+PLcom/android/server/am/ActivityStack;->hasVisibleBehindActivity()Z
+PLcom/android/server/am/ActivityStack;->insertTaskAtTop(Lcom/android/server/am/TaskRecord;Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStack;->isATopFinishingTask(Lcom/android/server/am/TaskRecord;)Z
+PLcom/android/server/am/ActivityStack;->isAssistantStack()Z
+PLcom/android/server/am/ActivityStack;->isAttached()Z
+PLcom/android/server/am/ActivityStack;->isDockedStack()Z
+PLcom/android/server/am/ActivityStack;->isFocusable()Z
+PLcom/android/server/am/ActivityStack;->isHomeOrRecentsStack()Z
+PLcom/android/server/am/ActivityStack;->isHomeStack()Z
+PLcom/android/server/am/ActivityStack;->isInStackLocked(Landroid/os/IBinder;)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityStack;->isInStackLocked(Lcom/android/server/am/ActivityRecord;)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityStack;->isInStackLocked(Lcom/android/server/am/TaskRecord;)Z
+PLcom/android/server/am/ActivityStack;->isOnHomeDisplay()Z
+PLcom/android/server/am/ActivityStack;->isPinnedStack()Z
+PLcom/android/server/am/ActivityStack;->isStackTranslucent(Lcom/android/server/am/ActivityRecord;I)Z
+PLcom/android/server/am/ActivityStack;->isTaskSwitch(Lcom/android/server/am/ActivityRecord;Lcom/android/server/am/ActivityRecord;)Z
+PLcom/android/server/am/ActivityStack;->layoutTaskInStack(Lcom/android/server/am/TaskRecord;Landroid/content/pm/ActivityInfo$WindowLayout;)Z
+PLcom/android/server/am/ActivityStack;->logStartActivity(ILcom/android/server/am/ActivityRecord;Lcom/android/server/am/TaskRecord;)V
+PLcom/android/server/am/ActivityStack;->makeInvisible(Lcom/android/server/am/ActivityRecord;Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStack;->makeVisibleAndRestartIfNeeded(Lcom/android/server/am/ActivityRecord;IZZLcom/android/server/am/ActivityRecord;)Z
+PLcom/android/server/am/ActivityStack;->minimalResumeActivityLocked(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStack;->moveHomeStackTaskToTop()V
+PLcom/android/server/am/ActivityStack;->moveTaskToFrontLocked(Lcom/android/server/am/TaskRecord;ZLandroid/app/ActivityOptions;Lcom/android/server/am/AppTimeTracker;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityStack;->moveToFront(Ljava/lang/String;)V
+PLcom/android/server/am/ActivityStack;->moveToFront(Ljava/lang/String;Lcom/android/server/am/TaskRecord;)V
+PLcom/android/server/am/ActivityStack;->notifyActivityDrawnLocked(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStack;->numActivities()I
+PLcom/android/server/am/ActivityStack;->onActivityRemovedFromStack(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStack;->onLockTaskPackagesUpdatedLocked()V
+PLcom/android/server/am/ActivityStack;->onParentChanged()V
+PLcom/android/server/am/ActivityStack;->postAddTask(Lcom/android/server/am/TaskRecord;Lcom/android/server/am/ActivityStack;Z)V
+PLcom/android/server/am/ActivityStack;->postAddToDisplay(Lcom/android/server/am/ActivityStackSupervisor$ActivityDisplay;Landroid/graphics/Rect;Z)V
+PLcom/android/server/am/ActivityStack;->preAddTask(Lcom/android/server/am/TaskRecord;Ljava/lang/String;Z)Lcom/android/server/am/ActivityStack;
+PLcom/android/server/am/ActivityStack;->prepareActivityHideTransitionAnimation(Lcom/android/server/am/ActivityRecord;I)V
+PLcom/android/server/am/ActivityStack;->rankTaskLayers(I)I
+PLcom/android/server/am/ActivityStack;->removeActivitiesFromLRUListLocked(Lcom/android/server/am/TaskRecord;)V
+PLcom/android/server/am/ActivityStack;->removeActivityFromHistoryLocked(Lcom/android/server/am/ActivityRecord;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityStack;->removeHistoryRecordsForAppLocked(Lcom/android/server/am/ProcessRecord;)Z
+PLcom/android/server/am/ActivityStack;->removeHistoryRecordsForAppLocked(Ljava/util/ArrayList;Lcom/android/server/am/ProcessRecord;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityStack;->removeTask(Lcom/android/server/am/TaskRecord;Ljava/lang/String;I)V
+PLcom/android/server/am/ActivityStack;->removeTimeoutsForActivityLocked(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStack;->requestFinishActivityLocked(Landroid/os/IBinder;ILandroid/content/Intent;Ljava/lang/String;Z)Z
+PLcom/android/server/am/ActivityStack;->resetAffinityTaskIfNeededLocked(Lcom/android/server/am/TaskRecord;Lcom/android/server/am/TaskRecord;ZZI)I
+PLcom/android/server/am/ActivityStack;->resetTargetTaskIfNeededLocked(Lcom/android/server/am/TaskRecord;Z)Landroid/app/ActivityOptions;
+PLcom/android/server/am/ActivityStack;->resetTaskIfNeededLocked(Lcom/android/server/am/ActivityRecord;Lcom/android/server/am/ActivityRecord;)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityStack;->resumeTopActivityInNextFocusableStack(Lcom/android/server/am/ActivityRecord;Landroid/app/ActivityOptions;Ljava/lang/String;)Z
+PLcom/android/server/am/ActivityStack;->resumeTopActivityInnerLocked(Lcom/android/server/am/ActivityRecord;Landroid/app/ActivityOptions;)Z
+PLcom/android/server/am/ActivityStack;->resumeTopActivityUncheckedLocked(Lcom/android/server/am/ActivityRecord;Landroid/app/ActivityOptions;)Z
+PLcom/android/server/am/ActivityStack;->schedulePauseTimeout(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStack;->setLaunchTime(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStack;->setResumedActivityLocked(Lcom/android/server/am/ActivityRecord;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityStack;->startActivityLocked(Lcom/android/server/am/ActivityRecord;Lcom/android/server/am/ActivityRecord;ZZLandroid/app/ActivityOptions;)V
+PLcom/android/server/am/ActivityStack;->startLaunchTraces(Ljava/lang/String;)V
+PLcom/android/server/am/ActivityStack;->startPausingLocked(ZZLcom/android/server/am/ActivityRecord;Z)Z
+PLcom/android/server/am/ActivityStack;->stopActivityLocked(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStack;->stopFullyDrawnTraceIfNeeded()V
+PLcom/android/server/am/ActivityStack;->taskForIdLocked(I)Lcom/android/server/am/TaskRecord;
+PLcom/android/server/am/ActivityStack;->topActivity()Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityStack;->topActivityOccludesKeyguard()Z
+PLcom/android/server/am/ActivityStack;->topRunningNonDelayedActivityLocked(Lcom/android/server/am/ActivityRecord;)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityStack;->topTask()Lcom/android/server/am/TaskRecord;
+PLcom/android/server/am/ActivityStack;->updateBehindFullscreen(ZZLcom/android/server/am/TaskRecord;Lcom/android/server/am/ActivityRecord;)Z
+PLcom/android/server/am/ActivityStack;->updateLRUListLocked(Lcom/android/server/am/ActivityRecord;)Z
+PLcom/android/server/am/ActivityStack;->updateTaskMovement(Lcom/android/server/am/TaskRecord;Z)V
+PLcom/android/server/am/ActivityStack;->updateTaskReturnToForTopInsertion(Lcom/android/server/am/TaskRecord;)V
+PLcom/android/server/am/ActivityStack;->updateTransitLocked(ILandroid/app/ActivityOptions;)V
+PLcom/android/server/am/ActivityStackSupervisor$ActivityContainer;-><init>(Lcom/android/server/am/ActivityStackSupervisor;ILcom/android/server/am/ActivityStackSupervisor$ActivityDisplay;Z)V
+PLcom/android/server/am/ActivityStackSupervisor$ActivityContainer;->createStack(IZ)V
+PLcom/android/server/am/ActivityStackSupervisor$ActivityContainer;->getDisplayId()I
+PLcom/android/server/am/ActivityStackSupervisor$ActivityContainer;->getOuter()Lcom/android/server/am/ActivityStackSupervisor;
+PLcom/android/server/am/ActivityStackSupervisor$ActivityContainer;->isAttachedLocked()Z
+PLcom/android/server/am/ActivityStackSupervisor$ActivityContainer;->isEligibleForNewTasks()Z
+PLcom/android/server/am/ActivityStackSupervisor$ActivityContainer;->setDrawn()V
+PLcom/android/server/am/ActivityStackSupervisor$ActivityDisplay;-><init>(Lcom/android/server/am/ActivityStackSupervisor;I)V
+PLcom/android/server/am/ActivityStackSupervisor$ActivityDisplay;->attachStack(Lcom/android/server/am/ActivityStack;I)V
+PLcom/android/server/am/ActivityStackSupervisor$ActivityDisplay;->getChildAt(I)Lcom/android/server/am/ConfigurationContainer;
+PLcom/android/server/am/ActivityStackSupervisor$ActivityDisplay;->getChildCount()I
+PLcom/android/server/am/ActivityStackSupervisor$ActivityDisplay;->getParent()Lcom/android/server/am/ConfigurationContainer;
+PLcom/android/server/am/ActivityStackSupervisor$ActivityDisplay;->hasVisibleBehindActivity()Z
+PLcom/android/server/am/ActivityStackSupervisor$ActivityDisplay;->init(Landroid/view/Display;)V
+PLcom/android/server/am/ActivityStackSupervisor$ActivityDisplay;->isPrivate()Z
+PLcom/android/server/am/ActivityStackSupervisor$ActivityStackSupervisorHandler;->activityIdleInternal(Lcom/android/server/am/ActivityRecord;Z)V
+PLcom/android/server/am/ActivityStackSupervisor$ActivityStackSupervisorHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/am/ActivityStackSupervisor;->-get0()Ljava/lang/String;
+PLcom/android/server/am/ActivityStackSupervisor;->-get5(Lcom/android/server/am/ActivityStackSupervisor;)Lcom/android/server/am/RecentTasks;
+PLcom/android/server/am/ActivityStackSupervisor;->-wrap4(Lcom/android/server/am/ActivityStackSupervisor;I)V
+PLcom/android/server/am/ActivityStackSupervisor;->acquireLaunchWakelock()V
+PLcom/android/server/am/ActivityStackSupervisor;->activityIdleInternalLocked(Landroid/os/IBinder;ZZLandroid/content/res/Configuration;)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityStackSupervisor;->activitySleptLocked(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStackSupervisor;->addStartingWindowsForVisibleActivities(Z)V
+PLcom/android/server/am/ActivityStackSupervisor;->allPausedActivitiesComplete()Z
+PLcom/android/server/am/ActivityStackSupervisor;->allResumedActivitiesComplete()Z
+PLcom/android/server/am/ActivityStackSupervisor;->allResumedActivitiesIdle()Z
+PLcom/android/server/am/ActivityStackSupervisor;->allResumedActivitiesVisible()Z
+PLcom/android/server/am/ActivityStackSupervisor;->anyTaskForIdLocked(I)Lcom/android/server/am/TaskRecord;
+PLcom/android/server/am/ActivityStackSupervisor;->anyTaskForIdLocked(III)Lcom/android/server/am/TaskRecord;
+PLcom/android/server/am/ActivityStackSupervisor;->attachApplicationLocked(Lcom/android/server/am/ProcessRecord;)Z
+PLcom/android/server/am/ActivityStackSupervisor;->calculateDefaultMinimalSizeOfResizeableTasks(Lcom/android/server/am/ActivityStackSupervisor$ActivityDisplay;)V
+PLcom/android/server/am/ActivityStackSupervisor;->canUseActivityOptionsLaunchBounds(Landroid/app/ActivityOptions;I)Z
+PLcom/android/server/am/ActivityStackSupervisor;->cancelInitializingActivities()V
+PLcom/android/server/am/ActivityStackSupervisor;->checkActivityBelongsInStack(Lcom/android/server/am/ActivityRecord;Lcom/android/server/am/ActivityStack;)Z
+PLcom/android/server/am/ActivityStackSupervisor;->checkFinishBootingLocked()Z
+PLcom/android/server/am/ActivityStackSupervisor;->checkReadyForSleepLocked()V
+PLcom/android/server/am/ActivityStackSupervisor;->checkStartAnyActivityPermission(Landroid/content/Intent;Landroid/content/pm/ActivityInfo;Ljava/lang/String;IIILjava/lang/String;ZLcom/android/server/am/ProcessRecord;Lcom/android/server/am/ActivityRecord;Lcom/android/server/am/ActivityStack;Landroid/app/ActivityOptions;)Z
+PLcom/android/server/am/ActivityStackSupervisor;->cleanUpRemovedTaskLocked(Lcom/android/server/am/TaskRecord;ZZ)V
+PLcom/android/server/am/ActivityStackSupervisor;->cleanupActivity(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStackSupervisor;->closeSystemDialogsLocked()V
+PLcom/android/server/am/ActivityStackSupervisor;->comeOutOfSleepIfNeededLocked()V
+PLcom/android/server/am/ActivityStackSupervisor;->continueUpdateBounds(I)V
+PLcom/android/server/am/ActivityStackSupervisor;->createStackOnDisplay(IIZ)Lcom/android/server/am/ActivityStack;
+PLcom/android/server/am/ActivityStackSupervisor;->ensureActivitiesVisibleLocked(Lcom/android/server/am/ActivityRecord;IZ)V
+PLcom/android/server/am/ActivityStackSupervisor;->findActivityLocked(Landroid/content/Intent;Landroid/content/pm/ActivityInfo;Z)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityStackSupervisor;->findTaskLocked(Lcom/android/server/am/ActivityRecord;I)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityStackSupervisor;->findTaskToMoveToFrontLocked(Lcom/android/server/am/TaskRecord;ILandroid/app/ActivityOptions;Ljava/lang/String;Z)V
+PLcom/android/server/am/ActivityStackSupervisor;->finishDisabledPackageActivitiesLocked(Ljava/lang/String;Ljava/util/Set;ZZI)Z
+PLcom/android/server/am/ActivityStackSupervisor;->getActionRestrictionForCallingPackage(Ljava/lang/String;Ljava/lang/String;II)I
+PLcom/android/server/am/ActivityStackSupervisor;->getActivityDisplayOrCreateLocked(I)Lcom/android/server/am/ActivityStackSupervisor$ActivityDisplay;
+PLcom/android/server/am/ActivityStackSupervisor;->getAllStackInfosLocked()Ljava/util/ArrayList;
+PLcom/android/server/am/ActivityStackSupervisor;->getChildAt(I)Lcom/android/server/am/ActivityStackSupervisor$ActivityDisplay;
+PLcom/android/server/am/ActivityStackSupervisor;->getChildAt(I)Lcom/android/server/am/ConfigurationContainer;
+PLcom/android/server/am/ActivityStackSupervisor;->getComponentRestrictionForCallingPackage(Landroid/content/pm/ActivityInfo;Ljava/lang/String;IIZ)I
+PLcom/android/server/am/ActivityStackSupervisor;->getDisplayOverrideConfiguration(I)Landroid/content/res/Configuration;
+PLcom/android/server/am/ActivityStackSupervisor;->getFocusedStack()Lcom/android/server/am/ActivityStack;
+PLcom/android/server/am/ActivityStackSupervisor;->getHomeActivity()Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityStackSupervisor;->getHomeActivityForUser(I)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityStackSupervisor;->getLastStack()Lcom/android/server/am/ActivityStack;
+PLcom/android/server/am/ActivityStackSupervisor;->getLockTaskModeState()I
+PLcom/android/server/am/ActivityStackSupervisor;->getLockedTaskLocked()Lcom/android/server/am/TaskRecord;
+PLcom/android/server/am/ActivityStackSupervisor;->getNextTaskIdForUserLocked(I)I
+PLcom/android/server/am/ActivityStackSupervisor;->getStack(I)Lcom/android/server/am/ActivityStack;
+PLcom/android/server/am/ActivityStackSupervisor;->getStack(IZZ)Lcom/android/server/am/ActivityStack;
+PLcom/android/server/am/ActivityStackSupervisor;->getStackInfoLocked(I)Landroid/app/ActivityManager$StackInfo;
+PLcom/android/server/am/ActivityStackSupervisor;->getStackInfoLocked(Lcom/android/server/am/ActivityStack;)Landroid/app/ActivityManager$StackInfo;
+PLcom/android/server/am/ActivityStackSupervisor;->getStacksOnDefaultDisplay()Ljava/util/ArrayList;
+PLcom/android/server/am/ActivityStackSupervisor;->getTasksLocked(ILjava/util/List;IZ)V
+PLcom/android/server/am/ActivityStackSupervisor;->goingToSleepLocked()V
+PLcom/android/server/am/ActivityStackSupervisor;->handleAppDiedLocked(Lcom/android/server/am/ProcessRecord;)Z
+PLcom/android/server/am/ActivityStackSupervisor;->handleDisplayChanged(I)V
+PLcom/android/server/am/ActivityStackSupervisor;->handleNonResizableTaskIfNeeded(Lcom/android/server/am/TaskRecord;III)V
+PLcom/android/server/am/ActivityStackSupervisor;->handleNonResizableTaskIfNeeded(Lcom/android/server/am/TaskRecord;IIIZ)V
+PLcom/android/server/am/ActivityStackSupervisor;->invalidateTaskLayers()V
+PLcom/android/server/am/ActivityStackSupervisor;->isCurrentProfileLocked(I)Z
+PLcom/android/server/am/ActivityStackSupervisor;->isDisplayAdded(I)Z
+PLcom/android/server/am/ActivityStackSupervisor;->isFocusedStack(Lcom/android/server/am/ActivityStack;)Z
+PLcom/android/server/am/ActivityStackSupervisor;->isFrontOfStackList(Lcom/android/server/am/ActivityStack;Ljava/util/List;)Z
+PLcom/android/server/am/ActivityStackSupervisor;->isFrontStackOnDisplay(Lcom/android/server/am/ActivityStack;)Z
+PLcom/android/server/am/ActivityStackSupervisor;->isInAnyStackLocked(Landroid/os/IBinder;)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityStackSupervisor;->isLastLockedTask(Lcom/android/server/am/TaskRecord;)Z
+PLcom/android/server/am/ActivityStackSupervisor;->isLockTaskModeViolation(Lcom/android/server/am/TaskRecord;)Z
+PLcom/android/server/am/ActivityStackSupervisor;->isLockTaskModeViolation(Lcom/android/server/am/TaskRecord;Z)Z
+PLcom/android/server/am/ActivityStackSupervisor;->isStackDockedInEffect(I)Z
+PLcom/android/server/am/ActivityStackSupervisor;->isStoppingNoHistoryActivity()Z
+PLcom/android/server/am/ActivityStackSupervisor;->logIfTransactionTooLarge(Landroid/content/Intent;Landroid/os/Bundle;)V
+PLcom/android/server/am/ActivityStackSupervisor;->logStackState()V
+PLcom/android/server/am/ActivityStackSupervisor;->moveFocusableActivityStackToFrontLocked(Lcom/android/server/am/ActivityRecord;Ljava/lang/String;)Z
+PLcom/android/server/am/ActivityStackSupervisor;->moveHomeStackTaskToTop(Ljava/lang/String;)Z
+PLcom/android/server/am/ActivityStackSupervisor;->moveHomeStackToFront(Ljava/lang/String;)V
+PLcom/android/server/am/ActivityStackSupervisor;->nextTaskIdForUser(II)I
+PLcom/android/server/am/ActivityStackSupervisor;->notifyAppTransitionDone()V
+PLcom/android/server/am/ActivityStackSupervisor;->onDisplayChanged(I)V
+PLcom/android/server/am/ActivityStackSupervisor;->onLockTaskPackagesUpdatedLocked()V
+PLcom/android/server/am/ActivityStackSupervisor;->pauseBackStacks(ZLcom/android/server/am/ActivityRecord;Z)Z
+PLcom/android/server/am/ActivityStackSupervisor;->pauseChildStacks(Lcom/android/server/am/ActivityRecord;ZZLcom/android/server/am/ActivityRecord;Z)V
+PLcom/android/server/am/ActivityStackSupervisor;->processStoppingActivitiesLocked(Lcom/android/server/am/ActivityRecord;ZZ)Ljava/util/ArrayList;
+PLcom/android/server/am/ActivityStackSupervisor;->rankTaskLayersIfNeeded()V
+PLcom/android/server/am/ActivityStackSupervisor;->realStartActivityLocked(Lcom/android/server/am/ActivityRecord;Lcom/android/server/am/ProcessRecord;ZZ)Z
+PLcom/android/server/am/ActivityStackSupervisor;->removeChildActivityContainers(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStackSupervisor;->removeLockedTaskLocked(Lcom/android/server/am/TaskRecord;)V
+PLcom/android/server/am/ActivityStackSupervisor;->removeSleepTimeouts()V
+PLcom/android/server/am/ActivityStackSupervisor;->removeTaskByIdLocked(IZZ)Z
+PLcom/android/server/am/ActivityStackSupervisor;->removeTaskByIdLocked(IZZZ)Z
+PLcom/android/server/am/ActivityStackSupervisor;->removeTimeoutsForActivityLocked(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStackSupervisor;->reportActivityLaunchedLocked(ZLcom/android/server/am/ActivityRecord;JJ)V
+PLcom/android/server/am/ActivityStackSupervisor;->reportActivityVisibleLocked(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStackSupervisor;->reportResumedActivityLocked(Lcom/android/server/am/ActivityRecord;)Z
+PLcom/android/server/am/ActivityStackSupervisor;->resolveActivity(Landroid/content/Intent;Landroid/content/pm/ResolveInfo;ILandroid/app/ProfilerInfo;)Landroid/content/pm/ActivityInfo;
+PLcom/android/server/am/ActivityStackSupervisor;->resolveIntent(Landroid/content/Intent;Ljava/lang/String;I)Landroid/content/pm/ResolveInfo;
+PLcom/android/server/am/ActivityStackSupervisor;->resolveIntent(Landroid/content/Intent;Ljava/lang/String;II)Landroid/content/pm/ResolveInfo;
+PLcom/android/server/am/ActivityStackSupervisor;->resumeFocusedStackTopActivityLocked()Z
+PLcom/android/server/am/ActivityStackSupervisor;->resumeFocusedStackTopActivityLocked(Lcom/android/server/am/ActivityStack;Lcom/android/server/am/ActivityRecord;Landroid/app/ActivityOptions;)Z
+PLcom/android/server/am/ActivityStackSupervisor;->resumeHomeStackTask(Lcom/android/server/am/ActivityRecord;Ljava/lang/String;)Z
+PLcom/android/server/am/ActivityStackSupervisor;->scheduleIdleLocked()V
+PLcom/android/server/am/ActivityStackSupervisor;->scheduleIdleTimeoutLocked(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStackSupervisor;->scheduleResumeTopActivities()V
+PLcom/android/server/am/ActivityStackSupervisor;->scheduleSleepTimeout()V
+PLcom/android/server/am/ActivityStackSupervisor;->sendWaitingVisibleReportLocked(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStackSupervisor;->setDisplayOverrideConfiguration(Landroid/content/res/Configuration;I)V
+PLcom/android/server/am/ActivityStackSupervisor;->setDockedStackMinimized(Z)V
+PLcom/android/server/am/ActivityStackSupervisor;->setFocusStackUnchecked(Ljava/lang/String;Lcom/android/server/am/ActivityStack;)V
+PLcom/android/server/am/ActivityStackSupervisor;->setLaunchSource(I)V
+PLcom/android/server/am/ActivityStackSupervisor;->setNextTaskIdForUserLocked(II)V
+PLcom/android/server/am/ActivityStackSupervisor;->setWindowManager(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/am/ActivityStackSupervisor;->startActivityFromRecentsInner(ILandroid/os/Bundle;)I
+PLcom/android/server/am/ActivityStackSupervisor;->startSpecificActivityLocked(Lcom/android/server/am/ActivityRecord;ZZ)V
+PLcom/android/server/am/ActivityStackSupervisor;->topRunningActivityLocked()Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityStackSupervisor;->updatePreviousProcessLocked(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStackSupervisor;->updateUIDsPresentOnDisplay()V
+PLcom/android/server/am/ActivityStackSupervisor;->updateUserStackLocked(ILcom/android/server/am/ActivityStack;)V
+PLcom/android/server/am/ActivityStartInterceptor;->intercept(Landroid/content/Intent;Landroid/content/pm/ResolveInfo;Landroid/content/pm/ActivityInfo;Ljava/lang/String;Lcom/android/server/am/TaskRecord;IILandroid/app/ActivityOptions;)V
+PLcom/android/server/am/ActivityStartInterceptor;->interceptQuietProfileIfNeeded()Z
+PLcom/android/server/am/ActivityStartInterceptor;->interceptSuspendPackageIfNeed()Z
+PLcom/android/server/am/ActivityStartInterceptor;->interceptWithConfirmCredentialsIfNeeded(Landroid/content/Intent;Ljava/lang/String;Landroid/content/pm/ActivityInfo;Ljava/lang/String;I)Landroid/content/Intent;
+PLcom/android/server/am/ActivityStartInterceptor;->interceptWorkProfileChallengeIfNeeded()Z
+PLcom/android/server/am/ActivityStartInterceptor;->setStates(IIIILjava/lang/String;)V
+PLcom/android/server/am/ActivityStarter;->addOrReparentStartingActivity(Lcom/android/server/am/TaskRecord;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityStarter;->adjustLaunchFlagsToDocumentMode(Lcom/android/server/am/ActivityRecord;ZZI)I
+PLcom/android/server/am/ActivityStarter;->canLaunchIntoFocusedStack(Lcom/android/server/am/ActivityRecord;Z)Z
+PLcom/android/server/am/ActivityStarter;->clearPendingActivityLaunchesLocked(Ljava/lang/String;)Z
+PLcom/android/server/am/ActivityStarter;->computeLaunchingTaskFlags()V
+PLcom/android/server/am/ActivityStarter;->computeSourceStack()V
+PLcom/android/server/am/ActivityStarter;->computeStackFocus(Lcom/android/server/am/ActivityRecord;ZLandroid/graphics/Rect;ILandroid/app/ActivityOptions;)Lcom/android/server/am/ActivityStack;
+PLcom/android/server/am/ActivityStarter;->doPendingActivityLaunchesLocked(Z)V
+PLcom/android/server/am/ActivityStarter;->getLaunchStack(Lcom/android/server/am/ActivityRecord;ILcom/android/server/am/TaskRecord;Landroid/app/ActivityOptions;)Lcom/android/server/am/ActivityStack;
+PLcom/android/server/am/ActivityStarter;->getOverrideBounds(Lcom/android/server/am/ActivityRecord;Landroid/app/ActivityOptions;Lcom/android/server/am/TaskRecord;)Landroid/graphics/Rect;
+PLcom/android/server/am/ActivityStarter;->getReusableIntentActivity()Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityStarter;->getSourceDisplayId(Lcom/android/server/am/ActivityRecord;Lcom/android/server/am/ActivityRecord;)I
+PLcom/android/server/am/ActivityStarter;->isDocumentLaunchesIntoExisting(I)Z
+PLcom/android/server/am/ActivityStarter;->isValidLaunchStackId(IILcom/android/server/am/ActivityRecord;)Z
+PLcom/android/server/am/ActivityStarter;->postStartActivityProcessing(Lcom/android/server/am/ActivityRecord;IILcom/android/server/am/ActivityRecord;Lcom/android/server/am/ActivityStack;)V
+PLcom/android/server/am/ActivityStarter;->reset()V
+PLcom/android/server/am/ActivityStarter;->resumeTargetStackIfNeeded()V
+PLcom/android/server/am/ActivityStarter;->sendNewTaskResultRequestIfNeeded()V
+PLcom/android/server/am/ActivityStarter;->sendPowerHintForLaunchEndIfNeeded()V
+PLcom/android/server/am/ActivityStarter;->sendPowerHintForLaunchStartIfNeeded(Z)V
+PLcom/android/server/am/ActivityStarter;->setInitialState(Lcom/android/server/am/ActivityRecord;Landroid/app/ActivityOptions;Lcom/android/server/am/TaskRecord;ZILcom/android/server/am/ActivityRecord;Landroid/service/voice/IVoiceInteractionSession;Lcom/android/internal/app/IVoiceInteractor;)V
+PLcom/android/server/am/ActivityStarter;->setTargetStackAndMoveToFrontIfNeeded(Lcom/android/server/am/ActivityRecord;)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityStarter;->setTaskFromIntentActivity(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStarter;->setTaskFromReuseOrCreateNewTask(Lcom/android/server/am/TaskRecord;ILcom/android/server/am/ActivityStack;)I
+PLcom/android/server/am/ActivityStarter;->setTaskFromSourceRecord()I
+PLcom/android/server/am/ActivityStarter;->setWindowManager(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/am/ActivityStarter;->startActivity(Lcom/android/server/am/ActivityRecord;Lcom/android/server/am/ActivityRecord;Landroid/service/voice/IVoiceInteractionSession;Lcom/android/internal/app/IVoiceInteractor;IZLandroid/app/ActivityOptions;Lcom/android/server/am/TaskRecord;[Lcom/android/server/am/ActivityRecord;)I
+PLcom/android/server/am/ActivityStarter;->startActivityLocked(Landroid/app/IApplicationThread;Landroid/content/Intent;Landroid/content/Intent;Ljava/lang/String;Landroid/content/pm/ActivityInfo;Landroid/content/pm/ResolveInfo;Landroid/service/voice/IVoiceInteractionSession;Lcom/android/internal/app/IVoiceInteractor;Landroid/os/IBinder;Ljava/lang/String;IIILjava/lang/String;IIILandroid/app/ActivityOptions;ZZ[Lcom/android/server/am/ActivityRecord;Lcom/android/server/am/ActivityStackSupervisor$ActivityContainer;Lcom/android/server/am/TaskRecord;)I
+PLcom/android/server/am/ActivityStarter;->startActivityMayWait(Landroid/app/IApplicationThread;ILjava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/service/voice/IVoiceInteractionSession;Lcom/android/internal/app/IVoiceInteractor;Landroid/os/IBinder;Ljava/lang/String;IILandroid/app/ProfilerInfo;Landroid/app/WaitResult;Landroid/content/res/Configuration;Landroid/os/Bundle;ZILandroid/app/IActivityContainer;Lcom/android/server/am/TaskRecord;)I
+PLcom/android/server/am/ActivityStarter;->startActivityUnchecked(Lcom/android/server/am/ActivityRecord;Lcom/android/server/am/ActivityRecord;Landroid/service/voice/IVoiceInteractionSession;Lcom/android/internal/app/IVoiceInteractor;IZLandroid/app/ActivityOptions;Lcom/android/server/am/TaskRecord;[Lcom/android/server/am/ActivityRecord;)I
+PLcom/android/server/am/ActivityStarter;->startHomeActivityLocked(Landroid/content/Intent;Landroid/content/pm/ActivityInfo;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityStarter;->updateTaskReturnToType(Lcom/android/server/am/TaskRecord;ILcom/android/server/am/ActivityStack;)V
+PLcom/android/server/am/AppBindRecord;-><init>(Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/IntentBindRecord;Lcom/android/server/am/ProcessRecord;)V
+PLcom/android/server/am/AppErrors;->isBadProcessLocked(Landroid/content/pm/ApplicationInfo;)Z
+PLcom/android/server/am/AppErrors;->loadAppsNotReportingCrashesFromConfigLocked(Ljava/lang/String;)V
+PLcom/android/server/am/AppErrors;->resetProcessCrashTimeLocked(Landroid/content/pm/ApplicationInfo;)V
+PLcom/android/server/am/AppErrors;->resetProcessCrashTimeLocked(ZII)V
+PLcom/android/server/am/BatteryExternalStatsWorker;->extractDeltaLocked(Landroid/net/wifi/WifiActivityEnergyInfo;)Landroid/net/wifi/WifiActivityEnergyInfo;
+PLcom/android/server/am/BatteryExternalStatsWorker;->scheduleCpuSyncDueToRemovedUid(I)Ljava/util/concurrent/Future;
+PLcom/android/server/am/BatteryExternalStatsWorker;->scheduleRunnable(Ljava/lang/Runnable;)V
+PLcom/android/server/am/BatteryExternalStatsWorker;->scheduleSync(Ljava/lang/String;I)Ljava/util/concurrent/Future;
+PLcom/android/server/am/BatteryStatsService;->addIsolatedUid(II)V
+PLcom/android/server/am/BatteryStatsService;->awaitUninterruptibly(Ljava/util/concurrent/Future;)V
+PLcom/android/server/am/BatteryStatsService;->getPlatformLowPowerStats()Ljava/lang/String;
+PLcom/android/server/am/BatteryStatsService;->getService()Lcom/android/internal/app/IBatteryStats;
+PLcom/android/server/am/BatteryStatsService;->getStatistics()[B
+PLcom/android/server/am/BatteryStatsService;->getSubsystemLowPowerStats()Ljava/lang/String;
+PLcom/android/server/am/BatteryStatsService;->isCharging()Z
+PLcom/android/server/am/BatteryStatsService;->isOnBattery()Z
+PLcom/android/server/am/BatteryStatsService;->lambda$-com_android_server_am_BatteryStatsService_30585(IIIIIIII)V
+PLcom/android/server/am/BatteryStatsService;->noteAlarmFinish(Ljava/lang/String;I)V
+PLcom/android/server/am/BatteryStatsService;->noteAlarmStart(Ljava/lang/String;I)V
+PLcom/android/server/am/BatteryStatsService;->noteBleScanResults(Landroid/os/WorkSource;I)V
+PLcom/android/server/am/BatteryStatsService;->noteBleScanStarted(Landroid/os/WorkSource;Z)V
+PLcom/android/server/am/BatteryStatsService;->noteBleScanStopped(Landroid/os/WorkSource;)V
+PLcom/android/server/am/BatteryStatsService;->noteChangeWakelockFromSource(Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;ILandroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;IZ)V
+PLcom/android/server/am/BatteryStatsService;->noteConnectivityChanged(ILjava/lang/String;)V
+PLcom/android/server/am/BatteryStatsService;->noteEvent(ILjava/lang/String;I)V
+PLcom/android/server/am/BatteryStatsService;->noteFullWifiLockAcquiredFromSource(Landroid/os/WorkSource;)V
+PLcom/android/server/am/BatteryStatsService;->noteFullWifiLockReleasedFromSource(Landroid/os/WorkSource;)V
+PLcom/android/server/am/BatteryStatsService;->noteInteractive(Z)V
+PLcom/android/server/am/BatteryStatsService;->noteJobFinish(Ljava/lang/String;I)V
+PLcom/android/server/am/BatteryStatsService;->noteJobStart(Ljava/lang/String;I)V
+PLcom/android/server/am/BatteryStatsService;->noteLongPartialWakelockFinish(Ljava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/am/BatteryStatsService;->noteLongPartialWakelockStart(Ljava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/am/BatteryStatsService;->noteNetworkInterfaceType(Ljava/lang/String;I)V
+PLcom/android/server/am/BatteryStatsService;->noteNetworkStatsEnabled()V
+PLcom/android/server/am/BatteryStatsService;->notePackageInstalled(Ljava/lang/String;I)V
+PLcom/android/server/am/BatteryStatsService;->notePhoneSignalStrength(Landroid/telephony/SignalStrength;)V
+PLcom/android/server/am/BatteryStatsService;->notePhoneState(I)V
+PLcom/android/server/am/BatteryStatsService;->noteProcessFinish(Ljava/lang/String;I)V
+PLcom/android/server/am/BatteryStatsService;->noteProcessStart(Ljava/lang/String;I)V
+PLcom/android/server/am/BatteryStatsService;->noteResetBleScan()V
+PLcom/android/server/am/BatteryStatsService;->noteScreenBrightness(I)V
+PLcom/android/server/am/BatteryStatsService;->noteScreenState(I)V
+PLcom/android/server/am/BatteryStatsService;->noteStartAudio(I)V
+PLcom/android/server/am/BatteryStatsService;->noteStartCamera(I)V
+PLcom/android/server/am/BatteryStatsService;->noteStartGps(I)V
+PLcom/android/server/am/BatteryStatsService;->noteStartSensor(II)V
+PLcom/android/server/am/BatteryStatsService;->noteStartVideo(I)V
+PLcom/android/server/am/BatteryStatsService;->noteStartWakelockFromSource(Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;IZ)V
+PLcom/android/server/am/BatteryStatsService;->noteStopAudio(I)V
+PLcom/android/server/am/BatteryStatsService;->noteStopCamera(I)V
+PLcom/android/server/am/BatteryStatsService;->noteStopGps(I)V
+PLcom/android/server/am/BatteryStatsService;->noteStopSensor(II)V
+PLcom/android/server/am/BatteryStatsService;->noteStopWakelockFromSource(Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/am/BatteryStatsService;->noteSyncFinish(Ljava/lang/String;I)V
+PLcom/android/server/am/BatteryStatsService;->noteSyncStart(Ljava/lang/String;I)V
+PLcom/android/server/am/BatteryStatsService;->noteUidProcessState(II)V
+PLcom/android/server/am/BatteryStatsService;->noteUserActivity(II)V
+PLcom/android/server/am/BatteryStatsService;->noteVibratorOff(I)V
+PLcom/android/server/am/BatteryStatsService;->noteVibratorOn(IJ)V
+PLcom/android/server/am/BatteryStatsService;->noteWifiMulticastDisabled(I)V
+PLcom/android/server/am/BatteryStatsService;->noteWifiMulticastEnabled(I)V
+PLcom/android/server/am/BatteryStatsService;->noteWifiOff()V
+PLcom/android/server/am/BatteryStatsService;->noteWifiOn()V
+PLcom/android/server/am/BatteryStatsService;->noteWifiRadioPowerState(IJI)V
+PLcom/android/server/am/BatteryStatsService;->noteWifiRssiChanged(I)V
+PLcom/android/server/am/BatteryStatsService;->noteWifiRunning(Landroid/os/WorkSource;)V
+PLcom/android/server/am/BatteryStatsService;->noteWifiScanStartedFromSource(Landroid/os/WorkSource;)V
+PLcom/android/server/am/BatteryStatsService;->noteWifiScanStoppedFromSource(Landroid/os/WorkSource;)V
+PLcom/android/server/am/BatteryStatsService;->noteWifiState(ILjava/lang/String;)V
+PLcom/android/server/am/BatteryStatsService;->noteWifiSupplicantStateChanged(IZ)V
+PLcom/android/server/am/BatteryStatsService;->removeIsolatedUid(II)V
+PLcom/android/server/am/BatteryStatsService;->setBatteryState(IIIIIIII)V
+PLcom/android/server/am/BroadcastFilter;-><init>(Landroid/content/IntentFilter;Lcom/android/server/am/ReceiverList;Ljava/lang/String;Ljava/lang/String;IIZZ)V
+PLcom/android/server/am/BroadcastFilter;->toString()Ljava/lang/String;
+PLcom/android/server/am/BroadcastQueue$BroadcastHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/am/BroadcastQueue;->backgroundServicesFinishedLocked(I)V
+PLcom/android/server/am/BroadcastQueue;->broadcastTimeoutLocked(Z)V
+PLcom/android/server/am/BroadcastQueue;->cancelBroadcastTimeoutLocked()V
+PLcom/android/server/am/BroadcastQueue;->cleanupDisabledPackageReceiversLocked(Ljava/lang/String;Ljava/util/Set;IZ)Z
+PLcom/android/server/am/BroadcastQueue;->enqueueOrderedBroadcastLocked(Lcom/android/server/am/BroadcastRecord;)V
+PLcom/android/server/am/BroadcastQueue;->enqueueParallelBroadcastLocked(Lcom/android/server/am/BroadcastRecord;)V
+PLcom/android/server/am/BroadcastQueue;->getMatchingOrderedReceiver(Landroid/os/IBinder;)Lcom/android/server/am/BroadcastRecord;
+PLcom/android/server/am/BroadcastQueue;->isPendingBroadcastProcessLocked(I)Z
+PLcom/android/server/am/BroadcastQueue;->isSignaturePerm([Ljava/lang/String;)Z
+PLcom/android/server/am/BroadcastQueue;->performReceiveLocked(Lcom/android/server/am/ProcessRecord;Landroid/content/IIntentReceiver;Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;ZZI)V
+PLcom/android/server/am/BroadcastQueue;->replaceBroadcastLocked(Ljava/util/ArrayList;Lcom/android/server/am/BroadcastRecord;Ljava/lang/String;)Lcom/android/server/am/BroadcastRecord;
+PLcom/android/server/am/BroadcastQueue;->replaceOrderedBroadcastLocked(Lcom/android/server/am/BroadcastRecord;)Lcom/android/server/am/BroadcastRecord;
+PLcom/android/server/am/BroadcastQueue;->replaceParallelBroadcastLocked(Lcom/android/server/am/BroadcastRecord;)Lcom/android/server/am/BroadcastRecord;
+PLcom/android/server/am/BroadcastQueue;->ringAdvance(III)I
+PLcom/android/server/am/BroadcastQueue;->scheduleBroadcastsLocked()V
+PLcom/android/server/am/BroadcastQueue;->sendPendingBroadcastsLocked(Lcom/android/server/am/ProcessRecord;)Z
+PLcom/android/server/am/BroadcastQueue;->setBroadcastTimeoutLocked(J)V
+PLcom/android/server/am/BroadcastQueue;->skipCurrentReceiverLocked(Lcom/android/server/am/ProcessRecord;)V
+PLcom/android/server/am/BroadcastRecord;-><init>(Lcom/android/server/am/BroadcastQueue;Landroid/content/Intent;Lcom/android/server/am/ProcessRecord;Ljava/lang/String;IIZLjava/lang/String;[Ljava/lang/String;ILandroid/app/BroadcastOptions;Ljava/util/List;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;ZZZI)V
+PLcom/android/server/am/BroadcastStats$1;-><init>()V
+PLcom/android/server/am/BroadcastStats$ActionEntry;-><init>(Ljava/lang/String;)V
+PLcom/android/server/am/BroadcastStats$PackageEntry;-><init>()V
+PLcom/android/server/am/BroadcastStats$ViolationEntry;-><init>()V
+PLcom/android/server/am/BroadcastStats;-><init>()V
+PLcom/android/server/am/BroadcastStats;->addBackgroundCheckViolation(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/am/BroadcastStats;->addBroadcast(Ljava/lang/String;Ljava/lang/String;IIJ)V
+PLcom/android/server/am/CompatModePackages;->getPackageFlags(Ljava/lang/String;)I
+PLcom/android/server/am/CompatModePackages;->handlePackageAddedLocked(Ljava/lang/String;Z)V
+PLcom/android/server/am/ConfigurationContainer;->getConfiguration()Landroid/content/res/Configuration;
+PLcom/android/server/am/ConfigurationContainer;->getMergedOverrideConfiguration()Landroid/content/res/Configuration;
+PLcom/android/server/am/ConfigurationContainer;->getOverrideConfiguration()Landroid/content/res/Configuration;
+PLcom/android/server/am/ConfigurationContainer;->onMergedOverrideConfigurationChanged()V
+PLcom/android/server/am/ConfigurationContainer;->onOverrideConfigurationChanged(Landroid/content/res/Configuration;)V
+PLcom/android/server/am/ConfigurationContainer;->onParentChanged()V
+PLcom/android/server/am/ConnectionRecord;-><init>(Lcom/android/server/am/AppBindRecord;Lcom/android/server/am/ActivityRecord;Landroid/app/IServiceConnection;IILandroid/app/PendingIntent;)V
+PLcom/android/server/am/ContentProviderRecord;-><init>(Lcom/android/server/am/ActivityManagerService;Landroid/content/pm/ProviderInfo;Landroid/content/pm/ApplicationInfo;Landroid/content/ComponentName;Z)V
+PLcom/android/server/am/ContentProviderRecord;->addExternalProcessHandleLocked(Landroid/os/IBinder;)V
+PLcom/android/server/am/ContentProviderRecord;->canRunHere(Lcom/android/server/am/ProcessRecord;)Z
+PLcom/android/server/am/ContentProviderRecord;->newHolder(Lcom/android/server/am/ContentProviderConnection;)Landroid/app/ContentProviderHolder;
+PLcom/android/server/am/ContentProviderRecord;->removeExternalProcessHandleLocked(Landroid/os/IBinder;)Z
+PLcom/android/server/am/CoreSettingsObserver;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/am/CoreSettingsObserver;->beginObserveCoreSettings()V
+PLcom/android/server/am/CoreSettingsObserver;->getCoreSettingsLocked()Landroid/os/Bundle;
+PLcom/android/server/am/CoreSettingsObserver;->populateSettings(Landroid/os/Bundle;Ljava/util/Map;)V
+PLcom/android/server/am/CoreSettingsObserver;->sendCoreSettings()V
+PLcom/android/server/am/DumpHeapProvider;-><init>()V
+PLcom/android/server/am/DumpHeapProvider;->onCreate()Z
+PLcom/android/server/am/EventLogTags;->writeAmFocusedStack(IIILjava/lang/String;)V
+PLcom/android/server/am/EventLogTags;->writeAmMeminfo(JJJJJ)V
+PLcom/android/server/am/EventLogTags;->writeAmPss(IILjava/lang/String;JJJ)V
+PLcom/android/server/am/EventLogTags;->writeAmSetResumedActivity(ILjava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/am/EventLogTags;->writeAmStopActivity(IILjava/lang/String;)V
+PLcom/android/server/am/EventLogTags;->writeAmUidActive(I)V
+PLcom/android/server/am/EventLogTags;->writeAmUidIdle(I)V
+PLcom/android/server/am/EventLogTags;->writeAmUidRunning(I)V
+PLcom/android/server/am/EventLogTags;->writeAmUidStopped(I)V
+PLcom/android/server/am/EventLogTags;->writeAmUserStateChanged(II)V
+PLcom/android/server/am/IntentBindRecord;-><init>(Lcom/android/server/am/ServiceRecord;Landroid/content/Intent$FilterComparison;)V
+PLcom/android/server/am/KeyguardController;->beginActivityVisibilityUpdate()V
+PLcom/android/server/am/KeyguardController;->canShowActivityWhileKeyguardShowing(Lcom/android/server/am/ActivityRecord;Z)Z
+PLcom/android/server/am/KeyguardController;->convertTransitFlags(I)I
+PLcom/android/server/am/KeyguardController;->dismissDockedStackIfNeeded()V
+PLcom/android/server/am/KeyguardController;->endActivityVisibilityUpdate()V
+PLcom/android/server/am/KeyguardController;->handleOccludedChanged()V
+PLcom/android/server/am/KeyguardController;->isKeyguardLocked()Z
+PLcom/android/server/am/KeyguardController;->isKeyguardShowing()Z
+PLcom/android/server/am/KeyguardController;->keyguardGoingAway(I)V
+PLcom/android/server/am/KeyguardController;->setKeyguardGoingAway(Z)V
+PLcom/android/server/am/KeyguardController;->setKeyguardShown(Z)V
+PLcom/android/server/am/KeyguardController;->setWindowManager(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/am/KeyguardController;->visibilitiesUpdated()V
+PLcom/android/server/am/NativeCrashListener;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/am/NativeCrashListener;->run()V
+PLcom/android/server/am/PendingIntentRecord$Key;-><init>(ILjava/lang/String;Lcom/android/server/am/ActivityRecord;Ljava/lang/String;I[Landroid/content/Intent;[Ljava/lang/String;ILandroid/os/Bundle;I)V
+PLcom/android/server/am/PendingIntentRecord$Key;->equals(Ljava/lang/Object;)Z
+PLcom/android/server/am/PendingIntentRecord$Key;->hashCode()I
+PLcom/android/server/am/PendingIntentRecord;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/PendingIntentRecord$Key;I)V
+PLcom/android/server/am/PendingIntentRecord;->completeFinalize()V
+PLcom/android/server/am/PendingIntentRecord;->detachCancelListenersLocked()Landroid/os/RemoteCallbackList;
+PLcom/android/server/am/PendingIntentRecord;->finalize()V
+PLcom/android/server/am/PendingIntentRecord;->sendInner(ILandroid/content/Intent;Ljava/lang/String;Landroid/os/IBinder;Landroid/content/IIntentReceiver;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;IIILandroid/os/Bundle;Landroid/app/IActivityContainer;)I
+PLcom/android/server/am/PendingIntentRecord;->sendWithResult(ILandroid/content/Intent;Ljava/lang/String;Landroid/os/IBinder;Landroid/content/IIntentReceiver;Ljava/lang/String;Landroid/os/Bundle;)I
+PLcom/android/server/am/PendingIntentRecord;->setWhitelistDurationLocked(Landroid/os/IBinder;J)V
+PLcom/android/server/am/ProcessList;->applyDisplaySize(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/am/ProcessList;->buildOomTag(Ljava/lang/String;Ljava/lang/String;II)Ljava/lang/String;
+PLcom/android/server/am/ProcessList;->computeNextPssTime(IZZZJ)J
+PLcom/android/server/am/ProcessList;->makeOomAdjString(I)Ljava/lang/String;
+PLcom/android/server/am/ProcessList;->makeProcStateString(I)Ljava/lang/String;
+PLcom/android/server/am/ProcessList;->openLmkdSocket()Z
+PLcom/android/server/am/ProcessList;->remove(I)V
+PLcom/android/server/am/ProcessRecord;-><init>(Lcom/android/internal/os/BatteryStatsImpl;Landroid/content/pm/ApplicationInfo;Ljava/lang/String;I)V
+PLcom/android/server/am/ProcessRecord;->addPackage(Ljava/lang/String;ILcom/android/server/am/ProcessStatsService;)Z
+PLcom/android/server/am/ProcessRecord;->forceProcessStateUpTo(I)V
+PLcom/android/server/am/ProcessRecord;->kill(Ljava/lang/String;Z)V
+PLcom/android/server/am/ProcessRecord;->makeActive(Landroid/app/IApplicationThread;Lcom/android/server/am/ProcessStatsService;)V
+PLcom/android/server/am/ProcessRecord;->makeInactive(Lcom/android/server/am/ProcessStatsService;)V
+PLcom/android/server/am/ProcessRecord;->resetPackageList(Lcom/android/server/am/ProcessStatsService;)V
+PLcom/android/server/am/ProcessRecord;->setPid(I)V
+PLcom/android/server/am/ProcessRecord;->toShortString()Ljava/lang/String;
+PLcom/android/server/am/ProcessRecord;->toShortString(Ljava/lang/StringBuilder;)V
+PLcom/android/server/am/ProcessRecord;->toString()Ljava/lang/String;
+PLcom/android/server/am/ProcessRecord;->unlinkDeathRecipient()V
+PLcom/android/server/am/ProcessStatsService;->addSysMemUsageLocked(JJJJJ)V
+PLcom/android/server/am/ProcessStatsService;->getProcessStateLocked(Ljava/lang/String;IILjava/lang/String;)Lcom/android/internal/app/procstats/ProcessState;
+PLcom/android/server/am/ProcessStatsService;->getServiceStateLocked(Ljava/lang/String;IILjava/lang/String;Ljava/lang/String;)Lcom/android/internal/app/procstats/ServiceState;
+PLcom/android/server/am/ProcessStatsService;->isMemFactorLowered()Z
+PLcom/android/server/am/ProcessStatsService;->shouldWriteNowLocked(J)Z
+PLcom/android/server/am/ProviderMap;->collectPackageProvidersLocked(Ljava/lang/String;Ljava/util/Set;ZZILjava/util/ArrayList;)Z
+PLcom/android/server/am/ProviderMap;->collectPackageProvidersLocked(Ljava/lang/String;Ljava/util/Set;ZZLjava/util/HashMap;Ljava/util/ArrayList;)Z
+PLcom/android/server/am/ProviderMap;->getProviderByClass(Landroid/content/ComponentName;I)Lcom/android/server/am/ContentProviderRecord;
+PLcom/android/server/am/ProviderMap;->getProviderByName(Ljava/lang/String;I)Lcom/android/server/am/ContentProviderRecord;
+PLcom/android/server/am/ProviderMap;->getProvidersByClass(I)Ljava/util/HashMap;
+PLcom/android/server/am/ProviderMap;->getProvidersByName(I)Ljava/util/HashMap;
+PLcom/android/server/am/ProviderMap;->putProviderByClass(Landroid/content/ComponentName;Lcom/android/server/am/ContentProviderRecord;)V
+PLcom/android/server/am/ProviderMap;->putProviderByName(Ljava/lang/String;Lcom/android/server/am/ContentProviderRecord;)V
+PLcom/android/server/am/ProviderMap;->removeProviderByClass(Landroid/content/ComponentName;I)V
+PLcom/android/server/am/ProviderMap;->removeProviderByName(Ljava/lang/String;I)V
+PLcom/android/server/am/ReceiverList;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ProcessRecord;IIILandroid/content/IIntentReceiver;)V
+PLcom/android/server/am/ReceiverList;->equals(Ljava/lang/Object;)Z
+PLcom/android/server/am/ReceiverList;->hashCode()I
+PLcom/android/server/am/ReceiverList;->toString()Ljava/lang/String;
+PLcom/android/server/am/RecentTasks;->addLocked(Lcom/android/server/am/TaskRecord;)V
+PLcom/android/server/am/RecentTasks;->cleanupLocked(I)V
+PLcom/android/server/am/RecentTasks;->loadPersistedTaskIdsForUserLocked(I)V
+PLcom/android/server/am/RecentTasks;->loadUserRecentsLocked(I)V
+PLcom/android/server/am/RecentTasks;->notifyTaskPersisterLocked(Lcom/android/server/am/TaskRecord;Z)V
+PLcom/android/server/am/RecentTasks;->onSystemReadyLocked()V
+PLcom/android/server/am/RecentTasks;->processNextAffiliateChainLocked(I)I
+PLcom/android/server/am/RecentTasks;->shouldPersistTaskLocked(Lcom/android/server/am/TaskRecord;)Z
+PLcom/android/server/am/RecentTasks;->syncPersistentTaskIdsLocked()V
+PLcom/android/server/am/RecentTasks;->taskForIdLocked(I)Lcom/android/server/am/TaskRecord;
+PLcom/android/server/am/RecentTasks;->taskIdTakenForUserLocked(II)Z
+PLcom/android/server/am/RecentTasks;->trimForTaskLocked(Lcom/android/server/am/TaskRecord;Z)I
+PLcom/android/server/am/RecentTasks;->usersWithRecentsLoadedLocked()[I
+PLcom/android/server/am/ServiceRecord$1;-><init>(Lcom/android/server/am/ServiceRecord;Landroid/app/Notification;Ljava/lang/String;III)V
+PLcom/android/server/am/ServiceRecord$1;->run()V
+PLcom/android/server/am/ServiceRecord$2;-><init>(Lcom/android/server/am/ServiceRecord;Ljava/lang/String;I)V
+PLcom/android/server/am/ServiceRecord$2;->run()V
+PLcom/android/server/am/ServiceRecord$StartItem;-><init>(Lcom/android/server/am/ServiceRecord;ZILandroid/content/Intent;Lcom/android/server/am/ActivityManagerService$NeededUriGrants;I)V
+PLcom/android/server/am/ServiceRecord$StartItem;->removeUriPermissionsLocked()V
+PLcom/android/server/am/ServiceRecord;->cancelNotification()V
+PLcom/android/server/am/ServiceRecord;->clearDeliveredStartsLocked()V
+PLcom/android/server/am/ServiceRecord;->forceClearTracker()V
+PLcom/android/server/am/ServiceRecord;->getLastStartId()I
+PLcom/android/server/am/ServiceRecord;->getTracker()Lcom/android/internal/app/procstats/ServiceState;
+PLcom/android/server/am/ServiceRecord;->makeNextStartId()I
+PLcom/android/server/am/ServiceRecord;->makeRestarting(IJ)V
+PLcom/android/server/am/ServiceRecord;->postNotification()V
+PLcom/android/server/am/ServiceRecord;->resetRestartCounter()V
+PLcom/android/server/am/ServiceRecord;->toString()Ljava/lang/String;
+PLcom/android/server/am/ServiceRecord;->updateWhitelistManager()V
+PLcom/android/server/am/TaskChangeNotificationController$MainHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/am/TaskChangeNotificationController;->-get10(Lcom/android/server/am/TaskChangeNotificationController;)Lcom/android/server/am/TaskChangeNotificationController$TaskStackConsumer;
+PLcom/android/server/am/TaskChangeNotificationController;->-get11(Lcom/android/server/am/TaskChangeNotificationController;)Lcom/android/server/am/TaskChangeNotificationController$TaskStackConsumer;
+PLcom/android/server/am/TaskChangeNotificationController;->-get13(Lcom/android/server/am/TaskChangeNotificationController;)Lcom/android/server/am/TaskChangeNotificationController$TaskStackConsumer;
+PLcom/android/server/am/TaskChangeNotificationController;->-get14(Lcom/android/server/am/TaskChangeNotificationController;)Lcom/android/server/am/TaskChangeNotificationController$TaskStackConsumer;
+PLcom/android/server/am/TaskChangeNotificationController;->-get15(Lcom/android/server/am/TaskChangeNotificationController;)Lcom/android/server/am/TaskChangeNotificationController$TaskStackConsumer;
+PLcom/android/server/am/TaskChangeNotificationController;->-get16(Lcom/android/server/am/TaskChangeNotificationController;)Lcom/android/server/am/TaskChangeNotificationController$TaskStackConsumer;
+PLcom/android/server/am/TaskChangeNotificationController;->-get17(Lcom/android/server/am/TaskChangeNotificationController;)Lcom/android/server/am/ActivityManagerService;
+PLcom/android/server/am/TaskChangeNotificationController;->-get18(Lcom/android/server/am/TaskChangeNotificationController;)Lcom/android/server/am/ActivityStackSupervisor;
+PLcom/android/server/am/TaskChangeNotificationController;->-get4(Lcom/android/server/am/TaskChangeNotificationController;)Lcom/android/server/am/TaskChangeNotificationController$TaskStackConsumer;
+PLcom/android/server/am/TaskChangeNotificationController;->-get9(Lcom/android/server/am/TaskChangeNotificationController;)Lcom/android/server/am/TaskChangeNotificationController$TaskStackConsumer;
+PLcom/android/server/am/TaskChangeNotificationController;->-wrap0(Lcom/android/server/am/TaskChangeNotificationController;Lcom/android/server/am/TaskChangeNotificationController$TaskStackConsumer;Landroid/os/Message;)V
+PLcom/android/server/am/TaskChangeNotificationController;->forAllLocalListeners(Lcom/android/server/am/TaskChangeNotificationController$TaskStackConsumer;Landroid/os/Message;)V
+PLcom/android/server/am/TaskChangeNotificationController;->forAllRemoteListeners(Lcom/android/server/am/TaskChangeNotificationController$TaskStackConsumer;Landroid/os/Message;)V
+PLcom/android/server/am/TaskChangeNotificationController;->lambda$-com_android_server_am_TaskChangeNotificationController_3225(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
+PLcom/android/server/am/TaskChangeNotificationController;->lambda$-com_android_server_am_TaskChangeNotificationController_3334(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
+PLcom/android/server/am/TaskChangeNotificationController;->lambda$-com_android_server_am_TaskChangeNotificationController_3467(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
+PLcom/android/server/am/TaskChangeNotificationController;->lambda$-com_android_server_am_TaskChangeNotificationController_3582(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
+PLcom/android/server/am/TaskChangeNotificationController;->lambda$-com_android_server_am_TaskChangeNotificationController_3708(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
+PLcom/android/server/am/TaskChangeNotificationController;->lambda$-com_android_server_am_TaskChangeNotificationController_3878(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
+PLcom/android/server/am/TaskChangeNotificationController;->lambda$-com_android_server_am_TaskChangeNotificationController_4027(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
+PLcom/android/server/am/TaskChangeNotificationController;->lambda$-com_android_server_am_TaskChangeNotificationController_5401(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
+PLcom/android/server/am/TaskChangeNotificationController;->notifyActivityRequestedOrientationChanged(II)V
+PLcom/android/server/am/TaskChangeNotificationController;->notifyTaskCreated(ILandroid/content/ComponentName;)V
+PLcom/android/server/am/TaskChangeNotificationController;->notifyTaskDescriptionChanged(ILandroid/app/ActivityManager$TaskDescription;)V
+PLcom/android/server/am/TaskChangeNotificationController;->notifyTaskMovedToFront(I)V
+PLcom/android/server/am/TaskChangeNotificationController;->notifyTaskRemovalStarted(I)V
+PLcom/android/server/am/TaskChangeNotificationController;->notifyTaskRemoved(I)V
+PLcom/android/server/am/TaskChangeNotificationController;->notifyTaskSnapshotChanged(ILandroid/app/ActivityManager$TaskSnapshot;)V
+PLcom/android/server/am/TaskChangeNotificationController;->notifyTaskStackChanged()V
+PLcom/android/server/am/TaskChangeNotificationController;->registerTaskStackListener(Landroid/app/ITaskStackListener;)V
+PLcom/android/server/am/TaskPersister$1;-><init>(Lcom/android/server/am/TaskPersister;)V
+PLcom/android/server/am/TaskPersister$1;->compare(Lcom/android/server/am/TaskRecord;Lcom/android/server/am/TaskRecord;)I
+PLcom/android/server/am/TaskPersister$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+PLcom/android/server/am/TaskPersister$LazyTaskWriterThread;->run()V
+PLcom/android/server/am/TaskPersister$TaskWriteQueueItem;-><init>(Lcom/android/server/am/TaskRecord;)V
+PLcom/android/server/am/TaskPersister$WriteQueueItem;-><init>()V
+PLcom/android/server/am/TaskPersister$WriteQueueItem;-><init>(Lcom/android/server/am/TaskPersister$WriteQueueItem;)V
+PLcom/android/server/am/TaskPersister;->-get0(Lcom/android/server/am/TaskPersister;)J
+PLcom/android/server/am/TaskPersister;->-get1(Lcom/android/server/am/TaskPersister;)Lcom/android/server/am/RecentTasks;
+PLcom/android/server/am/TaskPersister;->-get2(Lcom/android/server/am/TaskPersister;)Lcom/android/server/am/ActivityManagerService;
+PLcom/android/server/am/TaskPersister;->-set0(Lcom/android/server/am/TaskPersister;J)J
+PLcom/android/server/am/TaskPersister;->-wrap1(Lcom/android/server/am/TaskPersister;Lcom/android/server/am/TaskRecord;)Ljava/io/StringWriter;
+PLcom/android/server/am/TaskPersister;->-wrap2(Lcom/android/server/am/TaskPersister;Landroid/util/ArraySet;)V
+PLcom/android/server/am/TaskPersister;->-wrap3(Lcom/android/server/am/TaskPersister;)V
+PLcom/android/server/am/TaskPersister;->getUserImagesDir(I)Ljava/io/File;
+PLcom/android/server/am/TaskPersister;->getUserPersistedTaskIdsFile(I)Ljava/io/File;
+PLcom/android/server/am/TaskPersister;->getUserTasksDir(I)Ljava/io/File;
+PLcom/android/server/am/TaskPersister;->loadPersistedTaskIdsForUser(I)Landroid/util/SparseBooleanArray;
+PLcom/android/server/am/TaskPersister;->removeObsoleteFiles(Landroid/util/ArraySet;)V
+PLcom/android/server/am/TaskPersister;->removeObsoleteFiles(Landroid/util/ArraySet;[Ljava/io/File;)V
+PLcom/android/server/am/TaskPersister;->removeThumbnails(Lcom/android/server/am/TaskRecord;)V
+PLcom/android/server/am/TaskPersister;->restoreTasksForUserLocked(ILandroid/util/SparseBooleanArray;)Ljava/util/List;
+PLcom/android/server/am/TaskPersister;->saveToXml(Lcom/android/server/am/TaskRecord;)Ljava/io/StringWriter;
+PLcom/android/server/am/TaskPersister;->startPersisting()V
+PLcom/android/server/am/TaskPersister;->taskIdToTask(ILjava/util/ArrayList;)Lcom/android/server/am/TaskRecord;
+PLcom/android/server/am/TaskPersister;->wakeup(Lcom/android/server/am/TaskRecord;Z)V
+PLcom/android/server/am/TaskPersister;->writePersistedTaskIdsForUser(Landroid/util/SparseBooleanArray;I)V
+PLcom/android/server/am/TaskPersister;->writeTaskIdsFiles()V
+PLcom/android/server/am/TaskPersister;->yieldIfQueueTooDeep()V
+PLcom/android/server/am/TaskRecord;-><init>(Lcom/android/server/am/ActivityManagerService;ILandroid/content/Intent;Landroid/content/Intent;Ljava/lang/String;Ljava/lang/String;Landroid/content/ComponentName;Landroid/content/ComponentName;ZZZIIILjava/lang/String;Ljava/util/ArrayList;JJJZLandroid/app/ActivityManager$TaskDescription;Landroid/app/ActivityManager$TaskThumbnailInfo;IIIIILjava/lang/String;IZZZZII)V
+PLcom/android/server/am/TaskRecord;-><init>(Lcom/android/server/am/ActivityManagerService;ILandroid/content/pm/ActivityInfo;Landroid/content/Intent;Landroid/service/voice/IVoiceInteractionSession;Lcom/android/internal/app/IVoiceInteractor;I)V
+PLcom/android/server/am/TaskRecord;->addActivityAtIndex(ILcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/TaskRecord;->addActivityToTop(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/TaskRecord;->addStartingWindowsForVisibleActivities(Z)V
+PLcom/android/server/am/TaskRecord;->autoRemoveFromRecents()Z
+PLcom/android/server/am/TaskRecord;->cancelThumbnailTransition()V
+PLcom/android/server/am/TaskRecord;->cancelWindowTransition()V
+PLcom/android/server/am/TaskRecord;->closeRecentsChain()V
+PLcom/android/server/am/TaskRecord;->createWindowContainer(ZZ)V
+PLcom/android/server/am/TaskRecord;->disposeThumbnail()V
+PLcom/android/server/am/TaskRecord;->findEffectiveRootIndex()I
+PLcom/android/server/am/TaskRecord;->freeLastThumbnail()V
+PLcom/android/server/am/TaskRecord;->getBaseIntent()Landroid/content/Intent;
+PLcom/android/server/am/TaskRecord;->getChildCount()I
+PLcom/android/server/am/TaskRecord;->getLaunchBounds()Landroid/graphics/Rect;
+PLcom/android/server/am/TaskRecord;->getParent()Lcom/android/server/am/ConfigurationContainer;
+PLcom/android/server/am/TaskRecord;->getRootActivity()Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/TaskRecord;->getSnapshot(Z)Landroid/app/ActivityManager$TaskSnapshot;
+PLcom/android/server/am/TaskRecord;->getStackId()I
+PLcom/android/server/am/TaskRecord;->getTaskToReturnTo()I
+PLcom/android/server/am/TaskRecord;->getTopActivity()Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/TaskRecord;->getWindowContainerBounds(Landroid/graphics/Rect;)V
+PLcom/android/server/am/TaskRecord;->getWindowContainerController()Lcom/android/server/wm/TaskWindowContainerController;
+PLcom/android/server/am/TaskRecord;->isApplicationTask()Z
+PLcom/android/server/am/TaskRecord;->isClearingToReuseTask()Z
+PLcom/android/server/am/TaskRecord;->isHomeTask()Z
+PLcom/android/server/am/TaskRecord;->isLockTaskWhitelistedLocked()Z
+PLcom/android/server/am/TaskRecord;->isOverAssistantStack()Z
+PLcom/android/server/am/TaskRecord;->isOverHomeStack()Z
+PLcom/android/server/am/TaskRecord;->isResizeable()Z
+PLcom/android/server/am/TaskRecord;->isResizeable(Z)Z
+PLcom/android/server/am/TaskRecord;->okToShowLocked()Z
+PLcom/android/server/am/TaskRecord;->onParentChanged()V
+PLcom/android/server/am/TaskRecord;->onSnapshotChanged(Landroid/app/ActivityManager$TaskSnapshot;)V
+PLcom/android/server/am/TaskRecord;->onlyHasTaskOverlayActivities(Z)Z
+PLcom/android/server/am/TaskRecord;->performClearTaskAtIndexLocked(IZ)V
+PLcom/android/server/am/TaskRecord;->performClearTaskForReuseLocked(Lcom/android/server/am/ActivityRecord;I)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/TaskRecord;->performClearTaskLocked(Lcom/android/server/am/ActivityRecord;I)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/TaskRecord;->removeActivity(Lcom/android/server/am/ActivityRecord;)Z
+PLcom/android/server/am/TaskRecord;->removeActivity(Lcom/android/server/am/ActivityRecord;Z)Z
+PLcom/android/server/am/TaskRecord;->removeTaskActivitiesLocked(Z)V
+PLcom/android/server/am/TaskRecord;->removeWindowContainer()V
+PLcom/android/server/am/TaskRecord;->removedFromRecents()V
+PLcom/android/server/am/TaskRecord;->saveToXml(Lorg/xmlpull/v1/XmlSerializer;)V
+PLcom/android/server/am/TaskRecord;->setFrontOfTask()V
+PLcom/android/server/am/TaskRecord;->setIntent(Landroid/content/Intent;Landroid/content/pm/ActivityInfo;)V
+PLcom/android/server/am/TaskRecord;->setIntent(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/TaskRecord;->setLockTaskAuth()V
+PLcom/android/server/am/TaskRecord;->setMinDimensions(Landroid/content/pm/ActivityInfo;)V
+PLcom/android/server/am/TaskRecord;->setNextAffiliate(Lcom/android/server/am/TaskRecord;)V
+PLcom/android/server/am/TaskRecord;->setPrevAffiliate(Lcom/android/server/am/TaskRecord;)V
+PLcom/android/server/am/TaskRecord;->setStack(Lcom/android/server/am/ActivityStack;)V
+PLcom/android/server/am/TaskRecord;->setTaskToReturnTo(I)V
+PLcom/android/server/am/TaskRecord;->setTaskToReturnTo(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/TaskRecord;->setWindowContainerController(Lcom/android/server/wm/TaskWindowContainerController;)V
+PLcom/android/server/am/TaskRecord;->supportsSplitScreen()Z
+PLcom/android/server/am/TaskRecord;->topRunningActivityWithStartingWindowLocked()Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/TaskRecord;->touchActiveTime()V
+PLcom/android/server/am/TaskRecord;->updateEffectiveIntent()V
+PLcom/android/server/am/TaskRecord;->updateOverrideConfiguration(Landroid/graphics/Rect;)Z
+PLcom/android/server/am/TaskRecord;->updateOverrideConfiguration(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z
+PLcom/android/server/am/TaskRecord;->updateOverrideConfigurationFromLaunchBounds()Landroid/graphics/Rect;
+PLcom/android/server/am/TaskRecord;->updateTaskDescription()V
+PLcom/android/server/am/TaskRecord;->validateBounds(Landroid/graphics/Rect;)Landroid/graphics/Rect;
+PLcom/android/server/am/UidRecord$ChangeItem;-><init>()V
+PLcom/android/server/am/UidRecord;-><init>(I)V
+PLcom/android/server/am/UidRecord;->toString()Ljava/lang/String;
+PLcom/android/server/am/UidRecord;->updateHasInternetPermission()V
+PLcom/android/server/am/UidRecord;->updateLastDispatchedProcStateSeq(I)V
+PLcom/android/server/am/UriPermission;-><init>(Ljava/lang/String;Ljava/lang/String;ILcom/android/server/am/ActivityManagerService$GrantUri;)V
+PLcom/android/server/am/UriPermission;->grantModes(ILcom/android/server/am/UriPermissionOwner;)V
+PLcom/android/server/am/UriPermission;->revokeModes(IZ)Z
+PLcom/android/server/am/UriPermission;->updateModeFlags()V
+PLcom/android/server/am/UriPermissionOwner$ExternalToken;-><init>(Lcom/android/server/am/UriPermissionOwner;)V
+PLcom/android/server/am/UriPermissionOwner;-><init>(Lcom/android/server/am/ActivityManagerService;Ljava/lang/Object;)V
+PLcom/android/server/am/UriPermissionOwner;->getExternalTokenLocked()Landroid/os/Binder;
+PLcom/android/server/am/UriPermissionOwner;->removeUriPermissionLocked(Lcom/android/server/am/ActivityManagerService$GrantUri;I)V
+PLcom/android/server/am/UriPermissionOwner;->removeUriPermissionsLocked()V
+PLcom/android/server/am/UriPermissionOwner;->removeUriPermissionsLocked(I)V
+PLcom/android/server/am/UserController$2;-><init>(Lcom/android/server/am/UserController;I)V
+PLcom/android/server/am/UserController$2;->performReceive(Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;ZZI)V
+PLcom/android/server/am/UserController$Injector;->broadcastIntentLocked(Landroid/content/Intent;Ljava/lang/String;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;[Ljava/lang/String;ILandroid/os/Bundle;ZZIII)I
+PLcom/android/server/am/UserController$Injector;->checkCallingPermission(Ljava/lang/String;)I
+PLcom/android/server/am/UserController$Injector;->checkComponentPermission(Ljava/lang/String;IIIZ)I
+PLcom/android/server/am/UserController$Injector;->getUserManager()Lcom/android/server/pm/UserManagerService;
+PLcom/android/server/am/UserController$Injector;->getUserManagerInternal()Landroid/os/UserManagerInternal;
+PLcom/android/server/am/UserController$Injector;->isRuntimeRestarted()Z
+PLcom/android/server/am/UserController;->-get0()Ljava/lang/String;
+PLcom/android/server/am/UserController;->dispatchLockedBootComplete(I)V
+PLcom/android/server/am/UserController;->exists(I)Z
+PLcom/android/server/am/UserController;->finishUserBoot(Lcom/android/server/am/UserState;Landroid/content/IIntentReceiver;)V
+PLcom/android/server/am/UserController;->finishUserUnlocked(Lcom/android/server/am/UserState;)V
+PLcom/android/server/am/UserController;->finishUserUnlockedCompleted(Lcom/android/server/am/UserState;)V
+PLcom/android/server/am/UserController;->finishUserUnlocking(Lcom/android/server/am/UserState;)V
+PLcom/android/server/am/UserController;->getCurrentUser()Landroid/content/pm/UserInfo;
+PLcom/android/server/am/UserController;->getCurrentUserIdLocked()I
+PLcom/android/server/am/UserController;->getProfileIds(I)Ljava/util/Set;
+PLcom/android/server/am/UserController;->getStartedUserArrayLocked()[I
+PLcom/android/server/am/UserController;->getStorageManager()Landroid/os/storage/IStorageManager;
+PLcom/android/server/am/UserController;->getUserInfo(I)Landroid/content/pm/UserInfo;
+PLcom/android/server/am/UserController;->hasStartedUserState(I)Z
+PLcom/android/server/am/UserController;->hasUserRestriction(Ljava/lang/String;I)Z
+PLcom/android/server/am/UserController;->isSameProfileGroup(II)Z
+PLcom/android/server/am/UserController;->isUserRunningLocked(II)Z
+PLcom/android/server/am/UserController;->maybeUnlockUser(I)Z
+PLcom/android/server/am/UserController;->onSystemReady()V
+PLcom/android/server/am/UserController;->registerUserSwitchObserver(Landroid/app/IUserSwitchObserver;Ljava/lang/String;)V
+PLcom/android/server/am/UserController;->sendBootCompletedLocked(Landroid/content/IIntentReceiver;)V
+PLcom/android/server/am/UserController;->sendUserSwitchBroadcastsLocked(II)V
+PLcom/android/server/am/UserController;->shouldConfirmCredentials(I)Z
+PLcom/android/server/am/UserController;->startProfilesLocked()V
+PLcom/android/server/am/UserController;->unlockUserCleared(I[B[BLandroid/os/IProgressListener;)Z
+PLcom/android/server/am/UserController;->unsafeConvertIncomingUserLocked(I)I
+PLcom/android/server/am/UserController;->updateCurrentProfileIdsLocked()V
+PLcom/android/server/am/UserState;->setState(I)V
+PLcom/android/server/am/UserState;->setState(II)Z
+PLcom/android/server/am/UserState;->stateToString(I)Ljava/lang/String;
+PLcom/android/server/am/VrController;->changeVrModeLocked(ZLcom/android/server/am/ProcessRecord;)Z
+PLcom/android/server/am/VrController;->clearVrRenderThreadLocked(Z)V
+PLcom/android/server/am/VrController;->hasPersistentVrFlagSet()Z
+PLcom/android/server/am/VrController;->inVrMode()Z
+PLcom/android/server/am/VrController;->onSystemReady()V
+PLcom/android/server/am/VrController;->onTopProcChangedLocked(Lcom/android/server/am/ProcessRecord;)V
+PLcom/android/server/am/VrController;->onVrModeChanged(Lcom/android/server/am/ActivityRecord;)Z
+PLcom/android/server/am/VrController;->setVrRenderThreadLocked(IIZ)I
+PLcom/android/server/am/VrController;->shouldDisableNonVrUiLocked()Z
+PLcom/android/server/am/VrController;->updateVrRenderThreadLocked(IZ)I
+PLcom/android/server/appwidget/AppWidgetService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/appwidget/AppWidgetService;->onBootPhase(I)V
+PLcom/android/server/appwidget/AppWidgetService;->onStart()V
+PLcom/android/server/appwidget/AppWidgetService;->onUnlockUser(I)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl$1;-><init>(Lcom/android/server/appwidget/AppWidgetServiceImpl;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl$BackupRestoreController;-><init>(Lcom/android/server/appwidget/AppWidgetServiceImpl;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl$BackupRestoreController;-><init>(Lcom/android/server/appwidget/AppWidgetServiceImpl;Lcom/android/server/appwidget/AppWidgetServiceImpl$BackupRestoreController;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl$CallbackHandler;-><init>(Lcom/android/server/appwidget/AppWidgetServiceImpl;Landroid/os/Looper;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl$Host;-><init>()V
+PLcom/android/server/appwidget/AppWidgetServiceImpl$Host;-><init>(Lcom/android/server/appwidget/AppWidgetServiceImpl$Host;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl$HostId;-><init>(IILjava/lang/String;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl$HostId;->equals(Ljava/lang/Object;)Z
+PLcom/android/server/appwidget/AppWidgetServiceImpl$Provider;-><init>()V
+PLcom/android/server/appwidget/AppWidgetServiceImpl$Provider;-><init>(Lcom/android/server/appwidget/AppWidgetServiceImpl$Provider;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl$Provider;->getUserId()I
+PLcom/android/server/appwidget/AppWidgetServiceImpl$Provider;->setMaskedByLockedProfileLocked(Z)Z
+PLcom/android/server/appwidget/AppWidgetServiceImpl$Provider;->setMaskedByQuietProfileLocked(Z)Z
+PLcom/android/server/appwidget/AppWidgetServiceImpl$Provider;->setMaskedBySuspendedPackageLocked(Z)Z
+PLcom/android/server/appwidget/AppWidgetServiceImpl$ProviderId;-><init>(ILandroid/content/ComponentName;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl$ProviderId;-><init>(ILandroid/content/ComponentName;Lcom/android/server/appwidget/AppWidgetServiceImpl$ProviderId;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl$ProviderId;->equals(Ljava/lang/Object;)Z
+PLcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;-><init>(Lcom/android/server/appwidget/AppWidgetServiceImpl;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;-><init>(Lcom/android/server/appwidget/AppWidgetServiceImpl;Lcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;->enforceCallFromPackage(Ljava/lang/String;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;->getEnabledGroupProfileIds(I)[I
+PLcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;->getGroupParent(I)I
+PLcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;->getProfileParent(I)I
+PLcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;->isEnabledGroupProfile(I)Z
+PLcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;->isParentOrProfile(II)Z
+PLcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;->isProfileEnabled(I)Z
+PLcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;->isProviderInCallerOrInProfileAndWhitelListed(Ljava/lang/String;I)Z
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->-get0()Z
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->-get1(Lcom/android/server/appwidget/AppWidgetServiceImpl;)Landroid/app/AppOpsManager;
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->-get10(Lcom/android/server/appwidget/AppWidgetServiceImpl;)Landroid/os/UserManager;
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->-get9(Lcom/android/server/appwidget/AppWidgetServiceImpl;)Lcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->-wrap10(Lcom/android/server/appwidget/AppWidgetServiceImpl;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->-wrap11(Lcom/android/server/appwidget/AppWidgetServiceImpl;Landroid/content/Intent;I)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;-><init>(Landroid/content/Context;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->addProviderLocked(Landroid/content/pm/ResolveInfo;)Z
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->bindLoadedWidgetsLocked(Ljava/util/List;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->clearProvidersAndHostsTagsLocked()V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->cloneIfLocalBinder(Landroid/appwidget/AppWidgetProviderInfo;)Landroid/appwidget/AppWidgetProviderInfo;
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->computeMaximumWidgetBitmapMemory()V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->ensureGroupStateLoadedLocked(I)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->ensureGroupStateLoadedLocked(IZ)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->getAppWidgetIds(Landroid/content/ComponentName;)[I
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->getInstalledProvidersForProfile(IILjava/lang/String;)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->getSavedStateFile(I)Landroid/util/AtomicFile;
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->getStateFile(I)Ljava/io/File;
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->getUidForPackage(Ljava/lang/String;I)I
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->getWidgetIds(Ljava/util/ArrayList;)[I
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->isLocalBinder()Z
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->isProfileWithLockedParent(I)Z
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->isProfileWithUnlockedParent(I)Z
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->isUserRunningAndUnlocked(I)Z
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->loadGroupStateLocked([I)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->loadGroupWidgetProvidersLocked([I)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->lookupHostLocked(Lcom/android/server/appwidget/AppWidgetServiceImpl$HostId;)Lcom/android/server/appwidget/AppWidgetServiceImpl$Host;
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->lookupOrAddHostLocked(Lcom/android/server/appwidget/AppWidgetServiceImpl$HostId;)Lcom/android/server/appwidget/AppWidgetServiceImpl$Host;
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->lookupProviderLocked(Lcom/android/server/appwidget/AppWidgetServiceImpl$ProviderId;)Lcom/android/server/appwidget/AppWidgetServiceImpl$Provider;
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->onConfigurationChanged()V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->onPackageBroadcastReceived(Landroid/content/Intent;I)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->onStart()V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->onUserUnlocked(I)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->parseProviderInfoXml(Lcom/android/server/appwidget/AppWidgetServiceImpl$ProviderId;Landroid/content/pm/ResolveInfo;)Lcom/android/server/appwidget/AppWidgetServiceImpl$Provider;
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->performUpgradeLocked(I)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->pruneHostLocked(Lcom/android/server/appwidget/AppWidgetServiceImpl$Host;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->queryIntentReceivers(Landroid/content/Intent;I)Ljava/util/List;
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->readProfileStateFromFileLocked(Ljava/io/FileInputStream;ILjava/util/List;)I
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->registerBroadcastReceiver()V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->registerOnCrossProfileProvidersChangedListener()V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->reloadWidgetsMaskedState(I)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->reloadWidgetsMaskedStateForGroup(I)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->resolveHostUidLocked(Ljava/lang/String;I)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->setSafeMode(Z)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->startListening(Lcom/android/internal/appwidget/IAppWidgetHost;Ljava/lang/String;I[I)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->stopListening(Ljava/lang/String;I)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->updateProvidersForPackageLocked(Ljava/lang/String;ILjava/util/Set;)Z
+PLcom/android/server/audio/AudioService$1;-><init>(Lcom/android/server/audio/AudioService;)V
+PLcom/android/server/audio/AudioService$1;->onError(I)V
+PLcom/android/server/audio/AudioService$2;-><init>(Lcom/android/server/audio/AudioService;)V
+PLcom/android/server/audio/AudioService$2;->onServiceConnected(ILandroid/bluetooth/BluetoothProfile;)V
+PLcom/android/server/audio/AudioService$3;-><init>(Lcom/android/server/audio/AudioService;)V
+PLcom/android/server/audio/AudioService$4;-><init>(Lcom/android/server/audio/AudioService;Landroid/media/IVolumeController;)V
+PLcom/android/server/audio/AudioService$AudioHandler;-><init>(Lcom/android/server/audio/AudioService;)V
+PLcom/android/server/audio/AudioService$AudioHandler;-><init>(Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService$AudioHandler;)V
+PLcom/android/server/audio/AudioService$AudioHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/audio/AudioService$AudioHandler;->onLoadSoundEffects()Z
+PLcom/android/server/audio/AudioService$AudioHandler;->onPersistSafeVolumeState(I)V
+PLcom/android/server/audio/AudioService$AudioHandler;->onPlaySoundEffect(II)V
+PLcom/android/server/audio/AudioService$AudioHandler;->persistRingerMode(I)V
+PLcom/android/server/audio/AudioService$AudioHandler;->persistVolume(Lcom/android/server/audio/AudioService$VolumeStreamState;I)V
+PLcom/android/server/audio/AudioService$AudioHandler;->setAllVolumes(Lcom/android/server/audio/AudioService$VolumeStreamState;)V
+PLcom/android/server/audio/AudioService$AudioHandler;->setDeviceVolume(Lcom/android/server/audio/AudioService$VolumeStreamState;I)V
+PLcom/android/server/audio/AudioService$AudioHandler;->setForceUse(II)V
+PLcom/android/server/audio/AudioService$AudioServiceBroadcastReceiver;-><init>(Lcom/android/server/audio/AudioService;)V
+PLcom/android/server/audio/AudioService$AudioServiceBroadcastReceiver;-><init>(Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService$AudioServiceBroadcastReceiver;)V
+PLcom/android/server/audio/AudioService$AudioServiceBroadcastReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/audio/AudioService$AudioServiceInternal;-><init>(Lcom/android/server/audio/AudioService;)V
+PLcom/android/server/audio/AudioService$AudioServiceInternal;->getRingerModeInternal()I
+PLcom/android/server/audio/AudioService$AudioServiceInternal;->setAccessibilityServiceUids(Landroid/util/IntArray;)V
+PLcom/android/server/audio/AudioService$AudioServiceInternal;->setRingerModeDelegate(Landroid/media/AudioManagerInternal$RingerModeDelegate;)V
+PLcom/android/server/audio/AudioService$AudioServiceInternal;->setRingerModeInternal(ILjava/lang/String;)V
+PLcom/android/server/audio/AudioService$AudioServiceInternal;->updateRingerModeAffectedStreamsInternal()V
+PLcom/android/server/audio/AudioService$AudioServiceUserRestrictionsListener;-><init>(Lcom/android/server/audio/AudioService;)V
+PLcom/android/server/audio/AudioService$AudioServiceUserRestrictionsListener;-><init>(Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService$AudioServiceUserRestrictionsListener;)V
+PLcom/android/server/audio/AudioService$AudioServiceUserRestrictionsListener;->onUserRestrictionsChanged(ILandroid/os/Bundle;Landroid/os/Bundle;)V
+PLcom/android/server/audio/AudioService$AudioSystemThread;-><init>(Lcom/android/server/audio/AudioService;)V
+PLcom/android/server/audio/AudioService$AudioSystemThread;->run()V
+PLcom/android/server/audio/AudioService$ForceControlStreamClient;-><init>(Lcom/android/server/audio/AudioService;Landroid/os/IBinder;)V
+PLcom/android/server/audio/AudioService$ForceControlStreamClient;->release()V
+PLcom/android/server/audio/AudioService$Lifecycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/audio/AudioService$Lifecycle;->onBootPhase(I)V
+PLcom/android/server/audio/AudioService$Lifecycle;->onStart()V
+PLcom/android/server/audio/AudioService$MyDisplayStatusCallback;-><init>(Lcom/android/server/audio/AudioService;)V
+PLcom/android/server/audio/AudioService$MyDisplayStatusCallback;-><init>(Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService$MyDisplayStatusCallback;)V
+PLcom/android/server/audio/AudioService$SetModeDeathHandler;-><init>(Lcom/android/server/audio/AudioService;Landroid/os/IBinder;I)V
+PLcom/android/server/audio/AudioService$SetModeDeathHandler;->getBinder()Landroid/os/IBinder;
+PLcom/android/server/audio/AudioService$SetModeDeathHandler;->getPid()I
+PLcom/android/server/audio/AudioService$SetModeDeathHandler;->setMode(I)V
+PLcom/android/server/audio/AudioService$SettingsObserver;-><init>(Lcom/android/server/audio/AudioService;)V
+PLcom/android/server/audio/AudioService$SoundPoolCallback;-><init>(Lcom/android/server/audio/AudioService;)V
+PLcom/android/server/audio/AudioService$SoundPoolCallback;-><init>(Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService$SoundPoolCallback;)V
+PLcom/android/server/audio/AudioService$SoundPoolCallback;->onLoadComplete(Landroid/media/SoundPool;II)V
+PLcom/android/server/audio/AudioService$SoundPoolCallback;->setSamples([I)V
+PLcom/android/server/audio/AudioService$SoundPoolCallback;->status()I
+PLcom/android/server/audio/AudioService$SoundPoolListenerThread;-><init>(Lcom/android/server/audio/AudioService;)V
+PLcom/android/server/audio/AudioService$SoundPoolListenerThread;->run()V
+PLcom/android/server/audio/AudioService$VolumeController;-><init>()V
+PLcom/android/server/audio/AudioService$VolumeController;->asBinder()Landroid/os/IBinder;
+PLcom/android/server/audio/AudioService$VolumeController;->binder(Landroid/media/IVolumeController;)Landroid/os/IBinder;
+PLcom/android/server/audio/AudioService$VolumeController;->isSameBinder(Landroid/media/IVolumeController;)Z
+PLcom/android/server/audio/AudioService$VolumeController;->loadSettings(Landroid/content/ContentResolver;)V
+PLcom/android/server/audio/AudioService$VolumeController;->postDismiss()V
+PLcom/android/server/audio/AudioService$VolumeController;->postVolumeChanged(II)V
+PLcom/android/server/audio/AudioService$VolumeController;->setController(Landroid/media/IVolumeController;)V
+PLcom/android/server/audio/AudioService$VolumeController;->setLayoutDirection(I)V
+PLcom/android/server/audio/AudioService$VolumeController;->setVisible(Z)V
+PLcom/android/server/audio/AudioService$VolumeController;->suppressAdjustment(IIZ)Z
+PLcom/android/server/audio/AudioService$VolumeStreamState;->-get2(Lcom/android/server/audio/AudioService$VolumeStreamState;)I
+PLcom/android/server/audio/AudioService$VolumeStreamState;->-get3(Lcom/android/server/audio/AudioService$VolumeStreamState;)Z
+PLcom/android/server/audio/AudioService$VolumeStreamState;->-get4(Lcom/android/server/audio/AudioService$VolumeStreamState;)I
+PLcom/android/server/audio/AudioService$VolumeStreamState;->-set1(Lcom/android/server/audio/AudioService$VolumeStreamState;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/audio/AudioService$VolumeStreamState;->-wrap0(Lcom/android/server/audio/AudioService$VolumeStreamState;)Z
+PLcom/android/server/audio/AudioService$VolumeStreamState;-><init>(Lcom/android/server/audio/AudioService;Ljava/lang/String;I)V
+PLcom/android/server/audio/AudioService$VolumeStreamState;-><init>(Lcom/android/server/audio/AudioService;Ljava/lang/String;ILcom/android/server/audio/AudioService$VolumeStreamState;)V
+PLcom/android/server/audio/AudioService$VolumeStreamState;->adjustIndex(IILjava/lang/String;)Z
+PLcom/android/server/audio/AudioService$VolumeStreamState;->applyAllVolumes()V
+PLcom/android/server/audio/AudioService$VolumeStreamState;->applyDeviceVolume_syncVSS(I)V
+PLcom/android/server/audio/AudioService$VolumeStreamState;->checkFixedVolumeDevices()V
+PLcom/android/server/audio/AudioService$VolumeStreamState;->getIndex(I)I
+PLcom/android/server/audio/AudioService$VolumeStreamState;->getMaxIndex()I
+PLcom/android/server/audio/AudioService$VolumeStreamState;->getMinIndex()I
+PLcom/android/server/audio/AudioService$VolumeStreamState;->getSettingNameForDevice(I)Ljava/lang/String;
+PLcom/android/server/audio/AudioService$VolumeStreamState;->getStreamType()I
+PLcom/android/server/audio/AudioService$VolumeStreamState;->getValidIndex(I)I
+PLcom/android/server/audio/AudioService$VolumeStreamState;->hasIndexForDevice(I)Z
+PLcom/android/server/audio/AudioService$VolumeStreamState;->hasValidSettingsName()Z
+PLcom/android/server/audio/AudioService$VolumeStreamState;->mute(Z)V
+PLcom/android/server/audio/AudioService$VolumeStreamState;->observeDevicesForStream_syncVSS(Z)I
+PLcom/android/server/audio/AudioService$VolumeStreamState;->readSettings()V
+PLcom/android/server/audio/AudioService$VolumeStreamState;->setAllIndexes(Lcom/android/server/audio/AudioService$VolumeStreamState;Ljava/lang/String;)V
+PLcom/android/server/audio/AudioService$VolumeStreamState;->setIndex(IILjava/lang/String;)Z
+PLcom/android/server/audio/AudioService;->-get0()[I
+PLcom/android/server/audio/AudioService;->-get1()[I
+PLcom/android/server/audio/AudioService;->-get12(Lcom/android/server/audio/AudioService;)Z
+PLcom/android/server/audio/AudioService;->-get13(Lcom/android/server/audio/AudioService;)Landroid/bluetooth/BluetoothHeadset;
+PLcom/android/server/audio/AudioService;->-get15(Lcom/android/server/audio/AudioService;)Ljava/lang/Boolean;
+PLcom/android/server/audio/AudioService;->-get16(Lcom/android/server/audio/AudioService;)Landroid/util/ArrayMap;
+PLcom/android/server/audio/AudioService;->-get17(Lcom/android/server/audio/AudioService;)Landroid/content/ContentResolver;
+PLcom/android/server/audio/AudioService;->-get2()Ljava/util/List;
+PLcom/android/server/audio/AudioService;->-get23(Lcom/android/server/audio/AudioService;)Z
+PLcom/android/server/audio/AudioService;->-get24(Lcom/android/server/audio/AudioService;)Lcom/android/server/audio/MediaFocusControl;
+PLcom/android/server/audio/AudioService;->-get26(Lcom/android/server/audio/AudioService;)Landroid/media/AudioManagerInternal$RingerModeDelegate;
+PLcom/android/server/audio/AudioService;->-get28(Lcom/android/server/audio/AudioService;)I
+PLcom/android/server/audio/AudioService;->-get29(Lcom/android/server/audio/AudioService;)Ljava/util/ArrayList;
+PLcom/android/server/audio/AudioService;->-get3(Lcom/android/server/audio/AudioService;)[[I
+PLcom/android/server/audio/AudioService;->-get31(Lcom/android/server/audio/AudioService;)Ljava/lang/Object;
+PLcom/android/server/audio/AudioService;->-get32(Lcom/android/server/audio/AudioService;)Ljava/lang/Object;
+PLcom/android/server/audio/AudioService;->-get33(Lcom/android/server/audio/AudioService;)Landroid/media/SoundPool;
+PLcom/android/server/audio/AudioService;->-get34(Lcom/android/server/audio/AudioService;)Lcom/android/server/audio/AudioService$SoundPoolCallback;
+PLcom/android/server/audio/AudioService;->-get35(Lcom/android/server/audio/AudioService;)Lcom/android/server/audio/AudioService$SoundPoolListenerThread;
+PLcom/android/server/audio/AudioService;->-get36(Lcom/android/server/audio/AudioService;)Landroid/os/Looper;
+PLcom/android/server/audio/AudioService;->-get37(Lcom/android/server/audio/AudioService;)[Lcom/android/server/audio/AudioService$VolumeStreamState;
+PLcom/android/server/audio/AudioService;->-get38(Lcom/android/server/audio/AudioService;)Z
+PLcom/android/server/audio/AudioService;->-get39(Lcom/android/server/audio/AudioService;)Z
+PLcom/android/server/audio/AudioService;->-get4(Lcom/android/server/audio/AudioService;)Landroid/bluetooth/BluetoothA2dp;
+PLcom/android/server/audio/AudioService;->-get40(Lcom/android/server/audio/AudioService;)Z
+PLcom/android/server/audio/AudioService;->-get42()I
+PLcom/android/server/audio/AudioService;->-get5(Lcom/android/server/audio/AudioService;)Ljava/lang/Object;
+PLcom/android/server/audio/AudioService;->-get7(Lcom/android/server/audio/AudioService;)Ljava/lang/Object;
+PLcom/android/server/audio/AudioService;->-get9(Lcom/android/server/audio/AudioService;)Lcom/android/server/audio/AudioService$AudioHandler;
+PLcom/android/server/audio/AudioService;->-set0(Lcom/android/server/audio/AudioService;Landroid/bluetooth/BluetoothA2dp;)Landroid/bluetooth/BluetoothA2dp;
+PLcom/android/server/audio/AudioService;->-set1(Lcom/android/server/audio/AudioService;[I)[I
+PLcom/android/server/audio/AudioService;->-set12(Lcom/android/server/audio/AudioService;Landroid/media/SoundPool;)Landroid/media/SoundPool;
+PLcom/android/server/audio/AudioService;->-set13(Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService$SoundPoolCallback;)Lcom/android/server/audio/AudioService$SoundPoolCallback;
+PLcom/android/server/audio/AudioService;->-set14(Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService$SoundPoolListenerThread;)Lcom/android/server/audio/AudioService$SoundPoolListenerThread;
+PLcom/android/server/audio/AudioService;->-set15(Lcom/android/server/audio/AudioService;Landroid/os/Looper;)Landroid/os/Looper;
+PLcom/android/server/audio/AudioService;->-set17(Lcom/android/server/audio/AudioService;Z)Z
+PLcom/android/server/audio/AudioService;->-set2(Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService$AudioHandler;)Lcom/android/server/audio/AudioService$AudioHandler;
+PLcom/android/server/audio/AudioService;->-set4(Lcom/android/server/audio/AudioService;Landroid/bluetooth/BluetoothHeadset;)Landroid/bluetooth/BluetoothHeadset;
+PLcom/android/server/audio/AudioService;->-set5(Lcom/android/server/audio/AudioService;Landroid/bluetooth/BluetoothDevice;)Landroid/bluetooth/BluetoothDevice;
+PLcom/android/server/audio/AudioService;->-set9(Lcom/android/server/audio/AudioService;Landroid/media/AudioManagerInternal$RingerModeDelegate;)Landroid/media/AudioManagerInternal$RingerModeDelegate;
+PLcom/android/server/audio/AudioService;->-wrap13(Lcom/android/server/audio/AudioService;)V
+PLcom/android/server/audio/AudioService;->-wrap16(Lcom/android/server/audio/AudioService;Landroid/content/Context;)V
+PLcom/android/server/audio/AudioService;->-wrap18(Lcom/android/server/audio/AudioService;)V
+PLcom/android/server/audio/AudioService;->-wrap2(Lcom/android/server/audio/AudioService;)Z
+PLcom/android/server/audio/AudioService;->-wrap20(Lcom/android/server/audio/AudioService;I)V
+PLcom/android/server/audio/AudioService;->-wrap23(Lcom/android/server/audio/AudioService;I)V
+PLcom/android/server/audio/AudioService;->-wrap25(Lcom/android/server/audio/AudioService;ZLjava/lang/String;)V
+PLcom/android/server/audio/AudioService;->-wrap33(Lcom/android/server/audio/AudioService;Z)V
+PLcom/android/server/audio/AudioService;->-wrap35(Lcom/android/server/audio/AudioService;)V
+PLcom/android/server/audio/AudioService;->-wrap36(Lcom/android/server/audio/AudioService;Landroid/content/Intent;)V
+PLcom/android/server/audio/AudioService;->-wrap38(Landroid/os/Handler;IIIILjava/lang/Object;I)V
+PLcom/android/server/audio/AudioService;->-wrap4(Lcom/android/server/audio/AudioService;I)I
+PLcom/android/server/audio/AudioService;->-wrap40(Lcom/android/server/audio/AudioService;II)V
+PLcom/android/server/audio/AudioService;->-wrap6(Lcom/android/server/audio/AudioService;III)I
+PLcom/android/server/audio/AudioService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/audio/AudioService;->abandonAudioFocus(Landroid/media/IAudioFocusDispatcher;Ljava/lang/String;Landroid/media/AudioAttributes;Ljava/lang/String;)I
+PLcom/android/server/audio/AudioService;->adjustStreamVolume(IIILjava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/audio/AudioService;->adjustSuggestedStreamVolume(IIILjava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/audio/AudioService;->adjustSuggestedStreamVolume(IIILjava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/audio/AudioService;->broadcastMasterMuteStatus(Z)V
+PLcom/android/server/audio/AudioService;->broadcastRingerMode(Ljava/lang/String;I)V
+PLcom/android/server/audio/AudioService;->broadcastScoConnectionState(I)V
+PLcom/android/server/audio/AudioService;->broadcastVibrateSetting(I)V
+PLcom/android/server/audio/AudioService;->checkAllAliasStreamVolumes()V
+PLcom/android/server/audio/AudioService;->checkAllFixedVolumeDevices()V
+PLcom/android/server/audio/AudioService;->checkAudioSettingsPermission(Ljava/lang/String;)Z
+PLcom/android/server/audio/AudioService;->checkForRingerModeChange(IIIZLjava/lang/String;I)I
+PLcom/android/server/audio/AudioService;->checkMuteAffectedStreams()V
+PLcom/android/server/audio/AudioService;->checkScoAudioState()V
+PLcom/android/server/audio/AudioService;->clearAllScoClients(IZ)V
+PLcom/android/server/audio/AudioService;->createAudioSystemThread()V
+PLcom/android/server/audio/AudioService;->createStreamStates()V
+PLcom/android/server/audio/AudioService;->disconnectBluetoothSco(I)V
+PLcom/android/server/audio/AudioService;->enforceSafeMediaVolume(Ljava/lang/String;)V
+PLcom/android/server/audio/AudioService;->enforceVolumeController(Ljava/lang/String;)V
+PLcom/android/server/audio/AudioService;->ensureValidDirection(I)V
+PLcom/android/server/audio/AudioService;->ensureValidRingerMode(I)V
+PLcom/android/server/audio/AudioService;->ensureValidStreamType(I)V
+PLcom/android/server/audio/AudioService;->forceVolumeControlStream(ILandroid/os/IBinder;)V
+PLcom/android/server/audio/AudioService;->getActiveStreamType(I)I
+PLcom/android/server/audio/AudioService;->getBluetoothHeadset()Z
+PLcom/android/server/audio/AudioService;->getCurrentUserId()I
+PLcom/android/server/audio/AudioService;->getDeviceForStream(I)I
+PLcom/android/server/audio/AudioService;->getDevicesForStream(I)I
+PLcom/android/server/audio/AudioService;->getDevicesForStream(IZ)I
+PLcom/android/server/audio/AudioService;->getLastAudibleStreamVolume(I)I
+PLcom/android/server/audio/AudioService;->getMode()I
+PLcom/android/server/audio/AudioService;->getRingerModeExternal()I
+PLcom/android/server/audio/AudioService;->getRingerModeInternal()I
+PLcom/android/server/audio/AudioService;->getRingtonePlayer()Landroid/media/IRingtonePlayer;
+PLcom/android/server/audio/AudioService;->getStreamMaxVolume(I)I
+PLcom/android/server/audio/AudioService;->getStreamMinVolume(I)I
+PLcom/android/server/audio/AudioService;->getStreamVolume(I)I
+PLcom/android/server/audio/AudioService;->getUiSoundsStreamType()I
+PLcom/android/server/audio/AudioService;->getVibrateSetting(I)I
+PLcom/android/server/audio/AudioService;->handleConfigurationChanged(Landroid/content/Context;)V
+PLcom/android/server/audio/AudioService;->initA11yMonitoring()V
+PLcom/android/server/audio/AudioService;->isAfMusicActiveRecently(I)Z
+PLcom/android/server/audio/AudioService;->isAndroidNPlus(Ljava/lang/String;)Z
+PLcom/android/server/audio/AudioService;->isBluetoothScoOn()Z
+PLcom/android/server/audio/AudioService;->isCameraSoundForced()Z
+PLcom/android/server/audio/AudioService;->isInCommunication()Z
+PLcom/android/server/audio/AudioService;->isMuteAdjust(I)Z
+PLcom/android/server/audio/AudioService;->isPlatformTelevision()Z
+PLcom/android/server/audio/AudioService;->isSpeakerphoneOn()Z
+PLcom/android/server/audio/AudioService;->isStreamAffectedByMute(I)Z
+PLcom/android/server/audio/AudioService;->isStreamAffectedByRingerMode(I)Z
+PLcom/android/server/audio/AudioService;->isStreamMute(I)Z
+PLcom/android/server/audio/AudioService;->isStreamMutedByRingerMode(I)Z
+PLcom/android/server/audio/AudioService;->isValidRingerMode(I)Z
+PLcom/android/server/audio/AudioService;->loadTouchSoundAssetDefaults()V
+PLcom/android/server/audio/AudioService;->loadTouchSoundAssets()V
+PLcom/android/server/audio/AudioService;->muteRingerModeStreams()V
+PLcom/android/server/audio/AudioService;->notifyVolumeControllerVisible(Landroid/media/IVolumeController;Z)V
+PLcom/android/server/audio/AudioService;->observeDevicesForStreams(I)V
+PLcom/android/server/audio/AudioService;->onBroadcastScoConnectionState(I)V
+PLcom/android/server/audio/AudioService;->onConfigureSafeVolume(ZLjava/lang/String;)V
+PLcom/android/server/audio/AudioService;->onIndicateSystemReady()V
+PLcom/android/server/audio/AudioService;->onSystemReady()V
+PLcom/android/server/audio/AudioService;->playSoundEffect(I)V
+PLcom/android/server/audio/AudioService;->playSoundEffectVolume(IF)V
+PLcom/android/server/audio/AudioService;->playerAttributes(ILandroid/media/AudioAttributes;)V
+PLcom/android/server/audio/AudioService;->playerEvent(II)V
+PLcom/android/server/audio/AudioService;->readAndSetLowRamDevice()V
+PLcom/android/server/audio/AudioService;->readAudioSettings(Z)V
+PLcom/android/server/audio/AudioService;->readCameraSoundForced()Z
+PLcom/android/server/audio/AudioService;->readDockAudioSettings(Landroid/content/ContentResolver;)V
+PLcom/android/server/audio/AudioService;->readPersistedSettings()V
+PLcom/android/server/audio/AudioService;->readUserRestrictions()V
+PLcom/android/server/audio/AudioService;->registerPlaybackCallback(Landroid/media/IPlaybackConfigDispatcher;)V
+PLcom/android/server/audio/AudioService;->releasePlayer(I)V
+PLcom/android/server/audio/AudioService;->requestAudioFocus(Landroid/media/AudioAttributes;ILandroid/os/IBinder;Landroid/media/IAudioFocusDispatcher;Ljava/lang/String;Ljava/lang/String;ILandroid/media/audiopolicy/IAudioPolicyCallback;I)I
+PLcom/android/server/audio/AudioService;->rescaleIndex(III)I
+PLcom/android/server/audio/AudioService;->resetBluetoothSco()V
+PLcom/android/server/audio/AudioService;->sendBroadcastToAll(Landroid/content/Intent;)V
+PLcom/android/server/audio/AudioService;->sendEncodedSurroundMode(I)V
+PLcom/android/server/audio/AudioService;->sendEncodedSurroundMode(Landroid/content/ContentResolver;)V
+PLcom/android/server/audio/AudioService;->sendMsg(Landroid/os/Handler;IIIILjava/lang/Object;I)V
+PLcom/android/server/audio/AudioService;->sendStickyBroadcastToAll(Landroid/content/Intent;)V
+PLcom/android/server/audio/AudioService;->sendVolumeUpdate(IIII)V
+PLcom/android/server/audio/AudioService;->setBluetoothScoOnInt(Z)V
+PLcom/android/server/audio/AudioService;->setForceUseInt_SyncDevices(II)V
+PLcom/android/server/audio/AudioService;->setMode(ILandroid/os/IBinder;Ljava/lang/String;)V
+PLcom/android/server/audio/AudioService;->setModeInt(ILandroid/os/IBinder;ILjava/lang/String;)I
+PLcom/android/server/audio/AudioService;->setRingerMode(ILjava/lang/String;Z)V
+PLcom/android/server/audio/AudioService;->setRingerModeExt(I)V
+PLcom/android/server/audio/AudioService;->setRingerModeInt(IZ)V
+PLcom/android/server/audio/AudioService;->setRingerModeInternal(ILjava/lang/String;)V
+PLcom/android/server/audio/AudioService;->setRingtonePlayer(Landroid/media/IRingtonePlayer;)V
+PLcom/android/server/audio/AudioService;->setStreamVolumeInt(IIIZLjava/lang/String;)V
+PLcom/android/server/audio/AudioService;->setSystemAudioMute(Z)V
+PLcom/android/server/audio/AudioService;->setVolumeController(Landroid/media/IVolumeController;)V
+PLcom/android/server/audio/AudioService;->setVolumePolicy(Landroid/media/VolumePolicy;)V
+PLcom/android/server/audio/AudioService;->startWatchingRoutes(Landroid/media/IAudioRoutesObserver;)Landroid/media/AudioRoutesInfo;
+PLcom/android/server/audio/AudioService;->systemReady()V
+PLcom/android/server/audio/AudioService;->trackPlayer(Landroid/media/PlayerBase$PlayerIdCard;)I
+PLcom/android/server/audio/AudioService;->updateA11yVolumeAlias(Z)V
+PLcom/android/server/audio/AudioService;->updateDefaultStreamOverrideDelay(Z)V
+PLcom/android/server/audio/AudioService;->updateMasterMono(Landroid/content/ContentResolver;)V
+PLcom/android/server/audio/AudioService;->updateRingerModeAffectedStreams()Z
+PLcom/android/server/audio/AudioService;->updateStreamVolumeAlias(ZLjava/lang/String;)V
+PLcom/android/server/audio/AudioService;->volumeAdjustmentAllowedByDnd(II)Z
+PLcom/android/server/audio/AudioService;->waitForAudioHandlerCreation()V
+PLcom/android/server/audio/AudioService;->wouldToggleZenMode(I)Z
+PLcom/android/server/audio/FocusRequester;-><init>(Landroid/media/AudioAttributes;IILandroid/media/IAudioFocusDispatcher;Landroid/os/IBinder;Ljava/lang/String;Lcom/android/server/audio/MediaFocusControl$AudioFocusDeathHandler;Ljava/lang/String;ILcom/android/server/audio/MediaFocusControl;I)V
+PLcom/android/server/audio/FocusRequester;->finalize()V
+PLcom/android/server/audio/FocusRequester;->getClientUid()I
+PLcom/android/server/audio/FocusRequester;->handleFocusGainFromRequest(I)V
+PLcom/android/server/audio/FocusRequester;->hasSameClient(Ljava/lang/String;)Z
+PLcom/android/server/audio/FocusRequester;->release()V
+PLcom/android/server/audio/FocusRequester;->toAudioFocusInfo()Landroid/media/AudioFocusInfo;
+PLcom/android/server/audio/MediaFocusControl$2;-><init>(Lcom/android/server/audio/MediaFocusControl;Z)V
+PLcom/android/server/audio/MediaFocusControl$2;->run()V
+PLcom/android/server/audio/MediaFocusControl$AudioFocusDeathHandler;-><init>(Lcom/android/server/audio/MediaFocusControl;Landroid/os/IBinder;)V
+PLcom/android/server/audio/MediaFocusControl;->-get0()[I
+PLcom/android/server/audio/MediaFocusControl;->-get1()Ljava/lang/Object;
+PLcom/android/server/audio/MediaFocusControl;->-get2(Lcom/android/server/audio/MediaFocusControl;)Lcom/android/server/audio/PlayerFocusEnforcer;
+PLcom/android/server/audio/MediaFocusControl;->-get5(Lcom/android/server/audio/MediaFocusControl;)Z
+PLcom/android/server/audio/MediaFocusControl;-><init>(Landroid/content/Context;Lcom/android/server/audio/PlayerFocusEnforcer;)V
+PLcom/android/server/audio/MediaFocusControl;->abandonAudioFocus(Landroid/media/IAudioFocusDispatcher;Ljava/lang/String;Landroid/media/AudioAttributes;Ljava/lang/String;)I
+PLcom/android/server/audio/MediaFocusControl;->canReassignAudioFocus()Z
+PLcom/android/server/audio/MediaFocusControl;->discardAudioFocusOwner()V
+PLcom/android/server/audio/MediaFocusControl;->getFocusRampTimeMs(ILandroid/media/AudioAttributes;)I
+PLcom/android/server/audio/MediaFocusControl;->notifyExtFocusPolicyFocusRequest_syncAf(Landroid/media/AudioFocusInfo;ILandroid/media/IAudioFocusDispatcher;Landroid/os/IBinder;)Z
+PLcom/android/server/audio/MediaFocusControl;->notifyExtPolicyFocusGrant_syncAf(Landroid/media/AudioFocusInfo;I)V
+PLcom/android/server/audio/MediaFocusControl;->notifyExtPolicyFocusLoss_syncAf(Landroid/media/AudioFocusInfo;Z)V
+PLcom/android/server/audio/MediaFocusControl;->notifyTopOfAudioFocusStack()V
+PLcom/android/server/audio/MediaFocusControl;->removeFocusStackEntry(Ljava/lang/String;ZZ)V
+PLcom/android/server/audio/MediaFocusControl;->requestAudioFocus(Landroid/media/AudioAttributes;ILandroid/os/IBinder;Landroid/media/IAudioFocusDispatcher;Ljava/lang/String;Ljava/lang/String;II)I
+PLcom/android/server/audio/MediaFocusControl;->runAudioCheckerForRingOrCallAsync(Z)V
+PLcom/android/server/audio/MediaFocusControl;->unduckPlayers(Lcom/android/server/audio/FocusRequester;)V
+PLcom/android/server/audio/PlaybackActivityMonitor$DuckingManager;-><init>()V
+PLcom/android/server/audio/PlaybackActivityMonitor$DuckingManager;-><init>(Lcom/android/server/audio/PlaybackActivityMonitor$DuckingManager;)V
+PLcom/android/server/audio/PlaybackActivityMonitor$DuckingManager;->removeReleased(Landroid/media/AudioPlaybackConfiguration;)V
+PLcom/android/server/audio/PlaybackActivityMonitor$DuckingManager;->unduckUid(ILjava/util/HashMap;)V
+PLcom/android/server/audio/PlaybackActivityMonitor$PlayMonitorClient;-><init>(Landroid/media/IPlaybackConfigDispatcher;Z)V
+PLcom/android/server/audio/PlaybackActivityMonitor$PlayMonitorClient;->init()Z
+PLcom/android/server/audio/PlaybackActivityMonitor;-><init>()V
+PLcom/android/server/audio/PlaybackActivityMonitor;->checkConfigurationCaller(ILandroid/media/AudioPlaybackConfiguration;I)Z
+PLcom/android/server/audio/PlaybackActivityMonitor;->dispatchPlaybackChange()V
+PLcom/android/server/audio/PlaybackActivityMonitor;->mutePlayersForCall([I)V
+PLcom/android/server/audio/PlaybackActivityMonitor;->playerAttributes(ILandroid/media/AudioAttributes;I)V
+PLcom/android/server/audio/PlaybackActivityMonitor;->playerDeath(I)V
+PLcom/android/server/audio/PlaybackActivityMonitor;->playerEvent(III)V
+PLcom/android/server/audio/PlaybackActivityMonitor;->registerPlaybackCallback(Landroid/media/IPlaybackConfigDispatcher;Z)V
+PLcom/android/server/audio/PlaybackActivityMonitor;->releasePlayer(II)V
+PLcom/android/server/audio/PlaybackActivityMonitor;->trackPlayer(Landroid/media/PlayerBase$PlayerIdCard;)I
+PLcom/android/server/audio/PlaybackActivityMonitor;->unduckPlayers(Lcom/android/server/audio/FocusRequester;)V
+PLcom/android/server/audio/PlaybackActivityMonitor;->unmutePlayersForCall()V
+PLcom/android/server/audio/RecordingActivityMonitor;-><init>()V
+PLcom/android/server/audio/RecordingActivityMonitor;->initMonitor()V
+PLcom/android/server/audio/RecordingActivityMonitor;->onRecordingConfigurationChanged(III[I)V
+PLcom/android/server/autofill/-$Lambda$JYqZriexGNVTrQ5cwTlcgjPSZFY$1;->$m$0()V
+PLcom/android/server/autofill/-$Lambda$JYqZriexGNVTrQ5cwTlcgjPSZFY$1;-><init>(IILjava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/autofill/-$Lambda$JYqZriexGNVTrQ5cwTlcgjPSZFY$1;->run()V
+PLcom/android/server/autofill/-$Lambda$nIY0QhGOcwXKKmuVD-pf4oRdtr0;-><init>(Ljava/lang/Object;)V
+PLcom/android/server/autofill/-$Lambda$tQjSpU6IVjrOfYzILn21rTYl4Vo;-><init>(BLjava/lang/Object;)V
+PLcom/android/server/autofill/-$Lambda$vJuxjgWyqc7YDAVrm5huZJMbjMg;->$m$0(ILandroid/os/Bundle;Landroid/os/Bundle;)V
+PLcom/android/server/autofill/-$Lambda$vJuxjgWyqc7YDAVrm5huZJMbjMg;-><init>(Ljava/lang/Object;)V
+PLcom/android/server/autofill/-$Lambda$vJuxjgWyqc7YDAVrm5huZJMbjMg;->onUserRestrictionsChanged(ILandroid/os/Bundle;Landroid/os/Bundle;)V
+PLcom/android/server/autofill/AutofillManagerService$1;-><init>(Lcom/android/server/autofill/AutofillManagerService;)V
+PLcom/android/server/autofill/AutofillManagerService$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/autofill/AutofillManagerService$2;-><init>(Lcom/android/server/autofill/AutofillManagerService;)V
+PLcom/android/server/autofill/AutofillManagerService$2;->onSomePackagesChanged()V
+PLcom/android/server/autofill/AutofillManagerService$AutoFillManagerServiceStub;-><init>(Lcom/android/server/autofill/AutofillManagerService;)V
+PLcom/android/server/autofill/AutofillManagerService$AutoFillManagerServiceStub;->addClient(Landroid/view/autofill/IAutoFillManagerClient;I)I
+PLcom/android/server/autofill/AutofillManagerService$AutoFillManagerServiceStub;->startSession(Landroid/os/IBinder;Landroid/os/IBinder;Landroid/view/autofill/AutofillId;Landroid/graphics/Rect;Landroid/view/autofill/AutofillValue;IZILjava/lang/String;)I
+PLcom/android/server/autofill/AutofillManagerService$AutoFillManagerServiceStub;->updateSession(ILandroid/view/autofill/AutofillId;Landroid/graphics/Rect;Landroid/view/autofill/AutofillValue;III)V
+PLcom/android/server/autofill/AutofillManagerService$LocalService;-><init>(Lcom/android/server/autofill/AutofillManagerService;)V
+PLcom/android/server/autofill/AutofillManagerService$LocalService;-><init>(Lcom/android/server/autofill/AutofillManagerService;Lcom/android/server/autofill/AutofillManagerService$LocalService;)V
+PLcom/android/server/autofill/AutofillManagerService$LocalService;->onBackKeyPressed()V
+PLcom/android/server/autofill/AutofillManagerService$SettingsObserver;-><init>(Lcom/android/server/autofill/AutofillManagerService;Landroid/os/Handler;)V
+PLcom/android/server/autofill/AutofillManagerService;->-get0(Lcom/android/server/autofill/AutofillManagerService;)Landroid/content/Context;
+PLcom/android/server/autofill/AutofillManagerService;->-get2(Lcom/android/server/autofill/AutofillManagerService;)Ljava/lang/Object;
+PLcom/android/server/autofill/AutofillManagerService;->-get5(Lcom/android/server/autofill/AutofillManagerService;)Lcom/android/server/autofill/ui/AutoFillUI;
+PLcom/android/server/autofill/AutofillManagerService;->-wrap2(Lcom/android/server/autofill/AutofillManagerService;I)V
+PLcom/android/server/autofill/AutofillManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/autofill/AutofillManagerService;->getServiceForUserLocked(I)Lcom/android/server/autofill/AutofillManagerServiceImpl;
+PLcom/android/server/autofill/AutofillManagerService;->lambda$-com_android_server_autofill_AutofillManagerService_5890(ILandroid/os/Bundle;Landroid/os/Bundle;)V
+PLcom/android/server/autofill/AutofillManagerService;->onBootPhase(I)V
+PLcom/android/server/autofill/AutofillManagerService;->onStart()V
+PLcom/android/server/autofill/AutofillManagerService;->onUnlockUser(I)V
+PLcom/android/server/autofill/AutofillManagerService;->peekServiceForUserLocked(I)Lcom/android/server/autofill/AutofillManagerServiceImpl;
+PLcom/android/server/autofill/AutofillManagerService;->setDebugLocked(Z)V
+PLcom/android/server/autofill/AutofillManagerService;->startTrackingPackageChanges()V
+PLcom/android/server/autofill/AutofillManagerService;->updateCachedServiceLocked(I)V
+PLcom/android/server/autofill/AutofillManagerService;->updateCachedServiceLocked(IZ)V
+PLcom/android/server/autofill/AutofillManagerServiceImpl;-><init>(Landroid/content/Context;Ljava/lang/Object;Landroid/util/LocalLog;ILcom/android/server/autofill/ui/AutoFillUI;Z)V
+PLcom/android/server/autofill/AutofillManagerServiceImpl;->addClientLocked(Landroid/view/autofill/IAutoFillManagerClient;)Z
+PLcom/android/server/autofill/AutofillManagerServiceImpl;->createSessionByTokenLocked(Landroid/os/IBinder;ILandroid/os/IBinder;ZLjava/lang/String;)Lcom/android/server/autofill/Session;
+PLcom/android/server/autofill/AutofillManagerServiceImpl;->getComponentNameFromSettings()Ljava/lang/String;
+PLcom/android/server/autofill/AutofillManagerServiceImpl;->isEnabled()Z
+PLcom/android/server/autofill/AutofillManagerServiceImpl;->isSetupCompletedLocked()Z
+PLcom/android/server/autofill/AutofillManagerServiceImpl;->pruneAbandonedSessionsLocked()V
+PLcom/android/server/autofill/AutofillManagerServiceImpl;->removeSessionLocked(I)V
+PLcom/android/server/autofill/AutofillManagerServiceImpl;->sendStateToClients(Z)V
+PLcom/android/server/autofill/AutofillManagerServiceImpl;->startSessionLocked(Landroid/os/IBinder;ILandroid/os/IBinder;Landroid/view/autofill/AutofillId;Landroid/graphics/Rect;Landroid/view/autofill/AutofillValue;ZILjava/lang/String;)I
+PLcom/android/server/autofill/AutofillManagerServiceImpl;->updateLocked(Z)V
+PLcom/android/server/autofill/AutofillManagerServiceImpl;->updateSessionLocked(IILandroid/view/autofill/AutofillId;Landroid/graphics/Rect;Landroid/view/autofill/AutofillValue;II)Z
+PLcom/android/server/autofill/Helper;->append(Ljava/lang/StringBuilder;Landroid/os/Bundle;)V
+PLcom/android/server/autofill/Helper;->bundleToString(Landroid/os/Bundle;)Ljava/lang/String;
+PLcom/android/server/autofill/RemoteFillService$MyHandler$1;-><init>(Lcom/android/server/autofill/RemoteFillService;)V
+PLcom/android/server/autofill/RemoteFillService$MyHandler$1;->executeMessage(Landroid/os/Message;)V
+PLcom/android/server/autofill/RemoteFillService$MyHandler;-><init>(Lcom/android/server/autofill/RemoteFillService;Landroid/content/Context;)V
+PLcom/android/server/autofill/RemoteFillService$PendingFillRequest$1;-><init>(Lcom/android/server/autofill/RemoteFillService$PendingFillRequest;Landroid/service/autofill/FillRequest;)V
+PLcom/android/server/autofill/RemoteFillService$PendingFillRequest$1;->onCancellable(Landroid/os/ICancellationSignal;)V
+PLcom/android/server/autofill/RemoteFillService$PendingFillRequest$1;->onSuccess(Landroid/service/autofill/FillResponse;)V
+PLcom/android/server/autofill/RemoteFillService$PendingFillRequest;->-set0(Lcom/android/server/autofill/RemoteFillService$PendingFillRequest;Landroid/os/ICancellationSignal;)Landroid/os/ICancellationSignal;
+PLcom/android/server/autofill/RemoteFillService$PendingFillRequest;-><init>(Landroid/service/autofill/FillRequest;Lcom/android/server/autofill/RemoteFillService;)V
+PLcom/android/server/autofill/RemoteFillService$PendingFillRequest;->run()V
+PLcom/android/server/autofill/RemoteFillService$PendingRequest;-><init>(Lcom/android/server/autofill/RemoteFillService;)V
+PLcom/android/server/autofill/RemoteFillService$PendingRequest;->finish()Z
+PLcom/android/server/autofill/RemoteFillService$PendingRequest;->getService()Lcom/android/server/autofill/RemoteFillService;
+PLcom/android/server/autofill/RemoteFillService$PendingRequest;->isCancelledLocked()Z
+PLcom/android/server/autofill/RemoteFillService$PendingRequest;->isFinal()Z
+PLcom/android/server/autofill/RemoteFillService$RemoteServiceConnection;-><init>(Lcom/android/server/autofill/RemoteFillService;)V
+PLcom/android/server/autofill/RemoteFillService$RemoteServiceConnection;-><init>(Lcom/android/server/autofill/RemoteFillService;Lcom/android/server/autofill/RemoteFillService$RemoteServiceConnection;)V
+PLcom/android/server/autofill/RemoteFillService$RemoteServiceConnection;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/autofill/RemoteFillService;->-get0(Lcom/android/server/autofill/RemoteFillService;)Landroid/service/autofill/IAutoFillService;
+PLcom/android/server/autofill/RemoteFillService;->-get1(Lcom/android/server/autofill/RemoteFillService;)Z
+PLcom/android/server/autofill/RemoteFillService;->-get2(Lcom/android/server/autofill/RemoteFillService;)Landroid/content/ComponentName;
+PLcom/android/server/autofill/RemoteFillService;->-get4(Lcom/android/server/autofill/RemoteFillService;)Z
+PLcom/android/server/autofill/RemoteFillService;->-get5(Lcom/android/server/autofill/RemoteFillService;)Lcom/android/internal/os/HandlerCaller;
+PLcom/android/server/autofill/RemoteFillService;->-get6(Lcom/android/server/autofill/RemoteFillService;)Lcom/android/server/autofill/RemoteFillService$PendingRequest;
+PLcom/android/server/autofill/RemoteFillService;->-set0(Lcom/android/server/autofill/RemoteFillService;Landroid/service/autofill/IAutoFillService;)Landroid/service/autofill/IAutoFillService;
+PLcom/android/server/autofill/RemoteFillService;->-set1(Lcom/android/server/autofill/RemoteFillService;Z)Z
+PLcom/android/server/autofill/RemoteFillService;->-set2(Lcom/android/server/autofill/RemoteFillService;Lcom/android/server/autofill/RemoteFillService$PendingRequest;)Lcom/android/server/autofill/RemoteFillService$PendingRequest;
+PLcom/android/server/autofill/RemoteFillService;->-set3(Lcom/android/server/autofill/RemoteFillService;Z)Z
+PLcom/android/server/autofill/RemoteFillService;->-wrap1(Lcom/android/server/autofill/RemoteFillService;Lcom/android/server/autofill/RemoteFillService$PendingRequest;IILandroid/service/autofill/FillResponse;)V
+PLcom/android/server/autofill/RemoteFillService;->-wrap5(Lcom/android/server/autofill/RemoteFillService;)V
+PLcom/android/server/autofill/RemoteFillService;->-wrap6(Lcom/android/server/autofill/RemoteFillService;Lcom/android/server/autofill/RemoteFillService$PendingRequest;)V
+PLcom/android/server/autofill/RemoteFillService;-><init>(Landroid/content/Context;Landroid/content/ComponentName;ILcom/android/server/autofill/RemoteFillService$FillServiceCallbacks;)V
+PLcom/android/server/autofill/RemoteFillService;->cancelCurrentRequest()I
+PLcom/android/server/autofill/RemoteFillService;->cancelScheduledUnbind()V
+PLcom/android/server/autofill/RemoteFillService;->destroy()V
+PLcom/android/server/autofill/RemoteFillService;->dispatchOnFillRequestSuccess(Lcom/android/server/autofill/RemoteFillService$PendingRequest;IILandroid/service/autofill/FillResponse;)V
+PLcom/android/server/autofill/RemoteFillService;->ensureBound()V
+PLcom/android/server/autofill/RemoteFillService;->ensureUnbound()V
+PLcom/android/server/autofill/RemoteFillService;->handleDestroy()V
+PLcom/android/server/autofill/RemoteFillService;->handlePendingRequest(Lcom/android/server/autofill/RemoteFillService$PendingRequest;)V
+PLcom/android/server/autofill/RemoteFillService;->handleResponseCallbackCommon(Lcom/android/server/autofill/RemoteFillService$PendingRequest;)Z
+PLcom/android/server/autofill/RemoteFillService;->isBound()Z
+PLcom/android/server/autofill/RemoteFillService;->lambda$-com_android_server_autofill_RemoteFillService_9957(Lcom/android/server/autofill/RemoteFillService$PendingRequest;ILandroid/service/autofill/FillResponse;I)V
+PLcom/android/server/autofill/RemoteFillService;->onFillRequest(Landroid/service/autofill/FillRequest;)V
+PLcom/android/server/autofill/RemoteFillService;->scheduleUnbind()V
+PLcom/android/server/autofill/Session$1;-><init>(Lcom/android/server/autofill/Session;)V
+PLcom/android/server/autofill/Session$1;->send(ILandroid/os/Bundle;)V
+PLcom/android/server/autofill/Session;->-get0(Lcom/android/server/autofill/Session;)Landroid/os/Bundle;
+PLcom/android/server/autofill/Session;->-get1(Lcom/android/server/autofill/Session;)Ljava/util/ArrayList;
+PLcom/android/server/autofill/Session;->-get2(Lcom/android/server/autofill/Session;)Ljava/lang/Object;
+PLcom/android/server/autofill/Session;->-get3(Lcom/android/server/autofill/Session;)Lcom/android/server/autofill/RemoteFillService;
+PLcom/android/server/autofill/Session;->-set0(Lcom/android/server/autofill/Session;Ljava/util/ArrayList;)Ljava/util/ArrayList;
+PLcom/android/server/autofill/Session;->-wrap0(Lcom/android/server/autofill/Session;)V
+PLcom/android/server/autofill/Session;->-wrap1(Lcom/android/server/autofill/Session;Landroid/service/autofill/FillContext;I)V
+PLcom/android/server/autofill/Session;-><init>(Lcom/android/server/autofill/AutofillManagerServiceImpl;Lcom/android/server/autofill/ui/AutoFillUI;Landroid/content/Context;Lcom/android/internal/os/HandlerCaller;ILjava/lang/Object;IILandroid/os/IBinder;Landroid/os/IBinder;ZLandroid/content/ComponentName;Ljava/lang/String;)V
+PLcom/android/server/autofill/Session;->cancelCurrentRequestLocked()V
+PLcom/android/server/autofill/Session;->destroyLocked()Lcom/android/server/autofill/RemoteFillService;
+PLcom/android/server/autofill/Session;->fillContextWithAllowedValues(Landroid/service/autofill/FillContext;I)V
+PLcom/android/server/autofill/Session;->getIdsOfAllViewStates()[Landroid/view/autofill/AutofillId;
+PLcom/android/server/autofill/Session;->getUiForShowing()Lcom/android/server/autofill/ui/AutoFillUI;
+PLcom/android/server/autofill/Session;->hideAllUiIfOwnedByMe()V
+PLcom/android/server/autofill/Session;->isIgnoredLocked(Landroid/view/autofill/AutofillId;)Z
+PLcom/android/server/autofill/Session;->notifyUnavailableToClient()V
+PLcom/android/server/autofill/Session;->onFillRequestSuccess(ILandroid/service/autofill/FillResponse;ILjava/lang/String;)V
+PLcom/android/server/autofill/Session;->removeSelf()V
+PLcom/android/server/autofill/Session;->removeSelfLocked()V
+PLcom/android/server/autofill/Session;->requestNewFillResponseLocked(I)V
+PLcom/android/server/autofill/Session;->updateLocked(Landroid/view/autofill/AutofillId;Landroid/graphics/Rect;Landroid/view/autofill/AutofillValue;II)V
+PLcom/android/server/autofill/ViewState;-><init>(Lcom/android/server/autofill/Session;Landroid/view/autofill/AutofillId;Lcom/android/server/autofill/ViewState$Listener;I)V
+PLcom/android/server/autofill/ViewState;->getAutofilledValue()Landroid/view/autofill/AutofillValue;
+PLcom/android/server/autofill/ViewState;->getCurrentValue()Landroid/view/autofill/AutofillValue;
+PLcom/android/server/autofill/ViewState;->maybeCallOnFillReady(I)V
+PLcom/android/server/autofill/ViewState;->setCurrentValue(Landroid/view/autofill/AutofillValue;)V
+PLcom/android/server/autofill/ViewState;->setState(I)V
+PLcom/android/server/autofill/ViewState;->update(Landroid/view/autofill/AutofillValue;Landroid/graphics/Rect;I)V
+PLcom/android/server/autofill/ui/-$Lambda$CJSLmckRMp4fHqnN2ZN5WFtAFP8;->$m$0()V
+PLcom/android/server/autofill/ui/-$Lambda$CJSLmckRMp4fHqnN2ZN5WFtAFP8;-><init>(BLjava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/autofill/ui/-$Lambda$CJSLmckRMp4fHqnN2ZN5WFtAFP8;->run()V
+PLcom/android/server/autofill/ui/-$Lambda$TTOM-vgvIOJotO3pKgpKhg7oNlE;->$m$0()V
+PLcom/android/server/autofill/ui/-$Lambda$TTOM-vgvIOJotO3pKgpKhg7oNlE;->$m$1()V
+PLcom/android/server/autofill/ui/-$Lambda$TTOM-vgvIOJotO3pKgpKhg7oNlE;->$m$3()V
+PLcom/android/server/autofill/ui/-$Lambda$TTOM-vgvIOJotO3pKgpKhg7oNlE;-><init>(BLjava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/autofill/ui/-$Lambda$TTOM-vgvIOJotO3pKgpKhg7oNlE;->run()V
+PLcom/android/server/autofill/ui/AutoFillUI;-><init>(Landroid/content/Context;)V
+PLcom/android/server/autofill/ui/AutoFillUI;->clearCallback(Lcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;)V
+PLcom/android/server/autofill/ui/AutoFillUI;->filterFillUi(Ljava/lang/String;Lcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;)V
+PLcom/android/server/autofill/ui/AutoFillUI;->hideAll(Lcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;)V
+PLcom/android/server/autofill/ui/AutoFillUI;->hideAllUiThread(Lcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;)V
+PLcom/android/server/autofill/ui/AutoFillUI;->hideFillUiUiThread(Lcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;)V
+PLcom/android/server/autofill/ui/AutoFillUI;->hideSaveUiUiThread(Lcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;)V
+PLcom/android/server/autofill/ui/AutoFillUI;->lambda$-com_android_server_autofill_ui_AutoFillUI_11492(Lcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;)V
+PLcom/android/server/autofill/ui/AutoFillUI;->lambda$-com_android_server_autofill_ui_AutoFillUI_3066(Lcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;)V
+PLcom/android/server/autofill/ui/AutoFillUI;->lambda$-com_android_server_autofill_ui_AutoFillUI_3386(Lcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;)V
+PLcom/android/server/autofill/ui/AutoFillUI;->lambda$-com_android_server_autofill_ui_AutoFillUI_4666(Lcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;Ljava/lang/String;)V
+PLcom/android/server/autofill/ui/AutoFillUI;->setCallback(Lcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;)V
+PLcom/android/server/autofill/ui/OverlayControl;-><init>(Landroid/content/Context;)V
+PLcom/android/server/backup/-$Lambda$UGPbw6RN8_4TeqlxQ94PEo_ieak;->$m$0()V
+PLcom/android/server/backup/-$Lambda$UGPbw6RN8_4TeqlxQ94PEo_ieak;-><init>(BLjava/lang/Object;)V
+PLcom/android/server/backup/-$Lambda$UGPbw6RN8_4TeqlxQ94PEo_ieak;->run()V
+PLcom/android/server/backup/BackupManagerService$1;-><init>(Lcom/android/server/backup/BackupManagerService;)V
+PLcom/android/server/backup/BackupManagerService$1;->run()V
+PLcom/android/server/backup/BackupManagerService$2;-><init>(Lcom/android/server/backup/BackupManagerService;)V
+PLcom/android/server/backup/BackupManagerService$2;->onTransportBound(Lcom/android/internal/backup/IBackupTransport;)Z
+PLcom/android/server/backup/BackupManagerService$3;-><init>(Lcom/android/server/backup/BackupManagerService;)V
+PLcom/android/server/backup/BackupManagerService$3;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/backup/BackupManagerService$4;-><init>(Lcom/android/server/backup/BackupManagerService;J)V
+PLcom/android/server/backup/BackupManagerService$4;->run()V
+PLcom/android/server/backup/BackupManagerService$7;-><init>(Lcom/android/server/backup/BackupManagerService;Ljava/lang/String;Ljava/util/HashSet;)V
+PLcom/android/server/backup/BackupManagerService$7;->run()V
+PLcom/android/server/backup/BackupManagerService$8;-><init>(Lcom/android/server/backup/BackupManagerService;Landroid/content/ComponentName;Landroid/app/backup/ISelectBackupTransportCallback;)V
+PLcom/android/server/backup/BackupManagerService$8;->onSuccess(Ljava/lang/String;)V
+PLcom/android/server/backup/BackupManagerService$BackupHandler;-><init>(Lcom/android/server/backup/BackupManagerService;Landroid/os/Looper;)V
+PLcom/android/server/backup/BackupManagerService$BackupHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/backup/BackupManagerService$BackupRequest;-><init>(Lcom/android/server/backup/BackupManagerService;Ljava/lang/String;)V
+PLcom/android/server/backup/BackupManagerService$FullBackupEntry;-><init>(Lcom/android/server/backup/BackupManagerService;Ljava/lang/String;J)V
+PLcom/android/server/backup/BackupManagerService$FullBackupEntry;->compareTo(Lcom/android/server/backup/BackupManagerService$FullBackupEntry;)I
+PLcom/android/server/backup/BackupManagerService$FullBackupEntry;->compareTo(Ljava/lang/Object;)I
+PLcom/android/server/backup/BackupManagerService$Lifecycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/backup/BackupManagerService$Lifecycle;->onStart()V
+PLcom/android/server/backup/BackupManagerService$Lifecycle;->onUnlockUser(I)V
+PLcom/android/server/backup/BackupManagerService$ProvisionedObserver;-><init>(Lcom/android/server/backup/BackupManagerService;Landroid/os/Handler;)V
+PLcom/android/server/backup/BackupManagerService$RunBackupReceiver;-><init>(Lcom/android/server/backup/BackupManagerService;)V
+PLcom/android/server/backup/BackupManagerService$RunBackupReceiver;-><init>(Lcom/android/server/backup/BackupManagerService;Lcom/android/server/backup/BackupManagerService$RunBackupReceiver;)V
+PLcom/android/server/backup/BackupManagerService$RunInitializeReceiver;-><init>(Lcom/android/server/backup/BackupManagerService;)V
+PLcom/android/server/backup/BackupManagerService$RunInitializeReceiver;-><init>(Lcom/android/server/backup/BackupManagerService;Lcom/android/server/backup/BackupManagerService$RunInitializeReceiver;)V
+PLcom/android/server/backup/BackupManagerService;->-get3(Lcom/android/server/backup/BackupManagerService;)Landroid/content/pm/PackageManager;
+PLcom/android/server/backup/BackupManagerService;->-get6(Lcom/android/server/backup/BackupManagerService;)Lcom/android/server/backup/TransportManager;
+PLcom/android/server/backup/BackupManagerService;->-wrap11(I)Z
+PLcom/android/server/backup/BackupManagerService;->-wrap17(Lcom/android/server/backup/BackupManagerService;Ljava/lang/String;)V
+PLcom/android/server/backup/BackupManagerService;->-wrap18(Lcom/android/server/backup/BackupManagerService;Ljava/lang/String;Ljava/util/HashSet;)V
+PLcom/android/server/backup/BackupManagerService;->-wrap23(Lcom/android/server/backup/BackupManagerService;Ljava/lang/String;)V
+PLcom/android/server/backup/BackupManagerService;->-wrap5(Landroid/content/pm/PackageInfo;)Z
+PLcom/android/server/backup/BackupManagerService;->-wrap9(I)Z
+PLcom/android/server/backup/BackupManagerService;-><init>(Landroid/content/Context;Lcom/android/server/backup/Trampoline;)V
+PLcom/android/server/backup/BackupManagerService;->addPackageParticipantsLocked([Ljava/lang/String;)V
+PLcom/android/server/backup/BackupManagerService;->addPackageParticipantsLockedInner(Ljava/lang/String;Ljava/util/List;)V
+PLcom/android/server/backup/BackupManagerService;->allAgentPackages()Ljava/util/List;
+PLcom/android/server/backup/BackupManagerService;->appGetsFullBackup(Landroid/content/pm/PackageInfo;)Z
+PLcom/android/server/backup/BackupManagerService;->appIsDisabled(Landroid/content/pm/ApplicationInfo;Landroid/content/pm/PackageManager;)Z
+PLcom/android/server/backup/BackupManagerService;->appIsEligibleForBackup(Landroid/content/pm/ApplicationInfo;Landroid/content/pm/PackageManager;)Z
+PLcom/android/server/backup/BackupManagerService;->backupSettingMigrated(I)Z
+PLcom/android/server/backup/BackupManagerService;->dataChanged(Ljava/lang/String;)V
+PLcom/android/server/backup/BackupManagerService;->dataChangedImpl(Ljava/lang/String;)V
+PLcom/android/server/backup/BackupManagerService;->dataChangedImpl(Ljava/lang/String;Ljava/util/HashSet;)V
+PLcom/android/server/backup/BackupManagerService;->dequeueFullBackupLocked(Ljava/lang/String;)V
+PLcom/android/server/backup/BackupManagerService;->enqueueFullBackup(Ljava/lang/String;J)V
+PLcom/android/server/backup/BackupManagerService;->getAvailableRestoreToken(Ljava/lang/String;)J
+PLcom/android/server/backup/BackupManagerService;->getCurrentTransport()Ljava/lang/String;
+PLcom/android/server/backup/BackupManagerService;->initPackageTracking()V
+PLcom/android/server/backup/BackupManagerService;->isBackupEnabled()Z
+PLcom/android/server/backup/BackupManagerService;->lambda$-com_android_server_backup_BackupManagerService_56323()V
+PLcom/android/server/backup/BackupManagerService;->parseLeftoverJournals()V
+PLcom/android/server/backup/BackupManagerService;->readBackupEnableState(I)Z
+PLcom/android/server/backup/BackupManagerService;->readFullBackupSchedule()Ljava/util/ArrayList;
+PLcom/android/server/backup/BackupManagerService;->restoreAtInstall(Ljava/lang/String;I)V
+PLcom/android/server/backup/BackupManagerService;->scheduleNextFullBackupJob(J)V
+PLcom/android/server/backup/BackupManagerService;->selectBackupTransportAsync(Landroid/content/ComponentName;Landroid/app/backup/ISelectBackupTransportCallback;)V
+PLcom/android/server/backup/BackupManagerService;->setBackupEnabled(Z)V
+PLcom/android/server/backup/BackupManagerService;->updateStateForTransport(Ljava/lang/String;)V
+PLcom/android/server/backup/BackupManagerService;->writeBackupEnableState(ZI)V
+PLcom/android/server/backup/BackupManagerService;->writeFullBackupScheduleAsync()V
+PLcom/android/server/backup/BackupManagerService;->writeToJournalLocked(Ljava/lang/String;)V
+PLcom/android/server/backup/FullBackupJob;->schedule(Landroid/content/Context;J)V
+PLcom/android/server/backup/KeyValueBackupJob;->cancel(Landroid/content/Context;)V
+PLcom/android/server/backup/KeyValueBackupJob;->schedule(Landroid/content/Context;)V
+PLcom/android/server/backup/KeyValueBackupJob;->schedule(Landroid/content/Context;J)V
+PLcom/android/server/backup/PackageManagerBackupAgent;->getStorableApplications(Landroid/content/pm/PackageManager;)Ljava/util/List;
+PLcom/android/server/backup/Trampoline;-><init>(Landroid/content/Context;)V
+PLcom/android/server/backup/Trampoline;->createBackupManagerService()Lcom/android/server/backup/BackupManagerServiceInterface;
+PLcom/android/server/backup/Trampoline;->createService()Lcom/android/server/backup/BackupManagerServiceInterface;
+PLcom/android/server/backup/Trampoline;->dataChanged(Ljava/lang/String;)V
+PLcom/android/server/backup/Trampoline;->getCurrentTransport()Ljava/lang/String;
+PLcom/android/server/backup/Trampoline;->getSuppressFile()Ljava/io/File;
+PLcom/android/server/backup/Trampoline;->initialize(I)V
+PLcom/android/server/backup/Trampoline;->isBackupDisabled()Z
+PLcom/android/server/backup/Trampoline;->isBackupEnabled()Z
+PLcom/android/server/backup/Trampoline;->isBackupServiceActive(I)Z
+PLcom/android/server/backup/Trampoline;->isRefactoredServiceEnabled()Z
+PLcom/android/server/backup/Trampoline;->restoreAtInstall(Ljava/lang/String;I)V
+PLcom/android/server/backup/Trampoline;->selectBackupTransportAsync(Landroid/content/ComponentName;Landroid/app/backup/ISelectBackupTransportCallback;)V
+PLcom/android/server/backup/Trampoline;->setBackupEnabled(Z)V
+PLcom/android/server/backup/TransportManager$RebindOnTimeoutHandler;-><init>(Lcom/android/server/backup/TransportManager;Landroid/os/Looper;)V
+PLcom/android/server/backup/TransportManager$TransportConnection;->-wrap0(Lcom/android/server/backup/TransportManager$TransportConnection;)Lcom/android/internal/backup/IBackupTransport;
+PLcom/android/server/backup/TransportManager$TransportConnection;->-wrap2(Lcom/android/server/backup/TransportManager$TransportConnection;Landroid/app/backup/SelectBackupTransportCallback;)V
+PLcom/android/server/backup/TransportManager$TransportConnection;->-wrap3(Lcom/android/server/backup/TransportManager$TransportConnection;)V
+PLcom/android/server/backup/TransportManager$TransportConnection;-><init>(Lcom/android/server/backup/TransportManager;Landroid/content/ComponentName;)V
+PLcom/android/server/backup/TransportManager$TransportConnection;-><init>(Lcom/android/server/backup/TransportManager;Landroid/content/ComponentName;Lcom/android/server/backup/TransportManager$TransportConnection;)V
+PLcom/android/server/backup/TransportManager$TransportConnection;->addListener(Landroid/app/backup/SelectBackupTransportCallback;)V
+PLcom/android/server/backup/TransportManager$TransportConnection;->bindIfUnbound()V
+PLcom/android/server/backup/TransportManager$TransportConnection;->getBinder()Lcom/android/internal/backup/IBackupTransport;
+PLcom/android/server/backup/TransportManager$TransportConnection;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/backup/TransportManager;->-get0(Lcom/android/server/backup/TransportManager;)Ljava/util/Map;
+PLcom/android/server/backup/TransportManager;->-get2(Lcom/android/server/backup/TransportManager;)Landroid/os/Handler;
+PLcom/android/server/backup/TransportManager;->-get3(Lcom/android/server/backup/TransportManager;)Lcom/android/server/backup/TransportManager$TransportBoundListener;
+PLcom/android/server/backup/TransportManager;->-get4(Lcom/android/server/backup/TransportManager;)Ljava/lang/Object;
+PLcom/android/server/backup/TransportManager;-><init>(Landroid/content/Context;Ljava/util/Set;Ljava/lang/String;Lcom/android/server/backup/TransportManager$TransportBoundListener;Landroid/os/Looper;)V
+PLcom/android/server/backup/TransportManager;->bindToAllInternal(Ljava/lang/String;[Ljava/lang/String;)V
+PLcom/android/server/backup/TransportManager;->bindToTransport(Landroid/content/ComponentName;Landroid/content/ServiceConnection;)Z
+PLcom/android/server/backup/TransportManager;->ensureTransportReady(Landroid/content/ComponentName;Landroid/app/backup/SelectBackupTransportCallback;)V
+PLcom/android/server/backup/TransportManager;->getCurrentTransportBinder()Lcom/android/internal/backup/IBackupTransport;
+PLcom/android/server/backup/TransportManager;->getCurrentTransportName()Ljava/lang/String;
+PLcom/android/server/backup/TransportManager;->getTransportBinder(Ljava/lang/String;)Lcom/android/internal/backup/IBackupTransport;
+PLcom/android/server/backup/TransportManager;->isTransportTrusted(Landroid/content/ComponentName;)Z
+PLcom/android/server/backup/TransportManager;->log_verbose(Ljava/lang/String;)V
+PLcom/android/server/backup/TransportManager;->onPackageAdded(Ljava/lang/String;)V
+PLcom/android/server/backup/TransportManager;->onPackageChanged(Ljava/lang/String;[Ljava/lang/String;)V
+PLcom/android/server/backup/TransportManager;->registerAllTransports()V
+PLcom/android/server/backup/TransportManager;->selectTransport(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/backup/TransportManager;->tryBindTransport(Landroid/content/ComponentName;)V
+PLcom/android/server/camera/CameraServiceProxy$1;-><init>(Lcom/android/server/camera/CameraServiceProxy;)V
+PLcom/android/server/camera/CameraServiceProxy$2;-><init>(Lcom/android/server/camera/CameraServiceProxy;)V
+PLcom/android/server/camera/CameraServiceProxy$2;->notifyCameraState(Ljava/lang/String;I)V
+PLcom/android/server/camera/CameraServiceProxy;->-wrap0(I)Ljava/lang/String;
+PLcom/android/server/camera/CameraServiceProxy;->-wrap3(Lcom/android/server/camera/CameraServiceProxy;Ljava/lang/String;I)V
+PLcom/android/server/camera/CameraServiceProxy;-><init>(Landroid/content/Context;)V
+PLcom/android/server/camera/CameraServiceProxy;->cameraStateToString(I)Ljava/lang/String;
+PLcom/android/server/camera/CameraServiceProxy;->getEnabledUserHandles(I)Ljava/util/Set;
+PLcom/android/server/camera/CameraServiceProxy;->notifyMediaserverLocked(ILjava/util/Set;)Z
+PLcom/android/server/camera/CameraServiceProxy;->notifyNfcService(Z)V
+PLcom/android/server/camera/CameraServiceProxy;->onStart()V
+PLcom/android/server/camera/CameraServiceProxy;->onStartUser(I)V
+PLcom/android/server/camera/CameraServiceProxy;->switchUserLocked(I)V
+PLcom/android/server/camera/CameraServiceProxy;->toArray(Ljava/util/Collection;)[I
+PLcom/android/server/camera/CameraServiceProxy;->updateActivityCount(Ljava/lang/String;I)V
+PLcom/android/server/clipboard/ClipboardService$ClipboardImpl;-><init>(Lcom/android/server/clipboard/ClipboardService;)V
+PLcom/android/server/clipboard/ClipboardService$ClipboardImpl;-><init>(Lcom/android/server/clipboard/ClipboardService;Lcom/android/server/clipboard/ClipboardService$ClipboardImpl;)V
+PLcom/android/server/clipboard/ClipboardService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/clipboard/ClipboardService;->onStart()V
+PLcom/android/server/companion/-$Lambda$AGIrYO-M2umJsGqqjbn8lgb57iM;->$m$1(Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/android/server/companion/-$Lambda$AGIrYO-M2umJsGqqjbn8lgb57iM;-><init>(B)V
+PLcom/android/server/companion/-$Lambda$AGIrYO-M2umJsGqqjbn8lgb57iM;->apply(Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/android/server/companion/CompanionDeviceManagerService$1;-><init>(Lcom/android/server/companion/CompanionDeviceManagerService;)V
+PLcom/android/server/companion/CompanionDeviceManagerService$1;->onPackageModified(Ljava/lang/String;)V
+PLcom/android/server/companion/CompanionDeviceManagerService$CompanionDeviceManagerImpl;-><init>(Lcom/android/server/companion/CompanionDeviceManagerService;)V
+PLcom/android/server/companion/CompanionDeviceManagerService$CompanionDeviceManagerImpl;->checkCallerIsSystemOr(Ljava/lang/String;I)V
+PLcom/android/server/companion/CompanionDeviceManagerService$CompanionDeviceManagerImpl;->checkUsesFeature(Ljava/lang/String;I)V
+PLcom/android/server/companion/CompanionDeviceManagerService$CompanionDeviceManagerImpl;->getAssociations(Ljava/lang/String;I)Ljava/util/List;
+PLcom/android/server/companion/CompanionDeviceManagerService;->-wrap3()Z
+PLcom/android/server/companion/CompanionDeviceManagerService;->-wrap4()I
+PLcom/android/server/companion/CompanionDeviceManagerService;->-wrap6(Lcom/android/server/companion/CompanionDeviceManagerService;ILjava/lang/String;)Ljava/util/ArrayList;
+PLcom/android/server/companion/CompanionDeviceManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/companion/CompanionDeviceManagerService;->getStorageFileForUser(I)Landroid/util/AtomicFile;
+PLcom/android/server/companion/CompanionDeviceManagerService;->isCallerSystem()Z
+PLcom/android/server/companion/CompanionDeviceManagerService;->lambda$-com_android_server_companion_CompanionDeviceManagerService_22134(Ljava/lang/Integer;)Landroid/util/AtomicFile;
+PLcom/android/server/companion/CompanionDeviceManagerService;->onStart()V
+PLcom/android/server/companion/CompanionDeviceManagerService;->readAllAssociations(ILjava/lang/String;)Ljava/util/ArrayList;
+PLcom/android/server/companion/CompanionDeviceManagerService;->registerPackageMonitor()V
+PLcom/android/server/connectivity/-$Lambda$MsbVMSDQhSjxBVLOF10aov6ySH4;->$m$0(Ljava/lang/Object;)I
+PLcom/android/server/connectivity/-$Lambda$MsbVMSDQhSjxBVLOF10aov6ySH4;-><init>()V
+PLcom/android/server/connectivity/-$Lambda$MsbVMSDQhSjxBVLOF10aov6ySH4;->applyAsInt(Ljava/lang/Object;)I
+PLcom/android/server/connectivity/-$Lambda$wTD5_jk703INH0KD5mtMJL_CwnI;-><init>(Ljava/lang/Object;)V
+PLcom/android/server/connectivity/DataConnectionStats$1;-><init>(Lcom/android/server/connectivity/DataConnectionStats;)V
+PLcom/android/server/connectivity/DataConnectionStats;-><init>(Landroid/content/Context;)V
+PLcom/android/server/connectivity/DataConnectionStats;->notePhoneDataConnectionState()V
+PLcom/android/server/connectivity/DataConnectionStats;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/connectivity/DataConnectionStats;->startMonitoring()V
+PLcom/android/server/connectivity/DataConnectionStats;->updateSimState(Landroid/content/Intent;)V
+PLcom/android/server/connectivity/IpConnectivityMetrics$Impl;-><init>(Lcom/android/server/connectivity/IpConnectivityMetrics;)V
+PLcom/android/server/connectivity/IpConnectivityMetrics$Impl;->enforceConnectivityInternalPermission()V
+PLcom/android/server/connectivity/IpConnectivityMetrics$Impl;->enforcePermission(Ljava/lang/String;)V
+PLcom/android/server/connectivity/IpConnectivityMetrics$Impl;->logEvent(Landroid/net/ConnectivityMetricsEvent;)I
+PLcom/android/server/connectivity/IpConnectivityMetrics;->-wrap0(Lcom/android/server/connectivity/IpConnectivityMetrics;Landroid/net/ConnectivityMetricsEvent;)I
+PLcom/android/server/connectivity/IpConnectivityMetrics;-><init>(Landroid/content/Context;)V
+PLcom/android/server/connectivity/IpConnectivityMetrics;-><init>(Landroid/content/Context;Ljava/util/function/ToIntFunction;)V
+PLcom/android/server/connectivity/IpConnectivityMetrics;->append(Landroid/net/ConnectivityMetricsEvent;)I
+PLcom/android/server/connectivity/IpConnectivityMetrics;->bufferCapacity()I
+PLcom/android/server/connectivity/IpConnectivityMetrics;->initBuffer()V
+PLcom/android/server/connectivity/IpConnectivityMetrics;->isRateLimited(Landroid/net/ConnectivityMetricsEvent;)Z
+PLcom/android/server/connectivity/IpConnectivityMetrics;->lambda$-com_android_server_connectivity_IpConnectivityMetrics_10868(Landroid/content/Context;)I
+PLcom/android/server/connectivity/IpConnectivityMetrics;->makeRateLimitingBuckets()Landroid/util/ArrayMap;
+PLcom/android/server/connectivity/IpConnectivityMetrics;->onBootPhase(I)V
+PLcom/android/server/connectivity/IpConnectivityMetrics;->onStart()V
+PLcom/android/server/connectivity/KeepaliveTracker;-><init>(Landroid/os/Handler;)V
+PLcom/android/server/connectivity/KeepaliveTracker;->handleCheckKeepalivesStillValid(Lcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/connectivity/LingerMonitor;-><init>(Landroid/content/Context;Lcom/android/server/connectivity/NetworkNotificationManager;IJ)V
+PLcom/android/server/connectivity/LingerMonitor;->makeTransportToNameMap()Ljava/util/HashMap;
+PLcom/android/server/connectivity/MockableSystemProperties;-><init>()V
+PLcom/android/server/connectivity/MockableSystemProperties;->get(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/connectivity/MockableSystemProperties;->getBoolean(Ljava/lang/String;Z)Z
+PLcom/android/server/connectivity/MockableSystemProperties;->getInt(Ljava/lang/String;I)I
+PLcom/android/server/connectivity/MockableSystemProperties;->set(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/connectivity/Nat464Xlat;-><init>(Landroid/content/Context;Landroid/os/INetworkManagementService;Landroid/os/Handler;Lcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/connectivity/Nat464Xlat;->fixupLinkProperties(Landroid/net/LinkProperties;)V
+PLcom/android/server/connectivity/Nat464Xlat;->isStarted()Z
+PLcom/android/server/connectivity/Nat464Xlat;->requiresClat(Lcom/android/server/connectivity/NetworkAgentInfo;)Z
+PLcom/android/server/connectivity/Nat464Xlat;->start()V
+PLcom/android/server/connectivity/Nat464Xlat;->stop()V
+PLcom/android/server/connectivity/NetdEventListenerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/connectivity/NetdEventListenerService;-><init>(Landroid/net/ConnectivityManager;)V
+PLcom/android/server/connectivity/NetdEventListenerService;->getTransports(I)J
+PLcom/android/server/connectivity/NetdEventListenerService;->makeConnectStats(I)Landroid/net/metrics/ConnectStats;
+PLcom/android/server/connectivity/NetdEventListenerService;->makeDnsEvent(I)Landroid/net/metrics/DnsEvent;
+PLcom/android/server/connectivity/NetdEventListenerService;->maybeVerboseLog(Ljava/lang/String;[Ljava/lang/Object;)V
+PLcom/android/server/connectivity/NetdEventListenerService;->onConnectEvent(IIILjava/lang/String;II)V
+PLcom/android/server/connectivity/NetdEventListenerService;->onDnsEvent(IIIILjava/lang/String;[Ljava/lang/String;II)V
+PLcom/android/server/connectivity/NetworkAgentInfo;->-getandroid-net-NetworkRequest$TypeSwitchesValues()[I
+PLcom/android/server/connectivity/NetworkAgentInfo;-><init>(Landroid/os/Messenger;Lcom/android/internal/util/AsyncChannel;Landroid/net/Network;Landroid/net/NetworkInfo;Landroid/net/LinkProperties;Landroid/net/NetworkCapabilities;ILandroid/content/Context;Landroid/os/Handler;Landroid/net/NetworkMisc;Landroid/net/NetworkRequest;Lcom/android/server/ConnectivityService;)V
+PLcom/android/server/connectivity/NetworkAgentInfo;->addRequest(Landroid/net/NetworkRequest;)Z
+PLcom/android/server/connectivity/NetworkAgentInfo;->getCurrentScore()I
+PLcom/android/server/connectivity/NetworkAgentInfo;->getCurrentScore(Z)I
+PLcom/android/server/connectivity/NetworkAgentInfo;->ignoreWifiUnvalidationPenalty()Z
+PLcom/android/server/connectivity/NetworkAgentInfo;->isBackgroundNetwork()Z
+PLcom/android/server/connectivity/NetworkAgentInfo;->isLingering()Z
+PLcom/android/server/connectivity/NetworkAgentInfo;->isSatisfyingRequest(I)Z
+PLcom/android/server/connectivity/NetworkAgentInfo;->isVPN()Z
+PLcom/android/server/connectivity/NetworkAgentInfo;->name()Ljava/lang/String;
+PLcom/android/server/connectivity/NetworkAgentInfo;->numForegroundNetworkRequests()I
+PLcom/android/server/connectivity/NetworkAgentInfo;->numNetworkRequests()I
+PLcom/android/server/connectivity/NetworkAgentInfo;->numRequestNetworkRequests()I
+PLcom/android/server/connectivity/NetworkAgentInfo;->removeRequest(I)V
+PLcom/android/server/connectivity/NetworkAgentInfo;->requestAt(I)Landroid/net/NetworkRequest;
+PLcom/android/server/connectivity/NetworkAgentInfo;->satisfies(Landroid/net/NetworkRequest;)Z
+PLcom/android/server/connectivity/NetworkAgentInfo;->setCurrentScore(I)V
+PLcom/android/server/connectivity/NetworkAgentInfo;->toString()Ljava/lang/String;
+PLcom/android/server/connectivity/NetworkAgentInfo;->unlingerRequest(Landroid/net/NetworkRequest;)Z
+PLcom/android/server/connectivity/NetworkAgentInfo;->updateLingerTimer()V
+PLcom/android/server/connectivity/NetworkAgentInfo;->updateRequestCounts(ZLandroid/net/NetworkRequest;)V
+PLcom/android/server/connectivity/NetworkMonitor$1ProbeThread;-><init>(Lcom/android/server/connectivity/NetworkMonitor;ZLandroid/net/ProxyInfo;Ljava/net/URL;Ljava/net/URL;Ljava/util/concurrent/CountDownLatch;)V
+PLcom/android/server/connectivity/NetworkMonitor$1ProbeThread;->result()Lcom/android/server/connectivity/NetworkMonitor$CaptivePortalProbeResult;
+PLcom/android/server/connectivity/NetworkMonitor$1ProbeThread;->run()V
+PLcom/android/server/connectivity/NetworkMonitor$CaptivePortalProbeResult;-><init>(I)V
+PLcom/android/server/connectivity/NetworkMonitor$CaptivePortalProbeResult;-><init>(ILjava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/connectivity/NetworkMonitor$CaptivePortalProbeResult;->isPortal()Z
+PLcom/android/server/connectivity/NetworkMonitor$CaptivePortalProbeResult;->isSuccessful()Z
+PLcom/android/server/connectivity/NetworkMonitor$CaptivePortalState;-><init>(Lcom/android/server/connectivity/NetworkMonitor;)V
+PLcom/android/server/connectivity/NetworkMonitor$CaptivePortalState;-><init>(Lcom/android/server/connectivity/NetworkMonitor;Lcom/android/server/connectivity/NetworkMonitor$CaptivePortalState;)V
+PLcom/android/server/connectivity/NetworkMonitor$DefaultState;-><init>(Lcom/android/server/connectivity/NetworkMonitor;)V
+PLcom/android/server/connectivity/NetworkMonitor$DefaultState;-><init>(Lcom/android/server/connectivity/NetworkMonitor;Lcom/android/server/connectivity/NetworkMonitor$DefaultState;)V
+PLcom/android/server/connectivity/NetworkMonitor$DefaultState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/connectivity/NetworkMonitor$EvaluatingState;-><init>(Lcom/android/server/connectivity/NetworkMonitor;)V
+PLcom/android/server/connectivity/NetworkMonitor$EvaluatingState;-><init>(Lcom/android/server/connectivity/NetworkMonitor;Lcom/android/server/connectivity/NetworkMonitor$EvaluatingState;)V
+PLcom/android/server/connectivity/NetworkMonitor$EvaluatingState;->enter()V
+PLcom/android/server/connectivity/NetworkMonitor$EvaluatingState;->exit()V
+PLcom/android/server/connectivity/NetworkMonitor$EvaluatingState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/connectivity/NetworkMonitor$EvaluationResult;-><init>(Ljava/lang/String;IZ)V
+PLcom/android/server/connectivity/NetworkMonitor$MaybeNotifyState;-><init>(Lcom/android/server/connectivity/NetworkMonitor;)V
+PLcom/android/server/connectivity/NetworkMonitor$MaybeNotifyState;-><init>(Lcom/android/server/connectivity/NetworkMonitor;Lcom/android/server/connectivity/NetworkMonitor$MaybeNotifyState;)V
+PLcom/android/server/connectivity/NetworkMonitor$MaybeNotifyState;->exit()V
+PLcom/android/server/connectivity/NetworkMonitor$ValidatedState;-><init>(Lcom/android/server/connectivity/NetworkMonitor;)V
+PLcom/android/server/connectivity/NetworkMonitor$ValidatedState;-><init>(Lcom/android/server/connectivity/NetworkMonitor;Lcom/android/server/connectivity/NetworkMonitor$ValidatedState;)V
+PLcom/android/server/connectivity/NetworkMonitor$ValidatedState;->enter()V
+PLcom/android/server/connectivity/NetworkMonitor$ValidationStage;-><init>(Ljava/lang/String;IZ)V
+PLcom/android/server/connectivity/NetworkMonitor;->-get11(Lcom/android/server/connectivity/NetworkMonitor;)Lcom/android/server/connectivity/NetworkAgentInfo;
+PLcom/android/server/connectivity/NetworkMonitor;->-get12(Lcom/android/server/connectivity/NetworkMonitor;)I
+PLcom/android/server/connectivity/NetworkMonitor;->-get13(Lcom/android/server/connectivity/NetworkMonitor;)I
+PLcom/android/server/connectivity/NetworkMonitor;->-get14(Lcom/android/server/connectivity/NetworkMonitor;)Z
+PLcom/android/server/connectivity/NetworkMonitor;->-get15(Lcom/android/server/connectivity/NetworkMonitor;)Lcom/android/internal/util/State;
+PLcom/android/server/connectivity/NetworkMonitor;->-get16(Lcom/android/server/connectivity/NetworkMonitor;)I
+PLcom/android/server/connectivity/NetworkMonitor;->-get2(Lcom/android/server/connectivity/NetworkMonitor;)Landroid/os/Handler;
+PLcom/android/server/connectivity/NetworkMonitor;->-get4(Lcom/android/server/connectivity/NetworkMonitor;)Landroid/net/NetworkRequest;
+PLcom/android/server/connectivity/NetworkMonitor;->-get6(Lcom/android/server/connectivity/NetworkMonitor;)Lcom/android/internal/util/State;
+PLcom/android/server/connectivity/NetworkMonitor;->-get7(Lcom/android/server/connectivity/NetworkMonitor;)Landroid/net/util/Stopwatch;
+PLcom/android/server/connectivity/NetworkMonitor;->-set3(Lcom/android/server/connectivity/NetworkMonitor;I)I
+PLcom/android/server/connectivity/NetworkMonitor;->-set7(Lcom/android/server/connectivity/NetworkMonitor;I)I
+PLcom/android/server/connectivity/NetworkMonitor;->-wrap0(Lcom/android/server/connectivity/NetworkMonitor;Landroid/net/ProxyInfo;Ljava/net/URL;I)Lcom/android/server/connectivity/NetworkMonitor$CaptivePortalProbeResult;
+PLcom/android/server/connectivity/NetworkMonitor;->-wrap1(Lcom/android/server/connectivity/NetworkMonitor;)Lcom/android/server/connectivity/NetworkMonitor$ValidationStage;
+PLcom/android/server/connectivity/NetworkMonitor;->-wrap2(Lcom/android/server/connectivity/NetworkMonitor;Lcom/android/server/connectivity/NetworkMonitor$ValidationStage;Lcom/android/server/connectivity/NetworkMonitor$EvaluationResult;)I
+PLcom/android/server/connectivity/NetworkMonitor;->-wrap3(Lcom/android/server/connectivity/NetworkMonitor;I)V
+PLcom/android/server/connectivity/NetworkMonitor;->-wrap4(Lcom/android/server/connectivity/NetworkMonitor;I)V
+PLcom/android/server/connectivity/NetworkMonitor;-><init>(Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/connectivity/NetworkAgentInfo;Landroid/net/NetworkRequest;)V
+PLcom/android/server/connectivity/NetworkMonitor;-><init>(Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/connectivity/NetworkAgentInfo;Landroid/net/NetworkRequest;Landroid/net/metrics/IpConnectivityLog;)V
+PLcom/android/server/connectivity/NetworkMonitor;->getCaptivePortalServerHttpUrl(Landroid/content/Context;)Ljava/lang/String;
+PLcom/android/server/connectivity/NetworkMonitor;->getCaptivePortalServerHttpsUrl(Landroid/content/Context;)Ljava/lang/String;
+PLcom/android/server/connectivity/NetworkMonitor;->getCaptivePortalUserAgent(Landroid/content/Context;)Ljava/lang/String;
+PLcom/android/server/connectivity/NetworkMonitor;->getSetting(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/connectivity/NetworkMonitor;->getValidationLogs()Landroid/util/LocalLog$ReadOnlyLocalLog;
+PLcom/android/server/connectivity/NetworkMonitor;->isCaptivePortal()Lcom/android/server/connectivity/NetworkMonitor$CaptivePortalProbeResult;
+PLcom/android/server/connectivity/NetworkMonitor;->log(Ljava/lang/String;)V
+PLcom/android/server/connectivity/NetworkMonitor;->logNetworkEvent(I)V
+PLcom/android/server/connectivity/NetworkMonitor;->logValidationProbe(JII)V
+PLcom/android/server/connectivity/NetworkMonitor;->makeCaptivePortalFallbackUrls(Landroid/content/Context;)[Ljava/net/URL;
+PLcom/android/server/connectivity/NetworkMonitor;->makeURL(Ljava/lang/String;)Ljava/net/URL;
+PLcom/android/server/connectivity/NetworkMonitor;->maybeLogEvaluationResult(I)V
+PLcom/android/server/connectivity/NetworkMonitor;->networkEventType(Lcom/android/server/connectivity/NetworkMonitor$ValidationStage;Lcom/android/server/connectivity/NetworkMonitor$EvaluationResult;)I
+PLcom/android/server/connectivity/NetworkMonitor;->sendDnsAndHttpProbes(Landroid/net/ProxyInfo;Ljava/net/URL;I)Lcom/android/server/connectivity/NetworkMonitor$CaptivePortalProbeResult;
+PLcom/android/server/connectivity/NetworkMonitor;->sendDnsProbe(Ljava/lang/String;)V
+PLcom/android/server/connectivity/NetworkMonitor;->sendHttpProbe(Ljava/net/URL;I)Lcom/android/server/connectivity/NetworkMonitor$CaptivePortalProbeResult;
+PLcom/android/server/connectivity/NetworkMonitor;->sendNetworkConditionsBroadcast(ZZJJ)V
+PLcom/android/server/connectivity/NetworkMonitor;->sendParallelHttpProbes(Landroid/net/ProxyInfo;Ljava/net/URL;Ljava/net/URL;)Lcom/android/server/connectivity/NetworkMonitor$CaptivePortalProbeResult;
+PLcom/android/server/connectivity/NetworkMonitor;->validationLog(ILjava/lang/Object;Ljava/lang/String;)V
+PLcom/android/server/connectivity/NetworkMonitor;->validationLog(Ljava/lang/String;)V
+PLcom/android/server/connectivity/NetworkMonitor;->validationStage()Lcom/android/server/connectivity/NetworkMonitor$ValidationStage;
+PLcom/android/server/connectivity/NetworkNotificationManager;-><init>(Landroid/content/Context;Landroid/telephony/TelephonyManager;Landroid/app/NotificationManager;)V
+PLcom/android/server/connectivity/NetworkNotificationManager;->clearNotification(I)V
+PLcom/android/server/connectivity/PacManager$1;-><init>(Lcom/android/server/connectivity/PacManager;)V
+PLcom/android/server/connectivity/PacManager$PacRefreshIntentReceiver;-><init>(Lcom/android/server/connectivity/PacManager;)V
+PLcom/android/server/connectivity/PacManager;-><init>(Landroid/content/Context;Landroid/os/Handler;I)V
+PLcom/android/server/connectivity/PermissionMonitor$1;-><init>(Lcom/android/server/connectivity/PermissionMonitor;)V
+PLcom/android/server/connectivity/PermissionMonitor$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/connectivity/PermissionMonitor;->-wrap0(Lcom/android/server/connectivity/PermissionMonitor;Ljava/lang/String;I)V
+PLcom/android/server/connectivity/PermissionMonitor;-><init>(Landroid/content/Context;Landroid/os/INetworkManagementService;)V
+PLcom/android/server/connectivity/PermissionMonitor;->hasNetworkPermission(Landroid/content/pm/PackageInfo;)Z
+PLcom/android/server/connectivity/PermissionMonitor;->hasRestrictedNetworkPermission(Landroid/content/pm/PackageInfo;)Z
+PLcom/android/server/connectivity/PermissionMonitor;->highestPermissionForUid(Ljava/lang/Boolean;Ljava/lang/String;)Ljava/lang/Boolean;
+PLcom/android/server/connectivity/PermissionMonitor;->log(Ljava/lang/String;)V
+PLcom/android/server/connectivity/PermissionMonitor;->onAppAdded(Ljava/lang/String;I)V
+PLcom/android/server/connectivity/PermissionMonitor;->startMonitoring()V
+PLcom/android/server/connectivity/PermissionMonitor;->toIntArray(Ljava/util/List;)[I
+PLcom/android/server/connectivity/PermissionMonitor;->update(Ljava/util/Set;Ljava/util/Map;Z)V
+PLcom/android/server/connectivity/Tethering$3;-><init>(Lcom/android/server/connectivity/Tethering;Ljava/lang/String;)V
+PLcom/android/server/connectivity/Tethering$3;->updateInterfaceState(Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;II)V
+PLcom/android/server/connectivity/Tethering$3;->updateLinkProperties(Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;Landroid/net/LinkProperties;)V
+PLcom/android/server/connectivity/Tethering$StateReceiver;-><init>(Lcom/android/server/connectivity/Tethering;)V
+PLcom/android/server/connectivity/Tethering$StateReceiver;-><init>(Lcom/android/server/connectivity/Tethering;Lcom/android/server/connectivity/Tethering$StateReceiver;)V
+PLcom/android/server/connectivity/Tethering$StateReceiver;->handleConnectivityAction(Landroid/content/Intent;)V
+PLcom/android/server/connectivity/Tethering$StateReceiver;->handleUsbAction(Landroid/content/Intent;)V
+PLcom/android/server/connectivity/Tethering$StateReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/connectivity/Tethering$TetherMasterSM$ErrorState;-><init>(Lcom/android/server/connectivity/Tethering$TetherMasterSM;)V
+PLcom/android/server/connectivity/Tethering$TetherMasterSM$InitialState;-><init>(Lcom/android/server/connectivity/Tethering$TetherMasterSM;)V
+PLcom/android/server/connectivity/Tethering$TetherMasterSM$InitialState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/connectivity/Tethering$TetherMasterSM$SetDnsForwardersErrorState;-><init>(Lcom/android/server/connectivity/Tethering$TetherMasterSM;)V
+PLcom/android/server/connectivity/Tethering$TetherMasterSM$SetIpForwardingDisabledErrorState;-><init>(Lcom/android/server/connectivity/Tethering$TetherMasterSM;)V
+PLcom/android/server/connectivity/Tethering$TetherMasterSM$SetIpForwardingEnabledErrorState;-><init>(Lcom/android/server/connectivity/Tethering$TetherMasterSM;)V
+PLcom/android/server/connectivity/Tethering$TetherMasterSM$StartTetheringErrorState;-><init>(Lcom/android/server/connectivity/Tethering$TetherMasterSM;)V
+PLcom/android/server/connectivity/Tethering$TetherMasterSM$StopTetheringErrorState;-><init>(Lcom/android/server/connectivity/Tethering$TetherMasterSM;)V
+PLcom/android/server/connectivity/Tethering$TetherMasterSM$TetherMasterUtilState;-><init>(Lcom/android/server/connectivity/Tethering$TetherMasterSM;)V
+PLcom/android/server/connectivity/Tethering$TetherMasterSM$TetherModeAliveState;-><init>(Lcom/android/server/connectivity/Tethering$TetherMasterSM;)V
+PLcom/android/server/connectivity/Tethering$TetherMasterSM;->-wrap1(Lcom/android/server/connectivity/Tethering$TetherMasterSM;Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;)V
+PLcom/android/server/connectivity/Tethering$TetherMasterSM;-><init>(Lcom/android/server/connectivity/Tethering;Ljava/lang/String;Landroid/os/Looper;)V
+PLcom/android/server/connectivity/Tethering$TetherMasterSM;->handleInterfaceServingStateInactive(Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;)V
+PLcom/android/server/connectivity/Tethering$TetherState;-><init>(Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;)V
+PLcom/android/server/connectivity/Tethering;->-get10(Lcom/android/server/connectivity/Tethering;)Lcom/android/internal/util/StateMachine;
+PLcom/android/server/connectivity/Tethering;->-get3(Lcom/android/server/connectivity/Tethering;)Ljava/util/HashSet;
+PLcom/android/server/connectivity/Tethering;->-get4(Lcom/android/server/connectivity/Tethering;)Landroid/net/util/SharedLog;
+PLcom/android/server/connectivity/Tethering;->-get6(Lcom/android/server/connectivity/Tethering;)Lcom/android/server/connectivity/tethering/OffloadController;
+PLcom/android/server/connectivity/Tethering;->-get7(Lcom/android/server/connectivity/Tethering;)Ljava/lang/Object;
+PLcom/android/server/connectivity/Tethering;->-get8(Lcom/android/server/connectivity/Tethering;)Z
+PLcom/android/server/connectivity/Tethering;->-set1(Lcom/android/server/connectivity/Tethering;Z)Z
+PLcom/android/server/connectivity/Tethering;->-set2(Lcom/android/server/connectivity/Tethering;Z)Z
+PLcom/android/server/connectivity/Tethering;->-wrap11(Lcom/android/server/connectivity/Tethering;)V
+PLcom/android/server/connectivity/Tethering;->-wrap5(Lcom/android/server/connectivity/Tethering;Lcom/android/internal/util/State;I)V
+PLcom/android/server/connectivity/Tethering;->-wrap6(Lcom/android/server/connectivity/Tethering;Ljava/lang/String;Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;II)V
+PLcom/android/server/connectivity/Tethering;->-wrap7(Lcom/android/server/connectivity/Tethering;Ljava/lang/String;Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;Landroid/net/LinkProperties;)V
+PLcom/android/server/connectivity/Tethering;-><init>(Landroid/content/Context;Landroid/os/INetworkManagementService;Landroid/net/INetworkStatsService;Landroid/net/INetworkPolicyManager;Landroid/os/Looper;Lcom/android/server/connectivity/MockableSystemProperties;Lcom/android/server/connectivity/tethering/TetheringDependencies;)V
+PLcom/android/server/connectivity/Tethering;->clearTetheredNotification()V
+PLcom/android/server/connectivity/Tethering;->getConnectivityManager()Landroid/net/ConnectivityManager;
+PLcom/android/server/connectivity/Tethering;->hasTetherableConfiguration()Z
+PLcom/android/server/connectivity/Tethering;->ifaceNameToType(Ljava/lang/String;)I
+PLcom/android/server/connectivity/Tethering;->interfaceAdded(Ljava/lang/String;)V
+PLcom/android/server/connectivity/Tethering;->interfaceLinkStateChanged(Ljava/lang/String;Z)V
+PLcom/android/server/connectivity/Tethering;->interfaceRemoved(Ljava/lang/String;)V
+PLcom/android/server/connectivity/Tethering;->interfaceStatusChanged(Ljava/lang/String;Z)V
+PLcom/android/server/connectivity/Tethering;->makeControlCallback(Ljava/lang/String;)Lcom/android/server/connectivity/tethering/IControlsTethering;
+PLcom/android/server/connectivity/Tethering;->maybeLogMessage(Lcom/android/internal/util/State;I)V
+PLcom/android/server/connectivity/Tethering;->maybeTrackNewInterfaceLocked(Ljava/lang/String;)V
+PLcom/android/server/connectivity/Tethering;->notifyInterfaceStateChange(Ljava/lang/String;Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;II)V
+PLcom/android/server/connectivity/Tethering;->notifyLinkPropertiesChanged(Ljava/lang/String;Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;Landroid/net/LinkProperties;)V
+PLcom/android/server/connectivity/Tethering;->sendTetherStateChangedBroadcast()V
+PLcom/android/server/connectivity/Tethering;->stopTrackingInterfaceLocked(Ljava/lang/String;)V
+PLcom/android/server/connectivity/Tethering;->updateConfiguration()V
+PLcom/android/server/connectivity/Vpn$1;-><init>(Lcom/android/server/connectivity/Vpn;)V
+PLcom/android/server/connectivity/Vpn$2;-><init>(Lcom/android/server/connectivity/Vpn;)V
+PLcom/android/server/connectivity/Vpn$SystemServices;-><init>(Landroid/content/Context;)V
+PLcom/android/server/connectivity/Vpn$SystemServices;->settingsSecureGetIntForUser(Ljava/lang/String;II)I
+PLcom/android/server/connectivity/Vpn$SystemServices;->settingsSecureGetStringForUser(Ljava/lang/String;I)Ljava/lang/String;
+PLcom/android/server/connectivity/Vpn;-><init>(Landroid/os/Looper;Landroid/content/Context;Landroid/os/INetworkManagementService;I)V
+PLcom/android/server/connectivity/Vpn;-><init>(Landroid/os/Looper;Landroid/content/Context;Landroid/os/INetworkManagementService;ILcom/android/server/connectivity/Vpn$SystemServices;)V
+PLcom/android/server/connectivity/Vpn;->enforceControlPermission()V
+PLcom/android/server/connectivity/Vpn;->enforceControlPermissionOrInternalCaller()V
+PLcom/android/server/connectivity/Vpn;->getAlwaysOnPackage()Ljava/lang/String;
+PLcom/android/server/connectivity/Vpn;->getAppUid(Ljava/lang/String;I)I
+PLcom/android/server/connectivity/Vpn;->getUnderlyingNetworks()[Landroid/net/Network;
+PLcom/android/server/connectivity/Vpn;->getVpnConfig()Lcom/android/internal/net/VpnConfig;
+PLcom/android/server/connectivity/Vpn;->getVpnInfo()Lcom/android/internal/net/VpnInfo;
+PLcom/android/server/connectivity/Vpn;->isBlockingUid(I)Z
+PLcom/android/server/connectivity/Vpn;->isCurrentPreparedPackage(Ljava/lang/String;)Z
+PLcom/android/server/connectivity/Vpn;->isNullOrLegacyVpn(Ljava/lang/String;)Z
+PLcom/android/server/connectivity/Vpn;->isRunningLocked()Z
+PLcom/android/server/connectivity/Vpn;->loadAlwaysOnPackage()V
+PLcom/android/server/connectivity/Vpn;->maybeRegisterPackageChangeReceiverLocked(Ljava/lang/String;)V
+PLcom/android/server/connectivity/Vpn;->setAllowOnlyVpnForUids(ZLjava/util/Collection;)Z
+PLcom/android/server/connectivity/Vpn;->setAlwaysOnPackageInternal(Ljava/lang/String;Z)Z
+PLcom/android/server/connectivity/Vpn;->setVpnForcedLocked(Z)V
+PLcom/android/server/connectivity/Vpn;->setVpnForcedWithExemptionsLocked(ZLjava/util/List;)V
+PLcom/android/server/connectivity/Vpn;->startAlwaysOnVpn()Z
+PLcom/android/server/connectivity/Vpn;->unregisterPackageChangeReceiverLocked()V
+PLcom/android/server/connectivity/Vpn;->updateAlwaysOnNotification(Landroid/net/NetworkInfo$DetailedState;)V
+PLcom/android/server/connectivity/tethering/IControlsTethering;-><init>()V
+PLcom/android/server/connectivity/tethering/IPv6TetheringCoordinator;-><init>(Ljava/util/ArrayList;Landroid/net/util/SharedLog;)V
+PLcom/android/server/connectivity/tethering/IPv6TetheringCoordinator;->findDownstream(Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;)Lcom/android/server/connectivity/tethering/IPv6TetheringCoordinator$Downstream;
+PLcom/android/server/connectivity/tethering/IPv6TetheringCoordinator;->generateUniqueLocalPrefix()[B
+PLcom/android/server/connectivity/tethering/IPv6TetheringCoordinator;->removeActiveDownstream(Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;)V
+PLcom/android/server/connectivity/tethering/IPv6TetheringCoordinator;->stopIPv6TetheringOn(Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;)V
+PLcom/android/server/connectivity/tethering/OffloadController;-><init>(Landroid/os/Handler;Lcom/android/server/connectivity/tethering/OffloadHardwareInterface;Landroid/content/ContentResolver;Landroid/net/util/SharedLog;)V
+PLcom/android/server/connectivity/tethering/OffloadController;->removeDownstreamInterface(Ljava/lang/String;)V
+PLcom/android/server/connectivity/tethering/OffloadController;->started()Z
+PLcom/android/server/connectivity/tethering/OffloadHardwareInterface;-><init>(Landroid/os/Handler;Landroid/net/util/SharedLog;)V
+PLcom/android/server/connectivity/tethering/SimChangeListener;-><init>(Landroid/content/Context;Landroid/os/Handler;Ljava/lang/Runnable;)V
+PLcom/android/server/connectivity/tethering/TetherInterfaceStateMachine$BaseServingState;-><init>(Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;)V
+PLcom/android/server/connectivity/tethering/TetherInterfaceStateMachine$InitialState;-><init>(Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;)V
+PLcom/android/server/connectivity/tethering/TetherInterfaceStateMachine$InitialState;->enter()V
+PLcom/android/server/connectivity/tethering/TetherInterfaceStateMachine$InitialState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/connectivity/tethering/TetherInterfaceStateMachine$LocalHotspotState;-><init>(Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;)V
+PLcom/android/server/connectivity/tethering/TetherInterfaceStateMachine$TetheredState;-><init>(Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;)V
+PLcom/android/server/connectivity/tethering/TetherInterfaceStateMachine$UnavailableState;-><init>(Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;)V
+PLcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;->-wrap2(Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;Lcom/android/internal/util/State;I)V
+PLcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;->-wrap3(Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;I)V
+PLcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;->-wrap5(Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;Landroid/net/LinkProperties;)V
+PLcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;-><init>(Ljava/lang/String;Landroid/os/Looper;ILandroid/net/util/SharedLog;Landroid/os/INetworkManagementService;Landroid/net/INetworkStatsService;Lcom/android/server/connectivity/tethering/IControlsTethering;)V
+PLcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;->interfaceName()Ljava/lang/String;
+PLcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;->interfaceType()I
+PLcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;->lastError()I
+PLcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;->maybeLogMessage(Lcom/android/internal/util/State;I)V
+PLcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;->sendInterfaceState(I)V
+PLcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;->updateUpstreamIPv6LinkProperties(Landroid/net/LinkProperties;)V
+PLcom/android/server/connectivity/tethering/TetheringConfiguration;-><init>(Landroid/content/Context;Landroid/net/util/SharedLog;)V
+PLcom/android/server/connectivity/tethering/TetheringConfiguration;->checkDunRequired(Landroid/content/Context;)I
+PLcom/android/server/connectivity/tethering/TetheringConfiguration;->copy([Ljava/lang/String;)[Ljava/lang/String;
+PLcom/android/server/connectivity/tethering/TetheringConfiguration;->dunCheckString(I)Ljava/lang/String;
+PLcom/android/server/connectivity/tethering/TetheringConfiguration;->getDhcpRanges(Landroid/content/Context;)[Ljava/lang/String;
+PLcom/android/server/connectivity/tethering/TetheringConfiguration;->getUpstreamIfaceTypes(Landroid/content/Context;I)Ljava/util/Collection;
+PLcom/android/server/connectivity/tethering/TetheringConfiguration;->isBluetooth(Ljava/lang/String;)Z
+PLcom/android/server/connectivity/tethering/TetheringConfiguration;->isUsb(Ljava/lang/String;)Z
+PLcom/android/server/connectivity/tethering/TetheringConfiguration;->isWifi(Ljava/lang/String;)Z
+PLcom/android/server/connectivity/tethering/TetheringConfiguration;->makeString([Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/connectivity/tethering/TetheringConfiguration;->matchesDownstreamRegexs(Ljava/lang/String;[Ljava/lang/String;)Z
+PLcom/android/server/connectivity/tethering/TetheringConfiguration;->preferredUpstreamNames(Ljava/util/Collection;)[Ljava/lang/String;
+PLcom/android/server/connectivity/tethering/TetheringConfiguration;->toString()Ljava/lang/String;
+PLcom/android/server/connectivity/tethering/TetheringDependencies;-><init>()V
+PLcom/android/server/connectivity/tethering/TetheringDependencies;->getOffloadHardwareInterface(Landroid/os/Handler;Landroid/net/util/SharedLog;)Lcom/android/server/connectivity/tethering/OffloadHardwareInterface;
+PLcom/android/server/connectivity/tethering/UpstreamNetworkMonitor;-><init>(Landroid/content/Context;Lcom/android/internal/util/StateMachine;ILandroid/net/util/SharedLog;)V
+PLcom/android/server/connectivity/tethering/UpstreamNetworkMonitor;->updateMobileRequiresDun(Z)V
+PLcom/android/server/content/-$Lambda$doNli3wDRrwDz12cAoe6lOOQskA;-><init>(Ljava/lang/Object;)V
+PLcom/android/server/content/ContentService$1;-><init>(Lcom/android/server/content/ContentService;)V
+PLcom/android/server/content/ContentService$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/content/ContentService$3;-><init>(Lcom/android/server/content/ContentService;)V
+PLcom/android/server/content/ContentService$Lifecycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/content/ContentService$Lifecycle;->onBootPhase(I)V
+PLcom/android/server/content/ContentService$Lifecycle;->onStart()V
+PLcom/android/server/content/ContentService$ObserverCall;-><init>(Lcom/android/server/content/ContentService$ObserverNode;Landroid/database/IContentObserver;ZI)V
+PLcom/android/server/content/ContentService$ObserverNode$ObserverEntry;->-get0(Lcom/android/server/content/ContentService$ObserverNode$ObserverEntry;)I
+PLcom/android/server/content/ContentService$ObserverNode$ObserverEntry;->binderDied()V
+PLcom/android/server/content/ContentService$ObserverNode;-><init>(Ljava/lang/String;)V
+PLcom/android/server/content/ContentService$ObserverNode;->addObserverLocked(Landroid/net/Uri;Landroid/database/IContentObserver;ZLjava/lang/Object;III)V
+PLcom/android/server/content/ContentService;->-get0(Lcom/android/server/content/ContentService;)Landroid/util/SparseArray;
+PLcom/android/server/content/ContentService;->-wrap0(Lcom/android/server/content/ContentService;ILjava/lang/String;Landroid/net/Uri;)V
+PLcom/android/server/content/ContentService;-><init>(Landroid/content/Context;Z)V
+PLcom/android/server/content/ContentService;->addPeriodicSync(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;J)V
+PLcom/android/server/content/ContentService;->addStatusChangeListener(ILandroid/content/ISyncStatusObserver;)V
+PLcom/android/server/content/ContentService;->clampPeriod(J)J
+PLcom/android/server/content/ContentService;->enforceCrossUserPermission(ILjava/lang/String;)V
+PLcom/android/server/content/ContentService;->getIsSyncable(Landroid/accounts/Account;Ljava/lang/String;)I
+PLcom/android/server/content/ContentService;->getIsSyncableAsUser(Landroid/accounts/Account;Ljava/lang/String;I)I
+PLcom/android/server/content/ContentService;->getMasterSyncAutomatically()Z
+PLcom/android/server/content/ContentService;->getMasterSyncAutomaticallyAsUser(I)Z
+PLcom/android/server/content/ContentService;->getProviderPackageName(Landroid/net/Uri;)Ljava/lang/String;
+PLcom/android/server/content/ContentService;->getSyncAdapterPackagesForAuthorityAsUser(Ljava/lang/String;I)[Ljava/lang/String;
+PLcom/android/server/content/ContentService;->getSyncAutomatically(Landroid/accounts/Account;Ljava/lang/String;)Z
+PLcom/android/server/content/ContentService;->getSyncAutomaticallyAsUser(Landroid/accounts/Account;Ljava/lang/String;I)Z
+PLcom/android/server/content/ContentService;->getSyncManager()Lcom/android/server/content/SyncManager;
+PLcom/android/server/content/ContentService;->handleIncomingUser(Landroid/net/Uri;IIIZI)I
+PLcom/android/server/content/ContentService;->invalidateCacheLocked(ILjava/lang/String;Landroid/net/Uri;)V
+PLcom/android/server/content/ContentService;->isSyncActive(Landroid/accounts/Account;Ljava/lang/String;Landroid/content/ComponentName;)Z
+PLcom/android/server/content/ContentService;->isSyncPendingAsUser(Landroid/accounts/Account;Ljava/lang/String;Landroid/content/ComponentName;I)Z
+PLcom/android/server/content/ContentService;->normalizeSyncable(I)I
+PLcom/android/server/content/ContentService;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+PLcom/android/server/content/ContentService;->removePeriodicSync(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;)V
+PLcom/android/server/content/ContentService;->setIsSyncable(Landroid/accounts/Account;Ljava/lang/String;I)V
+PLcom/android/server/content/ContentService;->setSyncAutomaticallyAsUser(Landroid/accounts/Account;Ljava/lang/String;ZI)V
+PLcom/android/server/content/ContentService;->syncAsUser(Landroid/content/SyncRequest;I)V
+PLcom/android/server/content/ContentService;->systemReady()V
+PLcom/android/server/content/ContentService;->unregisterContentObserver(Landroid/database/IContentObserver;)V
+PLcom/android/server/content/SyncJobService;-><init>()V
+PLcom/android/server/content/SyncJobService;->callJobFinished(IZ)V
+PLcom/android/server/content/SyncJobService;->onStartCommand(Landroid/content/Intent;II)I
+PLcom/android/server/content/SyncJobService;->onStartJob(Landroid/app/job/JobParameters;)Z
+PLcom/android/server/content/SyncJobService;->onStopJob(Landroid/app/job/JobParameters;)Z
+PLcom/android/server/content/SyncJobService;->sendMessage(Landroid/os/Message;)V
+PLcom/android/server/content/SyncManager$10;-><init>(Lcom/android/server/content/SyncManager;)V
+PLcom/android/server/content/SyncManager$11;-><init>(Lcom/android/server/content/SyncManager;)V
+PLcom/android/server/content/SyncManager$13;-><init>(Lcom/android/server/content/SyncManager;Landroid/content/Intent;)V
+PLcom/android/server/content/SyncManager$13;->run()V
+PLcom/android/server/content/SyncManager$1;-><init>(Lcom/android/server/content/SyncManager;)V
+PLcom/android/server/content/SyncManager$2;-><init>(Lcom/android/server/content/SyncManager;)V
+PLcom/android/server/content/SyncManager$2;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/content/SyncManager$3;-><init>(Lcom/android/server/content/SyncManager;)V
+PLcom/android/server/content/SyncManager$4;-><init>(Lcom/android/server/content/SyncManager;)V
+PLcom/android/server/content/SyncManager$4;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/content/SyncManager$5;-><init>(Lcom/android/server/content/SyncManager;)V
+PLcom/android/server/content/SyncManager$6;-><init>(Lcom/android/server/content/SyncManager;)V
+PLcom/android/server/content/SyncManager$6;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/content/SyncManager$7;-><init>(Lcom/android/server/content/SyncManager;)V
+PLcom/android/server/content/SyncManager$7;->run()V
+PLcom/android/server/content/SyncManager$8;-><init>(Lcom/android/server/content/SyncManager;)V
+PLcom/android/server/content/SyncManager$9;-><init>(Lcom/android/server/content/SyncManager;)V
+PLcom/android/server/content/SyncManager$ActiveSyncContext;-><init>(Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncOperation;JI)V
+PLcom/android/server/content/SyncManager$ActiveSyncContext;->bindToSyncAdapter(Landroid/content/ComponentName;I)Z
+PLcom/android/server/content/SyncManager$ActiveSyncContext;->close()V
+PLcom/android/server/content/SyncManager$ActiveSyncContext;->onFinished(Landroid/content/SyncResult;)V
+PLcom/android/server/content/SyncManager$ActiveSyncContext;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/content/SyncManager$ScheduleSyncMessagePayload;-><init>(Lcom/android/server/content/SyncOperation;J)V
+PLcom/android/server/content/SyncManager$ServiceConnectionData;-><init>(Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager$ActiveSyncContext;Landroid/os/IBinder;)V
+PLcom/android/server/content/SyncManager$SyncFinishedOrCancelledMessagePayload;-><init>(Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager$ActiveSyncContext;Landroid/content/SyncResult;)V
+PLcom/android/server/content/SyncManager$SyncHandler;->-wrap0(Lcom/android/server/content/SyncManager$SyncHandler;Lcom/android/server/content/SyncOperation;)Landroid/os/PowerManager$WakeLock;
+PLcom/android/server/content/SyncManager$SyncHandler;-><init>(Lcom/android/server/content/SyncManager;Landroid/os/Looper;)V
+PLcom/android/server/content/SyncManager$SyncHandler;->checkIfDeviceReady()V
+PLcom/android/server/content/SyncManager$SyncHandler;->closeActiveSyncContext(Lcom/android/server/content/SyncManager$ActiveSyncContext;)V
+PLcom/android/server/content/SyncManager$SyncHandler;->computeSyncOpState(Lcom/android/server/content/SyncOperation;)I
+PLcom/android/server/content/SyncManager$SyncHandler;->deferSyncH(Lcom/android/server/content/SyncOperation;J)V
+PLcom/android/server/content/SyncManager$SyncHandler;->dispatchSyncOperation(Lcom/android/server/content/SyncOperation;)Z
+PLcom/android/server/content/SyncManager$SyncHandler;->findActiveSyncContextH(I)Lcom/android/server/content/SyncManager$ActiveSyncContext;
+PLcom/android/server/content/SyncManager$SyncHandler;->getSyncWakeLock(Lcom/android/server/content/SyncOperation;)Landroid/os/PowerManager$WakeLock;
+PLcom/android/server/content/SyncManager$SyncHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/content/SyncManager$SyncHandler;->handleSyncMessage(Landroid/os/Message;)V
+PLcom/android/server/content/SyncManager$SyncHandler;->insertStartSyncEvent(Lcom/android/server/content/SyncOperation;)J
+PLcom/android/server/content/SyncManager$SyncHandler;->maybeUpdateSyncPeriodH(Lcom/android/server/content/SyncOperation;JJ)V
+PLcom/android/server/content/SyncManager$SyncHandler;->onBootCompleted()V
+PLcom/android/server/content/SyncManager$SyncHandler;->removePeriodicSyncH(Lcom/android/server/content/SyncStorageEngine$EndPoint;Landroid/os/Bundle;)V
+PLcom/android/server/content/SyncManager$SyncHandler;->runBoundToAdapterH(Lcom/android/server/content/SyncManager$ActiveSyncContext;Landroid/os/IBinder;)V
+PLcom/android/server/content/SyncManager$SyncHandler;->runSyncFinishedOrCanceledH(Landroid/content/SyncResult;Lcom/android/server/content/SyncManager$ActiveSyncContext;)V
+PLcom/android/server/content/SyncManager$SyncHandler;->startSyncH(Lcom/android/server/content/SyncOperation;)V
+PLcom/android/server/content/SyncManager$SyncHandler;->stopSyncEvent(JLcom/android/server/content/SyncOperation;Ljava/lang/String;IIJ)V
+PLcom/android/server/content/SyncManager$SyncHandler;->tryEnqueueMessageUntilReadyToRun(Landroid/os/Message;)Z
+PLcom/android/server/content/SyncManager$SyncHandler;->updateOrAddPeriodicSyncH(Lcom/android/server/content/SyncStorageEngine$EndPoint;JJLandroid/os/Bundle;)V
+PLcom/android/server/content/SyncManager$SyncHandler;->updateRunningAccountsH(Lcom/android/server/content/SyncStorageEngine$EndPoint;)V
+PLcom/android/server/content/SyncManager$SyncTimeTracker;-><init>(Lcom/android/server/content/SyncManager;)V
+PLcom/android/server/content/SyncManager$SyncTimeTracker;-><init>(Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager$SyncTimeTracker;)V
+PLcom/android/server/content/SyncManager$SyncTimeTracker;->update()V
+PLcom/android/server/content/SyncManager$UpdatePeriodicSyncMessagePayload;-><init>(Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncStorageEngine$EndPoint;JJLandroid/os/Bundle;)V
+PLcom/android/server/content/SyncManager;->-get1(Lcom/android/server/content/SyncManager;)Lcom/android/internal/app/IBatteryStats;
+PLcom/android/server/content/SyncManager;->-get10(Lcom/android/server/content/SyncManager;)Z
+PLcom/android/server/content/SyncManager;->-get11(Lcom/android/server/content/SyncManager;)[Landroid/accounts/AccountAndUser;
+PLcom/android/server/content/SyncManager;->-get12(Lcom/android/server/content/SyncManager;)Z
+PLcom/android/server/content/SyncManager;->-get13(Lcom/android/server/content/SyncManager;)Lcom/android/server/content/SyncManager$SyncHandler;
+PLcom/android/server/content/SyncManager;->-get14(Lcom/android/server/content/SyncManager;)Lcom/android/server/content/SyncJobService;
+PLcom/android/server/content/SyncManager;->-get15(Lcom/android/server/content/SyncManager;)Landroid/os/PowerManager$WakeLock;
+PLcom/android/server/content/SyncManager;->-get16(Lcom/android/server/content/SyncManager;)Lcom/android/server/content/SyncStorageEngine;
+PLcom/android/server/content/SyncManager;->-get2(Lcom/android/server/content/SyncManager;)Z
+PLcom/android/server/content/SyncManager;->-get3(Lcom/android/server/content/SyncManager;)Landroid/content/Context;
+PLcom/android/server/content/SyncManager;->-get4(Lcom/android/server/content/SyncManager;)Z
+PLcom/android/server/content/SyncManager;->-get6(Lcom/android/server/content/SyncManager;)Z
+PLcom/android/server/content/SyncManager;->-get7(Lcom/android/server/content/SyncManager;)Landroid/app/NotificationManager;
+PLcom/android/server/content/SyncManager;->-get9(Lcom/android/server/content/SyncManager;)Landroid/os/PowerManager;
+PLcom/android/server/content/SyncManager;->-set0(Lcom/android/server/content/SyncManager;Z)Z
+PLcom/android/server/content/SyncManager;->-set1(Lcom/android/server/content/SyncManager;Z)Z
+PLcom/android/server/content/SyncManager;->-set2(Lcom/android/server/content/SyncManager;Z)Z
+PLcom/android/server/content/SyncManager;->-set4(Lcom/android/server/content/SyncManager;[Landroid/accounts/AccountAndUser;)[Landroid/accounts/AccountAndUser;
+PLcom/android/server/content/SyncManager;->-set6(Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncJobService;)Lcom/android/server/content/SyncJobService;
+PLcom/android/server/content/SyncManager;->-wrap0(Lcom/android/server/content/SyncManager;)Landroid/app/job/JobScheduler;
+PLcom/android/server/content/SyncManager;->-wrap10(Lcom/android/server/content/SyncManager;)V
+PLcom/android/server/content/SyncManager;->-wrap11(Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncStorageEngine$EndPoint;)V
+PLcom/android/server/content/SyncManager;->-wrap17(Lcom/android/server/content/SyncManager;I)V
+PLcom/android/server/content/SyncManager;->-wrap18(Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager$ActiveSyncContext;)V
+PLcom/android/server/content/SyncManager;->-wrap2(Lcom/android/server/content/SyncManager;[Landroid/accounts/AccountAndUser;Landroid/accounts/Account;I)Z
+PLcom/android/server/content/SyncManager;->-wrap23(Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncOperation;J)V
+PLcom/android/server/content/SyncManager;->-wrap24(Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager$ActiveSyncContext;Landroid/content/SyncResult;)V
+PLcom/android/server/content/SyncManager;->-wrap25(Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncStorageEngine$EndPoint;)V
+PLcom/android/server/content/SyncManager;->-wrap26(Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncStorageEngine$EndPoint;J)V
+PLcom/android/server/content/SyncManager;->-wrap28(Lcom/android/server/content/SyncManager;)V
+PLcom/android/server/content/SyncManager;->-wrap5(Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager$ActiveSyncContext;)Z
+PLcom/android/server/content/SyncManager;->-wrap6(Lcom/android/server/content/SyncManager;)Z
+PLcom/android/server/content/SyncManager;->-wrap7(Lcom/android/server/content/SyncManager;Landroid/accounts/Account;ILjava/lang/String;)I
+PLcom/android/server/content/SyncManager;->-wrap8(Lcom/android/server/content/SyncManager;)Ljava/util/List;
+PLcom/android/server/content/SyncManager;-><init>(Landroid/content/Context;Z)V
+PLcom/android/server/content/SyncManager;->canAccessAccount(Landroid/accounts/Account;Ljava/lang/String;I)Z
+PLcom/android/server/content/SyncManager;->cleanupJobs()V
+PLcom/android/server/content/SyncManager;->clearAllBackoffs()V
+PLcom/android/server/content/SyncManager;->clearBackoffSetting(Lcom/android/server/content/SyncStorageEngine$EndPoint;)V
+PLcom/android/server/content/SyncManager;->computeSyncable(Landroid/accounts/Account;ILjava/lang/String;)I
+PLcom/android/server/content/SyncManager;->computeSyncable(Landroid/accounts/Account;ILjava/lang/String;Z)I
+PLcom/android/server/content/SyncManager;->containsAccountAndUser([Landroid/accounts/AccountAndUser;Landroid/accounts/Account;I)Z
+PLcom/android/server/content/SyncManager;->getAllPendingSyncs()Ljava/util/List;
+PLcom/android/server/content/SyncManager;->getConnectivityManager()Landroid/net/ConnectivityManager;
+PLcom/android/server/content/SyncManager;->getIsSyncable(Landroid/accounts/Account;ILjava/lang/String;)I
+PLcom/android/server/content/SyncManager;->getJobScheduler()Landroid/app/job/JobScheduler;
+PLcom/android/server/content/SyncManager;->getSyncAdapterPackagesForAuthorityAsUser(Ljava/lang/String;I)[Ljava/lang/String;
+PLcom/android/server/content/SyncManager;->getSyncStorageEngine()Lcom/android/server/content/SyncStorageEngine;
+PLcom/android/server/content/SyncManager;->getTotalBytesTransferredByUid(I)J
+PLcom/android/server/content/SyncManager;->getUnusedJobIdH()I
+PLcom/android/server/content/SyncManager;->isDeviceProvisioned()Z
+PLcom/android/server/content/SyncManager;->isJobIdInUseLockedH(ILjava/util/List;)Z
+PLcom/android/server/content/SyncManager;->isSyncStillActiveH(Lcom/android/server/content/SyncManager$ActiveSyncContext;)Z
+PLcom/android/server/content/SyncManager;->onUserUnlocked(I)V
+PLcom/android/server/content/SyncManager;->postMonitorSyncProgressMessage(Lcom/android/server/content/SyncManager$ActiveSyncContext;)V
+PLcom/android/server/content/SyncManager;->postScheduleSyncMessage(Lcom/android/server/content/SyncOperation;J)V
+PLcom/android/server/content/SyncManager;->readDataConnectionState()Z
+PLcom/android/server/content/SyncManager;->removePeriodicSync(Lcom/android/server/content/SyncStorageEngine$EndPoint;Landroid/os/Bundle;)V
+PLcom/android/server/content/SyncManager;->rescheduleSyncs(Lcom/android/server/content/SyncStorageEngine$EndPoint;)V
+PLcom/android/server/content/SyncManager;->scheduleLocalSync(Landroid/accounts/Account;IILjava/lang/String;)V
+PLcom/android/server/content/SyncManager;->scheduleSync(Landroid/accounts/Account;IILjava/lang/String;Landroid/os/Bundle;I)V
+PLcom/android/server/content/SyncManager;->scheduleSyncOperationH(Lcom/android/server/content/SyncOperation;J)V
+PLcom/android/server/content/SyncManager;->sendSyncFinishedOrCanceledMessage(Lcom/android/server/content/SyncManager$ActiveSyncContext;Landroid/content/SyncResult;)V
+PLcom/android/server/content/SyncManager;->setAuthorityPendingState(Lcom/android/server/content/SyncStorageEngine$EndPoint;)V
+PLcom/android/server/content/SyncManager;->setDelayUntilTime(Lcom/android/server/content/SyncStorageEngine$EndPoint;J)V
+PLcom/android/server/content/SyncManager;->syncExtrasEquals(Landroid/os/Bundle;Landroid/os/Bundle;Z)Z
+PLcom/android/server/content/SyncManager;->updateOrAddPeriodicSync(Lcom/android/server/content/SyncStorageEngine$EndPoint;JJLandroid/os/Bundle;)V
+PLcom/android/server/content/SyncManager;->updateRunningAccounts(Lcom/android/server/content/SyncStorageEngine$EndPoint;)V
+PLcom/android/server/content/SyncManager;->verifyJobScheduler()V
+PLcom/android/server/content/SyncManager;->whiteListExistingSyncAdaptersIfNeeded()V
+PLcom/android/server/content/SyncOperation;-><init>(Landroid/accounts/Account;IILjava/lang/String;IILjava/lang/String;Landroid/os/Bundle;Z)V
+PLcom/android/server/content/SyncOperation;-><init>(Lcom/android/server/content/SyncStorageEngine$EndPoint;ILjava/lang/String;IILandroid/os/Bundle;Z)V
+PLcom/android/server/content/SyncOperation;-><init>(Lcom/android/server/content/SyncStorageEngine$EndPoint;ILjava/lang/String;IILandroid/os/Bundle;ZZIJJ)V
+PLcom/android/server/content/SyncOperation;->extrasToStringBuilder(Landroid/os/Bundle;Ljava/lang/StringBuilder;)V
+PLcom/android/server/content/SyncOperation;->findPriority()I
+PLcom/android/server/content/SyncOperation;->ignoreBackoff()Z
+PLcom/android/server/content/SyncOperation;->isConflict(Lcom/android/server/content/SyncOperation;)Z
+PLcom/android/server/content/SyncOperation;->isDerivedFromFailedPeriodicSync()Z
+PLcom/android/server/content/SyncOperation;->isExpedited()Z
+PLcom/android/server/content/SyncOperation;->isIgnoreSettings()Z
+PLcom/android/server/content/SyncOperation;->isInitialization()Z
+PLcom/android/server/content/SyncOperation;->isNotAllowedOnMetered()Z
+PLcom/android/server/content/SyncOperation;->toEventLog(I)[Ljava/lang/Object;
+PLcom/android/server/content/SyncOperation;->toJobInfoExtras()Landroid/os/PersistableBundle;
+PLcom/android/server/content/SyncOperation;->wakeLockName()Ljava/lang/String;
+PLcom/android/server/content/SyncStorageEngine$AccountAuthorityValidator;-><init>(Landroid/content/Context;)V
+PLcom/android/server/content/SyncStorageEngine$AccountAuthorityValidator;->isAccountValid(Landroid/accounts/Account;I)Z
+PLcom/android/server/content/SyncStorageEngine$AccountAuthorityValidator;->isAuthorityValid(Ljava/lang/String;I)Z
+PLcom/android/server/content/SyncStorageEngine$AccountInfo;-><init>(Landroid/accounts/AccountAndUser;)V
+PLcom/android/server/content/SyncStorageEngine$AuthorityInfo;-><init>(Lcom/android/server/content/SyncStorageEngine$EndPoint;I)V
+PLcom/android/server/content/SyncStorageEngine$AuthorityInfo;->defaultInitialisation()V
+PLcom/android/server/content/SyncStorageEngine$DayStats;-><init>(I)V
+PLcom/android/server/content/SyncStorageEngine$EndPoint;-><init>(Landroid/accounts/Account;Ljava/lang/String;I)V
+PLcom/android/server/content/SyncStorageEngine$EndPoint;->matchesSpec(Lcom/android/server/content/SyncStorageEngine$EndPoint;)Z
+PLcom/android/server/content/SyncStorageEngine$SyncHistoryItem;-><init>()V
+PLcom/android/server/content/SyncStorageEngine;->-get0()Lcom/android/server/content/SyncStorageEngine$PeriodicSyncAddedListener;
+PLcom/android/server/content/SyncStorageEngine;-><init>(Landroid/content/Context;Ljava/io/File;)V
+PLcom/android/server/content/SyncStorageEngine;->addActiveSync(Lcom/android/server/content/SyncManager$ActiveSyncContext;)Landroid/content/SyncInfo;
+PLcom/android/server/content/SyncStorageEngine;->addStatusChangeListener(ILandroid/content/ISyncStatusObserver;)V
+PLcom/android/server/content/SyncStorageEngine;->calculateDefaultFlexTime(J)J
+PLcom/android/server/content/SyncStorageEngine;->clearAllBackoffsLocked()V
+PLcom/android/server/content/SyncStorageEngine;->createAuthorityLocked(Lcom/android/server/content/SyncStorageEngine$EndPoint;IZ)Lcom/android/server/content/SyncStorageEngine$AuthorityInfo;
+PLcom/android/server/content/SyncStorageEngine;->getAuthority(I)Lcom/android/server/content/SyncStorageEngine$AuthorityInfo;
+PLcom/android/server/content/SyncStorageEngine;->getAuthorityLocked(Lcom/android/server/content/SyncStorageEngine$EndPoint;Ljava/lang/String;)Lcom/android/server/content/SyncStorageEngine$AuthorityInfo;
+PLcom/android/server/content/SyncStorageEngine;->getBackoff(Lcom/android/server/content/SyncStorageEngine$EndPoint;)Landroid/util/Pair;
+PLcom/android/server/content/SyncStorageEngine;->getCurrentDayLocked()I
+PLcom/android/server/content/SyncStorageEngine;->getCurrentSyncs(I)Ljava/util/List;
+PLcom/android/server/content/SyncStorageEngine;->getCurrentSyncsLocked(I)Ljava/util/List;
+PLcom/android/server/content/SyncStorageEngine;->getDelayUntilTime(Lcom/android/server/content/SyncStorageEngine$EndPoint;)J
+PLcom/android/server/content/SyncStorageEngine;->getIsSyncable(Landroid/accounts/Account;ILjava/lang/String;)I
+PLcom/android/server/content/SyncStorageEngine;->getMasterSyncAutomatically(I)Z
+PLcom/android/server/content/SyncStorageEngine;->getOrCreateAuthorityLocked(Lcom/android/server/content/SyncStorageEngine$EndPoint;IZ)Lcom/android/server/content/SyncStorageEngine$AuthorityInfo;
+PLcom/android/server/content/SyncStorageEngine;->getOrCreateSyncStatusLocked(I)Landroid/content/SyncStatusInfo;
+PLcom/android/server/content/SyncStorageEngine;->getSingleton()Lcom/android/server/content/SyncStorageEngine;
+PLcom/android/server/content/SyncStorageEngine;->getSyncAutomatically(Landroid/accounts/Account;ILjava/lang/String;)Z
+PLcom/android/server/content/SyncStorageEngine;->init(Landroid/content/Context;)V
+PLcom/android/server/content/SyncStorageEngine;->insertStartSyncEvent(Lcom/android/server/content/SyncOperation;J)J
+PLcom/android/server/content/SyncStorageEngine;->isSyncActive(Lcom/android/server/content/SyncStorageEngine$EndPoint;)Z
+PLcom/android/server/content/SyncStorageEngine;->isSyncPending(Lcom/android/server/content/SyncStorageEngine$EndPoint;)Z
+PLcom/android/server/content/SyncStorageEngine;->markPending(Lcom/android/server/content/SyncStorageEngine$EndPoint;Z)V
+PLcom/android/server/content/SyncStorageEngine;->maybeDeleteLegacyPendingInfoLocked(Ljava/io/File;)V
+PLcom/android/server/content/SyncStorageEngine;->maybeMigrateSettingsForRenamedAuthorities()Z
+PLcom/android/server/content/SyncStorageEngine;->parseAuthority(Lorg/xmlpull/v1/XmlPullParser;ILcom/android/server/content/SyncStorageEngine$AccountAuthorityValidator;)Lcom/android/server/content/SyncStorageEngine$AuthorityInfo;
+PLcom/android/server/content/SyncStorageEngine;->parseListenForTickles(Lorg/xmlpull/v1/XmlPullParser;)V
+PLcom/android/server/content/SyncStorageEngine;->readAccountInfoLocked()V
+PLcom/android/server/content/SyncStorageEngine;->readAndDeleteLegacyAccountInfoLocked()V
+PLcom/android/server/content/SyncStorageEngine;->readStatisticsLocked()V
+PLcom/android/server/content/SyncStorageEngine;->readStatusLocked()V
+PLcom/android/server/content/SyncStorageEngine;->removeActiveSync(Landroid/content/SyncInfo;I)V
+PLcom/android/server/content/SyncStorageEngine;->reportActiveChange()V
+PLcom/android/server/content/SyncStorageEngine;->reportChange(I)V
+PLcom/android/server/content/SyncStorageEngine;->restoreAllPeriodicSyncs()Z
+PLcom/android/server/content/SyncStorageEngine;->setDelayUntilTime(Lcom/android/server/content/SyncStorageEngine$EndPoint;J)V
+PLcom/android/server/content/SyncStorageEngine;->setIsSyncable(Landroid/accounts/Account;ILjava/lang/String;I)V
+PLcom/android/server/content/SyncStorageEngine;->setOnAuthorityRemovedListener(Lcom/android/server/content/SyncStorageEngine$OnAuthorityRemovedListener;)V
+PLcom/android/server/content/SyncStorageEngine;->setOnSyncRequestListener(Lcom/android/server/content/SyncStorageEngine$OnSyncRequestListener;)V
+PLcom/android/server/content/SyncStorageEngine;->setPeriodicSyncAddedListener(Lcom/android/server/content/SyncStorageEngine$PeriodicSyncAddedListener;)V
+PLcom/android/server/content/SyncStorageEngine;->setSyncAutomatically(Landroid/accounts/Account;ILjava/lang/String;Z)V
+PLcom/android/server/content/SyncStorageEngine;->setSyncableStateForEndPoint(Lcom/android/server/content/SyncStorageEngine$EndPoint;I)V
+PLcom/android/server/content/SyncStorageEngine;->shouldGrantSyncAdaptersAccountAccess()Z
+PLcom/android/server/content/SyncStorageEngine;->stopSyncEvent(JJLjava/lang/String;JJ)V
+PLcom/android/server/content/SyncStorageEngine;->writeAccountInfoLocked()V
+PLcom/android/server/content/SyncStorageEngine;->writeStatisticsLocked()V
+PLcom/android/server/content/SyncStorageEngine;->writeStatusLocked()V
+PLcom/android/server/devicepolicy/CertificateMonitor$1;-><init>(Lcom/android/server/devicepolicy/CertificateMonitor;)V
+PLcom/android/server/devicepolicy/CertificateMonitor$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/devicepolicy/CertificateMonitor;->-wrap0(Lcom/android/server/devicepolicy/CertificateMonitor;Landroid/os/UserHandle;)V
+PLcom/android/server/devicepolicy/CertificateMonitor;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Landroid/os/Handler;)V
+PLcom/android/server/devicepolicy/CertificateMonitor;->getInstalledCaCertificates(Landroid/os/UserHandle;)Ljava/util/List;
+PLcom/android/server/devicepolicy/CertificateMonitor;->updateInstalledCertificates(Landroid/os/UserHandle;)V
+PLcom/android/server/devicepolicy/DeviceAdminServiceController;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyConstants;)V
+PLcom/android/server/devicepolicy/DevicePolicyConstants;-><init>(Ljava/lang/String;)V
+PLcom/android/server/devicepolicy/DevicePolicyConstants;->loadFromString(Ljava/lang/String;)Lcom/android/server/devicepolicy/DevicePolicyConstants;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$1;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$2;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$3;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$4$1;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService$4;I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$4$1;->run()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$4;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$4;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$8;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;IZ)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$8;->run()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;-><init>(Landroid/app/admin/DeviceAdminInfo;Z)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;->getUid()I
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;->getUserHandle()Landroid/os/UserHandle;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;->hasParentActiveAdmin()Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;->readFromXml(Lorg/xmlpull/v1/XmlPullParser;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;-><init>(I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;-><init>(Landroid/content/Context;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->binderClearCallingIdentity()J
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->binderRestoreCallingIdentity(J)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->getAlarmManager()Landroid/app/AlarmManager;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->getDevicePolicyFilePathForSystemUser()Ljava/lang/String;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->getIActivityManager()Landroid/app/IActivityManager;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->getIPackageManager()Landroid/content/pm/IPackageManager;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->getIWindowManager()Landroid/view/IWindowManager;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->getMyLooper()Landroid/os/Looper;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->getNotificationManager()Landroid/app/NotificationManager;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->getPackageManager()Landroid/content/pm/PackageManager;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->getPackageManagerInternal()Landroid/content/pm/PackageManagerInternal;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->getPowerManagerInternal()Landroid/os/PowerManagerInternal;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->getTelephonyManager()Landroid/telephony/TelephonyManager;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->getUserManager()Landroid/os/UserManager;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->getUserManagerInternal()Landroid/os/UserManagerInternal;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->keyChainBindAsUser(Landroid/os/UserHandle;)Landroid/security/KeyChain$KeyChainConnection;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->newLockPatternUtils()Lcom/android/internal/widget/LockPatternUtils;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->newOwners()Lcom/android/server/devicepolicy/Owners;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->registerContentObserver(Landroid/net/Uri;ZLandroid/database/ContentObserver;I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->settingsGlobalGetInt(Ljava/lang/String;I)I
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->settingsGlobalGetString(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->settingsSecureGetIntForUser(Ljava/lang/String;II)I
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->storageManagerIsFileBasedEncryptionEnabled()Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->systemPropertiesGet(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Lifecycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Lifecycle;->onBootPhase(I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Lifecycle;->onStart()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Lifecycle;->onStartUser(I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Lifecycle;->onUnlockUser(I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$LocalService;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$LocalService;->addOnCrossProfileWidgetProvidersChangeListener(Landroid/app/admin/DevicePolicyManagerInternal$OnCrossProfileWidgetProvidersChangeListener;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$LocalService;->isActiveAdminWithPolicy(II)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$SetupContentObserver;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Landroid/os/Handler;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$SetupContentObserver;->register()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->-wrap18(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->-wrap3(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Landroid/content/ComponentName;II)Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->-wrap7(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/String;I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->-wrap8(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->cleanUpOldUsers()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->enforceDeviceOwnerOrManageUsers()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->enforceFullCrossUsersPermission(I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->enforceManageUsers()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->enforceSystemUserOrPermissionIfCrossUser(ILjava/lang/String;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->ensureCallerPackage(Ljava/lang/String;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->ensureDeviceOwnerUserStarted()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->findAdmin(Landroid/content/ComponentName;IZ)Landroid/app/admin/DeviceAdminInfo;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->findOwnerComponentIfNecessaryLocked()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getAcceptedCaCertificates(Landroid/os/UserHandle;)Ljava/util/Set;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getActiveAdminUncheckedLocked(Landroid/content/ComponentName;I)Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getActiveAdminWithPolicyForUidLocked(Landroid/content/ComponentName;II)Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getActiveAdminsForLockscreenPoliciesLocked(IZ)Ljava/util/List;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getCameraDisabled(Landroid/content/ComponentName;I)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getCameraDisabled(Landroid/content/ComponentName;IZ)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getCameraRestrictionScopeLocked(IZ)I
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getDeviceOwnerAdminLocked()Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getDeviceOwnerComponent(Z)Landroid/content/ComponentName;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getDeviceOwnerOrganizationName()Ljava/lang/CharSequence;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getEncryptionStatus()I
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getKeepUninstalledPackagesLocked()Ljava/util/List;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getKeyguardDisabledFeatures(Landroid/content/ComponentName;IZ)I
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getOwnerComponent(I)Landroid/content/ComponentName;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getPasswordExpirationLocked(Landroid/content/ComponentName;IZ)J
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getProfileOwner(I)Landroid/content/ComponentName;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getProfileOwnerAdminLocked(I)Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getProfileParentId(I)I
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getScreenCaptureDisabled(Landroid/content/ComponentName;I)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getStorageEncryptionStatus(Ljava/lang/String;I)I
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getSystemUpdatePolicy()Landroid/app/admin/SystemUpdatePolicy;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getUserData(I)Lcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getUserDataUnchecked(I)Lcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getUserInfo(I)Landroid/content/pm/UserInfo;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->handlePackagesChanged(Ljava/lang/String;I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->handlePasswordExpirationNotification(I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->handleStartUser(I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->handleUnlockUser(I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->hasDeviceOwner()Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isActiveAdminWithPolicyForUserLocked(Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;II)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isAdminActive(Landroid/content/ComponentName;I)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isCallerWithSystemUid()Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isDeviceOwner(Landroid/content/ComponentName;I)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isLockTaskPermitted(Ljava/lang/String;)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isManagedProfile(I)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isNetworkLoggingEnabled(Landroid/content/ComponentName;)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isNetworkLoggingEnabledInternalLocked()Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isProfileOwner(Landroid/content/ComponentName;I)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isSeparateProfileChallengeEnabled(I)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isUninstallBlocked(Landroid/content/ComponentName;Ljava/lang/String;)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->loadOwners()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->loadSettingsLocked(Lcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->makeJournaledFile(I)Lcom/android/internal/util/JournaledFile;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->maybeSetDefaultDeviceOwnerUserRestrictionsLocked()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->maybeSetDefaultProfileOwnerUserRestrictions()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->migrateUserRestrictionsIfNecessaryLocked()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->notifyPendingSystemUpdate(Landroid/app/admin/SystemUpdateInfo;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->onInstalledCertificatesChanged(Landroid/os/UserHandle;Ljava/util/Collection;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->onLockSettingsReady()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->pushUserRestrictions(I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->sendAdminEnabledBroadcastLocked(I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->setDeviceOwnerSystemPropertyLocked()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->setExpirationAlarmCheckLocked(Landroid/content/Context;IZ)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->startOwnerService(ILjava/lang/String;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->systemReady(I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->updateDeviceOwnerLocked()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->updateLockTaskPackagesLocked(Ljava/util/List;I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->updateMaximumTimeToLockLocked(I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->updateScreenCaptureDisabledInWindowManager(IZ)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->updateUserSetupCompleteAndPaired()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->validatePasswordOwnerLocked(Lcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;)V
+PLcom/android/server/devicepolicy/Owners$DeviceOwnerReadWriter;-><init>(Lcom/android/server/devicepolicy/Owners;)V
+PLcom/android/server/devicepolicy/Owners$FileReadWriter;-><init>(Ljava/io/File;)V
+PLcom/android/server/devicepolicy/Owners$FileReadWriter;->readFromFileLocked()V
+PLcom/android/server/devicepolicy/Owners$ProfileOwnerReadWriter;-><init>(Lcom/android/server/devicepolicy/Owners;I)V
+PLcom/android/server/devicepolicy/Owners;-><init>(Landroid/os/UserManager;Landroid/os/UserManagerInternal;Landroid/content/pm/PackageManagerInternal;)V
+PLcom/android/server/devicepolicy/Owners;->getDeviceOwnerComponent()Landroid/content/ComponentName;
+PLcom/android/server/devicepolicy/Owners;->getDeviceOwnerFileWithTestOverride()Ljava/io/File;
+PLcom/android/server/devicepolicy/Owners;->getDeviceOwnerUserId()I
+PLcom/android/server/devicepolicy/Owners;->getDeviceOwnerUserRestrictionsNeedsMigration()Z
+PLcom/android/server/devicepolicy/Owners;->getLegacyConfigFileWithTestOverride()Ljava/io/File;
+PLcom/android/server/devicepolicy/Owners;->getProfileOwnerComponent(I)Landroid/content/ComponentName;
+PLcom/android/server/devicepolicy/Owners;->getProfileOwnerFileWithTestOverride(I)Ljava/io/File;
+PLcom/android/server/devicepolicy/Owners;->getProfileOwnerKeys()Ljava/util/Set;
+PLcom/android/server/devicepolicy/Owners;->getProfileOwnerUserRestrictionsNeedsMigration(I)Z
+PLcom/android/server/devicepolicy/Owners;->getSystemUpdatePolicy()Landroid/app/admin/SystemUpdatePolicy;
+PLcom/android/server/devicepolicy/Owners;->hasDeviceOwner()Z
+PLcom/android/server/devicepolicy/Owners;->hasProfileOwner(I)Z
+PLcom/android/server/devicepolicy/Owners;->isDeviceOwnerUserId(I)Z
+PLcom/android/server/devicepolicy/Owners;->load()V
+PLcom/android/server/devicepolicy/Owners;->pushToPackageManagerLocked()V
+PLcom/android/server/devicepolicy/Owners;->readLegacyOwnerFileLocked(Ljava/io/File;)Z
+PLcom/android/server/devicepolicy/Owners;->saveSystemUpdateInfo(Landroid/app/admin/SystemUpdateInfo;)Z
+PLcom/android/server/devicepolicy/SecurityLogMonitor;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)V
+PLcom/android/server/display/-$Lambda$pe87L53A2dvYIZSUUR6Usyk2Zwo;-><init>()V
+PLcom/android/server/display/AutomaticBrightnessController$1;-><init>(Lcom/android/server/display/AutomaticBrightnessController;)V
+PLcom/android/server/display/AutomaticBrightnessController$1;->onAccuracyChanged(Landroid/hardware/Sensor;I)V
+PLcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;-><init>(JI)V
+PLcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;->prune(J)V
+PLcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;->push(JF)V
+PLcom/android/server/display/AutomaticBrightnessController$AutomaticBrightnessHandler;-><init>(Lcom/android/server/display/AutomaticBrightnessController;Landroid/os/Looper;)V
+PLcom/android/server/display/AutomaticBrightnessController$AutomaticBrightnessHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/display/AutomaticBrightnessController;->-get0(Lcom/android/server/display/AutomaticBrightnessController;)Z
+PLcom/android/server/display/AutomaticBrightnessController;->-wrap0(Lcom/android/server/display/AutomaticBrightnessController;)V
+PLcom/android/server/display/AutomaticBrightnessController;->-wrap1(Lcom/android/server/display/AutomaticBrightnessController;JF)V
+PLcom/android/server/display/AutomaticBrightnessController;->-wrap2(Lcom/android/server/display/AutomaticBrightnessController;)V
+PLcom/android/server/display/AutomaticBrightnessController;-><init>(Lcom/android/server/display/AutomaticBrightnessController$Callbacks;Landroid/os/Looper;Landroid/hardware/SensorManager;Landroid/util/Spline;IIIFIIJJZIFLcom/android/server/display/HysteresisLevels;)V
+PLcom/android/server/display/AutomaticBrightnessController;->adjustLightSensorRate(I)V
+PLcom/android/server/display/AutomaticBrightnessController;->applyLightSensorMeasurement(JF)V
+PLcom/android/server/display/AutomaticBrightnessController;->clampScreenBrightness(I)I
+PLcom/android/server/display/AutomaticBrightnessController;->collectBrightnessAdjustmentSample()V
+PLcom/android/server/display/AutomaticBrightnessController;->configure(ZFZZ)V
+PLcom/android/server/display/AutomaticBrightnessController;->getAutomaticScreenBrightness()I
+PLcom/android/server/display/AutomaticBrightnessController;->prepareBrightnessAdjustmentSample()V
+PLcom/android/server/display/AutomaticBrightnessController;->setAmbientLux(F)V
+PLcom/android/server/display/AutomaticBrightnessController;->setLightSensorEnabled(Z)Z
+PLcom/android/server/display/AutomaticBrightnessController;->setScreenAutoBrightnessAdjustment(F)Z
+PLcom/android/server/display/AutomaticBrightnessController;->updateAmbientLux()V
+PLcom/android/server/display/AutomaticBrightnessController;->updateAutoBrightness(Z)V
+PLcom/android/server/display/ColorFade;-><init>(I)V
+PLcom/android/server/display/ColorFade;->createNativeFloatBuffer(I)Ljava/nio/FloatBuffer;
+PLcom/android/server/display/ColorFade;->dismiss()V
+PLcom/android/server/display/DisplayAdapter;->getSyncRoot()Lcom/android/server/display/DisplayManagerService$SyncRoot;
+PLcom/android/server/display/DisplayDevice;->performTraversalInTransactionLocked()V
+PLcom/android/server/display/DisplayDevice;->populateViewportLocked(Landroid/hardware/display/DisplayViewport;)V
+PLcom/android/server/display/DisplayDevice;->setLayerStackInTransactionLocked(I)V
+PLcom/android/server/display/DisplayDevice;->setProjectionInTransactionLocked(ILandroid/graphics/Rect;Landroid/graphics/Rect;)V
+PLcom/android/server/display/DisplayManagerService$BinderService;->getDisplayIds()[I
+PLcom/android/server/display/DisplayManagerService$BinderService;->getWifiDisplayStatus()Landroid/hardware/display/WifiDisplayStatus;
+PLcom/android/server/display/DisplayManagerService$CallbackRecord;->binderDied()V
+PLcom/android/server/display/DisplayManagerService$CallbackRecord;->notifyDisplayEventAsync(II)V
+PLcom/android/server/display/DisplayManagerService$Injector;->getVirtualDisplayAdapter(Lcom/android/server/display/DisplayManagerService$SyncRoot;Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/display/DisplayAdapter$Listener;)Lcom/android/server/display/VirtualDisplayAdapter;
+PLcom/android/server/display/DisplayManagerService$LocalService$1;-><init>(Lcom/android/server/display/DisplayManagerService$LocalService;Landroid/hardware/display/DisplayManagerInternal$DisplayPowerCallbacks;)V
+PLcom/android/server/display/DisplayManagerService$LocalService$1;->requestDisplayState(II)V
+PLcom/android/server/display/DisplayManagerService$LocalService;->getDisplayInfo(I)Landroid/view/DisplayInfo;
+PLcom/android/server/display/DisplayManagerService$LocalService;->getNonOverrideDisplayInfo(ILandroid/view/DisplayInfo;)V
+PLcom/android/server/display/DisplayManagerService$LocalService;->initPowerManagement(Landroid/hardware/display/DisplayManagerInternal$DisplayPowerCallbacks;Landroid/os/Handler;Landroid/hardware/SensorManager;)V
+PLcom/android/server/display/DisplayManagerService$LocalService;->isProximitySensorAvailable()Z
+PLcom/android/server/display/DisplayManagerService$LocalService;->performTraversalInTransactionFromWindowManager()V
+PLcom/android/server/display/DisplayManagerService$LocalService;->setDisplayAccessUIDs(Landroid/util/SparseArray;)V
+PLcom/android/server/display/DisplayManagerService$LocalService;->setDisplayInfoOverrideFromWindowManager(ILandroid/view/DisplayInfo;)V
+PLcom/android/server/display/DisplayManagerService$LocalService;->setDisplayProperties(IZFIZ)V
+PLcom/android/server/display/DisplayManagerService;->-get0(Lcom/android/server/display/DisplayManagerService;)Landroid/content/Context;
+PLcom/android/server/display/DisplayManagerService;->-get1(Lcom/android/server/display/DisplayManagerService;)Landroid/hardware/display/DisplayViewport;
+PLcom/android/server/display/DisplayManagerService;->-get10(Lcom/android/server/display/DisplayManagerService;)Landroid/view/WindowManagerInternal;
+PLcom/android/server/display/DisplayManagerService;->-get2(Lcom/android/server/display/DisplayManagerService;)Lcom/android/server/display/DisplayPowerController;
+PLcom/android/server/display/DisplayManagerService;->-get3(Lcom/android/server/display/DisplayManagerService;)Landroid/hardware/display/DisplayViewport;
+PLcom/android/server/display/DisplayManagerService;->-get4(Lcom/android/server/display/DisplayManagerService;)Landroid/hardware/input/InputManagerInternal;
+PLcom/android/server/display/DisplayManagerService;->-get6(Lcom/android/server/display/DisplayManagerService;)Landroid/hardware/display/DisplayViewport;
+PLcom/android/server/display/DisplayManagerService;->-get7(Lcom/android/server/display/DisplayManagerService;)Landroid/hardware/display/DisplayViewport;
+PLcom/android/server/display/DisplayManagerService;->-get8(Lcom/android/server/display/DisplayManagerService;)Ljava/util/ArrayList;
+PLcom/android/server/display/DisplayManagerService;->-get9(Lcom/android/server/display/DisplayManagerService;)Ljava/util/ArrayList;
+PLcom/android/server/display/DisplayManagerService;->-set0(Lcom/android/server/display/DisplayManagerService;Lcom/android/server/display/DisplayPowerController;)Lcom/android/server/display/DisplayPowerController;
+PLcom/android/server/display/DisplayManagerService;->-wrap0(Lcom/android/server/display/DisplayManagerService;)Landroid/hardware/display/WifiDisplayStatus;
+PLcom/android/server/display/DisplayManagerService;->-wrap11(Lcom/android/server/display/DisplayManagerService;ILandroid/view/DisplayInfo;)V
+PLcom/android/server/display/DisplayManagerService;->-wrap15(Lcom/android/server/display/DisplayManagerService;Lcom/android/server/display/DisplayManagerService$CallbackRecord;)V
+PLcom/android/server/display/DisplayManagerService;->-wrap17(Lcom/android/server/display/DisplayManagerService;)V
+PLcom/android/server/display/DisplayManagerService;->-wrap24(Lcom/android/server/display/DisplayManagerService;II)V
+PLcom/android/server/display/DisplayManagerService;->-wrap28(Lcom/android/server/display/DisplayManagerService;Landroid/util/SparseArray;)V
+PLcom/android/server/display/DisplayManagerService;->-wrap29(Lcom/android/server/display/DisplayManagerService;ILandroid/view/DisplayInfo;)V
+PLcom/android/server/display/DisplayManagerService;->-wrap31(Lcom/android/server/display/DisplayManagerService;IZFIZ)V
+PLcom/android/server/display/DisplayManagerService;->-wrap4(Lcom/android/server/display/DisplayManagerService;I)[I
+PLcom/android/server/display/DisplayManagerService;->applyGlobalDisplayStateLocked(Ljava/util/List;)V
+PLcom/android/server/display/DisplayManagerService;->clearViewportsLocked()V
+PLcom/android/server/display/DisplayManagerService;->configureDisplayInTransactionLocked(Lcom/android/server/display/DisplayDevice;)V
+PLcom/android/server/display/DisplayManagerService;->findLogicalDisplayForDeviceLocked(Lcom/android/server/display/DisplayDevice;)Lcom/android/server/display/LogicalDisplay;
+PLcom/android/server/display/DisplayManagerService;->getDisplayIdsInternal(I)[I
+PLcom/android/server/display/DisplayManagerService;->getNonOverrideDisplayInfoInternal(ILandroid/view/DisplayInfo;)V
+PLcom/android/server/display/DisplayManagerService;->getWifiDisplayStatusInternal()Landroid/hardware/display/WifiDisplayStatus;
+PLcom/android/server/display/DisplayManagerService;->onCallbackDied(Lcom/android/server/display/DisplayManagerService$CallbackRecord;)V
+PLcom/android/server/display/DisplayManagerService;->performTraversalInTransactionFromWindowManagerInternal()V
+PLcom/android/server/display/DisplayManagerService;->performTraversalInTransactionLocked()V
+PLcom/android/server/display/DisplayManagerService;->registerAdditionalDisplayAdapters()V
+PLcom/android/server/display/DisplayManagerService;->registerOverlayDisplayAdapterLocked()V
+PLcom/android/server/display/DisplayManagerService;->registerVirtualDisplayAdapterLocked()V
+PLcom/android/server/display/DisplayManagerService;->registerWifiDisplayAdapterLocked()V
+PLcom/android/server/display/DisplayManagerService;->requestGlobalDisplayStateInternal(II)V
+PLcom/android/server/display/DisplayManagerService;->setDisplayAccessUIDsInternal(Landroid/util/SparseArray;)V
+PLcom/android/server/display/DisplayManagerService;->setDisplayInfoOverrideFromWindowManagerInternal(ILandroid/view/DisplayInfo;)V
+PLcom/android/server/display/DisplayManagerService;->setDisplayPropertiesInternal(IZFIZ)V
+PLcom/android/server/display/DisplayManagerService;->setViewportLocked(Landroid/hardware/display/DisplayViewport;Lcom/android/server/display/LogicalDisplay;Lcom/android/server/display/DisplayDevice;)V
+PLcom/android/server/display/DisplayManagerService;->setupSchedulerPolicies()V
+PLcom/android/server/display/DisplayManagerService;->shouldRegisterNonEssentialDisplayAdaptersLocked()Z
+PLcom/android/server/display/DisplayManagerService;->stopWifiDisplayScanLocked(Lcom/android/server/display/DisplayManagerService$CallbackRecord;)V
+PLcom/android/server/display/DisplayManagerService;->systemReady(ZZ)V
+PLcom/android/server/display/DisplayManagerService;->windowManagerAndInputReady()V
+PLcom/android/server/display/DisplayPowerController$1;-><init>(Lcom/android/server/display/DisplayPowerController;)V
+PLcom/android/server/display/DisplayPowerController$2;-><init>(Lcom/android/server/display/DisplayPowerController;)V
+PLcom/android/server/display/DisplayPowerController$2;->onAnimationEnd()V
+PLcom/android/server/display/DisplayPowerController$3;-><init>(Lcom/android/server/display/DisplayPowerController;)V
+PLcom/android/server/display/DisplayPowerController$3;->run()V
+PLcom/android/server/display/DisplayPowerController$4;-><init>(Lcom/android/server/display/DisplayPowerController;)V
+PLcom/android/server/display/DisplayPowerController$4;->run()V
+PLcom/android/server/display/DisplayPowerController$5;-><init>(Lcom/android/server/display/DisplayPowerController;)V
+PLcom/android/server/display/DisplayPowerController$6;-><init>(Lcom/android/server/display/DisplayPowerController;)V
+PLcom/android/server/display/DisplayPowerController$7;-><init>(Lcom/android/server/display/DisplayPowerController;)V
+PLcom/android/server/display/DisplayPowerController$DisplayControllerHandler;-><init>(Lcom/android/server/display/DisplayPowerController;Landroid/os/Looper;)V
+PLcom/android/server/display/DisplayPowerController$DisplayControllerHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/display/DisplayPowerController;->-get0(Lcom/android/server/display/DisplayPowerController;)Landroid/hardware/display/DisplayManagerInternal$DisplayPowerCallbacks;
+PLcom/android/server/display/DisplayPowerController;->-wrap3(Lcom/android/server/display/DisplayPowerController;)V
+PLcom/android/server/display/DisplayPowerController;->-wrap6(Lcom/android/server/display/DisplayPowerController;)V
+PLcom/android/server/display/DisplayPowerController;-><init>(Landroid/content/Context;Landroid/hardware/display/DisplayManagerInternal$DisplayPowerCallbacks;Landroid/os/Handler;Landroid/hardware/SensorManager;Lcom/android/server/display/DisplayBlanker;)V
+PLcom/android/server/display/DisplayPowerController;->animateScreenBrightness(II)V
+PLcom/android/server/display/DisplayPowerController;->animateScreenStateChange(IZ)V
+PLcom/android/server/display/DisplayPowerController;->clampAbsoluteBrightness(I)I
+PLcom/android/server/display/DisplayPowerController;->clampScreenBrightness(I)I
+PLcom/android/server/display/DisplayPowerController;->createAutoBrightnessSpline([I[I)Landroid/util/Spline;
+PLcom/android/server/display/DisplayPowerController;->initialize()V
+PLcom/android/server/display/DisplayPowerController;->isProximitySensorAvailable()Z
+PLcom/android/server/display/DisplayPowerController;->normalizeAbsoluteBrightness(I)F
+PLcom/android/server/display/DisplayPowerController;->sendOnStateChangedWithWakelock()V
+PLcom/android/server/display/DisplayPowerController;->sendUpdatePowerState()V
+PLcom/android/server/display/DisplayPowerController;->sendUpdatePowerStateLocked()V
+PLcom/android/server/display/DisplayPowerController;->setProximitySensorEnabled(Z)V
+PLcom/android/server/display/DisplayPowerController;->setScreenState(I)Z
+PLcom/android/server/display/DisplayPowerController;->unblockScreenOn()V
+PLcom/android/server/display/DisplayPowerController;->updateBrightness()V
+PLcom/android/server/display/DisplayPowerController;->updatePowerState()V
+PLcom/android/server/display/DisplayPowerState$1;-><init>(Ljava/lang/String;)V
+PLcom/android/server/display/DisplayPowerState$2;-><init>(Ljava/lang/String;)V
+PLcom/android/server/display/DisplayPowerState$2;->setValue(Lcom/android/server/display/DisplayPowerState;I)V
+PLcom/android/server/display/DisplayPowerState$2;->setValue(Ljava/lang/Object;I)V
+PLcom/android/server/display/DisplayPowerState$3;-><init>(Lcom/android/server/display/DisplayPowerState;)V
+PLcom/android/server/display/DisplayPowerState$3;->run()V
+PLcom/android/server/display/DisplayPowerState$4;-><init>(Lcom/android/server/display/DisplayPowerState;)V
+PLcom/android/server/display/DisplayPowerState$PhotonicModulator;-><init>(Lcom/android/server/display/DisplayPowerState;)V
+PLcom/android/server/display/DisplayPowerState$PhotonicModulator;->run()V
+PLcom/android/server/display/DisplayPowerState$PhotonicModulator;->setState(II)Z
+PLcom/android/server/display/DisplayPowerState;->-get0()Z
+PLcom/android/server/display/DisplayPowerState;->-get1(Lcom/android/server/display/DisplayPowerState;)Lcom/android/server/display/DisplayBlanker;
+PLcom/android/server/display/DisplayPowerState;->-get3(Lcom/android/server/display/DisplayPowerState;)F
+PLcom/android/server/display/DisplayPowerState;->-get5(Lcom/android/server/display/DisplayPowerState;)Lcom/android/server/display/DisplayPowerState$PhotonicModulator;
+PLcom/android/server/display/DisplayPowerState;->-get6(Lcom/android/server/display/DisplayPowerState;)I
+PLcom/android/server/display/DisplayPowerState;->-get7(Lcom/android/server/display/DisplayPowerState;)I
+PLcom/android/server/display/DisplayPowerState;->-set2(Lcom/android/server/display/DisplayPowerState;Z)Z
+PLcom/android/server/display/DisplayPowerState;->-set3(Lcom/android/server/display/DisplayPowerState;Z)Z
+PLcom/android/server/display/DisplayPowerState;->-wrap0(Lcom/android/server/display/DisplayPowerState;)V
+PLcom/android/server/display/DisplayPowerState;->-wrap1(Lcom/android/server/display/DisplayPowerState;)V
+PLcom/android/server/display/DisplayPowerState;-><init>(Lcom/android/server/display/DisplayBlanker;Lcom/android/server/display/ColorFade;)V
+PLcom/android/server/display/DisplayPowerState;->dismissColorFade()V
+PLcom/android/server/display/DisplayPowerState;->getColorFadeLevel()F
+PLcom/android/server/display/DisplayPowerState;->getScreenBrightness()I
+PLcom/android/server/display/DisplayPowerState;->getScreenState()I
+PLcom/android/server/display/DisplayPowerState;->invokeCleanListenerIfNeeded()V
+PLcom/android/server/display/DisplayPowerState;->postScreenUpdateThreadSafe()V
+PLcom/android/server/display/DisplayPowerState;->scheduleScreenUpdate()V
+PLcom/android/server/display/DisplayPowerState;->setColorFadeLevel(F)V
+PLcom/android/server/display/DisplayPowerState;->setScreenBrightness(I)V
+PLcom/android/server/display/DisplayPowerState;->waitUntilClean(Ljava/lang/Runnable;)Z
+PLcom/android/server/display/DisplayTransformManager;->applyColorMatrix([F)V
+PLcom/android/server/display/DisplayTransformManager;->computeColorMatrixLocked()[F
+PLcom/android/server/display/DisplayTransformManager;->getColorMatrix(I)[F
+PLcom/android/server/display/DisplayTransformManager;->setColorMatrix(I[F)V
+PLcom/android/server/display/DisplayTransformManager;->setDaltonizerMode(I)V
+PLcom/android/server/display/HysteresisLevels;-><init>([I[I[I)V
+PLcom/android/server/display/HysteresisLevels;->getBrighteningThreshold(F)F
+PLcom/android/server/display/HysteresisLevels;->getDarkeningThreshold(F)F
+PLcom/android/server/display/HysteresisLevels;->getReferenceLevel(F[F)F
+PLcom/android/server/display/HysteresisLevels;->setArrayFormat([IF)[F
+PLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->requestColorModeInTransactionLocked(I)Z
+PLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->requestDisplayModesInTransactionLocked(II)V
+PLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->requestModeInTransactionLocked(I)Z
+PLcom/android/server/display/LogicalDisplay;->configureDisplayInTransactionLocked(Lcom/android/server/display/DisplayDevice;Z)V
+PLcom/android/server/display/LogicalDisplay;->getDisplayIdLocked()I
+PLcom/android/server/display/LogicalDisplay;->getNonOverrideDisplayInfoLocked(Landroid/view/DisplayInfo;)V
+PLcom/android/server/display/LogicalDisplay;->getRequestedModeIdLocked()I
+PLcom/android/server/display/LogicalDisplay;->hasContentLocked()Z
+PLcom/android/server/display/LogicalDisplay;->setDisplayInfoOverrideFromWindowManagerLocked(Landroid/view/DisplayInfo;)Z
+PLcom/android/server/display/LogicalDisplay;->setHasContentLocked(Z)V
+PLcom/android/server/display/NightDisplayService$1;-><init>(Lcom/android/server/display/NightDisplayService;)V
+PLcom/android/server/display/NightDisplayService$3;-><init>(Lcom/android/server/display/NightDisplayService;Lcom/android/server/display/DisplayTransformManager;)V
+PLcom/android/server/display/NightDisplayService$3;->onAnimationUpdate(Landroid/animation/ValueAnimator;)V
+PLcom/android/server/display/NightDisplayService$4;-><init>(Lcom/android/server/display/NightDisplayService;Lcom/android/server/display/DisplayTransformManager;[F)V
+PLcom/android/server/display/NightDisplayService$4;->onAnimationCancel(Landroid/animation/Animator;)V
+PLcom/android/server/display/NightDisplayService$4;->onAnimationEnd(Landroid/animation/Animator;)V
+PLcom/android/server/display/NightDisplayService$ColorMatrixEvaluator;-><init>()V
+PLcom/android/server/display/NightDisplayService$ColorMatrixEvaluator;-><init>(Lcom/android/server/display/NightDisplayService$ColorMatrixEvaluator;)V
+PLcom/android/server/display/NightDisplayService$ColorMatrixEvaluator;->evaluate(FLjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/android/server/display/NightDisplayService;->-set0(Lcom/android/server/display/NightDisplayService;Landroid/animation/ValueAnimator;)Landroid/animation/ValueAnimator;
+PLcom/android/server/display/NightDisplayService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/display/NightDisplayService;->applyTint(Z)V
+PLcom/android/server/display/NightDisplayService;->isUserSetupCompleted(Landroid/content/ContentResolver;I)Z
+PLcom/android/server/display/NightDisplayService;->onActivated(Z)V
+PLcom/android/server/display/NightDisplayService;->onAutoModeChanged(I)V
+PLcom/android/server/display/NightDisplayService;->onBootPhase(I)V
+PLcom/android/server/display/NightDisplayService;->onStart()V
+PLcom/android/server/display/NightDisplayService;->onStartUser(I)V
+PLcom/android/server/display/NightDisplayService;->onUserChanged(I)V
+PLcom/android/server/display/NightDisplayService;->setMatrix(I[F)V
+PLcom/android/server/display/NightDisplayService;->setUp()V
+PLcom/android/server/display/OverlayDisplayAdapter$1$1;-><init>(Lcom/android/server/display/OverlayDisplayAdapter$1;Landroid/os/Handler;)V
+PLcom/android/server/display/OverlayDisplayAdapter$1;-><init>(Lcom/android/server/display/OverlayDisplayAdapter;)V
+PLcom/android/server/display/OverlayDisplayAdapter$1;->run()V
+PLcom/android/server/display/OverlayDisplayAdapter;->-wrap0(Lcom/android/server/display/OverlayDisplayAdapter;)V
+PLcom/android/server/display/OverlayDisplayAdapter;-><init>(Lcom/android/server/display/DisplayManagerService$SyncRoot;Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/display/DisplayAdapter$Listener;Landroid/os/Handler;)V
+PLcom/android/server/display/OverlayDisplayAdapter;->registerLocked()V
+PLcom/android/server/display/OverlayDisplayAdapter;->updateOverlayDisplayDevices()V
+PLcom/android/server/display/OverlayDisplayAdapter;->updateOverlayDisplayDevicesLocked()V
+PLcom/android/server/display/RampAnimator$1;-><init>(Lcom/android/server/display/RampAnimator;)V
+PLcom/android/server/display/RampAnimator$1;->run()V
+PLcom/android/server/display/RampAnimator;->-get0(Lcom/android/server/display/RampAnimator;)F
+PLcom/android/server/display/RampAnimator;->-get1(Lcom/android/server/display/RampAnimator;)Landroid/view/Choreographer;
+PLcom/android/server/display/RampAnimator;->-get2(Lcom/android/server/display/RampAnimator;)I
+PLcom/android/server/display/RampAnimator;->-get3(Lcom/android/server/display/RampAnimator;)J
+PLcom/android/server/display/RampAnimator;->-get4(Lcom/android/server/display/RampAnimator;)Lcom/android/server/display/RampAnimator$Listener;
+PLcom/android/server/display/RampAnimator;->-get5(Lcom/android/server/display/RampAnimator;)Ljava/lang/Object;
+PLcom/android/server/display/RampAnimator;->-get6(Lcom/android/server/display/RampAnimator;)Landroid/util/IntProperty;
+PLcom/android/server/display/RampAnimator;->-get7(Lcom/android/server/display/RampAnimator;)I
+PLcom/android/server/display/RampAnimator;->-get8(Lcom/android/server/display/RampAnimator;)I
+PLcom/android/server/display/RampAnimator;->-set0(Lcom/android/server/display/RampAnimator;F)F
+PLcom/android/server/display/RampAnimator;->-set1(Lcom/android/server/display/RampAnimator;Z)Z
+PLcom/android/server/display/RampAnimator;->-set2(Lcom/android/server/display/RampAnimator;I)I
+PLcom/android/server/display/RampAnimator;->-set3(Lcom/android/server/display/RampAnimator;J)J
+PLcom/android/server/display/RampAnimator;->-wrap0(Lcom/android/server/display/RampAnimator;)V
+PLcom/android/server/display/RampAnimator;-><init>(Ljava/lang/Object;Landroid/util/IntProperty;)V
+PLcom/android/server/display/RampAnimator;->animateTo(II)Z
+PLcom/android/server/display/RampAnimator;->isAnimating()Z
+PLcom/android/server/display/RampAnimator;->postAnimationCallback()V
+PLcom/android/server/display/RampAnimator;->setListener(Lcom/android/server/display/RampAnimator$Listener;)V
+PLcom/android/server/display/VirtualDisplayAdapter;-><init>(Lcom/android/server/display/DisplayManagerService$SyncRoot;Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/display/DisplayAdapter$Listener;)V
+PLcom/android/server/display/VirtualDisplayAdapter;-><init>(Lcom/android/server/display/DisplayManagerService$SyncRoot;Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/display/DisplayAdapter$Listener;Lcom/android/server/display/VirtualDisplayAdapter$SurfaceControlDisplayFactory;)V
+PLcom/android/server/display/VirtualDisplayAdapter;->registerLocked()V
+PLcom/android/server/dreams/DreamController$1;-><init>(Lcom/android/server/dreams/DreamController;)V
+PLcom/android/server/dreams/DreamController$2;-><init>(Lcom/android/server/dreams/DreamController;)V
+PLcom/android/server/dreams/DreamController;-><init>(Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/dreams/DreamController$Listener;)V
+PLcom/android/server/dreams/DreamManagerService$1;-><init>(Lcom/android/server/dreams/DreamManagerService;)V
+PLcom/android/server/dreams/DreamManagerService$2;-><init>(Lcom/android/server/dreams/DreamManagerService;Landroid/os/Handler;)V
+PLcom/android/server/dreams/DreamManagerService$3;-><init>(Lcom/android/server/dreams/DreamManagerService;)V
+PLcom/android/server/dreams/DreamManagerService$4;-><init>(Lcom/android/server/dreams/DreamManagerService;)V
+PLcom/android/server/dreams/DreamManagerService$4;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/dreams/DreamManagerService$BinderService;-><init>(Lcom/android/server/dreams/DreamManagerService;)V
+PLcom/android/server/dreams/DreamManagerService$BinderService;-><init>(Lcom/android/server/dreams/DreamManagerService;Lcom/android/server/dreams/DreamManagerService$BinderService;)V
+PLcom/android/server/dreams/DreamManagerService$BinderService;->awaken()V
+PLcom/android/server/dreams/DreamManagerService$BinderService;->isDreaming()Z
+PLcom/android/server/dreams/DreamManagerService$DreamHandler;-><init>(Lcom/android/server/dreams/DreamManagerService;Landroid/os/Looper;)V
+PLcom/android/server/dreams/DreamManagerService$LocalService;-><init>(Lcom/android/server/dreams/DreamManagerService;)V
+PLcom/android/server/dreams/DreamManagerService$LocalService;-><init>(Lcom/android/server/dreams/DreamManagerService;Lcom/android/server/dreams/DreamManagerService$LocalService;)V
+PLcom/android/server/dreams/DreamManagerService$LocalService;->isDreaming()Z
+PLcom/android/server/dreams/DreamManagerService;->-get5(Lcom/android/server/dreams/DreamManagerService;)Ljava/lang/Object;
+PLcom/android/server/dreams/DreamManagerService;->-wrap15(Lcom/android/server/dreams/DreamManagerService;Z)V
+PLcom/android/server/dreams/DreamManagerService;->-wrap17(Lcom/android/server/dreams/DreamManagerService;)V
+PLcom/android/server/dreams/DreamManagerService;->-wrap4(Lcom/android/server/dreams/DreamManagerService;Ljava/lang/String;)V
+PLcom/android/server/dreams/DreamManagerService;->-wrap8(Lcom/android/server/dreams/DreamManagerService;)V
+PLcom/android/server/dreams/DreamManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/dreams/DreamManagerService;->checkPermission(Ljava/lang/String;)V
+PLcom/android/server/dreams/DreamManagerService;->getDozeComponent()Landroid/content/ComponentName;
+PLcom/android/server/dreams/DreamManagerService;->getDozeComponent(I)Landroid/content/ComponentName;
+PLcom/android/server/dreams/DreamManagerService;->getServiceInfo(Landroid/content/ComponentName;)Landroid/content/pm/ServiceInfo;
+PLcom/android/server/dreams/DreamManagerService;->onBootPhase(I)V
+PLcom/android/server/dreams/DreamManagerService;->onStart()V
+PLcom/android/server/dreams/DreamManagerService;->requestAwakenInternal()V
+PLcom/android/server/dreams/DreamManagerService;->stopDreamInternal(Z)V
+PLcom/android/server/dreams/DreamManagerService;->stopDreamLocked(Z)V
+PLcom/android/server/dreams/DreamManagerService;->validateDream(Landroid/content/ComponentName;)Z
+PLcom/android/server/dreams/DreamManagerService;->writePulseGestureEnabled()V
+PLcom/android/server/emergency/EmergencyAffordanceService$1;-><init>(Lcom/android/server/emergency/EmergencyAffordanceService;)V
+PLcom/android/server/emergency/EmergencyAffordanceService$2;-><init>(Lcom/android/server/emergency/EmergencyAffordanceService;)V
+PLcom/android/server/emergency/EmergencyAffordanceService$3;-><init>(Lcom/android/server/emergency/EmergencyAffordanceService;)V
+PLcom/android/server/emergency/EmergencyAffordanceService$3;->onSubscriptionsChanged()V
+PLcom/android/server/emergency/EmergencyAffordanceService$MyHandler;-><init>(Lcom/android/server/emergency/EmergencyAffordanceService;Landroid/os/Looper;)V
+PLcom/android/server/emergency/EmergencyAffordanceService$MyHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/emergency/EmergencyAffordanceService;->-get0(Lcom/android/server/emergency/EmergencyAffordanceService;)Lcom/android/server/emergency/EmergencyAffordanceService$MyHandler;
+PLcom/android/server/emergency/EmergencyAffordanceService;->-wrap1(Lcom/android/server/emergency/EmergencyAffordanceService;)Z
+PLcom/android/server/emergency/EmergencyAffordanceService;->-wrap3(Lcom/android/server/emergency/EmergencyAffordanceService;)V
+PLcom/android/server/emergency/EmergencyAffordanceService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/emergency/EmergencyAffordanceService;->handleInitializeState()V
+PLcom/android/server/emergency/EmergencyAffordanceService;->handleUpdateCellInfo()Z
+PLcom/android/server/emergency/EmergencyAffordanceService;->handleUpdateSimSubscriptionInfo()Z
+PLcom/android/server/emergency/EmergencyAffordanceService;->onBootPhase(I)V
+PLcom/android/server/emergency/EmergencyAffordanceService;->onStart()V
+PLcom/android/server/emergency/EmergencyAffordanceService;->setSimNeedsEmergencyAffordance(Z)V
+PLcom/android/server/emergency/EmergencyAffordanceService;->simNeededAffordanceBefore()Z
+PLcom/android/server/emergency/EmergencyAffordanceService;->startScanning()V
+PLcom/android/server/emergency/EmergencyAffordanceService;->updateEmergencyAffordanceNeeded()V
+PLcom/android/server/fingerprint/-$Lambda$NsdFXKe2P39OH-qCAY_zqOMIIsg;->$m$0()V
+PLcom/android/server/fingerprint/-$Lambda$NsdFXKe2P39OH-qCAY_zqOMIIsg;-><init>(Ljava/lang/Object;)V
+PLcom/android/server/fingerprint/-$Lambda$NsdFXKe2P39OH-qCAY_zqOMIIsg;->run()V
+PLcom/android/server/fingerprint/FingerprintService$12;-><init>(Lcom/android/server/fingerprint/FingerprintService;)V
+PLcom/android/server/fingerprint/FingerprintService$1;-><init>(Lcom/android/server/fingerprint/FingerprintService;)V
+PLcom/android/server/fingerprint/FingerprintService$2;-><init>(Lcom/android/server/fingerprint/FingerprintService;)V
+PLcom/android/server/fingerprint/FingerprintService$3;-><init>(Lcom/android/server/fingerprint/FingerprintService;)V
+PLcom/android/server/fingerprint/FingerprintService$4;-><init>(Lcom/android/server/fingerprint/FingerprintService;)V
+PLcom/android/server/fingerprint/FingerprintService$5;-><init>(Lcom/android/server/fingerprint/FingerprintService;)V
+PLcom/android/server/fingerprint/FingerprintService$FingerprintServiceLockoutResetMonitor$1;-><init>(Lcom/android/server/fingerprint/FingerprintService$FingerprintServiceLockoutResetMonitor;)V
+PLcom/android/server/fingerprint/FingerprintService$FingerprintServiceLockoutResetMonitor;-><init>(Lcom/android/server/fingerprint/FingerprintService;Landroid/hardware/fingerprint/IFingerprintServiceLockoutResetCallback;)V
+PLcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper$9;-><init>(Lcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper;Landroid/hardware/fingerprint/IFingerprintServiceLockoutResetCallback;)V
+PLcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper$9;->run()V
+PLcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper;-><init>(Lcom/android/server/fingerprint/FingerprintService;)V
+PLcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper;-><init>(Lcom/android/server/fingerprint/FingerprintService;Lcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper;)V
+PLcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper;->addLockoutResetCallback(Landroid/hardware/fingerprint/IFingerprintServiceLockoutResetCallback;)V
+PLcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper;->getEnrolledFingerprints(ILjava/lang/String;)Ljava/util/List;
+PLcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper;->isHardwareDetected(JLjava/lang/String;)Z
+PLcom/android/server/fingerprint/FingerprintService;->-com_android_server_fingerprint_FingerprintService-mthref-0()V
+PLcom/android/server/fingerprint/FingerprintService;->-get12(Lcom/android/server/fingerprint/FingerprintService;)Landroid/os/PowerManager;
+PLcom/android/server/fingerprint/FingerprintService;->-get7(Lcom/android/server/fingerprint/FingerprintService;)J
+PLcom/android/server/fingerprint/FingerprintService;->-get8(Lcom/android/server/fingerprint/FingerprintService;)Landroid/os/Handler;
+PLcom/android/server/fingerprint/FingerprintService;->-wrap0(Lcom/android/server/fingerprint/FingerprintService;Ljava/lang/String;ZIII)Z
+PLcom/android/server/fingerprint/FingerprintService;->-wrap2(Lcom/android/server/fingerprint/FingerprintService;Lcom/android/server/fingerprint/FingerprintService$FingerprintServiceLockoutResetMonitor;)V
+PLcom/android/server/fingerprint/FingerprintService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/fingerprint/FingerprintService;->addLockoutResetMonitor(Lcom/android/server/fingerprint/FingerprintService$FingerprintServiceLockoutResetMonitor;)V
+PLcom/android/server/fingerprint/FingerprintService;->canUseFingerprint(Ljava/lang/String;ZIII)Z
+PLcom/android/server/fingerprint/FingerprintService;->checkPermission(Ljava/lang/String;)V
+PLcom/android/server/fingerprint/FingerprintService;->doFingerprintCleanup(I)V
+PLcom/android/server/fingerprint/FingerprintService;->getEffectiveUserId(I)I
+PLcom/android/server/fingerprint/FingerprintService;->getEnrolledFingerprints(I)Ljava/util/List;
+PLcom/android/server/fingerprint/FingerprintService;->getFingerprintDaemon()Landroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;
+PLcom/android/server/fingerprint/FingerprintService;->getUserOrWorkProfileId(Ljava/lang/String;I)I
+PLcom/android/server/fingerprint/FingerprintService;->hasEnrolledFingerprints(I)Z
+PLcom/android/server/fingerprint/FingerprintService;->isKeyguard(Ljava/lang/String;)Z
+PLcom/android/server/fingerprint/FingerprintService;->isWorkProfile(I)Z
+PLcom/android/server/fingerprint/FingerprintService;->listenForUserSwitches()V
+PLcom/android/server/fingerprint/FingerprintService;->loadAuthenticatorIds()V
+PLcom/android/server/fingerprint/FingerprintService;->onStart()V
+PLcom/android/server/fingerprint/FingerprintService;->updateActiveGroup(ILjava/lang/String;)V
+PLcom/android/server/fingerprint/FingerprintUtils;-><init>()V
+PLcom/android/server/fingerprint/FingerprintUtils;->getFingerprintsForUser(Landroid/content/Context;I)Ljava/util/List;
+PLcom/android/server/fingerprint/FingerprintUtils;->getInstance()Lcom/android/server/fingerprint/FingerprintUtils;
+PLcom/android/server/fingerprint/FingerprintUtils;->getStateForUser(Landroid/content/Context;I)Lcom/android/server/fingerprint/FingerprintsUserState;
+PLcom/android/server/fingerprint/FingerprintsUserState$1;-><init>(Lcom/android/server/fingerprint/FingerprintsUserState;)V
+PLcom/android/server/fingerprint/FingerprintsUserState;-><init>(Landroid/content/Context;I)V
+PLcom/android/server/fingerprint/FingerprintsUserState;->getCopy(Ljava/util/ArrayList;)Ljava/util/ArrayList;
+PLcom/android/server/fingerprint/FingerprintsUserState;->getFileForUser(I)Ljava/io/File;
+PLcom/android/server/fingerprint/FingerprintsUserState;->getFingerprints()Ljava/util/List;
+PLcom/android/server/fingerprint/FingerprintsUserState;->readStateSyncLocked()V
+PLcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;->sortResults(Ljava/util/List;)V
+PLcom/android/server/firewall/IntentFirewall;->checkService(Landroid/content/ComponentName;Landroid/content/Intent;IILjava/lang/String;Landroid/content/pm/ApplicationInfo;)Z
+PLcom/android/server/firewall/IntentFirewall;->checkStartActivity(Landroid/content/Intent;IILjava/lang/String;Landroid/content/pm/ApplicationInfo;)Z
+PLcom/android/server/input/InputApplicationHandle;-><init>(Ljava/lang/Object;)V
+PLcom/android/server/input/InputApplicationHandle;->finalize()V
+PLcom/android/server/input/InputManagerService$10;-><init>(Lcom/android/server/input/InputManagerService;Landroid/os/Handler;)V
+PLcom/android/server/input/InputManagerService$11;-><init>(Lcom/android/server/input/InputManagerService;Landroid/os/Handler;)V
+PLcom/android/server/input/InputManagerService$12;-><init>(Lcom/android/server/input/InputManagerService;Landroid/os/Handler;)V
+PLcom/android/server/input/InputManagerService$1;-><init>(Lcom/android/server/input/InputManagerService;)V
+PLcom/android/server/input/InputManagerService$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/input/InputManagerService$2;-><init>(Lcom/android/server/input/InputManagerService;)V
+PLcom/android/server/input/InputManagerService$2;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/input/InputManagerService$3;-><init>(Lcom/android/server/input/InputManagerService;)V
+PLcom/android/server/input/InputManagerService$5;-><init>(Lcom/android/server/input/InputManagerService;Ljava/util/HashSet;)V
+PLcom/android/server/input/InputManagerService$5;->visitKeyboardLayout(Landroid/content/res/Resources;ILandroid/hardware/input/KeyboardLayout;)V
+PLcom/android/server/input/InputManagerService$InputDevicesChangedListenerRecord;-><init>(Lcom/android/server/input/InputManagerService;ILandroid/hardware/input/IInputDevicesChangedListener;)V
+PLcom/android/server/input/InputManagerService$InputDevicesChangedListenerRecord;->binderDied()V
+PLcom/android/server/input/InputManagerService$InputManagerHandler;-><init>(Lcom/android/server/input/InputManagerService;Landroid/os/Looper;)V
+PLcom/android/server/input/InputManagerService$InputManagerHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/input/InputManagerService$KeyboardLayoutDescriptor;->format(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/input/InputManagerService$LocalService;-><init>(Lcom/android/server/input/InputManagerService;)V
+PLcom/android/server/input/InputManagerService$LocalService;-><init>(Lcom/android/server/input/InputManagerService;Lcom/android/server/input/InputManagerService$LocalService;)V
+PLcom/android/server/input/InputManagerService$LocalService;->onInputMethodSubtypeChanged(ILandroid/view/inputmethod/InputMethodInfo;Landroid/view/inputmethod/InputMethodSubtype;)V
+PLcom/android/server/input/InputManagerService$LocalService;->setDisplayViewports(Landroid/hardware/display/DisplayViewport;Landroid/hardware/display/DisplayViewport;Ljava/util/List;)V
+PLcom/android/server/input/InputManagerService$LocalService;->setPulseGestureEnabled(Z)V
+PLcom/android/server/input/InputManagerService;->-get0(Lcom/android/server/input/InputManagerService;)Ljava/io/File;
+PLcom/android/server/input/InputManagerService;->-get1(Lcom/android/server/input/InputManagerService;)Lcom/android/server/input/InputManagerService$InputManagerHandler;
+PLcom/android/server/input/InputManagerService;->-wrap11(Lcom/android/server/input/InputManagerService;)V
+PLcom/android/server/input/InputManagerService;->-wrap13(Lcom/android/server/input/InputManagerService;Landroid/hardware/display/DisplayViewport;Landroid/hardware/display/DisplayViewport;Ljava/util/List;)V
+PLcom/android/server/input/InputManagerService;->-wrap14(Lcom/android/server/input/InputManagerService;)V
+PLcom/android/server/input/InputManagerService;->-wrap3(Lcom/android/server/input/InputManagerService;[Landroid/view/InputDevice;)V
+PLcom/android/server/input/InputManagerService;->-wrap5(Lcom/android/server/input/InputManagerService;ILandroid/view/inputmethod/InputMethodInfo;Landroid/view/inputmethod/InputMethodSubtype;)V
+PLcom/android/server/input/InputManagerService;->-wrap9(Lcom/android/server/input/InputManagerService;I)V
+PLcom/android/server/input/InputManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/input/InputManagerService;->checkInjectEventsPermission(II)Z
+PLcom/android/server/input/InputManagerService;->deliverInputDevicesChanged([Landroid/view/InputDevice;)V
+PLcom/android/server/input/InputManagerService;->dispatchUnhandledKey(Lcom/android/server/input/InputWindowHandle;Landroid/view/KeyEvent;I)Landroid/view/KeyEvent;
+PLcom/android/server/input/InputManagerService;->getCurrentKeyboardLayoutForInputDevice(Landroid/hardware/input/InputDeviceIdentifier;)Ljava/lang/String;
+PLcom/android/server/input/InputManagerService;->getDeviceAlias(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/input/InputManagerService;->getDoubleTapTimeout()I
+PLcom/android/server/input/InputManagerService;->getExcludedDeviceNames()[Ljava/lang/String;
+PLcom/android/server/input/InputManagerService;->getHoverTapSlop()I
+PLcom/android/server/input/InputManagerService;->getHoverTapTimeout()I
+PLcom/android/server/input/InputManagerService;->getInputDevice(I)Landroid/view/InputDevice;
+PLcom/android/server/input/InputManagerService;->getInputDeviceIds()[I
+PLcom/android/server/input/InputManagerService;->getInputDevices()[Landroid/view/InputDevice;
+PLcom/android/server/input/InputManagerService;->getKeyCodeState(III)I
+PLcom/android/server/input/InputManagerService;->getKeyRepeatDelay()I
+PLcom/android/server/input/InputManagerService;->getKeyRepeatTimeout()I
+PLcom/android/server/input/InputManagerService;->getKeyboardLayoutOverlay(Landroid/hardware/input/InputDeviceIdentifier;)[Ljava/lang/String;
+PLcom/android/server/input/InputManagerService;->getLayoutDescriptor(Landroid/hardware/input/InputDeviceIdentifier;)Ljava/lang/String;
+PLcom/android/server/input/InputManagerService;->getLocalesFromLanguageTags(Ljava/lang/String;)Landroid/os/LocaleList;
+PLcom/android/server/input/InputManagerService;->getLongPressTimeout()I
+PLcom/android/server/input/InputManagerService;->getPointerSpeedSetting()I
+PLcom/android/server/input/InputManagerService;->getScanCodeState(III)I
+PLcom/android/server/input/InputManagerService;->getShowTouchesSetting(I)I
+PLcom/android/server/input/InputManagerService;->getSwitchState(III)I
+PLcom/android/server/input/InputManagerService;->getTouchCalibrationForInputDevice(Ljava/lang/String;I)Landroid/hardware/input/TouchCalibration;
+PLcom/android/server/input/InputManagerService;->getVirtualKeyQuietTimeMillis()I
+PLcom/android/server/input/InputManagerService;->handleSwitchInputMethodSubtype(ILandroid/view/inputmethod/InputMethodInfo;Landroid/view/inputmethod/InputMethodSubtype;)V
+PLcom/android/server/input/InputManagerService;->handleSwitchKeyboardLayout(Landroid/hardware/input/InputDeviceIdentifier;Lcom/android/internal/inputmethod/InputMethodSubtypeHandle;)V
+PLcom/android/server/input/InputManagerService;->hasKeys(II[I[Z)Z
+PLcom/android/server/input/InputManagerService;->injectInputEvent(Landroid/view/InputEvent;I)Z
+PLcom/android/server/input/InputManagerService;->injectInputEventInternal(Landroid/view/InputEvent;II)Z
+PLcom/android/server/input/InputManagerService;->interceptKeyBeforeDispatching(Lcom/android/server/input/InputWindowHandle;Landroid/view/KeyEvent;I)J
+PLcom/android/server/input/InputManagerService;->interceptKeyBeforeQueueing(Landroid/view/KeyEvent;I)I
+PLcom/android/server/input/InputManagerService;->monitor()V
+PLcom/android/server/input/InputManagerService;->monitorInput(Ljava/lang/String;)Landroid/view/InputChannel;
+PLcom/android/server/input/InputManagerService;->notifyConfigurationChanged(J)V
+PLcom/android/server/input/InputManagerService;->notifyInputDevicesChanged([Landroid/view/InputDevice;)V
+PLcom/android/server/input/InputManagerService;->onInputDevicesChangedListenerDied(I)V
+PLcom/android/server/input/InputManagerService;->registerAccessibilityLargePointerSettingObserver()V
+PLcom/android/server/input/InputManagerService;->registerInputChannel(Landroid/view/InputChannel;Lcom/android/server/input/InputWindowHandle;)V
+PLcom/android/server/input/InputManagerService;->registerInputDevicesChangedListener(Landroid/hardware/input/IInputDevicesChangedListener;)V
+PLcom/android/server/input/InputManagerService;->registerPointerSpeedSettingObserver()V
+PLcom/android/server/input/InputManagerService;->registerShowTouchesSettingObserver()V
+PLcom/android/server/input/InputManagerService;->reloadDeviceAliases()V
+PLcom/android/server/input/InputManagerService;->reloadKeyboardLayouts()V
+PLcom/android/server/input/InputManagerService;->setDisplayViewport(ILandroid/hardware/display/DisplayViewport;)V
+PLcom/android/server/input/InputManagerService;->setDisplayViewportsInternal(Landroid/hardware/display/DisplayViewport;Landroid/hardware/display/DisplayViewport;Ljava/util/List;)V
+PLcom/android/server/input/InputManagerService;->setFocusedApplication(Lcom/android/server/input/InputApplicationHandle;)V
+PLcom/android/server/input/InputManagerService;->setInputDispatchMode(ZZ)V
+PLcom/android/server/input/InputManagerService;->setPointerSpeedUnchecked(I)V
+PLcom/android/server/input/InputManagerService;->setSystemUiVisibility(I)V
+PLcom/android/server/input/InputManagerService;->setWindowManagerCallbacks(Lcom/android/server/input/InputManagerService$WindowManagerCallbacks;)V
+PLcom/android/server/input/InputManagerService;->setWiredAccessoryCallbacks(Lcom/android/server/input/InputManagerService$WiredAccessoryCallbacks;)V
+PLcom/android/server/input/InputManagerService;->start()V
+PLcom/android/server/input/InputManagerService;->systemRunning()V
+PLcom/android/server/input/InputManagerService;->unregisterInputChannel(Landroid/view/InputChannel;)V
+PLcom/android/server/input/InputManagerService;->updateAccessibilityLargePointerFromSettings()V
+PLcom/android/server/input/InputManagerService;->updateKeyboardLayouts()V
+PLcom/android/server/input/InputManagerService;->updatePointerSpeedFromSettings()V
+PLcom/android/server/input/InputManagerService;->updateShowTouchesFromSettings()V
+PLcom/android/server/input/InputManagerService;->visitAllKeyboardLayouts(Lcom/android/server/input/InputManagerService$KeyboardLayoutVisitor;)V
+PLcom/android/server/input/InputWindowHandle;-><init>(Lcom/android/server/input/InputApplicationHandle;Ljava/lang/Object;Landroid/view/IWindow;I)V
+PLcom/android/server/input/InputWindowHandle;->finalize()V
+PLcom/android/server/input/PersistentDataStore;-><init>()V
+PLcom/android/server/input/PersistentDataStore;->clearState()V
+PLcom/android/server/input/PersistentDataStore;->getCurrentKeyboardLayout(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/input/PersistentDataStore;->getInputDeviceState(Ljava/lang/String;Z)Lcom/android/server/input/PersistentDataStore$InputDeviceState;
+PLcom/android/server/input/PersistentDataStore;->getTouchCalibration(Ljava/lang/String;I)Landroid/hardware/input/TouchCalibration;
+PLcom/android/server/input/PersistentDataStore;->load()V
+PLcom/android/server/input/PersistentDataStore;->loadIfNeeded()V
+PLcom/android/server/input/PersistentDataStore;->removeUninstalledKeyboardLayouts(Ljava/util/Set;)Z
+PLcom/android/server/input/PersistentDataStore;->saveIfNeeded()V
+PLcom/android/server/input/PersistentDataStore;->switchKeyboardLayout(Ljava/lang/String;Lcom/android/internal/inputmethod/InputMethodSubtypeHandle;)Z
+PLcom/android/server/job/-$Lambda$MZyz9fgevtnL7iKUFvjeGfWQ-E8;->$m$0(Ljava/lang/Object;Ljava/lang/Object;)I
+PLcom/android/server/job/-$Lambda$MZyz9fgevtnL7iKUFvjeGfWQ-E8;-><init>()V
+PLcom/android/server/job/-$Lambda$MZyz9fgevtnL7iKUFvjeGfWQ-E8;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+PLcom/android/server/job/JobPackageTracker$DataSet;-><init>()V
+PLcom/android/server/job/JobPackageTracker$DataSet;->decActive(ILjava/lang/String;J)V
+PLcom/android/server/job/JobPackageTracker$DataSet;->decActiveTop(ILjava/lang/String;J)V
+PLcom/android/server/job/JobPackageTracker$DataSet;->decPending(ILjava/lang/String;J)V
+PLcom/android/server/job/JobPackageTracker$DataSet;->getEntry(ILjava/lang/String;)Lcom/android/server/job/JobPackageTracker$PackageEntry;
+PLcom/android/server/job/JobPackageTracker$DataSet;->getOrCreateEntry(ILjava/lang/String;)Lcom/android/server/job/JobPackageTracker$PackageEntry;
+PLcom/android/server/job/JobPackageTracker$DataSet;->getTotalTime(J)J
+PLcom/android/server/job/JobPackageTracker$DataSet;->incActive(ILjava/lang/String;J)V
+PLcom/android/server/job/JobPackageTracker$DataSet;->incActiveTop(ILjava/lang/String;J)V
+PLcom/android/server/job/JobPackageTracker$DataSet;->incPending(ILjava/lang/String;J)V
+PLcom/android/server/job/JobPackageTracker$PackageEntry;-><init>()V
+PLcom/android/server/job/JobPackageTracker$PackageEntry;->getActiveTime(J)J
+PLcom/android/server/job/JobPackageTracker$PackageEntry;->getPendingTime(J)J
+PLcom/android/server/job/JobPackageTracker;-><init>()V
+PLcom/android/server/job/JobPackageTracker;->addEvent(IILjava/lang/String;)V
+PLcom/android/server/job/JobPackageTracker;->getLoadFactor(Lcom/android/server/job/controllers/JobStatus;)F
+PLcom/android/server/job/JobPackageTracker;->noteActive(Lcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/JobPackageTracker;->noteConcurrency(II)V
+PLcom/android/server/job/JobPackageTracker;->noteInactive(Lcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/JobPackageTracker;->noteNonpending(Lcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/JobPackageTracker;->notePending(Lcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/JobPackageTracker;->rebatchIfNeeded(J)V
+PLcom/android/server/job/JobSchedulerService$1;-><init>(Lcom/android/server/job/JobSchedulerService;)V
+PLcom/android/server/job/JobSchedulerService$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/job/JobSchedulerService$2;-><init>(Lcom/android/server/job/JobSchedulerService;)V
+PLcom/android/server/job/JobSchedulerService$2;->onUidGone(IZ)V
+PLcom/android/server/job/JobSchedulerService$2;->onUidIdle(IZ)V
+PLcom/android/server/job/JobSchedulerService$2;->onUidStateChanged(IIJ)V
+PLcom/android/server/job/JobSchedulerService$3;-><init>(Lcom/android/server/job/JobSchedulerService;)V
+PLcom/android/server/job/JobSchedulerService$Constants;-><init>(Lcom/android/server/job/JobSchedulerService;Landroid/os/Handler;)V
+PLcom/android/server/job/JobSchedulerService$Constants;->start(Landroid/content/ContentResolver;)V
+PLcom/android/server/job/JobSchedulerService$Constants;->updateConstants()V
+PLcom/android/server/job/JobSchedulerService$JobHandler;-><init>(Lcom/android/server/job/JobSchedulerService;Landroid/os/Looper;)V
+PLcom/android/server/job/JobSchedulerService$JobHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/job/JobSchedulerService$JobSchedulerStub;-><init>(Lcom/android/server/job/JobSchedulerService;)V
+PLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->canPersistJobs(II)Z
+PLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->cancel(I)V
+PLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->cancelAll()V
+PLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->enforceValidJobRequest(ILandroid/app/job/JobInfo;)V
+PLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->getAllPendingJobs()Ljava/util/List;
+PLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->getPendingJob(I)Landroid/app/job/JobInfo;
+PLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->schedule(Landroid/app/job/JobInfo;)I
+PLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->scheduleAsPackage(Landroid/app/job/JobInfo;Ljava/lang/String;ILjava/lang/String;)I
+PLcom/android/server/job/JobSchedulerService$LocalService$1;-><init>(Lcom/android/server/job/JobSchedulerService$LocalService;Ljava/util/List;)V
+PLcom/android/server/job/JobSchedulerService$LocalService$1;->process(Lcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/JobSchedulerService$LocalService;-><init>(Lcom/android/server/job/JobSchedulerService;)V
+PLcom/android/server/job/JobSchedulerService$LocalService;->getSystemScheduledPendingJobs()Ljava/util/List;
+PLcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;-><init>(Lcom/android/server/job/JobSchedulerService;)V
+PLcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;->postProcess()V
+PLcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;->reset()V
+PLcom/android/server/job/JobSchedulerService$ReadyJobQueueFunctor;-><init>(Lcom/android/server/job/JobSchedulerService;)V
+PLcom/android/server/job/JobSchedulerService$ReadyJobQueueFunctor;->postProcess()V
+PLcom/android/server/job/JobSchedulerService;->-wrap0(Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/controllers/JobStatus;)Z
+PLcom/android/server/job/JobSchedulerService;->-wrap2(Lcom/android/server/job/JobSchedulerService;Landroid/content/Intent;)Ljava/lang/String;
+PLcom/android/server/job/JobSchedulerService;->-wrap4(Lcom/android/server/job/JobSchedulerService;)V
+PLcom/android/server/job/JobSchedulerService;->-wrap5(Lcom/android/server/job/JobSchedulerService;)V
+PLcom/android/server/job/JobSchedulerService;->-wrap6(Lcom/android/server/job/JobSchedulerService;)V
+PLcom/android/server/job/JobSchedulerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/job/JobSchedulerService;->addOrderedItem(Ljava/util/ArrayList;Ljava/lang/Object;Ljava/util/Comparator;)V
+PLcom/android/server/job/JobSchedulerService;->adjustJobPriority(ILcom/android/server/job/controllers/JobStatus;)I
+PLcom/android/server/job/JobSchedulerService;->cancelJob(II)V
+PLcom/android/server/job/JobSchedulerService;->cancelJobImplLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;Ljava/lang/String;)V
+PLcom/android/server/job/JobSchedulerService;->cancelJobsForNonExistentUsers()V
+PLcom/android/server/job/JobSchedulerService;->cancelJobsForUid(ILjava/lang/String;)V
+PLcom/android/server/job/JobSchedulerService;->evaluateJobPriorityLocked(Lcom/android/server/job/controllers/JobStatus;)I
+PLcom/android/server/job/JobSchedulerService;->findJobContextIdFromMap(Lcom/android/server/job/controllers/JobStatus;[Lcom/android/server/job/controllers/JobStatus;)I
+PLcom/android/server/job/JobSchedulerService;->getJobStore()Lcom/android/server/job/JobStore;
+PLcom/android/server/job/JobSchedulerService;->getLock()Ljava/lang/Object;
+PLcom/android/server/job/JobSchedulerService;->getPackageName(Landroid/content/Intent;)Ljava/lang/String;
+PLcom/android/server/job/JobSchedulerService;->getPendingJob(II)Landroid/app/job/JobInfo;
+PLcom/android/server/job/JobSchedulerService;->getPendingJobs(I)Ljava/util/List;
+PLcom/android/server/job/JobSchedulerService;->getRescheduleJobForFailureLocked(Lcom/android/server/job/controllers/JobStatus;)Lcom/android/server/job/controllers/JobStatus;
+PLcom/android/server/job/JobSchedulerService;->getRescheduleJobForPeriodic(Lcom/android/server/job/controllers/JobStatus;)Lcom/android/server/job/controllers/JobStatus;
+PLcom/android/server/job/JobSchedulerService;->lambda$-com_android_server_job_JobSchedulerService_21790(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)I
+PLcom/android/server/job/JobSchedulerService;->maybeQueueReadyJobsForExecutionLocked()V
+PLcom/android/server/job/JobSchedulerService;->maybeRunPendingJobsLocked()V
+PLcom/android/server/job/JobSchedulerService;->noteJobsNonpending(Ljava/util/List;)V
+PLcom/android/server/job/JobSchedulerService;->noteJobsPending(Ljava/util/List;)V
+PLcom/android/server/job/JobSchedulerService;->onBootPhase(I)V
+PLcom/android/server/job/JobSchedulerService;->onControllerStateChanged()V
+PLcom/android/server/job/JobSchedulerService;->onJobCompletedLocked(Lcom/android/server/job/controllers/JobStatus;Z)V
+PLcom/android/server/job/JobSchedulerService;->onRunJobNow(Lcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/JobSchedulerService;->onStart()V
+PLcom/android/server/job/JobSchedulerService;->onStartUser(I)V
+PLcom/android/server/job/JobSchedulerService;->onUnlockUser(I)V
+PLcom/android/server/job/JobSchedulerService;->queueReadyJobsForExecutionLocked()V
+PLcom/android/server/job/JobSchedulerService;->scheduleAsPackage(Landroid/app/job/JobInfo;Landroid/app/job/JobWorkItem;ILjava/lang/String;ILjava/lang/String;)I
+PLcom/android/server/job/JobSchedulerService;->stopJobOnServiceContextLocked(Lcom/android/server/job/controllers/JobStatus;ILjava/lang/String;)Z
+PLcom/android/server/job/JobSchedulerService;->stopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;Z)Z
+PLcom/android/server/job/JobSchedulerService;->updateUidState(II)V
+PLcom/android/server/job/JobServiceContext$JobCallback;-><init>(Lcom/android/server/job/JobServiceContext;)V
+PLcom/android/server/job/JobServiceContext$JobCallback;->acknowledgeStartMessage(IZ)V
+PLcom/android/server/job/JobServiceContext$JobCallback;->acknowledgeStopMessage(IZ)V
+PLcom/android/server/job/JobServiceContext$JobCallback;->jobFinished(IZ)V
+PLcom/android/server/job/JobServiceContext$JobServiceHandler;-><init>(Lcom/android/server/job/JobServiceContext;Landroid/os/Looper;)V
+PLcom/android/server/job/JobServiceContext;-><init>(Landroid/content/Context;Ljava/lang/Object;Lcom/android/internal/app/IBatteryStats;Lcom/android/server/job/JobPackageTracker;Lcom/android/server/job/JobCompletedListener;Landroid/os/Looper;)V
+PLcom/android/server/job/JobServiceContext;-><init>(Lcom/android/server/job/JobSchedulerService;Lcom/android/internal/app/IBatteryStats;Lcom/android/server/job/JobPackageTracker;Landroid/os/Looper;)V
+PLcom/android/server/job/JobServiceContext;->applyStoppedReasonLocked(Ljava/lang/String;)V
+PLcom/android/server/job/JobServiceContext;->cancelExecutingJobLocked(ILjava/lang/String;)V
+PLcom/android/server/job/JobServiceContext;->clearPreferredUid()V
+PLcom/android/server/job/JobServiceContext;->closeAndCleanupJobLocked(ZLjava/lang/String;)V
+PLcom/android/server/job/JobServiceContext;->doAcknowledgeStartMessage(Lcom/android/server/job/JobServiceContext$JobCallback;IZ)V
+PLcom/android/server/job/JobServiceContext;->doAcknowledgeStopMessage(Lcom/android/server/job/JobServiceContext$JobCallback;IZ)V
+PLcom/android/server/job/JobServiceContext;->doCallback(Lcom/android/server/job/JobServiceContext$JobCallback;ZLjava/lang/String;)V
+PLcom/android/server/job/JobServiceContext;->doCallbackLocked(ZLjava/lang/String;)V
+PLcom/android/server/job/JobServiceContext;->doCancelLocked(ILjava/lang/String;)V
+PLcom/android/server/job/JobServiceContext;->doJobFinished(Lcom/android/server/job/JobServiceContext$JobCallback;IZ)V
+PLcom/android/server/job/JobServiceContext;->doServiceBoundLocked()V
+PLcom/android/server/job/JobServiceContext;->executeRunnableJob(Lcom/android/server/job/controllers/JobStatus;)Z
+PLcom/android/server/job/JobServiceContext;->getPreferredUid()I
+PLcom/android/server/job/JobServiceContext;->handleCancelLocked(Ljava/lang/String;)V
+PLcom/android/server/job/JobServiceContext;->handleFinishedLocked(ZLjava/lang/String;)V
+PLcom/android/server/job/JobServiceContext;->handleServiceBoundLocked()V
+PLcom/android/server/job/JobServiceContext;->handleStartedLocked(Z)V
+PLcom/android/server/job/JobServiceContext;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/job/JobServiceContext;->removeOpTimeOutLocked()V
+PLcom/android/server/job/JobServiceContext;->scheduleOpTimeOutLocked()V
+PLcom/android/server/job/JobServiceContext;->sendStopMessageLocked(Ljava/lang/String;)V
+PLcom/android/server/job/JobServiceContext;->verifyCallerLocked(Lcom/android/server/job/JobServiceContext$JobCallback;)Z
+PLcom/android/server/job/JobStore$JobSet;-><init>()V
+PLcom/android/server/job/JobStore$JobSet;->add(Lcom/android/server/job/controllers/JobStatus;)Z
+PLcom/android/server/job/JobStore$JobSet;->contains(Lcom/android/server/job/controllers/JobStatus;)Z
+PLcom/android/server/job/JobStore$JobSet;->countJobsForUid(I)I
+PLcom/android/server/job/JobStore$JobSet;->forEachJob(ILcom/android/server/job/JobStore$JobStatusFunctor;)V
+PLcom/android/server/job/JobStore$JobSet;->get(II)Lcom/android/server/job/controllers/JobStatus;
+PLcom/android/server/job/JobStore$JobSet;->getJobsByUid(I)Ljava/util/List;
+PLcom/android/server/job/JobStore$JobSet;->remove(Lcom/android/server/job/controllers/JobStatus;)Z
+PLcom/android/server/job/JobStore$JobSet;->removeJobsOfNonUsers([I)V
+PLcom/android/server/job/JobStore$ReadJobMapFromDiskRunnable;-><init>(Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore$JobSet;)V
+PLcom/android/server/job/JobStore$ReadJobMapFromDiskRunnable;->buildBuilderFromXml(Lorg/xmlpull/v1/XmlPullParser;)Landroid/app/job/JobInfo$Builder;
+PLcom/android/server/job/JobStore$ReadJobMapFromDiskRunnable;->buildConstraintsFromXml(Landroid/app/job/JobInfo$Builder;Lorg/xmlpull/v1/XmlPullParser;)V
+PLcom/android/server/job/JobStore$ReadJobMapFromDiskRunnable;->maybeBuildBackoffPolicyFromXml(Landroid/app/job/JobInfo$Builder;Lorg/xmlpull/v1/XmlPullParser;)V
+PLcom/android/server/job/JobStore$ReadJobMapFromDiskRunnable;->readJobMapImpl(Ljava/io/FileInputStream;)Ljava/util/List;
+PLcom/android/server/job/JobStore$ReadJobMapFromDiskRunnable;->run()V
+PLcom/android/server/job/JobStore$WriteJobsMapToDiskRunnable$1;-><init>(Lcom/android/server/job/JobStore$WriteJobsMapToDiskRunnable;Ljava/util/List;)V
+PLcom/android/server/job/JobStore$WriteJobsMapToDiskRunnable;-><init>(Lcom/android/server/job/JobStore;)V
+PLcom/android/server/job/JobStore$WriteJobsMapToDiskRunnable;-><init>(Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore$WriteJobsMapToDiskRunnable;)V
+PLcom/android/server/job/JobStore$WriteJobsMapToDiskRunnable;->run()V
+PLcom/android/server/job/JobStore;->-get0(Lcom/android/server/job/JobStore;)Landroid/util/AtomicFile;
+PLcom/android/server/job/JobStore;->-set0(Lcom/android/server/job/JobStore;I)I
+PLcom/android/server/job/JobStore;-><init>(Landroid/content/Context;Ljava/lang/Object;Ljava/io/File;)V
+PLcom/android/server/job/JobStore;->add(Lcom/android/server/job/controllers/JobStatus;)Z
+PLcom/android/server/job/JobStore;->containsJob(Lcom/android/server/job/controllers/JobStatus;)Z
+PLcom/android/server/job/JobStore;->countJobsForUid(I)I
+PLcom/android/server/job/JobStore;->forEachJob(ILcom/android/server/job/JobStore$JobStatusFunctor;)V
+PLcom/android/server/job/JobStore;->forEachJob(Lcom/android/server/job/JobStore$JobStatusFunctor;)V
+PLcom/android/server/job/JobStore;->getJobByUidAndJobId(II)Lcom/android/server/job/controllers/JobStatus;
+PLcom/android/server/job/JobStore;->getJobsByUid(I)Ljava/util/List;
+PLcom/android/server/job/JobStore;->initAndGet(Lcom/android/server/job/JobSchedulerService;)Lcom/android/server/job/JobStore;
+PLcom/android/server/job/JobStore;->maybeWriteStatusToDiskAsync()V
+PLcom/android/server/job/JobStore;->readJobMapFromDisk(Lcom/android/server/job/JobStore$JobSet;)V
+PLcom/android/server/job/JobStore;->remove(Lcom/android/server/job/controllers/JobStatus;Z)Z
+PLcom/android/server/job/JobStore;->removeJobsOfNonUsers([I)V
+PLcom/android/server/job/controllers/AppIdleController$AppIdleStateChangeListener;-><init>(Lcom/android/server/job/controllers/AppIdleController;)V
+PLcom/android/server/job/controllers/AppIdleController$AppIdleStateChangeListener;-><init>(Lcom/android/server/job/controllers/AppIdleController;Lcom/android/server/job/controllers/AppIdleController$AppIdleStateChangeListener;)V
+PLcom/android/server/job/controllers/AppIdleController$AppIdleStateChangeListener;->onAppIdleStateChanged(Ljava/lang/String;IZ)V
+PLcom/android/server/job/controllers/AppIdleController$AppIdleStateChangeListener;->onParoleStateChanged(Z)V
+PLcom/android/server/job/controllers/AppIdleController$GlobalUpdateFunc;-><init>(Lcom/android/server/job/controllers/AppIdleController;)V
+PLcom/android/server/job/controllers/AppIdleController$GlobalUpdateFunc;->process(Lcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/controllers/AppIdleController$PackageUpdateFunc;-><init>(ILjava/lang/String;Z)V
+PLcom/android/server/job/controllers/AppIdleController;->-get0(Lcom/android/server/job/controllers/AppIdleController;)Lcom/android/server/job/JobSchedulerService;
+PLcom/android/server/job/controllers/AppIdleController;->-get1(Lcom/android/server/job/controllers/AppIdleController;)Landroid/app/usage/UsageStatsManagerInternal;
+PLcom/android/server/job/controllers/AppIdleController;-><init>(Lcom/android/server/job/JobSchedulerService;Landroid/content/Context;Ljava/lang/Object;)V
+PLcom/android/server/job/controllers/AppIdleController;->get(Lcom/android/server/job/JobSchedulerService;)Lcom/android/server/job/controllers/AppIdleController;
+PLcom/android/server/job/controllers/AppIdleController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/controllers/AppIdleController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;Z)V
+PLcom/android/server/job/controllers/AppIdleController;->setAppIdleParoleOn(Z)V
+PLcom/android/server/job/controllers/BatteryController$ChargingTracker;-><init>(Lcom/android/server/job/controllers/BatteryController;)V
+PLcom/android/server/job/controllers/BatteryController$ChargingTracker;->isBatteryNotLow()Z
+PLcom/android/server/job/controllers/BatteryController$ChargingTracker;->isOnStablePower()Z
+PLcom/android/server/job/controllers/BatteryController$ChargingTracker;->startTracking()V
+PLcom/android/server/job/controllers/BatteryController;-><init>(Lcom/android/server/job/StateChangedListener;Landroid/content/Context;Ljava/lang/Object;)V
+PLcom/android/server/job/controllers/BatteryController;->get(Lcom/android/server/job/JobSchedulerService;)Lcom/android/server/job/controllers/BatteryController;
+PLcom/android/server/job/controllers/BatteryController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/controllers/BatteryController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;Z)V
+PLcom/android/server/job/controllers/ConnectivityController$1;-><init>(Lcom/android/server/job/controllers/ConnectivityController;)V
+PLcom/android/server/job/controllers/ConnectivityController$1;->onCapabilitiesChanged(Landroid/net/Network;Landroid/net/NetworkCapabilities;)V
+PLcom/android/server/job/controllers/ConnectivityController$2;-><init>(Lcom/android/server/job/controllers/ConnectivityController;)V
+PLcom/android/server/job/controllers/ConnectivityController$2;->onMeteredIfacesChanged([Ljava/lang/String;)V
+PLcom/android/server/job/controllers/ConnectivityController$2;->onUidRulesChanged(II)V
+PLcom/android/server/job/controllers/ConnectivityController;->-wrap0(Lcom/android/server/job/controllers/ConnectivityController;ILandroid/net/NetworkCapabilities;)V
+PLcom/android/server/job/controllers/ConnectivityController;-><init>(Lcom/android/server/job/StateChangedListener;Landroid/content/Context;Ljava/lang/Object;)V
+PLcom/android/server/job/controllers/ConnectivityController;->get(Lcom/android/server/job/JobSchedulerService;)Lcom/android/server/job/controllers/ConnectivityController;
+PLcom/android/server/job/controllers/ConnectivityController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/controllers/ConnectivityController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;Z)V
+PLcom/android/server/job/controllers/ContentObserverController$JobInstance;-><init>(Lcom/android/server/job/controllers/ContentObserverController;Lcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/controllers/ContentObserverController$JobInstance;->detachLocked()V
+PLcom/android/server/job/controllers/ContentObserverController$JobInstance;->scheduleLocked()V
+PLcom/android/server/job/controllers/ContentObserverController$JobInstance;->trigger()V
+PLcom/android/server/job/controllers/ContentObserverController$JobInstance;->unscheduleLocked()V
+PLcom/android/server/job/controllers/ContentObserverController$ObserverInstance;-><init>(Lcom/android/server/job/controllers/ContentObserverController;Landroid/os/Handler;Landroid/app/job/JobInfo$TriggerContentUri;I)V
+PLcom/android/server/job/controllers/ContentObserverController$ObserverInstance;->onChange(ZLandroid/net/Uri;)V
+PLcom/android/server/job/controllers/ContentObserverController$TriggerRunnable;-><init>(Lcom/android/server/job/controllers/ContentObserverController$JobInstance;)V
+PLcom/android/server/job/controllers/ContentObserverController$TriggerRunnable;->run()V
+PLcom/android/server/job/controllers/ContentObserverController;-><init>(Lcom/android/server/job/StateChangedListener;Landroid/content/Context;Ljava/lang/Object;)V
+PLcom/android/server/job/controllers/ContentObserverController;->get(Lcom/android/server/job/JobSchedulerService;)Lcom/android/server/job/controllers/ContentObserverController;
+PLcom/android/server/job/controllers/ContentObserverController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/controllers/ContentObserverController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;Z)V
+PLcom/android/server/job/controllers/ContentObserverController;->prepareForExecutionLocked(Lcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/controllers/ContentObserverController;->rescheduleForFailureLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/controllers/DeviceIdleJobsController$1;-><init>(Lcom/android/server/job/controllers/DeviceIdleJobsController;)V
+PLcom/android/server/job/controllers/DeviceIdleJobsController$2;-><init>(Lcom/android/server/job/controllers/DeviceIdleJobsController;)V
+PLcom/android/server/job/controllers/DeviceIdleJobsController;-><init>(Lcom/android/server/job/JobSchedulerService;Landroid/content/Context;Ljava/lang/Object;)V
+PLcom/android/server/job/controllers/DeviceIdleJobsController;->get(Lcom/android/server/job/JobSchedulerService;)Lcom/android/server/job/controllers/DeviceIdleJobsController;
+PLcom/android/server/job/controllers/DeviceIdleJobsController;->isWhitelistedLocked(Lcom/android/server/job/controllers/JobStatus;)Z
+PLcom/android/server/job/controllers/DeviceIdleJobsController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/controllers/DeviceIdleJobsController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;Z)V
+PLcom/android/server/job/controllers/DeviceIdleJobsController;->updateTaskStateLocked(Lcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/controllers/IdleController$IdlenessTracker;-><init>(Lcom/android/server/job/controllers/IdleController;)V
+PLcom/android/server/job/controllers/IdleController$IdlenessTracker;->isIdle()Z
+PLcom/android/server/job/controllers/IdleController$IdlenessTracker;->startTracking()V
+PLcom/android/server/job/controllers/IdleController;-><init>(Lcom/android/server/job/StateChangedListener;Landroid/content/Context;Ljava/lang/Object;)V
+PLcom/android/server/job/controllers/IdleController;->get(Lcom/android/server/job/JobSchedulerService;)Lcom/android/server/job/controllers/IdleController;
+PLcom/android/server/job/controllers/IdleController;->initIdleStateTracking()V
+PLcom/android/server/job/controllers/IdleController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/controllers/IdleController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;Z)V
+PLcom/android/server/job/controllers/JobStatus;-><init>(Landroid/app/job/JobInfo;ILjava/lang/String;ILjava/lang/String;JJ)V
+PLcom/android/server/job/controllers/JobStatus;-><init>(Lcom/android/server/job/controllers/JobStatus;JJI)V
+PLcom/android/server/job/controllers/JobStatus;->clearTrackingController(I)Z
+PLcom/android/server/job/controllers/JobStatus;->createFromJobInfo(Landroid/app/job/JobInfo;ILjava/lang/String;ILjava/lang/String;)Lcom/android/server/job/controllers/JobStatus;
+PLcom/android/server/job/controllers/JobStatus;->getBatteryName()Ljava/lang/String;
+PLcom/android/server/job/controllers/JobStatus;->getTag()Ljava/lang/String;
+PLcom/android/server/job/controllers/JobStatus;->getTriggerContentMaxDelay()J
+PLcom/android/server/job/controllers/JobStatus;->getTriggerContentUpdateDelay()J
+PLcom/android/server/job/controllers/JobStatus;->getUserId()I
+PLcom/android/server/job/controllers/JobStatus;->hasConnectivityConstraint()Z
+PLcom/android/server/job/controllers/JobStatus;->hasContentTriggerConstraint()Z
+PLcom/android/server/job/controllers/JobStatus;->hasExecutingWorkLocked()Z
+PLcom/android/server/job/controllers/JobStatus;->hasPowerConstraint()Z
+PLcom/android/server/job/controllers/JobStatus;->hasStorageNotLowConstraint()Z
+PLcom/android/server/job/controllers/JobStatus;->hasWorkLocked()Z
+PLcom/android/server/job/controllers/JobStatus;->isPreparedLocked()Z
+PLcom/android/server/job/controllers/JobStatus;->matches(II)Z
+PLcom/android/server/job/controllers/JobStatus;->prepareLocked(Landroid/app/IActivityManager;)V
+PLcom/android/server/job/controllers/JobStatus;->setAppNotIdleConstraintSatisfied(Z)Z
+PLcom/android/server/job/controllers/JobStatus;->setBatteryNotLowConstraintSatisfied(Z)Z
+PLcom/android/server/job/controllers/JobStatus;->setChargingConstraintSatisfied(Z)Z
+PLcom/android/server/job/controllers/JobStatus;->setConnectivityConstraintSatisfied(Z)Z
+PLcom/android/server/job/controllers/JobStatus;->setContentTriggerConstraintSatisfied(Z)Z
+PLcom/android/server/job/controllers/JobStatus;->setDeadlineConstraintSatisfied(Z)Z
+PLcom/android/server/job/controllers/JobStatus;->setDeviceNotDozingConstraintSatisfied(ZZ)Z
+PLcom/android/server/job/controllers/JobStatus;->setIdleConstraintSatisfied(Z)Z
+PLcom/android/server/job/controllers/JobStatus;->setMeteredConstraintSatisfied(Z)Z
+PLcom/android/server/job/controllers/JobStatus;->setNotRoamingConstraintSatisfied(Z)Z
+PLcom/android/server/job/controllers/JobStatus;->setTimingDelayConstraintSatisfied(Z)Z
+PLcom/android/server/job/controllers/JobStatus;->setTrackingController(I)V
+PLcom/android/server/job/controllers/JobStatus;->setUnmeteredConstraintSatisfied(Z)Z
+PLcom/android/server/job/controllers/JobStatus;->stopTrackingJobLocked(Landroid/app/IActivityManager;Lcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/controllers/JobStatus;->ungrantWorkList(Landroid/app/IActivityManager;Ljava/util/ArrayList;)V
+PLcom/android/server/job/controllers/JobStatus;->unprepareLocked(Landroid/app/IActivityManager;)V
+PLcom/android/server/job/controllers/StateController;-><init>(Lcom/android/server/job/StateChangedListener;Landroid/content/Context;Ljava/lang/Object;)V
+PLcom/android/server/job/controllers/StateController;->prepareForExecutionLocked(Lcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/controllers/StateController;->rescheduleForFailureLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/controllers/StorageController$StorageTracker;-><init>(Lcom/android/server/job/controllers/StorageController;)V
+PLcom/android/server/job/controllers/StorageController$StorageTracker;->startTracking()V
+PLcom/android/server/job/controllers/StorageController;-><init>(Lcom/android/server/job/StateChangedListener;Landroid/content/Context;Ljava/lang/Object;)V
+PLcom/android/server/job/controllers/StorageController;->get(Lcom/android/server/job/JobSchedulerService;)Lcom/android/server/job/controllers/StorageController;
+PLcom/android/server/job/controllers/StorageController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/controllers/StorageController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;Z)V
+PLcom/android/server/job/controllers/TimeController$1;-><init>(Lcom/android/server/job/controllers/TimeController;)V
+PLcom/android/server/job/controllers/TimeController$2;-><init>(Lcom/android/server/job/controllers/TimeController;)V
+PLcom/android/server/job/controllers/TimeController$2;->onAlarm()V
+PLcom/android/server/job/controllers/TimeController;->-wrap1(Lcom/android/server/job/controllers/TimeController;)V
+PLcom/android/server/job/controllers/TimeController;-><init>(Lcom/android/server/job/StateChangedListener;Landroid/content/Context;Ljava/lang/Object;)V
+PLcom/android/server/job/controllers/TimeController;->canStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;)Z
+PLcom/android/server/job/controllers/TimeController;->checkExpiredDeadlinesAndResetAlarm()V
+PLcom/android/server/job/controllers/TimeController;->ensureAlarmServiceLocked()V
+PLcom/android/server/job/controllers/TimeController;->evaluateDeadlineConstraint(Lcom/android/server/job/controllers/JobStatus;J)Z
+PLcom/android/server/job/controllers/TimeController;->get(Lcom/android/server/job/JobSchedulerService;)Lcom/android/server/job/controllers/TimeController;
+PLcom/android/server/job/controllers/TimeController;->maybeAdjustAlarmTime(J)J
+PLcom/android/server/job/controllers/TimeController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;Z)V
+PLcom/android/server/job/controllers/TimeController;->maybeUpdateAlarmsLocked(JJI)V
+PLcom/android/server/job/controllers/TimeController;->setDeadlineExpiredAlarmLocked(JI)V
+PLcom/android/server/job/controllers/TimeController;->setDelayExpiredAlarmLocked(JI)V
+PLcom/android/server/job/controllers/TimeController;->updateAlarmWithListenerLocked(Ljava/lang/String;Landroid/app/AlarmManager$OnAlarmListener;JI)V
+PLcom/android/server/lights/LightsService$LightImpl;->setColor(I)V
+PLcom/android/server/lights/LightsService$LightImpl;->turnOff()V
+PLcom/android/server/location/-$Lambda$LbPzwzo3JyvLa845qcqGRfVQJq4;->$m$0(I)Z
+PLcom/android/server/location/-$Lambda$LbPzwzo3JyvLa845qcqGRfVQJq4;->$m$1(I)Z
+PLcom/android/server/location/-$Lambda$LbPzwzo3JyvLa845qcqGRfVQJq4;->$m$2(I)Z
+PLcom/android/server/location/-$Lambda$LbPzwzo3JyvLa845qcqGRfVQJq4;->$m$3(I)Z
+PLcom/android/server/location/-$Lambda$LbPzwzo3JyvLa845qcqGRfVQJq4;->$m$4(I)Z
+PLcom/android/server/location/-$Lambda$LbPzwzo3JyvLa845qcqGRfVQJq4;-><init>(B)V
+PLcom/android/server/location/-$Lambda$LbPzwzo3JyvLa845qcqGRfVQJq4;->set(I)Z
+PLcom/android/server/location/ActivityRecognitionProxy$1;-><init>(Lcom/android/server/location/ActivityRecognitionProxy;)V
+PLcom/android/server/location/ActivityRecognitionProxy$1;->run()V
+PLcom/android/server/location/ActivityRecognitionProxy;->-wrap0(Lcom/android/server/location/ActivityRecognitionProxy;)V
+PLcom/android/server/location/ActivityRecognitionProxy;-><init>(Landroid/content/Context;Landroid/os/Handler;ZLandroid/hardware/location/ActivityRecognitionHardware;III)V
+PLcom/android/server/location/ActivityRecognitionProxy;->bindProvider()V
+PLcom/android/server/location/ActivityRecognitionProxy;->createAndBind(Landroid/content/Context;Landroid/os/Handler;ZLandroid/hardware/location/ActivityRecognitionHardware;III)Lcom/android/server/location/ActivityRecognitionProxy;
+PLcom/android/server/location/ComprehensiveCountryDetector$1;-><init>(Lcom/android/server/location/ComprehensiveCountryDetector;)V
+PLcom/android/server/location/ComprehensiveCountryDetector$2;-><init>(Lcom/android/server/location/ComprehensiveCountryDetector;Landroid/location/Country;Landroid/location/Country;ZZ)V
+PLcom/android/server/location/ComprehensiveCountryDetector$2;->run()V
+PLcom/android/server/location/ComprehensiveCountryDetector$3;-><init>(Lcom/android/server/location/ComprehensiveCountryDetector;)V
+PLcom/android/server/location/ComprehensiveCountryDetector$4;-><init>(Lcom/android/server/location/ComprehensiveCountryDetector;)V
+PLcom/android/server/location/ComprehensiveCountryDetector;-><init>(Landroid/content/Context;)V
+PLcom/android/server/location/ComprehensiveCountryDetector;->addPhoneStateListener()V
+PLcom/android/server/location/ComprehensiveCountryDetector;->addToLogs(Landroid/location/Country;)V
+PLcom/android/server/location/ComprehensiveCountryDetector;->createLocationBasedCountryDetector()Lcom/android/server/location/CountryDetectorBase;
+PLcom/android/server/location/ComprehensiveCountryDetector;->detectCountry()Landroid/location/Country;
+PLcom/android/server/location/ComprehensiveCountryDetector;->detectCountry(ZZ)Landroid/location/Country;
+PLcom/android/server/location/ComprehensiveCountryDetector;->getCountry()Landroid/location/Country;
+PLcom/android/server/location/ComprehensiveCountryDetector;->getLastKnownLocationBasedCountry()Landroid/location/Country;
+PLcom/android/server/location/ComprehensiveCountryDetector;->getLocaleCountry()Landroid/location/Country;
+PLcom/android/server/location/ComprehensiveCountryDetector;->getNetworkBasedCountry()Landroid/location/Country;
+PLcom/android/server/location/ComprehensiveCountryDetector;->getSimBasedCountry()Landroid/location/Country;
+PLcom/android/server/location/ComprehensiveCountryDetector;->isAirplaneModeOff()Z
+PLcom/android/server/location/ComprehensiveCountryDetector;->isGeoCoderImplemented()Z
+PLcom/android/server/location/ComprehensiveCountryDetector;->isNetworkCountryCodeAvailable()Z
+PLcom/android/server/location/ComprehensiveCountryDetector;->runAfterDetection(Landroid/location/Country;Landroid/location/Country;ZZ)V
+PLcom/android/server/location/ComprehensiveCountryDetector;->runAfterDetectionAsync(Landroid/location/Country;Landroid/location/Country;ZZ)V
+PLcom/android/server/location/ComprehensiveCountryDetector;->scheduleLocationRefresh()V
+PLcom/android/server/location/ComprehensiveCountryDetector;->setCountryListener(Landroid/location/CountryListener;)V
+PLcom/android/server/location/ComprehensiveCountryDetector;->startLocationBasedDetector(Landroid/location/CountryListener;)V
+PLcom/android/server/location/ContextHubService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/location/ContextHubService;->addAppInstance(IIJI)I
+PLcom/android/server/location/ContextHubService;->checkPermissions()V
+PLcom/android/server/location/ContextHubService;->findNanoAppOnHub(ILandroid/hardware/location/NanoAppFilter;)[I
+PLcom/android/server/location/ContextHubService;->getContextHubHandles()[I
+PLcom/android/server/location/ContextHubService;->getContextHubInfo(I)Landroid/hardware/location/ContextHubInfo;
+PLcom/android/server/location/ContextHubService;->onMessageReceipt([I[B)I
+PLcom/android/server/location/ContextHubService;->registerCallback(Landroid/hardware/location/IContextHubCallback;)I
+PLcom/android/server/location/ContextHubService;->sendMessage(IILandroid/hardware/location/ContextHubMessage;)I
+PLcom/android/server/location/CountryDetectorBase;-><init>(Landroid/content/Context;)V
+PLcom/android/server/location/CountryDetectorBase;->setCountryListener(Landroid/location/CountryListener;)V
+PLcom/android/server/location/FlpHardwareProvider;->isSupported()Z
+PLcom/android/server/location/GeocoderProxy;-><init>(Landroid/content/Context;IIILandroid/os/Handler;)V
+PLcom/android/server/location/GeocoderProxy;->bind()Z
+PLcom/android/server/location/GeocoderProxy;->createAndBind(Landroid/content/Context;IIILandroid/os/Handler;)Lcom/android/server/location/GeocoderProxy;
+PLcom/android/server/location/GeofenceManager$1;-><init>(Lcom/android/server/location/GeofenceManager;Landroid/os/Handler;)V
+PLcom/android/server/location/GeofenceManager$GeofenceHandler;-><init>(Lcom/android/server/location/GeofenceManager;)V
+PLcom/android/server/location/GeofenceManager;-><init>(Landroid/content/Context;Lcom/android/server/location/LocationBlacklist;)V
+PLcom/android/server/location/GeofenceManager;->updateMinInterval()V
+PLcom/android/server/location/GeofenceProxy$1;-><init>(Lcom/android/server/location/GeofenceProxy;)V
+PLcom/android/server/location/GeofenceProxy$1;->run()V
+PLcom/android/server/location/GeofenceProxy$2;-><init>(Lcom/android/server/location/GeofenceProxy;)V
+PLcom/android/server/location/GeofenceProxy$2;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/location/GeofenceProxy$3;-><init>(Lcom/android/server/location/GeofenceProxy;)V
+PLcom/android/server/location/GeofenceProxy$3;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/location/GeofenceProxy;->-get0(Lcom/android/server/location/GeofenceProxy;)Landroid/hardware/location/IGeofenceHardware;
+PLcom/android/server/location/GeofenceProxy;->-get1(Lcom/android/server/location/GeofenceProxy;)Landroid/os/Handler;
+PLcom/android/server/location/GeofenceProxy;->-get2(Lcom/android/server/location/GeofenceProxy;)Ljava/lang/Object;
+PLcom/android/server/location/GeofenceProxy;->-set0(Lcom/android/server/location/GeofenceProxy;Landroid/hardware/location/IGeofenceHardware;)Landroid/hardware/location/IGeofenceHardware;
+PLcom/android/server/location/GeofenceProxy;->-wrap0(Lcom/android/server/location/GeofenceProxy;)V
+PLcom/android/server/location/GeofenceProxy;->-wrap1(Lcom/android/server/location/GeofenceProxy;)V
+PLcom/android/server/location/GeofenceProxy;->-wrap2(Lcom/android/server/location/GeofenceProxy;)V
+PLcom/android/server/location/GeofenceProxy;-><init>(Landroid/content/Context;IIILandroid/os/Handler;Landroid/location/IGpsGeofenceHardware;Landroid/location/IFusedGeofenceHardware;)V
+PLcom/android/server/location/GeofenceProxy;->bindGeofenceProvider()Z
+PLcom/android/server/location/GeofenceProxy;->bindHardwareGeofence()V
+PLcom/android/server/location/GeofenceProxy;->createAndBind(Landroid/content/Context;IIILandroid/os/Handler;Landroid/location/IGpsGeofenceHardware;Landroid/location/IFusedGeofenceHardware;)Lcom/android/server/location/GeofenceProxy;
+PLcom/android/server/location/GeofenceProxy;->setFusedGeofenceLocked()V
+PLcom/android/server/location/GeofenceProxy;->setGeofenceHardwareInProviderLocked()V
+PLcom/android/server/location/GeofenceProxy;->setGpsGeofenceLocked()V
+PLcom/android/server/location/GnssLocationProvider$10;-><init>(Lcom/android/server/location/GnssLocationProvider;Landroid/os/Handler;)V
+PLcom/android/server/location/GnssLocationProvider$10;->isAvailableInPlatform()Z
+PLcom/android/server/location/GnssLocationProvider$10;->isGpsEnabled()Z
+PLcom/android/server/location/GnssLocationProvider$11;-><init>(Lcom/android/server/location/GnssLocationProvider;Landroid/os/Handler;)V
+PLcom/android/server/location/GnssLocationProvider$11;->isAvailableInPlatform()Z
+PLcom/android/server/location/GnssLocationProvider$11;->isGpsEnabled()Z
+PLcom/android/server/location/GnssLocationProvider$12;-><init>(Lcom/android/server/location/GnssLocationProvider;)V
+PLcom/android/server/location/GnssLocationProvider$12;->run()V
+PLcom/android/server/location/GnssLocationProvider$14;-><init>(Lcom/android/server/location/GnssLocationProvider;)V
+PLcom/android/server/location/GnssLocationProvider$15;-><init>(Lcom/android/server/location/GnssLocationProvider;)V
+PLcom/android/server/location/GnssLocationProvider$16;-><init>(Lcom/android/server/location/GnssLocationProvider;)V
+PLcom/android/server/location/GnssLocationProvider$1;-><init>(Lcom/android/server/location/GnssLocationProvider;)V
+PLcom/android/server/location/GnssLocationProvider$1;->registerGnssStatusCallback(Landroid/location/IGnssStatusListener;)V
+PLcom/android/server/location/GnssLocationProvider$1;->unregisterGnssStatusCallback(Landroid/location/IGnssStatusListener;)V
+PLcom/android/server/location/GnssLocationProvider$2;-><init>(Lcom/android/server/location/GnssLocationProvider;)V
+PLcom/android/server/location/GnssLocationProvider$2;->onAvailable(Landroid/net/Network;)V
+PLcom/android/server/location/GnssLocationProvider$3;-><init>(Lcom/android/server/location/GnssLocationProvider;)V
+PLcom/android/server/location/GnssLocationProvider$4;-><init>(Lcom/android/server/location/GnssLocationProvider;)V
+PLcom/android/server/location/GnssLocationProvider$4;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/location/GnssLocationProvider$5;-><init>(Lcom/android/server/location/GnssLocationProvider;)V
+PLcom/android/server/location/GnssLocationProvider$5;->onSubscriptionsChanged()V
+PLcom/android/server/location/GnssLocationProvider$6;-><init>(Lcom/android/server/location/GnssLocationProvider;)V
+PLcom/android/server/location/GnssLocationProvider$6;->isHardwareGeofenceSupported()Z
+PLcom/android/server/location/GnssLocationProvider$7;-><init>(Lcom/android/server/location/GnssLocationProvider;)V
+PLcom/android/server/location/GnssLocationProvider$8;-><init>(Lcom/android/server/location/GnssLocationProvider;)V
+PLcom/android/server/location/GnssLocationProvider$8;->lambda$-com_android_server_location_GnssLocationProvider$8_24960(I)Z
+PLcom/android/server/location/GnssLocationProvider$8;->lambda$-com_android_server_location_GnssLocationProvider$8_25037(I)Z
+PLcom/android/server/location/GnssLocationProvider$8;->lambda$-com_android_server_location_GnssLocationProvider$8_25109(I)Z
+PLcom/android/server/location/GnssLocationProvider$8;->lambda$-com_android_server_location_GnssLocationProvider$8_25183(I)Z
+PLcom/android/server/location/GnssLocationProvider$8;->lambda$-com_android_server_location_GnssLocationProvider$8_25279(I)Z
+PLcom/android/server/location/GnssLocationProvider$9;-><init>(Lcom/android/server/location/GnssLocationProvider;Landroid/os/Handler;)V
+PLcom/android/server/location/GnssLocationProvider$9;->isAvailableInPlatform()Z
+PLcom/android/server/location/GnssLocationProvider$9;->isGpsEnabled()Z
+PLcom/android/server/location/GnssLocationProvider$BackOff;-><init>(JJ)V
+PLcom/android/server/location/GnssLocationProvider$BackOff;->reset()V
+PLcom/android/server/location/GnssLocationProvider$GpsRequest;-><init>(Lcom/android/internal/location/ProviderRequest;Landroid/os/WorkSource;)V
+PLcom/android/server/location/GnssLocationProvider$NetworkLocationListener;-><init>(Lcom/android/server/location/GnssLocationProvider;)V
+PLcom/android/server/location/GnssLocationProvider$NetworkLocationListener;-><init>(Lcom/android/server/location/GnssLocationProvider;Lcom/android/server/location/GnssLocationProvider$NetworkLocationListener;)V
+PLcom/android/server/location/GnssLocationProvider$ProviderHandler;-><init>(Lcom/android/server/location/GnssLocationProvider;Landroid/os/Looper;)V
+PLcom/android/server/location/GnssLocationProvider$ProviderHandler;->handleInitialize()V
+PLcom/android/server/location/GnssLocationProvider$ProviderHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/location/GnssLocationProvider;->-get0()Z
+PLcom/android/server/location/GnssLocationProvider;->-get1(Lcom/android/server/location/GnssLocationProvider;)Landroid/content/BroadcastReceiver;
+PLcom/android/server/location/GnssLocationProvider;->-get11(Lcom/android/server/location/GnssLocationProvider;)Landroid/net/ConnectivityManager$NetworkCallback;
+PLcom/android/server/location/GnssLocationProvider;->-get12(Lcom/android/server/location/GnssLocationProvider;)Lcom/android/server/location/GnssLocationProvider$BackOff;
+PLcom/android/server/location/GnssLocationProvider;->-get13(Lcom/android/server/location/GnssLocationProvider;)Landroid/util/NtpTrustedTime;
+PLcom/android/server/location/GnssLocationProvider;->-get14(Lcom/android/server/location/GnssLocationProvider;)Z
+PLcom/android/server/location/GnssLocationProvider;->-get15(Lcom/android/server/location/GnssLocationProvider;)Landroid/telephony/SubscriptionManager$OnSubscriptionsChangedListener;
+PLcom/android/server/location/GnssLocationProvider;->-get16(Lcom/android/server/location/GnssLocationProvider;)Ljava/util/Properties;
+PLcom/android/server/location/GnssLocationProvider;->-get17(Lcom/android/server/location/GnssLocationProvider;)Landroid/os/PowerManager$WakeLock;
+PLcom/android/server/location/GnssLocationProvider;->-get2(Lcom/android/server/location/GnssLocationProvider;)Landroid/net/ConnectivityManager;
+PLcom/android/server/location/GnssLocationProvider;->-get3(Lcom/android/server/location/GnssLocationProvider;)Landroid/content/Context;
+PLcom/android/server/location/GnssLocationProvider;->-get4(Lcom/android/server/location/GnssLocationProvider;)I
+PLcom/android/server/location/GnssLocationProvider;->-get7(Lcom/android/server/location/GnssLocationProvider;)Landroid/os/Handler;
+PLcom/android/server/location/GnssLocationProvider;->-get8(Lcom/android/server/location/GnssLocationProvider;)I
+PLcom/android/server/location/GnssLocationProvider;->-get9(Lcom/android/server/location/GnssLocationProvider;)Lcom/android/server/location/GnssStatusListenerHelper;
+PLcom/android/server/location/GnssLocationProvider;->-set1(Lcom/android/server/location/GnssLocationProvider;I)I
+PLcom/android/server/location/GnssLocationProvider;->-wrap1()Z
+PLcom/android/server/location/GnssLocationProvider;->-wrap11(I)Z
+PLcom/android/server/location/GnssLocationProvider;->-wrap12(I)Z
+PLcom/android/server/location/GnssLocationProvider;->-wrap13(I)Z
+PLcom/android/server/location/GnssLocationProvider;->-wrap14(I)Z
+PLcom/android/server/location/GnssLocationProvider;->-wrap2()Z
+PLcom/android/server/location/GnssLocationProvider;->-wrap22(Lcom/android/server/location/GnssLocationProvider;I)Ljava/lang/String;
+PLcom/android/server/location/GnssLocationProvider;->-wrap24(Lcom/android/server/location/GnssLocationProvider;)V
+PLcom/android/server/location/GnssLocationProvider;->-wrap25(Lcom/android/server/location/GnssLocationProvider;)V
+PLcom/android/server/location/GnssLocationProvider;->-wrap26(Lcom/android/server/location/GnssLocationProvider;)V
+PLcom/android/server/location/GnssLocationProvider;->-wrap29(Lcom/android/server/location/GnssLocationProvider;Lcom/android/internal/location/ProviderRequest;Landroid/os/WorkSource;)V
+PLcom/android/server/location/GnssLocationProvider;->-wrap3()Z
+PLcom/android/server/location/GnssLocationProvider;->-wrap31(Lcom/android/server/location/GnssLocationProvider;Landroid/net/Network;)V
+PLcom/android/server/location/GnssLocationProvider;->-wrap34(Lcom/android/server/location/GnssLocationProvider;JJI)V
+PLcom/android/server/location/GnssLocationProvider;->-wrap38(Lcom/android/server/location/GnssLocationProvider;Landroid/content/Context;Ljava/util/Properties;)V
+PLcom/android/server/location/GnssLocationProvider;->-wrap39(Lcom/android/server/location/GnssLocationProvider;)V
+PLcom/android/server/location/GnssLocationProvider;->-wrap4()Z
+PLcom/android/server/location/GnssLocationProvider;->-wrap40(Lcom/android/server/location/GnssLocationProvider;IILjava/lang/Object;)V
+PLcom/android/server/location/GnssLocationProvider;->-wrap42(Lcom/android/server/location/GnssLocationProvider;Landroid/content/Context;)V
+PLcom/android/server/location/GnssLocationProvider;->-wrap44(Lcom/android/server/location/GnssLocationProvider;)V
+PLcom/android/server/location/GnssLocationProvider;->-wrap9(I)Z
+PLcom/android/server/location/GnssLocationProvider;-><init>(Landroid/content/Context;Landroid/location/ILocationManager;Landroid/os/Looper;)V
+PLcom/android/server/location/GnssLocationProvider;->enable()V
+PLcom/android/server/location/GnssLocationProvider;->enableBatching()V
+PLcom/android/server/location/GnssLocationProvider;->getGnssBatchingProvider()Lcom/android/server/location/GnssLocationProvider$GnssBatchingProvider;
+PLcom/android/server/location/GnssLocationProvider;->getGnssMeasurementsProvider()Lcom/android/server/location/GnssMeasurementsProvider;
+PLcom/android/server/location/GnssLocationProvider;->getGnssMetricsProvider()Lcom/android/server/location/GnssLocationProvider$GnssMetricsProvider;
+PLcom/android/server/location/GnssLocationProvider;->getGnssNavigationMessageProvider()Lcom/android/server/location/GnssNavigationMessageProvider;
+PLcom/android/server/location/GnssLocationProvider;->getGnssStatusProvider()Landroid/location/IGnssStatusProvider;
+PLcom/android/server/location/GnssLocationProvider;->getGnssSystemInfoProvider()Lcom/android/server/location/GnssLocationProvider$GnssSystemInfoProvider;
+PLcom/android/server/location/GnssLocationProvider;->getGpsGeofenceProxy()Landroid/location/IGpsGeofenceHardware;
+PLcom/android/server/location/GnssLocationProvider;->getName()Ljava/lang/String;
+PLcom/android/server/location/GnssLocationProvider;->getNetInitiatedListener()Landroid/location/INetInitiatedListener;
+PLcom/android/server/location/GnssLocationProvider;->getProperties()Lcom/android/internal/location/ProviderProperties;
+PLcom/android/server/location/GnssLocationProvider;->getSelectedApn()Ljava/lang/String;
+PLcom/android/server/location/GnssLocationProvider;->getSuplMode(Ljava/util/Properties;ZZ)I
+PLcom/android/server/location/GnssLocationProvider;->handleDownloadXtraData()V
+PLcom/android/server/location/GnssLocationProvider;->handleEnable()V
+PLcom/android/server/location/GnssLocationProvider;->handleInjectNtpTime()V
+PLcom/android/server/location/GnssLocationProvider;->handleSetRequest(Lcom/android/internal/location/ProviderRequest;Landroid/os/WorkSource;)V
+PLcom/android/server/location/GnssLocationProvider;->handleUpdateNetworkState(Landroid/net/Network;)V
+PLcom/android/server/location/GnssLocationProvider;->hasCapability(I)Z
+PLcom/android/server/location/GnssLocationProvider;->isDataNetworkConnected()Z
+PLcom/android/server/location/GnssLocationProvider;->isEnabled()Z
+PLcom/android/server/location/GnssLocationProvider;->isSupported()Z
+PLcom/android/server/location/GnssLocationProvider;->loadPropertiesFromFile(Ljava/lang/String;Ljava/util/Properties;)Z
+PLcom/android/server/location/GnssLocationProvider;->loadPropertiesFromResource(Landroid/content/Context;Ljava/util/Properties;)V
+PLcom/android/server/location/GnssLocationProvider;->messageIdAsString(I)Ljava/lang/String;
+PLcom/android/server/location/GnssLocationProvider;->reloadGpsProperties(Landroid/content/Context;Ljava/util/Properties;)V
+PLcom/android/server/location/GnssLocationProvider;->reportNmea(J)V
+PLcom/android/server/location/GnssLocationProvider;->reportStatus(I)V
+PLcom/android/server/location/GnssLocationProvider;->reportSvStatus()V
+PLcom/android/server/location/GnssLocationProvider;->requestUtcTime()V
+PLcom/android/server/location/GnssLocationProvider;->sendMessage(IILjava/lang/Object;)V
+PLcom/android/server/location/GnssLocationProvider;->setEngineCapabilities(I)V
+PLcom/android/server/location/GnssLocationProvider;->setGnssYearOfHardware(I)V
+PLcom/android/server/location/GnssLocationProvider;->setRequest(Lcom/android/internal/location/ProviderRequest;Landroid/os/WorkSource;)V
+PLcom/android/server/location/GnssLocationProvider;->setSuplHostPort(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/location/GnssLocationProvider;->startNavigating(Z)V
+PLcom/android/server/location/GnssLocationProvider;->stopNavigating()V
+PLcom/android/server/location/GnssLocationProvider;->subscriptionOrSimChanged(Landroid/content/Context;)V
+PLcom/android/server/location/GnssLocationProvider;->updateClientUids(Landroid/os/WorkSource;)V
+PLcom/android/server/location/GnssLocationProvider;->updateRequirements()V
+PLcom/android/server/location/GnssLocationProvider;->updateStatus(IIII)V
+PLcom/android/server/location/GnssLocationProvider;->xtraDownloadRequest()V
+PLcom/android/server/location/GnssMeasurementsProvider;-><init>(Landroid/os/Handler;)V
+PLcom/android/server/location/GnssMeasurementsProvider;->onCapabilitiesUpdated(Z)V
+PLcom/android/server/location/GnssMeasurementsProvider;->onGpsEnabledChanged()V
+PLcom/android/server/location/GnssNavigationMessageProvider$StatusChangedOperation;-><init>(I)V
+PLcom/android/server/location/GnssNavigationMessageProvider;-><init>(Landroid/os/Handler;)V
+PLcom/android/server/location/GnssNavigationMessageProvider;->getHandlerOperation(I)Lcom/android/server/location/RemoteListenerHelper$ListenerOperation;
+PLcom/android/server/location/GnssNavigationMessageProvider;->onCapabilitiesUpdated(Z)V
+PLcom/android/server/location/GnssNavigationMessageProvider;->onGpsEnabledChanged()V
+PLcom/android/server/location/GnssStatusListenerHelper$1;-><init>(Lcom/android/server/location/GnssStatusListenerHelper;)V
+PLcom/android/server/location/GnssStatusListenerHelper$1;->execute(Landroid/location/IGnssStatusListener;)V
+PLcom/android/server/location/GnssStatusListenerHelper$1;->execute(Landroid/os/IInterface;)V
+PLcom/android/server/location/GnssStatusListenerHelper$2;-><init>(Lcom/android/server/location/GnssStatusListenerHelper;)V
+PLcom/android/server/location/GnssStatusListenerHelper$2;->execute(Landroid/location/IGnssStatusListener;)V
+PLcom/android/server/location/GnssStatusListenerHelper$2;->execute(Landroid/os/IInterface;)V
+PLcom/android/server/location/GnssStatusListenerHelper$4;-><init>(Lcom/android/server/location/GnssStatusListenerHelper;I[I[F[F[F[F)V
+PLcom/android/server/location/GnssStatusListenerHelper$4;->execute(Landroid/location/IGnssStatusListener;)V
+PLcom/android/server/location/GnssStatusListenerHelper$4;->execute(Landroid/os/IInterface;)V
+PLcom/android/server/location/GnssStatusListenerHelper$5;-><init>(Lcom/android/server/location/GnssStatusListenerHelper;JLjava/lang/String;)V
+PLcom/android/server/location/GnssStatusListenerHelper$5;->execute(Landroid/location/IGnssStatusListener;)V
+PLcom/android/server/location/GnssStatusListenerHelper$5;->execute(Landroid/os/IInterface;)V
+PLcom/android/server/location/GnssStatusListenerHelper;-><init>(Landroid/os/Handler;)V
+PLcom/android/server/location/GnssStatusListenerHelper;->getHandlerOperation(I)Lcom/android/server/location/RemoteListenerHelper$ListenerOperation;
+PLcom/android/server/location/GnssStatusListenerHelper;->onNmeaReceived(JLjava/lang/String;)V
+PLcom/android/server/location/GnssStatusListenerHelper;->onStatusChanged(Z)V
+PLcom/android/server/location/GnssStatusListenerHelper;->onSvStatusChanged(I[I[F[F[F[F)V
+PLcom/android/server/location/GnssStatusListenerHelper;->registerWithService()Z
+PLcom/android/server/location/LocationBasedCountryDetector$1;-><init>(Lcom/android/server/location/LocationBasedCountryDetector;)V
+PLcom/android/server/location/LocationBasedCountryDetector$2;-><init>(Lcom/android/server/location/LocationBasedCountryDetector;)V
+PLcom/android/server/location/LocationBasedCountryDetector;-><init>(Landroid/content/Context;)V
+PLcom/android/server/location/LocationBasedCountryDetector;->detectCountry()Landroid/location/Country;
+PLcom/android/server/location/LocationBasedCountryDetector;->getEnabledProviders()Ljava/util/List;
+PLcom/android/server/location/LocationBasedCountryDetector;->getQueryLocationTimeout()J
+PLcom/android/server/location/LocationBasedCountryDetector;->isAcceptableProvider(Ljava/lang/String;)Z
+PLcom/android/server/location/LocationBasedCountryDetector;->registerListener(Ljava/lang/String;Landroid/location/LocationListener;)V
+PLcom/android/server/location/LocationBlacklist;-><init>(Landroid/content/Context;Landroid/os/Handler;)V
+PLcom/android/server/location/LocationBlacklist;->getStringArrayLocked(Ljava/lang/String;)[Ljava/lang/String;
+PLcom/android/server/location/LocationBlacklist;->inWhitelist(Ljava/lang/String;)Z
+PLcom/android/server/location/LocationBlacklist;->init()V
+PLcom/android/server/location/LocationBlacklist;->isBlacklisted(Ljava/lang/String;)Z
+PLcom/android/server/location/LocationBlacklist;->reloadBlacklist()V
+PLcom/android/server/location/LocationBlacklist;->reloadBlacklistLocked()V
+PLcom/android/server/location/LocationFudger$1;-><init>(Lcom/android/server/location/LocationFudger;Landroid/os/Handler;)V
+PLcom/android/server/location/LocationFudger;-><init>(Landroid/content/Context;Landroid/os/Handler;)V
+PLcom/android/server/location/LocationFudger;->loadCoarseAccuracy()F
+PLcom/android/server/location/LocationFudger;->nextOffsetLocked()D
+PLcom/android/server/location/LocationFudger;->setAccuracyInMetersLocked(F)V
+PLcom/android/server/location/LocationProviderProxy$1;-><init>(Lcom/android/server/location/LocationProviderProxy;)V
+PLcom/android/server/location/LocationProviderProxy$1;->run()V
+PLcom/android/server/location/LocationProviderProxy;->-get0()Z
+PLcom/android/server/location/LocationProviderProxy;->-get1(Lcom/android/server/location/LocationProviderProxy;)Z
+PLcom/android/server/location/LocationProviderProxy;->-get2(Lcom/android/server/location/LocationProviderProxy;)Ljava/lang/Object;
+PLcom/android/server/location/LocationProviderProxy;->-get3(Lcom/android/server/location/LocationProviderProxy;)Lcom/android/internal/location/ProviderRequest;
+PLcom/android/server/location/LocationProviderProxy;->-get5(Lcom/android/server/location/LocationProviderProxy;)Landroid/os/WorkSource;
+PLcom/android/server/location/LocationProviderProxy;->-set0(Lcom/android/server/location/LocationProviderProxy;Lcom/android/internal/location/ProviderProperties;)Lcom/android/internal/location/ProviderProperties;
+PLcom/android/server/location/LocationProviderProxy;->-wrap0(Lcom/android/server/location/LocationProviderProxy;)Lcom/android/internal/location/ILocationProvider;
+PLcom/android/server/location/LocationProviderProxy;-><init>(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;IIILandroid/os/Handler;)V
+PLcom/android/server/location/LocationProviderProxy;->bind()Z
+PLcom/android/server/location/LocationProviderProxy;->createAndBind(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;IIILandroid/os/Handler;)Lcom/android/server/location/LocationProviderProxy;
+PLcom/android/server/location/LocationProviderProxy;->enable()V
+PLcom/android/server/location/LocationProviderProxy;->getName()Ljava/lang/String;
+PLcom/android/server/location/LocationProviderProxy;->getService()Lcom/android/internal/location/ILocationProvider;
+PLcom/android/server/location/LocationProviderProxy;->isEnabled()Z
+PLcom/android/server/location/LocationRequestStatistics$PackageProviderKey;-><init>(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/location/LocationRequestStatistics$PackageProviderKey;->equals(Ljava/lang/Object;)Z
+PLcom/android/server/location/LocationRequestStatistics$PackageProviderKey;->hashCode()I
+PLcom/android/server/location/LocationRequestStatistics$PackageStatistics;->-wrap0(Lcom/android/server/location/LocationRequestStatistics$PackageStatistics;J)V
+PLcom/android/server/location/LocationRequestStatistics$PackageStatistics;->-wrap1(Lcom/android/server/location/LocationRequestStatistics$PackageStatistics;)V
+PLcom/android/server/location/LocationRequestStatistics$PackageStatistics;-><init>()V
+PLcom/android/server/location/LocationRequestStatistics$PackageStatistics;-><init>(Lcom/android/server/location/LocationRequestStatistics$PackageStatistics;)V
+PLcom/android/server/location/LocationRequestStatistics$PackageStatistics;->startRequesting(J)V
+PLcom/android/server/location/LocationRequestStatistics$PackageStatistics;->stopRequesting()V
+PLcom/android/server/location/LocationRequestStatistics;-><init>()V
+PLcom/android/server/location/LocationRequestStatistics;->startRequesting(Ljava/lang/String;Ljava/lang/String;J)V
+PLcom/android/server/location/LocationRequestStatistics;->stopRequesting(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/location/PassiveProvider;-><init>(Landroid/location/ILocationManager;)V
+PLcom/android/server/location/PassiveProvider;->getName()Ljava/lang/String;
+PLcom/android/server/location/PassiveProvider;->getProperties()Lcom/android/internal/location/ProviderProperties;
+PLcom/android/server/location/PassiveProvider;->isEnabled()Z
+PLcom/android/server/location/PassiveProvider;->setRequest(Lcom/android/internal/location/ProviderRequest;Landroid/os/WorkSource;)V
+PLcom/android/server/location/RemoteListenerHelper$HandlerRunnable;-><init>(Lcom/android/server/location/RemoteListenerHelper;Landroid/os/IInterface;Lcom/android/server/location/RemoteListenerHelper$ListenerOperation;)V
+PLcom/android/server/location/RemoteListenerHelper$HandlerRunnable;->run()V
+PLcom/android/server/location/RemoteListenerHelper$LinkedListener;-><init>(Lcom/android/server/location/RemoteListenerHelper;Landroid/os/IInterface;)V
+PLcom/android/server/location/RemoteListenerHelper$LinkedListener;->getUnderlyingListener()Landroid/os/IInterface;
+PLcom/android/server/location/RemoteListenerHelper;-><init>(Landroid/os/Handler;Ljava/lang/String;)V
+PLcom/android/server/location/RemoteListenerHelper;->addListener(Landroid/os/IInterface;)Z
+PLcom/android/server/location/RemoteListenerHelper;->calculateCurrentResultUnsafe()I
+PLcom/android/server/location/RemoteListenerHelper;->foreach(Lcom/android/server/location/RemoteListenerHelper$ListenerOperation;)V
+PLcom/android/server/location/RemoteListenerHelper;->foreachUnsafe(Lcom/android/server/location/RemoteListenerHelper$ListenerOperation;)V
+PLcom/android/server/location/RemoteListenerHelper;->post(Landroid/os/IInterface;Lcom/android/server/location/RemoteListenerHelper$ListenerOperation;)V
+PLcom/android/server/location/RemoteListenerHelper;->removeListener(Landroid/os/IInterface;)V
+PLcom/android/server/location/RemoteListenerHelper;->setSupported(Z)V
+PLcom/android/server/location/RemoteListenerHelper;->tryRegister()Z
+PLcom/android/server/location/RemoteListenerHelper;->tryUpdateRegistrationWithService()Z
+PLcom/android/server/location/RemoteListenerHelper;->updateResult()V
+PLcom/android/server/locksettings/LockSettingsService$1;-><init>(Lcom/android/server/locksettings/LockSettingsService;)V
+PLcom/android/server/locksettings/LockSettingsService$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/locksettings/LockSettingsService$2;-><init>(Lcom/android/server/locksettings/LockSettingsService;I)V
+PLcom/android/server/locksettings/LockSettingsService$2;->run()V
+PLcom/android/server/locksettings/LockSettingsService$DeviceProvisionedObserver;-><init>(Lcom/android/server/locksettings/LockSettingsService;)V
+PLcom/android/server/locksettings/LockSettingsService$DeviceProvisionedObserver;->isProvisioned()Z
+PLcom/android/server/locksettings/LockSettingsService$DeviceProvisionedObserver;->onSystemReady()V
+PLcom/android/server/locksettings/LockSettingsService$GateKeeperDiedRecipient;-><init>(Lcom/android/server/locksettings/LockSettingsService;)V
+PLcom/android/server/locksettings/LockSettingsService$GateKeeperDiedRecipient;-><init>(Lcom/android/server/locksettings/LockSettingsService;Lcom/android/server/locksettings/LockSettingsService$GateKeeperDiedRecipient;)V
+PLcom/android/server/locksettings/LockSettingsService$Injector$1;-><init>(Lcom/android/server/locksettings/LockSettingsService$Injector;Lcom/android/server/locksettings/LockSettingsStorage;)V
+PLcom/android/server/locksettings/LockSettingsService$Injector;-><init>(Landroid/content/Context;)V
+PLcom/android/server/locksettings/LockSettingsService$Injector;->getActivityManager()Landroid/app/IActivityManager;
+PLcom/android/server/locksettings/LockSettingsService$Injector;->getContext()Landroid/content/Context;
+PLcom/android/server/locksettings/LockSettingsService$Injector;->getHandler()Landroid/os/Handler;
+PLcom/android/server/locksettings/LockSettingsService$Injector;->getKeyStore()Landroid/security/KeyStore;
+PLcom/android/server/locksettings/LockSettingsService$Injector;->getLockPatternUtils()Lcom/android/internal/widget/LockPatternUtils;
+PLcom/android/server/locksettings/LockSettingsService$Injector;->getNotificationManager()Landroid/app/NotificationManager;
+PLcom/android/server/locksettings/LockSettingsService$Injector;->getStorage()Lcom/android/server/locksettings/LockSettingsStorage;
+PLcom/android/server/locksettings/LockSettingsService$Injector;->getStorageManager()Landroid/os/storage/IStorageManager;
+PLcom/android/server/locksettings/LockSettingsService$Injector;->getStrongAuth()Lcom/android/server/locksettings/LockSettingsStrongAuth;
+PLcom/android/server/locksettings/LockSettingsService$Injector;->getStrongAuthTracker()Lcom/android/server/locksettings/LockSettingsService$SynchronizedStrongAuthTracker;
+PLcom/android/server/locksettings/LockSettingsService$Injector;->getSyntheticPasswordManager(Lcom/android/server/locksettings/LockSettingsStorage;)Lcom/android/server/locksettings/SyntheticPasswordManager;
+PLcom/android/server/locksettings/LockSettingsService$Injector;->getUserManager()Landroid/os/UserManager;
+PLcom/android/server/locksettings/LockSettingsService$Lifecycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/locksettings/LockSettingsService$Lifecycle;->onStart()V
+PLcom/android/server/locksettings/LockSettingsService$Lifecycle;->onStartUser(I)V
+PLcom/android/server/locksettings/LockSettingsService$Lifecycle;->onUnlockUser(I)V
+PLcom/android/server/locksettings/LockSettingsService$SynchronizedStrongAuthTracker;-><init>(Landroid/content/Context;)V
+PLcom/android/server/locksettings/LockSettingsService$SynchronizedStrongAuthTracker;->getStrongAuthForUser(I)I
+PLcom/android/server/locksettings/LockSettingsService$SynchronizedStrongAuthTracker;->handleStrongAuthRequiredChanged(II)V
+PLcom/android/server/locksettings/LockSettingsService$SynchronizedStrongAuthTracker;->register(Lcom/android/server/locksettings/LockSettingsStrongAuth;)V
+PLcom/android/server/locksettings/LockSettingsService;->-get0(Lcom/android/server/locksettings/LockSettingsService;)Landroid/content/Context;
+PLcom/android/server/locksettings/LockSettingsService;->-get1(Lcom/android/server/locksettings/LockSettingsService;)Landroid/os/UserManager;
+PLcom/android/server/locksettings/LockSettingsService;->-wrap0(Lcom/android/server/locksettings/LockSettingsService;I)Z
+PLcom/android/server/locksettings/LockSettingsService;->-wrap1(Lcom/android/server/locksettings/LockSettingsService;Landroid/os/UserHandle;)V
+PLcom/android/server/locksettings/LockSettingsService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/locksettings/LockSettingsService;-><init>(Lcom/android/server/locksettings/LockSettingsService$Injector;)V
+PLcom/android/server/locksettings/LockSettingsService;->checkPasswordReadPermission(I)V
+PLcom/android/server/locksettings/LockSettingsService;->checkReadPermission(Ljava/lang/String;I)V
+PLcom/android/server/locksettings/LockSettingsService;->checkVoldPassword(I)Z
+PLcom/android/server/locksettings/LockSettingsService;->checkWritePermission(I)V
+PLcom/android/server/locksettings/LockSettingsService;->getBoolean(Ljava/lang/String;ZI)Z
+PLcom/android/server/locksettings/LockSettingsService;->getGateKeeperService()Landroid/service/gatekeeper/IGateKeeperService;
+PLcom/android/server/locksettings/LockSettingsService;->getLong(Ljava/lang/String;JI)J
+PLcom/android/server/locksettings/LockSettingsService;->getString(Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String;
+PLcom/android/server/locksettings/LockSettingsService;->getStringUnchecked(Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String;
+PLcom/android/server/locksettings/LockSettingsService;->getSyntheticPasswordHandleLocked(I)J
+PLcom/android/server/locksettings/LockSettingsService;->hideEncryptionNotification(Landroid/os/UserHandle;)V
+PLcom/android/server/locksettings/LockSettingsService;->isSyntheticPasswordBasedCredentialLocked(I)Z
+PLcom/android/server/locksettings/LockSettingsService;->isUserSecure(I)Z
+PLcom/android/server/locksettings/LockSettingsService;->maybeShowEncryptionNotificationForUser(I)V
+PLcom/android/server/locksettings/LockSettingsService;->migrateOldData()V
+PLcom/android/server/locksettings/LockSettingsService;->onStartUser(I)V
+PLcom/android/server/locksettings/LockSettingsService;->onUnlockUser(I)V
+PLcom/android/server/locksettings/LockSettingsService;->registerStrongAuthTracker(Landroid/app/trust/IStrongAuthTracker;)V
+PLcom/android/server/locksettings/LockSettingsService;->systemReady()V
+PLcom/android/server/locksettings/LockSettingsService;->userPresent(I)V
+PLcom/android/server/locksettings/LockSettingsStorage$Cache$CacheKey;-><init>()V
+PLcom/android/server/locksettings/LockSettingsStorage$Cache$CacheKey;-><init>(Lcom/android/server/locksettings/LockSettingsStorage$Cache$CacheKey;)V
+PLcom/android/server/locksettings/LockSettingsStorage$Cache$CacheKey;->equals(Ljava/lang/Object;)Z
+PLcom/android/server/locksettings/LockSettingsStorage$Cache$CacheKey;->hashCode()I
+PLcom/android/server/locksettings/LockSettingsStorage$Cache$CacheKey;->set(ILjava/lang/String;I)Lcom/android/server/locksettings/LockSettingsStorage$Cache$CacheKey;
+PLcom/android/server/locksettings/LockSettingsStorage$Cache;->-wrap0(Lcom/android/server/locksettings/LockSettingsStorage$Cache;)I
+PLcom/android/server/locksettings/LockSettingsStorage$Cache;-><init>()V
+PLcom/android/server/locksettings/LockSettingsStorage$Cache;-><init>(Lcom/android/server/locksettings/LockSettingsStorage$Cache;)V
+PLcom/android/server/locksettings/LockSettingsStorage$Cache;->contains(ILjava/lang/String;I)Z
+PLcom/android/server/locksettings/LockSettingsStorage$Cache;->getVersion()I
+PLcom/android/server/locksettings/LockSettingsStorage$Cache;->hasFile(Ljava/lang/String;)Z
+PLcom/android/server/locksettings/LockSettingsStorage$Cache;->hasKeyValue(Ljava/lang/String;I)Z
+PLcom/android/server/locksettings/LockSettingsStorage$Cache;->isFetched(I)Z
+PLcom/android/server/locksettings/LockSettingsStorage$Cache;->peek(ILjava/lang/String;I)Ljava/lang/Object;
+PLcom/android/server/locksettings/LockSettingsStorage$Cache;->peekFile(Ljava/lang/String;)[B
+PLcom/android/server/locksettings/LockSettingsStorage$Cache;->peekKeyValue(Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String;
+PLcom/android/server/locksettings/LockSettingsStorage$Cache;->put(ILjava/lang/String;Ljava/lang/Object;I)V
+PLcom/android/server/locksettings/LockSettingsStorage$Cache;->putFileIfUnchanged(Ljava/lang/String;[BI)V
+PLcom/android/server/locksettings/LockSettingsStorage$Cache;->putIfUnchanged(ILjava/lang/String;Ljava/lang/Object;II)V
+PLcom/android/server/locksettings/LockSettingsStorage$Cache;->putKeyValueIfUnchanged(Ljava/lang/String;Ljava/lang/Object;II)V
+PLcom/android/server/locksettings/LockSettingsStorage$Cache;->setFetched(I)V
+PLcom/android/server/locksettings/LockSettingsStorage$CredentialHash;-><init>([BII)V
+PLcom/android/server/locksettings/LockSettingsStorage$CredentialHash;-><init>([BIIZ)V
+PLcom/android/server/locksettings/LockSettingsStorage$CredentialHash;->createEmptyHash()Lcom/android/server/locksettings/LockSettingsStorage$CredentialHash;
+PLcom/android/server/locksettings/LockSettingsStorage$DatabaseHelper;-><init>(Landroid/content/Context;)V
+PLcom/android/server/locksettings/LockSettingsStorage$DatabaseHelper;->setCallback(Lcom/android/server/locksettings/LockSettingsStorage$Callback;)V
+PLcom/android/server/locksettings/LockSettingsStorage;->-get0()Ljava/lang/Object;
+PLcom/android/server/locksettings/LockSettingsStorage;-><init>(Landroid/content/Context;)V
+PLcom/android/server/locksettings/LockSettingsStorage;->getBaseZeroLockPatternFilename(I)Ljava/lang/String;
+PLcom/android/server/locksettings/LockSettingsStorage;->getLegacyLockPasswordFilename(I)Ljava/lang/String;
+PLcom/android/server/locksettings/LockSettingsStorage;->getLegacyLockPatternFilename(I)Ljava/lang/String;
+PLcom/android/server/locksettings/LockSettingsStorage;->getLockCredentialFilePathForUser(ILjava/lang/String;)Ljava/lang/String;
+PLcom/android/server/locksettings/LockSettingsStorage;->getLockPasswordFilename(I)Ljava/lang/String;
+PLcom/android/server/locksettings/LockSettingsStorage;->getLockPatternFilename(I)Ljava/lang/String;
+PLcom/android/server/locksettings/LockSettingsStorage;->hasCredential(I)Z
+PLcom/android/server/locksettings/LockSettingsStorage;->hasFile(Ljava/lang/String;)Z
+PLcom/android/server/locksettings/LockSettingsStorage;->hasPassword(I)Z
+PLcom/android/server/locksettings/LockSettingsStorage;->hasPattern(I)Z
+PLcom/android/server/locksettings/LockSettingsStorage;->prefetchUser(I)V
+PLcom/android/server/locksettings/LockSettingsStorage;->readCredentialHash(I)Lcom/android/server/locksettings/LockSettingsStorage$CredentialHash;
+PLcom/android/server/locksettings/LockSettingsStorage;->readFile(Ljava/lang/String;)[B
+PLcom/android/server/locksettings/LockSettingsStorage;->readKeyValue(Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String;
+PLcom/android/server/locksettings/LockSettingsStorage;->readPasswordHashIfExists(I)Lcom/android/server/locksettings/LockSettingsStorage$CredentialHash;
+PLcom/android/server/locksettings/LockSettingsStorage;->readPatternHashIfExists(I)Lcom/android/server/locksettings/LockSettingsStorage$CredentialHash;
+PLcom/android/server/locksettings/LockSettingsStorage;->setDatabaseOnCreateCallback(Lcom/android/server/locksettings/LockSettingsStorage$Callback;)V
+PLcom/android/server/locksettings/LockSettingsStrongAuth$1;-><init>(Lcom/android/server/locksettings/LockSettingsStrongAuth;)V
+PLcom/android/server/locksettings/LockSettingsStrongAuth$1;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/locksettings/LockSettingsStrongAuth;->-wrap0(Lcom/android/server/locksettings/LockSettingsStrongAuth;Landroid/app/trust/IStrongAuthTracker;)V
+PLcom/android/server/locksettings/LockSettingsStrongAuth;->-wrap3(Lcom/android/server/locksettings/LockSettingsStrongAuth;II)V
+PLcom/android/server/locksettings/LockSettingsStrongAuth;-><init>(Landroid/content/Context;)V
+PLcom/android/server/locksettings/LockSettingsStrongAuth;->handleAddStrongAuthTracker(Landroid/app/trust/IStrongAuthTracker;)V
+PLcom/android/server/locksettings/LockSettingsStrongAuth;->handleRequireStrongAuth(II)V
+PLcom/android/server/locksettings/LockSettingsStrongAuth;->handleRequireStrongAuthOneUser(II)V
+PLcom/android/server/locksettings/LockSettingsStrongAuth;->notifyStrongAuthTrackers(II)V
+PLcom/android/server/locksettings/LockSettingsStrongAuth;->registerStrongAuthTracker(Landroid/app/trust/IStrongAuthTracker;)V
+PLcom/android/server/locksettings/LockSettingsStrongAuth;->reportUnlock(I)V
+PLcom/android/server/locksettings/LockSettingsStrongAuth;->requireStrongAuth(II)V
+PLcom/android/server/locksettings/SyntheticPasswordManager;-><init>(Lcom/android/server/locksettings/LockSettingsStorage;Landroid/os/UserManager;)V
+PLcom/android/server/locksettings/SyntheticPasswordManager;->getWeaverService()Landroid/hardware/weaver/V1_0/IWeaver;
+PLcom/android/server/locksettings/SyntheticPasswordManager;->initWeaverService()V
+PLcom/android/server/media/AudioPlaybackMonitor;-><init>(Landroid/content/Context;Landroid/media/IAudioService;Lcom/android/server/media/AudioPlaybackMonitor$OnAudioPlaybackStartedListener;)V
+PLcom/android/server/media/AudioPlaybackMonitor;->dispatchPlaybackConfigChange(Ljava/util/List;)V
+PLcom/android/server/media/AudioPlaybackMonitor;->getSortedAudioPlaybackClientUids()Landroid/util/IntArray;
+PLcom/android/server/media/MediaResourceMonitorService$MediaResourceMonitorImpl;-><init>(Lcom/android/server/media/MediaResourceMonitorService;)V
+PLcom/android/server/media/MediaResourceMonitorService$MediaResourceMonitorImpl;->getPackageNamesFromPid(I)[Ljava/lang/String;
+PLcom/android/server/media/MediaResourceMonitorService$MediaResourceMonitorImpl;->notifyResourceGranted(II)V
+PLcom/android/server/media/MediaResourceMonitorService;->-get0()Z
+PLcom/android/server/media/MediaResourceMonitorService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/media/MediaResourceMonitorService;->onStart()V
+PLcom/android/server/media/MediaRouterService$1;-><init>(Lcom/android/server/media/MediaRouterService;)V
+PLcom/android/server/media/MediaRouterService$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/media/MediaRouterService$ClientRecord;-><init>(Lcom/android/server/media/MediaRouterService;Lcom/android/server/media/MediaRouterService$UserRecord;Landroid/media/IMediaRouterClient;ILjava/lang/String;Z)V
+PLcom/android/server/media/MediaRouterService$ClientRecord;->binderDied()V
+PLcom/android/server/media/MediaRouterService$ClientRecord;->dispose()V
+PLcom/android/server/media/MediaRouterService$ClientRecord;->getState()Landroid/media/MediaRouterClientState;
+PLcom/android/server/media/MediaRouterService$UserHandler$ProviderRecord;-><init>(Lcom/android/server/media/RemoteDisplayProviderProxy;)V
+PLcom/android/server/media/MediaRouterService$UserHandler$ProviderRecord;->appendClientState(Landroid/media/MediaRouterClientState;)V
+PLcom/android/server/media/MediaRouterService$UserHandler$ProviderRecord;->updateDescriptor(Landroid/media/RemoteDisplayState;)Z
+PLcom/android/server/media/MediaRouterService$UserHandler;-><init>(Lcom/android/server/media/MediaRouterService;Lcom/android/server/media/MediaRouterService$UserRecord;)V
+PLcom/android/server/media/MediaRouterService$UserHandler;->addProvider(Lcom/android/server/media/RemoteDisplayProviderProxy;)V
+PLcom/android/server/media/MediaRouterService$UserHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/media/MediaRouterService$UserHandler;->scheduleUpdateClientState()V
+PLcom/android/server/media/MediaRouterService$UserHandler;->start()V
+PLcom/android/server/media/MediaRouterService$UserHandler;->updateClientState()V
+PLcom/android/server/media/MediaRouterService$UserHandler;->updateDiscoveryRequest()V
+PLcom/android/server/media/MediaRouterService$UserRecord;-><init>(Lcom/android/server/media/MediaRouterService;I)V
+PLcom/android/server/media/MediaRouterService;->-get0(Lcom/android/server/media/MediaRouterService;)Landroid/content/Context;
+PLcom/android/server/media/MediaRouterService;->-get1(Lcom/android/server/media/MediaRouterService;)Ljava/lang/Object;
+PLcom/android/server/media/MediaRouterService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/media/MediaRouterService;->clientDied(Lcom/android/server/media/MediaRouterService$ClientRecord;)V
+PLcom/android/server/media/MediaRouterService;->disposeClientLocked(Lcom/android/server/media/MediaRouterService$ClientRecord;Z)V
+PLcom/android/server/media/MediaRouterService;->disposeUserIfNeededLocked(Lcom/android/server/media/MediaRouterService$UserRecord;)V
+PLcom/android/server/media/MediaRouterService;->getState(Landroid/media/IMediaRouterClient;)Landroid/media/MediaRouterClientState;
+PLcom/android/server/media/MediaRouterService;->getStateLocked(Landroid/media/IMediaRouterClient;)Landroid/media/MediaRouterClientState;
+PLcom/android/server/media/MediaRouterService;->initializeClientLocked(Lcom/android/server/media/MediaRouterService$ClientRecord;)V
+PLcom/android/server/media/MediaRouterService;->initializeUserLocked(Lcom/android/server/media/MediaRouterService$UserRecord;)V
+PLcom/android/server/media/MediaRouterService;->monitor()V
+PLcom/android/server/media/MediaRouterService;->registerClientAsUser(Landroid/media/IMediaRouterClient;Ljava/lang/String;I)V
+PLcom/android/server/media/MediaRouterService;->registerClientLocked(Landroid/media/IMediaRouterClient;ILjava/lang/String;IZ)V
+PLcom/android/server/media/MediaRouterService;->setDiscoveryRequest(Landroid/media/IMediaRouterClient;IZ)V
+PLcom/android/server/media/MediaRouterService;->setDiscoveryRequestLocked(Landroid/media/IMediaRouterClient;IZ)V
+PLcom/android/server/media/MediaRouterService;->setSelectedRoute(Landroid/media/IMediaRouterClient;Ljava/lang/String;Z)V
+PLcom/android/server/media/MediaRouterService;->setSelectedRouteLocked(Landroid/media/IMediaRouterClient;Ljava/lang/String;Z)V
+PLcom/android/server/media/MediaRouterService;->switchUser()V
+PLcom/android/server/media/MediaRouterService;->systemRunning()V
+PLcom/android/server/media/MediaRouterService;->unregisterClientLocked(Landroid/media/IMediaRouterClient;Z)V
+PLcom/android/server/media/MediaRouterService;->validatePackageName(ILjava/lang/String;)Z
+PLcom/android/server/media/MediaSessionRecord$1;-><init>(Lcom/android/server/media/MediaSessionRecord;)V
+PLcom/android/server/media/MediaSessionRecord$ControllerStub;-><init>(Lcom/android/server/media/MediaSessionRecord;)V
+PLcom/android/server/media/MediaSessionRecord$ControllerStub;->getMetadata()Landroid/media/MediaMetadata;
+PLcom/android/server/media/MediaSessionRecord$ControllerStub;->getPackageName()Ljava/lang/String;
+PLcom/android/server/media/MediaSessionRecord$ControllerStub;->getPlaybackState()Landroid/media/session/PlaybackState;
+PLcom/android/server/media/MediaSessionRecord$ControllerStub;->getQueue()Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/media/MediaSessionRecord$ControllerStub;->getVolumeAttributes()Landroid/media/session/ParcelableVolumeInfo;
+PLcom/android/server/media/MediaSessionRecord$ControllerStub;->registerCallbackListener(Landroid/media/session/ISessionControllerCallback;)V
+PLcom/android/server/media/MediaSessionRecord$ControllerStub;->unregisterCallbackListener(Landroid/media/session/ISessionControllerCallback;)V
+PLcom/android/server/media/MediaSessionRecord$ISessionControllerCallbackHolder;->-get0(Lcom/android/server/media/MediaSessionRecord$ISessionControllerCallbackHolder;)Landroid/media/session/ISessionControllerCallback;
+PLcom/android/server/media/MediaSessionRecord$ISessionControllerCallbackHolder;-><init>(Lcom/android/server/media/MediaSessionRecord;Landroid/media/session/ISessionControllerCallback;I)V
+PLcom/android/server/media/MediaSessionRecord$MessageHandler;-><init>(Lcom/android/server/media/MediaSessionRecord;Landroid/os/Looper;)V
+PLcom/android/server/media/MediaSessionRecord$MessageHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/media/MediaSessionRecord$MessageHandler;->post(I)V
+PLcom/android/server/media/MediaSessionRecord$MessageHandler;->post(ILjava/lang/Object;)V
+PLcom/android/server/media/MediaSessionRecord$SessionCb;->-get0(Lcom/android/server/media/MediaSessionRecord$SessionCb;)Landroid/media/session/ISessionCallback;
+PLcom/android/server/media/MediaSessionRecord$SessionCb;-><init>(Lcom/android/server/media/MediaSessionRecord;Landroid/media/session/ISessionCallback;)V
+PLcom/android/server/media/MediaSessionRecord$SessionStub;-><init>(Lcom/android/server/media/MediaSessionRecord;)V
+PLcom/android/server/media/MediaSessionRecord$SessionStub;-><init>(Lcom/android/server/media/MediaSessionRecord;Lcom/android/server/media/MediaSessionRecord$SessionStub;)V
+PLcom/android/server/media/MediaSessionRecord$SessionStub;->destroy()V
+PLcom/android/server/media/MediaSessionRecord$SessionStub;->getController()Landroid/media/session/ISessionController;
+PLcom/android/server/media/MediaSessionRecord$SessionStub;->setActive(Z)V
+PLcom/android/server/media/MediaSessionRecord$SessionStub;->setExtras(Landroid/os/Bundle;)V
+PLcom/android/server/media/MediaSessionRecord$SessionStub;->setFlags(I)V
+PLcom/android/server/media/MediaSessionRecord$SessionStub;->setMediaButtonReceiver(Landroid/app/PendingIntent;)V
+PLcom/android/server/media/MediaSessionRecord$SessionStub;->setPlaybackState(Landroid/media/session/PlaybackState;)V
+PLcom/android/server/media/MediaSessionRecord$SessionStub;->setPlaybackToLocal(Landroid/media/AudioAttributes;)V
+PLcom/android/server/media/MediaSessionRecord$SessionStub;->setQueue(Landroid/content/pm/ParceledListSlice;)V
+PLcom/android/server/media/MediaSessionRecord$SessionStub;->setQueueTitle(Ljava/lang/CharSequence;)V
+PLcom/android/server/media/MediaSessionRecord$SessionStub;->setRatingType(I)V
+PLcom/android/server/media/MediaSessionRecord;->-get0()Z
+PLcom/android/server/media/MediaSessionRecord;->-get1(Lcom/android/server/media/MediaSessionRecord;)Landroid/media/AudioAttributes;
+PLcom/android/server/media/MediaSessionRecord;->-get11(Lcom/android/server/media/MediaSessionRecord;)Lcom/android/server/media/MediaSessionRecord$MessageHandler;
+PLcom/android/server/media/MediaSessionRecord;->-get13(Lcom/android/server/media/MediaSessionRecord;)Ljava/lang/Object;
+PLcom/android/server/media/MediaSessionRecord;->-get15(Lcom/android/server/media/MediaSessionRecord;)Landroid/media/MediaMetadata;
+PLcom/android/server/media/MediaSessionRecord;->-get17(Lcom/android/server/media/MediaSessionRecord;)Ljava/lang/String;
+PLcom/android/server/media/MediaSessionRecord;->-get18(Lcom/android/server/media/MediaSessionRecord;)Landroid/media/session/PlaybackState;
+PLcom/android/server/media/MediaSessionRecord;->-get19(Lcom/android/server/media/MediaSessionRecord;)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/media/MediaSessionRecord;->-get2(Lcom/android/server/media/MediaSessionRecord;)Landroid/media/AudioManager;
+PLcom/android/server/media/MediaSessionRecord;->-get22(Lcom/android/server/media/MediaSessionRecord;)Lcom/android/server/media/MediaSessionService;
+PLcom/android/server/media/MediaSessionRecord;->-get26(Lcom/android/server/media/MediaSessionRecord;)I
+PLcom/android/server/media/MediaSessionRecord;->-get5(Lcom/android/server/media/MediaSessionRecord;)Lcom/android/server/media/MediaSessionRecord$ControllerStub;
+PLcom/android/server/media/MediaSessionRecord;->-get6(Lcom/android/server/media/MediaSessionRecord;)Ljava/util/ArrayList;
+PLcom/android/server/media/MediaSessionRecord;->-get8(Lcom/android/server/media/MediaSessionRecord;)Z
+PLcom/android/server/media/MediaSessionRecord;->-set0(Lcom/android/server/media/MediaSessionRecord;Landroid/media/AudioAttributes;)Landroid/media/AudioAttributes;
+PLcom/android/server/media/MediaSessionRecord;->-set10(Lcom/android/server/media/MediaSessionRecord;Landroid/media/session/PlaybackState;)Landroid/media/session/PlaybackState;
+PLcom/android/server/media/MediaSessionRecord;->-set11(Lcom/android/server/media/MediaSessionRecord;Landroid/content/pm/ParceledListSlice;)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/media/MediaSessionRecord;->-set12(Lcom/android/server/media/MediaSessionRecord;Ljava/lang/CharSequence;)Ljava/lang/CharSequence;
+PLcom/android/server/media/MediaSessionRecord;->-set13(Lcom/android/server/media/MediaSessionRecord;I)I
+PLcom/android/server/media/MediaSessionRecord;->-set15(Lcom/android/server/media/MediaSessionRecord;I)I
+PLcom/android/server/media/MediaSessionRecord;->-set2(Lcom/android/server/media/MediaSessionRecord;Landroid/os/Bundle;)Landroid/os/Bundle;
+PLcom/android/server/media/MediaSessionRecord;->-set3(Lcom/android/server/media/MediaSessionRecord;J)J
+PLcom/android/server/media/MediaSessionRecord;->-set4(Lcom/android/server/media/MediaSessionRecord;Z)Z
+PLcom/android/server/media/MediaSessionRecord;->-set7(Lcom/android/server/media/MediaSessionRecord;Landroid/app/PendingIntent;)Landroid/app/PendingIntent;
+PLcom/android/server/media/MediaSessionRecord;->-wrap0(Lcom/android/server/media/MediaSessionRecord;)Landroid/media/session/PlaybackState;
+PLcom/android/server/media/MediaSessionRecord;->-wrap1(Lcom/android/server/media/MediaSessionRecord;Landroid/media/session/ISessionControllerCallback;)I
+PLcom/android/server/media/MediaSessionRecord;->-wrap2(Lcom/android/server/media/MediaSessionRecord;I)Ljava/lang/String;
+PLcom/android/server/media/MediaSessionRecord;->-wrap4(Lcom/android/server/media/MediaSessionRecord;)V
+PLcom/android/server/media/MediaSessionRecord;->-wrap6(Lcom/android/server/media/MediaSessionRecord;)V
+PLcom/android/server/media/MediaSessionRecord;->-wrap7(Lcom/android/server/media/MediaSessionRecord;)V
+PLcom/android/server/media/MediaSessionRecord;->-wrap8(Lcom/android/server/media/MediaSessionRecord;)V
+PLcom/android/server/media/MediaSessionRecord;->-wrap9(Lcom/android/server/media/MediaSessionRecord;)V
+PLcom/android/server/media/MediaSessionRecord;-><init>(IIILjava/lang/String;Landroid/media/session/ISessionCallback;Ljava/lang/String;Lcom/android/server/media/MediaSessionService;Landroid/os/Looper;)V
+PLcom/android/server/media/MediaSessionRecord;->getCallback()Landroid/media/session/ISessionCallback;
+PLcom/android/server/media/MediaSessionRecord;->getControllerBinder()Landroid/media/session/ISessionController;
+PLcom/android/server/media/MediaSessionRecord;->getControllerHolderIndexForCb(Landroid/media/session/ISessionControllerCallback;)I
+PLcom/android/server/media/MediaSessionRecord;->getFlags()J
+PLcom/android/server/media/MediaSessionRecord;->getPackageName(I)Ljava/lang/String;
+PLcom/android/server/media/MediaSessionRecord;->getPlaybackType()I
+PLcom/android/server/media/MediaSessionRecord;->getSessionBinder()Landroid/media/session/ISession;
+PLcom/android/server/media/MediaSessionRecord;->getStateWithUpdatedPosition()Landroid/media/session/PlaybackState;
+PLcom/android/server/media/MediaSessionRecord;->getUserId()I
+PLcom/android/server/media/MediaSessionRecord;->isActive()Z
+PLcom/android/server/media/MediaSessionRecord;->isPlaybackActive()Z
+PLcom/android/server/media/MediaSessionRecord;->onDestroy()V
+PLcom/android/server/media/MediaSessionRecord;->pushExtrasUpdate()V
+PLcom/android/server/media/MediaSessionRecord;->pushPlaybackStateUpdate()V
+PLcom/android/server/media/MediaSessionRecord;->pushQueueTitleUpdate()V
+PLcom/android/server/media/MediaSessionRecord;->pushQueueUpdate()V
+PLcom/android/server/media/MediaSessionRecord;->pushSessionDestroyed()V
+PLcom/android/server/media/MediaSessionRecord;->toString()Ljava/lang/String;
+PLcom/android/server/media/MediaSessionService$1;-><init>(Lcom/android/server/media/MediaSessionService;)V
+PLcom/android/server/media/MediaSessionService$FullUserRecord;->-get0(Lcom/android/server/media/MediaSessionService$FullUserRecord;)Landroid/media/session/ICallback;
+PLcom/android/server/media/MediaSessionService$FullUserRecord;->-get1(Lcom/android/server/media/MediaSessionService$FullUserRecord;)I
+PLcom/android/server/media/MediaSessionService$FullUserRecord;->-get10(Lcom/android/server/media/MediaSessionService$FullUserRecord;)Lcom/android/server/media/MediaSessionStack;
+PLcom/android/server/media/MediaSessionService$FullUserRecord;->-get8(Lcom/android/server/media/MediaSessionService$FullUserRecord;)Landroid/media/session/IOnVolumeKeyLongPressListener;
+PLcom/android/server/media/MediaSessionService$FullUserRecord;->-set0(Lcom/android/server/media/MediaSessionService$FullUserRecord;Landroid/media/session/ICallback;)Landroid/media/session/ICallback;
+PLcom/android/server/media/MediaSessionService$FullUserRecord;->-wrap1(Lcom/android/server/media/MediaSessionService$FullUserRecord;)V
+PLcom/android/server/media/MediaSessionService$FullUserRecord;-><init>(Lcom/android/server/media/MediaSessionService;I)V
+PLcom/android/server/media/MediaSessionService$FullUserRecord;->getMediaButtonSessionLocked()Lcom/android/server/media/MediaSessionRecord;
+PLcom/android/server/media/MediaSessionService$FullUserRecord;->pushAddressedPlayerChangedLocked()V
+PLcom/android/server/media/MediaSessionService$MessageHandler;-><init>(Lcom/android/server/media/MediaSessionService;)V
+PLcom/android/server/media/MediaSessionService$MessageHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/media/MediaSessionService$MessageHandler;->postSessionsChanged(I)V
+PLcom/android/server/media/MediaSessionService$SessionManagerImpl$1;-><init>(Lcom/android/server/media/MediaSessionService$SessionManagerImpl;)V
+PLcom/android/server/media/MediaSessionService$SessionManagerImpl$2;-><init>(Lcom/android/server/media/MediaSessionService$SessionManagerImpl;Lcom/android/server/media/MediaSessionService$FullUserRecord;)V
+PLcom/android/server/media/MediaSessionService$SessionManagerImpl$5;-><init>(Lcom/android/server/media/MediaSessionService$SessionManagerImpl;III)V
+PLcom/android/server/media/MediaSessionService$SessionManagerImpl$5;->run()V
+PLcom/android/server/media/MediaSessionService$SessionManagerImpl$KeyEventWakeLockReceiver;-><init>(Lcom/android/server/media/MediaSessionService$SessionManagerImpl;Landroid/os/Handler;)V
+PLcom/android/server/media/MediaSessionService$SessionManagerImpl;-><init>(Lcom/android/server/media/MediaSessionService;)V
+PLcom/android/server/media/MediaSessionService$SessionManagerImpl;->addSessionsListener(Landroid/media/session/IActiveSessionsListener;Landroid/content/ComponentName;I)V
+PLcom/android/server/media/MediaSessionService$SessionManagerImpl;->createSession(Ljava/lang/String;Landroid/media/session/ISessionCallback;Ljava/lang/String;I)Landroid/media/session/ISession;
+PLcom/android/server/media/MediaSessionService$SessionManagerImpl;->dispatchAdjustVolumeLocked(III)V
+PLcom/android/server/media/MediaSessionService$SessionManagerImpl;->dispatchVolumeKeyEvent(Landroid/view/KeyEvent;IZ)V
+PLcom/android/server/media/MediaSessionService$SessionManagerImpl;->dispatchVolumeKeyEventLocked(Landroid/view/KeyEvent;IZ)V
+PLcom/android/server/media/MediaSessionService$SessionManagerImpl;->getSessions(Landroid/content/ComponentName;I)Ljava/util/List;
+PLcom/android/server/media/MediaSessionService$SessionManagerImpl;->isValidLocalStreamType(I)Z
+PLcom/android/server/media/MediaSessionService$SessionManagerImpl;->setCallback(Landroid/media/session/ICallback;)V
+PLcom/android/server/media/MediaSessionService$SessionManagerImpl;->setRemoteVolumeController(Landroid/media/IRemoteVolumeController;)V
+PLcom/android/server/media/MediaSessionService$SessionManagerImpl;->verifySessionsRequest(Landroid/content/ComponentName;III)I
+PLcom/android/server/media/MediaSessionService$SessionsListenerRecord;->-get1(Lcom/android/server/media/MediaSessionService$SessionsListenerRecord;)Landroid/media/session/IActiveSessionsListener;
+PLcom/android/server/media/MediaSessionService$SessionsListenerRecord;->-get4(Lcom/android/server/media/MediaSessionService$SessionsListenerRecord;)I
+PLcom/android/server/media/MediaSessionService$SessionsListenerRecord;-><init>(Lcom/android/server/media/MediaSessionService;Landroid/media/session/IActiveSessionsListener;Landroid/content/ComponentName;III)V
+PLcom/android/server/media/MediaSessionService$SettingsObserver;->-wrap0(Lcom/android/server/media/MediaSessionService$SettingsObserver;)V
+PLcom/android/server/media/MediaSessionService$SettingsObserver;-><init>(Lcom/android/server/media/MediaSessionService;)V
+PLcom/android/server/media/MediaSessionService$SettingsObserver;-><init>(Lcom/android/server/media/MediaSessionService;Lcom/android/server/media/MediaSessionService$SettingsObserver;)V
+PLcom/android/server/media/MediaSessionService$SettingsObserver;->observe()V
+PLcom/android/server/media/MediaSessionService;->-get0(Lcom/android/server/media/MediaSessionService;)Lcom/android/server/media/AudioPlaybackMonitor;
+PLcom/android/server/media/MediaSessionService;->-get1(Lcom/android/server/media/MediaSessionService;)Landroid/media/IAudioService;
+PLcom/android/server/media/MediaSessionService;->-get11(Lcom/android/server/media/MediaSessionService;)Ljava/util/ArrayList;
+PLcom/android/server/media/MediaSessionService;->-get2(Lcom/android/server/media/MediaSessionService;)Landroid/content/ContentResolver;
+PLcom/android/server/media/MediaSessionService;->-get3(Lcom/android/server/media/MediaSessionService;)Lcom/android/server/media/MediaSessionService$FullUserRecord;
+PLcom/android/server/media/MediaSessionService;->-get5(Lcom/android/server/media/MediaSessionService;)Lcom/android/server/media/MediaSessionRecord;
+PLcom/android/server/media/MediaSessionService;->-get6(Lcom/android/server/media/MediaSessionService;)Lcom/android/server/media/MediaSessionService$MessageHandler;
+PLcom/android/server/media/MediaSessionService;->-get8(Lcom/android/server/media/MediaSessionService;)Ljava/lang/Object;
+PLcom/android/server/media/MediaSessionService;->-set0(Lcom/android/server/media/MediaSessionService;Landroid/media/IRemoteVolumeController;)Landroid/media/IRemoteVolumeController;
+PLcom/android/server/media/MediaSessionService;->-wrap0(Lcom/android/server/media/MediaSessionService;)Z
+PLcom/android/server/media/MediaSessionService;->-wrap1(Lcom/android/server/media/MediaSessionService;IIILjava/lang/String;Landroid/media/session/ISessionCallback;Ljava/lang/String;)Lcom/android/server/media/MediaSessionRecord;
+PLcom/android/server/media/MediaSessionService;->-wrap10(Lcom/android/server/media/MediaSessionService;Ljava/lang/String;II)V
+PLcom/android/server/media/MediaSessionService;->-wrap11(Lcom/android/server/media/MediaSessionService;I)V
+PLcom/android/server/media/MediaSessionService;->-wrap2(Lcom/android/server/media/MediaSessionService;I)Lcom/android/server/media/MediaSessionService$FullUserRecord;
+PLcom/android/server/media/MediaSessionService;->-wrap3(Lcom/android/server/media/MediaSessionService;Landroid/media/session/IActiveSessionsListener;)I
+PLcom/android/server/media/MediaSessionService;->-wrap4(Lcom/android/server/media/MediaSessionService;I)Ljava/lang/String;
+PLcom/android/server/media/MediaSessionService;->-wrap5(Lcom/android/server/media/MediaSessionService;I)Ljava/util/List;
+PLcom/android/server/media/MediaSessionService;->-wrap8(Lcom/android/server/media/MediaSessionService;Landroid/content/ComponentName;III)V
+PLcom/android/server/media/MediaSessionService;->-wrap9(Lcom/android/server/media/MediaSessionService;Ljava/lang/String;I)V
+PLcom/android/server/media/MediaSessionService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/media/MediaSessionService;->createSessionInternal(IIILjava/lang/String;Landroid/media/session/ISessionCallback;Ljava/lang/String;)Lcom/android/server/media/MediaSessionRecord;
+PLcom/android/server/media/MediaSessionService;->createSessionLocked(IIILjava/lang/String;Landroid/media/session/ISessionCallback;Ljava/lang/String;)Lcom/android/server/media/MediaSessionRecord;
+PLcom/android/server/media/MediaSessionService;->destroySession(Lcom/android/server/media/MediaSessionRecord;)V
+PLcom/android/server/media/MediaSessionService;->destroySessionLocked(Lcom/android/server/media/MediaSessionRecord;)V
+PLcom/android/server/media/MediaSessionService;->enforceMediaPermissions(Landroid/content/ComponentName;III)V
+PLcom/android/server/media/MediaSessionService;->enforcePackageName(Ljava/lang/String;I)V
+PLcom/android/server/media/MediaSessionService;->enforcePhoneStatePermission(II)V
+PLcom/android/server/media/MediaSessionService;->enforceSystemUiPermission(Ljava/lang/String;II)V
+PLcom/android/server/media/MediaSessionService;->findIndexOfSessionsListenerLocked(Landroid/media/session/IActiveSessionsListener;)I
+PLcom/android/server/media/MediaSessionService;->getActiveSessionsLocked(I)Ljava/util/List;
+PLcom/android/server/media/MediaSessionService;->getAudioService()Landroid/media/IAudioService;
+PLcom/android/server/media/MediaSessionService;->getCallingPackageName(I)Ljava/lang/String;
+PLcom/android/server/media/MediaSessionService;->getFullUserRecordLocked(I)Lcom/android/server/media/MediaSessionService$FullUserRecord;
+PLcom/android/server/media/MediaSessionService;->isCurrentVolumeController(II)Z
+PLcom/android/server/media/MediaSessionService;->isGlobalPriorityActiveLocked()Z
+PLcom/android/server/media/MediaSessionService;->monitor()V
+PLcom/android/server/media/MediaSessionService;->onMediaButtonReceiverChanged(Lcom/android/server/media/MediaSessionRecord;)V
+PLcom/android/server/media/MediaSessionService;->onSessionPlaystateChanged(Lcom/android/server/media/MediaSessionRecord;II)V
+PLcom/android/server/media/MediaSessionService;->onStart()V
+PLcom/android/server/media/MediaSessionService;->onStartUser(I)V
+PLcom/android/server/media/MediaSessionService;->pushRemoteVolumeUpdateLocked(I)V
+PLcom/android/server/media/MediaSessionService;->pushSessionsChanged(I)V
+PLcom/android/server/media/MediaSessionService;->updateSession(Lcom/android/server/media/MediaSessionRecord;)V
+PLcom/android/server/media/MediaSessionService;->updateUser()V
+PLcom/android/server/media/MediaSessionStack;-><init>(Lcom/android/server/media/AudioPlaybackMonitor;Lcom/android/server/media/MediaSessionStack$OnMediaButtonSessionChangedListener;)V
+PLcom/android/server/media/MediaSessionStack;->addSession(Lcom/android/server/media/MediaSessionRecord;)V
+PLcom/android/server/media/MediaSessionStack;->clearCache(I)V
+PLcom/android/server/media/MediaSessionStack;->contains(Lcom/android/server/media/MediaSessionRecord;)Z
+PLcom/android/server/media/MediaSessionStack;->containsState(I[I)Z
+PLcom/android/server/media/MediaSessionStack;->getActiveSessions(I)Ljava/util/ArrayList;
+PLcom/android/server/media/MediaSessionStack;->getDefaultRemoteSession(I)Lcom/android/server/media/MediaSessionRecord;
+PLcom/android/server/media/MediaSessionStack;->getDefaultVolumeSession()Lcom/android/server/media/MediaSessionRecord;
+PLcom/android/server/media/MediaSessionStack;->getMediaButtonSession()Lcom/android/server/media/MediaSessionRecord;
+PLcom/android/server/media/MediaSessionStack;->getPriorityList(ZI)Ljava/util/ArrayList;
+PLcom/android/server/media/MediaSessionStack;->onPlaystateChanged(Lcom/android/server/media/MediaSessionRecord;II)V
+PLcom/android/server/media/MediaSessionStack;->onSessionStateChange(Lcom/android/server/media/MediaSessionRecord;)V
+PLcom/android/server/media/MediaSessionStack;->removeSession(Lcom/android/server/media/MediaSessionRecord;)V
+PLcom/android/server/media/MediaSessionStack;->shouldUpdatePriority(II)Z
+PLcom/android/server/media/MediaSessionStack;->updateMediaButtonSessionIfNeeded()V
+PLcom/android/server/media/RemoteDisplayProviderProxy$1;-><init>(Lcom/android/server/media/RemoteDisplayProviderProxy;)V
+PLcom/android/server/media/RemoteDisplayProviderProxy;-><init>(Landroid/content/Context;Landroid/content/ComponentName;I)V
+PLcom/android/server/media/RemoteDisplayProviderProxy;->getDisplayState()Landroid/media/RemoteDisplayState;
+PLcom/android/server/media/RemoteDisplayProviderProxy;->getFlattenedComponentName()Ljava/lang/String;
+PLcom/android/server/media/RemoteDisplayProviderProxy;->hasComponentName(Ljava/lang/String;Ljava/lang/String;)Z
+PLcom/android/server/media/RemoteDisplayProviderProxy;->rebindIfDisconnected()V
+PLcom/android/server/media/RemoteDisplayProviderProxy;->setCallback(Lcom/android/server/media/RemoteDisplayProviderProxy$Callback;)V
+PLcom/android/server/media/RemoteDisplayProviderProxy;->setDiscoveryMode(I)V
+PLcom/android/server/media/RemoteDisplayProviderProxy;->setSelectedDisplay(Ljava/lang/String;)V
+PLcom/android/server/media/RemoteDisplayProviderProxy;->shouldBind()Z
+PLcom/android/server/media/RemoteDisplayProviderProxy;->start()V
+PLcom/android/server/media/RemoteDisplayProviderProxy;->unbind()V
+PLcom/android/server/media/RemoteDisplayProviderProxy;->updateBinding()V
+PLcom/android/server/media/RemoteDisplayProviderWatcher$1;-><init>(Lcom/android/server/media/RemoteDisplayProviderWatcher;)V
+PLcom/android/server/media/RemoteDisplayProviderWatcher$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/media/RemoteDisplayProviderWatcher$2;-><init>(Lcom/android/server/media/RemoteDisplayProviderWatcher;)V
+PLcom/android/server/media/RemoteDisplayProviderWatcher$2;->run()V
+PLcom/android/server/media/RemoteDisplayProviderWatcher;->-get0()Z
+PLcom/android/server/media/RemoteDisplayProviderWatcher;->-wrap0(Lcom/android/server/media/RemoteDisplayProviderWatcher;)V
+PLcom/android/server/media/RemoteDisplayProviderWatcher;-><init>(Landroid/content/Context;Lcom/android/server/media/RemoteDisplayProviderWatcher$Callback;Landroid/os/Handler;I)V
+PLcom/android/server/media/RemoteDisplayProviderWatcher;->findProvider(Ljava/lang/String;Ljava/lang/String;)I
+PLcom/android/server/media/RemoteDisplayProviderWatcher;->hasCaptureVideoPermission(Ljava/lang/String;)Z
+PLcom/android/server/media/RemoteDisplayProviderWatcher;->scanPackages()V
+PLcom/android/server/media/RemoteDisplayProviderWatcher;->start()V
+PLcom/android/server/media/RemoteDisplayProviderWatcher;->verifyServiceTrusted(Landroid/content/pm/ServiceInfo;)Z
+PLcom/android/server/media/projection/MediaProjectionManagerService$1;-><init>(Lcom/android/server/media/projection/MediaProjectionManagerService;Landroid/media/projection/IMediaProjectionWatcherCallback;)V
+PLcom/android/server/media/projection/MediaProjectionManagerService$BinderService;-><init>(Lcom/android/server/media/projection/MediaProjectionManagerService;)V
+PLcom/android/server/media/projection/MediaProjectionManagerService$BinderService;-><init>(Lcom/android/server/media/projection/MediaProjectionManagerService;Lcom/android/server/media/projection/MediaProjectionManagerService$BinderService;)V
+PLcom/android/server/media/projection/MediaProjectionManagerService$BinderService;->addCallback(Landroid/media/projection/IMediaProjectionWatcherCallback;)V
+PLcom/android/server/media/projection/MediaProjectionManagerService$BinderService;->getActiveProjectionInfo()Landroid/media/projection/MediaProjectionInfo;
+PLcom/android/server/media/projection/MediaProjectionManagerService$CallbackDelegate;-><init>()V
+PLcom/android/server/media/projection/MediaProjectionManagerService$CallbackDelegate;->add(Landroid/media/projection/IMediaProjectionWatcherCallback;)V
+PLcom/android/server/media/projection/MediaProjectionManagerService$MediaRouterCallback;-><init>(Lcom/android/server/media/projection/MediaProjectionManagerService;)V
+PLcom/android/server/media/projection/MediaProjectionManagerService$MediaRouterCallback;-><init>(Lcom/android/server/media/projection/MediaProjectionManagerService;Lcom/android/server/media/projection/MediaProjectionManagerService$MediaRouterCallback;)V
+PLcom/android/server/media/projection/MediaProjectionManagerService;->-get2(Lcom/android/server/media/projection/MediaProjectionManagerService;)Landroid/content/Context;
+PLcom/android/server/media/projection/MediaProjectionManagerService;->-wrap0(Lcom/android/server/media/projection/MediaProjectionManagerService;)Landroid/media/projection/MediaProjectionInfo;
+PLcom/android/server/media/projection/MediaProjectionManagerService;->-wrap3(Lcom/android/server/media/projection/MediaProjectionManagerService;Landroid/media/projection/IMediaProjectionWatcherCallback;)V
+PLcom/android/server/media/projection/MediaProjectionManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/media/projection/MediaProjectionManagerService;->addCallback(Landroid/media/projection/IMediaProjectionWatcherCallback;)V
+PLcom/android/server/media/projection/MediaProjectionManagerService;->getActiveProjectionInfo()Landroid/media/projection/MediaProjectionInfo;
+PLcom/android/server/media/projection/MediaProjectionManagerService;->linkDeathRecipientLocked(Landroid/media/projection/IMediaProjectionWatcherCallback;Landroid/os/IBinder$DeathRecipient;)V
+PLcom/android/server/media/projection/MediaProjectionManagerService;->monitor()V
+PLcom/android/server/media/projection/MediaProjectionManagerService;->onStart()V
+PLcom/android/server/midi/MidiService$1;-><init>(Lcom/android/server/midi/MidiService;)V
+PLcom/android/server/midi/MidiService$1;->onPackageAdded(Ljava/lang/String;I)V
+PLcom/android/server/midi/MidiService$1;->onPackageModified(Ljava/lang/String;)V
+PLcom/android/server/midi/MidiService$Lifecycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/midi/MidiService$Lifecycle;->onStart()V
+PLcom/android/server/midi/MidiService$Lifecycle;->onUnlockUser(I)V
+PLcom/android/server/midi/MidiService;->-wrap0(Lcom/android/server/midi/MidiService;Ljava/lang/String;)V
+PLcom/android/server/midi/MidiService;->-wrap1(Lcom/android/server/midi/MidiService;)V
+PLcom/android/server/midi/MidiService;->-wrap3(Lcom/android/server/midi/MidiService;Ljava/lang/String;)V
+PLcom/android/server/midi/MidiService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/midi/MidiService;->addPackageDeviceServer(Landroid/content/pm/ServiceInfo;)V
+PLcom/android/server/midi/MidiService;->addPackageDeviceServers(Ljava/lang/String;)V
+PLcom/android/server/midi/MidiService;->onUnlockUser()V
+PLcom/android/server/midi/MidiService;->removePackageDeviceServers(Ljava/lang/String;)V
+PLcom/android/server/net/-$Lambda$hlRLCZCUKiWKuPbzPq01UpErk2Y;->$m$0()V
+PLcom/android/server/net/-$Lambda$hlRLCZCUKiWKuPbzPq01UpErk2Y;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/net/-$Lambda$hlRLCZCUKiWKuPbzPq01UpErk2Y;->run()V
+PLcom/android/server/net/DelayedDiskWrite;-><init>()V
+PLcom/android/server/net/IpConfigStore;-><init>()V
+PLcom/android/server/net/IpConfigStore;-><init>(Lcom/android/server/net/DelayedDiskWrite;)V
+PLcom/android/server/net/IpConfigStore;->loge(Ljava/lang/String;)V
+PLcom/android/server/net/IpConfigStore;->readIpAndProxyConfigurations(Ljava/lang/String;)Landroid/util/SparseArray;
+PLcom/android/server/net/LockdownVpnTracker;->isEnabled()Z
+PLcom/android/server/net/NetworkIdentitySet;-><init>()V
+PLcom/android/server/net/NetworkIdentitySet;-><init>(Ljava/io/DataInputStream;)V
+PLcom/android/server/net/NetworkIdentitySet;->readOptionalString(Ljava/io/DataInputStream;)Ljava/lang/String;
+PLcom/android/server/net/NetworkIdentitySet;->writeOptionalString(Ljava/io/DataOutputStream;Ljava/lang/String;)V
+PLcom/android/server/net/NetworkPolicyManagerInternal;-><init>()V
+PLcom/android/server/net/NetworkPolicyManagerService$10;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$10;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/net/NetworkPolicyManagerService$11;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$11;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/net/NetworkPolicyManagerService$12;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$12;->limitReached(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/net/NetworkPolicyManagerService$13;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$13;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/net/NetworkPolicyManagerService$14;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$14;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/net/NetworkPolicyManagerService$15;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$15;->handleMessage(Landroid/os/Message;)Z
+PLcom/android/server/net/NetworkPolicyManagerService$16;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$16;->handleMessage(Landroid/os/Message;)Z
+PLcom/android/server/net/NetworkPolicyManagerService$17;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$18;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$1;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$1;->onUidGone(IZ)V
+PLcom/android/server/net/NetworkPolicyManagerService$1;->onUidStateChanged(IIJ)V
+PLcom/android/server/net/NetworkPolicyManagerService$2;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$3;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$3;->run()V
+PLcom/android/server/net/NetworkPolicyManagerService$4;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$4;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/net/NetworkPolicyManagerService$5;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$6;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$7;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$7;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/net/NetworkPolicyManagerService$8;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$9;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$AppIdleStateChangeListener;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$AppIdleStateChangeListener;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService$AppIdleStateChangeListener;)V
+PLcom/android/server/net/NetworkPolicyManagerService$AppIdleStateChangeListener;->onAppIdleStateChanged(Ljava/lang/String;IZ)V
+PLcom/android/server/net/NetworkPolicyManagerService$AppIdleStateChangeListener;->onParoleStateChanged(Z)V
+PLcom/android/server/net/NetworkPolicyManagerService$NetworkPolicyManagerInternalImpl;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$NetworkPolicyManagerInternalImpl;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService$NetworkPolicyManagerInternalImpl;)V
+PLcom/android/server/net/NetworkPolicyManagerService$ProcStateSeqHistory;-><init>(I)V
+PLcom/android/server/net/NetworkPolicyManagerService$ProcStateSeqHistory;->addProcStateSeqUL(IJ)V
+PLcom/android/server/net/NetworkPolicyManagerService$ProcStateSeqHistory;->increaseNext(II)I
+PLcom/android/server/net/NetworkPolicyManagerService;->-get0(Lcom/android/server/net/NetworkPolicyManagerService;)Landroid/content/Context;
+PLcom/android/server/net/NetworkPolicyManagerService;->-get1(Lcom/android/server/net/NetworkPolicyManagerService;)Landroid/os/RemoteCallbackList;
+PLcom/android/server/net/NetworkPolicyManagerService;->-get2(Lcom/android/server/net/NetworkPolicyManagerService;)Landroid/util/ArraySet;
+PLcom/android/server/net/NetworkPolicyManagerService;->-get3(Lcom/android/server/net/NetworkPolicyManagerService;)Landroid/net/INetworkStatsService;
+PLcom/android/server/net/NetworkPolicyManagerService;->-wrap1(Lcom/android/server/net/NetworkPolicyManagerService;ILjava/lang/String;)Z
+PLcom/android/server/net/NetworkPolicyManagerService;->-wrap10(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService;->-wrap11(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService;->-wrap16(Lcom/android/server/net/NetworkPolicyManagerService;ILandroid/util/SparseIntArray;)V
+PLcom/android/server/net/NetworkPolicyManagerService;->-wrap17(Lcom/android/server/net/NetworkPolicyManagerService;I)V
+PLcom/android/server/net/NetworkPolicyManagerService;->-wrap19(Lcom/android/server/net/NetworkPolicyManagerService;I)V
+PLcom/android/server/net/NetworkPolicyManagerService;->-wrap2(II)Z
+PLcom/android/server/net/NetworkPolicyManagerService;->-wrap21(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService;->-wrap3(Lcom/android/server/net/NetworkPolicyManagerService;I)Z
+PLcom/android/server/net/NetworkPolicyManagerService;->-wrap5(Lcom/android/server/net/NetworkPolicyManagerService;Landroid/net/INetworkPolicyListener;[Ljava/lang/String;)V
+PLcom/android/server/net/NetworkPolicyManagerService;->-wrap8(Lcom/android/server/net/NetworkPolicyManagerService;Landroid/net/INetworkPolicyListener;II)V
+PLcom/android/server/net/NetworkPolicyManagerService;->-wrap9(Lcom/android/server/net/NetworkPolicyManagerService;IZ)V
+PLcom/android/server/net/NetworkPolicyManagerService;-><init>(Landroid/content/Context;Landroid/app/IActivityManager;Landroid/net/INetworkStatsService;Landroid/os/INetworkManagementService;)V
+PLcom/android/server/net/NetworkPolicyManagerService;-><init>(Landroid/content/Context;Landroid/app/IActivityManager;Landroid/net/INetworkStatsService;Landroid/os/INetworkManagementService;Landroid/content/pm/IPackageManager;Landroid/util/TrustedTime;Ljava/io/File;Z)V
+PLcom/android/server/net/NetworkPolicyManagerService;->addDefaultRestrictBackgroundWhitelistUidsUL()Z
+PLcom/android/server/net/NetworkPolicyManagerService;->addDefaultRestrictBackgroundWhitelistUidsUL(I)Z
+PLcom/android/server/net/NetworkPolicyManagerService;->bindConnectivityManager(Landroid/net/IConnectivityManager;)V
+PLcom/android/server/net/NetworkPolicyManagerService;->bindNotificationManager(Landroid/app/INotificationManager;)V
+PLcom/android/server/net/NetworkPolicyManagerService;->currentTimeMillis()J
+PLcom/android/server/net/NetworkPolicyManagerService;->dispatchMeteredIfacesChanged(Landroid/net/INetworkPolicyListener;[Ljava/lang/String;)V
+PLcom/android/server/net/NetworkPolicyManagerService;->dispatchUidRulesChanged(Landroid/net/INetworkPolicyListener;II)V
+PLcom/android/server/net/NetworkPolicyManagerService;->enableFirewallChainUL(IZ)V
+PLcom/android/server/net/NetworkPolicyManagerService;->ensureActiveMobilePolicyAL()V
+PLcom/android/server/net/NetworkPolicyManagerService;->ensureActiveMobilePolicyAL(ILjava/lang/String;)Z
+PLcom/android/server/net/NetworkPolicyManagerService;->getCycleDayFromCarrierConfig(Landroid/os/PersistableBundle;I)I
+PLcom/android/server/net/NetworkPolicyManagerService;->getLimitBytesFromCarrierConfig(Landroid/os/PersistableBundle;J)J
+PLcom/android/server/net/NetworkPolicyManagerService;->getNetworkPolicies(Ljava/lang/String;)[Landroid/net/NetworkPolicy;
+PLcom/android/server/net/NetworkPolicyManagerService;->getPlatformDefaultLimitBytes()J
+PLcom/android/server/net/NetworkPolicyManagerService;->getPlatformDefaultWarningBytes()J
+PLcom/android/server/net/NetworkPolicyManagerService;->getRestrictBackground()Z
+PLcom/android/server/net/NetworkPolicyManagerService;->getRestrictBackgroundByCaller()I
+PLcom/android/server/net/NetworkPolicyManagerService;->getSystemDir()Ljava/io/File;
+PLcom/android/server/net/NetworkPolicyManagerService;->getUidPolicy(I)I
+PLcom/android/server/net/NetworkPolicyManagerService;->getWarningBytesFromCarrierConfig(Landroid/os/PersistableBundle;J)J
+PLcom/android/server/net/NetworkPolicyManagerService;->handleUidGone(I)V
+PLcom/android/server/net/NetworkPolicyManagerService;->hasInternetPermissions(I)Z
+PLcom/android/server/net/NetworkPolicyManagerService;->hasRule(II)Z
+PLcom/android/server/net/NetworkPolicyManagerService;->initService(Ljava/util/concurrent/CountDownLatch;)V
+PLcom/android/server/net/NetworkPolicyManagerService;->isBandwidthControlEnabled()Z
+PLcom/android/server/net/NetworkPolicyManagerService;->isTemplateRelevant(Landroid/net/NetworkTemplate;)Z
+PLcom/android/server/net/NetworkPolicyManagerService;->isUidForegroundOnRestrictBackgroundUL(I)Z
+PLcom/android/server/net/NetworkPolicyManagerService;->isUidForegroundOnRestrictPowerUL(I)Z
+PLcom/android/server/net/NetworkPolicyManagerService;->isUidIdle(I)Z
+PLcom/android/server/net/NetworkPolicyManagerService;->isUidStateForegroundUL(I)Z
+PLcom/android/server/net/NetworkPolicyManagerService;->isUidValidForBlacklistRules(I)Z
+PLcom/android/server/net/NetworkPolicyManagerService;->isUidValidForWhitelistRules(I)Z
+PLcom/android/server/net/NetworkPolicyManagerService;->isWhitelistedBatterySaverUL(IZ)Z
+PLcom/android/server/net/NetworkPolicyManagerService;->lambda$-com_android_server_net_NetworkPolicyManagerService_36909(Ljava/util/concurrent/CountDownLatch;)V
+PLcom/android/server/net/NetworkPolicyManagerService;->maybeRefreshTrustedTime()V
+PLcom/android/server/net/NetworkPolicyManagerService;->maybeUpdateMobilePolicyCycleNL(I)Z
+PLcom/android/server/net/NetworkPolicyManagerService;->networkScoreAndNetworkManagementServiceReady()Ljava/util/concurrent/CountDownLatch;
+PLcom/android/server/net/NetworkPolicyManagerService;->normalizePoliciesNL()V
+PLcom/android/server/net/NetworkPolicyManagerService;->normalizePoliciesNL([Landroid/net/NetworkPolicy;)V
+PLcom/android/server/net/NetworkPolicyManagerService;->onTetheringChanged(Ljava/lang/String;Z)V
+PLcom/android/server/net/NetworkPolicyManagerService;->purgePowerSaveTempWhitelistUL()V
+PLcom/android/server/net/NetworkPolicyManagerService;->readPolicyAL()V
+PLcom/android/server/net/NetworkPolicyManagerService;->registerListener(Landroid/net/INetworkPolicyListener;)V
+PLcom/android/server/net/NetworkPolicyManagerService;->removeUidStateUL(I)V
+PLcom/android/server/net/NetworkPolicyManagerService;->setMeteredNetworkWhitelist(IZ)V
+PLcom/android/server/net/NetworkPolicyManagerService;->setNetworkTemplateEnabled(Landroid/net/NetworkTemplate;Z)V
+PLcom/android/server/net/NetworkPolicyManagerService;->setRestrictBackgroundUL(Z)V
+PLcom/android/server/net/NetworkPolicyManagerService;->setUidFirewallRule(III)V
+PLcom/android/server/net/NetworkPolicyManagerService;->setUidFirewallRules(ILandroid/util/SparseIntArray;)V
+PLcom/android/server/net/NetworkPolicyManagerService;->setUidFirewallRulesAsync(ILandroid/util/SparseIntArray;I)V
+PLcom/android/server/net/NetworkPolicyManagerService;->setUidPolicyUncheckedUL(IIZ)V
+PLcom/android/server/net/NetworkPolicyManagerService;->systemReady(Ljava/util/concurrent/CountDownLatch;)V
+PLcom/android/server/net/NetworkPolicyManagerService;->unregisterListener(Landroid/net/INetworkPolicyListener;)V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateNetworkEnabledNL()V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateNetworkRulesNL()V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateNetworkStats(IZ)V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateNotificationsNL()V
+PLcom/android/server/net/NetworkPolicyManagerService;->updatePowerSaveTempWhitelistUL()V
+PLcom/android/server/net/NetworkPolicyManagerService;->updatePowerSaveWhitelistUL()V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRestrictBackgroundRulesOnUidStatusChangedUL(III)V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRestrictionRulesForUidUL(I)V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRuleForAppIdleUL(I)V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRuleForDeviceIdleUL(I)V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRuleForRestrictPowerUL(I)V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForAllAppsUL(I)V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForAppIdleParoleUL()V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForAppIdleUL()V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForDataUsageRestrictionsUL(I)V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForDataUsageRestrictionsULInner(I)V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForDeviceIdleUL()V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForGlobalChangeAL(Z)V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForPowerRestrictionsUL(I)V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForPowerRestrictionsUL(IIZ)I
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForPowerRestrictionsULInner(IIZ)I
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForPowerSaveUL()V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForRestrictBackgroundUL()V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForRestrictPowerUL()V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForTempWhitelistChangeUL()V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForWhitelistedPowerSaveUL(IZI)V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForWhitelistedPowerSaveUL(ZILandroid/util/SparseIntArray;)V
+PLcom/android/server/net/NetworkPolicyManagerService;->writePolicyAL()V
+PLcom/android/server/net/NetworkStatsAccess;->isAccessibleToUser(III)Z
+PLcom/android/server/net/NetworkStatsCollection$Key;->equals(Ljava/lang/Object;)Z
+PLcom/android/server/net/NetworkStatsCollection$Key;->hashCode()I
+PLcom/android/server/net/NetworkStatsCollection;-><init>(J)V
+PLcom/android/server/net/NetworkStatsCollection;->getTotalBytes()J
+PLcom/android/server/net/NetworkStatsCollection;->isDirty()Z
+PLcom/android/server/net/NetworkStatsCollection;->noteRecordedHistory(JJJ)V
+PLcom/android/server/net/NetworkStatsCollection;->read(Ljava/io/DataInputStream;)V
+PLcom/android/server/net/NetworkStatsCollection;->read(Ljava/io/InputStream;)V
+PLcom/android/server/net/NetworkStatsCollection;->recordCollection(Lcom/android/server/net/NetworkStatsCollection;)V
+PLcom/android/server/net/NetworkStatsCollection;->recordHistory(Lcom/android/server/net/NetworkStatsCollection$Key;Landroid/net/NetworkStatsHistory;)V
+PLcom/android/server/net/NetworkStatsCollection;->reset()V
+PLcom/android/server/net/NetworkStatsObservers$1;-><init>(Lcom/android/server/net/NetworkStatsObservers;)V
+PLcom/android/server/net/NetworkStatsObservers$1;->handleMessage(Landroid/os/Message;)Z
+PLcom/android/server/net/NetworkStatsObservers$StatsContext;-><init>(Landroid/net/NetworkStats;Landroid/net/NetworkStats;Landroid/util/ArrayMap;Landroid/util/ArrayMap;[Lcom/android/internal/net/VpnInfo;J)V
+PLcom/android/server/net/NetworkStatsObservers;->-wrap2(Lcom/android/server/net/NetworkStatsObservers;Lcom/android/server/net/NetworkStatsObservers$StatsContext;)V
+PLcom/android/server/net/NetworkStatsObservers;-><init>()V
+PLcom/android/server/net/NetworkStatsObservers;->getHandler()Landroid/os/Handler;
+PLcom/android/server/net/NetworkStatsObservers;->getHandlerLooperLocked()Landroid/os/Looper;
+PLcom/android/server/net/NetworkStatsObservers;->handleUpdateStats(Lcom/android/server/net/NetworkStatsObservers$StatsContext;)V
+PLcom/android/server/net/NetworkStatsObservers;->updateStats(Landroid/net/NetworkStats;Landroid/net/NetworkStats;Landroid/util/ArrayMap;Landroid/util/ArrayMap;[Lcom/android/internal/net/VpnInfo;J)V
+PLcom/android/server/net/NetworkStatsRecorder$CombiningRewriter;-><init>(Lcom/android/server/net/NetworkStatsCollection;)V
+PLcom/android/server/net/NetworkStatsRecorder$CombiningRewriter;->read(Ljava/io/InputStream;)V
+PLcom/android/server/net/NetworkStatsRecorder$CombiningRewriter;->reset()V
+PLcom/android/server/net/NetworkStatsRecorder$CombiningRewriter;->shouldWrite()Z
+PLcom/android/server/net/NetworkStatsRecorder$CombiningRewriter;->write(Ljava/io/OutputStream;)V
+PLcom/android/server/net/NetworkStatsRecorder;-><init>(Lcom/android/internal/util/FileRotator;Landroid/net/NetworkStats$NonMonotonicObserver;Landroid/os/DropBoxManager;Ljava/lang/String;JZ)V
+PLcom/android/server/net/NetworkStatsRecorder;->forcePersistLocked(J)V
+PLcom/android/server/net/NetworkStatsRecorder;->getOrLoadCompleteLocked()Lcom/android/server/net/NetworkStatsCollection;
+PLcom/android/server/net/NetworkStatsRecorder;->getTotalSinceBootLocked(Landroid/net/NetworkTemplate;)Landroid/net/NetworkStats$Entry;
+PLcom/android/server/net/NetworkStatsRecorder;->loadLocked(JJ)Lcom/android/server/net/NetworkStatsCollection;
+PLcom/android/server/net/NetworkStatsRecorder;->maybePersistLocked(J)V
+PLcom/android/server/net/NetworkStatsRecorder;->setPersistThreshold(J)V
+PLcom/android/server/net/NetworkStatsService$1;-><init>(Lcom/android/server/net/NetworkStatsService;)V
+PLcom/android/server/net/NetworkStatsService$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/net/NetworkStatsService$2;-><init>(Lcom/android/server/net/NetworkStatsService;)V
+PLcom/android/server/net/NetworkStatsService$2;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/net/NetworkStatsService$3;-><init>(Lcom/android/server/net/NetworkStatsService;)V
+PLcom/android/server/net/NetworkStatsService$4;-><init>(Lcom/android/server/net/NetworkStatsService;)V
+PLcom/android/server/net/NetworkStatsService$5;-><init>(Lcom/android/server/net/NetworkStatsService;)V
+PLcom/android/server/net/NetworkStatsService$6;-><init>(Lcom/android/server/net/NetworkStatsService;)V
+PLcom/android/server/net/NetworkStatsService$6;->limitReached(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;-><init>(Landroid/content/Context;)V
+PLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;->getDevConfig()Lcom/android/server/net/NetworkStatsService$NetworkStatsSettings$Config;
+PLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;->getDevPersistBytes(J)J
+PLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;->getGlobalAlertBytes(J)J
+PLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;->getGlobalBoolean(Ljava/lang/String;Z)Z
+PLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;->getGlobalLong(Ljava/lang/String;J)J
+PLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;->getPollInterval()J
+PLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;->getSampleEnabled()Z
+PLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;->getTimeCacheMaxAge()J
+PLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;->getUidConfig()Lcom/android/server/net/NetworkStatsService$NetworkStatsSettings$Config;
+PLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;->getUidPersistBytes(J)J
+PLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;->getUidTagConfig()Lcom/android/server/net/NetworkStatsService$NetworkStatsSettings$Config;
+PLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;->getUidTagPersistBytes(J)J
+PLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;->getXtConfig()Lcom/android/server/net/NetworkStatsService$NetworkStatsSettings$Config;
+PLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;->getXtPersistBytes(J)J
+PLcom/android/server/net/NetworkStatsService$DropBoxNonMonotonicObserver;-><init>(Lcom/android/server/net/NetworkStatsService;)V
+PLcom/android/server/net/NetworkStatsService$DropBoxNonMonotonicObserver;-><init>(Lcom/android/server/net/NetworkStatsService;Lcom/android/server/net/NetworkStatsService$DropBoxNonMonotonicObserver;)V
+PLcom/android/server/net/NetworkStatsService$HandlerCallback;-><init>(Lcom/android/server/net/NetworkStatsService;)V
+PLcom/android/server/net/NetworkStatsService$HandlerCallback;->handleMessage(Landroid/os/Message;)Z
+PLcom/android/server/net/NetworkStatsService$NetworkStatsSettings$Config;-><init>(JJJ)V
+PLcom/android/server/net/NetworkStatsService;->-get0(Lcom/android/server/net/NetworkStatsService;)Landroid/content/Context;
+PLcom/android/server/net/NetworkStatsService;->-get1(Lcom/android/server/net/NetworkStatsService;)Landroid/os/Handler;
+PLcom/android/server/net/NetworkStatsService;->-wrap3(Lcom/android/server/net/NetworkStatsService;I)V
+PLcom/android/server/net/NetworkStatsService;->-wrap4(Lcom/android/server/net/NetworkStatsService;)V
+PLcom/android/server/net/NetworkStatsService;-><init>(Landroid/content/Context;Landroid/os/INetworkManagementService;Landroid/app/AlarmManager;Landroid/os/PowerManager$WakeLock;Landroid/util/TrustedTime;Landroid/telephony/TelephonyManager;Lcom/android/server/net/NetworkStatsService$NetworkStatsSettings;Lcom/android/server/net/NetworkStatsObservers;Ljava/io/File;Ljava/io/File;)V
+PLcom/android/server/net/NetworkStatsService;->advisePersistThreshold(J)V
+PLcom/android/server/net/NetworkStatsService;->assertBandwidthControlEnabled()V
+PLcom/android/server/net/NetworkStatsService;->bindConnectivityManager(Landroid/net/IConnectivityManager;)V
+PLcom/android/server/net/NetworkStatsService;->bootstrapStatsLocked()V
+PLcom/android/server/net/NetworkStatsService;->buildRecorder(Ljava/lang/String;Lcom/android/server/net/NetworkStatsService$NetworkStatsSettings$Config;Z)Lcom/android/server/net/NetworkStatsRecorder;
+PLcom/android/server/net/NetworkStatsService;->create(Landroid/content/Context;Landroid/os/INetworkManagementService;)Lcom/android/server/net/NetworkStatsService;
+PLcom/android/server/net/NetworkStatsService;->findOrCreateNetworkIdentitySet(Landroid/util/ArrayMap;Ljava/lang/Object;)Lcom/android/server/net/NetworkIdentitySet;
+PLcom/android/server/net/NetworkStatsService;->forceUpdateIfaces()V
+PLcom/android/server/net/NetworkStatsService;->getDefaultBaseDir()Ljava/io/File;
+PLcom/android/server/net/NetworkStatsService;->getDefaultSystemDir()Ljava/io/File;
+PLcom/android/server/net/NetworkStatsService;->getMobileIfaces()[Ljava/lang/String;
+PLcom/android/server/net/NetworkStatsService;->getNetworkStatsTethering()Landroid/net/NetworkStats;
+PLcom/android/server/net/NetworkStatsService;->getNetworkStatsUidDetail()Landroid/net/NetworkStats;
+PLcom/android/server/net/NetworkStatsService;->getNetworkStatsXt()Landroid/net/NetworkStats;
+PLcom/android/server/net/NetworkStatsService;->incrementOperationCount(III)V
+PLcom/android/server/net/NetworkStatsService;->isBandwidthControlEnabled()Z
+PLcom/android/server/net/NetworkStatsService;->maybeUpgradeLegacyStatsLocked()V
+PLcom/android/server/net/NetworkStatsService;->performPoll(I)V
+PLcom/android/server/net/NetworkStatsService;->performPollLocked(I)V
+PLcom/android/server/net/NetworkStatsService;->performSampleLocked()V
+PLcom/android/server/net/NetworkStatsService;->recordSnapshotLocked(J)V
+PLcom/android/server/net/NetworkStatsService;->registerGlobalAlert()V
+PLcom/android/server/net/NetworkStatsService;->registerPollAlarmLocked()V
+PLcom/android/server/net/NetworkStatsService;->setHandler(Landroid/os/Handler;Landroid/os/Handler$Callback;)V
+PLcom/android/server/net/NetworkStatsService;->setUidForeground(IZ)V
+PLcom/android/server/net/NetworkStatsService;->systemReady()V
+PLcom/android/server/net/NetworkStatsService;->updateIfaces()V
+PLcom/android/server/net/NetworkStatsService;->updateIfacesLocked()V
+PLcom/android/server/net/NetworkStatsService;->updatePersistThresholds()V
+PLcom/android/server/notification/-$Lambda$0oXbfIRCVxclfVVwXaE3J61tRFA$2;->$m$0(I)Z
+PLcom/android/server/notification/-$Lambda$0oXbfIRCVxclfVVwXaE3J61tRFA$2;-><init>(II)V
+PLcom/android/server/notification/-$Lambda$0oXbfIRCVxclfVVwXaE3J61tRFA$2;->apply(I)Z
+PLcom/android/server/notification/BadgeExtractor;-><init>()V
+PLcom/android/server/notification/BadgeExtractor;->initialize(Landroid/content/Context;Lcom/android/server/notification/NotificationUsageStats;)V
+PLcom/android/server/notification/BadgeExtractor;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;
+PLcom/android/server/notification/BadgeExtractor;->setConfig(Lcom/android/server/notification/RankingConfig;)V
+PLcom/android/server/notification/CalendarTracker$1;-><init>(Lcom/android/server/notification/CalendarTracker;Landroid/os/Handler;)V
+PLcom/android/server/notification/CalendarTracker$1;->onChange(ZLandroid/net/Uri;)V
+PLcom/android/server/notification/CalendarTracker$CheckEventResult;-><init>()V
+PLcom/android/server/notification/CalendarTracker;->-get0()Z
+PLcom/android/server/notification/CalendarTracker;->-get1(Lcom/android/server/notification/CalendarTracker;)Lcom/android/server/notification/CalendarTracker$Callback;
+PLcom/android/server/notification/CalendarTracker;-><init>(Landroid/content/Context;Landroid/content/Context;)V
+PLcom/android/server/notification/CalendarTracker;->checkEvent(Landroid/service/notification/ZenModeConfig$EventInfo;J)Lcom/android/server/notification/CalendarTracker$CheckEventResult;
+PLcom/android/server/notification/CalendarTracker;->getPrimaryCalendars()Landroid/util/ArraySet;
+PLcom/android/server/notification/CalendarTracker;->meetsAttendee(Landroid/service/notification/ZenModeConfig$EventInfo;ILjava/lang/String;)Z
+PLcom/android/server/notification/CalendarTracker;->setCallback(Lcom/android/server/notification/CalendarTracker$Callback;)V
+PLcom/android/server/notification/CalendarTracker;->setRegistered(Z)V
+PLcom/android/server/notification/ConditionProviders$ConditionRecord;-><init>(Landroid/net/Uri;Landroid/content/ComponentName;)V
+PLcom/android/server/notification/ConditionProviders$ConditionRecord;-><init>(Landroid/net/Uri;Landroid/content/ComponentName;Lcom/android/server/notification/ConditionProviders$ConditionRecord;)V
+PLcom/android/server/notification/ConditionProviders;-><init>(Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/notification/ManagedServices$UserProfiles;)V
+PLcom/android/server/notification/ConditionProviders;->addSystemProvider(Lcom/android/server/notification/SystemConditionProviderService;)V
+PLcom/android/server/notification/ConditionProviders;->asInterface(Landroid/os/IBinder;)Landroid/os/IInterface;
+PLcom/android/server/notification/ConditionProviders;->checkServiceToken(Landroid/service/notification/IConditionProvider;)Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;
+PLcom/android/server/notification/ConditionProviders;->ensureRecordExists(Landroid/content/ComponentName;Landroid/net/Uri;Landroid/service/notification/IConditionProvider;)V
+PLcom/android/server/notification/ConditionProviders;->getConfig()Lcom/android/server/notification/ManagedServices$Config;
+PLcom/android/server/notification/ConditionProviders;->getRecordLocked(Landroid/net/Uri;Landroid/content/ComponentName;Z)Lcom/android/server/notification/ConditionProviders$ConditionRecord;
+PLcom/android/server/notification/ConditionProviders;->getSystemProviders()Ljava/lang/Iterable;
+PLcom/android/server/notification/ConditionProviders;->isSystemProviderEnabled(Ljava/lang/String;)Z
+PLcom/android/server/notification/ConditionProviders;->loadComponentNamesFromSetting(Ljava/lang/String;I)Landroid/util/ArraySet;
+PLcom/android/server/notification/ConditionProviders;->notifyConditions(Ljava/lang/String;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;[Landroid/service/notification/Condition;)V
+PLcom/android/server/notification/ConditionProviders;->onBootPhaseAppsCanStart()V
+PLcom/android/server/notification/ConditionProviders;->onPackagesChanged(Z[Ljava/lang/String;)V
+PLcom/android/server/notification/ConditionProviders;->onServiceAdded(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)V
+PLcom/android/server/notification/ConditionProviders;->onUserSwitched(I)V
+PLcom/android/server/notification/ConditionProviders;->provider(Lcom/android/server/notification/ConditionProviders$ConditionRecord;)Landroid/service/notification/IConditionProvider;
+PLcom/android/server/notification/ConditionProviders;->provider(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Landroid/service/notification/IConditionProvider;
+PLcom/android/server/notification/ConditionProviders;->removeDuplicateConditions(Ljava/lang/String;[Landroid/service/notification/Condition;)[Landroid/service/notification/Condition;
+PLcom/android/server/notification/ConditionProviders;->safeSet([Ljava/lang/Object;)Landroid/util/ArraySet;
+PLcom/android/server/notification/ConditionProviders;->setCallback(Lcom/android/server/notification/ConditionProviders$Callback;)V
+PLcom/android/server/notification/ConditionProviders;->subscribeIfNecessary(Landroid/content/ComponentName;Landroid/net/Uri;)Z
+PLcom/android/server/notification/ConditionProviders;->subscribeLocked(Lcom/android/server/notification/ConditionProviders$ConditionRecord;)V
+PLcom/android/server/notification/CountdownConditionProvider$Receiver;-><init>(Lcom/android/server/notification/CountdownConditionProvider;)V
+PLcom/android/server/notification/CountdownConditionProvider$Receiver;-><init>(Lcom/android/server/notification/CountdownConditionProvider;Lcom/android/server/notification/CountdownConditionProvider$Receiver;)V
+PLcom/android/server/notification/CountdownConditionProvider;-><init>()V
+PLcom/android/server/notification/CountdownConditionProvider;->asInterface()Landroid/service/notification/IConditionProvider;
+PLcom/android/server/notification/CountdownConditionProvider;->attachBase(Landroid/content/Context;)V
+PLcom/android/server/notification/CountdownConditionProvider;->getComponent()Landroid/content/ComponentName;
+PLcom/android/server/notification/CountdownConditionProvider;->isValidConditionId(Landroid/net/Uri;)Z
+PLcom/android/server/notification/CountdownConditionProvider;->onBootComplete()V
+PLcom/android/server/notification/CountdownConditionProvider;->onConnected()V
+PLcom/android/server/notification/EventConditionProvider$1;-><init>(Lcom/android/server/notification/EventConditionProvider;)V
+PLcom/android/server/notification/EventConditionProvider$1;->onChanged()V
+PLcom/android/server/notification/EventConditionProvider$2;-><init>(Lcom/android/server/notification/EventConditionProvider;)V
+PLcom/android/server/notification/EventConditionProvider$2;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/notification/EventConditionProvider$3;-><init>(Lcom/android/server/notification/EventConditionProvider;)V
+PLcom/android/server/notification/EventConditionProvider$3;->run()V
+PLcom/android/server/notification/EventConditionProvider$4;-><init>(Lcom/android/server/notification/EventConditionProvider;)V
+PLcom/android/server/notification/EventConditionProvider;->-get0()Z
+PLcom/android/server/notification/EventConditionProvider;->-get1(Lcom/android/server/notification/EventConditionProvider;)Ljava/lang/Runnable;
+PLcom/android/server/notification/EventConditionProvider;->-get2(Lcom/android/server/notification/EventConditionProvider;)Landroid/os/Handler;
+PLcom/android/server/notification/EventConditionProvider;->-wrap0(Lcom/android/server/notification/EventConditionProvider;)V
+PLcom/android/server/notification/EventConditionProvider;->-wrap1(Lcom/android/server/notification/EventConditionProvider;)V
+PLcom/android/server/notification/EventConditionProvider;-><init>()V
+PLcom/android/server/notification/EventConditionProvider;->asInterface()Landroid/service/notification/IConditionProvider;
+PLcom/android/server/notification/EventConditionProvider;->attachBase(Landroid/content/Context;)V
+PLcom/android/server/notification/EventConditionProvider;->createCondition(Landroid/net/Uri;I)Landroid/service/notification/Condition;
+PLcom/android/server/notification/EventConditionProvider;->evaluateSubscriptions()V
+PLcom/android/server/notification/EventConditionProvider;->evaluateSubscriptionsW()V
+PLcom/android/server/notification/EventConditionProvider;->getComponent()Landroid/content/ComponentName;
+PLcom/android/server/notification/EventConditionProvider;->isValidConditionId(Landroid/net/Uri;)Z
+PLcom/android/server/notification/EventConditionProvider;->onBootComplete()V
+PLcom/android/server/notification/EventConditionProvider;->onConnected()V
+PLcom/android/server/notification/EventConditionProvider;->onSubscribe(Landroid/net/Uri;)V
+PLcom/android/server/notification/EventConditionProvider;->reloadTrackers()V
+PLcom/android/server/notification/EventConditionProvider;->rescheduleAlarm(JJ)V
+PLcom/android/server/notification/EventConditionProvider;->setRegistered(Z)V
+PLcom/android/server/notification/GlobalSortKeyComparator;-><init>()V
+PLcom/android/server/notification/GlobalSortKeyComparator;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+PLcom/android/server/notification/GroupHelper;-><init>(Lcom/android/server/notification/GroupHelper$Callback;)V
+PLcom/android/server/notification/GroupHelper;->adjustAutogroupingSummary(ILjava/lang/String;Ljava/lang/String;Z)V
+PLcom/android/server/notification/GroupHelper;->maybeUngroup(Landroid/service/notification/StatusBarNotification;ZI)V
+PLcom/android/server/notification/GroupHelper;->onNotificationPosted(Landroid/service/notification/StatusBarNotification;)V
+PLcom/android/server/notification/GroupHelper;->onNotificationRemoved(Landroid/service/notification/StatusBarNotification;)V
+PLcom/android/server/notification/ImportanceExtractor;-><init>()V
+PLcom/android/server/notification/ImportanceExtractor;->initialize(Landroid/content/Context;Lcom/android/server/notification/NotificationUsageStats;)V
+PLcom/android/server/notification/ImportanceExtractor;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;
+PLcom/android/server/notification/ImportanceExtractor;->setConfig(Lcom/android/server/notification/RankingConfig;)V
+PLcom/android/server/notification/ManagedServices$1;-><init>(Lcom/android/server/notification/ManagedServices;Ljava/lang/String;IZI)V
+PLcom/android/server/notification/ManagedServices$1;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/notification/ManagedServices$Config;-><init>()V
+PLcom/android/server/notification/ManagedServices$ManagedServiceInfo;-><init>(Lcom/android/server/notification/ManagedServices;Landroid/os/IInterface;Landroid/content/ComponentName;IZLandroid/content/ServiceConnection;I)V
+PLcom/android/server/notification/ManagedServices$ManagedServiceInfo;->enabledAndUserMatches(I)Z
+PLcom/android/server/notification/ManagedServices$ManagedServiceInfo;->getOwner()Lcom/android/server/notification/ManagedServices;
+PLcom/android/server/notification/ManagedServices$ManagedServiceInfo;->isEnabledForCurrentProfiles()Z
+PLcom/android/server/notification/ManagedServices$SettingRestoredReceiver;-><init>(Lcom/android/server/notification/ManagedServices;)V
+PLcom/android/server/notification/ManagedServices$SettingsObserver;->-wrap0(Lcom/android/server/notification/ManagedServices$SettingsObserver;)V
+PLcom/android/server/notification/ManagedServices$SettingsObserver;-><init>(Lcom/android/server/notification/ManagedServices;Landroid/os/Handler;)V
+PLcom/android/server/notification/ManagedServices$SettingsObserver;-><init>(Lcom/android/server/notification/ManagedServices;Landroid/os/Handler;Lcom/android/server/notification/ManagedServices$SettingsObserver;)V
+PLcom/android/server/notification/ManagedServices$SettingsObserver;->observe()V
+PLcom/android/server/notification/ManagedServices$SettingsObserver;->update(Landroid/net/Uri;)V
+PLcom/android/server/notification/ManagedServices$UserProfiles;-><init>()V
+PLcom/android/server/notification/ManagedServices$UserProfiles;->getCurrentProfileIds()[I
+PLcom/android/server/notification/ManagedServices$UserProfiles;->isCurrentProfile(I)Z
+PLcom/android/server/notification/ManagedServices$UserProfiles;->updateCache(Landroid/content/Context;)V
+PLcom/android/server/notification/ManagedServices;->-get0(Lcom/android/server/notification/ManagedServices;)Lcom/android/server/notification/ManagedServices$Config;
+PLcom/android/server/notification/ManagedServices;->-get1(Lcom/android/server/notification/ManagedServices;)Landroid/util/ArraySet;
+PLcom/android/server/notification/ManagedServices;->-get2(Lcom/android/server/notification/ManagedServices;)Ljava/util/ArrayList;
+PLcom/android/server/notification/ManagedServices;->-get3(Lcom/android/server/notification/ManagedServices;)Ljava/util/ArrayList;
+PLcom/android/server/notification/ManagedServices;->-wrap0(Lcom/android/server/notification/ManagedServices;Landroid/os/IInterface;Landroid/content/ComponentName;IZLandroid/content/ServiceConnection;I)Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;
+PLcom/android/server/notification/ManagedServices;->-wrap3(Lcom/android/server/notification/ManagedServices;Z)V
+PLcom/android/server/notification/ManagedServices;->-wrap4(Lcom/android/server/notification/ManagedServices;)V
+PLcom/android/server/notification/ManagedServices;-><init>(Landroid/content/Context;Landroid/os/Handler;Ljava/lang/Object;Lcom/android/server/notification/ManagedServices$UserProfiles;)V
+PLcom/android/server/notification/ManagedServices;->checkNotNull(Landroid/os/IInterface;)V
+PLcom/android/server/notification/ManagedServices;->checkServiceTokenLocked(Landroid/os/IInterface;)Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;
+PLcom/android/server/notification/ManagedServices;->getCaption()Ljava/lang/String;
+PLcom/android/server/notification/ManagedServices;->getServiceFromTokenLocked(Landroid/os/IInterface;)Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;
+PLcom/android/server/notification/ManagedServices;->getServices()Ljava/util/List;
+PLcom/android/server/notification/ManagedServices;->loadComponentNamesFromSetting(Ljava/lang/String;I)Landroid/util/ArraySet;
+PLcom/android/server/notification/ManagedServices;->newServiceInfo(Landroid/os/IInterface;Landroid/content/ComponentName;IZLandroid/content/ServiceConnection;I)Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;
+PLcom/android/server/notification/ManagedServices;->onBootPhaseAppsCanStart()V
+PLcom/android/server/notification/ManagedServices;->onPackagesChanged(Z[Ljava/lang/String;)V
+PLcom/android/server/notification/ManagedServices;->onUserSwitched(I)V
+PLcom/android/server/notification/ManagedServices;->onUserUnlocked(I)V
+PLcom/android/server/notification/ManagedServices;->queryPackageForServices(Ljava/lang/String;I)Ljava/util/Set;
+PLcom/android/server/notification/ManagedServices;->rebindServices(Z)V
+PLcom/android/server/notification/ManagedServices;->rebuildRestoredPackages()V
+PLcom/android/server/notification/ManagedServices;->registerService(Landroid/content/ComponentName;I)V
+PLcom/android/server/notification/ManagedServices;->registerService(Landroid/os/IInterface;Landroid/content/ComponentName;I)V
+PLcom/android/server/notification/ManagedServices;->registerServiceImpl(Landroid/os/IInterface;Landroid/content/ComponentName;I)Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;
+PLcom/android/server/notification/ManagedServices;->registerServiceImpl(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;
+PLcom/android/server/notification/ManagedServices;->registerServiceLocked(Landroid/content/ComponentName;I)V
+PLcom/android/server/notification/ManagedServices;->registerServiceLocked(Landroid/content/ComponentName;IZ)V
+PLcom/android/server/notification/ManagedServices;->removeServiceLocked(I)Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;
+PLcom/android/server/notification/ManagedServices;->restoredSettingName(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/notification/ManagedServices;->setComponentState(Landroid/content/ComponentName;Z)V
+PLcom/android/server/notification/ManagedServices;->unregisterServiceLocked(Landroid/content/ComponentName;I)V
+PLcom/android/server/notification/NotificationComparator$1;-><init>(Lcom/android/server/notification/NotificationComparator;)V
+PLcom/android/server/notification/NotificationComparator;-><init>(Landroid/content/Context;)V
+PLcom/android/server/notification/NotificationComparator;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+PLcom/android/server/notification/NotificationComparator;->isImportantColorized(Lcom/android/server/notification/NotificationRecord;)Z
+PLcom/android/server/notification/NotificationComparator;->isImportantMessaging(Lcom/android/server/notification/NotificationRecord;)Z
+PLcom/android/server/notification/NotificationComparator;->isImportantOngoing(Lcom/android/server/notification/NotificationRecord;)Z
+PLcom/android/server/notification/NotificationComparator;->isImportantPeople(Lcom/android/server/notification/NotificationRecord;)Z
+PLcom/android/server/notification/NotificationComparator;->isOngoing(Lcom/android/server/notification/NotificationRecord;)Z
+PLcom/android/server/notification/NotificationIntrusivenessExtractor$1;-><init>(Lcom/android/server/notification/NotificationIntrusivenessExtractor;Ljava/lang/String;J)V
+PLcom/android/server/notification/NotificationIntrusivenessExtractor$1;->applyChangesLocked(Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationIntrusivenessExtractor$1;->work()V
+PLcom/android/server/notification/NotificationIntrusivenessExtractor;-><init>()V
+PLcom/android/server/notification/NotificationIntrusivenessExtractor;->initialize(Landroid/content/Context;Lcom/android/server/notification/NotificationUsageStats;)V
+PLcom/android/server/notification/NotificationIntrusivenessExtractor;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;
+PLcom/android/server/notification/NotificationIntrusivenessExtractor;->setConfig(Lcom/android/server/notification/RankingConfig;)V
+PLcom/android/server/notification/NotificationManagerService$11;-><init>(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationManagerService$11;->run()V
+PLcom/android/server/notification/NotificationManagerService$12;-><init>(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;IILjava/lang/String;ILjava/lang/String;IIIIZ)V
+PLcom/android/server/notification/NotificationManagerService$12;->run()V
+PLcom/android/server/notification/NotificationManagerService$13;-><init>(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;IILjava/lang/String;IIIIZLjava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService$13;->lambda$-com_android_server_notification_NotificationManagerService$13_194652(III)Z
+PLcom/android/server/notification/NotificationManagerService$13;->run()V
+PLcom/android/server/notification/NotificationManagerService$15;-><init>(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService$1;-><init>(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService$1;->clearEffects()V
+PLcom/android/server/notification/NotificationManagerService$1;->onNotificationExpansionChanged(Ljava/lang/String;ZZ)V
+PLcom/android/server/notification/NotificationManagerService$1;->onNotificationVisibilityChanged([Lcom/android/internal/statusbar/NotificationVisibility;[Lcom/android/internal/statusbar/NotificationVisibility;)V
+PLcom/android/server/notification/NotificationManagerService$1;->onPanelHidden()V
+PLcom/android/server/notification/NotificationManagerService$1;->onPanelRevealed(ZI)V
+PLcom/android/server/notification/NotificationManagerService$1;->onSetDisabled(I)V
+PLcom/android/server/notification/NotificationManagerService$2;-><init>(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService$3;-><init>(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService$3;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/notification/NotificationManagerService$4;-><init>(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService$4;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/notification/NotificationManagerService$5$1;-><init>(Lcom/android/server/notification/NotificationManagerService$5;Ljava/lang/String;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;[Landroid/service/notification/Condition;)V
+PLcom/android/server/notification/NotificationManagerService$5$1;->run()V
+PLcom/android/server/notification/NotificationManagerService$5;-><init>(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService$5;->areNotificationsEnabled(Ljava/lang/String;)Z
+PLcom/android/server/notification/NotificationManagerService$5;->areNotificationsEnabledForPackage(Ljava/lang/String;I)Z
+PLcom/android/server/notification/NotificationManagerService$5;->cancelAllNotifications(Ljava/lang/String;I)V
+PLcom/android/server/notification/NotificationManagerService$5;->createNotificationChannelGroups(Ljava/lang/String;Landroid/content/pm/ParceledListSlice;)V
+PLcom/android/server/notification/NotificationManagerService$5;->createNotificationChannels(Ljava/lang/String;Landroid/content/pm/ParceledListSlice;)V
+PLcom/android/server/notification/NotificationManagerService$5;->createNotificationChannelsImpl(Ljava/lang/String;ILandroid/content/pm/ParceledListSlice;)V
+PLcom/android/server/notification/NotificationManagerService$5;->enforceSystemOrSystemUI(Ljava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService$5;->enqueueNotificationWithTag(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILandroid/app/Notification;I)V
+PLcom/android/server/notification/NotificationManagerService$5;->getActiveNotificationsFromListener(Landroid/service/notification/INotificationListener;[Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/notification/NotificationManagerService$5;->getAppActiveNotifications(Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/notification/NotificationManagerService$5;->getEffectsSuppressor()Landroid/content/ComponentName;
+PLcom/android/server/notification/NotificationManagerService$5;->getNotificationChannel(Ljava/lang/String;Ljava/lang/String;)Landroid/app/NotificationChannel;
+PLcom/android/server/notification/NotificationManagerService$5;->getNotificationChannelGroups(Ljava/lang/String;)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/notification/NotificationManagerService$5;->getNotificationChannels(Ljava/lang/String;)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/notification/NotificationManagerService$5;->getZenMode()I
+PLcom/android/server/notification/NotificationManagerService$5;->getZenModeConfig()Landroid/service/notification/ZenModeConfig;
+PLcom/android/server/notification/NotificationManagerService$5;->isSystemConditionProviderEnabled(Ljava/lang/String;)Z
+PLcom/android/server/notification/NotificationManagerService$5;->notifyConditions(Ljava/lang/String;Landroid/service/notification/IConditionProvider;[Landroid/service/notification/Condition;)V
+PLcom/android/server/notification/NotificationManagerService$5;->registerListener(Landroid/service/notification/INotificationListener;Landroid/content/ComponentName;I)V
+PLcom/android/server/notification/NotificationManagerService$5;->requestUnbindListener(Landroid/service/notification/INotificationListener;)V
+PLcom/android/server/notification/NotificationManagerService$5;->sanitizeSbn(Ljava/lang/String;ILandroid/service/notification/StatusBarNotification;)Landroid/service/notification/StatusBarNotification;
+PLcom/android/server/notification/NotificationManagerService$5;->setNotificationPolicyAccessGranted(Ljava/lang/String;Z)V
+PLcom/android/server/notification/NotificationManagerService$5;->setNotificationsShownFromListener(Landroid/service/notification/INotificationListener;[Ljava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService$6;-><init>(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService$6;->enqueueNotification(Ljava/lang/String;Ljava/lang/String;IILjava/lang/String;ILandroid/app/Notification;I)V
+PLcom/android/server/notification/NotificationManagerService$7;-><init>(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService$7;->onConfigChanged()V
+PLcom/android/server/notification/NotificationManagerService$8;-><init>(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService$8;->removeAutoGroupSummary(ILjava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService$9;-><init>(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService$Archive;-><init>(I)V
+PLcom/android/server/notification/NotificationManagerService$Archive;->record(Landroid/service/notification/StatusBarNotification;)V
+PLcom/android/server/notification/NotificationManagerService$EnqueueNotificationRunnable;-><init>(Lcom/android/server/notification/NotificationManagerService;ILcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationManagerService$EnqueueNotificationRunnable;->run()V
+PLcom/android/server/notification/NotificationManagerService$NotificationAssistants;-><init>(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService$NotificationAssistants;->getConfig()Lcom/android/server/notification/ManagedServices$Config;
+PLcom/android/server/notification/NotificationManagerService$NotificationAssistants;->isEnabled()Z
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners$2;-><init>(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationRankingUpdate;)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners$2;->run()V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners$3;-><init>(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationRankingUpdate;I)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners$3;->run()V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners$7;-><init>(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Ljava/lang/String;Landroid/os/UserHandle;Landroid/app/NotificationChannel;I)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners$7;->run()V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners$8;-><init>(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Ljava/lang/String;Landroid/os/UserHandle;Landroid/app/NotificationChannelGroup;I)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners$8;->run()V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->-wrap3(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationRankingUpdate;)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->-wrap5(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationRankingUpdate;I)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;-><init>(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->asInterface(Landroid/os/IBinder;)Landroid/os/IInterface;
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->getConfig()Lcom/android/server/notification/ManagedServices$Config;
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->getOnNotificationPostedTrim(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)I
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->isListenerPackage(Ljava/lang/String;)Z
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->notifyNotificationChannelChanged(Ljava/lang/String;Landroid/os/UserHandle;Landroid/app/NotificationChannel;I)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->notifyNotificationChannelGroupChanged(Ljava/lang/String;Landroid/os/UserHandle;Landroid/app/NotificationChannelGroup;I)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->notifyPosted(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationRankingUpdate;)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->notifyPostedLocked(Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->notifyRemoved(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationRankingUpdate;I)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->notifyRemovedLocked(Landroid/service/notification/StatusBarNotification;I)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->onServiceAdded(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->onServiceRemovedLocked(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)V
+PLcom/android/server/notification/NotificationManagerService$PolicyAccess;-><init>(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService$PolicyAccess;-><init>(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService$PolicyAccess;)V
+PLcom/android/server/notification/NotificationManagerService$PolicyAccess;->getGrantedPackages()Landroid/util/ArraySet;
+PLcom/android/server/notification/NotificationManagerService$PolicyAccess;->put(Ljava/lang/String;Z)V
+PLcom/android/server/notification/NotificationManagerService$PostNotificationRunnable$1;-><init>(Lcom/android/server/notification/NotificationManagerService$PostNotificationRunnable;Landroid/service/notification/StatusBarNotification;)V
+PLcom/android/server/notification/NotificationManagerService$PostNotificationRunnable$1;->run()V
+PLcom/android/server/notification/NotificationManagerService$PostNotificationRunnable;-><init>(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService$PostNotificationRunnable;->run()V
+PLcom/android/server/notification/NotificationManagerService$RankingHandlerWorker;-><init>(Lcom/android/server/notification/NotificationManagerService;Landroid/os/Looper;)V
+PLcom/android/server/notification/NotificationManagerService$RankingHandlerWorker;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/notification/NotificationManagerService$RankingHandlerWorker;->requestReconsideration(Lcom/android/server/notification/RankingReconsideration;)V
+PLcom/android/server/notification/NotificationManagerService$RankingHandlerWorker;->requestSort(Z)V
+PLcom/android/server/notification/NotificationManagerService$SettingsObserver;-><init>(Lcom/android/server/notification/NotificationManagerService;Landroid/os/Handler;)V
+PLcom/android/server/notification/NotificationManagerService$SettingsObserver;->observe()V
+PLcom/android/server/notification/NotificationManagerService$SettingsObserver;->update(Landroid/net/Uri;)V
+PLcom/android/server/notification/NotificationManagerService$StatusBarNotificationHolder;-><init>(Landroid/service/notification/StatusBarNotification;)V
+PLcom/android/server/notification/NotificationManagerService$StatusBarNotificationHolder;->get()Landroid/service/notification/StatusBarNotification;
+PLcom/android/server/notification/NotificationManagerService$TrimCache;-><init>(Lcom/android/server/notification/NotificationManagerService;Landroid/service/notification/StatusBarNotification;)V
+PLcom/android/server/notification/NotificationManagerService$TrimCache;->ForListener(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Landroid/service/notification/StatusBarNotification;
+PLcom/android/server/notification/NotificationManagerService$WorkerHandler;-><init>(Lcom/android/server/notification/NotificationManagerService;Landroid/os/Looper;)V
+PLcom/android/server/notification/NotificationManagerService$WorkerHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/notification/NotificationManagerService;->-get1()I
+PLcom/android/server/notification/NotificationManagerService;->-get10(Lcom/android/server/notification/NotificationManagerService;)Landroid/os/Handler;
+PLcom/android/server/notification/NotificationManagerService;->-get16(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationManagerService$NotificationListeners;
+PLcom/android/server/notification/NotificationManagerService;->-get17(Lcom/android/server/notification/NotificationManagerService;)F
+PLcom/android/server/notification/NotificationManagerService;->-get18(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;
+PLcom/android/server/notification/NotificationManagerService;->-get19(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/lights/Light;
+PLcom/android/server/notification/NotificationManagerService;->-get2()I
+PLcom/android/server/notification/NotificationManagerService;->-get20(Lcom/android/server/notification/NotificationManagerService;)Z
+PLcom/android/server/notification/NotificationManagerService;->-get21(Lcom/android/server/notification/NotificationManagerService;)Landroid/content/pm/IPackageManager;
+PLcom/android/server/notification/NotificationManagerService;->-get24(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/RankingHelper;
+PLcom/android/server/notification/NotificationManagerService;->-get25(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationManagerService$SettingsObserver;
+PLcom/android/server/notification/NotificationManagerService;->-get26(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/SnoozeHelper;
+PLcom/android/server/notification/NotificationManagerService;->-get27(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationUsageStats;
+PLcom/android/server/notification/NotificationManagerService;->-get28(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/ManagedServices$UserProfiles;
+PLcom/android/server/notification/NotificationManagerService;->-get30(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/ZenModeHelper;
+PLcom/android/server/notification/NotificationManagerService;->-get4(Lcom/android/server/notification/NotificationManagerService;)Landroid/app/usage/UsageStatsManagerInternal;
+PLcom/android/server/notification/NotificationManagerService;->-get7(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/ConditionProviders;
+PLcom/android/server/notification/NotificationManagerService;->-get8(Lcom/android/server/notification/NotificationManagerService;)Ljava/util/List;
+PLcom/android/server/notification/NotificationManagerService;->-get9(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/GroupHelper;
+PLcom/android/server/notification/NotificationManagerService;->-set1(Lcom/android/server/notification/NotificationManagerService;Z)Z
+PLcom/android/server/notification/NotificationManagerService;->-set4(Lcom/android/server/notification/NotificationManagerService;F)F
+PLcom/android/server/notification/NotificationManagerService;->-wrap0(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Landroid/service/notification/NotificationRankingUpdate;
+PLcom/android/server/notification/NotificationManagerService;->-wrap12(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationManagerService;->-wrap13(Lcom/android/server/notification/NotificationManagerService;Ljava/util/ArrayList;IILjava/lang/String;ZLjava/lang/String;Lcom/android/server/notification/NotificationManagerService$FlagChecker;ZIZILjava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService;->-wrap14(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;IILjava/lang/String;Z)V
+PLcom/android/server/notification/NotificationManagerService;->-wrap15(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;ZI)V
+PLcom/android/server/notification/NotificationManagerService;->-wrap17(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService;->-wrap19(Lcom/android/server/notification/NotificationManagerService;ILjava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService;->-wrap2(Lcom/android/server/notification/NotificationManagerService;Landroid/service/notification/StatusBarNotification;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Z
+PLcom/android/server/notification/NotificationManagerService;->-wrap20(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService;->-wrap21(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService;->-wrap22(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService;->-wrap26(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;II)V
+PLcom/android/server/notification/NotificationManagerService;->-wrap29(Lcom/android/server/notification/NotificationManagerService;Landroid/os/Message;)V
+PLcom/android/server/notification/NotificationManagerService;->-wrap3(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Z
+PLcom/android/server/notification/NotificationManagerService;->-wrap30(Lcom/android/server/notification/NotificationManagerService;Landroid/os/Message;)V
+PLcom/android/server/notification/NotificationManagerService;->-wrap31(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService;->-wrap8(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;)Ljava/lang/String;
+PLcom/android/server/notification/NotificationManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/notification/NotificationManagerService;->applyZenModeLocked(Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationManagerService;->buzzBeepBlinkLocked(Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationManagerService;->cancelAllNotificationsByListLocked(Ljava/util/ArrayList;IILjava/lang/String;ZLjava/lang/String;Lcom/android/server/notification/NotificationManagerService$FlagChecker;ZIZILjava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService;->cancelAllNotificationsInt(IILjava/lang/String;Ljava/lang/String;IIZIILcom/android/server/notification/ManagedServices$ManagedServiceInfo;)V
+PLcom/android/server/notification/NotificationManagerService;->cancelGroupChildrenLocked(Lcom/android/server/notification/NotificationRecord;IILjava/lang/String;Z)V
+PLcom/android/server/notification/NotificationManagerService;->cancelNotification(IILjava/lang/String;Ljava/lang/String;IIIZIILcom/android/server/notification/ManagedServices$ManagedServiceInfo;)V
+PLcom/android/server/notification/NotificationManagerService;->cancelNotificationLocked(Lcom/android/server/notification/NotificationRecord;ZI)V
+PLcom/android/server/notification/NotificationManagerService;->checkCallerIsSystemOrSameApp(Ljava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService;->checkDisqualifyingFeatures(IIILjava/lang/String;Lcom/android/server/notification/NotificationRecord;)Z
+PLcom/android/server/notification/NotificationManagerService;->clamp(III)I
+PLcom/android/server/notification/NotificationManagerService;->clearAutogroupSummaryLocked(ILjava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService;->clearLightsLocked()V
+PLcom/android/server/notification/NotificationManagerService;->clearSoundLocked()V
+PLcom/android/server/notification/NotificationManagerService;->clearVibrateLocked()V
+PLcom/android/server/notification/NotificationManagerService;->disableNotificationEffects(Lcom/android/server/notification/NotificationRecord;)Ljava/lang/String;
+PLcom/android/server/notification/NotificationManagerService;->enqueueNotificationInternal(Ljava/lang/String;Ljava/lang/String;IILjava/lang/String;ILandroid/app/Notification;I)V
+PLcom/android/server/notification/NotificationManagerService;->findNotificationByListLocked(Ljava/util/ArrayList;Ljava/lang/String;)Lcom/android/server/notification/NotificationRecord;
+PLcom/android/server/notification/NotificationManagerService;->findNotificationByListLocked(Ljava/util/ArrayList;Ljava/lang/String;Ljava/lang/String;II)Lcom/android/server/notification/NotificationRecord;
+PLcom/android/server/notification/NotificationManagerService;->findNotificationLocked(Ljava/lang/String;Ljava/lang/String;II)Lcom/android/server/notification/NotificationRecord;
+PLcom/android/server/notification/NotificationManagerService;->findNotificationRecordIndexLocked(Lcom/android/server/notification/NotificationRecord;)I
+PLcom/android/server/notification/NotificationManagerService;->getCompanionManager()Landroid/companion/ICompanionDeviceManager;
+PLcom/android/server/notification/NotificationManagerService;->getLongArray(Landroid/content/res/Resources;II[J)[J
+PLcom/android/server/notification/NotificationManagerService;->handleGroupedNotificationLocked(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;II)V
+PLcom/android/server/notification/NotificationManagerService;->handleRankingReconsideration(Landroid/os/Message;)V
+PLcom/android/server/notification/NotificationManagerService;->handleRankingSort(Landroid/os/Message;)V
+PLcom/android/server/notification/NotificationManagerService;->handleSavePolicyFile()V
+PLcom/android/server/notification/NotificationManagerService;->indexOfNotificationLocked(Ljava/lang/String;)I
+PLcom/android/server/notification/NotificationManagerService;->init(Landroid/os/Looper;Landroid/content/pm/IPackageManager;Landroid/content/pm/PackageManager;Lcom/android/server/lights/LightsManager;Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Landroid/companion/ICompanionDeviceManager;Lcom/android/server/notification/SnoozeHelper;Lcom/android/server/notification/NotificationUsageStats;)V
+PLcom/android/server/notification/NotificationManagerService;->isBlocked(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationUsageStats;)Z
+PLcom/android/server/notification/NotificationManagerService;->isCallerInstantApp(Ljava/lang/String;)Z
+PLcom/android/server/notification/NotificationManagerService;->isCallingUidSystem()Z
+PLcom/android/server/notification/NotificationManagerService;->isNotificationForCurrentUser(Lcom/android/server/notification/NotificationRecord;)Z
+PLcom/android/server/notification/NotificationManagerService;->isPackageSuspendedForUser(Ljava/lang/String;I)Z
+PLcom/android/server/notification/NotificationManagerService;->isUidSystemOrPhone(I)Z
+PLcom/android/server/notification/NotificationManagerService;->isVisibleToListener(Landroid/service/notification/StatusBarNotification;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Z
+PLcom/android/server/notification/NotificationManagerService;->listenForCallState()V
+PLcom/android/server/notification/NotificationManagerService;->loadPolicyFile()V
+PLcom/android/server/notification/NotificationManagerService;->notificationMatchesUserId(Lcom/android/server/notification/NotificationRecord;I)Z
+PLcom/android/server/notification/NotificationManagerService;->onBootPhase(I)V
+PLcom/android/server/notification/NotificationManagerService;->onStart()V
+PLcom/android/server/notification/NotificationManagerService;->readPolicyXml(Ljava/io/InputStream;Z)V
+PLcom/android/server/notification/NotificationManagerService;->recordCallerLocked(Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationManagerService;->removeDisabledHints(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Z
+PLcom/android/server/notification/NotificationManagerService;->removeDisabledHints(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;I)Z
+PLcom/android/server/notification/NotificationManagerService;->resolveNotificationUid(Ljava/lang/String;II)I
+PLcom/android/server/notification/NotificationManagerService;->savePolicyFile()V
+PLcom/android/server/notification/NotificationManagerService;->scheduleTimeoutLocked(Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationManagerService;->sendAccessibilityEvent(Landroid/app/Notification;Ljava/lang/CharSequence;)V
+PLcom/android/server/notification/NotificationManagerService;->updateLightsLocked()V
+PLcom/android/server/notification/NotificationManagerService;->writePolicyXml(Ljava/io/OutputStream;Z)V
+PLcom/android/server/notification/NotificationRecord;-><init>(Landroid/content/Context;Landroid/service/notification/StatusBarNotification;Landroid/app/NotificationChannel;)V
+PLcom/android/server/notification/NotificationRecord;->applyUserImportance()V
+PLcom/android/server/notification/NotificationRecord;->calculateAttributes()Landroid/media/AudioAttributes;
+PLcom/android/server/notification/NotificationRecord;->calculateImportance()I
+PLcom/android/server/notification/NotificationRecord;->calculateLights()Lcom/android/server/notification/NotificationRecord$Light;
+PLcom/android/server/notification/NotificationRecord;->calculateRankingTimeMs(J)J
+PLcom/android/server/notification/NotificationRecord;->calculateSound()Landroid/net/Uri;
+PLcom/android/server/notification/NotificationRecord;->calculateVibration()[J
+PLcom/android/server/notification/NotificationRecord;->canShowBadge()Z
+PLcom/android/server/notification/NotificationRecord;->copyRankingInformation(Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationRecord;->getAuthoritativeRank()I
+PLcom/android/server/notification/NotificationRecord;->getChannel()Landroid/app/NotificationChannel;
+PLcom/android/server/notification/NotificationRecord;->getChannelIdLogTag()Ljava/lang/String;
+PLcom/android/server/notification/NotificationRecord;->getContactAffinity()F
+PLcom/android/server/notification/NotificationRecord;->getExposureMs(J)I
+PLcom/android/server/notification/NotificationRecord;->getFlags()I
+PLcom/android/server/notification/NotificationRecord;->getFreshnessMs(J)I
+PLcom/android/server/notification/NotificationRecord;->getGroupKey()Ljava/lang/String;
+PLcom/android/server/notification/NotificationRecord;->getGroupLogTag()Ljava/lang/String;
+PLcom/android/server/notification/NotificationRecord;->getImportanceExplanation()Ljava/lang/CharSequence;
+PLcom/android/server/notification/NotificationRecord;->getKey()Ljava/lang/String;
+PLcom/android/server/notification/NotificationRecord;->getLastIntrusive()J
+PLcom/android/server/notification/NotificationRecord;->getLifespanMs(J)I
+PLcom/android/server/notification/NotificationRecord;->getLight()Lcom/android/server/notification/NotificationRecord$Light;
+PLcom/android/server/notification/NotificationRecord;->getLogMaker(J)Landroid/metrics/LogMaker;
+PLcom/android/server/notification/NotificationRecord;->getPackagePriority()I
+PLcom/android/server/notification/NotificationRecord;->getPackageVisibilityOverride()I
+PLcom/android/server/notification/NotificationRecord;->getPeopleOverride()Ljava/util/ArrayList;
+PLcom/android/server/notification/NotificationRecord;->getRankingTimeMs()J
+PLcom/android/server/notification/NotificationRecord;->getSnoozeCriteria()Ljava/util/ArrayList;
+PLcom/android/server/notification/NotificationRecord;->getSuppressedVisualEffects()I
+PLcom/android/server/notification/NotificationRecord;->getUser()Landroid/os/UserHandle;
+PLcom/android/server/notification/NotificationRecord;->getUserExplanation()Ljava/lang/String;
+PLcom/android/server/notification/NotificationRecord;->getUserId()I
+PLcom/android/server/notification/NotificationRecord;->isCategory(Ljava/lang/String;)Z
+PLcom/android/server/notification/NotificationRecord;->isIntercepted()Z
+PLcom/android/server/notification/NotificationRecord;->isPreChannelsNotification()Z
+PLcom/android/server/notification/NotificationRecord;->isRecentlyIntrusive()Z
+PLcom/android/server/notification/NotificationRecord;->isSeen()Z
+PLcom/android/server/notification/NotificationRecord;->setAuthoritativeRank(I)V
+PLcom/android/server/notification/NotificationRecord;->setContactAffinity(F)V
+PLcom/android/server/notification/NotificationRecord;->setGlobalSortKey(Ljava/lang/String;)V
+PLcom/android/server/notification/NotificationRecord;->setIntercepted(Z)Z
+PLcom/android/server/notification/NotificationRecord;->setPackagePriority(I)V
+PLcom/android/server/notification/NotificationRecord;->setPackageVisibilityOverride(I)V
+PLcom/android/server/notification/NotificationRecord;->setRecentlyIntrusive(Z)V
+PLcom/android/server/notification/NotificationRecord;->setSeen()V
+PLcom/android/server/notification/NotificationRecord;->setShowBadge(Z)V
+PLcom/android/server/notification/NotificationRecord;->setSuppressedVisualEffects(I)V
+PLcom/android/server/notification/NotificationRecord;->setUserImportance(I)V
+PLcom/android/server/notification/NotificationRecord;->setVisibility(ZI)V
+PLcom/android/server/notification/NotificationRecord;->shortenTag(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/notification/NotificationUsageStats$1;-><init>(Lcom/android/server/notification/NotificationUsageStats;Landroid/os/Looper;)V
+PLcom/android/server/notification/NotificationUsageStats$AggregatedStats;-><init>(Landroid/content/Context;Ljava/lang/String;)V
+PLcom/android/server/notification/NotificationUsageStats$AggregatedStats;->countApiUse(Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationUsageStats$AggregatedStats;->getEnqueueRate(J)F
+PLcom/android/server/notification/NotificationUsageStats$AggregatedStats;->updateInterarrivalEstimate(J)V
+PLcom/android/server/notification/NotificationUsageStats$ImportanceHistogram;-><init>(Landroid/content/Context;Ljava/lang/String;)V
+PLcom/android/server/notification/NotificationUsageStats$ImportanceHistogram;->increment(I)V
+PLcom/android/server/notification/NotificationUsageStats$SQLiteLog$1;-><init>(Lcom/android/server/notification/NotificationUsageStats$SQLiteLog;Landroid/os/Looper;)V
+PLcom/android/server/notification/NotificationUsageStats$SQLiteLog$1;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/notification/NotificationUsageStats$SQLiteLog$2;-><init>(Lcom/android/server/notification/NotificationUsageStats$SQLiteLog;Landroid/content/Context;Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$CursorFactory;I)V
+PLcom/android/server/notification/NotificationUsageStats$SQLiteLog;->-wrap0(Lcom/android/server/notification/NotificationUsageStats$SQLiteLog;JILcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationUsageStats$SQLiteLog;-><init>(Landroid/content/Context;)V
+PLcom/android/server/notification/NotificationUsageStats$SQLiteLog;->logPosted(Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationUsageStats$SQLiteLog;->logRemoved(Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationUsageStats$SQLiteLog;->pruneIfNecessary(Landroid/database/sqlite/SQLiteDatabase;)V
+PLcom/android/server/notification/NotificationUsageStats$SQLiteLog;->putNotificationDetails(Lcom/android/server/notification/NotificationRecord;Landroid/content/ContentValues;)V
+PLcom/android/server/notification/NotificationUsageStats$SQLiteLog;->putNotificationIdentifiers(Lcom/android/server/notification/NotificationRecord;Landroid/content/ContentValues;)V
+PLcom/android/server/notification/NotificationUsageStats$SQLiteLog;->putPosttimeVisibility(Lcom/android/server/notification/NotificationRecord;Landroid/content/ContentValues;)V
+PLcom/android/server/notification/NotificationUsageStats$SQLiteLog;->writeEvent(JILcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationUsageStats$SingleNotificationStats;-><init>()V
+PLcom/android/server/notification/NotificationUsageStats$SingleNotificationStats;->finish()V
+PLcom/android/server/notification/NotificationUsageStats$SingleNotificationStats;->getCurrentAirtimeExpandedMs()J
+PLcom/android/server/notification/NotificationUsageStats$SingleNotificationStats;->getCurrentAirtimeMs()J
+PLcom/android/server/notification/NotificationUsageStats$SingleNotificationStats;->getCurrentPosttimeMs()J
+PLcom/android/server/notification/NotificationUsageStats$SingleNotificationStats;->onExpansionChanged(ZZ)V
+PLcom/android/server/notification/NotificationUsageStats$SingleNotificationStats;->onRemoved()V
+PLcom/android/server/notification/NotificationUsageStats$SingleNotificationStats;->onVisibilityChanged(Z)V
+PLcom/android/server/notification/NotificationUsageStats$SingleNotificationStats;->updateFrom(Lcom/android/server/notification/NotificationUsageStats$SingleNotificationStats;)V
+PLcom/android/server/notification/NotificationUsageStats$SingleNotificationStats;->updateVisiblyExpandedStats()V
+PLcom/android/server/notification/NotificationUsageStats;-><init>(Landroid/content/Context;)V
+PLcom/android/server/notification/NotificationUsageStats;->getAggregatedStatsLocked(Lcom/android/server/notification/NotificationRecord;)[Lcom/android/server/notification/NotificationUsageStats$AggregatedStats;
+PLcom/android/server/notification/NotificationUsageStats;->getAggregatedStatsLocked(Ljava/lang/String;)[Lcom/android/server/notification/NotificationUsageStats$AggregatedStats;
+PLcom/android/server/notification/NotificationUsageStats;->getAppEnqueueRate(Ljava/lang/String;)F
+PLcom/android/server/notification/NotificationUsageStats;->registerEnqueuedByApp(Ljava/lang/String;)V
+PLcom/android/server/notification/NotificationUsageStats;->registerPeopleAffinity(Lcom/android/server/notification/NotificationRecord;ZZZ)V
+PLcom/android/server/notification/NotificationUsageStats;->registerPostedByApp(Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationUsageStats;->registerRemovedByApp(Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationUsageStats;->registerUpdatedByApp(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationUsageStats;->releaseAggregatedStatsLocked([Lcom/android/server/notification/NotificationUsageStats$AggregatedStats;)V
+PLcom/android/server/notification/PriorityExtractor;-><init>()V
+PLcom/android/server/notification/PriorityExtractor;->initialize(Landroid/content/Context;Lcom/android/server/notification/NotificationUsageStats;)V
+PLcom/android/server/notification/PriorityExtractor;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;
+PLcom/android/server/notification/PriorityExtractor;->setConfig(Lcom/android/server/notification/RankingConfig;)V
+PLcom/android/server/notification/PropConfig;->getStringArray(Landroid/content/Context;Ljava/lang/String;I)[Ljava/lang/String;
+PLcom/android/server/notification/RankingHelper$Record;-><init>()V
+PLcom/android/server/notification/RankingHelper$Record;-><init>(Lcom/android/server/notification/RankingHelper$Record;)V
+PLcom/android/server/notification/RankingHelper;-><init>(Landroid/content/Context;Landroid/content/pm/PackageManager;Lcom/android/server/notification/RankingHandler;Lcom/android/server/notification/NotificationUsageStats;[Ljava/lang/String;)V
+PLcom/android/server/notification/RankingHelper;->badgingEnabled(Landroid/os/UserHandle;)Z
+PLcom/android/server/notification/RankingHelper;->canShowBadge(Ljava/lang/String;I)Z
+PLcom/android/server/notification/RankingHelper;->createDefaultChannelIfNeeded(Lcom/android/server/notification/RankingHelper$Record;)V
+PLcom/android/server/notification/RankingHelper;->createNotificationChannel(Ljava/lang/String;ILandroid/app/NotificationChannel;Z)V
+PLcom/android/server/notification/RankingHelper;->createNotificationChannelGroup(Ljava/lang/String;ILandroid/app/NotificationChannelGroup;Z)V
+PLcom/android/server/notification/RankingHelper;->deleteDefaultChannelIfNeeded(Lcom/android/server/notification/RankingHelper$Record;)V
+PLcom/android/server/notification/RankingHelper;->extractSignals(Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/RankingHelper;->getChannelLog(Landroid/app/NotificationChannel;Ljava/lang/String;)Landroid/metrics/LogMaker;
+PLcom/android/server/notification/RankingHelper;->getImportance(Ljava/lang/String;I)I
+PLcom/android/server/notification/RankingHelper;->getNotificationChannel(Ljava/lang/String;ILjava/lang/String;Z)Landroid/app/NotificationChannel;
+PLcom/android/server/notification/RankingHelper;->getNotificationChannelGroups(Ljava/lang/String;I)Ljava/util/Collection;
+PLcom/android/server/notification/RankingHelper;->getNotificationChannels(Ljava/lang/String;IZ)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/notification/RankingHelper;->getOrCreateRecord(Ljava/lang/String;I)Lcom/android/server/notification/RankingHelper$Record;
+PLcom/android/server/notification/RankingHelper;->getRecord(Ljava/lang/String;I)Lcom/android/server/notification/RankingHelper$Record;
+PLcom/android/server/notification/RankingHelper;->indexOf(Ljava/util/ArrayList;Lcom/android/server/notification/NotificationRecord;)I
+PLcom/android/server/notification/RankingHelper;->onPackagesChanged(ZI[Ljava/lang/String;[I)V
+PLcom/android/server/notification/RankingHelper;->safeBool(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;Z)Z
+PLcom/android/server/notification/RankingHelper;->shouldHaveDefaultChannel(Lcom/android/server/notification/RankingHelper$Record;)Z
+PLcom/android/server/notification/RankingHelper;->updateBadgingEnabled()V
+PLcom/android/server/notification/RankingHelper;->updateConfig()V
+PLcom/android/server/notification/RankingReconsideration;-><init>(Ljava/lang/String;J)V
+PLcom/android/server/notification/RankingReconsideration;->getDelay(Ljava/util/concurrent/TimeUnit;)J
+PLcom/android/server/notification/RankingReconsideration;->getKey()Ljava/lang/String;
+PLcom/android/server/notification/RankingReconsideration;->run()V
+PLcom/android/server/notification/RateEstimator;-><init>()V
+PLcom/android/server/notification/RateEstimator;->getInterarrivalEstimate(J)D
+PLcom/android/server/notification/RateEstimator;->getRate(J)F
+PLcom/android/server/notification/RateEstimator;->update(J)F
+PLcom/android/server/notification/ScheduleCalendar;-><init>()V
+PLcom/android/server/notification/ScheduleCalendar;->addDays(JI)J
+PLcom/android/server/notification/ScheduleCalendar;->getDayOfWeek(J)I
+PLcom/android/server/notification/ScheduleCalendar;->getNextChangeTime(J)J
+PLcom/android/server/notification/ScheduleCalendar;->getNextTime(JII)J
+PLcom/android/server/notification/ScheduleCalendar;->getTime(JII)J
+PLcom/android/server/notification/ScheduleCalendar;->isInSchedule(IJJJ)Z
+PLcom/android/server/notification/ScheduleCalendar;->isInSchedule(J)Z
+PLcom/android/server/notification/ScheduleCalendar;->maybeSetNextAlarm(JJ)V
+PLcom/android/server/notification/ScheduleCalendar;->setSchedule(Landroid/service/notification/ZenModeConfig$ScheduleInfo;)V
+PLcom/android/server/notification/ScheduleCalendar;->setTimeZone(Ljava/util/TimeZone;)V
+PLcom/android/server/notification/ScheduleCalendar;->updateDays()V
+PLcom/android/server/notification/ScheduleConditionProvider$1;-><init>(Lcom/android/server/notification/ScheduleConditionProvider;)V
+PLcom/android/server/notification/ScheduleConditionProvider$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/notification/ScheduleConditionProvider;->-wrap0(Lcom/android/server/notification/ScheduleConditionProvider;)V
+PLcom/android/server/notification/ScheduleConditionProvider;-><init>()V
+PLcom/android/server/notification/ScheduleConditionProvider;->asInterface()Landroid/service/notification/IConditionProvider;
+PLcom/android/server/notification/ScheduleConditionProvider;->attachBase(Landroid/content/Context;)V
+PLcom/android/server/notification/ScheduleConditionProvider;->createCondition(Landroid/net/Uri;ILjava/lang/String;)Landroid/service/notification/Condition;
+PLcom/android/server/notification/ScheduleConditionProvider;->evaluateSubscriptions()V
+PLcom/android/server/notification/ScheduleConditionProvider;->getComponent()Landroid/content/ComponentName;
+PLcom/android/server/notification/ScheduleConditionProvider;->getNextAlarm()J
+PLcom/android/server/notification/ScheduleConditionProvider;->isValidConditionId(Landroid/net/Uri;)Z
+PLcom/android/server/notification/ScheduleConditionProvider;->onBootComplete()V
+PLcom/android/server/notification/ScheduleConditionProvider;->onConnected()V
+PLcom/android/server/notification/ScheduleConditionProvider;->onSubscribe(Landroid/net/Uri;)V
+PLcom/android/server/notification/ScheduleConditionProvider;->readSnoozed()V
+PLcom/android/server/notification/ScheduleConditionProvider;->removeSnoozed(Landroid/net/Uri;)V
+PLcom/android/server/notification/ScheduleConditionProvider;->saveSnoozedLocked()V
+PLcom/android/server/notification/ScheduleConditionProvider;->setRegistered(Z)V
+PLcom/android/server/notification/ScheduleConditionProvider;->toScheduleCalendar(Landroid/net/Uri;)Lcom/android/server/notification/ScheduleCalendar;
+PLcom/android/server/notification/ScheduleConditionProvider;->updateAlarm(JJ)V
+PLcom/android/server/notification/SnoozeHelper$1;-><init>(Lcom/android/server/notification/SnoozeHelper;)V
+PLcom/android/server/notification/SnoozeHelper;-><init>(Landroid/content/Context;Lcom/android/server/notification/SnoozeHelper$Callback;Lcom/android/server/notification/ManagedServices$UserProfiles;)V
+PLcom/android/server/notification/SnoozeHelper;->cancel(ILjava/lang/String;)Z
+PLcom/android/server/notification/SnoozeHelper;->cancel(ILjava/lang/String;Ljava/lang/String;I)Z
+PLcom/android/server/notification/SnoozeHelper;->getSnoozed(ILjava/lang/String;)Ljava/util/Collection;
+PLcom/android/server/notification/SnoozeHelper;->isSnoozed(ILjava/lang/String;Ljava/lang/String;)Z
+PLcom/android/server/notification/SystemConditionProviderService;-><init>()V
+PLcom/android/server/notification/SystemConditionProviderService;->formatDuration(J)Ljava/lang/String;
+PLcom/android/server/notification/SystemConditionProviderService;->ts(J)Ljava/lang/String;
+PLcom/android/server/notification/ValidateNotificationPeople$1;-><init>(Lcom/android/server/notification/ValidateNotificationPeople;Landroid/os/Handler;)V
+PLcom/android/server/notification/ValidateNotificationPeople;-><init>()V
+PLcom/android/server/notification/ValidateNotificationPeople;->getContextAsUser(Landroid/os/UserHandle;)Landroid/content/Context;
+PLcom/android/server/notification/ValidateNotificationPeople;->getExtraPeople(Landroid/os/Bundle;)[Ljava/lang/String;
+PLcom/android/server/notification/ValidateNotificationPeople;->initialize(Landroid/content/Context;Lcom/android/server/notification/NotificationUsageStats;)V
+PLcom/android/server/notification/ValidateNotificationPeople;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;
+PLcom/android/server/notification/ValidateNotificationPeople;->setConfig(Lcom/android/server/notification/RankingConfig;)V
+PLcom/android/server/notification/ValidateNotificationPeople;->validatePeople(Landroid/content/Context;Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;
+PLcom/android/server/notification/ValidateNotificationPeople;->validatePeople(Landroid/content/Context;Ljava/lang/String;Landroid/os/Bundle;Ljava/util/List;[F)Lcom/android/server/notification/ValidateNotificationPeople$PeopleRankingReconsideration;
+PLcom/android/server/notification/VisibilityExtractor;-><init>()V
+PLcom/android/server/notification/VisibilityExtractor;->initialize(Landroid/content/Context;Lcom/android/server/notification/NotificationUsageStats;)V
+PLcom/android/server/notification/VisibilityExtractor;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;
+PLcom/android/server/notification/VisibilityExtractor;->setConfig(Lcom/android/server/notification/RankingConfig;)V
+PLcom/android/server/notification/ZenLog;->append(ILjava/lang/String;)V
+PLcom/android/server/notification/ZenLog;->ringerModeToString(I)Ljava/lang/String;
+PLcom/android/server/notification/ZenLog;->subscribeResult(Landroid/service/notification/IConditionProvider;Landroid/os/RemoteException;)Ljava/lang/String;
+PLcom/android/server/notification/ZenLog;->traceConfig(Ljava/lang/String;Landroid/service/notification/ZenModeConfig;Landroid/service/notification/ZenModeConfig;)V
+PLcom/android/server/notification/ZenLog;->traceSetRingerModeInternal(IILjava/lang/String;II)V
+PLcom/android/server/notification/ZenLog;->traceSetZenMode(ILjava/lang/String;)V
+PLcom/android/server/notification/ZenLog;->traceSubscribe(Landroid/net/Uri;Landroid/service/notification/IConditionProvider;Landroid/os/RemoteException;)V
+PLcom/android/server/notification/ZenLog;->typeToString(I)Ljava/lang/String;
+PLcom/android/server/notification/ZenLog;->zenModeToString(I)Ljava/lang/String;
+PLcom/android/server/notification/ZenModeConditions;-><init>(Lcom/android/server/notification/ZenModeHelper;Lcom/android/server/notification/ConditionProviders;)V
+PLcom/android/server/notification/ZenModeConditions;->evaluateConfig(Landroid/service/notification/ZenModeConfig;Z)V
+PLcom/android/server/notification/ZenModeConditions;->evaluateRule(Landroid/service/notification/ZenModeConfig$ZenRule;Landroid/util/ArraySet;Z)V
+PLcom/android/server/notification/ZenModeConditions;->onBootComplete()V
+PLcom/android/server/notification/ZenModeConditions;->onConditionChanged(Landroid/net/Uri;Landroid/service/notification/Condition;)V
+PLcom/android/server/notification/ZenModeConditions;->onServiceAdded(Landroid/content/ComponentName;)V
+PLcom/android/server/notification/ZenModeConditions;->onUserSwitched()V
+PLcom/android/server/notification/ZenModeConditions;->updateCondition(Landroid/net/Uri;Landroid/service/notification/Condition;Landroid/service/notification/ZenModeConfig$ZenRule;)Z
+PLcom/android/server/notification/ZenModeConditions;->updateSnoozing(Landroid/service/notification/ZenModeConfig$ZenRule;)Z
+PLcom/android/server/notification/ZenModeFiltering$RepeatCallers;-><init>()V
+PLcom/android/server/notification/ZenModeFiltering$RepeatCallers;-><init>(Lcom/android/server/notification/ZenModeFiltering$RepeatCallers;)V
+PLcom/android/server/notification/ZenModeFiltering;-><init>(Landroid/content/Context;)V
+PLcom/android/server/notification/ZenModeFiltering;->isCall(Lcom/android/server/notification/NotificationRecord;)Z
+PLcom/android/server/notification/ZenModeFiltering;->isDefaultPhoneApp(Ljava/lang/String;)Z
+PLcom/android/server/notification/ZenModeFiltering;->isSystem(Lcom/android/server/notification/NotificationRecord;)Z
+PLcom/android/server/notification/ZenModeFiltering;->shouldIntercept(ILandroid/service/notification/ZenModeConfig;Lcom/android/server/notification/NotificationRecord;)Z
+PLcom/android/server/notification/ZenModeHelper$Callback;-><init>()V
+PLcom/android/server/notification/ZenModeHelper$Callback;->onConfigChanged()V
+PLcom/android/server/notification/ZenModeHelper$H$ConfigMessageData;-><init>(Lcom/android/server/notification/ZenModeHelper$H;Landroid/service/notification/ZenModeConfig;Ljava/lang/String;Z)V
+PLcom/android/server/notification/ZenModeHelper$H;->-wrap0(Lcom/android/server/notification/ZenModeHelper$H;Landroid/service/notification/ZenModeConfig;Ljava/lang/String;Z)V
+PLcom/android/server/notification/ZenModeHelper$H;->-wrap2(Lcom/android/server/notification/ZenModeHelper$H;)V
+PLcom/android/server/notification/ZenModeHelper$H;-><init>(Lcom/android/server/notification/ZenModeHelper;Landroid/os/Looper;)V
+PLcom/android/server/notification/ZenModeHelper$H;-><init>(Lcom/android/server/notification/ZenModeHelper;Landroid/os/Looper;Lcom/android/server/notification/ZenModeHelper$H;)V
+PLcom/android/server/notification/ZenModeHelper$H;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/notification/ZenModeHelper$H;->postApplyConfig(Landroid/service/notification/ZenModeConfig;Ljava/lang/String;Z)V
+PLcom/android/server/notification/ZenModeHelper$H;->postMetricsTimer()V
+PLcom/android/server/notification/ZenModeHelper$Metrics;-><init>(Lcom/android/server/notification/ZenModeHelper;)V
+PLcom/android/server/notification/ZenModeHelper$Metrics;-><init>(Lcom/android/server/notification/ZenModeHelper;Lcom/android/server/notification/ZenModeHelper$Metrics;)V
+PLcom/android/server/notification/ZenModeHelper$RingerModeDelegate;-><init>(Lcom/android/server/notification/ZenModeHelper;)V
+PLcom/android/server/notification/ZenModeHelper$RingerModeDelegate;-><init>(Lcom/android/server/notification/ZenModeHelper;Lcom/android/server/notification/ZenModeHelper$RingerModeDelegate;)V
+PLcom/android/server/notification/ZenModeHelper$RingerModeDelegate;->getRingerModeAffectedStreams(I)I
+PLcom/android/server/notification/ZenModeHelper$RingerModeDelegate;->onSetRingerModeInternal(IILjava/lang/String;ILandroid/media/VolumePolicy;)I
+PLcom/android/server/notification/ZenModeHelper$SettingsObserver;-><init>(Lcom/android/server/notification/ZenModeHelper;Landroid/os/Handler;)V
+PLcom/android/server/notification/ZenModeHelper$SettingsObserver;->observe()V
+PLcom/android/server/notification/ZenModeHelper$SettingsObserver;->update(Landroid/net/Uri;)V
+PLcom/android/server/notification/ZenModeHelper;->-get0(Lcom/android/server/notification/ZenModeHelper;)Landroid/content/Context;
+PLcom/android/server/notification/ZenModeHelper;->-get3(Lcom/android/server/notification/ZenModeHelper;)I
+PLcom/android/server/notification/ZenModeHelper;->-wrap1(Lcom/android/server/notification/ZenModeHelper;Landroid/service/notification/ZenModeConfig;Ljava/lang/String;Z)V
+PLcom/android/server/notification/ZenModeHelper;-><init>(Landroid/content/Context;Landroid/os/Looper;Lcom/android/server/notification/ConditionProviders;)V
+PLcom/android/server/notification/ZenModeHelper;->addCallback(Lcom/android/server/notification/ZenModeHelper$Callback;)V
+PLcom/android/server/notification/ZenModeHelper;->appendDefaultEventRules(Landroid/service/notification/ZenModeConfig;)V
+PLcom/android/server/notification/ZenModeHelper;->appendDefaultScheduleRules(Landroid/service/notification/ZenModeConfig;)V
+PLcom/android/server/notification/ZenModeHelper;->applyConfig(Landroid/service/notification/ZenModeConfig;Ljava/lang/String;Z)V
+PLcom/android/server/notification/ZenModeHelper;->applyRestrictions()V
+PLcom/android/server/notification/ZenModeHelper;->applyRestrictions(ZI)V
+PLcom/android/server/notification/ZenModeHelper;->applyZenToRingerMode()V
+PLcom/android/server/notification/ZenModeHelper;->cleanUpZenRules()V
+PLcom/android/server/notification/ZenModeHelper;->computeZenMode()I
+PLcom/android/server/notification/ZenModeHelper;->dispatchOnConfigChanged()V
+PLcom/android/server/notification/ZenModeHelper;->evaluateZenMode(Ljava/lang/String;Z)Z
+PLcom/android/server/notification/ZenModeHelper;->getConfig()Landroid/service/notification/ZenModeConfig;
+PLcom/android/server/notification/ZenModeHelper;->getNotificationPolicy(Landroid/service/notification/ZenModeConfig;)Landroid/app/NotificationManager$Policy;
+PLcom/android/server/notification/ZenModeHelper;->getZenMode()I
+PLcom/android/server/notification/ZenModeHelper;->getZenModeListenerInterruptionFilter()I
+PLcom/android/server/notification/ZenModeHelper;->initZenMode()V
+PLcom/android/server/notification/ZenModeHelper;->isCall(Lcom/android/server/notification/NotificationRecord;)Z
+PLcom/android/server/notification/ZenModeHelper;->loadConfigForUser(ILjava/lang/String;)V
+PLcom/android/server/notification/ZenModeHelper;->onSystemReady()V
+PLcom/android/server/notification/ZenModeHelper;->onUserSwitched(I)V
+PLcom/android/server/notification/ZenModeHelper;->onUserUnlocked(I)V
+PLcom/android/server/notification/ZenModeHelper;->readDefaultConfig(Landroid/content/res/Resources;)Landroid/service/notification/ZenModeConfig;
+PLcom/android/server/notification/ZenModeHelper;->readXml(Lorg/xmlpull/v1/XmlPullParser;Z)V
+PLcom/android/server/notification/ZenModeHelper;->setConfig(Landroid/service/notification/ZenModeConfig;Ljava/lang/String;)V
+PLcom/android/server/notification/ZenModeHelper;->setConfigLocked(Landroid/service/notification/ZenModeConfig;Ljava/lang/String;)Z
+PLcom/android/server/notification/ZenModeHelper;->setConfigLocked(Landroid/service/notification/ZenModeConfig;Ljava/lang/String;Z)Z
+PLcom/android/server/notification/ZenModeHelper;->setZenModeSetting(I)V
+PLcom/android/server/notification/ZenModeHelper;->shouldIntercept(Lcom/android/server/notification/NotificationRecord;)Z
+PLcom/android/server/notification/ZenModeHelper;->updateRingerModeAffectedStreams()V
+PLcom/android/server/notification/ZenModeHelper;->writeXml(Lorg/xmlpull/v1/XmlSerializer;Z)V
+PLcom/android/server/oemlock/OemLock;-><init>()V
+PLcom/android/server/oemlock/OemLockService$1;-><init>(Lcom/android/server/oemlock/OemLockService;)V
+PLcom/android/server/oemlock/OemLockService$1;->onUserRestrictionsChanged(ILandroid/os/Bundle;Landroid/os/Bundle;)V
+PLcom/android/server/oemlock/OemLockService$2;-><init>(Lcom/android/server/oemlock/OemLockService;)V
+PLcom/android/server/oemlock/OemLockService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/oemlock/OemLockService;-><init>(Landroid/content/Context;Lcom/android/server/oemlock/OemLock;)V
+PLcom/android/server/oemlock/OemLockService;->getOemLock(Landroid/content/Context;)Lcom/android/server/oemlock/OemLock;
+PLcom/android/server/oemlock/OemLockService;->onStart()V
+PLcom/android/server/oemlock/PersistentDataBlockLock;-><init>(Landroid/content/Context;)V
+PLcom/android/server/oemlock/VendorLock;->getOemLockHalService()Landroid/hardware/oemlock/V1_0/IOemLock;
+PLcom/android/server/om/-$Lambda$VuwDBWerAG9B6xB4Rr4-FeDL3jk$1;->$m$0()Ljava/lang/Object;
+PLcom/android/server/om/-$Lambda$VuwDBWerAG9B6xB4Rr4-FeDL3jk$1;-><init>()V
+PLcom/android/server/om/-$Lambda$VuwDBWerAG9B6xB4Rr4-FeDL3jk$1;->get()Ljava/lang/Object;
+PLcom/android/server/om/-$Lambda$VuwDBWerAG9B6xB4Rr4-FeDL3jk$2;->$m$0(Ljava/lang/Object;)I
+PLcom/android/server/om/-$Lambda$VuwDBWerAG9B6xB4Rr4-FeDL3jk$2;-><init>()V
+PLcom/android/server/om/-$Lambda$VuwDBWerAG9B6xB4Rr4-FeDL3jk$2;->applyAsInt(Ljava/lang/Object;)I
+PLcom/android/server/om/-$Lambda$VuwDBWerAG9B6xB4Rr4-FeDL3jk$3;->$m$0(Ljava/lang/Object;)Z
+PLcom/android/server/om/-$Lambda$VuwDBWerAG9B6xB4Rr4-FeDL3jk$3;-><init>(Ljava/lang/Object;)V
+PLcom/android/server/om/-$Lambda$VuwDBWerAG9B6xB4Rr4-FeDL3jk$3;->test(Ljava/lang/Object;)Z
+PLcom/android/server/om/-$Lambda$VuwDBWerAG9B6xB4Rr4-FeDL3jk$4;->$m$0(Ljava/lang/Object;)Z
+PLcom/android/server/om/-$Lambda$VuwDBWerAG9B6xB4Rr4-FeDL3jk$4;-><init>(I)V
+PLcom/android/server/om/-$Lambda$VuwDBWerAG9B6xB4Rr4-FeDL3jk$4;->test(Ljava/lang/Object;)Z
+PLcom/android/server/om/-$Lambda$VuwDBWerAG9B6xB4Rr4-FeDL3jk;->$m$0(Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/android/server/om/-$Lambda$VuwDBWerAG9B6xB4Rr4-FeDL3jk;->$m$1(Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/android/server/om/-$Lambda$VuwDBWerAG9B6xB4Rr4-FeDL3jk;->$m$2(Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/android/server/om/-$Lambda$VuwDBWerAG9B6xB4Rr4-FeDL3jk;-><init>(B)V
+PLcom/android/server/om/-$Lambda$VuwDBWerAG9B6xB4Rr4-FeDL3jk;->apply(Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/android/server/om/-$Lambda$Whs3NIaASrs6bpQxTTs9leTDPyo;->$m$0()V
+PLcom/android/server/om/-$Lambda$Whs3NIaASrs6bpQxTTs9leTDPyo;->$m$1()V
+PLcom/android/server/om/-$Lambda$Whs3NIaASrs6bpQxTTs9leTDPyo;-><init>(BLjava/lang/Object;)V
+PLcom/android/server/om/-$Lambda$Whs3NIaASrs6bpQxTTs9leTDPyo;->run()V
+PLcom/android/server/om/IdmapManager;-><init>(Lcom/android/server/pm/Installer;)V
+PLcom/android/server/om/IdmapManager;->createIdmap(Landroid/content/pm/PackageInfo;Landroid/content/pm/PackageInfo;I)Z
+PLcom/android/server/om/IdmapManager;->getIdmapPath(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/om/IdmapManager;->idmapExists(Landroid/content/pm/PackageInfo;I)Z
+PLcom/android/server/om/OverlayManagerService$1;-><init>(Lcom/android/server/om/OverlayManagerService;)V
+PLcom/android/server/om/OverlayManagerService$1;->getOverlayInfo(Ljava/lang/String;I)Landroid/content/om/OverlayInfo;
+PLcom/android/server/om/OverlayManagerService$1;->handleIncomingUser(ILjava/lang/String;)I
+PLcom/android/server/om/OverlayManagerService$OverlayChangeListener;-><init>(Lcom/android/server/om/OverlayManagerService;)V
+PLcom/android/server/om/OverlayManagerService$OverlayChangeListener;-><init>(Lcom/android/server/om/OverlayManagerService;Lcom/android/server/om/OverlayManagerService$OverlayChangeListener;)V
+PLcom/android/server/om/OverlayManagerService$PackageManagerHelper;-><init>()V
+PLcom/android/server/om/OverlayManagerService$PackageManagerHelper;->cachePackageInfo(Ljava/lang/String;ILandroid/content/pm/PackageInfo;)V
+PLcom/android/server/om/OverlayManagerService$PackageManagerHelper;->getCachedPackageInfo(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;
+PLcom/android/server/om/OverlayManagerService$PackageManagerHelper;->getOverlayPackages(I)Ljava/util/List;
+PLcom/android/server/om/OverlayManagerService$PackageManagerHelper;->getPackageInfo(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;
+PLcom/android/server/om/OverlayManagerService$PackageManagerHelper;->getPackageInfo(Ljava/lang/String;IZ)Landroid/content/pm/PackageInfo;
+PLcom/android/server/om/OverlayManagerService$PackageReceiver;-><init>(Lcom/android/server/om/OverlayManagerService;)V
+PLcom/android/server/om/OverlayManagerService$PackageReceiver;-><init>(Lcom/android/server/om/OverlayManagerService;Lcom/android/server/om/OverlayManagerService$PackageReceiver;)V
+PLcom/android/server/om/OverlayManagerService$PackageReceiver;->onPackageAdded(Ljava/lang/String;[I)V
+PLcom/android/server/om/OverlayManagerService$PackageReceiver;->onPackageChanged(Ljava/lang/String;[I)V
+PLcom/android/server/om/OverlayManagerService$PackageReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/om/OverlayManagerService$UserReceiver;-><init>(Lcom/android/server/om/OverlayManagerService;)V
+PLcom/android/server/om/OverlayManagerService$UserReceiver;-><init>(Lcom/android/server/om/OverlayManagerService;Lcom/android/server/om/OverlayManagerService$UserReceiver;)V
+PLcom/android/server/om/OverlayManagerService;->-get0(Lcom/android/server/om/OverlayManagerService;)Lcom/android/server/om/OverlayManagerServiceImpl;
+PLcom/android/server/om/OverlayManagerService;->-get1(Lcom/android/server/om/OverlayManagerService;)Ljava/lang/Object;
+PLcom/android/server/om/OverlayManagerService;->-get2(Lcom/android/server/om/OverlayManagerService;)Lcom/android/server/om/OverlayManagerService$PackageManagerHelper;
+PLcom/android/server/om/OverlayManagerService;->-wrap0(Lcom/android/server/om/OverlayManagerService;Landroid/content/pm/PackageInfo;)Z
+PLcom/android/server/om/OverlayManagerService;-><init>(Landroid/content/Context;Lcom/android/server/pm/Installer;)V
+PLcom/android/server/om/OverlayManagerService;->getDefaultOverlayPackages()Ljava/util/Set;
+PLcom/android/server/om/OverlayManagerService;->initIfNeeded()V
+PLcom/android/server/om/OverlayManagerService;->isOverlayPackage(Landroid/content/pm/PackageInfo;)Z
+PLcom/android/server/om/OverlayManagerService;->lambda$-com_android_server_om_OverlayManagerService_30951()V
+PLcom/android/server/om/OverlayManagerService;->lambda$-com_android_server_om_OverlayManagerService_9907()V
+PLcom/android/server/om/OverlayManagerService;->onBootPhase(I)V
+PLcom/android/server/om/OverlayManagerService;->onStart()V
+PLcom/android/server/om/OverlayManagerService;->onSwitchUser(I)V
+PLcom/android/server/om/OverlayManagerService;->restoreSettings()V
+PLcom/android/server/om/OverlayManagerService;->schedulePersistSettings()V
+PLcom/android/server/om/OverlayManagerService;->updateAssets(ILjava/util/List;)V
+PLcom/android/server/om/OverlayManagerService;->updateOverlayPaths(ILjava/util/List;)V
+PLcom/android/server/om/OverlayManagerServiceImpl;-><init>(Lcom/android/server/om/OverlayManagerServiceImpl$PackageManagerHelper;Lcom/android/server/om/IdmapManager;Lcom/android/server/om/OverlayManagerSettings;Ljava/util/Set;Lcom/android/server/om/OverlayManagerServiceImpl$OverlayChangeListener;)V
+PLcom/android/server/om/OverlayManagerServiceImpl;->calculateNewState(Landroid/content/pm/PackageInfo;Landroid/content/pm/PackageInfo;I)I
+PLcom/android/server/om/OverlayManagerServiceImpl;->getEnabledOverlayPackageNames(Ljava/lang/String;I)Ljava/util/List;
+PLcom/android/server/om/OverlayManagerServiceImpl;->getOverlayInfo(Ljava/lang/String;I)Landroid/content/om/OverlayInfo;
+PLcom/android/server/om/OverlayManagerServiceImpl;->onTargetPackageAdded(Ljava/lang/String;I)V
+PLcom/android/server/om/OverlayManagerServiceImpl;->onTargetPackageChanged(Ljava/lang/String;I)V
+PLcom/android/server/om/OverlayManagerServiceImpl;->updateAllOverlaysForTarget(Ljava/lang/String;ILandroid/content/pm/PackageInfo;)Z
+PLcom/android/server/om/OverlayManagerServiceImpl;->updateOverlaysForUser(I)Ljava/util/ArrayList;
+PLcom/android/server/om/OverlayManagerServiceImpl;->updateState(Landroid/content/pm/PackageInfo;Landroid/content/pm/PackageInfo;I)Z
+PLcom/android/server/om/OverlayManagerSettings$Serializer;->persist(Ljava/util/ArrayList;Ljava/io/OutputStream;)V
+PLcom/android/server/om/OverlayManagerSettings$Serializer;->persistRow(Lcom/android/internal/util/FastXmlSerializer;Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)V
+PLcom/android/server/om/OverlayManagerSettings$Serializer;->restore(Ljava/util/ArrayList;Ljava/io/InputStream;)V
+PLcom/android/server/om/OverlayManagerSettings$Serializer;->restoreRow(Lorg/xmlpull/v1/XmlPullParser;I)Lcom/android/server/om/OverlayManagerSettings$SettingsItem;
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->-get0(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)Ljava/lang/String;
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->-get1(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)Z
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->-get2(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)Z
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->-get3(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)Ljava/lang/String;
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->-get4(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)I
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->-get5(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)I
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->-get6(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)Ljava/lang/String;
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->-get7(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)I
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->-wrap0(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)Landroid/content/om/OverlayInfo;
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->-wrap1(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)Z
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->-wrap3(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;Ljava/lang/String;)Z
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->-wrap6(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)I
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->-wrap7(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)I
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->-wrap9(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)Ljava/lang/String;
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;-><init>(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;IZZI)V
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->getOverlayInfo()Landroid/content/om/OverlayInfo;
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->getState()I
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->getTargetPackageName()Ljava/lang/String;
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->getUserId()I
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->isEnabled()Z
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->setBaseCodePath(Ljava/lang/String;)Z
+PLcom/android/server/om/OverlayManagerSettings;->-com_android_server_om_OverlayManagerSettings-mthref-0(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)Landroid/content/om/OverlayInfo;
+PLcom/android/server/om/OverlayManagerSettings;->-com_android_server_om_OverlayManagerSettings-mthref-1(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)Landroid/content/om/OverlayInfo;
+PLcom/android/server/om/OverlayManagerSettings;->-com_android_server_om_OverlayManagerSettings-mthref-2()Landroid/util/ArrayMap;
+PLcom/android/server/om/OverlayManagerSettings;->-com_android_server_om_OverlayManagerSettings-mthref-3(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)I
+PLcom/android/server/om/OverlayManagerSettings;-><init>()V
+PLcom/android/server/om/OverlayManagerSettings;->getEnabled(Ljava/lang/String;I)Z
+PLcom/android/server/om/OverlayManagerSettings;->getOverlayInfo(Ljava/lang/String;I)Landroid/content/om/OverlayInfo;
+PLcom/android/server/om/OverlayManagerSettings;->getOverlaysForTarget(Ljava/lang/String;I)Ljava/util/List;
+PLcom/android/server/om/OverlayManagerSettings;->getOverlaysForUser(I)Landroid/util/ArrayMap;
+PLcom/android/server/om/OverlayManagerSettings;->getState(Ljava/lang/String;I)I
+PLcom/android/server/om/OverlayManagerSettings;->getUsers()[I
+PLcom/android/server/om/OverlayManagerSettings;->lambda$-com_android_server_om_OverlayManagerSettings_19551(ILcom/android/server/om/OverlayManagerSettings$SettingsItem;)Z
+PLcom/android/server/om/OverlayManagerSettings;->lambda$-com_android_server_om_OverlayManagerSettings_19778(Ljava/lang/String;Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)Z
+PLcom/android/server/om/OverlayManagerSettings;->lambda$-com_android_server_om_OverlayManagerSettings_6314(Landroid/content/om/OverlayInfo;)Ljava/lang/String;
+PLcom/android/server/om/OverlayManagerSettings;->persist(Ljava/io/OutputStream;)V
+PLcom/android/server/om/OverlayManagerSettings;->restore(Ljava/io/InputStream;)V
+PLcom/android/server/om/OverlayManagerSettings;->select(Ljava/lang/String;I)I
+PLcom/android/server/om/OverlayManagerSettings;->selectWhereTarget(Ljava/lang/String;I)Ljava/util/stream/Stream;
+PLcom/android/server/om/OverlayManagerSettings;->selectWhereUser(I)Ljava/util/stream/Stream;
+PLcom/android/server/om/OverlayManagerSettings;->setBaseCodePath(Ljava/lang/String;ILjava/lang/String;)Z
+PLcom/android/server/os/DeviceIdentifiersPolicyService$DeviceIdentifiersPolicy;->getSerial()Ljava/lang/String;
+PLcom/android/server/os/SchedulingPolicyService;-><init>()V
+PLcom/android/server/os/SchedulingPolicyService;->isPermitted()Z
+PLcom/android/server/os/SchedulingPolicyService;->requestPriority(IIIZ)I
+PLcom/android/server/pm/-$Lambda$4qJi2sHY5X4ys3rtlAQIsVPSn60;->$m$1(Ljava/lang/Object;)V
+PLcom/android/server/pm/-$Lambda$4qJi2sHY5X4ys3rtlAQIsVPSn60;-><init>(BLjava/lang/Object;)V
+PLcom/android/server/pm/-$Lambda$4qJi2sHY5X4ys3rtlAQIsVPSn60;->accept(Ljava/lang/Object;)V
+PLcom/android/server/pm/-$Lambda$KFbchFEqJgs_hY1HweauKRNA_ds;-><init>(BLjava/lang/Object;)V
+PLcom/android/server/pm/-$Lambda$akZNYSpRQU-aMo9i0sDNiuGZqwY$1;->$m$1(Ljava/lang/Object;)V
+PLcom/android/server/pm/-$Lambda$akZNYSpRQU-aMo9i0sDNiuGZqwY$1;-><init>(BILjava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/pm/-$Lambda$akZNYSpRQU-aMo9i0sDNiuGZqwY$1;->accept(Ljava/lang/Object;)V
+PLcom/android/server/pm/-$Lambda$akZNYSpRQU-aMo9i0sDNiuGZqwY;-><init>(B)V
+PLcom/android/server/pm/-$Lambda$i1ZZeLvwPPAZVBl_nnQ0C2t5oMs;->$m$0()V
+PLcom/android/server/pm/-$Lambda$i1ZZeLvwPPAZVBl_nnQ0C2t5oMs;->$m$1()V
+PLcom/android/server/pm/-$Lambda$i1ZZeLvwPPAZVBl_nnQ0C2t5oMs;->$m$2()V
+PLcom/android/server/pm/-$Lambda$i1ZZeLvwPPAZVBl_nnQ0C2t5oMs;->$m$3()V
+PLcom/android/server/pm/-$Lambda$i1ZZeLvwPPAZVBl_nnQ0C2t5oMs;-><init>(BILjava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/pm/-$Lambda$i1ZZeLvwPPAZVBl_nnQ0C2t5oMs;->run()V
+PLcom/android/server/pm/-$Lambda$iCTRLJcHnavjRcatPDKSIvElD0U;->$m$1()V
+PLcom/android/server/pm/-$Lambda$iCTRLJcHnavjRcatPDKSIvElD0U;->$m$2()V
+PLcom/android/server/pm/-$Lambda$iCTRLJcHnavjRcatPDKSIvElD0U;->$m$3()V
+PLcom/android/server/pm/-$Lambda$iCTRLJcHnavjRcatPDKSIvElD0U;-><init>(BLjava/lang/Object;)V
+PLcom/android/server/pm/-$Lambda$iCTRLJcHnavjRcatPDKSIvElD0U;->run()V
+PLcom/android/server/pm/-$Lambda$kozCdtU4hxwnpbopzC6ZLMsBV5E$2;->$m$1()V
+PLcom/android/server/pm/-$Lambda$kozCdtU4hxwnpbopzC6ZLMsBV5E$2;-><init>(BIJLjava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/pm/-$Lambda$kozCdtU4hxwnpbopzC6ZLMsBV5E$2;->run()V
+PLcom/android/server/pm/-$Lambda$qKHXTlzWfY0UTc6aCYQ5haVEjEY$2;->$m$0()V
+PLcom/android/server/pm/-$Lambda$qKHXTlzWfY0UTc6aCYQ5haVEjEY$2;-><init>(IJLjava/lang/Object;)V
+PLcom/android/server/pm/-$Lambda$qKHXTlzWfY0UTc6aCYQ5haVEjEY$2;->run()V
+PLcom/android/server/pm/-$Lambda$qKHXTlzWfY0UTc6aCYQ5haVEjEY$3;->$m$0(Ljava/lang/Object;)Z
+PLcom/android/server/pm/-$Lambda$qKHXTlzWfY0UTc6aCYQ5haVEjEY$3;-><init>(IJLjava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/pm/-$Lambda$qKHXTlzWfY0UTc6aCYQ5haVEjEY$3;->test(Ljava/lang/Object;)Z
+PLcom/android/server/pm/-$Lambda$qKHXTlzWfY0UTc6aCYQ5haVEjEY$4;->$m$0(Ljava/lang/Object;)V
+PLcom/android/server/pm/-$Lambda$qKHXTlzWfY0UTc6aCYQ5haVEjEY$4;-><init>(IIIIJLjava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/pm/-$Lambda$qKHXTlzWfY0UTc6aCYQ5haVEjEY$4;->accept(Ljava/lang/Object;)V
+PLcom/android/server/pm/-$Lambda$qKHXTlzWfY0UTc6aCYQ5haVEjEY;->$m$0(Ljava/lang/Object;)V
+PLcom/android/server/pm/-$Lambda$qKHXTlzWfY0UTc6aCYQ5haVEjEY;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/pm/-$Lambda$qKHXTlzWfY0UTc6aCYQ5haVEjEY;->accept(Ljava/lang/Object;)V
+PLcom/android/server/pm/-$Lambda$s_oh3oeib-Exts1l3lS2Euiarsw;->$m$5(Ljava/lang/Object;)Z
+PLcom/android/server/pm/-$Lambda$s_oh3oeib-Exts1l3lS2Euiarsw;->$m$6(Ljava/lang/Object;)Z
+PLcom/android/server/pm/-$Lambda$s_oh3oeib-Exts1l3lS2Euiarsw;->$m$7(Ljava/lang/Object;)Z
+PLcom/android/server/pm/-$Lambda$s_oh3oeib-Exts1l3lS2Euiarsw;-><init>(B)V
+PLcom/android/server/pm/-$Lambda$s_oh3oeib-Exts1l3lS2Euiarsw;->test(Ljava/lang/Object;)Z
+PLcom/android/server/pm/-$Lambda$tZuhGcRRWSq5m9LlSrypurdt-0w;->$m$3(Ljava/lang/Object;Ljava/lang/Object;)I
+PLcom/android/server/pm/-$Lambda$tZuhGcRRWSq5m9LlSrypurdt-0w;-><init>(B)V
+PLcom/android/server/pm/-$Lambda$tZuhGcRRWSq5m9LlSrypurdt-0w;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+PLcom/android/server/pm/AbstractStatsBase;->getFile()Landroid/util/AtomicFile;
+PLcom/android/server/pm/AbstractStatsBase;->read(Ljava/lang/Object;)V
+PLcom/android/server/pm/BackgroundDexOptService$1;-><init>(Lcom/android/server/pm/BackgroundDexOptService;Ljava/lang/String;Landroid/app/job/JobParameters;Lcom/android/server/pm/PackageManagerService;Landroid/util/ArraySet;)V
+PLcom/android/server/pm/BackgroundDexOptService$1;->run()V
+PLcom/android/server/pm/BackgroundDexOptService;->-wrap1(Lcom/android/server/pm/BackgroundDexOptService;Landroid/app/job/JobParameters;Lcom/android/server/pm/PackageManagerService;Landroid/util/ArraySet;)V
+PLcom/android/server/pm/BackgroundDexOptService;-><init>()V
+PLcom/android/server/pm/BackgroundDexOptService;->getBatteryLevel()I
+PLcom/android/server/pm/BackgroundDexOptService;->getLowStorageThreshold(Landroid/content/Context;)J
+PLcom/android/server/pm/BackgroundDexOptService;->notifyPackageChanged(Ljava/lang/String;)V
+PLcom/android/server/pm/BackgroundDexOptService;->notifyPinService(Landroid/util/ArraySet;)V
+PLcom/android/server/pm/BackgroundDexOptService;->onStartJob(Landroid/app/job/JobParameters;)Z
+PLcom/android/server/pm/BackgroundDexOptService;->postBootUpdate(Landroid/app/job/JobParameters;Lcom/android/server/pm/PackageManagerService;Landroid/util/ArraySet;)V
+PLcom/android/server/pm/BackgroundDexOptService;->runPostBootUpdate(Landroid/app/job/JobParameters;Lcom/android/server/pm/PackageManagerService;Landroid/util/ArraySet;)Z
+PLcom/android/server/pm/BackgroundDexOptService;->schedule(Landroid/content/Context;)V
+PLcom/android/server/pm/BasePermission;->isDevelopment()Z
+PLcom/android/server/pm/BasePermission;->isRuntime()Z
+PLcom/android/server/pm/CompilerStats$PackageStats;-><init>(Ljava/lang/String;)V
+PLcom/android/server/pm/CompilerStats$PackageStats;->getStoredPathFromCodePath(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/pm/CompilerStats$PackageStats;->setCompileTime(Ljava/lang/String;J)V
+PLcom/android/server/pm/CompilerStats;->createPackageStats(Ljava/lang/String;)Lcom/android/server/pm/CompilerStats$PackageStats;
+PLcom/android/server/pm/CompilerStats;->getOrCreatePackageStats(Ljava/lang/String;)Lcom/android/server/pm/CompilerStats$PackageStats;
+PLcom/android/server/pm/CompilerStats;->maybeWriteAsync()Z
+PLcom/android/server/pm/CompilerStats;->read()V
+PLcom/android/server/pm/CompilerStats;->read(Ljava/io/Reader;)Z
+PLcom/android/server/pm/CompilerStats;->readInternal(Ljava/lang/Object;)V
+PLcom/android/server/pm/CompilerStats;->readInternal(Ljava/lang/Void;)V
+PLcom/android/server/pm/DefaultPermissionGrantPolicy$1;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/pm/DefaultPermissionGrantPolicy$DefaultPermissionGrant;-><init>(Ljava/lang/String;Z)V
+PLcom/android/server/pm/DefaultPermissionGrantPolicy;->-get0(Lcom/android/server/pm/DefaultPermissionGrantPolicy;)Landroid/util/ArrayMap;
+PLcom/android/server/pm/DefaultPermissionGrantPolicy;->-get1(Lcom/android/server/pm/DefaultPermissionGrantPolicy;)Lcom/android/server/pm/PackageManagerService;
+PLcom/android/server/pm/DefaultPermissionGrantPolicy;->-set0(Lcom/android/server/pm/DefaultPermissionGrantPolicy;Landroid/util/ArrayMap;)Landroid/util/ArrayMap;
+PLcom/android/server/pm/DefaultPermissionGrantPolicy;->-wrap0(Lcom/android/server/pm/DefaultPermissionGrantPolicy;)Landroid/util/ArrayMap;
+PLcom/android/server/pm/DefaultPermissionGrantPolicy;->doesPackageSupportRuntimePermissions(Landroid/content/pm/PackageParser$Package;)Z
+PLcom/android/server/pm/DefaultPermissionGrantPolicy;->getDefaultPermissionFiles()[Ljava/io/File;
+PLcom/android/server/pm/DefaultPermissionGrantPolicy;->getPackageLPr(Ljava/lang/String;)Landroid/content/pm/PackageParser$Package;
+PLcom/android/server/pm/DefaultPermissionGrantPolicy;->getSystemPackageLPr(Ljava/lang/String;)Landroid/content/pm/PackageParser$Package;
+PLcom/android/server/pm/DefaultPermissionGrantPolicy;->grantDefaultPermissionsToEnabledImsServicesLPr([Ljava/lang/String;I)V
+PLcom/android/server/pm/DefaultPermissionGrantPolicy;->isSysComponentOrPersistentPlatformSignedPrivAppLPr(Landroid/content/pm/PackageParser$Package;)Z
+PLcom/android/server/pm/DefaultPermissionGrantPolicy;->parse(Lorg/xmlpull/v1/XmlPullParser;Ljava/util/Map;)V
+PLcom/android/server/pm/DefaultPermissionGrantPolicy;->parseExceptions(Lorg/xmlpull/v1/XmlPullParser;Ljava/util/Map;)V
+PLcom/android/server/pm/DefaultPermissionGrantPolicy;->parsePermission(Lorg/xmlpull/v1/XmlPullParser;Ljava/util/List;)V
+PLcom/android/server/pm/DefaultPermissionGrantPolicy;->readDefaultPermissionExceptionsLPw()Landroid/util/ArrayMap;
+PLcom/android/server/pm/DefaultPermissionGrantPolicy;->scheduleReadDefaultPermissionExceptions()V
+PLcom/android/server/pm/DefaultPermissionGrantPolicy;->setDialerAppPackagesProviderLPw(Landroid/content/pm/PackageManagerInternal$PackagesProvider;)V
+PLcom/android/server/pm/DefaultPermissionGrantPolicy;->setLocationPackagesProviderLPw(Landroid/content/pm/PackageManagerInternal$PackagesProvider;)V
+PLcom/android/server/pm/DefaultPermissionGrantPolicy;->setSimCallManagerPackagesProviderLPw(Landroid/content/pm/PackageManagerInternal$PackagesProvider;)V
+PLcom/android/server/pm/DefaultPermissionGrantPolicy;->setSmsAppPackagesProviderLPw(Landroid/content/pm/PackageManagerInternal$PackagesProvider;)V
+PLcom/android/server/pm/DefaultPermissionGrantPolicy;->setSyncAdapterPackagesProviderLPw(Landroid/content/pm/PackageManagerInternal$SyncAdapterPackagesProvider;)V
+PLcom/android/server/pm/DefaultPermissionGrantPolicy;->setVoiceInteractionPackagesProviderLPw(Landroid/content/pm/PackageManagerInternal$PackagesProvider;)V
+PLcom/android/server/pm/EphemeralResolverConnection$ConnectionException;-><init>(I)V
+PLcom/android/server/pm/EphemeralResolverConnection$GetEphemeralResolveInfoCaller$1;-><init>(Lcom/android/server/pm/EphemeralResolverConnection$GetEphemeralResolveInfoCaller;)V
+PLcom/android/server/pm/EphemeralResolverConnection$GetEphemeralResolveInfoCaller$1;->sendResult(Landroid/os/Bundle;)V
+PLcom/android/server/pm/EphemeralResolverConnection$GetEphemeralResolveInfoCaller;->-wrap0(Lcom/android/server/pm/EphemeralResolverConnection$GetEphemeralResolveInfoCaller;Ljava/lang/Object;I)V
+PLcom/android/server/pm/EphemeralResolverConnection$GetEphemeralResolveInfoCaller;-><init>()V
+PLcom/android/server/pm/EphemeralResolverConnection$GetEphemeralResolveInfoCaller;->getEphemeralResolveInfoList(Landroid/app/IInstantAppResolver;[ILjava/lang/String;)Ljava/util/List;
+PLcom/android/server/pm/EphemeralResolverConnection$MyServiceConnection;-><init>(Lcom/android/server/pm/EphemeralResolverConnection;)V
+PLcom/android/server/pm/EphemeralResolverConnection$MyServiceConnection;-><init>(Lcom/android/server/pm/EphemeralResolverConnection;Lcom/android/server/pm/EphemeralResolverConnection$MyServiceConnection;)V
+PLcom/android/server/pm/EphemeralResolverConnection$MyServiceConnection;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/pm/EphemeralResolverConnection;->-get0()J
+PLcom/android/server/pm/EphemeralResolverConnection;->-get1()Z
+PLcom/android/server/pm/EphemeralResolverConnection;->-get2(Lcom/android/server/pm/EphemeralResolverConnection;)Ljava/lang/Object;
+PLcom/android/server/pm/EphemeralResolverConnection;->-set0(Lcom/android/server/pm/EphemeralResolverConnection;Z)Z
+PLcom/android/server/pm/EphemeralResolverConnection;->-set1(Lcom/android/server/pm/EphemeralResolverConnection;Landroid/app/IInstantAppResolver;)Landroid/app/IInstantAppResolver;
+PLcom/android/server/pm/EphemeralResolverConnection;-><init>(Landroid/content/Context;Landroid/content/ComponentName;Ljava/lang/String;)V
+PLcom/android/server/pm/EphemeralResolverConnection;->bindLocked(Ljava/lang/String;)V
+PLcom/android/server/pm/EphemeralResolverConnection;->getInstantAppResolveInfoList([ILjava/lang/String;)Ljava/util/List;
+PLcom/android/server/pm/EphemeralResolverConnection;->getRemoteInstanceLazy(Ljava/lang/String;)Landroid/app/IInstantAppResolver;
+PLcom/android/server/pm/EphemeralResolverConnection;->throwIfCalledOnMainThread()V
+PLcom/android/server/pm/EphemeralResolverConnection;->waitForBindLocked(Ljava/lang/String;)V
+PLcom/android/server/pm/Installer$InstallerException;-><init>(Ljava/lang/String;)V
+PLcom/android/server/pm/Installer$InstallerException;->from(Ljava/lang/Exception;)Lcom/android/server/pm/Installer$InstallerException;
+PLcom/android/server/pm/Installer;->assertValidInstructionSet(Ljava/lang/String;)V
+PLcom/android/server/pm/Installer;->createAppData(Ljava/lang/String;Ljava/lang/String;IIILjava/lang/String;I)J
+PLcom/android/server/pm/Installer;->createOatDir(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/pm/Installer;->createUserData(Ljava/lang/String;III)V
+PLcom/android/server/pm/Installer;->dexopt(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;ILjava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/pm/Installer;->fixupAppData(Ljava/lang/String;I)V
+PLcom/android/server/pm/Installer;->getUserSize(Ljava/lang/String;II[ILandroid/content/pm/PackageStats;)V
+PLcom/android/server/pm/Installer;->idmap(Ljava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/pm/Installer;->isQuotaSupported(Ljava/lang/String;)Z
+PLcom/android/server/pm/Installer;->linkNativeLibraryDirectory(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/pm/Installer;->markBootComplete(Ljava/lang/String;)V
+PLcom/android/server/pm/Installer;->rmPackageDir(Ljava/lang/String;)V
+PLcom/android/server/pm/Installer;->setAppQuota(Ljava/lang/String;IIJ)V
+PLcom/android/server/pm/Installer;->setWarnIfHeld(Ljava/lang/Object;)V
+PLcom/android/server/pm/InstantAppRegistry;->getInstantApplicationDir(Ljava/lang/String;I)Ljava/io/File;
+PLcom/android/server/pm/InstantAppRegistry;->getInstantApplicationsDir(I)Ljava/io/File;
+PLcom/android/server/pm/InstantAppRegistry;->grantInstantAccessLPw(ILandroid/content/Intent;II)V
+PLcom/android/server/pm/InstantAppRegistry;->isInstantAccessGranted(III)Z
+PLcom/android/server/pm/InstantAppRegistry;->onPackageInstalledLPw(Landroid/content/pm/PackageParser$Package;[I)V
+PLcom/android/server/pm/InstantAppRegistry;->parseMetadataFile(Ljava/io/File;)Lcom/android/server/pm/InstantAppRegistry$UninstalledInstantAppState;
+PLcom/android/server/pm/InstantAppRegistry;->peekInstantCookieFile(Ljava/lang/String;I)Ljava/io/File;
+PLcom/android/server/pm/InstantAppRegistry;->peekOrParseUninstalledInstantAppInfo(Ljava/lang/String;I)Landroid/content/pm/InstantAppInfo;
+PLcom/android/server/pm/InstantAppRegistry;->propagateInstantAppPermissionsIfNeeded(Ljava/lang/String;I)V
+PLcom/android/server/pm/InstantAppRegistry;->removeUninstalledInstantAppStateLPw(Ljava/util/function/Predicate;I)V
+PLcom/android/server/pm/InstantAppResolver;->doInstantAppResolutionPhaseOne(Landroid/content/Context;Lcom/android/server/pm/EphemeralResolverConnection;Landroid/content/pm/InstantAppRequest;)Landroid/content/pm/AuxiliaryResolveInfo;
+PLcom/android/server/pm/InstantAppResolver;->getLogger()Lcom/android/internal/logging/MetricsLogger;
+PLcom/android/server/pm/InstantAppResolver;->logMetrics(IJLjava/lang/String;I)V
+PLcom/android/server/pm/InstructionSets;->getAllDexCodeInstructionSets()[Ljava/lang/String;
+PLcom/android/server/pm/InstructionSets;->getAppDexInstructionSets(Landroid/content/pm/ApplicationInfo;)[Ljava/lang/String;
+PLcom/android/server/pm/InstructionSets;->getDexCodeInstructionSet(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/pm/InstructionSets;->getDexCodeInstructionSets([Ljava/lang/String;)[Ljava/lang/String;
+PLcom/android/server/pm/InstructionSets;->getPreferredInstructionSet()Ljava/lang/String;
+PLcom/android/server/pm/InstructionSets;->getPrimaryInstructionSet(Landroid/content/pm/ApplicationInfo;)Ljava/lang/String;
+PLcom/android/server/pm/KeySetHandle;-><init>(J)V
+PLcom/android/server/pm/KeySetHandle;-><init>(JI)V
+PLcom/android/server/pm/KeySetHandle;->getId()J
+PLcom/android/server/pm/KeySetHandle;->getRefCountLPr()I
+PLcom/android/server/pm/KeySetHandle;->setRefCountLPw(I)V
+PLcom/android/server/pm/KeySetManagerService$PublicKeyHandle;-><init>(Lcom/android/server/pm/KeySetManagerService;JILjava/security/PublicKey;)V
+PLcom/android/server/pm/KeySetManagerService$PublicKeyHandle;-><init>(Lcom/android/server/pm/KeySetManagerService;JILjava/security/PublicKey;Lcom/android/server/pm/KeySetManagerService$PublicKeyHandle;)V
+PLcom/android/server/pm/KeySetManagerService$PublicKeyHandle;-><init>(Lcom/android/server/pm/KeySetManagerService;JLjava/security/PublicKey;)V
+PLcom/android/server/pm/KeySetManagerService$PublicKeyHandle;->getKey()Ljava/security/PublicKey;
+PLcom/android/server/pm/KeySetManagerService$PublicKeyHandle;->incrRefCountLPw()V
+PLcom/android/server/pm/KeySetManagerService;->addKeySetLPw(Landroid/util/ArraySet;)Lcom/android/server/pm/KeySetHandle;
+PLcom/android/server/pm/KeySetManagerService;->addPublicKeyLPw(Ljava/security/PublicKey;)J
+PLcom/android/server/pm/KeySetManagerService;->addRefCountsFromSavedPackagesLPw(Landroid/util/ArrayMap;)V
+PLcom/android/server/pm/KeySetManagerService;->addScannedPackageLPw(Landroid/content/pm/PackageParser$Package;)V
+PLcom/android/server/pm/KeySetManagerService;->addSigningKeySetToPackageLPw(Lcom/android/server/pm/PackageSetting;Landroid/util/ArraySet;)V
+PLcom/android/server/pm/KeySetManagerService;->assertScannedPackageValid(Landroid/content/pm/PackageParser$Package;)V
+PLcom/android/server/pm/KeySetManagerService;->encodePublicKey(Ljava/security/PublicKey;)Ljava/lang/String;
+PLcom/android/server/pm/KeySetManagerService;->getFreeKeySetIDLPw()J
+PLcom/android/server/pm/KeySetManagerService;->getFreePublicKeyIdLPw()J
+PLcom/android/server/pm/KeySetManagerService;->getIdForPublicKeyLPr(Ljava/security/PublicKey;)J
+PLcom/android/server/pm/KeySetManagerService;->getIdFromKeyIdsLPr(Ljava/util/Set;)J
+PLcom/android/server/pm/KeySetManagerService;->getPublicKeysFromKeySetLPr(J)Landroid/util/ArraySet;
+PLcom/android/server/pm/KeySetManagerService;->readKeySetListLPw(Lorg/xmlpull/v1/XmlPullParser;)V
+PLcom/android/server/pm/KeySetManagerService;->readKeySetsLPw(Lorg/xmlpull/v1/XmlPullParser;Landroid/util/ArrayMap;)V
+PLcom/android/server/pm/KeySetManagerService;->readKeysLPw(Lorg/xmlpull/v1/XmlPullParser;)V
+PLcom/android/server/pm/KeySetManagerService;->readPublicKeyLPw(Lorg/xmlpull/v1/XmlPullParser;)V
+PLcom/android/server/pm/KeySetManagerService;->writeKeySetManagerServiceLPr(Lorg/xmlpull/v1/XmlSerializer;)V
+PLcom/android/server/pm/KeySetManagerService;->writeKeySetsLPr(Lorg/xmlpull/v1/XmlSerializer;)V
+PLcom/android/server/pm/KeySetManagerService;->writePublicKeysLPr(Lorg/xmlpull/v1/XmlSerializer;)V
+PLcom/android/server/pm/LauncherAppsService$BroadcastCookie;-><init>(Landroid/os/UserHandle;Ljava/lang/String;)V
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl$MyPackageMonitor;-><init>(Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;)V
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl$MyPackageMonitor;-><init>(Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl$MyPackageMonitor;)V
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl$MyPackageMonitor;->lambda$-com_android_server_pm_LauncherAppsService$LauncherAppsImpl$MyPackageMonitor_38233(Ljava/lang/String;I)V
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl$MyPackageMonitor;->onPackageAdded(Ljava/lang/String;I)V
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl$MyPackageMonitor;->onPackageModified(Ljava/lang/String;)V
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl$MyPackageMonitor;->onShortcutChanged(Ljava/lang/String;I)V
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl$MyPackageMonitor;->onShortcutChangedInner(Ljava/lang/String;I)V
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl$PackageCallbackList;-><init>(Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;)V
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->-get0(Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;)Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl$PackageCallbackList;
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->-get1(Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;)Landroid/content/pm/ShortcutServiceInternal;
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->-wrap0(Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;Landroid/os/UserHandle;Landroid/os/UserHandle;Ljava/lang/String;)Z
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;-><init>(Landroid/content/Context;)V
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->addOnAppsChangedListener(Ljava/lang/String;Landroid/content/pm/IOnAppsChangedListener;)V
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->canAccessProfile(Ljava/lang/String;ILjava/lang/String;)Z
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->canAccessProfile(Ljava/lang/String;Landroid/os/UserHandle;Ljava/lang/String;)Z
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->ensureShortcutPermission(Ljava/lang/String;)V
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->getApplicationInfo(Ljava/lang/String;Ljava/lang/String;ILandroid/os/UserHandle;)Landroid/content/pm/ApplicationInfo;
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->getCallingUserId()I
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->getLauncherActivities(Ljava/lang/String;Ljava/lang/String;Landroid/os/UserHandle;)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->getShortcutConfigActivities(Ljava/lang/String;Ljava/lang/String;Landroid/os/UserHandle;)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->getShortcutIconFd(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)Landroid/os/ParcelFileDescriptor;
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->getShortcuts(Ljava/lang/String;JLjava/lang/String;Ljava/util/List;Landroid/content/ComponentName;ILandroid/os/UserHandle;)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->hasShortcutHostPermission(Ljava/lang/String;)Z
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->injectBinderCallingUid()I
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->injectCallingUserId()I
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->injectClearCallingIdentity()J
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->injectRestoreCallingIdentity(J)V
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->isActivityEnabled(Ljava/lang/String;Landroid/content/ComponentName;Landroid/os/UserHandle;)Z
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->isEnabledProfileOf(Landroid/os/UserHandle;Landroid/os/UserHandle;Ljava/lang/String;)Z
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->isPackageEnabled(Ljava/lang/String;Ljava/lang/String;Landroid/os/UserHandle;)Z
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->isUserEnabled(I)Z
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->isUserEnabled(Landroid/os/UserHandle;)Z
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->pinShortcuts(Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Landroid/os/UserHandle;)V
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->postToPackageMonitorHandler(Ljava/lang/Runnable;)V
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->queryActivitiesForUser(Ljava/lang/String;Landroid/content/Intent;Landroid/os/UserHandle;)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->resolveActivity(Ljava/lang/String;Landroid/content/ComponentName;Landroid/os/UserHandle;)Landroid/content/pm/ActivityInfo;
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->startWatchingPackageBroadcasts()V
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->verifyCallingPackage(Ljava/lang/String;)V
+PLcom/android/server/pm/LauncherAppsService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/pm/LauncherAppsService;->onStart()V
+PLcom/android/server/pm/OtaDexoptService;-><init>(Landroid/content/Context;Lcom/android/server/pm/PackageManagerService;)V
+PLcom/android/server/pm/OtaDexoptService;->main(Landroid/content/Context;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/OtaDexoptService;
+PLcom/android/server/pm/OtaDexoptService;->moveAbArtifacts(Lcom/android/server/pm/Installer;)V
+PLcom/android/server/pm/PackageDexOptimizer;->acquireWakeLockLI(I)J
+PLcom/android/server/pm/PackageDexOptimizer;->adjustDexoptFlags(I)I
+PLcom/android/server/pm/PackageDexOptimizer;->adjustDexoptNeeded(I)I
+PLcom/android/server/pm/PackageDexOptimizer;->canOptimizePackage(Landroid/content/pm/PackageParser$Package;)Z
+PLcom/android/server/pm/PackageDexOptimizer;->createOatDirIfSupported(Landroid/content/pm/PackageParser$Package;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/pm/PackageDexOptimizer;->dexOptPath(Landroid/content/pm/PackageParser$Package;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;IILcom/android/server/pm/CompilerStats$PackageStats;)I
+PLcom/android/server/pm/PackageDexOptimizer;->getDexFlags(Landroid/content/pm/ApplicationInfo;Ljava/lang/String;Z)I
+PLcom/android/server/pm/PackageDexOptimizer;->getDexFlags(Landroid/content/pm/PackageParser$Package;Ljava/lang/String;Z)I
+PLcom/android/server/pm/PackageDexOptimizer;->getDexoptNeeded(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)I
+PLcom/android/server/pm/PackageDexOptimizer;->getOatDir(Ljava/io/File;)Ljava/io/File;
+PLcom/android/server/pm/PackageDexOptimizer;->getRealCompilerFilter(Landroid/content/pm/ApplicationInfo;Ljava/lang/String;Z)Ljava/lang/String;
+PLcom/android/server/pm/PackageDexOptimizer;->getSharedLibrariesPath([Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/pm/PackageDexOptimizer;->getSplitDependencies(Landroid/content/pm/PackageParser$Package;)[Ljava/lang/String;
+PLcom/android/server/pm/PackageDexOptimizer;->performDexOpt(Landroid/content/pm/PackageParser$Package;[Ljava/lang/String;[Ljava/lang/String;ZLjava/lang/String;Lcom/android/server/pm/CompilerStats$PackageStats;ZZ)I
+PLcom/android/server/pm/PackageDexOptimizer;->performDexOptLI(Landroid/content/pm/PackageParser$Package;[Ljava/lang/String;[Ljava/lang/String;ZLjava/lang/String;Lcom/android/server/pm/CompilerStats$PackageStats;ZZ)I
+PLcom/android/server/pm/PackageDexOptimizer;->printDexoptFlags(I)Ljava/lang/String;
+PLcom/android/server/pm/PackageDexOptimizer;->releaseWakeLockLI(J)V
+PLcom/android/server/pm/PackageDexOptimizer;->systemReady()V
+PLcom/android/server/pm/PackageInstallerService$1;-><init>()V
+PLcom/android/server/pm/PackageInstallerService$1;->accept(Ljava/io/File;Ljava/lang/String;)Z
+PLcom/android/server/pm/PackageInstallerService$2;-><init>(Lcom/android/server/pm/PackageInstallerService;)V
+PLcom/android/server/pm/PackageInstallerService$2;->run()V
+PLcom/android/server/pm/PackageInstallerService$Callbacks;->-wrap0(Lcom/android/server/pm/PackageInstallerService$Callbacks;IIZ)V
+PLcom/android/server/pm/PackageInstallerService$Callbacks;->-wrap2(Lcom/android/server/pm/PackageInstallerService$Callbacks;II)V
+PLcom/android/server/pm/PackageInstallerService$Callbacks;->-wrap3(Lcom/android/server/pm/PackageInstallerService$Callbacks;IIF)V
+PLcom/android/server/pm/PackageInstallerService$Callbacks;-><init>(Landroid/os/Looper;)V
+PLcom/android/server/pm/PackageInstallerService$Callbacks;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/pm/PackageInstallerService$Callbacks;->invokeCallback(Landroid/content/pm/IPackageInstallerCallback;Landroid/os/Message;)V
+PLcom/android/server/pm/PackageInstallerService$Callbacks;->notifySessionActiveChanged(IIZ)V
+PLcom/android/server/pm/PackageInstallerService$Callbacks;->notifySessionCreated(II)V
+PLcom/android/server/pm/PackageInstallerService$Callbacks;->notifySessionFinished(IIZ)V
+PLcom/android/server/pm/PackageInstallerService$Callbacks;->notifySessionProgressChanged(IIF)V
+PLcom/android/server/pm/PackageInstallerService$Callbacks;->register(Landroid/content/pm/IPackageInstallerCallback;I)V
+PLcom/android/server/pm/PackageInstallerService$InternalCallback$1;-><init>(Lcom/android/server/pm/PackageInstallerService$InternalCallback;Lcom/android/server/pm/PackageInstallerSession;)V
+PLcom/android/server/pm/PackageInstallerService$InternalCallback$1;->run()V
+PLcom/android/server/pm/PackageInstallerService$InternalCallback;-><init>(Lcom/android/server/pm/PackageInstallerService;)V
+PLcom/android/server/pm/PackageInstallerService$InternalCallback;->onSessionActiveChanged(Lcom/android/server/pm/PackageInstallerSession;Z)V
+PLcom/android/server/pm/PackageInstallerService$InternalCallback;->onSessionFinished(Lcom/android/server/pm/PackageInstallerSession;Z)V
+PLcom/android/server/pm/PackageInstallerService$InternalCallback;->onSessionPrepared(Lcom/android/server/pm/PackageInstallerSession;)V
+PLcom/android/server/pm/PackageInstallerService$InternalCallback;->onSessionProgressChanged(Lcom/android/server/pm/PackageInstallerSession;F)V
+PLcom/android/server/pm/PackageInstallerService$InternalCallback;->onSessionSealedBlocking(Lcom/android/server/pm/PackageInstallerSession;)V
+PLcom/android/server/pm/PackageInstallerService$PackageInstallObserverAdapter;-><init>(Landroid/content/Context;Landroid/content/IntentSender;IZI)V
+PLcom/android/server/pm/PackageInstallerService$PackageInstallObserverAdapter;->onPackageInstalled(Ljava/lang/String;ILjava/lang/String;Landroid/os/Bundle;)V
+PLcom/android/server/pm/PackageInstallerService;->-get0(Lcom/android/server/pm/PackageInstallerService;)Lcom/android/server/pm/PackageInstallerService$Callbacks;
+PLcom/android/server/pm/PackageInstallerService;->-get1(Lcom/android/server/pm/PackageInstallerService;)Landroid/os/Handler;
+PLcom/android/server/pm/PackageInstallerService;->-get2(Lcom/android/server/pm/PackageInstallerService;)Landroid/util/SparseArray;
+PLcom/android/server/pm/PackageInstallerService;->-wrap1(Lcom/android/server/pm/PackageInstallerService;I)Ljava/io/File;
+PLcom/android/server/pm/PackageInstallerService;->-wrap2(Lcom/android/server/pm/PackageInstallerService;Lcom/android/server/pm/PackageInstallerSession;)V
+PLcom/android/server/pm/PackageInstallerService;->-wrap3(Lcom/android/server/pm/PackageInstallerService;)V
+PLcom/android/server/pm/PackageInstallerService;->-wrap4(Lcom/android/server/pm/PackageInstallerService;)V
+PLcom/android/server/pm/PackageInstallerService;-><init>(Landroid/content/Context;Lcom/android/server/pm/PackageManagerService;)V
+PLcom/android/server/pm/PackageInstallerService;->abandonSession(I)V
+PLcom/android/server/pm/PackageInstallerService;->addHistoricalSessionLocked(Lcom/android/server/pm/PackageInstallerSession;)V
+PLcom/android/server/pm/PackageInstallerService;->allocateSessionIdLocked()I
+PLcom/android/server/pm/PackageInstallerService;->buildAppIconFile(I)Ljava/io/File;
+PLcom/android/server/pm/PackageInstallerService;->buildStageDir(Ljava/lang/String;IZ)Ljava/io/File;
+PLcom/android/server/pm/PackageInstallerService;->buildStagingDir(Ljava/lang/String;Z)Ljava/io/File;
+PLcom/android/server/pm/PackageInstallerService;->createSession(Landroid/content/pm/PackageInstaller$SessionParams;Ljava/lang/String;I)I
+PLcom/android/server/pm/PackageInstallerService;->createSessionInternal(Landroid/content/pm/PackageInstaller$SessionParams;Ljava/lang/String;I)I
+PLcom/android/server/pm/PackageInstallerService;->getAllSessions(I)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/pm/PackageInstallerService;->getMySessions(Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/pm/PackageInstallerService;->getSessionCount(Landroid/util/SparseArray;I)I
+PLcom/android/server/pm/PackageInstallerService;->getSessionInfo(I)Landroid/content/pm/PackageInstaller$SessionInfo;
+PLcom/android/server/pm/PackageInstallerService;->isCallingUidOwner(Lcom/android/server/pm/PackageInstallerSession;)Z
+PLcom/android/server/pm/PackageInstallerService;->isStageName(Ljava/lang/String;)Z
+PLcom/android/server/pm/PackageInstallerService;->newArraySet([Ljava/lang/Object;)Landroid/util/ArraySet;
+PLcom/android/server/pm/PackageInstallerService;->onSecureContainersAvailable()V
+PLcom/android/server/pm/PackageInstallerService;->openSession(I)Landroid/content/pm/IPackageInstallerSession;
+PLcom/android/server/pm/PackageInstallerService;->openSessionInternal(I)Landroid/content/pm/IPackageInstallerSession;
+PLcom/android/server/pm/PackageInstallerService;->prepareStageDir(Ljava/io/File;)V
+PLcom/android/server/pm/PackageInstallerService;->readSessionsLocked()V
+PLcom/android/server/pm/PackageInstallerService;->reconcileStagesLocked(Ljava/lang/String;Z)V
+PLcom/android/server/pm/PackageInstallerService;->registerCallback(Landroid/content/pm/IPackageInstallerCallback;I)V
+PLcom/android/server/pm/PackageInstallerService;->systemReady()V
+PLcom/android/server/pm/PackageInstallerService;->writeGrantedRuntimePermissions(Lorg/xmlpull/v1/XmlSerializer;[Ljava/lang/String;)V
+PLcom/android/server/pm/PackageInstallerService;->writeSessionLocked(Lorg/xmlpull/v1/XmlSerializer;Lcom/android/server/pm/PackageInstallerSession;)V
+PLcom/android/server/pm/PackageInstallerService;->writeSessionsAsync()V
+PLcom/android/server/pm/PackageInstallerService;->writeSessionsLocked()V
+PLcom/android/server/pm/PackageInstallerSession$1;-><init>()V
+PLcom/android/server/pm/PackageInstallerSession$1;->accept(Ljava/io/File;)Z
+PLcom/android/server/pm/PackageInstallerSession$2;-><init>()V
+PLcom/android/server/pm/PackageInstallerSession$2;->accept(Ljava/io/File;)Z
+PLcom/android/server/pm/PackageInstallerSession$3;-><init>(Lcom/android/server/pm/PackageInstallerSession;)V
+PLcom/android/server/pm/PackageInstallerSession$3;->handleMessage(Landroid/os/Message;)Z
+PLcom/android/server/pm/PackageInstallerSession$4;-><init>(Lcom/android/server/pm/PackageInstallerSession;)V
+PLcom/android/server/pm/PackageInstallerSession$4;->onPackageInstalled(Ljava/lang/String;ILjava/lang/String;Landroid/os/Bundle;)V
+PLcom/android/server/pm/PackageInstallerSession;->-get0(Lcom/android/server/pm/PackageInstallerSession;)Ljava/lang/Object;
+PLcom/android/server/pm/PackageInstallerSession;->-get1(Lcom/android/server/pm/PackageInstallerSession;)Lcom/android/server/pm/PackageManagerService;
+PLcom/android/server/pm/PackageInstallerSession;->-set0(Lcom/android/server/pm/PackageInstallerSession;Landroid/content/pm/IPackageInstallObserver2;)Landroid/content/pm/IPackageInstallObserver2;
+PLcom/android/server/pm/PackageInstallerSession;->-wrap0(Lcom/android/server/pm/PackageInstallerSession;Landroid/content/pm/PackageInfo;Landroid/content/pm/ApplicationInfo;)V
+PLcom/android/server/pm/PackageInstallerSession;->-wrap1(Lcom/android/server/pm/PackageInstallerSession;)V
+PLcom/android/server/pm/PackageInstallerSession;->-wrap2(Lcom/android/server/pm/PackageInstallerSession;ILjava/lang/String;Landroid/os/Bundle;)V
+PLcom/android/server/pm/PackageInstallerSession;-><init>(Lcom/android/server/pm/PackageInstallerService$InternalCallback;Landroid/content/Context;Lcom/android/server/pm/PackageManagerService;Landroid/os/Looper;IILjava/lang/String;ILandroid/content/pm/PackageInstaller$SessionParams;JLjava/io/File;Ljava/lang/String;ZZ)V
+PLcom/android/server/pm/PackageInstallerSession;->assertApkConsistent(Ljava/lang/String;Landroid/content/pm/PackageParser$ApkLite;)V
+PLcom/android/server/pm/PackageInstallerSession;->assertPreparedAndNotSealed(Ljava/lang/String;)V
+PLcom/android/server/pm/PackageInstallerSession;->close()V
+PLcom/android/server/pm/PackageInstallerSession;->commit(Landroid/content/IntentSender;)V
+PLcom/android/server/pm/PackageInstallerSession;->commitLocked(Landroid/content/pm/PackageInfo;Landroid/content/pm/ApplicationInfo;)V
+PLcom/android/server/pm/PackageInstallerSession;->computeProgressLocked(Z)V
+PLcom/android/server/pm/PackageInstallerSession;->destroyInternal()V
+PLcom/android/server/pm/PackageInstallerSession;->dispatchSessionFinished(ILjava/lang/String;Landroid/os/Bundle;)V
+PLcom/android/server/pm/PackageInstallerSession;->dump(Lcom/android/internal/util/IndentingPrintWriter;)V
+PLcom/android/server/pm/PackageInstallerSession;->dumpLocked(Lcom/android/internal/util/IndentingPrintWriter;)V
+PLcom/android/server/pm/PackageInstallerSession;->extractNativeLibraries(Ljava/io/File;Ljava/lang/String;)V
+PLcom/android/server/pm/PackageInstallerSession;->generateInfo()Landroid/content/pm/PackageInstaller$SessionInfo;
+PLcom/android/server/pm/PackageInstallerSession;->generateInfo(Z)Landroid/content/pm/PackageInstaller$SessionInfo;
+PLcom/android/server/pm/PackageInstallerSession;->getNames()[Ljava/lang/String;
+PLcom/android/server/pm/PackageInstallerSession;->isPrepared()Z
+PLcom/android/server/pm/PackageInstallerSession;->isSealed()Z
+PLcom/android/server/pm/PackageInstallerSession;->open()V
+PLcom/android/server/pm/PackageInstallerSession;->openWrite(Ljava/lang/String;JJ)Landroid/os/ParcelFileDescriptor;
+PLcom/android/server/pm/PackageInstallerSession;->openWriteInternal(Ljava/lang/String;JJ)Landroid/os/ParcelFileDescriptor;
+PLcom/android/server/pm/PackageInstallerSession;->resolveStageDir()Ljava/io/File;
+PLcom/android/server/pm/PackageInstallerSession;->setClientProgress(F)V
+PLcom/android/server/pm/PackageInstallerSession;->validateInstallLocked(Landroid/content/pm/PackageInfo;Landroid/content/pm/ApplicationInfo;)V
+PLcom/android/server/pm/PackageKeySetData;->getAliases()Landroid/util/ArrayMap;
+PLcom/android/server/pm/PackageKeySetData;->getProperSigningKeySet()J
+PLcom/android/server/pm/PackageKeySetData;->isUsingUpgradeKeySets()Z
+PLcom/android/server/pm/PackageManagerException;-><init>(ILjava/lang/String;)V
+PLcom/android/server/pm/PackageManagerService$18;-><init>(Lcom/android/server/pm/PackageManagerService;Landroid/os/Handler;Landroid/content/ContentResolver;)V
+PLcom/android/server/pm/PackageManagerService$18;->onChange(Z)V
+PLcom/android/server/pm/PackageManagerService$19;-><init>(Lcom/android/server/pm/PackageManagerService;)V
+PLcom/android/server/pm/PackageManagerService$19;->getMountMode(ILjava/lang/String;)I
+PLcom/android/server/pm/PackageManagerService$19;->hasExternalStorage(ILjava/lang/String;)Z
+PLcom/android/server/pm/PackageManagerService$1;->onVolumeStateChanged(Landroid/os/storage/VolumeInfo;II)V
+PLcom/android/server/pm/PackageManagerService$3;->compare(Landroid/content/pm/ProviderInfo;Landroid/content/pm/ProviderInfo;)I
+PLcom/android/server/pm/PackageManagerService$3;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+PLcom/android/server/pm/PackageManagerService$5;-><init>(Lcom/android/server/pm/PackageManagerService;[ILjava/lang/String;Ljava/lang/String;Landroid/os/Bundle;Ljava/lang/String;ILandroid/content/IIntentReceiver;)V
+PLcom/android/server/pm/PackageManagerService$5;->run()V
+PLcom/android/server/pm/PackageManagerService$6;-><init>(Lcom/android/server/pm/PackageManagerService;ILcom/android/server/pm/PackageManagerService$InstallArgs;)V
+PLcom/android/server/pm/PackageManagerService$6;->run()V
+PLcom/android/server/pm/PackageManagerService$8;-><init>(Lcom/android/server/pm/PackageManagerService;)V
+PLcom/android/server/pm/PackageManagerService$ActivityIntentResolver$ActionIterGenerator;-><init>(Lcom/android/server/pm/PackageManagerService$ActivityIntentResolver;)V
+PLcom/android/server/pm/PackageManagerService$ActivityIntentResolver$IterGenerator;-><init>(Lcom/android/server/pm/PackageManagerService$ActivityIntentResolver;)V
+PLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->-get0(Lcom/android/server/pm/PackageManagerService$ActivityIntentResolver;)Landroid/util/ArrayMap;
+PLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->adjustPriority(Ljava/util/List;Landroid/content/pm/PackageParser$ActivityIntentInfo;)V
+PLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->findMatchingActivity(Ljava/util/List;Landroid/content/pm/ActivityInfo;)Landroid/content/pm/PackageParser$Activity;
+PLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->getIntentListSubset(Ljava/util/List;Lcom/android/server/pm/PackageManagerService$ActivityIntentResolver$IterGenerator;Ljava/util/Iterator;)V
+PLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->isProtectedAction(Landroid/content/pm/PackageParser$ActivityIntentInfo;)Z
+PLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->newArray(I)[Landroid/content/IntentFilter;
+PLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->newArray(I)[Landroid/content/pm/PackageParser$ActivityIntentInfo;
+PLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->newResult(Landroid/content/IntentFilter;II)Ljava/lang/Object;
+PLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->queryIntent(Landroid/content/Intent;Ljava/lang/String;II)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->sortResults(Ljava/util/List;)V
+PLcom/android/server/pm/PackageManagerService$DefaultContainerConnection;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/pm/PackageManagerService$FileInstallArgs;-><init>(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService$InstallParams;)V
+PLcom/android/server/pm/PackageManagerService$FileInstallArgs;->copyApk(Lcom/android/internal/app/IMediaContainerService;Z)I
+PLcom/android/server/pm/PackageManagerService$FileInstallArgs;->doCopyApk(Lcom/android/internal/app/IMediaContainerService;Z)I
+PLcom/android/server/pm/PackageManagerService$FileInstallArgs;->doPostInstall(II)I
+PLcom/android/server/pm/PackageManagerService$FileInstallArgs;->doPreInstall(I)I
+PLcom/android/server/pm/PackageManagerService$FileInstallArgs;->doRename(ILandroid/content/pm/PackageParser$Package;Ljava/lang/String;)Z
+PLcom/android/server/pm/PackageManagerService$FileInstallArgs;->getCodePath()Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService$HandlerParams;-><init>(Lcom/android/server/pm/PackageManagerService;Landroid/os/UserHandle;)V
+PLcom/android/server/pm/PackageManagerService$HandlerParams;->getUser()Landroid/os/UserHandle;
+PLcom/android/server/pm/PackageManagerService$HandlerParams;->setTraceCookie(I)Lcom/android/server/pm/PackageManagerService$HandlerParams;
+PLcom/android/server/pm/PackageManagerService$HandlerParams;->setTraceMethod(Ljava/lang/String;)Lcom/android/server/pm/PackageManagerService$HandlerParams;
+PLcom/android/server/pm/PackageManagerService$HandlerParams;->startCopy()Z
+PLcom/android/server/pm/PackageManagerService$IFVerificationParams;-><init>(Landroid/content/pm/PackageParser$Package;ZII)V
+PLcom/android/server/pm/PackageManagerService$InstallArgs;-><init>(Lcom/android/server/pm/PackageManagerService$OriginInfo;Lcom/android/server/pm/PackageManagerService$MoveInfo;Landroid/content/pm/IPackageInstallObserver2;ILjava/lang/String;Ljava/lang/String;Landroid/os/UserHandle;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;I[[Ljava/security/cert/Certificate;I)V
+PLcom/android/server/pm/PackageManagerService$InstallArgs;->getUser()Landroid/os/UserHandle;
+PLcom/android/server/pm/PackageManagerService$InstallArgs;->isFwdLocked()Z
+PLcom/android/server/pm/PackageManagerService$InstallParams$1;-><init>(Lcom/android/server/pm/PackageManagerService$InstallParams;I)V
+PLcom/android/server/pm/PackageManagerService$InstallParams$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/pm/PackageManagerService$InstallParams;-><init>(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService$OriginInfo;Lcom/android/server/pm/PackageManagerService$MoveInfo;Landroid/content/pm/IPackageInstallObserver2;ILjava/lang/String;Ljava/lang/String;Lcom/android/server/pm/PackageManagerService$VerificationInfo;Landroid/os/UserHandle;Ljava/lang/String;[Ljava/lang/String;[[Ljava/security/cert/Certificate;I)V
+PLcom/android/server/pm/PackageManagerService$InstallParams;->handleReturnCode()V
+PLcom/android/server/pm/PackageManagerService$InstallParams;->handleStartCopy()V
+PLcom/android/server/pm/PackageManagerService$InstallParams;->installLocationPolicy(Landroid/content/pm/PackageInfoLite;)I
+PLcom/android/server/pm/PackageManagerService$InstallParams;->isForwardLocked()Z
+PLcom/android/server/pm/PackageManagerService$IntentVerifierProxy;-><init>(Lcom/android/server/pm/PackageManagerService;Landroid/content/Context;Landroid/content/ComponentName;)V
+PLcom/android/server/pm/PackageManagerService$MoveCallbacks;->register(Landroid/content/pm/IPackageMoveObserver;)V
+PLcom/android/server/pm/PackageManagerService$OnPermissionChangeListeners;->addListenerLocked(Landroid/content/pm/IOnPermissionsChangeListener;)V
+PLcom/android/server/pm/PackageManagerService$OnPermissionChangeListeners;->removeListenerLocked(Landroid/content/pm/IOnPermissionsChangeListener;)V
+PLcom/android/server/pm/PackageManagerService$OriginInfo;-><init>(Ljava/io/File;Ljava/lang/String;ZZ)V
+PLcom/android/server/pm/PackageManagerService$OriginInfo;->fromStagedFile(Ljava/io/File;)Lcom/android/server/pm/PackageManagerService$OriginInfo;
+PLcom/android/server/pm/PackageManagerService$PackageFreezer;-><init>(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;ILjava/lang/String;)V
+PLcom/android/server/pm/PackageManagerService$PackageFreezer;->close()V
+PLcom/android/server/pm/PackageManagerService$PackageFreezer;->finalize()V
+PLcom/android/server/pm/PackageManagerService$PackageHandler;->connectToService()Z
+PLcom/android/server/pm/PackageManagerService$PackageHandler;->disconnectService()V
+PLcom/android/server/pm/PackageManagerService$PackageHandler;->doHandleMessage(Landroid/os/Message;)V
+PLcom/android/server/pm/PackageManagerService$PackageHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/pm/PackageManagerService$PackageInstalledInfo;-><init>()V
+PLcom/android/server/pm/PackageManagerService$PackageInstalledInfo;->setReturnCode(I)V
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;-><init>(Lcom/android/server/pm/PackageManagerService;)V
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;-><init>(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;)V
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->addIsolatedUid(II)V
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->canAccessInstantApps(II)Z
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getActivityInfo(Landroid/content/ComponentName;III)Landroid/content/pm/ActivityInfo;
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getApplicationInfo(Ljava/lang/String;III)Landroid/content/pm/ApplicationInfo;
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getHomeActivitiesAsUser(Ljava/util/List;I)Landroid/content/ComponentName;
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getOverlayPackages(I)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getPackageInfo(Ljava/lang/String;III)Landroid/content/pm/PackageInfo;
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getSetupWizardPackageName()Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getTargetPackageNames(I)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getUidTargetSdkVersion(I)I
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->isPackageEphemeral(ILjava/lang/String;)Z
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->isPackagePersistent(Ljava/lang/String;)Z
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->queryIntentActivities(Landroid/content/Intent;III)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->resolveIntent(Landroid/content/Intent;Ljava/lang/String;II)Landroid/content/pm/ResolveInfo;
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->resolveService(Landroid/content/Intent;Ljava/lang/String;III)Landroid/content/pm/ResolveInfo;
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->setDeviceAndProfileOwnerPackages(ILjava/lang/String;Landroid/util/SparseArray;)V
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->setDialerAppPackagesProvider(Landroid/content/pm/PackageManagerInternal$PackagesProvider;)V
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->setEnabledOverlayPackages(ILjava/lang/String;Ljava/util/List;)Z
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->setExternalSourcesPolicy(Landroid/content/pm/PackageManagerInternal$ExternalSourcesPolicy;)V
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->setLocationPackagesProvider(Landroid/content/pm/PackageManagerInternal$PackagesProvider;)V
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->setSimCallManagerPackagesProvider(Landroid/content/pm/PackageManagerInternal$PackagesProvider;)V
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->setSmsAppPackagesProvider(Landroid/content/pm/PackageManagerInternal$PackagesProvider;)V
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->setSyncAdapterPackagesprovider(Landroid/content/pm/PackageManagerInternal$SyncAdapterPackagesProvider;)V
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->setVoiceInteractionPackagesProvider(Landroid/content/pm/PackageManagerInternal$PackagesProvider;)V
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->wasPackageEverLaunched(Ljava/lang/String;I)Z
+PLcom/android/server/pm/PackageManagerService$PackageParserCallback;->getOverlayApks(Ljava/lang/String;)[Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService$PackageParserCallback;->getOverlayPaths(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService$PackageParserCallback;->getStaticOverlayPackagesLocked(Ljava/util/Collection;Ljava/lang/String;)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService$PackageParserCallback;->getStaticOverlayPaths(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService$PackageParserCallback;->getStaticOverlayPathsLocked(Ljava/util/Collection;Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService$ParallelPackageParserCallback;->findStaticOverlayPackages()V
+PLcom/android/server/pm/PackageManagerService$ParallelPackageParserCallback;->getStaticOverlayPaths(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService$PendingPackageBroadcasts;->clear()V
+PLcom/android/server/pm/PackageManagerService$PendingPackageBroadcasts;->get(ILjava/lang/String;)Ljava/util/ArrayList;
+PLcom/android/server/pm/PackageManagerService$PendingPackageBroadcasts;->getOrAllocate(I)Landroid/util/ArrayMap;
+PLcom/android/server/pm/PackageManagerService$PendingPackageBroadcasts;->packagesForUserId(I)Landroid/util/ArrayMap;
+PLcom/android/server/pm/PackageManagerService$PendingPackageBroadcasts;->put(ILjava/lang/String;Ljava/util/ArrayList;)V
+PLcom/android/server/pm/PackageManagerService$PendingPackageBroadcasts;->size()I
+PLcom/android/server/pm/PackageManagerService$PendingPackageBroadcasts;->userIdAt(I)I
+PLcom/android/server/pm/PackageManagerService$PendingPackageBroadcasts;->userIdCount()I
+PLcom/android/server/pm/PackageManagerService$PostInstallData;-><init>(Lcom/android/server/pm/PackageManagerService$InstallArgs;Lcom/android/server/pm/PackageManagerService$PackageInstalledInfo;)V
+PLcom/android/server/pm/PackageManagerService$ProviderIntentResolver;->-get0(Lcom/android/server/pm/PackageManagerService$ProviderIntentResolver;)Landroid/util/ArrayMap;
+PLcom/android/server/pm/PackageManagerService$ProviderIntentResolver;->addProvider(Landroid/content/pm/PackageParser$Provider;)V
+PLcom/android/server/pm/PackageManagerService$ProviderIntentResolver;->newArray(I)[Landroid/content/IntentFilter;
+PLcom/android/server/pm/PackageManagerService$ProviderIntentResolver;->newArray(I)[Landroid/content/pm/PackageParser$ProviderIntentInfo;
+PLcom/android/server/pm/PackageManagerService$ProviderIntentResolver;->queryIntent(Landroid/content/Intent;Ljava/lang/String;II)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService$ProviderIntentResolver;->sortResults(Ljava/util/List;)V
+PLcom/android/server/pm/PackageManagerService$ServiceIntentResolver;->-get0(Lcom/android/server/pm/PackageManagerService$ServiceIntentResolver;)Landroid/util/ArrayMap;
+PLcom/android/server/pm/PackageManagerService$ServiceIntentResolver;->newArray(I)[Landroid/content/IntentFilter;
+PLcom/android/server/pm/PackageManagerService$ServiceIntentResolver;->newArray(I)[Landroid/content/pm/PackageParser$ServiceIntentInfo;
+PLcom/android/server/pm/PackageManagerService$ServiceIntentResolver;->queryIntent(Landroid/content/Intent;Ljava/lang/String;II)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService$ServiceIntentResolver;->sortResults(Ljava/util/List;)V
+PLcom/android/server/pm/PackageManagerService$VerificationInfo;-><init>(Landroid/net/Uri;Landroid/net/Uri;II)V
+PLcom/android/server/pm/PackageManagerService;->-get0()Z
+PLcom/android/server/pm/PackageManagerService;->-get11(Lcom/android/server/pm/PackageManagerService;)I
+PLcom/android/server/pm/PackageManagerService;->-get12(Lcom/android/server/pm/PackageManagerService;)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService;->-get13()Ljava/util/Comparator;
+PLcom/android/server/pm/PackageManagerService;->-get2()Ljava/util/Set;
+PLcom/android/server/pm/PackageManagerService;->-get3(Lcom/android/server/pm/PackageManagerService;)Lcom/android/internal/app/IMediaContainerService;
+PLcom/android/server/pm/PackageManagerService;->-get4(Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/PackageManagerService$DefaultContainerConnection;
+PLcom/android/server/pm/PackageManagerService;->-get5(Lcom/android/server/pm/PackageManagerService;)Z
+PLcom/android/server/pm/PackageManagerService;->-get6(Lcom/android/server/pm/PackageManagerService;)Landroid/util/ArraySet;
+PLcom/android/server/pm/PackageManagerService;->-get7(Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/InstantAppRegistry;
+PLcom/android/server/pm/PackageManagerService;->-set0(Lcom/android/server/pm/PackageManagerService;Lcom/android/internal/app/IMediaContainerService;)Lcom/android/internal/app/IMediaContainerService;
+PLcom/android/server/pm/PackageManagerService;->-set1(Lcom/android/server/pm/PackageManagerService;Z)Z
+PLcom/android/server/pm/PackageManagerService;->-set3(Lcom/android/server/pm/PackageManagerService;I)I
+PLcom/android/server/pm/PackageManagerService;->-wrap0(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;Ljava/util/List;)Landroid/content/ComponentName;
+PLcom/android/server/pm/PackageManagerService;->-wrap1(Lcom/android/server/pm/PackageManagerService;Landroid/content/ComponentName;III)Landroid/content/pm/ActivityInfo;
+PLcom/android/server/pm/PackageManagerService;->-wrap12(Lcom/android/server/pm/PackageManagerService;III)Z
+PLcom/android/server/pm/PackageManagerService;->-wrap13(Lcom/android/server/pm/PackageManagerService;I)Z
+PLcom/android/server/pm/PackageManagerService;->-wrap14(Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/DeviceIdleController$LocalService;
+PLcom/android/server/pm/PackageManagerService;->-wrap15(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService$InstallParams;)Lcom/android/server/pm/PackageManagerService$InstallArgs;
+PLcom/android/server/pm/PackageManagerService;->-wrap18(Lcom/android/server/pm/PackageManagerService;I)I
+PLcom/android/server/pm/PackageManagerService;->-wrap19(Lcom/android/server/pm/PackageManagerService;Ljava/io/File;Ljava/lang/String;)Ljava/io/File;
+PLcom/android/server/pm/PackageManagerService;->-wrap2(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;III)Landroid/content/pm/ApplicationInfo;
+PLcom/android/server/pm/PackageManagerService;->-wrap22(Lcom/android/server/pm/PackageManagerService;Landroid/content/pm/PackageInfoLite;Ljava/util/List;Lcom/android/server/pm/PackageVerificationState;)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService;->-wrap23(Lcom/android/server/pm/PackageManagerService;Landroid/content/Intent;Ljava/lang/String;IIIZ)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService;->-wrap24(Lcom/android/server/pm/PackageManagerService;Landroid/content/Intent;Ljava/lang/String;II)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService;->-wrap25(Lcom/android/server/pm/PackageManagerService;)J
+PLcom/android/server/pm/PackageManagerService;->-wrap26(Lcom/android/server/pm/PackageManagerService;ILandroid/net/Uri;ILandroid/os/UserHandle;)V
+PLcom/android/server/pm/PackageManagerService;->-wrap3(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageSetting;II)Landroid/content/pm/PackageInfo;
+PLcom/android/server/pm/PackageManagerService;->-wrap32(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService$PackageInstalledInfo;ZZ[Ljava/lang/String;ZLjava/lang/String;Landroid/content/pm/IPackageInstallObserver2;)V
+PLcom/android/server/pm/PackageManagerService;->-wrap33(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService$InstallArgs;Lcom/android/server/pm/PackageManagerService$PackageInstalledInfo;)V
+PLcom/android/server/pm/PackageManagerService;->-wrap4(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;IIII)Landroid/content/pm/PackageInfo;
+PLcom/android/server/pm/PackageManagerService;->-wrap40(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService$InstallArgs;I)V
+PLcom/android/server/pm/PackageManagerService;->-wrap47(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;ZLjava/util/ArrayList;I)V
+PLcom/android/server/pm/PackageManagerService;->-wrap5(Lcom/android/server/pm/PackageManagerService;Landroid/content/Intent;Ljava/lang/String;IIZ)Landroid/content/pm/ResolveInfo;
+PLcom/android/server/pm/PackageManagerService;->-wrap52(Lcom/android/server/pm/PackageManagerService;IIZLandroid/content/pm/PackageParser$Package;)V
+PLcom/android/server/pm/PackageManagerService;->-wrap6(Lcom/android/server/pm/PackageManagerService;Landroid/content/Intent;Ljava/lang/String;III)Landroid/content/pm/ResolveInfo;
+PLcom/android/server/pm/PackageManagerService;->-wrap7(Lcom/android/server/pm/PackageManagerService;II)Z
+PLcom/android/server/pm/PackageManagerService;->addOnPermissionsChangeListener(Landroid/content/pm/IOnPermissionsChangeListener;)V
+PLcom/android/server/pm/PackageManagerService;->addSharedLibrariesLPw(Ljava/util/List;[I[Ljava/lang/String;Ljava/lang/String;Landroid/content/pm/PackageParser$Package;ZLandroid/util/ArraySet;)Landroid/util/ArraySet;
+PLcom/android/server/pm/PackageManagerService;->addSharedLibraryLPr(Landroid/util/ArraySet;Lcom/android/server/pm/PackageManagerService$SharedLibraryEntry;Landroid/content/pm/PackageParser$Package;)V
+PLcom/android/server/pm/PackageManagerService;->adjustCpuAbisForSharedUserLPw(Ljava/util/Set;Landroid/content/pm/PackageParser$Package;)V
+PLcom/android/server/pm/PackageManagerService;->apkHasCode(Ljava/lang/String;)Z
+PLcom/android/server/pm/PackageManagerService;->applyPolicy(Landroid/content/pm/PackageParser$Package;I)V
+PLcom/android/server/pm/PackageManagerService;->applyPostContentProviderResolutionFilter(Ljava/util/List;Ljava/lang/String;)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService;->applyPostResolutionFilter(Ljava/util/List;Ljava/lang/String;)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService;->applyPostServiceResolutionFilter(Ljava/util/List;Ljava/lang/String;)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService;->assertCodePolicy(Landroid/content/pm/PackageParser$Package;)V
+PLcom/android/server/pm/PackageManagerService;->assertPackageIsValid(Landroid/content/pm/PackageParser$Package;II)V
+PLcom/android/server/pm/PackageManagerService;->assertPackageKnownAndInstalled(Ljava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/pm/PackageManagerService;->broadcastPackageVerified(ILandroid/net/Uri;ILandroid/os/UserHandle;)V
+PLcom/android/server/pm/PackageManagerService;->calculateBundledApkRoot(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService;->canViewInstantApps(II)Z
+PLcom/android/server/pm/PackageManagerService;->checkDefaultBrowser()V
+PLcom/android/server/pm/PackageManagerService;->checkPackageFrozen(Ljava/lang/String;)V
+PLcom/android/server/pm/PackageManagerService;->checkPackageStartable(Ljava/lang/String;I)V
+PLcom/android/server/pm/PackageManagerService;->checkSignatures(Ljava/lang/String;Ljava/lang/String;)I
+PLcom/android/server/pm/PackageManagerService;->chooseBestActivity(Landroid/content/Intent;Ljava/lang/String;ILjava/util/List;I)Landroid/content/pm/ResolveInfo;
+PLcom/android/server/pm/PackageManagerService;->collectAbsoluteCodePaths()Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService;->collectCertificatesLI(Lcom/android/server/pm/PackageSetting;Landroid/content/pm/PackageParser$Package;Ljava/io/File;I)V
+PLcom/android/server/pm/PackageManagerService;->createInstallArgs(Lcom/android/server/pm/PackageManagerService$InstallParams;)Lcom/android/server/pm/PackageManagerService$InstallArgs;
+PLcom/android/server/pm/PackageManagerService;->deleteTempPackageFiles()V
+PLcom/android/server/pm/PackageManagerService;->deriveAbiOverride(Ljava/lang/String;Lcom/android/server/pm/PackageSetting;)Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService;->deriveCodePathName(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService;->derivePackageAbi(Landroid/content/pm/PackageParser$Package;Ljava/io/File;Ljava/lang/String;ZLjava/io/File;)V
+PLcom/android/server/pm/PackageManagerService;->enableSystemUserPackages()V
+PLcom/android/server/pm/PackageManagerService;->enforceDeclaredAsUsedAndRuntimeOrDevelopmentPermission(Landroid/content/pm/PackageParser$Package;Lcom/android/server/pm/BasePermission;)V
+PLcom/android/server/pm/PackageManagerService;->enforceGrantRevokeRuntimePermissionPermissions(Ljava/lang/String;)V
+PLcom/android/server/pm/PackageManagerService;->enforceShellRestriction(Ljava/lang/String;II)V
+PLcom/android/server/pm/PackageManagerService;->enforceSystemOrPhoneCaller(Ljava/lang/String;)V
+PLcom/android/server/pm/PackageManagerService;->enforceSystemOrRoot(Ljava/lang/String;)V
+PLcom/android/server/pm/PackageManagerService;->extrasForInstallResult(Lcom/android/server/pm/PackageManagerService$PackageInstalledInfo;)Landroid/os/Bundle;
+PLcom/android/server/pm/PackageManagerService;->filterCandidatesWithDomainPreferredActivitiesLPr(Landroid/content/Intent;ILjava/util/List;Lcom/android/server/pm/PackageManagerService$CrossProfileDomainInfo;I)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService;->filterIfNotSystemUser(Ljava/util/List;I)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService;->findPersistentPreferredActivityLP(Landroid/content/Intent;Ljava/lang/String;ILjava/util/List;ZI)Landroid/content/pm/ResolveInfo;
+PLcom/android/server/pm/PackageManagerService;->findPreferredActivity(Landroid/content/Intent;Ljava/lang/String;ILjava/util/List;IZZZI)Landroid/content/pm/ResolveInfo;
+PLcom/android/server/pm/PackageManagerService;->findSharedNonSystemLibraries(Landroid/content/pm/PackageParser$Package;)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService;->findSharedNonSystemLibrariesRecursive(Landroid/content/pm/PackageParser$Package;Ljava/util/ArrayList;Ljava/util/Set;)V
+PLcom/android/server/pm/PackageManagerService;->findSharedNonSystemLibrariesRecursive(Ljava/util/ArrayList;[ILjava/util/ArrayList;Ljava/util/Set;)V
+PLcom/android/server/pm/PackageManagerService;->findSharedNonSystemLibrary(Ljava/lang/String;I)Landroid/content/pm/PackageParser$Package;
+PLcom/android/server/pm/PackageManagerService;->finishPackageInstall(IZ)V
+PLcom/android/server/pm/PackageManagerService;->fixUpInstallReason(Ljava/lang/String;II)I
+PLcom/android/server/pm/PackageManagerService;->freeStorage(Ljava/lang/String;JI)V
+PLcom/android/server/pm/PackageManagerService;->freeStorageAndNotify(Ljava/lang/String;JILandroid/content/pm/IPackageDataObserver;)V
+PLcom/android/server/pm/PackageManagerService;->freezePackage(Ljava/lang/String;ILjava/lang/String;)Lcom/android/server/pm/PackageManagerService$PackageFreezer;
+PLcom/android/server/pm/PackageManagerService;->freezePackageForInstall(Ljava/lang/String;IILjava/lang/String;)Lcom/android/server/pm/PackageManagerService$PackageFreezer;
+PLcom/android/server/pm/PackageManagerService;->freezePackageForInstall(Ljava/lang/String;ILjava/lang/String;)Lcom/android/server/pm/PackageManagerService$PackageFreezer;
+PLcom/android/server/pm/PackageManagerService;->generateApplicationInfoFromSettingsLPw(Ljava/lang/String;III)Landroid/content/pm/ApplicationInfo;
+PLcom/android/server/pm/PackageManagerService;->generatePermissionInfo(Lcom/android/server/pm/BasePermission;I)Landroid/content/pm/PermissionInfo;
+PLcom/android/server/pm/PackageManagerService;->getActivityInfo(Landroid/content/ComponentName;II)Landroid/content/pm/ActivityInfo;
+PLcom/android/server/pm/PackageManagerService;->getActivityInfoInternal(Landroid/content/ComponentName;III)Landroid/content/pm/ActivityInfo;
+PLcom/android/server/pm/PackageManagerService;->getBlockUninstallForUser(Ljava/lang/String;I)Z
+PLcom/android/server/pm/PackageManagerService;->getComponentEnabledSetting(Landroid/content/ComponentName;I)I
+PLcom/android/server/pm/PackageManagerService;->getDefaultBrowserPackageName(I)Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService;->getDefaultHomeActivity(I)Landroid/content/ComponentName;
+PLcom/android/server/pm/PackageManagerService;->getDeviceIdleController()Lcom/android/server/DeviceIdleController$LocalService;
+PLcom/android/server/pm/PackageManagerService;->getHomeActivitiesAsUser(Ljava/util/List;I)Landroid/content/ComponentName;
+PLcom/android/server/pm/PackageManagerService;->getHomeIntent()Landroid/content/Intent;
+PLcom/android/server/pm/PackageManagerService;->getInstallerPackageName(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService;->getInstantAppAndroidId(Ljava/lang/String;I)Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService;->getInstantAppInstallerLPr()Landroid/content/pm/ActivityInfo;
+PLcom/android/server/pm/PackageManagerService;->getInstantAppResolverLPr()Landroid/util/Pair;
+PLcom/android/server/pm/PackageManagerService;->getInstantAppResolverSettingsLPr(Landroid/content/ComponentName;)Landroid/content/ComponentName;
+PLcom/android/server/pm/PackageManagerService;->getIntentFilterVerifierComponentNameLPr()Landroid/content/ComponentName;
+PLcom/android/server/pm/PackageManagerService;->getLastModifiedTime(Landroid/content/pm/PackageParser$Package;Ljava/io/File;)J
+PLcom/android/server/pm/PackageManagerService;->getMatchingCrossProfileIntentFilters(Landroid/content/Intent;Ljava/lang/String;I)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService;->getNameForUid(I)Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService;->getNextCodePath(Ljava/io/File;Ljava/lang/String;)Ljava/io/File;
+PLcom/android/server/pm/PackageManagerService;->getOptimizablePackages()Landroid/util/ArraySet;
+PLcom/android/server/pm/PackageManagerService;->getOrCreateCompilerPackageStats(Landroid/content/pm/PackageParser$Package;)Lcom/android/server/pm/CompilerStats$PackageStats;
+PLcom/android/server/pm/PackageManagerService;->getOrCreateCompilerPackageStats(Ljava/lang/String;)Lcom/android/server/pm/CompilerStats$PackageStats;
+PLcom/android/server/pm/PackageManagerService;->getPackageGids(Ljava/lang/String;II)[I
+PLcom/android/server/pm/PackageManagerService;->getPackageInstaller()Landroid/content/pm/IPackageInstaller;
+PLcom/android/server/pm/PackageManagerService;->getPermissionFlags(Ljava/lang/String;Ljava/lang/String;I)I
+PLcom/android/server/pm/PackageManagerService;->getPermissionInfo(Ljava/lang/String;I)Landroid/content/pm/PermissionInfo;
+PLcom/android/server/pm/PackageManagerService;->getPersistentApplications(I)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/pm/PackageManagerService;->getPersistentApplicationsInternal(I)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService;->getProfileParent(I)Landroid/content/pm/UserInfo;
+PLcom/android/server/pm/PackageManagerService;->getReceiverInfo(Landroid/content/ComponentName;II)Landroid/content/pm/ActivityInfo;
+PLcom/android/server/pm/PackageManagerService;->getRequiredButNotReallyRequiredVerifierLPr()Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService;->getRequiredInstallerLPr()Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService;->getRequiredSharedLibraryLPr(Ljava/lang/String;I)Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService;->getRequiredUninstallerLPr()Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService;->getServicesSystemSharedLibraryPackageName()Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService;->getSettingsVersionForPackage(Landroid/content/pm/PackageParser$Package;)Lcom/android/server/pm/Settings$VersionInfo;
+PLcom/android/server/pm/PackageManagerService;->getSetupWizardPackageName()Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService;->getSharedLibraryEntryLPr(Ljava/lang/String;I)Lcom/android/server/pm/PackageManagerService$SharedLibraryEntry;
+PLcom/android/server/pm/PackageManagerService;->getStorageManagerPackageName()Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService;->getSystemAvailableFeatures()Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/pm/PackageManagerService;->getSystemSharedLibraryNames()[Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService;->getUidTargetSdkVersionLockedLPr(I)I
+PLcom/android/server/pm/PackageManagerService;->getUnknownSourcesSettings()I
+PLcom/android/server/pm/PackageManagerService;->getVerificationTimeout()J
+PLcom/android/server/pm/PackageManagerService;->getVolumeUuidForPackage(Landroid/content/pm/PackageParser$Package;)Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService;->grantDefaultPermissionsToEnabledImsServices([Ljava/lang/String;I)V
+PLcom/android/server/pm/PackageManagerService;->grantRuntimePermission(Ljava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/pm/PackageManagerService;->grantRuntimePermission(Ljava/lang/String;Ljava/lang/String;IZ)V
+PLcom/android/server/pm/PackageManagerService;->handlePackagePostInstall(Lcom/android/server/pm/PackageManagerService$PackageInstalledInfo;ZZ[Ljava/lang/String;ZLjava/lang/String;Landroid/content/pm/IPackageInstallObserver2;)V
+PLcom/android/server/pm/PackageManagerService;->hasDomainURLs(Landroid/content/pm/PackageParser$Package;)Z
+PLcom/android/server/pm/PackageManagerService;->hasNonNegativePriority(Ljava/util/List;)Z
+PLcom/android/server/pm/PackageManagerService;->hasPermission(Landroid/content/pm/PackageParser$Package;Ljava/lang/String;)Z
+PLcom/android/server/pm/PackageManagerService;->hasSystemFeature(Ljava/lang/String;I)Z
+PLcom/android/server/pm/PackageManagerService;->hasSystemUidErrors()Z
+PLcom/android/server/pm/PackageManagerService;->hasWebURI(Landroid/content/Intent;)Z
+PLcom/android/server/pm/PackageManagerService;->installNewPackageLIF(Landroid/content/pm/PackageParser$Package;IILandroid/os/UserHandle;Ljava/lang/String;Ljava/lang/String;Lcom/android/server/pm/PackageManagerService$PackageInstalledInfo;I)V
+PLcom/android/server/pm/PackageManagerService;->installOnExternalAsec(I)Z
+PLcom/android/server/pm/PackageManagerService;->installPackageLI(Lcom/android/server/pm/PackageManagerService$InstallArgs;Lcom/android/server/pm/PackageManagerService$PackageInstalledInfo;)V
+PLcom/android/server/pm/PackageManagerService;->installPackageTracedLI(Lcom/android/server/pm/PackageManagerService$InstallArgs;Lcom/android/server/pm/PackageManagerService$PackageInstalledInfo;)V
+PLcom/android/server/pm/PackageManagerService;->installStage(Ljava/lang/String;Ljava/io/File;Ljava/lang/String;Landroid/content/pm/IPackageInstallObserver2;Landroid/content/pm/PackageInstaller$SessionParams;Ljava/lang/String;ILandroid/os/UserHandle;[[Ljava/security/cert/Certificate;)V
+PLcom/android/server/pm/PackageManagerService;->isCompatSignatureUpdateNeeded(Landroid/content/pm/PackageParser$Package;)Z
+PLcom/android/server/pm/PackageManagerService;->isEphemeralDisabled()Z
+PLcom/android/server/pm/PackageManagerService;->isExternal(Landroid/content/pm/PackageParser$Package;)Z
+PLcom/android/server/pm/PackageManagerService;->isExternal(Lcom/android/server/pm/PackageSetting;)Z
+PLcom/android/server/pm/PackageManagerService;->isExternalMediaAvailable()Z
+PLcom/android/server/pm/PackageManagerService;->isFirstBoot()Z
+PLcom/android/server/pm/PackageManagerService;->isInstantAppAllowed(Landroid/content/Intent;Ljava/util/List;IZ)Z
+PLcom/android/server/pm/PackageManagerService;->isMultiArch(Landroid/content/pm/ApplicationInfo;)Z
+PLcom/android/server/pm/PackageManagerService;->isNewPlatformPermissionForPackage(Ljava/lang/String;Landroid/content/pm/PackageParser$Package;)Z
+PLcom/android/server/pm/PackageManagerService;->isOnlyCoreApps()Z
+PLcom/android/server/pm/PackageManagerService;->isPermissionRevokedByPolicy(Ljava/lang/String;Ljava/lang/String;I)Z
+PLcom/android/server/pm/PackageManagerService;->isPrivilegedApp(Landroid/content/pm/PackageParser$Package;)Z
+PLcom/android/server/pm/PackageManagerService;->isProtectedBroadcast(Ljava/lang/String;)Z
+PLcom/android/server/pm/PackageManagerService;->isRecoverSignatureUpdateNeeded(Landroid/content/pm/PackageParser$Package;)Z
+PLcom/android/server/pm/PackageManagerService;->isSafeMode()Z
+PLcom/android/server/pm/PackageManagerService;->isStorageLow()Z
+PLcom/android/server/pm/PackageManagerService;->isSystemApp(Landroid/content/pm/PackageParser$Package;)Z
+PLcom/android/server/pm/PackageManagerService;->isUidPrivileged(I)Z
+PLcom/android/server/pm/PackageManagerService;->isUpdatedSystemApp(Lcom/android/server/pm/PackageSetting;)Z
+PLcom/android/server/pm/PackageManagerService;->isUpgrade()Z
+PLcom/android/server/pm/PackageManagerService;->isUserRestricted(ILjava/lang/String;)Z
+PLcom/android/server/pm/PackageManagerService;->isVerificationEnabled(III)Z
+PLcom/android/server/pm/PackageManagerService;->lambda$-com_android_server_pm_PackageManagerService_135654(Ljava/util/List;I)V
+PLcom/android/server/pm/PackageManagerService;->lambda$-com_android_server_pm_PackageManagerService_193108(Ljava/lang/String;JILandroid/content/pm/IPackageDataObserver;)V
+PLcom/android/server/pm/PackageManagerService;->loadMediaPackages(Landroid/util/ArrayMap;[IZ)V
+PLcom/android/server/pm/PackageManagerService;->locationIsPrivileged(Ljava/io/File;)Z
+PLcom/android/server/pm/PackageManagerService;->logAppProcessStartIfNeeded(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/pm/PackageManagerService;->matchComponentForVerifier(Ljava/lang/String;Ljava/util/List;)Landroid/content/ComponentName;
+PLcom/android/server/pm/PackageManagerService;->matchVerifiers(Landroid/content/pm/PackageInfoLite;Ljava/util/List;Lcom/android/server/pm/PackageVerificationState;)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService;->maybeAddInstantAppInstaller(Ljava/util/List;Landroid/content/Intent;Ljava/lang/String;II)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService;->maybeMigrateAppDataLIF(Landroid/content/pm/PackageParser$Package;I)Z
+PLcom/android/server/pm/PackageManagerService;->normalizePackageNameLPr(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService;->notifyDexLoad(Ljava/lang/String;Ljava/util/List;Ljava/lang/String;)V
+PLcom/android/server/pm/PackageManagerService;->packageIsBrowser(Ljava/lang/String;I)Z
+PLcom/android/server/pm/PackageManagerService;->performDexOptInternalWithDependenciesLI(Landroid/content/pm/PackageParser$Package;ZLjava/lang/String;ZZ)I
+PLcom/android/server/pm/PackageManagerService;->performDexOptTraced(Ljava/lang/String;ZLjava/lang/String;ZZ)I
+PLcom/android/server/pm/PackageManagerService;->performDexOptWithStatus(Ljava/lang/String;ZIZZ)I
+PLcom/android/server/pm/PackageManagerService;->performFstrimIfNeeded()V
+PLcom/android/server/pm/PackageManagerService;->prepareAppDataAfterInstallLIF(Landroid/content/pm/PackageParser$Package;)V
+PLcom/android/server/pm/PackageManagerService;->prepareAppDataAndMigrateLIF(Landroid/content/pm/PackageParser$Package;IIZ)V
+PLcom/android/server/pm/PackageManagerService;->prepareAppDataContentsLeafLIF(Landroid/content/pm/PackageParser$Package;II)V
+PLcom/android/server/pm/PackageManagerService;->prepareAppDataLIF(Landroid/content/pm/PackageParser$Package;II)V
+PLcom/android/server/pm/PackageManagerService;->prepareAppDataLeafLIF(Landroid/content/pm/PackageParser$Package;II)V
+PLcom/android/server/pm/PackageManagerService;->preparePackageParserCache(Z)Ljava/io/File;
+PLcom/android/server/pm/PackageManagerService;->processPendingInstall(Lcom/android/server/pm/PackageManagerService$InstallArgs;I)V
+PLcom/android/server/pm/PackageManagerService;->queryCrossProfileIntents(Ljava/util/List;Landroid/content/Intent;Ljava/lang/String;IIZ)Landroid/content/pm/ResolveInfo;
+PLcom/android/server/pm/PackageManagerService;->queryIntentActivities(Landroid/content/Intent;Ljava/lang/String;II)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/pm/PackageManagerService;->queryIntentActivityOptions(Landroid/content/ComponentName;[Landroid/content/Intent;[Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;II)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/pm/PackageManagerService;->queryIntentActivityOptionsInternal(Landroid/content/ComponentName;[Landroid/content/Intent;[Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;II)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService;->queryIntentContentProviders(Landroid/content/Intent;Ljava/lang/String;II)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/pm/PackageManagerService;->queryIntentContentProvidersInternal(Landroid/content/Intent;Ljava/lang/String;II)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService;->queryIntentReceivers(Landroid/content/Intent;Ljava/lang/String;II)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/pm/PackageManagerService;->querySkipCurrentProfileIntents(Ljava/util/List;Landroid/content/Intent;Ljava/lang/String;II)Landroid/content/pm/ResolveInfo;
+PLcom/android/server/pm/PackageManagerService;->reconcileAppsData(IIZ)V
+PLcom/android/server/pm/PackageManagerService;->reconcileAppsDataLI(Ljava/lang/String;IIZ)V
+PLcom/android/server/pm/PackageManagerService;->reconcileAppsDataLI(Ljava/lang/String;IIZZ)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService;->registerMoveCallback(Landroid/content/pm/IPackageMoveObserver;)V
+PLcom/android/server/pm/PackageManagerService;->removeOnPermissionsChangeListener(Landroid/content/pm/IOnPermissionsChangeListener;)V
+PLcom/android/server/pm/PackageManagerService;->replacePreferredActivity(Landroid/content/IntentFilter;I[Landroid/content/ComponentName;Landroid/content/ComponentName;I)V
+PLcom/android/server/pm/PackageManagerService;->resolveIntent(Landroid/content/Intent;Ljava/lang/String;II)Landroid/content/pm/ResolveInfo;
+PLcom/android/server/pm/PackageManagerService;->resolveIntentInternal(Landroid/content/Intent;Ljava/lang/String;IIZ)Landroid/content/pm/ResolveInfo;
+PLcom/android/server/pm/PackageManagerService;->resolveService(Landroid/content/Intent;Ljava/lang/String;II)Landroid/content/pm/ResolveInfo;
+PLcom/android/server/pm/PackageManagerService;->scanAvailableAsecs()V
+PLcom/android/server/pm/PackageManagerService;->scanDirLI(Ljava/io/File;IIJ)V
+PLcom/android/server/pm/PackageManagerService;->scanDirTracedLI(Ljava/io/File;IIJ)V
+PLcom/android/server/pm/PackageManagerService;->scanPackageInternalLI(Landroid/content/pm/PackageParser$Package;Ljava/io/File;IIJLandroid/os/UserHandle;)Landroid/content/pm/PackageParser$Package;
+PLcom/android/server/pm/PackageManagerService;->scanPackageLI(Landroid/content/pm/PackageParser$Package;IIJLandroid/os/UserHandle;)Landroid/content/pm/PackageParser$Package;
+PLcom/android/server/pm/PackageManagerService;->scanPackageLI(Landroid/content/pm/PackageParser$Package;Ljava/io/File;IIJLandroid/os/UserHandle;)Landroid/content/pm/PackageParser$Package;
+PLcom/android/server/pm/PackageManagerService;->scanPackageTracedLI(Landroid/content/pm/PackageParser$Package;IIJLandroid/os/UserHandle;)Landroid/content/pm/PackageParser$Package;
+PLcom/android/server/pm/PackageManagerService;->scheduleWritePackageRestrictionsLocked(I)V
+PLcom/android/server/pm/PackageManagerService;->sendPackageAddedForNewUsers(Ljava/lang/String;ZI[I)V
+PLcom/android/server/pm/PackageManagerService;->sendPackageBroadcast(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;ILjava/lang/String;Landroid/content/IIntentReceiver;[I)V
+PLcom/android/server/pm/PackageManagerService;->sendPackageChangedBroadcast(Ljava/lang/String;ZLjava/util/ArrayList;I)V
+PLcom/android/server/pm/PackageManagerService;->sendSessionCommitBroadcast(Landroid/content/pm/PackageInstaller$SessionInfo;I)V
+PLcom/android/server/pm/PackageManagerService;->setApplicationEnabledSetting(Ljava/lang/String;IIILjava/lang/String;)V
+PLcom/android/server/pm/PackageManagerService;->setComponentEnabledSetting(Landroid/content/ComponentName;III)V
+PLcom/android/server/pm/PackageManagerService;->setNativeLibraryPaths(Landroid/content/pm/PackageParser$Package;Ljava/io/File;)V
+PLcom/android/server/pm/PackageManagerService;->setUpInstantAppInstallerActivityLP(Landroid/content/pm/ActivityInfo;)V
+PLcom/android/server/pm/PackageManagerService;->shouldCheckUpgradeKeySetLP(Lcom/android/server/pm/PackageSetting;I)Z
+PLcom/android/server/pm/PackageManagerService;->shouldShowRequestPermissionRationale(Ljava/lang/String;Ljava/lang/String;I)Z
+PLcom/android/server/pm/PackageManagerService;->startCleaningPackages()V
+PLcom/android/server/pm/PackageManagerService;->startIntentFilterVerifications(IZLandroid/content/pm/PackageParser$Package;)V
+PLcom/android/server/pm/PackageManagerService;->systemReady()V
+PLcom/android/server/pm/PackageManagerService;->updateAllSharedLibrariesLPw(Landroid/content/pm/PackageParser$Package;)Ljava/util/ArrayList;
+PLcom/android/server/pm/PackageManagerService;->updateExternalMediaStatusInner(ZZZ)V
+PLcom/android/server/pm/PackageManagerService;->updateInstantAppInstallerLocked(Ljava/lang/String;)V
+PLcom/android/server/pm/PackageManagerService;->updateIntentForResolve(Landroid/content/Intent;)Landroid/content/Intent;
+PLcom/android/server/pm/PackageManagerService;->updatePackagesIfNeeded()V
+PLcom/android/server/pm/PackageManagerService;->updatePermissionsLPw(Ljava/lang/String;Landroid/content/pm/PackageParser$Package;I)V
+PLcom/android/server/pm/PackageManagerService;->updateSequenceNumberLP(Lcom/android/server/pm/PackageSetting;[I)V
+PLcom/android/server/pm/PackageManagerService;->updateSettingsInternalLI(Landroid/content/pm/PackageParser$Package;Ljava/lang/String;[I[ILcom/android/server/pm/PackageManagerService$PackageInstalledInfo;Landroid/os/UserHandle;I)V
+PLcom/android/server/pm/PackageManagerService;->updateSettingsLI(Landroid/content/pm/PackageParser$Package;Ljava/lang/String;[ILcom/android/server/pm/PackageManagerService$PackageInstalledInfo;Landroid/os/UserHandle;I)V
+PLcom/android/server/pm/PackageManagerService;->updateSharedLibrariesLPr(Landroid/content/pm/PackageParser$Package;Landroid/content/pm/PackageParser$Package;)V
+PLcom/android/server/pm/PackageManagerService;->verifyIntentFiltersIfNeeded(IIZLandroid/content/pm/PackageParser$Package;)V
+PLcom/android/server/pm/PackageManagerService;->verifyPendingInstall(II)V
+PLcom/android/server/pm/PackageManagerService;->verifySignaturesLP(Lcom/android/server/pm/PackageSetting;Landroid/content/pm/PackageParser$Package;)V
+PLcom/android/server/pm/PackageManagerService;->waitForAppDataPrepared()V
+PLcom/android/server/pm/PackageManagerServiceCompilerMapping;->getCompilerFilterForReason(I)Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerServiceUtils;->checkISA(Ljava/lang/String;)Z
+PLcom/android/server/pm/PackageSetting;-><init>(Lcom/android/server/pm/PackageSetting;)V
+PLcom/android/server/pm/PackageSetting;->doCopy(Lcom/android/server/pm/PackageSetting;)V
+PLcom/android/server/pm/PackageSetting;->getSharedUserId()I
+PLcom/android/server/pm/PackageSetting;->isPrivileged()Z
+PLcom/android/server/pm/PackageSetting;->isSharedUser()Z
+PLcom/android/server/pm/PackageSetting;->isSystem()Z
+PLcom/android/server/pm/PackageSetting;->toString()Ljava/lang/String;
+PLcom/android/server/pm/PackageSettingBase;-><init>(Lcom/android/server/pm/PackageSettingBase;Ljava/lang/String;)V
+PLcom/android/server/pm/PackageSettingBase;->disableComponentLPw(Ljava/lang/String;I)Z
+PLcom/android/server/pm/PackageSettingBase;->doCopy(Lcom/android/server/pm/PackageSettingBase;)V
+PLcom/android/server/pm/PackageSettingBase;->enableComponentLPw(Ljava/lang/String;I)Z
+PLcom/android/server/pm/PackageSettingBase;->getCurrentEnabledStateLPr(Ljava/lang/String;I)I
+PLcom/android/server/pm/PackageSettingBase;->getEnabled(I)I
+PLcom/android/server/pm/PackageSettingBase;->getInstallStatus()I
+PLcom/android/server/pm/PackageSettingBase;->getIntentFilterVerificationInfo()Landroid/content/pm/IntentFilterVerificationInfo;
+PLcom/android/server/pm/PackageSettingBase;->getNotInstalledUserIds()[I
+PLcom/android/server/pm/PackageSettingBase;->getNotLaunched(I)Z
+PLcom/android/server/pm/PackageSettingBase;->getOverlayPaths(I)[Ljava/lang/String;
+PLcom/android/server/pm/PackageSettingBase;->getStopped(I)Z
+PLcom/android/server/pm/PackageSettingBase;->getSuspended(I)Z
+PLcom/android/server/pm/PackageSettingBase;->modifyUserStateComponents(IZZ)Landroid/content/pm/PackageUserState;
+PLcom/android/server/pm/PackageSettingBase;->queryInstalledUsers([IZ)[I
+PLcom/android/server/pm/PackageSettingBase;->setCeDataInode(JI)V
+PLcom/android/server/pm/PackageSettingBase;->setInstallReason(II)V
+PLcom/android/server/pm/PackageSettingBase;->setInstallStatus(I)V
+PLcom/android/server/pm/PackageSettingBase;->setInstalled(ZI)V
+PLcom/android/server/pm/PackageSettingBase;->setInstallerPackageName(Ljava/lang/String;)V
+PLcom/android/server/pm/PackageSettingBase;->setOverlayPaths(Ljava/util/List;[Ljava/lang/String;I)V
+PLcom/android/server/pm/PackageSettingBase;->setUpdateAvailable(Z)V
+PLcom/android/server/pm/PackageSettingBase;->setUserState(IJIZZZZZZLjava/lang/String;Landroid/util/ArraySet;Landroid/util/ArraySet;III)V
+PLcom/android/server/pm/PackageUsage;->parseAsLong(Ljava/lang/String;)J
+PLcom/android/server/pm/PackageUsage;->readInternal(Ljava/lang/Object;)V
+PLcom/android/server/pm/PackageUsage;->readInternal(Ljava/util/Map;)V
+PLcom/android/server/pm/PackageUsage;->readLine(Ljava/io/InputStream;Ljava/lang/StringBuffer;)Ljava/lang/String;
+PLcom/android/server/pm/PackageUsage;->readVersion1LP(Ljava/util/Map;Ljava/io/InputStream;Ljava/lang/StringBuffer;)V
+PLcom/android/server/pm/PackageVerificationResponse;-><init>(II)V
+PLcom/android/server/pm/PackageVerificationState;-><init>(ILcom/android/server/pm/PackageManagerService$InstallArgs;)V
+PLcom/android/server/pm/PackageVerificationState;->getInstallArgs()Lcom/android/server/pm/PackageManagerService$InstallArgs;
+PLcom/android/server/pm/PackageVerificationState;->isInstallAllowed()Z
+PLcom/android/server/pm/PackageVerificationState;->isVerificationComplete()Z
+PLcom/android/server/pm/PackageVerificationState;->setVerifierResponse(II)Z
+PLcom/android/server/pm/ParallelPackageParser$ParseResult;-><init>()V
+PLcom/android/server/pm/ParallelPackageParser;-><init>([Ljava/lang/String;ZLandroid/util/DisplayMetrics;Ljava/io/File;Landroid/content/pm/PackageParser$Callback;)V
+PLcom/android/server/pm/ParallelPackageParser;->close()V
+PLcom/android/server/pm/ParallelPackageParser;->lambda$-com_android_server_pm_ParallelPackageParser_3701(Ljava/io/File;I)V
+PLcom/android/server/pm/ParallelPackageParser;->parsePackage(Landroid/content/pm/PackageParser;Ljava/io/File;I)Landroid/content/pm/PackageParser$Package;
+PLcom/android/server/pm/ParallelPackageParser;->submit(Ljava/io/File;I)V
+PLcom/android/server/pm/ParallelPackageParser;->take()Lcom/android/server/pm/ParallelPackageParser$ParseResult;
+PLcom/android/server/pm/PermissionsState$PermissionData;->revoke(I)Z
+PLcom/android/server/pm/PermissionsState;-><init>(Lcom/android/server/pm/PermissionsState;)V
+PLcom/android/server/pm/PermissionsState;->computeGids([I)[I
+PLcom/android/server/pm/PermissionsState;->ensureNoPermissionData(Ljava/lang/String;)V
+PLcom/android/server/pm/PermissionsState;->getInstallPermissionState(Ljava/lang/String;)Lcom/android/server/pm/PermissionsState$PermissionState;
+PLcom/android/server/pm/PermissionsState;->getInstallPermissionStates()Ljava/util/List;
+PLcom/android/server/pm/PermissionsState;->getPermissionFlags(Ljava/lang/String;I)I
+PLcom/android/server/pm/PermissionsState;->getRuntimePermissionStates(I)Ljava/util/List;
+PLcom/android/server/pm/PermissionsState;->grantRuntimePermission(Lcom/android/server/pm/BasePermission;I)I
+PLcom/android/server/pm/PermissionsState;->reset()V
+PLcom/android/server/pm/PermissionsState;->revokeInstallPermission(Lcom/android/server/pm/BasePermission;)I
+PLcom/android/server/pm/PermissionsState;->revokePermission(Lcom/android/server/pm/BasePermission;I)I
+PLcom/android/server/pm/PermissionsState;->setGlobalGids([I)V
+PLcom/android/server/pm/Policy;->getMatchedSeInfo(Landroid/content/pm/PackageParser$Package;)Ljava/lang/String;
+PLcom/android/server/pm/PreferredActivity;-><init>(Lorg/xmlpull/v1/XmlPullParser;)V
+PLcom/android/server/pm/PreferredActivity;->onReadTag(Ljava/lang/String;Lorg/xmlpull/v1/XmlPullParser;)Z
+PLcom/android/server/pm/PreferredActivity;->writeToXml(Lorg/xmlpull/v1/XmlSerializer;Z)V
+PLcom/android/server/pm/PreferredComponent;-><init>(Lcom/android/server/pm/PreferredComponent$Callbacks;Lorg/xmlpull/v1/XmlPullParser;)V
+PLcom/android/server/pm/PreferredComponent;->getParseError()Ljava/lang/String;
+PLcom/android/server/pm/PreferredComponent;->sameSet([Landroid/content/ComponentName;)Z
+PLcom/android/server/pm/PreferredComponent;->writeToXml(Lorg/xmlpull/v1/XmlSerializer;Z)V
+PLcom/android/server/pm/PreferredIntentResolver;-><init>()V
+PLcom/android/server/pm/PreferredIntentResolver;->newArray(I)[Landroid/content/IntentFilter;
+PLcom/android/server/pm/PreferredIntentResolver;->newArray(I)[Lcom/android/server/pm/PreferredActivity;
+PLcom/android/server/pm/ProcessLoggingHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/pm/ProcessLoggingHandler;->invalidateProcessLoggingBaseApkHash(Ljava/lang/String;)V
+PLcom/android/server/pm/ProtectedPackages;->hasDeviceOwnerOrProfileOwner(ILjava/lang/String;)Z
+PLcom/android/server/pm/ProtectedPackages;->isPackageStateProtected(ILjava/lang/String;)Z
+PLcom/android/server/pm/ProtectedPackages;->isProtectedPackage(Ljava/lang/String;)Z
+PLcom/android/server/pm/ProtectedPackages;->setDeviceAndProfileOwnerPackages(ILjava/lang/String;Landroid/util/SparseArray;)V
+PLcom/android/server/pm/SettingBase;-><init>(Lcom/android/server/pm/SettingBase;)V
+PLcom/android/server/pm/SettingBase;->doCopy(Lcom/android/server/pm/SettingBase;)V
+PLcom/android/server/pm/Settings$KernelPackageState;-><init>()V
+PLcom/android/server/pm/Settings$KernelPackageState;-><init>(Lcom/android/server/pm/Settings$KernelPackageState;)V
+PLcom/android/server/pm/Settings$RuntimePermissionPersistence$MyHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/pm/Settings$RuntimePermissionPersistence;->-wrap1(Lcom/android/server/pm/Settings$RuntimePermissionPersistence;I)V
+PLcom/android/server/pm/Settings$RuntimePermissionPersistence;->areDefaultRuntimPermissionsGrantedLPr(I)Z
+PLcom/android/server/pm/Settings$RuntimePermissionPersistence;->parsePermissionsLPr(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/pm/PermissionsState;I)V
+PLcom/android/server/pm/Settings$RuntimePermissionPersistence;->parseRuntimePermissionsLPr(Lorg/xmlpull/v1/XmlPullParser;I)V
+PLcom/android/server/pm/Settings$RuntimePermissionPersistence;->readStateForUserSyncLPr(I)V
+PLcom/android/server/pm/Settings$RuntimePermissionPersistence;->writePermissionsForUserAsyncLPr(I)V
+PLcom/android/server/pm/Settings$VersionInfo;->forceCurrent()V
+PLcom/android/server/pm/Settings;->-get0(Lcom/android/server/pm/Settings;)Landroid/util/SparseArray;
+PLcom/android/server/pm/Settings;->-wrap0(Lcom/android/server/pm/Settings;I)Ljava/io/File;
+PLcom/android/server/pm/Settings;->addPackageSettingLPw(Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/SharedUserSetting;)V
+PLcom/android/server/pm/Settings;->addUserToSettingLPw(Lcom/android/server/pm/PackageSetting;)V
+PLcom/android/server/pm/Settings;->applyPendingPermissionGrantsLPw(Ljava/lang/String;I)V
+PLcom/android/server/pm/Settings;->areDefaultRuntimePermissionsGrantedLPr(I)Z
+PLcom/android/server/pm/Settings;->createNewSetting(Ljava/lang/String;Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;Ljava/lang/String;Lcom/android/server/pm/SharedUserSetting;Ljava/io/File;Ljava/io/File;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IIILandroid/os/UserHandle;ZZLjava/lang/String;Ljava/util/List;Lcom/android/server/pm/UserManagerService;[Ljava/lang/String;[I)Lcom/android/server/pm/PackageSetting;
+PLcom/android/server/pm/Settings;->editPreferredActivitiesLPw(I)Lcom/android/server/pm/PreferredIntentResolver;
+PLcom/android/server/pm/Settings;->getAllSharedUsersLPw()Ljava/util/Collection;
+PLcom/android/server/pm/Settings;->getApplicationEnabledSettingLPr(Ljava/lang/String;I)I
+PLcom/android/server/pm/Settings;->getBlockUninstallLPr(ILjava/lang/String;)Z
+PLcom/android/server/pm/Settings;->getComponentEnabledSettingLPr(Landroid/content/ComponentName;I)I
+PLcom/android/server/pm/Settings;->getDefaultBrowserPackageNameLPw(I)Ljava/lang/String;
+PLcom/android/server/pm/Settings;->getDisabledSystemPkgLPr(Ljava/lang/String;)Lcom/android/server/pm/PackageSetting;
+PLcom/android/server/pm/Settings;->getInstallerPackageNameLPr(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/pm/Settings;->getIntentFilterVerificationLPr(Ljava/lang/String;)Landroid/content/pm/IntentFilterVerificationInfo;
+PLcom/android/server/pm/Settings;->getInternalVersion()Lcom/android/server/pm/Settings$VersionInfo;
+PLcom/android/server/pm/Settings;->getListOfIncompleteInstallPackagesLPr()Ljava/util/ArrayList;
+PLcom/android/server/pm/Settings;->getPackageLPr(Ljava/lang/String;)Lcom/android/server/pm/PackageSetting;
+PLcom/android/server/pm/Settings;->getSharedUserLPw(Ljava/lang/String;IIZ)Lcom/android/server/pm/SharedUserSetting;
+PLcom/android/server/pm/Settings;->getUserPackagesStateBackupFile(I)Ljava/io/File;
+PLcom/android/server/pm/Settings;->getUserPackagesStateFile(I)Ljava/io/File;
+PLcom/android/server/pm/Settings;->getUserRuntimePermissionsFile(I)Ljava/io/File;
+PLcom/android/server/pm/Settings;->getVolumePackagesLPr(Ljava/lang/String;)Ljava/util/List;
+PLcom/android/server/pm/Settings;->insertPackageSettingLPw(Lcom/android/server/pm/PackageSetting;Landroid/content/pm/PackageParser$Package;)V
+PLcom/android/server/pm/Settings;->isDisabledSystemPackageLPr(Ljava/lang/String;)Z
+PLcom/android/server/pm/Settings;->newUserIdLPw(Ljava/lang/Object;)I
+PLcom/android/server/pm/Settings;->pruneSharedUsersLPw()V
+PLcom/android/server/pm/Settings;->readComponentsLPr(Lorg/xmlpull/v1/XmlPullParser;)Landroid/util/ArraySet;
+PLcom/android/server/pm/Settings;->readCrossProfileIntentFiltersLPw(Lorg/xmlpull/v1/XmlPullParser;I)V
+PLcom/android/server/pm/Settings;->readDefaultAppsLPw(Lorg/xmlpull/v1/XmlPullParser;I)V
+PLcom/android/server/pm/Settings;->readDisabledSysPackageLPw(Lorg/xmlpull/v1/XmlPullParser;)V
+PLcom/android/server/pm/Settings;->readPersistentPreferredActivitiesLPw(Lorg/xmlpull/v1/XmlPullParser;I)V
+PLcom/android/server/pm/Settings;->readPreferredActivitiesLPw(Lorg/xmlpull/v1/XmlPullParser;I)V
+PLcom/android/server/pm/Settings;->readSharedUserLPw(Lorg/xmlpull/v1/XmlPullParser;)V
+PLcom/android/server/pm/Settings;->setInstallStatus(Ljava/lang/String;I)V
+PLcom/android/server/pm/Settings;->setInstallerPackageName(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/pm/Settings;->updatePackageSetting(Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/SharedUserSetting;Ljava/io/File;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IILjava/util/List;Lcom/android/server/pm/UserManagerService;[Ljava/lang/String;[I)V
+PLcom/android/server/pm/Settings;->wasPackageEverLaunchedLPr(Ljava/lang/String;I)Z
+PLcom/android/server/pm/Settings;->writeAllRuntimePermissionsLPr()V
+PLcom/android/server/pm/Settings;->writeAllUsersPackageRestrictionsLPr()V
+PLcom/android/server/pm/Settings;->writeBlockUninstallPackagesLPr(Lorg/xmlpull/v1/XmlSerializer;I)V
+PLcom/android/server/pm/Settings;->writeChildPackagesLPw(Lorg/xmlpull/v1/XmlSerializer;Ljava/util/List;)V
+PLcom/android/server/pm/Settings;->writeCrossProfileIntentFiltersLPr(Lorg/xmlpull/v1/XmlSerializer;I)V
+PLcom/android/server/pm/Settings;->writeDefaultAppsLPr(Lorg/xmlpull/v1/XmlSerializer;I)V
+PLcom/android/server/pm/Settings;->writeDisabledSysPackageLPr(Lorg/xmlpull/v1/XmlSerializer;Lcom/android/server/pm/PackageSetting;)V
+PLcom/android/server/pm/Settings;->writeDomainVerificationsLPr(Lorg/xmlpull/v1/XmlSerializer;Landroid/content/pm/IntentFilterVerificationInfo;)V
+PLcom/android/server/pm/Settings;->writeKeySetAliasesLPr(Lorg/xmlpull/v1/XmlSerializer;Lcom/android/server/pm/PackageKeySetData;)V
+PLcom/android/server/pm/Settings;->writePackageListLPr()V
+PLcom/android/server/pm/Settings;->writePersistentPreferredActivitiesLPr(Lorg/xmlpull/v1/XmlSerializer;I)V
+PLcom/android/server/pm/Settings;->writePreferredActivitiesLPr(Lorg/xmlpull/v1/XmlSerializer;IZ)V
+PLcom/android/server/pm/Settings;->writeRuntimePermissionsForUserLPr(IZ)V
+PLcom/android/server/pm/Settings;->writeUpgradeKeySetsLPr(Lorg/xmlpull/v1/XmlSerializer;Lcom/android/server/pm/PackageKeySetData;)V
+PLcom/android/server/pm/Settings;->writeUserRestrictionsLPw(Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;)V
+PLcom/android/server/pm/Settings;->writeUsesStaticLibLPw(Lorg/xmlpull/v1/XmlSerializer;[Ljava/lang/String;[I)V
+PLcom/android/server/pm/SharedUserSetting;->addPackage(Lcom/android/server/pm/PackageSetting;)V
+PLcom/android/server/pm/ShortcutBitmapSaver$PendingItem;-><init>(Landroid/content/pm/ShortcutInfo;[B)V
+PLcom/android/server/pm/ShortcutBitmapSaver$PendingItem;-><init>(Landroid/content/pm/ShortcutInfo;[BLcom/android/server/pm/ShortcutBitmapSaver$PendingItem;)V
+PLcom/android/server/pm/ShortcutBitmapSaver;-><init>(Lcom/android/server/pm/ShortcutService;)V
+PLcom/android/server/pm/ShortcutBitmapSaver;->getBitmapPathMayWaitLocked(Landroid/content/pm/ShortcutInfo;)Ljava/lang/String;
+PLcom/android/server/pm/ShortcutBitmapSaver;->lambda$-com_android_server_pm_ShortcutBitmapSaver_4411(Ljava/util/concurrent/CountDownLatch;)V
+PLcom/android/server/pm/ShortcutBitmapSaver;->lambda$-com_android_server_pm_ShortcutBitmapSaver_7645()V
+PLcom/android/server/pm/ShortcutBitmapSaver;->processPendingItems()Z
+PLcom/android/server/pm/ShortcutBitmapSaver;->removeIcon(Landroid/content/pm/ShortcutInfo;)V
+PLcom/android/server/pm/ShortcutBitmapSaver;->saveBitmapLocked(Landroid/content/pm/ShortcutInfo;ILandroid/graphics/Bitmap$CompressFormat;I)V
+PLcom/android/server/pm/ShortcutBitmapSaver;->waitForAllSavesLocked()Z
+PLcom/android/server/pm/ShortcutDumpFiles;-><init>(Lcom/android/server/pm/ShortcutService;)V
+PLcom/android/server/pm/ShortcutLauncher;-><init>(Lcom/android/server/pm/ShortcutUser;ILjava/lang/String;I)V
+PLcom/android/server/pm/ShortcutLauncher;-><init>(Lcom/android/server/pm/ShortcutUser;ILjava/lang/String;ILcom/android/server/pm/ShortcutPackageInfo;)V
+PLcom/android/server/pm/ShortcutLauncher;->addPinnedShortcut(Ljava/lang/String;ILjava/lang/String;)V
+PLcom/android/server/pm/ShortcutLauncher;->getPinnedShortcutIds(Ljava/lang/String;I)Landroid/util/ArraySet;
+PLcom/android/server/pm/ShortcutLauncher;->hasPinned(Landroid/content/pm/ShortcutInfo;)Z
+PLcom/android/server/pm/ShortcutLauncher;->pinShortcuts(ILjava/lang/String;Ljava/util/List;)V
+PLcom/android/server/pm/ShortcutLauncher;->saveToXml(Lorg/xmlpull/v1/XmlSerializer;Z)V
+PLcom/android/server/pm/ShortcutPackage;-><init>(Lcom/android/server/pm/ShortcutUser;ILjava/lang/String;)V
+PLcom/android/server/pm/ShortcutPackage;-><init>(Lcom/android/server/pm/ShortcutUser;ILjava/lang/String;Lcom/android/server/pm/ShortcutPackageInfo;)V
+PLcom/android/server/pm/ShortcutPackage;->addOrUpdateDynamicShortcut(Landroid/content/pm/ShortcutInfo;)V
+PLcom/android/server/pm/ShortcutPackage;->addShortcutInner(Landroid/content/pm/ShortcutInfo;)V
+PLcom/android/server/pm/ShortcutPackage;->adjustRanks()V
+PLcom/android/server/pm/ShortcutPackage;->areAllActivitiesStillEnabled()Z
+PLcom/android/server/pm/ShortcutPackage;->clearAllImplicitRanks()V
+PLcom/android/server/pm/ShortcutPackage;->deleteAllDynamicShortcuts()V
+PLcom/android/server/pm/ShortcutPackage;->deleteDynamicWithId(Ljava/lang/String;)Z
+PLcom/android/server/pm/ShortcutPackage;->deleteOrDisableWithId(Ljava/lang/String;ZZ)Landroid/content/pm/ShortcutInfo;
+PLcom/android/server/pm/ShortcutPackage;->deleteShortcutInner(Ljava/lang/String;)Landroid/content/pm/ShortcutInfo;
+PLcom/android/server/pm/ShortcutPackage;->enforceShortcutCountsBeforeOperation(Ljava/util/List;I)V
+PLcom/android/server/pm/ShortcutPackage;->ensureImmutableShortcutsNotIncluded(Ljava/util/List;)V
+PLcom/android/server/pm/ShortcutPackage;->ensureImmutableShortcutsNotIncludedWithIds(Ljava/util/List;)V
+PLcom/android/server/pm/ShortcutPackage;->ensureNotImmutable(Landroid/content/pm/ShortcutInfo;)V
+PLcom/android/server/pm/ShortcutPackage;->ensureNotImmutable(Ljava/lang/String;)V
+PLcom/android/server/pm/ShortcutPackage;->findAll(Ljava/util/List;Ljava/util/function/Predicate;I)V
+PLcom/android/server/pm/ShortcutPackage;->findAll(Ljava/util/List;Ljava/util/function/Predicate;ILjava/lang/String;I)V
+PLcom/android/server/pm/ShortcutPackage;->findShortcutById(Ljava/lang/String;)Landroid/content/pm/ShortcutInfo;
+PLcom/android/server/pm/ShortcutPackage;->getApiCallCount()I
+PLcom/android/server/pm/ShortcutPackage;->getFileName(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/pm/ShortcutPackage;->getOwnerUserId()I
+PLcom/android/server/pm/ShortcutPackage;->getUsedBitmapFiles()Landroid/util/ArraySet;
+PLcom/android/server/pm/ShortcutPackage;->incrementCountForActivity(Landroid/util/ArrayMap;Landroid/content/ComponentName;I)V
+PLcom/android/server/pm/ShortcutPackage;->lambda$-com_android_server_pm_ShortcutPackage_14748(Lcom/android/server/pm/ShortcutLauncher;)V
+PLcom/android/server/pm/ShortcutPackage;->lambda$-com_android_server_pm_ShortcutPackage_41443(Landroid/content/pm/ShortcutInfo;Landroid/content/pm/ShortcutInfo;)I
+PLcom/android/server/pm/ShortcutPackage;->loadFromXml(Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutUser;Lorg/xmlpull/v1/XmlPullParser;Z)Lcom/android/server/pm/ShortcutPackage;
+PLcom/android/server/pm/ShortcutPackage;->parseIntent(Lorg/xmlpull/v1/XmlPullParser;)Landroid/content/Intent;
+PLcom/android/server/pm/ShortcutPackage;->parseShortcut(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;I)Landroid/content/pm/ShortcutInfo;
+PLcom/android/server/pm/ShortcutPackage;->refreshPinnedFlags()V
+PLcom/android/server/pm/ShortcutPackage;->removeOrphans()V
+PLcom/android/server/pm/ShortcutPackage;->rescanPackageIfNeeded(ZZ)Z
+PLcom/android/server/pm/ShortcutPackage;->resetRateLimiting()V
+PLcom/android/server/pm/ShortcutPackage;->saveToXml(Lorg/xmlpull/v1/XmlSerializer;Z)V
+PLcom/android/server/pm/ShortcutPackage;->sortShortcutsToActivities()Landroid/util/ArrayMap;
+PLcom/android/server/pm/ShortcutPackage;->tryApiCall()Z
+PLcom/android/server/pm/ShortcutPackageInfo;-><init>(IJLjava/util/ArrayList;Z)V
+PLcom/android/server/pm/ShortcutPackageInfo;->getLastUpdateTime()J
+PLcom/android/server/pm/ShortcutPackageInfo;->getVersionCode()I
+PLcom/android/server/pm/ShortcutPackageInfo;->isShadow()Z
+PLcom/android/server/pm/ShortcutPackageInfo;->loadFromXml(Lorg/xmlpull/v1/XmlPullParser;Z)V
+PLcom/android/server/pm/ShortcutPackageInfo;->newEmpty()Lcom/android/server/pm/ShortcutPackageInfo;
+PLcom/android/server/pm/ShortcutPackageInfo;->saveToXml(Lorg/xmlpull/v1/XmlSerializer;)V
+PLcom/android/server/pm/ShortcutPackageItem;-><init>(Lcom/android/server/pm/ShortcutUser;ILjava/lang/String;Lcom/android/server/pm/ShortcutPackageInfo;)V
+PLcom/android/server/pm/ShortcutPackageItem;->attemptToRestoreIfNeededAndSave()V
+PLcom/android/server/pm/ShortcutPackageItem;->getPackageInfo()Lcom/android/server/pm/ShortcutPackageInfo;
+PLcom/android/server/pm/ShortcutPackageItem;->getPackageName()Ljava/lang/String;
+PLcom/android/server/pm/ShortcutPackageItem;->getPackageUserId()I
+PLcom/android/server/pm/ShortcutPackageItem;->getUser()Lcom/android/server/pm/ShortcutUser;
+PLcom/android/server/pm/ShortcutParser;->parseShortcuts(Lcom/android/server/pm/ShortcutService;Ljava/lang/String;I)Ljava/util/List;
+PLcom/android/server/pm/ShortcutParser;->parseShortcutsOneFile(Lcom/android/server/pm/ShortcutService;Landroid/content/pm/ActivityInfo;Ljava/lang/String;ILjava/util/List;)Ljava/util/List;
+PLcom/android/server/pm/ShortcutRequestPinProcessor$PinItemRequestInner;-><init>(Lcom/android/server/pm/ShortcutRequestPinProcessor;Landroid/content/IntentSender;I)V
+PLcom/android/server/pm/ShortcutRequestPinProcessor$PinItemRequestInner;-><init>(Lcom/android/server/pm/ShortcutRequestPinProcessor;Landroid/content/IntentSender;ILcom/android/server/pm/ShortcutRequestPinProcessor$PinItemRequestInner;)V
+PLcom/android/server/pm/ShortcutRequestPinProcessor$PinItemRequestInner;->accept(Landroid/os/Bundle;)Z
+PLcom/android/server/pm/ShortcutRequestPinProcessor$PinItemRequestInner;->isCallerValid()Z
+PLcom/android/server/pm/ShortcutRequestPinProcessor$PinShortcutRequestInner;-><init>(Lcom/android/server/pm/ShortcutRequestPinProcessor;Landroid/content/pm/ShortcutInfo;Landroid/content/pm/ShortcutInfo;Landroid/content/IntentSender;Ljava/lang/String;IIZ)V
+PLcom/android/server/pm/ShortcutRequestPinProcessor$PinShortcutRequestInner;-><init>(Lcom/android/server/pm/ShortcutRequestPinProcessor;Landroid/content/pm/ShortcutInfo;Landroid/content/pm/ShortcutInfo;Landroid/content/IntentSender;Ljava/lang/String;IIZLcom/android/server/pm/ShortcutRequestPinProcessor$PinShortcutRequestInner;)V
+PLcom/android/server/pm/ShortcutRequestPinProcessor$PinShortcutRequestInner;->getShortcutInfo()Landroid/content/pm/ShortcutInfo;
+PLcom/android/server/pm/ShortcutRequestPinProcessor$PinShortcutRequestInner;->tryAccept()Z
+PLcom/android/server/pm/ShortcutRequestPinProcessor;-><init>(Lcom/android/server/pm/ShortcutService;Ljava/lang/Object;)V
+PLcom/android/server/pm/ShortcutRequestPinProcessor;->directPinShortcut(Lcom/android/server/pm/ShortcutRequestPinProcessor$PinShortcutRequestInner;)Z
+PLcom/android/server/pm/ShortcutRequestPinProcessor;->getRequestPinConfirmationActivity(II)Landroid/util/Pair;
+PLcom/android/server/pm/ShortcutRequestPinProcessor;->isCallerUid(I)Z
+PLcom/android/server/pm/ShortcutRequestPinProcessor;->isRequestPinItemSupported(II)Z
+PLcom/android/server/pm/ShortcutRequestPinProcessor;->requestPinItemLocked(Landroid/content/pm/ShortcutInfo;Landroid/appwidget/AppWidgetProviderInfo;Landroid/os/Bundle;ILandroid/content/IntentSender;)Z
+PLcom/android/server/pm/ShortcutRequestPinProcessor;->requestPinShortcutLocked(Landroid/content/pm/ShortcutInfo;Landroid/content/IntentSender;Landroid/util/Pair;)Landroid/content/pm/LauncherApps$PinItemRequest;
+PLcom/android/server/pm/ShortcutRequestPinProcessor;->sendResultIntent(Landroid/content/IntentSender;Landroid/content/Intent;)V
+PLcom/android/server/pm/ShortcutRequestPinProcessor;->startRequestConfirmActivity(Landroid/content/ComponentName;ILandroid/content/pm/LauncherApps$PinItemRequest;I)Z
+PLcom/android/server/pm/ShortcutService$1;-><init>()V
+PLcom/android/server/pm/ShortcutService$1;->test(Landroid/content/pm/ResolveInfo;)Z
+PLcom/android/server/pm/ShortcutService$1;->test(Ljava/lang/Object;)Z
+PLcom/android/server/pm/ShortcutService$2;-><init>()V
+PLcom/android/server/pm/ShortcutService$2;->test(Landroid/content/pm/PackageInfo;)Z
+PLcom/android/server/pm/ShortcutService$2;->test(Ljava/lang/Object;)Z
+PLcom/android/server/pm/ShortcutService$3;-><init>(Lcom/android/server/pm/ShortcutService;)V
+PLcom/android/server/pm/ShortcutService$3;->onUidGone(IZ)V
+PLcom/android/server/pm/ShortcutService$3;->onUidStateChanged(IIJ)V
+PLcom/android/server/pm/ShortcutService$4;-><init>(Lcom/android/server/pm/ShortcutService;)V
+PLcom/android/server/pm/ShortcutService$5;-><init>(Lcom/android/server/pm/ShortcutService;)V
+PLcom/android/server/pm/ShortcutService$5;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/pm/ShortcutService$FileOutputStreamWithPath;-><init>(Ljava/io/File;)V
+PLcom/android/server/pm/ShortcutService$FileOutputStreamWithPath;->getFile()Ljava/io/File;
+PLcom/android/server/pm/ShortcutService$Lifecycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/pm/ShortcutService$Lifecycle;->onBootPhase(I)V
+PLcom/android/server/pm/ShortcutService$Lifecycle;->onStart()V
+PLcom/android/server/pm/ShortcutService$Lifecycle;->onUnlockUser(I)V
+PLcom/android/server/pm/ShortcutService$LocalService;-><init>(Lcom/android/server/pm/ShortcutService;)V
+PLcom/android/server/pm/ShortcutService$LocalService;-><init>(Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutService$LocalService;)V
+PLcom/android/server/pm/ShortcutService$LocalService;->addListener(Landroid/content/pm/ShortcutServiceInternal$ShortcutChangeListener;)V
+PLcom/android/server/pm/ShortcutService$LocalService;->getShortcutIconFd(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;I)Landroid/os/ParcelFileDescriptor;
+PLcom/android/server/pm/ShortcutService$LocalService;->getShortcuts(ILjava/lang/String;JLjava/lang/String;Ljava/util/List;Landroid/content/ComponentName;II)Ljava/util/List;
+PLcom/android/server/pm/ShortcutService$LocalService;->getShortcutsInnerLocked(ILjava/lang/String;Ljava/lang/String;Ljava/util/List;JLandroid/content/ComponentName;IILjava/util/ArrayList;I)V
+PLcom/android/server/pm/ShortcutService$LocalService;->hasShortcutHostPermission(ILjava/lang/String;)Z
+PLcom/android/server/pm/ShortcutService$LocalService;->lambda$-com_android_server_pm_ShortcutService$LocalService_85705(ILjava/lang/String;Ljava/util/List;JLandroid/content/ComponentName;IILjava/util/ArrayList;ILcom/android/server/pm/ShortcutPackage;)V
+PLcom/android/server/pm/ShortcutService$LocalService;->lambda$-com_android_server_pm_ShortcutService$LocalService_86821(JLandroid/util/ArraySet;Landroid/content/ComponentName;ILandroid/content/pm/ShortcutInfo;)Z
+PLcom/android/server/pm/ShortcutService$LocalService;->pinShortcuts(ILjava/lang/String;Ljava/lang/String;Ljava/util/List;I)V
+PLcom/android/server/pm/ShortcutService;->-com_android_server_pm_ShortcutService-mthref-0()V
+PLcom/android/server/pm/ShortcutService;->-com_android_server_pm_ShortcutService-mthref-1(Landroid/content/pm/ShortcutInfo;)Z
+PLcom/android/server/pm/ShortcutService;->-com_android_server_pm_ShortcutService-mthref-2(Landroid/content/pm/ShortcutInfo;)Z
+PLcom/android/server/pm/ShortcutService;->-com_android_server_pm_ShortcutService-mthref-3(Landroid/content/pm/ShortcutInfo;)Z
+PLcom/android/server/pm/ShortcutService;->-get1(Lcom/android/server/pm/ShortcutService;)Ljava/util/ArrayList;
+PLcom/android/server/pm/ShortcutService;->-get2(Lcom/android/server/pm/ShortcutService;)Ljava/lang/Object;
+PLcom/android/server/pm/ShortcutService;->-get3(Lcom/android/server/pm/ShortcutService;)Lcom/android/server/pm/ShortcutBitmapSaver;
+PLcom/android/server/pm/ShortcutService;->-wrap0(Landroid/content/pm/PackageInfo;)Z
+PLcom/android/server/pm/ShortcutService;->-wrap2(Lcom/android/server/pm/ShortcutService;Ljava/util/List;)Ljava/util/List;
+PLcom/android/server/pm/ShortcutService;->-wrap4(Lcom/android/server/pm/ShortcutService;Ljava/lang/String;I)V
+PLcom/android/server/pm/ShortcutService;->-wrap5(Lcom/android/server/pm/ShortcutService;Ljava/lang/String;I)V
+PLcom/android/server/pm/ShortcutService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/pm/ShortcutService;-><init>(Landroid/content/Context;Landroid/os/Looper;Z)V
+PLcom/android/server/pm/ShortcutService;->assignImplicitRanks(Ljava/util/List;)V
+PLcom/android/server/pm/ShortcutService;->checkPackageChanges(I)V
+PLcom/android/server/pm/ShortcutService;->cleanupDanglingBitmapDirectoriesLocked(I)V
+PLcom/android/server/pm/ShortcutService;->cleanupDanglingBitmapFilesLocked(ILcom/android/server/pm/ShortcutUser;Ljava/lang/String;Ljava/io/File;)V
+PLcom/android/server/pm/ShortcutService;->disableShortcuts(Ljava/lang/String;Ljava/util/List;Ljava/lang/CharSequence;II)V
+PLcom/android/server/pm/ShortcutService;->enableShortcuts(Ljava/lang/String;Ljava/util/List;I)V
+PLcom/android/server/pm/ShortcutService;->enforceMaxActivityShortcuts(I)V
+PLcom/android/server/pm/ShortcutService;->fillInDefaultActivity(Ljava/util/List;)V
+PLcom/android/server/pm/ShortcutService;->fixUpIncomingShortcutInfo(Landroid/content/pm/ShortcutInfo;Z)V
+PLcom/android/server/pm/ShortcutService;->fixUpIncomingShortcutInfo(Landroid/content/pm/ShortcutInfo;ZZ)V
+PLcom/android/server/pm/ShortcutService;->fixUpShortcutResourceNamesAndValues(Landroid/content/pm/ShortcutInfo;)V
+PLcom/android/server/pm/ShortcutService;->forUpdatedPackages(IJZLjava/util/function/Consumer;)V
+PLcom/android/server/pm/ShortcutService;->getActivityInfoWithMetadata(Landroid/content/ComponentName;I)Landroid/content/pm/ActivityInfo;
+PLcom/android/server/pm/ShortcutService;->getApplicationInfo(Ljava/lang/String;I)Landroid/content/pm/ApplicationInfo;
+PLcom/android/server/pm/ShortcutService;->getBaseStateFile()Landroid/util/AtomicFile;
+PLcom/android/server/pm/ShortcutService;->getDefaultLauncher(I)Landroid/content/ComponentName;
+PLcom/android/server/pm/ShortcutService;->getDynamicShortcuts(Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/pm/ShortcutService;->getIconMaxDimensions(Ljava/lang/String;I)I
+PLcom/android/server/pm/ShortcutService;->getInstalledPackages(I)Ljava/util/List;
+PLcom/android/server/pm/ShortcutService;->getLastResetTimeLocked()J
+PLcom/android/server/pm/ShortcutService;->getLauncherShortcutsLocked(Ljava/lang/String;II)Lcom/android/server/pm/ShortcutLauncher;
+PLcom/android/server/pm/ShortcutService;->getMainActivityIntent()Landroid/content/Intent;
+PLcom/android/server/pm/ShortcutService;->getManifestShortcuts(Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/pm/ShortcutService;->getMaxShortcutCountPerActivity(Ljava/lang/String;I)I
+PLcom/android/server/pm/ShortcutService;->getPackageInfo(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;
+PLcom/android/server/pm/ShortcutService;->getPackageInfo(Ljava/lang/String;IZ)Landroid/content/pm/PackageInfo;
+PLcom/android/server/pm/ShortcutService;->getPackageShortcutsForPublisherLocked(Ljava/lang/String;I)Lcom/android/server/pm/ShortcutPackage;
+PLcom/android/server/pm/ShortcutService;->getParentOrSelfUserId(I)I
+PLcom/android/server/pm/ShortcutService;->getPinnedShortcuts(Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/pm/ShortcutService;->getShortcutsWithQueryLocked(Ljava/lang/String;IILjava/util/function/Predicate;)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/pm/ShortcutService;->getUidLastForegroundElapsedTimeLocked(I)J
+PLcom/android/server/pm/ShortcutService;->getUserBitmapFilePath(I)Ljava/io/File;
+PLcom/android/server/pm/ShortcutService;->getUserFile(I)Ljava/io/File;
+PLcom/android/server/pm/ShortcutService;->getUserShortcutsLocked(I)Lcom/android/server/pm/ShortcutUser;
+PLcom/android/server/pm/ShortcutService;->handleOnUidStateChanged(II)V
+PLcom/android/server/pm/ShortcutService;->handlePackageAdded(Ljava/lang/String;I)V
+PLcom/android/server/pm/ShortcutService;->handlePackageChanged(Ljava/lang/String;I)V
+PLcom/android/server/pm/ShortcutService;->handleUnlockUser(I)V
+PLcom/android/server/pm/ShortcutService;->hasShortcutHostPermission(Ljava/lang/String;I)Z
+PLcom/android/server/pm/ShortcutService;->hasShortcutHostPermissionInner(Ljava/lang/String;I)Z
+PLcom/android/server/pm/ShortcutService;->initialize()V
+PLcom/android/server/pm/ShortcutService;->injectApplicationInfoWithUninstalled(Ljava/lang/String;I)Landroid/content/pm/ApplicationInfo;
+PLcom/android/server/pm/ShortcutService;->injectBinderCallingUid()I
+PLcom/android/server/pm/ShortcutService;->injectBuildFingerprint()Ljava/lang/String;
+PLcom/android/server/pm/ShortcutService;->injectClearCallingIdentity()J
+PLcom/android/server/pm/ShortcutService;->injectCurrentTimeMillis()J
+PLcom/android/server/pm/ShortcutService;->injectDipToPixel(I)I
+PLcom/android/server/pm/ShortcutService;->injectGetActivityInfoWithMetadataWithUninstalled(Landroid/content/ComponentName;I)Landroid/content/pm/ActivityInfo;
+PLcom/android/server/pm/ShortcutService;->injectGetDefaultMainActivity(Ljava/lang/String;I)Landroid/content/ComponentName;
+PLcom/android/server/pm/ShortcutService;->injectGetLocaleTagsForUser(I)Ljava/lang/String;
+PLcom/android/server/pm/ShortcutService;->injectGetMainActivities(Ljava/lang/String;I)Ljava/util/List;
+PLcom/android/server/pm/ShortcutService;->injectGetPackageUid(Ljava/lang/String;I)I
+PLcom/android/server/pm/ShortcutService;->injectGetPackagesWithUninstalled(I)Ljava/util/List;
+PLcom/android/server/pm/ShortcutService;->injectGetPinConfirmationActivity(Ljava/lang/String;II)Landroid/content/ComponentName;
+PLcom/android/server/pm/ShortcutService;->injectGetResourcesForApplicationAsUser(Ljava/lang/String;I)Landroid/content/res/Resources;
+PLcom/android/server/pm/ShortcutService;->injectIsActivityEnabledAndExported(Landroid/content/ComponentName;I)Z
+PLcom/android/server/pm/ShortcutService;->injectIsLowRamDevice()Z
+PLcom/android/server/pm/ShortcutService;->injectIsMainActivity(Landroid/content/ComponentName;I)Z
+PLcom/android/server/pm/ShortcutService;->injectIsSafeModeEnabled()Z
+PLcom/android/server/pm/ShortcutService;->injectPackageInfoWithUninstalled(Ljava/lang/String;IZ)Landroid/content/pm/PackageInfo;
+PLcom/android/server/pm/ShortcutService;->injectPostToHandler(Ljava/lang/Runnable;)V
+PLcom/android/server/pm/ShortcutService;->injectRegisterUidObserver(Landroid/app/IUidObserver;I)V
+PLcom/android/server/pm/ShortcutService;->injectRestoreCallingIdentity(J)V
+PLcom/android/server/pm/ShortcutService;->injectRunOnNewThread(Ljava/lang/Runnable;)V
+PLcom/android/server/pm/ShortcutService;->injectSendIntentSender(Landroid/content/IntentSender;Landroid/content/Intent;)V
+PLcom/android/server/pm/ShortcutService;->injectShortcutManagerConstants()Ljava/lang/String;
+PLcom/android/server/pm/ShortcutService;->injectShouldPerformVerification()Z
+PLcom/android/server/pm/ShortcutService;->injectSystemDataPath()Ljava/io/File;
+PLcom/android/server/pm/ShortcutService;->injectUserDataPath(I)Ljava/io/File;
+PLcom/android/server/pm/ShortcutService;->injectValidateIconResPackage(Landroid/content/pm/ShortcutInfo;Landroid/graphics/drawable/Icon;)V
+PLcom/android/server/pm/ShortcutService;->injectXmlMetaData(Landroid/content/pm/ActivityInfo;Ljava/lang/String;)Landroid/content/res/XmlResourceParser;
+PLcom/android/server/pm/ShortcutService;->isCallerSystem()Z
+PLcom/android/server/pm/ShortcutService;->isClockValid(J)Z
+PLcom/android/server/pm/ShortcutService;->isDummyMainActivity(Landroid/content/ComponentName;)Z
+PLcom/android/server/pm/ShortcutService;->isEphemeralApp(Landroid/content/pm/ApplicationInfo;)Z
+PLcom/android/server/pm/ShortcutService;->isEphemeralApp(Ljava/lang/String;I)Z
+PLcom/android/server/pm/ShortcutService;->isInstalled(Landroid/content/pm/ActivityInfo;)Z
+PLcom/android/server/pm/ShortcutService;->isInstalled(Landroid/content/pm/ApplicationInfo;)Z
+PLcom/android/server/pm/ShortcutService;->isInstalled(Landroid/content/pm/PackageInfo;)Z
+PLcom/android/server/pm/ShortcutService;->isInstalledOrNull(Landroid/content/pm/ActivityInfo;)Landroid/content/pm/ActivityInfo;
+PLcom/android/server/pm/ShortcutService;->isInstalledOrNull(Landroid/content/pm/ApplicationInfo;)Landroid/content/pm/ApplicationInfo;
+PLcom/android/server/pm/ShortcutService;->isInstalledOrNull(Landroid/content/pm/PackageInfo;)Landroid/content/pm/PackageInfo;
+PLcom/android/server/pm/ShortcutService;->isPackageInstalled(Ljava/lang/String;I)Z
+PLcom/android/server/pm/ShortcutService;->isProcessStateForeground(I)Z
+PLcom/android/server/pm/ShortcutService;->isRequestPinItemSupported(II)Z
+PLcom/android/server/pm/ShortcutService;->isUidForegroundLocked(I)Z
+PLcom/android/server/pm/ShortcutService;->isUserUnlockedL(I)Z
+PLcom/android/server/pm/ShortcutService;->lambda$-com_android_server_pm_ShortcutService_101495(Ljava/util/ArrayList;Lcom/android/server/pm/ShortcutPackageItem;)V
+PLcom/android/server/pm/ShortcutService;->lambda$-com_android_server_pm_ShortcutService_21427(JI)V
+PLcom/android/server/pm/ShortcutService;->lambda$-com_android_server_pm_ShortcutService_54784(ILjava/lang/String;)V
+PLcom/android/server/pm/ShortcutService;->loadBaseStateLocked()V
+PLcom/android/server/pm/ShortcutService;->loadConfigurationLocked()V
+PLcom/android/server/pm/ShortcutService;->loadUserInternal(ILjava/io/InputStream;Z)Lcom/android/server/pm/ShortcutUser;
+PLcom/android/server/pm/ShortcutService;->loadUserLocked(I)Lcom/android/server/pm/ShortcutUser;
+PLcom/android/server/pm/ShortcutService;->logDurationStat(IJ)V
+PLcom/android/server/pm/ShortcutService;->notifyListeners(Ljava/lang/String;I)V
+PLcom/android/server/pm/ShortcutService;->onBootPhase(I)V
+PLcom/android/server/pm/ShortcutService;->openIconFileForWrite(ILandroid/content/pm/ShortcutInfo;)Lcom/android/server/pm/ShortcutService$FileOutputStreamWithPath;
+PLcom/android/server/pm/ShortcutService;->packageShortcutsChanged(Ljava/lang/String;I)V
+PLcom/android/server/pm/ShortcutService;->parseBooleanAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)Z
+PLcom/android/server/pm/ShortcutService;->parseComponentNameAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)Landroid/content/ComponentName;
+PLcom/android/server/pm/ShortcutService;->parseIntAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)I
+PLcom/android/server/pm/ShortcutService;->parseIntentAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)Landroid/content/Intent;
+PLcom/android/server/pm/ShortcutService;->parseIntentAttributeNoDefault(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)Landroid/content/Intent;
+PLcom/android/server/pm/ShortcutService;->parseLongAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)J
+PLcom/android/server/pm/ShortcutService;->parseLongAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;J)J
+PLcom/android/server/pm/ShortcutService;->parseStringAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/pm/ShortcutService;->queryActivities(Landroid/content/Intent;IZ)Ljava/util/List;
+PLcom/android/server/pm/ShortcutService;->queryActivities(Landroid/content/Intent;Ljava/lang/String;Landroid/content/ComponentName;I)Ljava/util/List;
+PLcom/android/server/pm/ShortcutService;->removeIconLocked(Landroid/content/pm/ShortcutInfo;)V
+PLcom/android/server/pm/ShortcutService;->reportShortcutUsed(Ljava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/pm/ShortcutService;->requestPinItem(Ljava/lang/String;ILandroid/content/pm/ShortcutInfo;Landroid/appwidget/AppWidgetProviderInfo;Landroid/os/Bundle;Landroid/content/IntentSender;)Z
+PLcom/android/server/pm/ShortcutService;->requestPinShortcut(Ljava/lang/String;Landroid/content/pm/ShortcutInfo;Landroid/content/IntentSender;I)Z
+PLcom/android/server/pm/ShortcutService;->rescanUpdatedPackagesLocked(IJ)V
+PLcom/android/server/pm/ShortcutService;->saveDirtyInfo()V
+PLcom/android/server/pm/ShortcutService;->saveIconAndFixUpShortcutLocked(Landroid/content/pm/ShortcutInfo;)V
+PLcom/android/server/pm/ShortcutService;->saveUserInternalLocked(ILjava/io/OutputStream;Z)V
+PLcom/android/server/pm/ShortcutService;->saveUserLocked(I)V
+PLcom/android/server/pm/ShortcutService;->scheduleSaveInner(I)V
+PLcom/android/server/pm/ShortcutService;->scheduleSaveUser(I)V
+PLcom/android/server/pm/ShortcutService;->setDynamicShortcuts(Ljava/lang/String;Landroid/content/pm/ParceledListSlice;I)Z
+PLcom/android/server/pm/ShortcutService;->setReturnedByServer(Ljava/util/List;)Ljava/util/List;
+PLcom/android/server/pm/ShortcutService;->shrinkBitmap(Landroid/graphics/Bitmap;I)Landroid/graphics/Bitmap;
+PLcom/android/server/pm/ShortcutService;->throwIfUserLockedL(I)V
+PLcom/android/server/pm/ShortcutService;->updateConfigurationLocked(Ljava/lang/String;)Z
+PLcom/android/server/pm/ShortcutService;->updateShortcuts(Ljava/lang/String;Landroid/content/pm/ParceledListSlice;I)Z
+PLcom/android/server/pm/ShortcutService;->updateTimesLocked()V
+PLcom/android/server/pm/ShortcutService;->validateShortcutForPinRequest(Landroid/content/pm/ShortcutInfo;)V
+PLcom/android/server/pm/ShortcutService;->verifyCaller(Ljava/lang/String;I)V
+PLcom/android/server/pm/ShortcutService;->verifyStates()V
+PLcom/android/server/pm/ShortcutService;->writeAttr(Lorg/xmlpull/v1/XmlSerializer;Ljava/lang/String;Landroid/content/ComponentName;)V
+PLcom/android/server/pm/ShortcutService;->writeAttr(Lorg/xmlpull/v1/XmlSerializer;Ljava/lang/String;Landroid/content/Intent;)V
+PLcom/android/server/pm/ShortcutService;->writeAttr(Lorg/xmlpull/v1/XmlSerializer;Ljava/lang/String;Z)V
+PLcom/android/server/pm/ShortcutService;->writeTagExtra(Lorg/xmlpull/v1/XmlSerializer;Ljava/lang/String;Landroid/os/PersistableBundle;)V
+PLcom/android/server/pm/ShortcutService;->writeTagValue(Lorg/xmlpull/v1/XmlSerializer;Ljava/lang/String;Landroid/content/ComponentName;)V
+PLcom/android/server/pm/ShortcutService;->writeTagValue(Lorg/xmlpull/v1/XmlSerializer;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/pm/ShortcutUser$PackageWithUser;-><init>(ILjava/lang/String;)V
+PLcom/android/server/pm/ShortcutUser$PackageWithUser;->equals(Ljava/lang/Object;)Z
+PLcom/android/server/pm/ShortcutUser$PackageWithUser;->hashCode()I
+PLcom/android/server/pm/ShortcutUser$PackageWithUser;->of(ILjava/lang/String;)Lcom/android/server/pm/ShortcutUser$PackageWithUser;
+PLcom/android/server/pm/ShortcutUser;-><init>(Lcom/android/server/pm/ShortcutService;I)V
+PLcom/android/server/pm/ShortcutUser;->attemptToRestoreIfNeededAndSave(Lcom/android/server/pm/ShortcutService;Ljava/lang/String;I)V
+PLcom/android/server/pm/ShortcutUser;->clearLauncher()V
+PLcom/android/server/pm/ShortcutUser;->detectLocaleChange()V
+PLcom/android/server/pm/ShortcutUser;->forAllLaunchers(Ljava/util/function/Consumer;)V
+PLcom/android/server/pm/ShortcutUser;->forAllPackageItems(Ljava/util/function/Consumer;)V
+PLcom/android/server/pm/ShortcutUser;->forAllPackages(Ljava/util/function/Consumer;)V
+PLcom/android/server/pm/ShortcutUser;->forPackageItem(Ljava/lang/String;ILjava/util/function/Consumer;)V
+PLcom/android/server/pm/ShortcutUser;->getCachedLauncher()Landroid/content/ComponentName;
+PLcom/android/server/pm/ShortcutUser;->getKnownLocales()Ljava/lang/String;
+PLcom/android/server/pm/ShortcutUser;->getLastAppScanOsFingerprint()Ljava/lang/String;
+PLcom/android/server/pm/ShortcutUser;->getLastAppScanTime()J
+PLcom/android/server/pm/ShortcutUser;->getLastKnownLauncher()Landroid/content/ComponentName;
+PLcom/android/server/pm/ShortcutUser;->getLauncherShortcuts(Ljava/lang/String;I)Lcom/android/server/pm/ShortcutLauncher;
+PLcom/android/server/pm/ShortcutUser;->getPackageShortcuts(Ljava/lang/String;)Lcom/android/server/pm/ShortcutPackage;
+PLcom/android/server/pm/ShortcutUser;->getPackageShortcutsIfExists(Ljava/lang/String;)Lcom/android/server/pm/ShortcutPackage;
+PLcom/android/server/pm/ShortcutUser;->getUserId()I
+PLcom/android/server/pm/ShortcutUser;->hasPackage(Ljava/lang/String;)Z
+PLcom/android/server/pm/ShortcutUser;->lambda$-com_android_server_pm_ShortcutUser_8319(ILjava/lang/String;Ljava/util/function/Consumer;Lcom/android/server/pm/ShortcutPackageItem;)V
+PLcom/android/server/pm/ShortcutUser;->loadFromXml(Lcom/android/server/pm/ShortcutService;Lorg/xmlpull/v1/XmlPullParser;IZ)Lcom/android/server/pm/ShortcutUser;
+PLcom/android/server/pm/ShortcutUser;->onCalledByPublisher(Ljava/lang/String;)V
+PLcom/android/server/pm/ShortcutUser;->rescanPackageIfNeeded(Ljava/lang/String;Z)V
+PLcom/android/server/pm/ShortcutUser;->saveShortcutPackageItem(Lorg/xmlpull/v1/XmlSerializer;Lcom/android/server/pm/ShortcutPackageItem;Z)V
+PLcom/android/server/pm/ShortcutUser;->saveToXml(Lorg/xmlpull/v1/XmlSerializer;Z)V
+PLcom/android/server/pm/ShortcutUser;->setLastAppScanOsFingerprint(Ljava/lang/String;)V
+PLcom/android/server/pm/ShortcutUser;->setLastAppScanTime(J)V
+PLcom/android/server/pm/ShortcutUser;->setLauncher(Landroid/content/ComponentName;)V
+PLcom/android/server/pm/ShortcutUser;->setLauncher(Landroid/content/ComponentName;Z)V
+PLcom/android/server/pm/UserDataPreparer;->enforceSerialNumber(Ljava/io/File;I)V
+PLcom/android/server/pm/UserDataPreparer;->getDataSystemCeDirectory(I)Ljava/io/File;
+PLcom/android/server/pm/UserDataPreparer;->getDataUserCeDirectory(Ljava/lang/String;I)Ljava/io/File;
+PLcom/android/server/pm/UserDataPreparer;->getSerialNumber(Ljava/io/File;)I
+PLcom/android/server/pm/UserDataPreparer;->isFileEncryptedEmulatedOnly()Z
+PLcom/android/server/pm/UserDataPreparer;->prepareUserData(III)V
+PLcom/android/server/pm/UserDataPreparer;->prepareUserDataLI(Ljava/lang/String;IIIZ)V
+PLcom/android/server/pm/UserDataPreparer;->reconcileUsers(Ljava/lang/String;Ljava/util/List;)V
+PLcom/android/server/pm/UserDataPreparer;->reconcileUsers(Ljava/lang/String;Ljava/util/List;Ljava/util/List;)V
+PLcom/android/server/pm/UserManagerService$2;-><init>(Lcom/android/server/pm/UserManagerService;Landroid/os/Bundle;I)V
+PLcom/android/server/pm/UserManagerService$2;->run()V
+PLcom/android/server/pm/UserManagerService$3;-><init>(Lcom/android/server/pm/UserManagerService;ILandroid/os/Bundle;Landroid/os/Bundle;)V
+PLcom/android/server/pm/UserManagerService$3;->run()V
+PLcom/android/server/pm/UserManagerService$LifeCycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/pm/UserManagerService$LifeCycle;->onBootPhase(I)V
+PLcom/android/server/pm/UserManagerService$LifeCycle;->onStart()V
+PLcom/android/server/pm/UserManagerService$LocalService;->addUserRestrictionsListener(Landroid/os/UserManagerInternal$UserRestrictionsListener;)V
+PLcom/android/server/pm/UserManagerService$LocalService;->getUserIds()[I
+PLcom/android/server/pm/UserManagerService$LocalService;->getUserRestriction(ILjava/lang/String;)Z
+PLcom/android/server/pm/UserManagerService$LocalService;->isUserRunning(I)Z
+PLcom/android/server/pm/UserManagerService$LocalService;->isUserUnlocked(I)Z
+PLcom/android/server/pm/UserManagerService$LocalService;->setDeviceManaged(Z)V
+PLcom/android/server/pm/UserManagerService$LocalService;->setDevicePolicyUserRestrictions(ILandroid/os/Bundle;ZI)V
+PLcom/android/server/pm/UserManagerService$LocalService;->setUserManaged(IZ)V
+PLcom/android/server/pm/UserManagerService$LocalService;->setUserState(II)V
+PLcom/android/server/pm/UserManagerService$MainHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/pm/UserManagerService;->-get0(Lcom/android/server/pm/UserManagerService;)Lcom/android/internal/app/IAppOpsService;
+PLcom/android/server/pm/UserManagerService;->-get10(Lcom/android/server/pm/UserManagerService;)Ljava/lang/Object;
+PLcom/android/server/pm/UserManagerService;->-get2(Lcom/android/server/pm/UserManagerService;)Landroid/content/Context;
+PLcom/android/server/pm/UserManagerService;->-get4(Lcom/android/server/pm/UserManagerService;)Landroid/util/SparseBooleanArray;
+PLcom/android/server/pm/UserManagerService;->-get5(Lcom/android/server/pm/UserManagerService;)Ljava/lang/Object;
+PLcom/android/server/pm/UserManagerService;->-get7()Landroid/os/IBinder;
+PLcom/android/server/pm/UserManagerService;->-get8(Lcom/android/server/pm/UserManagerService;)Ljava/util/ArrayList;
+PLcom/android/server/pm/UserManagerService;->-set1(Lcom/android/server/pm/UserManagerService;Z)Z
+PLcom/android/server/pm/UserManagerService;->-wrap11(Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService$UserData;)V
+PLcom/android/server/pm/UserManagerService;->-wrap4(Lcom/android/server/pm/UserManagerService;I)Lcom/android/server/pm/UserManagerService$UserData;
+PLcom/android/server/pm/UserManagerService;->-wrap9(Lcom/android/server/pm/UserManagerService;ILandroid/os/Bundle;ZI)V
+PLcom/android/server/pm/UserManagerService;->applyUserRestrictionsLR(I)V
+PLcom/android/server/pm/UserManagerService;->checkManageOrInteractPermIfCallerInOtherProfileGroup(ILjava/lang/String;)V
+PLcom/android/server/pm/UserManagerService;->checkManageUserAndAcrossUsersFullPermission(Ljava/lang/String;)V
+PLcom/android/server/pm/UserManagerService;->checkManageUsersPermission(Ljava/lang/String;)V
+PLcom/android/server/pm/UserManagerService;->cleanupPartialUsers()V
+PLcom/android/server/pm/UserManagerService;->computeEffectiveUserRestrictionsLR(I)Landroid/os/Bundle;
+PLcom/android/server/pm/UserManagerService;->findCurrentGuestUser()Landroid/content/pm/UserInfo;
+PLcom/android/server/pm/UserManagerService;->getApplicationRestrictions(Ljava/lang/String;)Landroid/os/Bundle;
+PLcom/android/server/pm/UserManagerService;->getApplicationRestrictionsForUser(Ljava/lang/String;I)Landroid/os/Bundle;
+PLcom/android/server/pm/UserManagerService;->getCredentialOwnerProfile(I)I
+PLcom/android/server/pm/UserManagerService;->getEffectiveUserRestrictions(I)Landroid/os/Bundle;
+PLcom/android/server/pm/UserManagerService;->getProfileIdsLU(IZ)Landroid/util/IntArray;
+PLcom/android/server/pm/UserManagerService;->getProfileParent(I)Landroid/content/pm/UserInfo;
+PLcom/android/server/pm/UserManagerService;->getProfileParentLU(I)Landroid/content/pm/UserInfo;
+PLcom/android/server/pm/UserManagerService;->getProfiles(IZ)Ljava/util/List;
+PLcom/android/server/pm/UserManagerService;->getProfilesLU(IZZ)Ljava/util/List;
+PLcom/android/server/pm/UserManagerService;->getUidForPackage(Ljava/lang/String;)I
+PLcom/android/server/pm/UserManagerService;->getUserAccount(I)Ljava/lang/String;
+PLcom/android/server/pm/UserManagerService;->getUserDataNoChecks(I)Lcom/android/server/pm/UserManagerService$UserData;
+PLcom/android/server/pm/UserManagerService;->getUserHandle(I)I
+PLcom/android/server/pm/UserManagerService;->getUserIcon(I)Landroid/os/ParcelFileDescriptor;
+PLcom/android/server/pm/UserManagerService;->getUserRestrictionSources(Ljava/lang/String;I)Ljava/util/List;
+PLcom/android/server/pm/UserManagerService;->getUserRestrictions(I)Landroid/os/Bundle;
+PLcom/android/server/pm/UserManagerService;->getUserSerialNumber(I)I
+PLcom/android/server/pm/UserManagerService;->hasBaseUserRestriction(Ljava/lang/String;I)Z
+PLcom/android/server/pm/UserManagerService;->hasUserRestriction(Ljava/lang/String;I)Z
+PLcom/android/server/pm/UserManagerService;->isDemoUser(I)Z
+PLcom/android/server/pm/UserManagerService;->isManagedProfile(I)Z
+PLcom/android/server/pm/UserManagerService;->isProfileOf(Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;)Z
+PLcom/android/server/pm/UserManagerService;->isQuietModeEnabled(I)Z
+PLcom/android/server/pm/UserManagerService;->isRestricted()Z
+PLcom/android/server/pm/UserManagerService;->isSameProfileGroup(II)Z
+PLcom/android/server/pm/UserManagerService;->isUserRunning(I)Z
+PLcom/android/server/pm/UserManagerService;->isUserUnlocked(I)Z
+PLcom/android/server/pm/UserManagerService;->isUserUnlockingOrUnlocked(I)Z
+PLcom/android/server/pm/UserManagerService;->onBeforeUnlockUser(I)V
+PLcom/android/server/pm/UserManagerService;->onUserLoggedIn(I)V
+PLcom/android/server/pm/UserManagerService;->packageToRestrictionsFileName(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/pm/UserManagerService;->propagateUserRestrictionsLR(ILandroid/os/Bundle;Landroid/os/Bundle;)V
+PLcom/android/server/pm/UserManagerService;->readApplicationRestrictionsLP(Landroid/util/AtomicFile;)Landroid/os/Bundle;
+PLcom/android/server/pm/UserManagerService;->readApplicationRestrictionsLP(Ljava/lang/String;I)Landroid/os/Bundle;
+PLcom/android/server/pm/UserManagerService;->reconcileUsers(Ljava/lang/String;)V
+PLcom/android/server/pm/UserManagerService;->scheduleWriteUser(Lcom/android/server/pm/UserManagerService$UserData;)V
+PLcom/android/server/pm/UserManagerService;->setDevicePolicyUserRestrictionsInner(ILandroid/os/Bundle;ZI)V
+PLcom/android/server/pm/UserManagerService;->setUserRestriction(Ljava/lang/String;ZI)V
+PLcom/android/server/pm/UserManagerService;->systemReady()V
+PLcom/android/server/pm/UserManagerService;->updateRestrictionsIfNeededLR(ILandroid/os/Bundle;Landroid/util/SparseArray;)Z
+PLcom/android/server/pm/UserManagerService;->updateUserRestrictionsInternalLR(Landroid/os/Bundle;I)V
+PLcom/android/server/pm/UserManagerService;->writeUserLP(Lcom/android/server/pm/UserManagerService$UserData;)V
+PLcom/android/server/pm/UserManagerService;->writeUserLP(Lcom/android/server/pm/UserManagerService$UserData;Ljava/io/OutputStream;)V
+PLcom/android/server/pm/UserRestrictionsUtils;->applyUserRestrictions(Landroid/content/Context;ILandroid/os/Bundle;Landroid/os/Bundle;)V
+PLcom/android/server/pm/UserRestrictionsUtils;->areEqual(Landroid/os/Bundle;Landroid/os/Bundle;)Z
+PLcom/android/server/pm/UserRestrictionsUtils;->clone(Landroid/os/Bundle;)Landroid/os/Bundle;
+PLcom/android/server/pm/UserRestrictionsUtils;->isEmpty(Landroid/os/Bundle;)Z
+PLcom/android/server/pm/UserRestrictionsUtils;->isValidRestriction(Ljava/lang/String;)Z
+PLcom/android/server/pm/UserRestrictionsUtils;->mergeAll(Landroid/util/SparseArray;)Landroid/os/Bundle;
+PLcom/android/server/pm/UserRestrictionsUtils;->nonNull(Landroid/os/Bundle;)Landroid/os/Bundle;
+PLcom/android/server/pm/UserRestrictionsUtils;->restrictionsChanged(Landroid/os/Bundle;Landroid/os/Bundle;[Ljava/lang/String;)Z
+PLcom/android/server/pm/UserRestrictionsUtils;->sortToGlobalAndLocal(Landroid/os/Bundle;ZILandroid/os/Bundle;Landroid/os/Bundle;)V
+PLcom/android/server/pm/UserRestrictionsUtils;->writeRestrictions(Lorg/xmlpull/v1/XmlSerializer;Landroid/os/Bundle;Ljava/lang/String;)V
+PLcom/android/server/pm/dex/DexManager$DexSearchResult;->-get0(Lcom/android/server/pm/dex/DexManager$DexSearchResult;)I
+PLcom/android/server/pm/dex/DexManager$DexSearchResult;->-get1(Lcom/android/server/pm/dex/DexManager$DexSearchResult;)Ljava/lang/String;
+PLcom/android/server/pm/dex/DexManager$DexSearchResult;-><init>(Lcom/android/server/pm/dex/DexManager;Ljava/lang/String;I)V
+PLcom/android/server/pm/dex/DexManager$PackageCodeLocations;->-get0(Lcom/android/server/pm/dex/DexManager$PackageCodeLocations;)Ljava/lang/String;
+PLcom/android/server/pm/dex/DexManager$PackageCodeLocations;-><init>(Landroid/content/pm/ApplicationInfo;I)V
+PLcom/android/server/pm/dex/DexManager$PackageCodeLocations;-><init>(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V
+PLcom/android/server/pm/dex/DexManager$PackageCodeLocations;->mergeAppDataDirs(Ljava/lang/String;I)V
+PLcom/android/server/pm/dex/DexManager$PackageCodeLocations;->updateCodeLocation(Ljava/lang/String;[Ljava/lang/String;)V
+PLcom/android/server/pm/dex/DexManager;->-get0()I
+PLcom/android/server/pm/dex/DexManager;->-get1()I
+PLcom/android/server/pm/dex/DexManager;->-wrap0(Ljava/util/Map;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/android/server/pm/dex/DexManager;->cachePackageCodeLocation(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;I)V
+PLcom/android/server/pm/dex/DexManager;->cachePackageInfo(Landroid/content/pm/PackageInfo;I)V
+PLcom/android/server/pm/dex/DexManager;->getPackageUseInfo(Ljava/lang/String;)Lcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;
+PLcom/android/server/pm/dex/DexManager;->isUsedByOtherApps(Ljava/lang/String;)Z
+PLcom/android/server/pm/dex/DexManager;->load(Ljava/util/Map;)V
+PLcom/android/server/pm/dex/DexManager;->loadInternal(Ljava/util/Map;)V
+PLcom/android/server/pm/dex/DexManager;->notifyDexLoad(Landroid/content/pm/ApplicationInfo;Ljava/util/List;Ljava/lang/String;I)V
+PLcom/android/server/pm/dex/DexManager;->notifyDexLoadInternal(Landroid/content/pm/ApplicationInfo;Ljava/util/List;Ljava/lang/String;I)V
+PLcom/android/server/pm/dex/DexManager;->notifyPackageInstalled(Landroid/content/pm/PackageInfo;I)V
+PLcom/android/server/pm/dex/DexManager;->putIfAbsent(Ljava/util/Map;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;->-get1(Lcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;)Ljava/util/Set;
+PLcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;->-get2(Lcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;)I
+PLcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;->-wrap0(Lcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;Lcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;)Z
+PLcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;-><init>(Lcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;)V
+PLcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;-><init>(ZI)V
+PLcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;-><init>(ZILjava/lang/String;)V
+PLcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;->merge(Lcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;)Z
+PLcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;->-get0(Lcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;)Ljava/util/Map;
+PLcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;->-get1(Lcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;)Z
+PLcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;->-set0(Lcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;Z)Z
+PLcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;->-wrap0(Lcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;Z)Z
+PLcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;-><init>()V
+PLcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;-><init>(Lcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;)V
+PLcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;->isUsedByOtherApps()Z
+PLcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;->merge(Z)Z
+PLcom/android/server/pm/dex/PackageDexUsage;->getPackageUseInfo(Ljava/lang/String;)Lcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;
+PLcom/android/server/pm/dex/PackageDexUsage;->maybeWriteAsync()V
+PLcom/android/server/pm/dex/PackageDexUsage;->read()V
+PLcom/android/server/pm/dex/PackageDexUsage;->read(Ljava/io/Reader;)V
+PLcom/android/server/pm/dex/PackageDexUsage;->readBoolean(Ljava/lang/String;)Z
+PLcom/android/server/pm/dex/PackageDexUsage;->readInternal(Ljava/lang/Object;)V
+PLcom/android/server/pm/dex/PackageDexUsage;->readInternal(Ljava/lang/Void;)V
+PLcom/android/server/pm/dex/PackageDexUsage;->record(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;ZZ)Z
+PLcom/android/server/pm/dex/PackageDexUsage;->syncData(Ljava/util/Map;)V
+PLcom/android/server/policy/AccessibilityShortcutController$1;-><init>(Lcom/android/server/policy/AccessibilityShortcutController;Landroid/os/Handler;)V
+PLcom/android/server/policy/AccessibilityShortcutController$FrameworkObjectProvider;-><init>()V
+PLcom/android/server/policy/AccessibilityShortcutController;-><init>(Landroid/content/Context;Landroid/os/Handler;I)V
+PLcom/android/server/policy/AccessibilityShortcutController;->getTargetServiceComponentNameString(Landroid/content/Context;I)Ljava/lang/String;
+PLcom/android/server/policy/AccessibilityShortcutController;->isAccessibilityShortcutAvailable(Z)Z
+PLcom/android/server/policy/AccessibilityShortcutController;->onSettingsChanged()V
+PLcom/android/server/policy/AccessibilityShortcutController;->setCurrentUser(I)V
+PLcom/android/server/policy/BarController$1;-><init>(Lcom/android/server/policy/BarController;I)V
+PLcom/android/server/policy/BarController$1;->run()V
+PLcom/android/server/policy/BarController$BarHandler;-><init>(Lcom/android/server/policy/BarController;)V
+PLcom/android/server/policy/BarController$BarHandler;-><init>(Lcom/android/server/policy/BarController;Lcom/android/server/policy/BarController$BarHandler;)V
+PLcom/android/server/policy/BarController;->-get0(Lcom/android/server/policy/BarController;)I
+PLcom/android/server/policy/BarController;-><init>(Ljava/lang/String;IIIIII)V
+PLcom/android/server/policy/BarController;->adjustSystemUiVisibilityLw(II)V
+PLcom/android/server/policy/BarController;->checkHiddenLw()Z
+PLcom/android/server/policy/BarController;->checkShowTransientBarLw()Z
+PLcom/android/server/policy/BarController;->computeStateLw(ZZLandroid/view/WindowManagerPolicy$WindowState;Z)I
+PLcom/android/server/policy/BarController;->getStatusBarInternal()Lcom/android/server/statusbar/StatusBarManagerInternal;
+PLcom/android/server/policy/BarController;->setOnBarVisibilityChangedListener(Lcom/android/server/policy/BarController$OnBarVisibilityChangedListener;)V
+PLcom/android/server/policy/BarController;->setShowTransparent(Z)V
+PLcom/android/server/policy/BarController;->setWindow(Landroid/view/WindowManagerPolicy$WindowState;)V
+PLcom/android/server/policy/BarController;->skipAnimation()Z
+PLcom/android/server/policy/BarController;->updateStateLw(I)Z
+PLcom/android/server/policy/BarController;->wasRecentlyTranslucent()Z
+PLcom/android/server/policy/GlobalKeyManager;-><init>(Landroid/content/Context;)V
+PLcom/android/server/policy/GlobalKeyManager;->handleGlobalKey(Landroid/content/Context;ILandroid/view/KeyEvent;)Z
+PLcom/android/server/policy/GlobalKeyManager;->loadGlobalKeys(Landroid/content/Context;)V
+PLcom/android/server/policy/GlobalKeyManager;->shouldHandleGlobalKey(ILandroid/view/KeyEvent;)Z
+PLcom/android/server/policy/IconUtilities;-><init>(Landroid/content/Context;)V
+PLcom/android/server/policy/ImmersiveModeConfirmation$1;-><init>(Lcom/android/server/policy/ImmersiveModeConfirmation;)V
+PLcom/android/server/policy/ImmersiveModeConfirmation$2;-><init>(Lcom/android/server/policy/ImmersiveModeConfirmation;)V
+PLcom/android/server/policy/ImmersiveModeConfirmation$H;-><init>(Lcom/android/server/policy/ImmersiveModeConfirmation;)V
+PLcom/android/server/policy/ImmersiveModeConfirmation$H;-><init>(Lcom/android/server/policy/ImmersiveModeConfirmation;Lcom/android/server/policy/ImmersiveModeConfirmation$H;)V
+PLcom/android/server/policy/ImmersiveModeConfirmation;-><init>(Landroid/content/Context;)V
+PLcom/android/server/policy/ImmersiveModeConfirmation;->getNavBarExitDuration()J
+PLcom/android/server/policy/ImmersiveModeConfirmation;->getWindowToken()Landroid/os/IBinder;
+PLcom/android/server/policy/ImmersiveModeConfirmation;->loadSetting(I)V
+PLcom/android/server/policy/ImmersiveModeConfirmation;->systemReady()V
+PLcom/android/server/policy/LogDecelerateInterpolator;-><init>(II)V
+PLcom/android/server/policy/LogDecelerateInterpolator;->computeLog(FII)F
+PLcom/android/server/policy/LogDecelerateInterpolator;->getInterpolation(F)F
+PLcom/android/server/policy/PhoneWindowManager$10;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$11;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$12;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$12;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/policy/PhoneWindowManager$13;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$14;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$14;->onDown()V
+PLcom/android/server/policy/PhoneWindowManager$14;->onFling(I)V
+PLcom/android/server/policy/PhoneWindowManager$14;->onSwipeFromLeft()V
+PLcom/android/server/policy/PhoneWindowManager$14;->onSwipeFromTop()V
+PLcom/android/server/policy/PhoneWindowManager$14;->onUpOrCancel()V
+PLcom/android/server/policy/PhoneWindowManager$15;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$15;->onAppTransitionCancelledLocked(I)V
+PLcom/android/server/policy/PhoneWindowManager$15;->onAppTransitionStartingLocked(ILandroid/os/IBinder;Landroid/os/IBinder;Landroid/view/animation/Animation;Landroid/view/animation/Animation;)I
+PLcom/android/server/policy/PhoneWindowManager$16;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$16;->onTrustedChanged()V
+PLcom/android/server/policy/PhoneWindowManager$19;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$19;->run()V
+PLcom/android/server/policy/PhoneWindowManager$1;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$1;->run()V
+PLcom/android/server/policy/PhoneWindowManager$21;-><init>(Lcom/android/server/policy/PhoneWindowManager;IIILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/view/WindowManagerPolicy$WindowState;Z)V
+PLcom/android/server/policy/PhoneWindowManager$21;->run()V
+PLcom/android/server/policy/PhoneWindowManager$2;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$2;->onDrawn()V
+PLcom/android/server/policy/PhoneWindowManager$3;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$4;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$5;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$6;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$7;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$8;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$9;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$MyOrientationListener$1;-><init>(Lcom/android/server/policy/PhoneWindowManager$MyOrientationListener;)V
+PLcom/android/server/policy/PhoneWindowManager$MyOrientationListener$1;->run()V
+PLcom/android/server/policy/PhoneWindowManager$MyOrientationListener;-><init>(Lcom/android/server/policy/PhoneWindowManager;Landroid/content/Context;Landroid/os/Handler;)V
+PLcom/android/server/policy/PhoneWindowManager$MyOrientationListener;->onProposedRotationChanged(I)V
+PLcom/android/server/policy/PhoneWindowManager$MyWakeGestureListener;-><init>(Lcom/android/server/policy/PhoneWindowManager;Landroid/content/Context;Landroid/os/Handler;)V
+PLcom/android/server/policy/PhoneWindowManager$PolicyHandler;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$PolicyHandler;-><init>(Lcom/android/server/policy/PhoneWindowManager;Lcom/android/server/policy/PhoneWindowManager$PolicyHandler;)V
+PLcom/android/server/policy/PhoneWindowManager$PolicyHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/policy/PhoneWindowManager$ScreenLockTimeout;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$ScreenshotRunnable;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$ScreenshotRunnable;-><init>(Lcom/android/server/policy/PhoneWindowManager;Lcom/android/server/policy/PhoneWindowManager$ScreenshotRunnable;)V
+PLcom/android/server/policy/PhoneWindowManager$SettingsObserver;-><init>(Lcom/android/server/policy/PhoneWindowManager;Landroid/os/Handler;)V
+PLcom/android/server/policy/PhoneWindowManager$SettingsObserver;->observe()V
+PLcom/android/server/policy/PhoneWindowManager$SettingsObserver;->onChange(Z)V
+PLcom/android/server/policy/PhoneWindowManager;->-wrap12(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager;->-wrap14(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager;->-wrap20(Lcom/android/server/policy/PhoneWindowManager;Landroid/view/WindowManagerPolicy$WindowState;)V
+PLcom/android/server/policy/PhoneWindowManager;->-wrap3(Lcom/android/server/policy/PhoneWindowManager;ILandroid/view/animation/Animation;)I
+PLcom/android/server/policy/PhoneWindowManager;->-wrap4(Lcom/android/server/policy/PhoneWindowManager;)I
+PLcom/android/server/policy/PhoneWindowManager;-><init>()V
+PLcom/android/server/policy/PhoneWindowManager;->addSplashScreen(Landroid/os/IBinder;Ljava/lang/String;ILandroid/content/res/CompatibilityInfo;Ljava/lang/CharSequence;IIIILandroid/content/res/Configuration;I)Landroid/view/WindowManagerPolicy$StartingSurface;
+PLcom/android/server/policy/PhoneWindowManager;->addSplashscreenContent(Lcom/android/internal/policy/PhoneWindow;Landroid/content/Context;)V
+PLcom/android/server/policy/PhoneWindowManager;->adjustConfigurationLw(Landroid/content/res/Configuration;II)V
+PLcom/android/server/policy/PhoneWindowManager;->adjustSystemUiVisibilityLw(I)I
+PLcom/android/server/policy/PhoneWindowManager;->adjustWindowParamsLw(Landroid/view/WindowManager$LayoutParams;)V
+PLcom/android/server/policy/PhoneWindowManager;->allowAppAnimationsLw()Z
+PLcom/android/server/policy/PhoneWindowManager;->applyLidSwitchState()V
+PLcom/android/server/policy/PhoneWindowManager;->applyStableConstraints(IILandroid/graphics/Rect;)V
+PLcom/android/server/policy/PhoneWindowManager;->areTranslucentBarsAllowed()Z
+PLcom/android/server/policy/PhoneWindowManager;->awakenDreams()V
+PLcom/android/server/policy/PhoneWindowManager;->beginPostLayoutPolicyLw(II)V
+PLcom/android/server/policy/PhoneWindowManager;->bindKeyguard()V
+PLcom/android/server/policy/PhoneWindowManager;->calculateRelevantTaskInsets(Landroid/graphics/Rect;Landroid/graphics/Rect;II)V
+PLcom/android/server/policy/PhoneWindowManager;->canDismissBootAnimation()Z
+PLcom/android/server/policy/PhoneWindowManager;->canHideNavigationBar()Z
+PLcom/android/server/policy/PhoneWindowManager;->canReceiveInput(Landroid/view/WindowManagerPolicy$WindowState;)Z
+PLcom/android/server/policy/PhoneWindowManager;->cancelPendingAccessibilityShortcutAction()V
+PLcom/android/server/policy/PhoneWindowManager;->cancelPendingBackKeyAction()V
+PLcom/android/server/policy/PhoneWindowManager;->cancelPendingPowerKeyAction()V
+PLcom/android/server/policy/PhoneWindowManager;->cancelPendingScreenshotChordAction()V
+PLcom/android/server/policy/PhoneWindowManager;->cancelPreloadRecentApps()V
+PLcom/android/server/policy/PhoneWindowManager;->checkAddPermission(Landroid/view/WindowManager$LayoutParams;[I)I
+PLcom/android/server/policy/PhoneWindowManager;->checkShowToOwnerOnly(Landroid/view/WindowManager$LayoutParams;)Z
+PLcom/android/server/policy/PhoneWindowManager;->configureNavBarOpacity(IZZZ)I
+PLcom/android/server/policy/PhoneWindowManager;->createHiddenByKeyguardExit(ZZ)Landroid/view/animation/Animation;
+PLcom/android/server/policy/PhoneWindowManager;->createHomeDockIntent()Landroid/content/Intent;
+PLcom/android/server/policy/PhoneWindowManager;->dispatchUnhandledKey(Landroid/view/WindowManagerPolicy$WindowState;Landroid/view/KeyEvent;I)Landroid/view/KeyEvent;
+PLcom/android/server/policy/PhoneWindowManager;->drawsSystemBarBackground(Landroid/view/WindowManagerPolicy$WindowState;)Z
+PLcom/android/server/policy/PhoneWindowManager;->enableScreenAfterBoot()V
+PLcom/android/server/policy/PhoneWindowManager;->finishKeyguardDrawn()V
+PLcom/android/server/policy/PhoneWindowManager;->finishLayoutLw()V
+PLcom/android/server/policy/PhoneWindowManager;->finishScreenTurningOn()V
+PLcom/android/server/policy/PhoneWindowManager;->finishWindowsDrawn()V
+PLcom/android/server/policy/PhoneWindowManager;->focusChangedLw(Landroid/view/WindowManagerPolicy$WindowState;Landroid/view/WindowManagerPolicy$WindowState;)I
+PLcom/android/server/policy/PhoneWindowManager;->forcesDrawStatusBarBackground(Landroid/view/WindowManagerPolicy$WindowState;)Z
+PLcom/android/server/policy/PhoneWindowManager;->getAudioService()Landroid/media/IAudioService;
+PLcom/android/server/policy/PhoneWindowManager;->getConfigDisplayHeight(IIIII)I
+PLcom/android/server/policy/PhoneWindowManager;->getConfigDisplayWidth(IIIII)I
+PLcom/android/server/policy/PhoneWindowManager;->getContentRectLw(Landroid/graphics/Rect;)V
+PLcom/android/server/policy/PhoneWindowManager;->getDisplayContext(Landroid/content/Context;I)Landroid/content/Context;
+PLcom/android/server/policy/PhoneWindowManager;->getDreamManager()Landroid/service/dreams/IDreamManager;
+PLcom/android/server/policy/PhoneWindowManager;->getHdmiControl()Lcom/android/server/policy/PhoneWindowManager$HdmiControl;
+PLcom/android/server/policy/PhoneWindowManager;->getInputMethodWindowVisibleHeightLw()I
+PLcom/android/server/policy/PhoneWindowManager;->getInsetHintLw(Landroid/view/WindowManager$LayoutParams;Landroid/graphics/Rect;IIILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;)Z
+PLcom/android/server/policy/PhoneWindowManager;->getKeyguardDrawnTimeout()J
+PLcom/android/server/policy/PhoneWindowManager;->getLongIntArray(Landroid/content/res/Resources;I)[J
+PLcom/android/server/policy/PhoneWindowManager;->getNavigationBarHeight(II)I
+PLcom/android/server/policy/PhoneWindowManager;->getNavigationBarWidth(II)I
+PLcom/android/server/policy/PhoneWindowManager;->getNonDecorDisplayHeight(IIIII)I
+PLcom/android/server/policy/PhoneWindowManager;->getNonDecorDisplayWidth(IIIII)I
+PLcom/android/server/policy/PhoneWindowManager;->getNonDecorInsetsLw(IIILandroid/graphics/Rect;)V
+PLcom/android/server/policy/PhoneWindowManager;->getStableInsetsLw(IIILandroid/graphics/Rect;)V
+PLcom/android/server/policy/PhoneWindowManager;->getStatusBarManagerInternal()Lcom/android/server/statusbar/StatusBarManagerInternal;
+PLcom/android/server/policy/PhoneWindowManager;->getSystemDecorLayerLw()I
+PLcom/android/server/policy/PhoneWindowManager;->getTelecommService()Landroid/telecom/TelecomManager;
+PLcom/android/server/policy/PhoneWindowManager;->getVibrationEffect(I)Landroid/os/VibrationEffect;
+PLcom/android/server/policy/PhoneWindowManager;->handleShortPressOnHome()V
+PLcom/android/server/policy/PhoneWindowManager;->handleStartTransitionForKeyguardLw(ILandroid/view/animation/Animation;)I
+PLcom/android/server/policy/PhoneWindowManager;->hasLongPressOnBackBehavior()Z
+PLcom/android/server/policy/PhoneWindowManager;->hasNavigationBar()Z
+PLcom/android/server/policy/PhoneWindowManager;->hasPanicPressOnBackBehavior()Z
+PLcom/android/server/policy/PhoneWindowManager;->init(Landroid/content/Context;Landroid/view/IWindowManager;Landroid/view/WindowManagerPolicy$WindowManagerFuncs;)V
+PLcom/android/server/policy/PhoneWindowManager;->initializeHdmiState()V
+PLcom/android/server/policy/PhoneWindowManager;->interceptAccessibilityShortcutChord()V
+PLcom/android/server/policy/PhoneWindowManager;->interceptBackKeyDown()V
+PLcom/android/server/policy/PhoneWindowManager;->interceptBackKeyUp(Landroid/view/KeyEvent;)Z
+PLcom/android/server/policy/PhoneWindowManager;->interceptKeyBeforeDispatching(Landroid/view/WindowManagerPolicy$WindowState;Landroid/view/KeyEvent;I)J
+PLcom/android/server/policy/PhoneWindowManager;->interceptKeyBeforeQueueing(Landroid/view/KeyEvent;I)I
+PLcom/android/server/policy/PhoneWindowManager;->interceptScreenshotChord()V
+PLcom/android/server/policy/PhoneWindowManager;->isAnyPortrait(I)Z
+PLcom/android/server/policy/PhoneWindowManager;->isDefaultOrientationForced()Z
+PLcom/android/server/policy/PhoneWindowManager;->isFullscreen(Landroid/view/WindowManager$LayoutParams;)Z
+PLcom/android/server/policy/PhoneWindowManager;->isImmersiveMode(I)Z
+PLcom/android/server/policy/PhoneWindowManager;->isKeyguardDrawnLw()Z
+PLcom/android/server/policy/PhoneWindowManager;->isKeyguardHostWindow(Landroid/view/WindowManager$LayoutParams;)Z
+PLcom/android/server/policy/PhoneWindowManager;->isKeyguardOccluded()Z
+PLcom/android/server/policy/PhoneWindowManager;->isKeyguardSecure(I)Z
+PLcom/android/server/policy/PhoneWindowManager;->isNavBarForcedShownLw(Landroid/view/WindowManagerPolicy$WindowState;)Z
+PLcom/android/server/policy/PhoneWindowManager;->isShowingDreamLw()Z
+PLcom/android/server/policy/PhoneWindowManager;->isUserSetupComplete()Z
+PLcom/android/server/policy/PhoneWindowManager;->isValidGlobalKey(I)Z
+PLcom/android/server/policy/PhoneWindowManager;->keepScreenOnStartedLw()V
+PLcom/android/server/policy/PhoneWindowManager;->keepScreenOnStoppedLw()V
+PLcom/android/server/policy/PhoneWindowManager;->launchHomeFromHotKey()V
+PLcom/android/server/policy/PhoneWindowManager;->launchHomeFromHotKey(ZZ)V
+PLcom/android/server/policy/PhoneWindowManager;->layoutNavigationBar(IIIIIIILandroid/graphics/Rect;ZZZZ)Z
+PLcom/android/server/policy/PhoneWindowManager;->layoutStatusBar(Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;IZ)Z
+PLcom/android/server/policy/PhoneWindowManager;->layoutWallpaper(Landroid/view/WindowManagerPolicy$WindowState;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;)V
+PLcom/android/server/policy/PhoneWindowManager;->navigationBarPosition(III)I
+PLcom/android/server/policy/PhoneWindowManager;->needSensorRunningLp()Z
+PLcom/android/server/policy/PhoneWindowManager;->offsetInputMethodWindowLw(Landroid/view/WindowManagerPolicy$WindowState;)V
+PLcom/android/server/policy/PhoneWindowManager;->onConfigurationChanged()V
+PLcom/android/server/policy/PhoneWindowManager;->onKeyguardOccludedChangedLw(Z)V
+PLcom/android/server/policy/PhoneWindowManager;->onSystemUiStarted()V
+PLcom/android/server/policy/PhoneWindowManager;->performHapticFeedbackLw(Landroid/view/WindowManagerPolicy$WindowState;IZ)Z
+PLcom/android/server/policy/PhoneWindowManager;->prepareAddWindowLw(Landroid/view/WindowManagerPolicy$WindowState;Landroid/view/WindowManager$LayoutParams;)I
+PLcom/android/server/policy/PhoneWindowManager;->readCameraLensCoverState()V
+PLcom/android/server/policy/PhoneWindowManager;->readConfigurationDependentBehaviors()V
+PLcom/android/server/policy/PhoneWindowManager;->readLidState()V
+PLcom/android/server/policy/PhoneWindowManager;->readRotation(I)I
+PLcom/android/server/policy/PhoneWindowManager;->registerShortcutKey(JLcom/android/internal/policy/IShortcutService;)V
+PLcom/android/server/policy/PhoneWindowManager;->removeWindowLw(Landroid/view/WindowManagerPolicy$WindowState;)V
+PLcom/android/server/policy/PhoneWindowManager;->reportScreenStateToVrManager(Z)V
+PLcom/android/server/policy/PhoneWindowManager;->requestTransientBars(Landroid/view/WindowManagerPolicy$WindowState;)V
+PLcom/android/server/policy/PhoneWindowManager;->rotationForOrientationLw(II)I
+PLcom/android/server/policy/PhoneWindowManager;->rotationHasCompatibleMetricsLw(II)Z
+PLcom/android/server/policy/PhoneWindowManager;->screenTurnedOn()V
+PLcom/android/server/policy/PhoneWindowManager;->screenTurningOn(Landroid/view/WindowManagerPolicy$ScreenOnListener;)V
+PLcom/android/server/policy/PhoneWindowManager;->selectAnimationLw(Landroid/view/WindowManagerPolicy$WindowState;I)I
+PLcom/android/server/policy/PhoneWindowManager;->sendCloseSystemWindows(Ljava/lang/String;)V
+PLcom/android/server/policy/PhoneWindowManager;->setAttachedWindowFrames(Landroid/view/WindowManagerPolicy$WindowState;IILandroid/view/WindowManagerPolicy$WindowState;ZLandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;)V
+PLcom/android/server/policy/PhoneWindowManager;->setCurrentOrientationLw(I)V
+PLcom/android/server/policy/PhoneWindowManager;->setDismissImeOnBackKeyPressed(Z)V
+PLcom/android/server/policy/PhoneWindowManager;->setDisplayOverscan(Landroid/view/Display;IIII)V
+PLcom/android/server/policy/PhoneWindowManager;->setHdmiPlugged(Z)V
+PLcom/android/server/policy/PhoneWindowManager;->setInitialDisplaySize(Landroid/view/Display;III)V
+PLcom/android/server/policy/PhoneWindowManager;->setKeyguardOccludedLw(ZZ)Z
+PLcom/android/server/policy/PhoneWindowManager;->setLastInputMethodWindowLw(Landroid/view/WindowManagerPolicy$WindowState;Landroid/view/WindowManagerPolicy$WindowState;)V
+PLcom/android/server/policy/PhoneWindowManager;->setRecentsVisibilityLw(Z)V
+PLcom/android/server/policy/PhoneWindowManager;->setSafeMode(Z)V
+PLcom/android/server/policy/PhoneWindowManager;->shouldEnableWakeGestureLp()Z
+PLcom/android/server/policy/PhoneWindowManager;->shouldRotateSeamlessly(II)Z
+PLcom/android/server/policy/PhoneWindowManager;->shouldUseOutsets(Landroid/view/WindowManager$LayoutParams;I)Z
+PLcom/android/server/policy/PhoneWindowManager;->startActivityAsUser(Landroid/content/Intent;Landroid/os/UserHandle;)V
+PLcom/android/server/policy/PhoneWindowManager;->startDockOrHome(ZZ)V
+PLcom/android/server/policy/PhoneWindowManager;->startKeyguardExitAnimation(JJ)V
+PLcom/android/server/policy/PhoneWindowManager;->startedWakingUp()V
+PLcom/android/server/policy/PhoneWindowManager;->systemBooted()V
+PLcom/android/server/policy/PhoneWindowManager;->systemReady()V
+PLcom/android/server/policy/PhoneWindowManager;->updateLightNavigationBarLw(ILandroid/view/WindowManagerPolicy$WindowState;Landroid/view/WindowManagerPolicy$WindowState;)I
+PLcom/android/server/policy/PhoneWindowManager;->updateLockScreenTimeout()V
+PLcom/android/server/policy/PhoneWindowManager;->updateOrientationListenerLp()V
+PLcom/android/server/policy/PhoneWindowManager;->updateRotation(Z)V
+PLcom/android/server/policy/PhoneWindowManager;->updateRotation(ZZ)V
+PLcom/android/server/policy/PhoneWindowManager;->updateScreenOffSleepToken(Z)V
+PLcom/android/server/policy/PhoneWindowManager;->updateSettings()V
+PLcom/android/server/policy/PhoneWindowManager;->updateUiMode()V
+PLcom/android/server/policy/PhoneWindowManager;->updateWakeGestureListenerLp()V
+PLcom/android/server/policy/PhoneWindowManager;->userActivity()V
+PLcom/android/server/policy/PhoneWindowManager;->validateRotationAnimationLw(IIZ)Z
+PLcom/android/server/policy/PolicyControl;->adjustClearableFlags(Landroid/view/WindowManagerPolicy$WindowState;I)I
+PLcom/android/server/policy/PolicyControl;->reloadFromSetting(Landroid/content/Context;)V
+PLcom/android/server/policy/PolicyControl;->setFilters(Ljava/lang/String;)V
+PLcom/android/server/policy/ShortcutManager$ShortcutInfo;-><init>(Ljava/lang/String;Landroid/content/Intent;)V
+PLcom/android/server/policy/ShortcutManager;-><init>(Landroid/content/Context;)V
+PLcom/android/server/policy/ShortcutManager;->loadShortcuts()V
+PLcom/android/server/policy/SplashScreenSurface;-><init>(Landroid/view/View;Landroid/os/IBinder;)V
+PLcom/android/server/policy/SplashScreenSurface;->remove()V
+PLcom/android/server/policy/StatusBarController$1$1;-><init>(Lcom/android/server/policy/StatusBarController$1;)V
+PLcom/android/server/policy/StatusBarController$1$1;->run()V
+PLcom/android/server/policy/StatusBarController$1$2;-><init>(Lcom/android/server/policy/StatusBarController$1;Landroid/view/animation/Animation;Landroid/view/animation/Animation;)V
+PLcom/android/server/policy/StatusBarController$1$2;->run()V
+PLcom/android/server/policy/StatusBarController$1$3;-><init>(Lcom/android/server/policy/StatusBarController$1;)V
+PLcom/android/server/policy/StatusBarController$1$3;->run()V
+PLcom/android/server/policy/StatusBarController$1$4;-><init>(Lcom/android/server/policy/StatusBarController$1;)V
+PLcom/android/server/policy/StatusBarController$1$4;->run()V
+PLcom/android/server/policy/StatusBarController$1;-><init>(Lcom/android/server/policy/StatusBarController;)V
+PLcom/android/server/policy/StatusBarController$1;->onAppTransitionCancelledLocked(I)V
+PLcom/android/server/policy/StatusBarController$1;->onAppTransitionFinishedLocked(Landroid/os/IBinder;)V
+PLcom/android/server/policy/StatusBarController$1;->onAppTransitionPendingLocked()V
+PLcom/android/server/policy/StatusBarController$1;->onAppTransitionStartingLocked(ILandroid/os/IBinder;Landroid/os/IBinder;Landroid/view/animation/Animation;Landroid/view/animation/Animation;)I
+PLcom/android/server/policy/StatusBarController;->-wrap0(Landroid/view/animation/Animation;Landroid/view/animation/Animation;)J
+PLcom/android/server/policy/StatusBarController;-><init>()V
+PLcom/android/server/policy/StatusBarController;->calculateStatusBarTransitionStartTime(Landroid/view/animation/Animation;Landroid/view/animation/Animation;)J
+PLcom/android/server/policy/StatusBarController;->findAlmostThereFraction(Landroid/view/animation/Interpolator;)F
+PLcom/android/server/policy/StatusBarController;->findTranslateAnimation(Landroid/view/animation/Animation;)Landroid/view/animation/TranslateAnimation;
+PLcom/android/server/policy/StatusBarController;->getAppTransitionListener()Landroid/view/WindowManagerInternal$AppTransitionListener;
+PLcom/android/server/policy/StatusBarController;->skipAnimation()Z
+PLcom/android/server/policy/SystemGesturesPointerEventListener$FlingGestureDetector;-><init>(Lcom/android/server/policy/SystemGesturesPointerEventListener;)V
+PLcom/android/server/policy/SystemGesturesPointerEventListener$FlingGestureDetector;-><init>(Lcom/android/server/policy/SystemGesturesPointerEventListener;Lcom/android/server/policy/SystemGesturesPointerEventListener$FlingGestureDetector;)V
+PLcom/android/server/policy/SystemGesturesPointerEventListener$FlingGestureDetector;->onFling(Landroid/view/MotionEvent;Landroid/view/MotionEvent;FF)Z
+PLcom/android/server/policy/SystemGesturesPointerEventListener$FlingGestureDetector;->onSingleTapUp(Landroid/view/MotionEvent;)Z
+PLcom/android/server/policy/SystemGesturesPointerEventListener;->-get0(Lcom/android/server/policy/SystemGesturesPointerEventListener;)Lcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;
+PLcom/android/server/policy/SystemGesturesPointerEventListener;->-get1(Lcom/android/server/policy/SystemGesturesPointerEventListener;)J
+PLcom/android/server/policy/SystemGesturesPointerEventListener;->-get2(Lcom/android/server/policy/SystemGesturesPointerEventListener;)Landroid/widget/OverScroller;
+PLcom/android/server/policy/SystemGesturesPointerEventListener;->-set0(Lcom/android/server/policy/SystemGesturesPointerEventListener;J)J
+PLcom/android/server/policy/SystemGesturesPointerEventListener;-><init>(Landroid/content/Context;Lcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;)V
+PLcom/android/server/policy/SystemGesturesPointerEventListener;->captureDown(Landroid/view/MotionEvent;I)V
+PLcom/android/server/policy/SystemGesturesPointerEventListener;->checkNull(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/android/server/policy/SystemGesturesPointerEventListener;->detectSwipe(IJFF)I
+PLcom/android/server/policy/SystemGesturesPointerEventListener;->findIndex(I)I
+PLcom/android/server/policy/SystemGesturesPointerEventListener;->onPointerEvent(Landroid/view/MotionEvent;)V
+PLcom/android/server/policy/SystemGesturesPointerEventListener;->systemReady()V
+PLcom/android/server/policy/WakeGestureListener$1;-><init>(Lcom/android/server/policy/WakeGestureListener;)V
+PLcom/android/server/policy/WakeGestureListener$2;-><init>(Lcom/android/server/policy/WakeGestureListener;)V
+PLcom/android/server/policy/WakeGestureListener;-><init>(Landroid/content/Context;Landroid/os/Handler;)V
+PLcom/android/server/policy/WakeGestureListener;->cancelWakeUpTrigger()V
+PLcom/android/server/policy/WakeGestureListener;->isSupported()Z
+PLcom/android/server/policy/WindowOrientationListener$OrientationJudge;-><init>(Lcom/android/server/policy/WindowOrientationListener;)V
+PLcom/android/server/policy/WindowOrientationListener$OrientationSensorJudge$1;-><init>(Lcom/android/server/policy/WindowOrientationListener$OrientationSensorJudge;)V
+PLcom/android/server/policy/WindowOrientationListener$OrientationSensorJudge;-><init>(Lcom/android/server/policy/WindowOrientationListener;)V
+PLcom/android/server/policy/WindowOrientationListener$OrientationSensorJudge;->evaluateRotationChangeLocked()I
+PLcom/android/server/policy/WindowOrientationListener$OrientationSensorJudge;->getProposedRotationLocked()I
+PLcom/android/server/policy/WindowOrientationListener$OrientationSensorJudge;->isDesiredRotationAcceptableLocked(J)Z
+PLcom/android/server/policy/WindowOrientationListener$OrientationSensorJudge;->onAccuracyChanged(Landroid/hardware/Sensor;I)V
+PLcom/android/server/policy/WindowOrientationListener$OrientationSensorJudge;->onSensorChanged(Landroid/hardware/SensorEvent;)V
+PLcom/android/server/policy/WindowOrientationListener$OrientationSensorJudge;->onTouchEndLocked(J)V
+PLcom/android/server/policy/WindowOrientationListener$OrientationSensorJudge;->onTouchStartLocked()V
+PLcom/android/server/policy/WindowOrientationListener$OrientationSensorJudge;->resetLocked(Z)V
+PLcom/android/server/policy/WindowOrientationListener$OrientationSensorJudge;->unscheduleRotationEvaluationLocked()V
+PLcom/android/server/policy/WindowOrientationListener;->-get3(Lcom/android/server/policy/WindowOrientationListener;)Ljava/lang/Object;
+PLcom/android/server/policy/WindowOrientationListener;-><init>(Landroid/content/Context;Landroid/os/Handler;)V
+PLcom/android/server/policy/WindowOrientationListener;-><init>(Landroid/content/Context;Landroid/os/Handler;I)V
+PLcom/android/server/policy/WindowOrientationListener;->canDetectOrientation()Z
+PLcom/android/server/policy/WindowOrientationListener;->enable(Z)V
+PLcom/android/server/policy/WindowOrientationListener;->getProposedRotation()I
+PLcom/android/server/policy/WindowOrientationListener;->onTouchEnd()V
+PLcom/android/server/policy/WindowOrientationListener;->onTouchStart()V
+PLcom/android/server/policy/WindowOrientationListener;->setCurrentRotation(I)V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate$1;-><init>(Lcom/android/server/policy/keyguard/KeyguardServiceDelegate;)V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate$1;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate$KeyguardShowDelegate;-><init>(Lcom/android/server/policy/keyguard/KeyguardServiceDelegate;Lcom/android/server/policy/keyguard/KeyguardServiceDelegate$DrawnListener;)V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate$KeyguardShowDelegate;->onDrawn()V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate$KeyguardState;-><init>()V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate$KeyguardState;->reset()V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->-get0(Lcom/android/server/policy/keyguard/KeyguardServiceDelegate;)Lcom/android/server/policy/keyguard/KeyguardStateMonitor$StateCallback;
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->-get1(Lcom/android/server/policy/keyguard/KeyguardServiceDelegate;)Landroid/content/Context;
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->-get2(Lcom/android/server/policy/keyguard/KeyguardServiceDelegate;)Lcom/android/server/policy/keyguard/KeyguardServiceDelegate$DrawnListener;
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->-get4(Lcom/android/server/policy/keyguard/KeyguardServiceDelegate;)Lcom/android/server/policy/keyguard/KeyguardServiceDelegate$KeyguardState;
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->-set0(Lcom/android/server/policy/keyguard/KeyguardServiceDelegate;Lcom/android/server/policy/keyguard/KeyguardServiceDelegate$DrawnListener;)Lcom/android/server/policy/keyguard/KeyguardServiceDelegate$DrawnListener;
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;-><init>(Landroid/content/Context;Lcom/android/server/policy/keyguard/KeyguardStateMonitor$StateCallback;)V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->bindService(Landroid/content/Context;)V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->hasLockscreenWallpaper()Z
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->isSecure(I)Z
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->onBootCompleted()V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->onScreenTurnedOn()V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->onScreenTurningOn(Lcom/android/server/policy/keyguard/KeyguardServiceDelegate$DrawnListener;)V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->onStartedWakingUp()V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->onSystemReady()V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->setOccluded(ZZ)V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->startKeyguardExitAnimation(JJ)V
+PLcom/android/server/policy/keyguard/KeyguardServiceWrapper;-><init>(Landroid/content/Context;Lcom/android/internal/policy/IKeyguardService;Lcom/android/server/policy/keyguard/KeyguardStateMonitor$StateCallback;)V
+PLcom/android/server/policy/keyguard/KeyguardServiceWrapper;->isSecure(I)Z
+PLcom/android/server/policy/keyguard/KeyguardServiceWrapper;->onBootCompleted()V
+PLcom/android/server/policy/keyguard/KeyguardServiceWrapper;->onScreenTurnedOn()V
+PLcom/android/server/policy/keyguard/KeyguardServiceWrapper;->onScreenTurningOn(Lcom/android/internal/policy/IKeyguardDrawnCallback;)V
+PLcom/android/server/policy/keyguard/KeyguardServiceWrapper;->onStartedWakingUp()V
+PLcom/android/server/policy/keyguard/KeyguardServiceWrapper;->onSystemReady()V
+PLcom/android/server/policy/keyguard/KeyguardServiceWrapper;->setOccluded(ZZ)V
+PLcom/android/server/policy/keyguard/KeyguardServiceWrapper;->startKeyguardExitAnimation(JJ)V
+PLcom/android/server/policy/keyguard/KeyguardStateMonitor;-><init>(Landroid/content/Context;Lcom/android/internal/policy/IKeyguardService;Lcom/android/server/policy/keyguard/KeyguardStateMonitor$StateCallback;)V
+PLcom/android/server/policy/keyguard/KeyguardStateMonitor;->isInputRestricted()Z
+PLcom/android/server/policy/keyguard/KeyguardStateMonitor;->isSecure(I)Z
+PLcom/android/server/policy/keyguard/KeyguardStateMonitor;->isShowing()Z
+PLcom/android/server/policy/keyguard/KeyguardStateMonitor;->onHasLockscreenWallpaperChanged(Z)V
+PLcom/android/server/policy/keyguard/KeyguardStateMonitor;->onInputRestrictedStateChanged(Z)V
+PLcom/android/server/policy/keyguard/KeyguardStateMonitor;->onShowingStateChanged(Z)V
+PLcom/android/server/policy/keyguard/KeyguardStateMonitor;->onSimSecureStateChanged(Z)V
+PLcom/android/server/policy/keyguard/KeyguardStateMonitor;->onTrustedChanged(Z)V
+PLcom/android/server/power/BatterySaverPolicy;->onChange(ZLandroid/net/Uri;)V
+PLcom/android/server/power/BatterySaverPolicy;->start(Landroid/content/ContentResolver;)V
+PLcom/android/server/power/BatterySaverPolicy;->updateConstants(Ljava/lang/String;)V
+PLcom/android/server/power/Notifier$1;-><init>(Lcom/android/server/power/Notifier;)V
+PLcom/android/server/power/Notifier$2;-><init>(Lcom/android/server/power/Notifier;)V
+PLcom/android/server/power/Notifier$3;-><init>(Lcom/android/server/power/Notifier;)V
+PLcom/android/server/power/Notifier$NotifierHandler;-><init>(Lcom/android/server/power/Notifier;Landroid/os/Looper;)V
+PLcom/android/server/power/Notifier$NotifierHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/power/Notifier;->-wrap3(Lcom/android/server/power/Notifier;)V
+PLcom/android/server/power/Notifier;-><init>(Landroid/os/Looper;Landroid/content/Context;Lcom/android/internal/app/IBatteryStats;Lcom/android/internal/app/IAppOpsService;Lcom/android/server/power/SuspendBlocker;Landroid/view/WindowManagerPolicy;)V
+PLcom/android/server/power/Notifier;->getBatteryStatsWakeLockMonitorType(I)I
+PLcom/android/server/power/Notifier;->onLongPartialWakeLockFinish(Ljava/lang/String;ILandroid/os/WorkSource;Ljava/lang/String;)V
+PLcom/android/server/power/Notifier;->onLongPartialWakeLockStart(Ljava/lang/String;ILandroid/os/WorkSource;Ljava/lang/String;)V
+PLcom/android/server/power/Notifier;->onUserActivity(II)V
+PLcom/android/server/power/Notifier;->onWakeLockChanging(ILjava/lang/String;Ljava/lang/String;IILandroid/os/WorkSource;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;IILandroid/os/WorkSource;Ljava/lang/String;)V
+PLcom/android/server/power/Notifier;->sendUserActivity()V
+PLcom/android/server/power/PowerManagerService$1;->acquireSuspendBlocker()V
+PLcom/android/server/power/PowerManagerService$1;->onDisplayStateChange(I)V
+PLcom/android/server/power/PowerManagerService$1;->onStateChanged()V
+PLcom/android/server/power/PowerManagerService$1;->releaseSuspendBlocker()V
+PLcom/android/server/power/PowerManagerService$BatteryReceiver;-><init>(Lcom/android/server/power/PowerManagerService;)V
+PLcom/android/server/power/PowerManagerService$BatteryReceiver;-><init>(Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService$BatteryReceiver;)V
+PLcom/android/server/power/PowerManagerService$BatteryReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/power/PowerManagerService$BinderService;->getLastShutdownReason()I
+PLcom/android/server/power/PowerManagerService$BinderService;->isDeviceIdleMode()Z
+PLcom/android/server/power/PowerManagerService$BinderService;->isInteractive()Z
+PLcom/android/server/power/PowerManagerService$BinderService;->isLightDeviceIdleMode()Z
+PLcom/android/server/power/PowerManagerService$BinderService;->isPowerSaveMode()Z
+PLcom/android/server/power/PowerManagerService$BinderService;->isWakeLockLevelSupported(I)Z
+PLcom/android/server/power/PowerManagerService$BinderService;->updateWakeLockUids(Landroid/os/IBinder;[I)V
+PLcom/android/server/power/PowerManagerService$BinderService;->userActivity(JII)V
+PLcom/android/server/power/PowerManagerService$BinderService;->wakeUp(JLjava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/power/PowerManagerService$Constants;->start(Landroid/content/ContentResolver;)V
+PLcom/android/server/power/PowerManagerService$Constants;->updateConstants()V
+PLcom/android/server/power/PowerManagerService$DockReceiver;-><init>(Lcom/android/server/power/PowerManagerService;)V
+PLcom/android/server/power/PowerManagerService$DockReceiver;-><init>(Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService$DockReceiver;)V
+PLcom/android/server/power/PowerManagerService$DreamReceiver;-><init>(Lcom/android/server/power/PowerManagerService;)V
+PLcom/android/server/power/PowerManagerService$DreamReceiver;-><init>(Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService$DreamReceiver;)V
+PLcom/android/server/power/PowerManagerService$LocalService;->powerHint(II)V
+PLcom/android/server/power/PowerManagerService$LocalService;->setDeviceIdleTempWhitelist([I)V
+PLcom/android/server/power/PowerManagerService$LocalService;->setDeviceIdleWhitelist([I)V
+PLcom/android/server/power/PowerManagerService$LocalService;->setMaximumScreenOffTimeoutFromDeviceAdmin(I)V
+PLcom/android/server/power/PowerManagerService$LocalService;->setScreenBrightnessOverrideFromWindowManager(I)V
+PLcom/android/server/power/PowerManagerService$LocalService;->setUserActivityTimeoutOverrideFromWindowManager(J)V
+PLcom/android/server/power/PowerManagerService$LocalService;->uidActive(I)V
+PLcom/android/server/power/PowerManagerService$LocalService;->uidGone(I)V
+PLcom/android/server/power/PowerManagerService$LocalService;->uidIdle(I)V
+PLcom/android/server/power/PowerManagerService$LocalService;->updateUidProcState(II)V
+PLcom/android/server/power/PowerManagerService$SettingsObserver;-><init>(Lcom/android/server/power/PowerManagerService;Landroid/os/Handler;)V
+PLcom/android/server/power/PowerManagerService$SuspendBlockerImpl;->release()V
+PLcom/android/server/power/PowerManagerService$UidState;-><init>(I)V
+PLcom/android/server/power/PowerManagerService$UserSwitchedReceiver;-><init>(Lcom/android/server/power/PowerManagerService;)V
+PLcom/android/server/power/PowerManagerService$UserSwitchedReceiver;-><init>(Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService$UserSwitchedReceiver;)V
+PLcom/android/server/power/PowerManagerService$UserSwitchedReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/power/PowerManagerService$WakeLock;-><init>(Lcom/android/server/power/PowerManagerService;Landroid/os/IBinder;ILjava/lang/String;Ljava/lang/String;Landroid/os/WorkSource;Ljava/lang/String;IILcom/android/server/power/PowerManagerService$UidState;)V
+PLcom/android/server/power/PowerManagerService$WakeLock;->hasSameProperties(ILjava/lang/String;Landroid/os/WorkSource;II)Z
+PLcom/android/server/power/PowerManagerService$WakeLock;->hasSameWorkSource(Landroid/os/WorkSource;)Z
+PLcom/android/server/power/PowerManagerService$WakeLock;->updateWorkSource(Landroid/os/WorkSource;)V
+PLcom/android/server/power/PowerManagerService;->-get12(Lcom/android/server/power/PowerManagerService;)Z
+PLcom/android/server/power/PowerManagerService;->-get2(Lcom/android/server/power/PowerManagerService;)Z
+PLcom/android/server/power/PowerManagerService;->-get3(Lcom/android/server/power/PowerManagerService;)Z
+PLcom/android/server/power/PowerManagerService;->-get4(Lcom/android/server/power/PowerManagerService;)I
+PLcom/android/server/power/PowerManagerService;->-get5(Lcom/android/server/power/PowerManagerService;)Lcom/android/server/power/SuspendBlocker;
+PLcom/android/server/power/PowerManagerService;->-set0(Lcom/android/server/power/PowerManagerService;I)I
+PLcom/android/server/power/PowerManagerService;->-wrap0(Landroid/os/WorkSource;)Landroid/os/WorkSource;
+PLcom/android/server/power/PowerManagerService;->-wrap1(Lcom/android/server/power/PowerManagerService;)Z
+PLcom/android/server/power/PowerManagerService;->-wrap13(Lcom/android/server/power/PowerManagerService;)V
+PLcom/android/server/power/PowerManagerService;->-wrap14(Lcom/android/server/power/PowerManagerService;)V
+PLcom/android/server/power/PowerManagerService;->-wrap16(Lcom/android/server/power/PowerManagerService;)V
+PLcom/android/server/power/PowerManagerService;->-wrap17(Lcom/android/server/power/PowerManagerService;)V
+PLcom/android/server/power/PowerManagerService;->-wrap2(Lcom/android/server/power/PowerManagerService;)Z
+PLcom/android/server/power/PowerManagerService;->-wrap21(Ljava/lang/String;)V
+PLcom/android/server/power/PowerManagerService;->-wrap23(Lcom/android/server/power/PowerManagerService;Landroid/os/IBinder;I)V
+PLcom/android/server/power/PowerManagerService;->-wrap27(Lcom/android/server/power/PowerManagerService;Z)V
+PLcom/android/server/power/PowerManagerService;->-wrap29(Lcom/android/server/power/PowerManagerService;I)V
+PLcom/android/server/power/PowerManagerService;->-wrap32(Lcom/android/server/power/PowerManagerService;J)V
+PLcom/android/server/power/PowerManagerService;->-wrap35(Lcom/android/server/power/PowerManagerService;)V
+PLcom/android/server/power/PowerManagerService;->-wrap36(Lcom/android/server/power/PowerManagerService;Landroid/os/IBinder;Landroid/os/WorkSource;Ljava/lang/String;I)V
+PLcom/android/server/power/PowerManagerService;->-wrap37(Lcom/android/server/power/PowerManagerService;JIII)V
+PLcom/android/server/power/PowerManagerService;->-wrap38(Lcom/android/server/power/PowerManagerService;JLjava/lang/String;ILjava/lang/String;I)V
+PLcom/android/server/power/PowerManagerService;->-wrap4(Lcom/android/server/power/PowerManagerService;I)Z
+PLcom/android/server/power/PowerManagerService;->-wrap7(Lcom/android/server/power/PowerManagerService;Landroid/os/IBinder;ILjava/lang/String;Ljava/lang/String;Landroid/os/WorkSource;Ljava/lang/String;II)V
+PLcom/android/server/power/PowerManagerService;->applyWakeLockFlagsOnAcquireLocked(Lcom/android/server/power/PowerManagerService$WakeLock;I)V
+PLcom/android/server/power/PowerManagerService;->applyWakeLockFlagsOnReleaseLocked(Lcom/android/server/power/PowerManagerService$WakeLock;)V
+PLcom/android/server/power/PowerManagerService;->checkForLongWakeLocks()V
+PLcom/android/server/power/PowerManagerService;->copyWorkSource(Landroid/os/WorkSource;)Landroid/os/WorkSource;
+PLcom/android/server/power/PowerManagerService;->enqueueNotifyLongMsgLocked(J)V
+PLcom/android/server/power/PowerManagerService;->finishUidChangesInternal()V
+PLcom/android/server/power/PowerManagerService;->finishWakefulnessChangeIfNeededLocked()V
+PLcom/android/server/power/PowerManagerService;->getCurrentBrightnessSettingLocked()I
+PLcom/android/server/power/PowerManagerService;->getDesiredScreenPolicyLocked()I
+PLcom/android/server/power/PowerManagerService;->getLastShutdownReasonInternal(Ljava/io/File;)I
+PLcom/android/server/power/PowerManagerService;->getSleepTimeoutLocked()I
+PLcom/android/server/power/PowerManagerService;->handleBatteryStateChangedLocked()V
+PLcom/android/server/power/PowerManagerService;->handleSettingsChangedLocked()V
+PLcom/android/server/power/PowerManagerService;->handleUidStateChangeLocked()V
+PLcom/android/server/power/PowerManagerService;->handleUserActivityTimeout()V
+PLcom/android/server/power/PowerManagerService;->incrementBootCount()V
+PLcom/android/server/power/PowerManagerService;->isBeingKeptAwakeLocked()Z
+PLcom/android/server/power/PowerManagerService;->isDeviceIdleModeInternal()Z
+PLcom/android/server/power/PowerManagerService;->isInteractiveInternal()Z
+PLcom/android/server/power/PowerManagerService;->isLightDeviceIdleModeInternal()Z
+PLcom/android/server/power/PowerManagerService;->isLowPowerModeInternal()Z
+PLcom/android/server/power/PowerManagerService;->isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked()Z
+PLcom/android/server/power/PowerManagerService;->isScreenLock(Lcom/android/server/power/PowerManagerService$WakeLock;)Z
+PLcom/android/server/power/PowerManagerService;->isValidAutoBrightnessAdjustment(F)Z
+PLcom/android/server/power/PowerManagerService;->isWakeLockLevelSupportedInternal(I)Z
+PLcom/android/server/power/PowerManagerService;->monitor()V
+PLcom/android/server/power/PowerManagerService;->notifyWakeLockAcquiredLocked(Lcom/android/server/power/PowerManagerService$WakeLock;)V
+PLcom/android/server/power/PowerManagerService;->notifyWakeLockChangingLocked(Lcom/android/server/power/PowerManagerService$WakeLock;ILjava/lang/String;Ljava/lang/String;IILandroid/os/WorkSource;Ljava/lang/String;)V
+PLcom/android/server/power/PowerManagerService;->notifyWakeLockLongFinishedLocked(Lcom/android/server/power/PowerManagerService$WakeLock;)V
+PLcom/android/server/power/PowerManagerService;->notifyWakeLockLongStartedLocked(Lcom/android/server/power/PowerManagerService$WakeLock;)V
+PLcom/android/server/power/PowerManagerService;->notifyWakeLockReleasedLocked(Lcom/android/server/power/PowerManagerService$WakeLock;)V
+PLcom/android/server/power/PowerManagerService;->readConfigurationLocked()V
+PLcom/android/server/power/PowerManagerService;->setDeviceIdleTempWhitelistInternal([I)V
+PLcom/android/server/power/PowerManagerService;->setDeviceIdleWhitelistInternal([I)V
+PLcom/android/server/power/PowerManagerService;->setHalAutoSuspendModeLocked(Z)V
+PLcom/android/server/power/PowerManagerService;->setHalInteractiveModeLocked(Z)V
+PLcom/android/server/power/PowerManagerService;->setMaximumScreenOffTimeoutFromDeviceAdminInternal(I)V
+PLcom/android/server/power/PowerManagerService;->setScreenBrightnessOverrideFromWindowManagerInternal(I)V
+PLcom/android/server/power/PowerManagerService;->setUserActivityTimeoutOverrideFromWindowManagerInternal(J)V
+PLcom/android/server/power/PowerManagerService;->setWakeLockDisabledStateLocked(Lcom/android/server/power/PowerManagerService$WakeLock;)Z
+PLcom/android/server/power/PowerManagerService;->shouldBoostScreenBrightness()Z
+PLcom/android/server/power/PowerManagerService;->shouldUseProximitySensorLocked()Z
+PLcom/android/server/power/PowerManagerService;->shouldWakeUpWhenPluggedOrUnpluggedLocked(ZIZ)Z
+PLcom/android/server/power/PowerManagerService;->startUidChangesInternal()V
+PLcom/android/server/power/PowerManagerService;->systemReady(Lcom/android/internal/app/IAppOpsService;)V
+PLcom/android/server/power/PowerManagerService;->uidActiveInternal(I)V
+PLcom/android/server/power/PowerManagerService;->uidGoneInternal(I)V
+PLcom/android/server/power/PowerManagerService;->uidIdleInternal(I)V
+PLcom/android/server/power/PowerManagerService;->updateIsPoweredLocked(I)V
+PLcom/android/server/power/PowerManagerService;->updateLowPowerModeLocked()V
+PLcom/android/server/power/PowerManagerService;->updateScreenBrightnessBoostLocked(I)V
+PLcom/android/server/power/PowerManagerService;->updateSettingsLocked()V
+PLcom/android/server/power/PowerManagerService;->updateStayOnLocked(I)V
+PLcom/android/server/power/PowerManagerService;->updateUidProcStateInternal(II)V
+PLcom/android/server/power/PowerManagerService;->updateWakeLockDisabledStatesLocked()V
+PLcom/android/server/power/PowerManagerService;->updateWakeLockWorkSourceInternal(Landroid/os/IBinder;Landroid/os/WorkSource;Ljava/lang/String;I)V
+PLcom/android/server/power/PowerManagerService;->userActivityFromNative(JII)V
+PLcom/android/server/power/PowerManagerService;->userActivityInternal(JIII)V
+PLcom/android/server/power/PowerManagerService;->userActivityNoUpdateLocked(JIII)Z
+PLcom/android/server/power/PowerManagerService;->wakeUpInternal(JLjava/lang/String;ILjava/lang/String;I)V
+PLcom/android/server/power/PowerManagerService;->wakeUpNoUpdateLocked(JLjava/lang/String;ILjava/lang/String;I)Z
+PLcom/android/server/power/WirelessChargerDetector$1;-><init>(Lcom/android/server/power/WirelessChargerDetector;)V
+PLcom/android/server/power/WirelessChargerDetector$2;-><init>(Lcom/android/server/power/WirelessChargerDetector;)V
+PLcom/android/server/power/WirelessChargerDetector;-><init>(Landroid/hardware/SensorManager;Lcom/android/server/power/SuspendBlocker;Landroid/os/Handler;)V
+PLcom/android/server/power/WirelessChargerDetector;->update(ZII)Z
+PLcom/android/server/print/PrintManagerService$PrintManagerImpl$1;-><init>(Lcom/android/server/print/PrintManagerService$PrintManagerImpl;Landroid/os/Handler;Landroid/net/Uri;)V
+PLcom/android/server/print/PrintManagerService$PrintManagerImpl$2;-><init>(Lcom/android/server/print/PrintManagerService$PrintManagerImpl;)V
+PLcom/android/server/print/PrintManagerService$PrintManagerImpl$2;->hadPrintService(Lcom/android/server/print/UserState;Ljava/lang/String;)Z
+PLcom/android/server/print/PrintManagerService$PrintManagerImpl$2;->hasPrintService(Ljava/lang/String;)Z
+PLcom/android/server/print/PrintManagerService$PrintManagerImpl$2;->onPackageAdded(Ljava/lang/String;I)V
+PLcom/android/server/print/PrintManagerService$PrintManagerImpl$2;->onPackageModified(Ljava/lang/String;)V
+PLcom/android/server/print/PrintManagerService$PrintManagerImpl$3;-><init>(Lcom/android/server/print/PrintManagerService$PrintManagerImpl;I)V
+PLcom/android/server/print/PrintManagerService$PrintManagerImpl$3;->run()V
+PLcom/android/server/print/PrintManagerService$PrintManagerImpl;->-get0(Lcom/android/server/print/PrintManagerService$PrintManagerImpl;)Landroid/content/Context;
+PLcom/android/server/print/PrintManagerService$PrintManagerImpl;->-get1(Lcom/android/server/print/PrintManagerService$PrintManagerImpl;)Ljava/lang/Object;
+PLcom/android/server/print/PrintManagerService$PrintManagerImpl;->-get2(Lcom/android/server/print/PrintManagerService$PrintManagerImpl;)Landroid/os/UserManager;
+PLcom/android/server/print/PrintManagerService$PrintManagerImpl;->-wrap0(Lcom/android/server/print/PrintManagerService$PrintManagerImpl;IZZ)Lcom/android/server/print/UserState;
+PLcom/android/server/print/PrintManagerService$PrintManagerImpl;->-wrap2(Lcom/android/server/print/PrintManagerService$PrintManagerImpl;I)V
+PLcom/android/server/print/PrintManagerService$PrintManagerImpl;-><init>(Lcom/android/server/print/PrintManagerService;Landroid/content/Context;)V
+PLcom/android/server/print/PrintManagerService$PrintManagerImpl;->getOrCreateUserStateLocked(IZZ)Lcom/android/server/print/UserState;
+PLcom/android/server/print/PrintManagerService$PrintManagerImpl;->handleUserUnlocked(I)V
+PLcom/android/server/print/PrintManagerService$PrintManagerImpl;->registerBroadcastReceivers()V
+PLcom/android/server/print/PrintManagerService$PrintManagerImpl;->registerContentObservers()V
+PLcom/android/server/print/PrintManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/print/PrintManagerService;->onStart()V
+PLcom/android/server/print/PrintManagerService;->onUnlockUser(I)V
+PLcom/android/server/print/RemotePrintService$MyHandler;-><init>(Lcom/android/server/print/RemotePrintService;Landroid/os/Looper;)V
+PLcom/android/server/print/RemotePrintService$RemotePrintServiceClient;-><init>(Lcom/android/server/print/RemotePrintService;)V
+PLcom/android/server/print/RemotePrintService$RemoteServiceConneciton;-><init>(Lcom/android/server/print/RemotePrintService;)V
+PLcom/android/server/print/RemotePrintService$RemoteServiceConneciton;-><init>(Lcom/android/server/print/RemotePrintService;Lcom/android/server/print/RemotePrintService$RemoteServiceConneciton;)V
+PLcom/android/server/print/RemotePrintService;-><init>(Landroid/content/Context;Landroid/content/ComponentName;ILcom/android/server/print/RemotePrintSpooler;Lcom/android/server/print/RemotePrintService$PrintServiceCallbacks;)V
+PLcom/android/server/print/RemotePrintService;->getComponentName()Landroid/content/ComponentName;
+PLcom/android/server/print/RemotePrintSpooler$BasePrintSpoolerServiceCallbacks;-><init>()V
+PLcom/android/server/print/RemotePrintSpooler$BasePrintSpoolerServiceCallbacks;-><init>(Lcom/android/server/print/RemotePrintSpooler$BasePrintSpoolerServiceCallbacks;)V
+PLcom/android/server/print/RemotePrintSpooler$ClearCustomPrinterIconCacheCaller$1;-><init>(Lcom/android/server/print/RemotePrintSpooler$ClearCustomPrinterIconCacheCaller;)V
+PLcom/android/server/print/RemotePrintSpooler$ClearCustomPrinterIconCacheCaller;-><init>()V
+PLcom/android/server/print/RemotePrintSpooler$GetCustomPrinterIconCaller$1;-><init>(Lcom/android/server/print/RemotePrintSpooler$GetCustomPrinterIconCaller;)V
+PLcom/android/server/print/RemotePrintSpooler$GetCustomPrinterIconCaller;-><init>()V
+PLcom/android/server/print/RemotePrintSpooler$GetPrintJobInfoCaller$1;-><init>(Lcom/android/server/print/RemotePrintSpooler$GetPrintJobInfoCaller;)V
+PLcom/android/server/print/RemotePrintSpooler$GetPrintJobInfoCaller;-><init>()V
+PLcom/android/server/print/RemotePrintSpooler$GetPrintJobInfosCaller$1;-><init>(Lcom/android/server/print/RemotePrintSpooler$GetPrintJobInfosCaller;)V
+PLcom/android/server/print/RemotePrintSpooler$GetPrintJobInfosCaller;-><init>()V
+PLcom/android/server/print/RemotePrintSpooler$MyServiceConnection;-><init>(Lcom/android/server/print/RemotePrintSpooler;)V
+PLcom/android/server/print/RemotePrintSpooler$MyServiceConnection;-><init>(Lcom/android/server/print/RemotePrintSpooler;Lcom/android/server/print/RemotePrintSpooler$MyServiceConnection;)V
+PLcom/android/server/print/RemotePrintSpooler$MyServiceConnection;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/print/RemotePrintSpooler$OnCustomPrinterIconLoadedCaller$1;-><init>(Lcom/android/server/print/RemotePrintSpooler$OnCustomPrinterIconLoadedCaller;)V
+PLcom/android/server/print/RemotePrintSpooler$OnCustomPrinterIconLoadedCaller;-><init>()V
+PLcom/android/server/print/RemotePrintSpooler$PrintSpoolerClient;-><init>(Lcom/android/server/print/RemotePrintSpooler;)V
+PLcom/android/server/print/RemotePrintSpooler$PrintSpoolerClient;->onAllPrintJobsHandled()V
+PLcom/android/server/print/RemotePrintSpooler$SetPrintJobStateCaller$1;-><init>(Lcom/android/server/print/RemotePrintSpooler$SetPrintJobStateCaller;)V
+PLcom/android/server/print/RemotePrintSpooler$SetPrintJobStateCaller;-><init>()V
+PLcom/android/server/print/RemotePrintSpooler$SetPrintJobTagCaller$1;-><init>(Lcom/android/server/print/RemotePrintSpooler$SetPrintJobTagCaller;)V
+PLcom/android/server/print/RemotePrintSpooler$SetPrintJobTagCaller;-><init>()V
+PLcom/android/server/print/RemotePrintSpooler;->-get1(Lcom/android/server/print/RemotePrintSpooler;)Ljava/lang/Object;
+PLcom/android/server/print/RemotePrintSpooler;->-set0(Lcom/android/server/print/RemotePrintSpooler;Landroid/print/IPrintSpooler;)Landroid/print/IPrintSpooler;
+PLcom/android/server/print/RemotePrintSpooler;->-wrap1(Lcom/android/server/print/RemotePrintSpooler;)V
+PLcom/android/server/print/RemotePrintSpooler;->-wrap3(Lcom/android/server/print/RemotePrintSpooler;)V
+PLcom/android/server/print/RemotePrintSpooler;-><init>(Landroid/content/Context;IZLcom/android/server/print/RemotePrintSpooler$PrintSpoolerCallbacks;)V
+PLcom/android/server/print/RemotePrintSpooler;->bindLocked()V
+PLcom/android/server/print/RemotePrintSpooler;->clearClientLocked()V
+PLcom/android/server/print/RemotePrintSpooler;->getRemoteInstanceLazy()Landroid/print/IPrintSpooler;
+PLcom/android/server/print/RemotePrintSpooler;->increasePriority()V
+PLcom/android/server/print/RemotePrintSpooler;->onAllPrintJobsHandled()V
+PLcom/android/server/print/RemotePrintSpooler;->pruneApprovedPrintServices(Ljava/util/List;)V
+PLcom/android/server/print/RemotePrintSpooler;->removeObsoletePrintJobs()V
+PLcom/android/server/print/RemotePrintSpooler;->setClientLocked()V
+PLcom/android/server/print/RemotePrintSpooler;->throwIfCalledOnMainThread()V
+PLcom/android/server/print/RemotePrintSpooler;->throwIfDestroyedLocked()V
+PLcom/android/server/print/RemotePrintSpooler;->unbindLocked()V
+PLcom/android/server/print/UserState$PrintJobForAppCache;-><init>(Lcom/android/server/print/UserState;)V
+PLcom/android/server/print/UserState$PrintJobForAppCache;-><init>(Lcom/android/server/print/UserState;Lcom/android/server/print/UserState$PrintJobForAppCache;)V
+PLcom/android/server/print/UserState$UserStateHandler;-><init>(Lcom/android/server/print/UserState;Landroid/os/Looper;)V
+PLcom/android/server/print/UserState$UserStateHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/print/UserState;->-wrap3(Lcom/android/server/print/UserState;)V
+PLcom/android/server/print/UserState;-><init>(Landroid/content/Context;ILjava/lang/Object;Z)V
+PLcom/android/server/print/UserState;->addServiceLocked(Lcom/android/server/print/RemotePrintService;)V
+PLcom/android/server/print/UserState;->getInstalledComponents()Ljava/util/ArrayList;
+PLcom/android/server/print/UserState;->getPrintServices(I)Ljava/util/List;
+PLcom/android/server/print/UserState;->handleDispatchPrintServicesChanged()V
+PLcom/android/server/print/UserState;->increasePriority()V
+PLcom/android/server/print/UserState;->onConfigurationChangedLocked()V
+PLcom/android/server/print/UserState;->onPrintServicesChanged()V
+PLcom/android/server/print/UserState;->prunePrintServices()V
+PLcom/android/server/print/UserState;->readConfigurationLocked()V
+PLcom/android/server/print/UserState;->readDisabledPrintServicesLocked()V
+PLcom/android/server/print/UserState;->readInstalledPrintServicesLocked()V
+PLcom/android/server/print/UserState;->readPrintServicesFromSettingLocked(Ljava/lang/String;Ljava/util/Set;)V
+PLcom/android/server/print/UserState;->removeObsoletePrintJobs()V
+PLcom/android/server/print/UserState;->throwIfDestroyedLocked()V
+PLcom/android/server/print/UserState;->updateIfNeededLocked()V
+PLcom/android/server/print/UserState;->upgradePersistentStateIfNeeded()V
+PLcom/android/server/restrictions/RestrictionsManagerService$RestrictionsManagerImpl;-><init>(Lcom/android/server/restrictions/RestrictionsManagerService;Landroid/content/Context;)V
+PLcom/android/server/restrictions/RestrictionsManagerService$RestrictionsManagerImpl;->getApplicationRestrictions(Ljava/lang/String;)Landroid/os/Bundle;
+PLcom/android/server/restrictions/RestrictionsManagerService;->-wrap0(Lcom/android/server/restrictions/RestrictionsManagerService;Ljava/lang/String;)Landroid/os/IBinder;
+PLcom/android/server/restrictions/RestrictionsManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/restrictions/RestrictionsManagerService;->onStart()V
+PLcom/android/server/search/SearchManagerService$GlobalSearchProviderObserver;-><init>(Lcom/android/server/search/SearchManagerService;Landroid/content/ContentResolver;)V
+PLcom/android/server/search/SearchManagerService$Lifecycle$1;-><init>(Lcom/android/server/search/SearchManagerService$Lifecycle;I)V
+PLcom/android/server/search/SearchManagerService$Lifecycle$1;->run()V
+PLcom/android/server/search/SearchManagerService$Lifecycle;->-get0(Lcom/android/server/search/SearchManagerService$Lifecycle;)Lcom/android/server/search/SearchManagerService;
+PLcom/android/server/search/SearchManagerService$Lifecycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/search/SearchManagerService$Lifecycle;->onStart()V
+PLcom/android/server/search/SearchManagerService$Lifecycle;->onUnlockUser(I)V
+PLcom/android/server/search/SearchManagerService$MyPackageMonitor;-><init>(Lcom/android/server/search/SearchManagerService;)V
+PLcom/android/server/search/SearchManagerService$MyPackageMonitor;->onPackageModified(Ljava/lang/String;)V
+PLcom/android/server/search/SearchManagerService$MyPackageMonitor;->onSomePackagesChanged()V
+PLcom/android/server/search/SearchManagerService$MyPackageMonitor;->updateSearchables()V
+PLcom/android/server/search/SearchManagerService;->-get0(Lcom/android/server/search/SearchManagerService;)Landroid/content/Context;
+PLcom/android/server/search/SearchManagerService;->-get1(Lcom/android/server/search/SearchManagerService;)Landroid/util/SparseArray;
+PLcom/android/server/search/SearchManagerService;->-wrap1(Lcom/android/server/search/SearchManagerService;I)V
+PLcom/android/server/search/SearchManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/search/SearchManagerService;->getSearchables(IZ)Lcom/android/server/search/Searchables;
+PLcom/android/server/search/SearchManagerService;->onUnlockUser(I)V
+PLcom/android/server/search/Searchables$1;-><init>()V
+PLcom/android/server/search/Searchables;-><init>(Landroid/content/Context;I)V
+PLcom/android/server/search/Searchables;->findGlobalSearchActivities()Ljava/util/List;
+PLcom/android/server/search/Searchables;->findGlobalSearchActivity(Ljava/util/List;)Landroid/content/ComponentName;
+PLcom/android/server/search/Searchables;->findWebSearchActivity(Landroid/content/ComponentName;)Landroid/content/ComponentName;
+PLcom/android/server/search/Searchables;->getDefaultGlobalSearchProvider(Ljava/util/List;)Landroid/content/ComponentName;
+PLcom/android/server/search/Searchables;->getGlobalSearchProviderSetting()Ljava/lang/String;
+PLcom/android/server/search/Searchables;->queryIntentActivities(Landroid/content/Intent;I)Ljava/util/List;
+PLcom/android/server/search/Searchables;->updateSearchableList()V
+PLcom/android/server/security/KeyAttestationApplicationIdProviderService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/security/KeyChainSystemService$1;-><init>(Lcom/android/server/security/KeyChainSystemService;)V
+PLcom/android/server/security/KeyChainSystemService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/security/KeyChainSystemService;->onStart()V
+PLcom/android/server/soundtrigger/SoundTriggerDbHelper;-><init>(Landroid/content/Context;)V
+PLcom/android/server/soundtrigger/SoundTriggerHelper$MyCallStateListener;-><init>(Lcom/android/server/soundtrigger/SoundTriggerHelper;)V
+PLcom/android/server/soundtrigger/SoundTriggerHelper;-><init>(Landroid/content/Context;)V
+PLcom/android/server/soundtrigger/SoundTriggerHelper;->getModuleProperties()Landroid/hardware/soundtrigger/SoundTrigger$ModuleProperties;
+PLcom/android/server/soundtrigger/SoundTriggerInternal;-><init>()V
+PLcom/android/server/soundtrigger/SoundTriggerService$1;-><init>(Lcom/android/server/soundtrigger/SoundTriggerService;)V
+PLcom/android/server/soundtrigger/SoundTriggerService$LocalSoundTriggerService;-><init>(Lcom/android/server/soundtrigger/SoundTriggerService;Landroid/content/Context;)V
+PLcom/android/server/soundtrigger/SoundTriggerService$LocalSoundTriggerService;->getModuleProperties()Landroid/hardware/soundtrigger/SoundTrigger$ModuleProperties;
+PLcom/android/server/soundtrigger/SoundTriggerService$LocalSoundTriggerService;->isInitialized()Z
+PLcom/android/server/soundtrigger/SoundTriggerService$LocalSoundTriggerService;->setSoundTriggerHelper(Lcom/android/server/soundtrigger/SoundTriggerHelper;)V
+PLcom/android/server/soundtrigger/SoundTriggerService$SoundTriggerServiceStub;-><init>(Lcom/android/server/soundtrigger/SoundTriggerService;)V
+PLcom/android/server/soundtrigger/SoundTriggerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/soundtrigger/SoundTriggerService;->initSoundTriggerHelper()V
+PLcom/android/server/soundtrigger/SoundTriggerService;->onBootPhase(I)V
+PLcom/android/server/soundtrigger/SoundTriggerService;->onStart()V
+PLcom/android/server/soundtrigger/SoundTriggerService;->onStartUser(I)V
+PLcom/android/server/statusbar/-$Lambda$-TUoAzP8agiJJX9P4eGDtNXdVZ4$1;->$m$0()V
+PLcom/android/server/statusbar/-$Lambda$-TUoAzP8agiJJX9P4eGDtNXdVZ4$1;-><init>(Ljava/lang/Object;)V
+PLcom/android/server/statusbar/-$Lambda$-TUoAzP8agiJJX9P4eGDtNXdVZ4$1;->run()V
+PLcom/android/server/statusbar/StatusBarManagerService$1;-><init>(Lcom/android/server/statusbar/StatusBarManagerService;)V
+PLcom/android/server/statusbar/StatusBarManagerService$1;->appTransitionCancelled()V
+PLcom/android/server/statusbar/StatusBarManagerService$1;->appTransitionFinished()V
+PLcom/android/server/statusbar/StatusBarManagerService$1;->appTransitionPending()V
+PLcom/android/server/statusbar/StatusBarManagerService$1;->appTransitionStarting(JJ)V
+PLcom/android/server/statusbar/StatusBarManagerService$1;->setNotificationDelegate(Lcom/android/server/notification/NotificationDelegate;)V
+PLcom/android/server/statusbar/StatusBarManagerService$1;->setSystemUiVisibility(IIIILandroid/graphics/Rect;Landroid/graphics/Rect;Ljava/lang/String;)V
+PLcom/android/server/statusbar/StatusBarManagerService$1;->setWindowState(II)V
+PLcom/android/server/statusbar/StatusBarManagerService$1;->topAppWindowChanged(Z)V
+PLcom/android/server/statusbar/StatusBarManagerService$2;-><init>(Lcom/android/server/statusbar/StatusBarManagerService;I)V
+PLcom/android/server/statusbar/StatusBarManagerService$2;->run()V
+PLcom/android/server/statusbar/StatusBarManagerService$3;-><init>(Lcom/android/server/statusbar/StatusBarManagerService;Z)V
+PLcom/android/server/statusbar/StatusBarManagerService$3;->run()V
+PLcom/android/server/statusbar/StatusBarManagerService$4;-><init>(Lcom/android/server/statusbar/StatusBarManagerService;Landroid/os/IBinder;IIZ)V
+PLcom/android/server/statusbar/StatusBarManagerService$4;->run()V
+PLcom/android/server/statusbar/StatusBarManagerService$5;-><init>(Lcom/android/server/statusbar/StatusBarManagerService;IIIILandroid/graphics/Rect;Landroid/graphics/Rect;)V
+PLcom/android/server/statusbar/StatusBarManagerService$5;->run()V
+PLcom/android/server/statusbar/StatusBarManagerService$6;-><init>(Lcom/android/server/statusbar/StatusBarManagerService;)V
+PLcom/android/server/statusbar/StatusBarManagerService$DisableRecord;-><init>(Lcom/android/server/statusbar/StatusBarManagerService;)V
+PLcom/android/server/statusbar/StatusBarManagerService$DisableRecord;-><init>(Lcom/android/server/statusbar/StatusBarManagerService;Lcom/android/server/statusbar/StatusBarManagerService$DisableRecord;)V
+PLcom/android/server/statusbar/StatusBarManagerService;->-get0(Lcom/android/server/statusbar/StatusBarManagerService;)Lcom/android/internal/statusbar/IStatusBar;
+PLcom/android/server/statusbar/StatusBarManagerService;->-get2(Lcom/android/server/statusbar/StatusBarManagerService;)Lcom/android/server/notification/NotificationDelegate;
+PLcom/android/server/statusbar/StatusBarManagerService;->-set3(Lcom/android/server/statusbar/StatusBarManagerService;Lcom/android/server/notification/NotificationDelegate;)Lcom/android/server/notification/NotificationDelegate;
+PLcom/android/server/statusbar/StatusBarManagerService;->-wrap0(Lcom/android/server/statusbar/StatusBarManagerService;)V
+PLcom/android/server/statusbar/StatusBarManagerService;->-wrap2(Lcom/android/server/statusbar/StatusBarManagerService;IIIILandroid/graphics/Rect;Landroid/graphics/Rect;Ljava/lang/String;)V
+PLcom/android/server/statusbar/StatusBarManagerService;->-wrap3(Lcom/android/server/statusbar/StatusBarManagerService;Z)V
+PLcom/android/server/statusbar/StatusBarManagerService;-><init>(Landroid/content/Context;Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/statusbar/StatusBarManagerService;->clearNotificationEffects()V
+PLcom/android/server/statusbar/StatusBarManagerService;->disable(ILandroid/os/IBinder;Ljava/lang/String;)V
+PLcom/android/server/statusbar/StatusBarManagerService;->disableForUser(ILandroid/os/IBinder;Ljava/lang/String;I)V
+PLcom/android/server/statusbar/StatusBarManagerService;->disableLocked(IILandroid/os/IBinder;Ljava/lang/String;I)V
+PLcom/android/server/statusbar/StatusBarManagerService;->enforceStatusBar()V
+PLcom/android/server/statusbar/StatusBarManagerService;->enforceStatusBarService()V
+PLcom/android/server/statusbar/StatusBarManagerService;->gatherDisableActionsLocked(II)I
+PLcom/android/server/statusbar/StatusBarManagerService;->lambda$-com_android_server_statusbar_StatusBarManagerService_23991()V
+PLcom/android/server/statusbar/StatusBarManagerService;->manageDisableListLocked(IILandroid/os/IBinder;Ljava/lang/String;I)V
+PLcom/android/server/statusbar/StatusBarManagerService;->notifyBarAttachChanged()V
+PLcom/android/server/statusbar/StatusBarManagerService;->onNotificationExpansionChanged(Ljava/lang/String;ZZ)V
+PLcom/android/server/statusbar/StatusBarManagerService;->onNotificationVisibilityChanged([Lcom/android/internal/statusbar/NotificationVisibility;[Lcom/android/internal/statusbar/NotificationVisibility;)V
+PLcom/android/server/statusbar/StatusBarManagerService;->onPanelHidden()V
+PLcom/android/server/statusbar/StatusBarManagerService;->onPanelRevealed(ZI)V
+PLcom/android/server/statusbar/StatusBarManagerService;->registerStatusBar(Lcom/android/internal/statusbar/IStatusBar;Ljava/util/List;Ljava/util/List;[ILjava/util/List;Landroid/graphics/Rect;Landroid/graphics/Rect;)V
+PLcom/android/server/statusbar/StatusBarManagerService;->setIconVisibility(Ljava/lang/String;Z)V
+PLcom/android/server/statusbar/StatusBarManagerService;->setImeWindowStatus(Landroid/os/IBinder;IIZ)V
+PLcom/android/server/statusbar/StatusBarManagerService;->setSystemUiVisibility(IIIILandroid/graphics/Rect;Landroid/graphics/Rect;Ljava/lang/String;)V
+PLcom/android/server/statusbar/StatusBarManagerService;->topAppWindowChanged(Z)V
+PLcom/android/server/statusbar/StatusBarManagerService;->updateUiVisibilityLocked(IIIILandroid/graphics/Rect;Landroid/graphics/Rect;)V
+PLcom/android/server/storage/CacheQuotaStrategy$1$1;-><init>(Lcom/android/server/storage/CacheQuotaStrategy$1;Landroid/os/IBinder;)V
+PLcom/android/server/storage/CacheQuotaStrategy$1$1;->run()V
+PLcom/android/server/storage/CacheQuotaStrategy$1;-><init>(Lcom/android/server/storage/CacheQuotaStrategy;)V
+PLcom/android/server/storage/CacheQuotaStrategy$1;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/storage/CacheQuotaStrategy;->-get0(Lcom/android/server/storage/CacheQuotaStrategy;)Ljava/lang/Object;
+PLcom/android/server/storage/CacheQuotaStrategy;->-get1(Lcom/android/server/storage/CacheQuotaStrategy;)Landroid/app/usage/ICacheQuotaService;
+PLcom/android/server/storage/CacheQuotaStrategy;->-set0(Lcom/android/server/storage/CacheQuotaStrategy;Landroid/app/usage/ICacheQuotaService;)Landroid/app/usage/ICacheQuotaService;
+PLcom/android/server/storage/CacheQuotaStrategy;->-wrap0(Lcom/android/server/storage/CacheQuotaStrategy;)Ljava/util/List;
+PLcom/android/server/storage/CacheQuotaStrategy;-><init>(Landroid/content/Context;Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/pm/Installer;Landroid/util/ArrayMap;)V
+PLcom/android/server/storage/CacheQuotaStrategy;->createServiceConnection()V
+PLcom/android/server/storage/CacheQuotaStrategy;->disconnectService()V
+PLcom/android/server/storage/CacheQuotaStrategy;->getRequestFromXml(Lorg/xmlpull/v1/XmlPullParser;)Landroid/app/usage/CacheQuotaHint;
+PLcom/android/server/storage/CacheQuotaStrategy;->getServiceComponentName()Landroid/content/ComponentName;
+PLcom/android/server/storage/CacheQuotaStrategy;->getUnfulfilledRequests()Ljava/util/List;
+PLcom/android/server/storage/CacheQuotaStrategy;->insertIntoQuotaMap(Ljava/lang/String;IIJ)V
+PLcom/android/server/storage/CacheQuotaStrategy;->onResult(Landroid/os/Bundle;)V
+PLcom/android/server/storage/CacheQuotaStrategy;->pushProcessedQuotas(Ljava/util/List;)V
+PLcom/android/server/storage/CacheQuotaStrategy;->readFromXml(Ljava/io/InputStream;)Landroid/util/Pair;
+PLcom/android/server/storage/CacheQuotaStrategy;->recalculateQuotas()V
+PLcom/android/server/storage/CacheQuotaStrategy;->saveToXml(Lorg/xmlpull/v1/XmlSerializer;Ljava/util/List;J)V
+PLcom/android/server/storage/CacheQuotaStrategy;->setupQuotasFromFile()J
+PLcom/android/server/storage/CacheQuotaStrategy;->writeXmlToFile(Ljava/util/List;)V
+PLcom/android/server/storage/DeviceStorageMonitorService$1;-><init>(Lcom/android/server/storage/DeviceStorageMonitorService;Landroid/os/Looper;)V
+PLcom/android/server/storage/DeviceStorageMonitorService$1;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/storage/DeviceStorageMonitorService$2;-><init>(Lcom/android/server/storage/DeviceStorageMonitorService;)V
+PLcom/android/server/storage/DeviceStorageMonitorService$2;->getMemoryLowThreshold()J
+PLcom/android/server/storage/DeviceStorageMonitorService$2;->isMemoryLow()Z
+PLcom/android/server/storage/DeviceStorageMonitorService$3;-><init>(Lcom/android/server/storage/DeviceStorageMonitorService;)V
+PLcom/android/server/storage/DeviceStorageMonitorService$CacheFileDeletedObserver;-><init>()V
+PLcom/android/server/storage/DeviceStorageMonitorService$State;->-wrap0(III)Z
+PLcom/android/server/storage/DeviceStorageMonitorService$State;->-wrap1(III)Z
+PLcom/android/server/storage/DeviceStorageMonitorService$State;-><init>()V
+PLcom/android/server/storage/DeviceStorageMonitorService$State;-><init>(Lcom/android/server/storage/DeviceStorageMonitorService$State;)V
+PLcom/android/server/storage/DeviceStorageMonitorService$State;->isEntering(III)Z
+PLcom/android/server/storage/DeviceStorageMonitorService$State;->isLeaving(III)Z
+PLcom/android/server/storage/DeviceStorageMonitorService;->-wrap0(Lcom/android/server/storage/DeviceStorageMonitorService;)V
+PLcom/android/server/storage/DeviceStorageMonitorService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/storage/DeviceStorageMonitorService;->check()V
+PLcom/android/server/storage/DeviceStorageMonitorService;->findOrCreateState(Ljava/util/UUID;)Lcom/android/server/storage/DeviceStorageMonitorService$State;
+PLcom/android/server/storage/DeviceStorageMonitorService;->isBootImageOnDisk()Z
+PLcom/android/server/storage/DeviceStorageMonitorService;->onStart()V
+PLcom/android/server/storage/DeviceStorageMonitorService;->updateBroadcasts(Landroid/os/storage/VolumeInfo;III)V
+PLcom/android/server/storage/DeviceStorageMonitorService;->updateNotifications(Landroid/os/storage/VolumeInfo;II)V
+PLcom/android/server/storage/DiskStatsLoggingService;->schedule(Landroid/content/Context;)V
+PLcom/android/server/telecom/TelecomLoaderService$1;-><init>(Lcom/android/server/telecom/TelecomLoaderService;)V
+PLcom/android/server/telecom/TelecomLoaderService$2;-><init>(Lcom/android/server/telecom/TelecomLoaderService;)V
+PLcom/android/server/telecom/TelecomLoaderService$3;-><init>(Lcom/android/server/telecom/TelecomLoaderService;)V
+PLcom/android/server/telecom/TelecomLoaderService$4;-><init>(Lcom/android/server/telecom/TelecomLoaderService;Landroid/os/Handler;Landroid/net/Uri;Landroid/content/pm/PackageManagerInternal;Landroid/net/Uri;)V
+PLcom/android/server/telecom/TelecomLoaderService$5;-><init>(Lcom/android/server/telecom/TelecomLoaderService;Landroid/content/pm/PackageManagerInternal;)V
+PLcom/android/server/telecom/TelecomLoaderService$5;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/telecom/TelecomLoaderService$TelecomServiceConnection$1;-><init>(Lcom/android/server/telecom/TelecomLoaderService$TelecomServiceConnection;)V
+PLcom/android/server/telecom/TelecomLoaderService$TelecomServiceConnection;-><init>(Lcom/android/server/telecom/TelecomLoaderService;)V
+PLcom/android/server/telecom/TelecomLoaderService$TelecomServiceConnection;-><init>(Lcom/android/server/telecom/TelecomLoaderService;Lcom/android/server/telecom/TelecomLoaderService$TelecomServiceConnection;)V
+PLcom/android/server/telecom/TelecomLoaderService$TelecomServiceConnection;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/telecom/TelecomLoaderService;->-get0(Lcom/android/server/telecom/TelecomLoaderService;)Landroid/content/Context;
+PLcom/android/server/telecom/TelecomLoaderService;->-get1(Lcom/android/server/telecom/TelecomLoaderService;)Landroid/util/IntArray;
+PLcom/android/server/telecom/TelecomLoaderService;->-get2(Lcom/android/server/telecom/TelecomLoaderService;)Landroid/util/IntArray;
+PLcom/android/server/telecom/TelecomLoaderService;->-get3(Lcom/android/server/telecom/TelecomLoaderService;)Landroid/util/IntArray;
+PLcom/android/server/telecom/TelecomLoaderService;->-get4(Lcom/android/server/telecom/TelecomLoaderService;)Ljava/lang/Object;
+PLcom/android/server/telecom/TelecomLoaderService;->-wrap1(Lcom/android/server/telecom/TelecomLoaderService;Landroid/content/pm/PackageManagerInternal;I)V
+PLcom/android/server/telecom/TelecomLoaderService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/telecom/TelecomLoaderService;->connectToTelecom()V
+PLcom/android/server/telecom/TelecomLoaderService;->onBootPhase(I)V
+PLcom/android/server/telecom/TelecomLoaderService;->onStart()V
+PLcom/android/server/telecom/TelecomLoaderService;->registerCarrierConfigChangedReceiver()V
+PLcom/android/server/telecom/TelecomLoaderService;->registerDefaultAppNotifier()V
+PLcom/android/server/telecom/TelecomLoaderService;->registerDefaultAppProviders()V
+PLcom/android/server/telecom/TelecomLoaderService;->updateSimCallManagerPermissions(Landroid/content/pm/PackageManagerInternal;I)V
+PLcom/android/server/trust/-$Lambda$RuWUhZ3VT8Cf-F-WFFkHRfck9sI;->$m$0()V
+PLcom/android/server/trust/-$Lambda$RuWUhZ3VT8Cf-F-WFFkHRfck9sI;-><init>()V
+PLcom/android/server/trust/-$Lambda$RuWUhZ3VT8Cf-F-WFFkHRfck9sI;->run()V
+PLcom/android/server/trust/TrustArchive;-><init>()V
+PLcom/android/server/trust/TrustManagerService$1;-><init>(Lcom/android/server/trust/TrustManagerService;)V
+PLcom/android/server/trust/TrustManagerService$1;->clearAllFingerprints()V
+PLcom/android/server/trust/TrustManagerService$1;->enforceListenerPermission()V
+PLcom/android/server/trust/TrustManagerService$1;->enforceReportPermission()V
+PLcom/android/server/trust/TrustManagerService$1;->isDeviceLocked(I)Z
+PLcom/android/server/trust/TrustManagerService$1;->isDeviceSecure(I)Z
+PLcom/android/server/trust/TrustManagerService$1;->isTrustUsuallyManaged(I)Z
+PLcom/android/server/trust/TrustManagerService$1;->lambda$-com_android_server_trust_TrustManagerService$1_34004()V
+PLcom/android/server/trust/TrustManagerService$1;->registerTrustListener(Landroid/app/trust/ITrustListener;)V
+PLcom/android/server/trust/TrustManagerService$1;->reportKeyguardShowingChanged()V
+PLcom/android/server/trust/TrustManagerService$2;-><init>(Lcom/android/server/trust/TrustManagerService;)V
+PLcom/android/server/trust/TrustManagerService$2;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/trust/TrustManagerService$3;-><init>(Lcom/android/server/trust/TrustManagerService;)V
+PLcom/android/server/trust/TrustManagerService$3;->onPackageChanged(Ljava/lang/String;I[Ljava/lang/String;)Z
+PLcom/android/server/trust/TrustManagerService$3;->onSomePackagesChanged()V
+PLcom/android/server/trust/TrustManagerService$Receiver;-><init>(Lcom/android/server/trust/TrustManagerService;)V
+PLcom/android/server/trust/TrustManagerService$Receiver;-><init>(Lcom/android/server/trust/TrustManagerService;Lcom/android/server/trust/TrustManagerService$Receiver;)V
+PLcom/android/server/trust/TrustManagerService$Receiver;->register(Landroid/content/Context;)V
+PLcom/android/server/trust/TrustManagerService$StrongAuthTracker;-><init>(Lcom/android/server/trust/TrustManagerService;Landroid/content/Context;)V
+PLcom/android/server/trust/TrustManagerService$StrongAuthTracker;->onStrongAuthRequiredChanged(I)V
+PLcom/android/server/trust/TrustManagerService;->-get1(Lcom/android/server/trust/TrustManagerService;)Landroid/content/Context;
+PLcom/android/server/trust/TrustManagerService;->-get11(Lcom/android/server/trust/TrustManagerService;)Landroid/util/SparseBooleanArray;
+PLcom/android/server/trust/TrustManagerService;->-get2(Lcom/android/server/trust/TrustManagerService;)I
+PLcom/android/server/trust/TrustManagerService;->-get4(Lcom/android/server/trust/TrustManagerService;)Landroid/os/Handler;
+PLcom/android/server/trust/TrustManagerService;->-get5(Lcom/android/server/trust/TrustManagerService;)Lcom/android/internal/widget/LockPatternUtils;
+PLcom/android/server/trust/TrustManagerService;->-wrap2(Lcom/android/server/trust/TrustManagerService;I)Z
+PLcom/android/server/trust/TrustManagerService;->-wrap3(Lcom/android/server/trust/TrustManagerService;I)I
+PLcom/android/server/trust/TrustManagerService;->-wrap4(Lcom/android/server/trust/TrustManagerService;Landroid/app/trust/ITrustListener;)V
+PLcom/android/server/trust/TrustManagerService;->-wrap8(Lcom/android/server/trust/TrustManagerService;I)V
+PLcom/android/server/trust/TrustManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/trust/TrustManagerService;->addListener(Landroid/app/trust/ITrustListener;)V
+PLcom/android/server/trust/TrustManagerService;->aggregateIsTrustManaged(I)Z
+PLcom/android/server/trust/TrustManagerService;->aggregateIsTrusted(I)Z
+PLcom/android/server/trust/TrustManagerService;->dispatchDeviceLocked(IZ)V
+PLcom/android/server/trust/TrustManagerService;->dispatchOnTrustChanged(ZII)V
+PLcom/android/server/trust/TrustManagerService;->dispatchOnTrustManagedChanged(ZI)V
+PLcom/android/server/trust/TrustManagerService;->getDefaultFactoryTrustAgent(Landroid/content/Context;)Landroid/content/ComponentName;
+PLcom/android/server/trust/TrustManagerService;->isDeviceLockedInner(I)Z
+PLcom/android/server/trust/TrustManagerService;->isTrustUsuallyManagedInternal(I)Z
+PLcom/android/server/trust/TrustManagerService;->maybeEnableFactoryTrustAgents(Lcom/android/internal/widget/LockPatternUtils;I)V
+PLcom/android/server/trust/TrustManagerService;->onBootPhase(I)V
+PLcom/android/server/trust/TrustManagerService;->onStart()V
+PLcom/android/server/trust/TrustManagerService;->onStartUser(I)V
+PLcom/android/server/trust/TrustManagerService;->onUnlockUser(I)V
+PLcom/android/server/trust/TrustManagerService;->refreshAgentList(I)V
+PLcom/android/server/trust/TrustManagerService;->refreshDeviceLockedForUser(I)V
+PLcom/android/server/trust/TrustManagerService;->resolveProfileParent(I)I
+PLcom/android/server/trust/TrustManagerService;->setDeviceLockedForUser(IZ)V
+PLcom/android/server/trust/TrustManagerService;->updateTrust(II)V
+PLcom/android/server/trust/TrustManagerService;->updateTrustAll()V
+PLcom/android/server/twilight/TwilightService$1;-><init>(Lcom/android/server/twilight/TwilightService;)V
+PLcom/android/server/twilight/TwilightService$1;->getLastTwilightState()Lcom/android/server/twilight/TwilightState;
+PLcom/android/server/twilight/TwilightService$1;->unregisterListener(Lcom/android/server/twilight/TwilightListener;)V
+PLcom/android/server/twilight/TwilightService;->-get1(Lcom/android/server/twilight/TwilightService;)Landroid/util/ArrayMap;
+PLcom/android/server/twilight/TwilightService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/twilight/TwilightService;->onBootPhase(I)V
+PLcom/android/server/twilight/TwilightService;->onStart()V
+PLcom/android/server/usage/AppIdleHistory$PackageHistory;-><init>()V
+PLcom/android/server/usage/AppIdleHistory$PackageHistory;-><init>(Lcom/android/server/usage/AppIdleHistory$PackageHistory;)V
+PLcom/android/server/usage/AppIdleHistory;-><init>(J)V
+PLcom/android/server/usage/AppIdleHistory;-><init>(Ljava/io/File;J)V
+PLcom/android/server/usage/AppIdleHistory;->clearUsage(Ljava/lang/String;I)V
+PLcom/android/server/usage/AppIdleHistory;->getElapsedTime(J)J
+PLcom/android/server/usage/AppIdleHistory;->getPackageHistory(Landroid/util/ArrayMap;Ljava/lang/String;J)Lcom/android/server/usage/AppIdleHistory$PackageHistory;
+PLcom/android/server/usage/AppIdleHistory;->getScreenOnTime(J)J
+PLcom/android/server/usage/AppIdleHistory;->getScreenOnTimeFile()Ljava/io/File;
+PLcom/android/server/usage/AppIdleHistory;->getUserFile(I)Ljava/io/File;
+PLcom/android/server/usage/AppIdleHistory;->getUserHistory(I)Landroid/util/ArrayMap;
+PLcom/android/server/usage/AppIdleHistory;->hasPassedThresholds(Lcom/android/server/usage/AppIdleHistory$PackageHistory;J)Z
+PLcom/android/server/usage/AppIdleHistory;->readAppIdleTimes(ILandroid/util/ArrayMap;)V
+PLcom/android/server/usage/AppIdleHistory;->readScreenOnTime()V
+PLcom/android/server/usage/AppIdleHistory;->reportUsage(Ljava/lang/String;IJ)V
+PLcom/android/server/usage/AppIdleHistory;->setIdle(Ljava/lang/String;IJ)V
+PLcom/android/server/usage/AppIdleHistory;->setIdle(Ljava/lang/String;IZJ)V
+PLcom/android/server/usage/AppIdleHistory;->setThresholds(JJ)V
+PLcom/android/server/usage/AppIdleHistory;->shiftHistoryToNow(Landroid/util/ArrayMap;J)V
+PLcom/android/server/usage/AppIdleHistory;->updateDisplay(ZJ)V
+PLcom/android/server/usage/IntervalStats;-><init>()V
+PLcom/android/server/usage/IntervalStats;->buildEvent(Ljava/lang/String;Ljava/lang/String;)Landroid/app/usage/UsageEvents$Event;
+PLcom/android/server/usage/IntervalStats;->getCachedStringRef(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/usage/IntervalStats;->getOrCreateConfigurationStats(Landroid/content/res/Configuration;)Landroid/app/usage/ConfigurationStats;
+PLcom/android/server/usage/IntervalStats;->isStatefulEvent(I)Z
+PLcom/android/server/usage/IntervalStats;->updateConfigurationStats(Landroid/content/res/Configuration;J)V
+PLcom/android/server/usage/StorageStatsService$1;-><init>(Lcom/android/server/usage/StorageStatsService;)V
+PLcom/android/server/usage/StorageStatsService$1;->onVolumeStateChanged(Landroid/os/storage/VolumeInfo;II)V
+PLcom/android/server/usage/StorageStatsService$H;-><init>(Lcom/android/server/usage/StorageStatsService;Landroid/os/Looper;)V
+PLcom/android/server/usage/StorageStatsService$H;->getInitializedStrategy()Lcom/android/server/storage/CacheQuotaStrategy;
+PLcom/android/server/usage/StorageStatsService$H;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/usage/StorageStatsService$H;->recalculateQuotas(Lcom/android/server/storage/CacheQuotaStrategy;)V
+PLcom/android/server/usage/StorageStatsService$Lifecycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/usage/StorageStatsService$Lifecycle;->onStart()V
+PLcom/android/server/usage/StorageStatsService;->-get0(Lcom/android/server/usage/StorageStatsService;)Landroid/util/ArrayMap;
+PLcom/android/server/usage/StorageStatsService;->-get1(Lcom/android/server/usage/StorageStatsService;)Landroid/content/Context;
+PLcom/android/server/usage/StorageStatsService;->-get2(Lcom/android/server/usage/StorageStatsService;)Lcom/android/server/pm/Installer;
+PLcom/android/server/usage/StorageStatsService;->-wrap0(Lcom/android/server/usage/StorageStatsService;)V
+PLcom/android/server/usage/StorageStatsService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/usage/StorageStatsService;->enforcePermission(ILjava/lang/String;)V
+PLcom/android/server/usage/StorageStatsService;->getAppIds(I)[I
+PLcom/android/server/usage/StorageStatsService;->getCacheBytes(Ljava/lang/String;Ljava/lang/String;)J
+PLcom/android/server/usage/StorageStatsService;->getDefaultFlags()I
+PLcom/android/server/usage/StorageStatsService;->invalidateMounts()V
+PLcom/android/server/usage/StorageStatsService;->isCacheQuotaCalculationsEnabled(Landroid/content/ContentResolver;)Z
+PLcom/android/server/usage/StorageStatsService;->isQuotaSupported(Ljava/lang/String;Ljava/lang/String;)Z
+PLcom/android/server/usage/StorageStatsService;->notifySignificantDelta()V
+PLcom/android/server/usage/StorageStatsService;->queryStatsForUser(Ljava/lang/String;ILjava/lang/String;)Landroid/app/usage/StorageStats;
+PLcom/android/server/usage/StorageStatsService;->translate(Landroid/content/pm/PackageStats;)Landroid/app/usage/StorageStats;
+PLcom/android/server/usage/UnixCalendar;-><init>(J)V
+PLcom/android/server/usage/UnixCalendar;->addDays(I)V
+PLcom/android/server/usage/UnixCalendar;->getTimeInMillis()J
+PLcom/android/server/usage/UnixCalendar;->setTimeInMillis(J)V
+PLcom/android/server/usage/UsageStatsDatabase$1;-><init>(Lcom/android/server/usage/UsageStatsDatabase;)V
+PLcom/android/server/usage/UsageStatsDatabase$1;->accept(Ljava/io/File;Ljava/lang/String;)Z
+PLcom/android/server/usage/UsageStatsDatabase;-><init>(Ljava/io/File;)V
+PLcom/android/server/usage/UsageStatsDatabase;->checkVersionAndBuildLocked()V
+PLcom/android/server/usage/UsageStatsDatabase;->findBestFitBucket(JJ)I
+PLcom/android/server/usage/UsageStatsDatabase;->getBuildFingerprint()Ljava/lang/String;
+PLcom/android/server/usage/UsageStatsDatabase;->getLatestUsageStats(I)Lcom/android/server/usage/IntervalStats;
+PLcom/android/server/usage/UsageStatsDatabase;->indexFilesLocked()V
+PLcom/android/server/usage/UsageStatsDatabase;->init(J)V
+PLcom/android/server/usage/UsageStatsDatabase;->isNewUpdate()Z
+PLcom/android/server/usage/UsageStatsDatabase;->queryUsageStats(IJJLcom/android/server/usage/UsageStatsDatabase$StatCombiner;)Ljava/util/List;
+PLcom/android/server/usage/UsageStatsService$1;-><init>(Lcom/android/server/usage/UsageStatsService;)V
+PLcom/android/server/usage/UsageStatsService$2;-><init>(Lcom/android/server/usage/UsageStatsService;)V
+PLcom/android/server/usage/UsageStatsService$2;->onUidGone(IZ)V
+PLcom/android/server/usage/UsageStatsService$BinderService;-><init>(Lcom/android/server/usage/UsageStatsService;)V
+PLcom/android/server/usage/UsageStatsService$BinderService;-><init>(Lcom/android/server/usage/UsageStatsService;Lcom/android/server/usage/UsageStatsService$BinderService;)V
+PLcom/android/server/usage/UsageStatsService$DeviceStateReceiver;-><init>(Lcom/android/server/usage/UsageStatsService;)V
+PLcom/android/server/usage/UsageStatsService$DeviceStateReceiver;-><init>(Lcom/android/server/usage/UsageStatsService;Lcom/android/server/usage/UsageStatsService$DeviceStateReceiver;)V
+PLcom/android/server/usage/UsageStatsService$DeviceStateReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/usage/UsageStatsService$H;-><init>(Lcom/android/server/usage/UsageStatsService;Landroid/os/Looper;)V
+PLcom/android/server/usage/UsageStatsService$H;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/usage/UsageStatsService$LocalService;-><init>(Lcom/android/server/usage/UsageStatsService;)V
+PLcom/android/server/usage/UsageStatsService$LocalService;-><init>(Lcom/android/server/usage/UsageStatsService;Lcom/android/server/usage/UsageStatsService$LocalService;)V
+PLcom/android/server/usage/UsageStatsService$LocalService;->addAppIdleStateChangeListener(Landroid/app/usage/UsageStatsManagerInternal$AppIdleStateChangeListener;)V
+PLcom/android/server/usage/UsageStatsService$LocalService;->getIdleUidsForUser(I)[I
+PLcom/android/server/usage/UsageStatsService$LocalService;->isAppIdleParoleOn()Z
+PLcom/android/server/usage/UsageStatsService$LocalService;->queryUsageStatsForUser(IIJJZ)Ljava/util/List;
+PLcom/android/server/usage/UsageStatsService$LocalService;->reportConfigurationChange(Landroid/content/res/Configuration;I)V
+PLcom/android/server/usage/UsageStatsService$LocalService;->reportContentProviderUsage(Ljava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/usage/UsageStatsService$LocalService;->reportEvent(Landroid/content/ComponentName;II)V
+PLcom/android/server/usage/UsageStatsService$LocalService;->reportShortcutUsage(Ljava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/usage/UsageStatsService$PackageReceiver;-><init>(Lcom/android/server/usage/UsageStatsService;)V
+PLcom/android/server/usage/UsageStatsService$PackageReceiver;-><init>(Lcom/android/server/usage/UsageStatsService;Lcom/android/server/usage/UsageStatsService$PackageReceiver;)V
+PLcom/android/server/usage/UsageStatsService$PackageReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/usage/UsageStatsService$SettingsObserver;-><init>(Lcom/android/server/usage/UsageStatsService;Landroid/os/Handler;)V
+PLcom/android/server/usage/UsageStatsService$SettingsObserver;->registerObserver()V
+PLcom/android/server/usage/UsageStatsService$SettingsObserver;->updateSettings()V
+PLcom/android/server/usage/UsageStatsService$UserActionsReceiver;-><init>(Lcom/android/server/usage/UsageStatsService;)V
+PLcom/android/server/usage/UsageStatsService$UserActionsReceiver;-><init>(Lcom/android/server/usage/UsageStatsService;Lcom/android/server/usage/UsageStatsService$UserActionsReceiver;)V
+PLcom/android/server/usage/UsageStatsService$UserActionsReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/usage/UsageStatsService;->-get0()Ljava/io/File;
+PLcom/android/server/usage/UsageStatsService;->-get1(Lcom/android/server/usage/UsageStatsService;)Lcom/android/server/usage/AppIdleHistory;
+PLcom/android/server/usage/UsageStatsService;->-get2(Lcom/android/server/usage/UsageStatsService;)Ljava/lang/Object;
+PLcom/android/server/usage/UsageStatsService;->-get4(Lcom/android/server/usage/UsageStatsService;)Landroid/util/SparseIntArray;
+PLcom/android/server/usage/UsageStatsService;->-wrap0(Lcom/android/server/usage/UsageStatsService;Ljava/lang/String;IIJ)Z
+PLcom/android/server/usage/UsageStatsService;->-wrap2(Lcom/android/server/usage/UsageStatsService;II)Z
+PLcom/android/server/usage/UsageStatsService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/usage/UsageStatsService;->addListener(Landroid/app/usage/UsageStatsManagerInternal$AppIdleStateChangeListener;)V
+PLcom/android/server/usage/UsageStatsService;->checkIdleStates(I)Z
+PLcom/android/server/usage/UsageStatsService;->cleanUpRemovedUsersLocked()V
+PLcom/android/server/usage/UsageStatsService;->clearAppIdleForPackage(Ljava/lang/String;I)V
+PLcom/android/server/usage/UsageStatsService;->clearCarrierPrivilegedApps()V
+PLcom/android/server/usage/UsageStatsService;->convertToSystemTimeLocked(Landroid/app/usage/UsageEvents$Event;)V
+PLcom/android/server/usage/UsageStatsService;->fetchCarrierPrivilegedAppsLA()V
+PLcom/android/server/usage/UsageStatsService;->forceIdleState(Ljava/lang/String;IZ)V
+PLcom/android/server/usage/UsageStatsService;->getAppId(Ljava/lang/String;)I
+PLcom/android/server/usage/UsageStatsService;->getIdleUidsForUser(I)[I
+PLcom/android/server/usage/UsageStatsService;->getUserDataAndInitializeIfNeededLocked(IJ)Lcom/android/server/usage/UserUsageStatsService;
+PLcom/android/server/usage/UsageStatsService;->informListeners(Ljava/lang/String;IZ)V
+PLcom/android/server/usage/UsageStatsService;->informParoleStateChanged()V
+PLcom/android/server/usage/UsageStatsService;->isActiveDeviceAdmin(Ljava/lang/String;I)Z
+PLcom/android/server/usage/UsageStatsService;->isAppIdleFilteredOrParoled(Ljava/lang/String;IJZ)Z
+PLcom/android/server/usage/UsageStatsService;->isAppIdleUnfiltered(Ljava/lang/String;IJ)Z
+PLcom/android/server/usage/UsageStatsService;->isCarrierApp(Ljava/lang/String;)Z
+PLcom/android/server/usage/UsageStatsService;->isDisplayOn()Z
+PLcom/android/server/usage/UsageStatsService;->isParoledOrCharging()Z
+PLcom/android/server/usage/UsageStatsService;->notifyBatteryStats(Ljava/lang/String;IZ)V
+PLcom/android/server/usage/UsageStatsService;->onBootPhase(I)V
+PLcom/android/server/usage/UsageStatsService;->onStart()V
+PLcom/android/server/usage/UsageStatsService;->onStatsUpdated()V
+PLcom/android/server/usage/UsageStatsService;->postCheckIdleStates(I)V
+PLcom/android/server/usage/UsageStatsService;->postParoleStateChanged()V
+PLcom/android/server/usage/UsageStatsService;->queryUsageStats(IIJJZ)Ljava/util/List;
+PLcom/android/server/usage/UsageStatsService;->reportContentProviderUsage(Ljava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/usage/UsageStatsService;->setAppIdleAsync(Ljava/lang/String;ZI)V
+PLcom/android/server/usage/UsageStatsService;->setChargingState(Z)V
+PLcom/android/server/usage/UsageStatsService;->shouldObfuscateInstantAppsForCaller(II)Z
+PLcom/android/server/usage/UsageStatsService;->validRange(JJJ)Z
+PLcom/android/server/usage/UsageStatsXml;->parseBeginTime(Landroid/util/AtomicFile;)J
+PLcom/android/server/usage/UsageStatsXml;->parseBeginTime(Ljava/io/File;)J
+PLcom/android/server/usage/UsageStatsXml;->read(Landroid/util/AtomicFile;Lcom/android/server/usage/IntervalStats;)V
+PLcom/android/server/usage/UsageStatsXml;->read(Ljava/io/InputStream;Lcom/android/server/usage/IntervalStats;)V
+PLcom/android/server/usage/UsageStatsXmlV1;->loadConfigStats(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/usage/IntervalStats;)V
+PLcom/android/server/usage/UsageStatsXmlV1;->loadEvent(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/usage/IntervalStats;)V
+PLcom/android/server/usage/UsageStatsXmlV1;->loadUsageStats(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/usage/IntervalStats;)V
+PLcom/android/server/usage/UserUsageStatsService$1;-><init>()V
+PLcom/android/server/usage/UserUsageStatsService$1;->combine(Lcom/android/server/usage/IntervalStats;ZLjava/util/List;)V
+PLcom/android/server/usage/UserUsageStatsService$2;-><init>()V
+PLcom/android/server/usage/UserUsageStatsService;-><init>(Landroid/content/Context;ILjava/io/File;Lcom/android/server/usage/UserUsageStatsService$StatsUpdatedListener;)V
+PLcom/android/server/usage/UserUsageStatsService;->init(J)V
+PLcom/android/server/usage/UserUsageStatsService;->notifyStatsChanged()V
+PLcom/android/server/usage/UserUsageStatsService;->queryStats(IJJLcom/android/server/usage/UsageStatsDatabase$StatCombiner;)Ljava/util/List;
+PLcom/android/server/usage/UserUsageStatsService;->queryUsageStats(IJJ)Ljava/util/List;
+PLcom/android/server/usage/UserUsageStatsService;->updateRolloverDeadline()V
+PLcom/android/server/usb/MtpNotificationManager$Receiver;-><init>(Lcom/android/server/usb/MtpNotificationManager;)V
+PLcom/android/server/usb/MtpNotificationManager$Receiver;-><init>(Lcom/android/server/usb/MtpNotificationManager;Lcom/android/server/usb/MtpNotificationManager$Receiver;)V
+PLcom/android/server/usb/MtpNotificationManager;-><init>(Landroid/content/Context;Lcom/android/server/usb/MtpNotificationManager$OnOpenInAppListener;)V
+PLcom/android/server/usb/UsbAlsaManager$1;-><init>(Lcom/android/server/usb/UsbAlsaManager;Ljava/lang/String;I)V
+PLcom/android/server/usb/UsbAlsaManager$AlsaDevice;-><init>(Lcom/android/server/usb/UsbAlsaManager;III)V
+PLcom/android/server/usb/UsbAlsaManager$AlsaDevice;->toString()Ljava/lang/String;
+PLcom/android/server/usb/UsbAlsaManager;-><init>(Landroid/content/Context;)V
+PLcom/android/server/usb/UsbAlsaManager;->alsaFileAdded(Ljava/lang/String;)V
+PLcom/android/server/usb/UsbAlsaManager;->setPeripheralMidiState(ZII)V
+PLcom/android/server/usb/UsbAlsaManager;->systemReady()V
+PLcom/android/server/usb/UsbDebuggingManager$UsbDebuggingHandler;-><init>(Lcom/android/server/usb/UsbDebuggingManager;Landroid/os/Looper;)V
+PLcom/android/server/usb/UsbDebuggingManager$UsbDebuggingHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/usb/UsbDebuggingManager$UsbDebuggingThread;-><init>(Lcom/android/server/usb/UsbDebuggingManager;)V
+PLcom/android/server/usb/UsbDebuggingManager$UsbDebuggingThread;->listenToSocket()V
+PLcom/android/server/usb/UsbDebuggingManager$UsbDebuggingThread;->openSocketLocked()V
+PLcom/android/server/usb/UsbDebuggingManager$UsbDebuggingThread;->run()V
+PLcom/android/server/usb/UsbDebuggingManager;->-get0(Lcom/android/server/usb/UsbDebuggingManager;)Z
+PLcom/android/server/usb/UsbDebuggingManager;->-get3(Lcom/android/server/usb/UsbDebuggingManager;)Lcom/android/server/usb/UsbDebuggingManager$UsbDebuggingThread;
+PLcom/android/server/usb/UsbDebuggingManager;->-set0(Lcom/android/server/usb/UsbDebuggingManager;Z)Z
+PLcom/android/server/usb/UsbDebuggingManager;->-set2(Lcom/android/server/usb/UsbDebuggingManager;Lcom/android/server/usb/UsbDebuggingManager$UsbDebuggingThread;)Lcom/android/server/usb/UsbDebuggingManager$UsbDebuggingThread;
+PLcom/android/server/usb/UsbDebuggingManager;-><init>(Landroid/content/Context;)V
+PLcom/android/server/usb/UsbDebuggingManager;->setAdbEnabled(Z)V
+PLcom/android/server/usb/UsbDeviceManager$1;-><init>(Lcom/android/server/usb/UsbDeviceManager;)V
+PLcom/android/server/usb/UsbDeviceManager$2;-><init>(Lcom/android/server/usb/UsbDeviceManager;)V
+PLcom/android/server/usb/UsbDeviceManager$2;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/usb/UsbDeviceManager$3;-><init>(Lcom/android/server/usb/UsbDeviceManager;)V
+PLcom/android/server/usb/UsbDeviceManager$3;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/usb/UsbDeviceManager$4;-><init>(Lcom/android/server/usb/UsbDeviceManager;)V
+PLcom/android/server/usb/UsbDeviceManager$5;-><init>(Lcom/android/server/usb/UsbDeviceManager;)V
+PLcom/android/server/usb/UsbDeviceManager$AdbSettingsObserver;-><init>(Lcom/android/server/usb/UsbDeviceManager;)V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;-><init>(Lcom/android/server/usb/UsbDeviceManager;Landroid/os/Looper;)V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->applyAdbFunction(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->getDefaultFunctions()Ljava/lang/String;
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->isNormalBoot()Z
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->isUsbStateChanged(Landroid/content/Intent;)Z
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->isUsbTransferAllowed()Z
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->sendMessage(IZ)V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->setEnabledFunctions(Ljava/lang/String;ZZ)V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->trySetEnabledFunctions(Ljava/lang/String;Z)Z
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->updateAdbNotification(Z)V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->updateAudioSourceFunction()V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->updateHostState(Landroid/hardware/usb/UsbPort;Landroid/hardware/usb/UsbPortStatus;)V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->updateMidiFunction()V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->updateState(Ljava/lang/String;)V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->updateUsbFunctions()V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->updateUsbNotification(Z)V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->updateUsbStateBroadcastIfNeeded(Z)V
+PLcom/android/server/usb/UsbDeviceManager;->-get1(Lcom/android/server/usb/UsbDeviceManager;)Z
+PLcom/android/server/usb/UsbDeviceManager;->-get10(Lcom/android/server/usb/UsbDeviceManager;)I
+PLcom/android/server/usb/UsbDeviceManager;->-get11(Lcom/android/server/usb/UsbDeviceManager;)Z
+PLcom/android/server/usb/UsbDeviceManager;->-get12(Lcom/android/server/usb/UsbDeviceManager;)Landroid/app/NotificationManager;
+PLcom/android/server/usb/UsbDeviceManager;->-get13(Lcom/android/server/usb/UsbDeviceManager;)Z
+PLcom/android/server/usb/UsbDeviceManager;->-get15(Lcom/android/server/usb/UsbDeviceManager;)Landroid/os/UEventObserver;
+PLcom/android/server/usb/UsbDeviceManager;->-get16(Lcom/android/server/usb/UsbDeviceManager;)Lcom/android/server/usb/UsbAlsaManager;
+PLcom/android/server/usb/UsbDeviceManager;->-get17(Lcom/android/server/usb/UsbDeviceManager;)Z
+PLcom/android/server/usb/UsbDeviceManager;->-get2(Lcom/android/server/usb/UsbDeviceManager;)Z
+PLcom/android/server/usb/UsbDeviceManager;->-get3(Lcom/android/server/usb/UsbDeviceManager;)Z
+PLcom/android/server/usb/UsbDeviceManager;->-get4(Lcom/android/server/usb/UsbDeviceManager;)Landroid/content/Intent;
+PLcom/android/server/usb/UsbDeviceManager;->-get5(Lcom/android/server/usb/UsbDeviceManager;)Landroid/content/ContentResolver;
+PLcom/android/server/usb/UsbDeviceManager;->-get6(Lcom/android/server/usb/UsbDeviceManager;)Landroid/content/Context;
+PLcom/android/server/usb/UsbDeviceManager;->-get7(Lcom/android/server/usb/UsbDeviceManager;)Lcom/android/server/usb/UsbDebuggingManager;
+PLcom/android/server/usb/UsbDeviceManager;->-get8(Lcom/android/server/usb/UsbDeviceManager;)Lcom/android/server/usb/UsbDeviceManager$UsbHandler;
+PLcom/android/server/usb/UsbDeviceManager;->-get9(Lcom/android/server/usb/UsbDeviceManager;)I
+PLcom/android/server/usb/UsbDeviceManager;->-set1(Lcom/android/server/usb/UsbDeviceManager;Z)Z
+PLcom/android/server/usb/UsbDeviceManager;->-set3(Lcom/android/server/usb/UsbDeviceManager;Z)Z
+PLcom/android/server/usb/UsbDeviceManager;->-set4(Lcom/android/server/usb/UsbDeviceManager;Landroid/content/Intent;)Landroid/content/Intent;
+PLcom/android/server/usb/UsbDeviceManager;->-set8(Lcom/android/server/usb/UsbDeviceManager;Z)Z
+PLcom/android/server/usb/UsbDeviceManager;->-wrap1(Lcom/android/server/usb/UsbDeviceManager;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/usb/UsbDeviceManager;-><init>(Landroid/content/Context;Lcom/android/server/usb/UsbAlsaManager;Lcom/android/server/usb/UsbSettingsManager;)V
+PLcom/android/server/usb/UsbDeviceManager;->applyOemOverrideFunction(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/usb/UsbDeviceManager;->bootCompleted()V
+PLcom/android/server/usb/UsbDeviceManager;->getPersistProp(Z)Ljava/lang/String;
+PLcom/android/server/usb/UsbDeviceManager;->initRndisAddress()V
+PLcom/android/server/usb/UsbDeviceManager;->isTv()Z
+PLcom/android/server/usb/UsbDeviceManager;->readOemUsbOverrideConfig()V
+PLcom/android/server/usb/UsbDeviceManager;->setCurrentUser(ILcom/android/server/usb/UsbProfileGroupSettingsManager;)V
+PLcom/android/server/usb/UsbDeviceManager;->systemReady()V
+PLcom/android/server/usb/UsbHostManager$1;-><init>(Lcom/android/server/usb/UsbHostManager;)V
+PLcom/android/server/usb/UsbHostManager$1;->run()V
+PLcom/android/server/usb/UsbHostManager;->-wrap0(Lcom/android/server/usb/UsbHostManager;)V
+PLcom/android/server/usb/UsbHostManager;-><init>(Landroid/content/Context;Lcom/android/server/usb/UsbAlsaManager;Lcom/android/server/usb/UsbSettingsManager;)V
+PLcom/android/server/usb/UsbHostManager;->getDeviceList(Landroid/os/Bundle;)V
+PLcom/android/server/usb/UsbHostManager;->setCurrentUserSettings(Lcom/android/server/usb/UsbProfileGroupSettingsManager;)V
+PLcom/android/server/usb/UsbHostManager;->setUsbDeviceConnectionHandler(Landroid/content/ComponentName;)V
+PLcom/android/server/usb/UsbHostManager;->systemReady()V
+PLcom/android/server/usb/UsbPortManager$1;-><init>(Lcom/android/server/usb/UsbPortManager;Landroid/os/Looper;)V
+PLcom/android/server/usb/UsbPortManager$1;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/usb/UsbPortManager$2;-><init>(Lcom/android/server/usb/UsbPortManager;Landroid/content/Intent;)V
+PLcom/android/server/usb/UsbPortManager$2;->run()V
+PLcom/android/server/usb/UsbPortManager$DeathRecipient;-><init>(Lcom/android/server/usb/UsbPortManager;Lcom/android/internal/util/IndentingPrintWriter;)V
+PLcom/android/server/usb/UsbPortManager$HALCallback;-><init>(Lcom/android/internal/util/IndentingPrintWriter;Lcom/android/server/usb/UsbPortManager;)V
+PLcom/android/server/usb/UsbPortManager$HALCallback;->notifyPortStatusChange_1_1(Ljava/util/ArrayList;I)V
+PLcom/android/server/usb/UsbPortManager$PortInfo;-><init>(Ljava/lang/String;I)V
+PLcom/android/server/usb/UsbPortManager$PortInfo;->setStatus(IZIZIZI)Z
+PLcom/android/server/usb/UsbPortManager$PortInfo;->toString()Ljava/lang/String;
+PLcom/android/server/usb/UsbPortManager$RawPortInfo$1;-><init>()V
+PLcom/android/server/usb/UsbPortManager$RawPortInfo;-><init>(Ljava/lang/String;IIZIZIZ)V
+PLcom/android/server/usb/UsbPortManager$ServiceNotification;-><init>(Lcom/android/server/usb/UsbPortManager;)V
+PLcom/android/server/usb/UsbPortManager$ServiceNotification;->onRegistration(Ljava/lang/String;Ljava/lang/String;Z)V
+PLcom/android/server/usb/UsbPortManager;->-get0(Lcom/android/server/usb/UsbPortManager;)Landroid/content/Context;
+PLcom/android/server/usb/UsbPortManager;->-get1(Lcom/android/server/usb/UsbPortManager;)Landroid/os/Handler;
+PLcom/android/server/usb/UsbPortManager;->-get2(Lcom/android/server/usb/UsbPortManager;)Ljava/lang/Object;
+PLcom/android/server/usb/UsbPortManager;->-get3(Lcom/android/server/usb/UsbPortManager;)Z
+PLcom/android/server/usb/UsbPortManager;->-wrap0(Lcom/android/server/usb/UsbPortManager;Lcom/android/internal/util/IndentingPrintWriter;)V
+PLcom/android/server/usb/UsbPortManager;->-wrap1(ILcom/android/internal/util/IndentingPrintWriter;Ljava/lang/String;)V
+PLcom/android/server/usb/UsbPortManager;->-wrap2(Lcom/android/server/usb/UsbPortManager;Lcom/android/internal/util/IndentingPrintWriter;Ljava/util/ArrayList;)V
+PLcom/android/server/usb/UsbPortManager;-><init>(Landroid/content/Context;)V
+PLcom/android/server/usb/UsbPortManager;->addOrUpdatePortLocked(Ljava/lang/String;IIZIZIZLcom/android/internal/util/IndentingPrintWriter;)V
+PLcom/android/server/usb/UsbPortManager;->connectToProxy(Lcom/android/internal/util/IndentingPrintWriter;)V
+PLcom/android/server/usb/UsbPortManager;->handlePortAddedLocked(Lcom/android/server/usb/UsbPortManager$PortInfo;Lcom/android/internal/util/IndentingPrintWriter;)V
+PLcom/android/server/usb/UsbPortManager;->logAndPrint(ILcom/android/internal/util/IndentingPrintWriter;Ljava/lang/String;)V
+PLcom/android/server/usb/UsbPortManager;->sendPortChangedBroadcastLocked(Lcom/android/server/usb/UsbPortManager$PortInfo;)V
+PLcom/android/server/usb/UsbPortManager;->systemReady()V
+PLcom/android/server/usb/UsbPortManager;->updatePortsLocked(Lcom/android/internal/util/IndentingPrintWriter;Ljava/util/ArrayList;)V
+PLcom/android/server/usb/UsbProfileGroupSettingsManager$1;-><init>(Lcom/android/server/usb/UsbProfileGroupSettingsManager;)V
+PLcom/android/server/usb/UsbProfileGroupSettingsManager$MyPackageMonitor;-><init>(Lcom/android/server/usb/UsbProfileGroupSettingsManager;)V
+PLcom/android/server/usb/UsbProfileGroupSettingsManager$MyPackageMonitor;-><init>(Lcom/android/server/usb/UsbProfileGroupSettingsManager;Lcom/android/server/usb/UsbProfileGroupSettingsManager$MyPackageMonitor;)V
+PLcom/android/server/usb/UsbProfileGroupSettingsManager$MyPackageMonitor;->onPackageAdded(Ljava/lang/String;I)V
+PLcom/android/server/usb/UsbProfileGroupSettingsManager$UserPackage;-><init>(Ljava/lang/String;Landroid/os/UserHandle;)V
+PLcom/android/server/usb/UsbProfileGroupSettingsManager$UserPackage;-><init>(Ljava/lang/String;Landroid/os/UserHandle;Lcom/android/server/usb/UsbProfileGroupSettingsManager$UserPackage;)V
+PLcom/android/server/usb/UsbProfileGroupSettingsManager;->-get1(Lcom/android/server/usb/UsbProfileGroupSettingsManager;)Landroid/os/UserHandle;
+PLcom/android/server/usb/UsbProfileGroupSettingsManager;->-get2(Lcom/android/server/usb/UsbProfileGroupSettingsManager;)Landroid/os/UserManager;
+PLcom/android/server/usb/UsbProfileGroupSettingsManager;->-wrap1(Lcom/android/server/usb/UsbProfileGroupSettingsManager;Lcom/android/server/usb/UsbProfileGroupSettingsManager$UserPackage;)V
+PLcom/android/server/usb/UsbProfileGroupSettingsManager;-><init>(Landroid/content/Context;Landroid/os/UserHandle;Lcom/android/server/usb/UsbSettingsManager;)V
+PLcom/android/server/usb/UsbProfileGroupSettingsManager;->handlePackageAdded(Lcom/android/server/usb/UsbProfileGroupSettingsManager$UserPackage;)V
+PLcom/android/server/usb/UsbProfileGroupSettingsManager;->handlePackageAddedLocked(Lcom/android/server/usb/UsbProfileGroupSettingsManager$UserPackage;Landroid/content/pm/ActivityInfo;Ljava/lang/String;)Z
+PLcom/android/server/usb/UsbProfileGroupSettingsManager;->readSettingsLocked()V
+PLcom/android/server/usb/UsbProfileGroupSettingsManager;->upgradeSingleUserLocked()V
+PLcom/android/server/usb/UsbService$1;-><init>(Lcom/android/server/usb/UsbService;)V
+PLcom/android/server/usb/UsbService$Lifecycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/usb/UsbService$Lifecycle;->onBootPhase(I)V
+PLcom/android/server/usb/UsbService$Lifecycle;->onStart()V
+PLcom/android/server/usb/UsbService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/usb/UsbService;->bootCompleted()V
+PLcom/android/server/usb/UsbService;->getDeviceList(Landroid/os/Bundle;)V
+PLcom/android/server/usb/UsbService;->onSwitchUser(I)V
+PLcom/android/server/usb/UsbService;->systemReady()V
+PLcom/android/server/usb/UsbSettingsManager;-><init>(Landroid/content/Context;)V
+PLcom/android/server/usb/UsbSettingsManager;->getSettingsForProfileGroup(Landroid/os/UserHandle;)Lcom/android/server/usb/UsbProfileGroupSettingsManager;
+PLcom/android/server/voiceinteraction/DatabaseHelper;-><init>(Landroid/content/Context;)V
+PLcom/android/server/voiceinteraction/DatabaseHelper;->getKeyphraseSoundModel(IILjava/lang/String;)Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseSoundModel;
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$1;-><init>(Lcom/android/server/voiceinteraction/VoiceInteractionManagerService;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$LocalService;-><init>(Lcom/android/server/voiceinteraction/VoiceInteractionManagerService;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub$1;-><init>(Lcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub$1;->onPackageModified(Ljava/lang/String;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub$1;->onSomePackagesChanged()V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub$SettingsObserver;-><init>(Lcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;Landroid/os/Handler;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->-get0(Lcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;)I
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;-><init>(Lcom/android/server/voiceinteraction/VoiceInteractionManagerService;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->activeServiceSupportsAssist()Z
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->activeServiceSupportsLaunchFromKeyguard()Z
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->enforceCallingPermission(Ljava/lang/String;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->getActiveServiceComponentName()Landroid/content/ComponentName;
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->getCurAssistant(I)Landroid/content/ComponentName;
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->getCurInteractor(I)Landroid/content/ComponentName;
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->getCurRecognizer(I)Landroid/content/ComponentName;
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->getDspModuleProperties(Landroid/service/voice/IVoiceInteractionService;)Landroid/hardware/soundtrigger/SoundTrigger$ModuleProperties;
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->getForceVoiceInteractionServicePackage(Landroid/content/res/Resources;)Ljava/lang/String;
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->initForUser(I)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->isEnrolledForKeyphrase(Landroid/service/voice/IVoiceInteractionService;ILjava/lang/String;)Z
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->onLockscreenShown()V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->registerVoiceInteractionSessionListener(Lcom/android/internal/app/IVoiceInteractionSessionListener;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->shouldEnableService(Landroid/content/res/Resources;)Z
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->switchImplementationIfNeeded(Z)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->switchImplementationIfNeededLocked(Z)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->systemRunning(Z)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->unloadAllKeyphraseModels()V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService;->-get1(Lcom/android/server/voiceinteraction/VoiceInteractionManagerService;)Landroid/os/RemoteCallbackList;
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService;->onBootPhase(I)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService;->onStart()V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService;->onStartUser(I)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService;->onUnlockUser(I)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl$1;-><init>(Lcom/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl$2;-><init>(Lcom/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl$2;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl;-><init>(Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;ILandroid/content/ComponentName;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl;->startLocked()V
+PLcom/android/server/vr/EnabledComponentsObserver$1;-><init>(Lcom/android/server/vr/EnabledComponentsObserver;)V
+PLcom/android/server/vr/EnabledComponentsObserver$1;->onPackageModified(Ljava/lang/String;)V
+PLcom/android/server/vr/EnabledComponentsObserver$1;->onSomePackagesChanged()V
+PLcom/android/server/vr/EnabledComponentsObserver;-><init>(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;Ljava/util/Collection;)V
+PLcom/android/server/vr/EnabledComponentsObserver;->build(Landroid/content/Context;Landroid/os/Handler;Ljava/lang/String;Landroid/os/Looper;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;Ljava/util/Collection;)Lcom/android/server/vr/EnabledComponentsObserver;
+PLcom/android/server/vr/EnabledComponentsObserver;->getCurrentProfileIds()[I
+PLcom/android/server/vr/EnabledComponentsObserver;->getEnabled(I)Landroid/util/ArraySet;
+PLcom/android/server/vr/EnabledComponentsObserver;->isValid(Landroid/content/ComponentName;I)I
+PLcom/android/server/vr/EnabledComponentsObserver;->loadComponentNames(Landroid/content/pm/PackageManager;ILjava/lang/String;Ljava/lang/String;)Landroid/util/ArraySet;
+PLcom/android/server/vr/EnabledComponentsObserver;->loadComponentNamesForUser(I)Landroid/util/ArraySet;
+PLcom/android/server/vr/EnabledComponentsObserver;->loadComponentNamesFromSetting(Ljava/lang/String;I)Landroid/util/ArraySet;
+PLcom/android/server/vr/EnabledComponentsObserver;->onPackagesChanged()V
+PLcom/android/server/vr/EnabledComponentsObserver;->onUsersChanged()V
+PLcom/android/server/vr/EnabledComponentsObserver;->rebuildAll()V
+PLcom/android/server/vr/EnabledComponentsObserver;->sendSettingChanged()V
+PLcom/android/server/vr/SettingsObserver$1;-><init>(Lcom/android/server/vr/SettingsObserver;Ljava/lang/String;)V
+PLcom/android/server/vr/SettingsObserver$2;-><init>(Lcom/android/server/vr/SettingsObserver;Landroid/os/Handler;Landroid/net/Uri;)V
+PLcom/android/server/vr/SettingsObserver;-><init>(Landroid/content/Context;Landroid/os/Handler;Landroid/net/Uri;Ljava/lang/String;)V
+PLcom/android/server/vr/SettingsObserver;->addListener(Lcom/android/server/vr/SettingsObserver$SettingChangeListener;)V
+PLcom/android/server/vr/SettingsObserver;->build(Landroid/content/Context;Landroid/os/Handler;Ljava/lang/String;)Lcom/android/server/vr/SettingsObserver;
+PLcom/android/server/vr/Vr2dDisplay$1;-><init>(Lcom/android/server/vr/Vr2dDisplay;)V
+PLcom/android/server/vr/Vr2dDisplay;-><init>(Landroid/hardware/display/DisplayManager;Landroid/app/ActivityManagerInternal;Landroid/service/vr/IVrManager;)V
+PLcom/android/server/vr/Vr2dDisplay;->init(Landroid/content/Context;)V
+PLcom/android/server/vr/Vr2dDisplay;->startDebugOnlyBroadcastReceiver(Landroid/content/Context;)V
+PLcom/android/server/vr/Vr2dDisplay;->startVrModeListener()V
+PLcom/android/server/vr/VrManagerInternal;-><init>()V
+PLcom/android/server/vr/VrManagerService$1;-><init>(Lcom/android/server/vr/VrManagerService;)V
+PLcom/android/server/vr/VrManagerService$2;-><init>()V
+PLcom/android/server/vr/VrManagerService$3;-><init>(Lcom/android/server/vr/VrManagerService;)V
+PLcom/android/server/vr/VrManagerService$3;->getVrModeState()Z
+PLcom/android/server/vr/VrManagerService$3;->registerListener(Landroid/service/vr/IVrStateCallbacks;)V
+PLcom/android/server/vr/VrManagerService$3;->registerPersistentVrStateListener(Landroid/service/vr/IPersistentVrStateCallbacks;)V
+PLcom/android/server/vr/VrManagerService$LocalService;-><init>(Lcom/android/server/vr/VrManagerService;)V
+PLcom/android/server/vr/VrManagerService$LocalService;-><init>(Lcom/android/server/vr/VrManagerService;Lcom/android/server/vr/VrManagerService$LocalService;)V
+PLcom/android/server/vr/VrManagerService$LocalService;->addPersistentVrModeStateListener(Landroid/service/vr/IPersistentVrStateCallbacks;)V
+PLcom/android/server/vr/VrManagerService$LocalService;->isCurrentVrListener(Ljava/lang/String;I)Z
+PLcom/android/server/vr/VrManagerService$LocalService;->onScreenStateChanged(Z)V
+PLcom/android/server/vr/VrManagerService$LocalService;->onSleepStateChanged(Z)V
+PLcom/android/server/vr/VrManagerService$LocalService;->setVrMode(ZLandroid/content/ComponentName;ILandroid/content/ComponentName;)V
+PLcom/android/server/vr/VrManagerService$NotificationAccessManager;-><init>(Lcom/android/server/vr/VrManagerService;)V
+PLcom/android/server/vr/VrManagerService$NotificationAccessManager;-><init>(Lcom/android/server/vr/VrManagerService;Lcom/android/server/vr/VrManagerService$NotificationAccessManager;)V
+PLcom/android/server/vr/VrManagerService$NotificationAccessManager;->update(Ljava/util/Collection;)V
+PLcom/android/server/vr/VrManagerService$VrState;-><init>(ZLandroid/content/ComponentName;ILandroid/content/ComponentName;)V
+PLcom/android/server/vr/VrManagerService;->-wrap0(Lcom/android/server/vr/VrManagerService;)Z
+PLcom/android/server/vr/VrManagerService;->-wrap1(Lcom/android/server/vr/VrManagerService;Ljava/lang/String;I)Z
+PLcom/android/server/vr/VrManagerService;->-wrap10(Lcom/android/server/vr/VrManagerService;Ljava/lang/String;I)V
+PLcom/android/server/vr/VrManagerService;->-wrap11(Lcom/android/server/vr/VrManagerService;Ljava/lang/String;)V
+PLcom/android/server/vr/VrManagerService;->-wrap18(Lcom/android/server/vr/VrManagerService;Z)V
+PLcom/android/server/vr/VrManagerService;->-wrap19(Lcom/android/server/vr/VrManagerService;Z)V
+PLcom/android/server/vr/VrManagerService;->-wrap20(Lcom/android/server/vr/VrManagerService;ZLandroid/content/ComponentName;ILandroid/content/ComponentName;)V
+PLcom/android/server/vr/VrManagerService;->-wrap4(Lcom/android/server/vr/VrManagerService;Landroid/service/vr/IPersistentVrStateCallbacks;)V
+PLcom/android/server/vr/VrManagerService;->-wrap5(Lcom/android/server/vr/VrManagerService;Landroid/service/vr/IVrStateCallbacks;)V
+PLcom/android/server/vr/VrManagerService;->-wrap8(Lcom/android/server/vr/VrManagerService;Ljava/lang/String;)V
+PLcom/android/server/vr/VrManagerService;->-wrap9(Lcom/android/server/vr/VrManagerService;Ljava/lang/String;I)V
+PLcom/android/server/vr/VrManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/vr/VrManagerService;->addPersistentStateCallback(Landroid/service/vr/IPersistentVrStateCallbacks;)V
+PLcom/android/server/vr/VrManagerService;->addStateCallback(Landroid/service/vr/IVrStateCallbacks;)V
+PLcom/android/server/vr/VrManagerService;->consumeAndApplyPendingStateLocked()V
+PLcom/android/server/vr/VrManagerService;->consumeAndApplyPendingStateLocked(Z)V
+PLcom/android/server/vr/VrManagerService;->enforceCallerPermission(Ljava/lang/String;)V
+PLcom/android/server/vr/VrManagerService;->formatSettings(Ljava/util/Collection;)Ljava/lang/String;
+PLcom/android/server/vr/VrManagerService;->getNotificationListeners(Landroid/content/ContentResolver;I)Landroid/util/ArraySet;
+PLcom/android/server/vr/VrManagerService;->getVrMode()Z
+PLcom/android/server/vr/VrManagerService;->grantCoarseLocationPermissionIfNeeded(Ljava/lang/String;I)V
+PLcom/android/server/vr/VrManagerService;->grantNotificationListenerAccess(Ljava/lang/String;I)V
+PLcom/android/server/vr/VrManagerService;->grantNotificationPolicyAccess(Ljava/lang/String;)V
+PLcom/android/server/vr/VrManagerService;->isCurrentVrListener(Ljava/lang/String;I)Z
+PLcom/android/server/vr/VrManagerService;->isDefaultAllowed(Ljava/lang/String;)Z
+PLcom/android/server/vr/VrManagerService;->isPermissionUserUpdated(Ljava/lang/String;Ljava/lang/String;I)Z
+PLcom/android/server/vr/VrManagerService;->onBootPhase(I)V
+PLcom/android/server/vr/VrManagerService;->onEnabledComponentChanged()V
+PLcom/android/server/vr/VrManagerService;->onStart()V
+PLcom/android/server/vr/VrManagerService;->onStartUser(I)V
+PLcom/android/server/vr/VrManagerService;->setPersistentModeAndNotifyListenersLocked(Z)V
+PLcom/android/server/vr/VrManagerService;->setScreenOn(Z)V
+PLcom/android/server/vr/VrManagerService;->setSleepState(Z)V
+PLcom/android/server/vr/VrManagerService;->setVrMode(ZLandroid/content/ComponentName;ILandroid/content/ComponentName;)V
+PLcom/android/server/vr/VrManagerService;->setVrModeAllowedLocked(Z)V
+PLcom/android/server/vr/VrManagerService;->updateCurrentVrServiceLocked(ZLandroid/content/ComponentName;ILandroid/content/ComponentName;)Z
+PLcom/android/server/wallpaper/-$Lambda$ZWcNEw3ZwVVSi_pP2mGGLvztkS0;-><init>(BLjava/lang/Object;)V
+PLcom/android/server/wallpaper/WallpaperManagerService$1;-><init>(Lcom/android/server/wallpaper/WallpaperManagerService;)V
+PLcom/android/server/wallpaper/WallpaperManagerService$2;-><init>(Lcom/android/server/wallpaper/WallpaperManagerService;)V
+PLcom/android/server/wallpaper/WallpaperManagerService$3;-><init>(Lcom/android/server/wallpaper/WallpaperManagerService;)V
+PLcom/android/server/wallpaper/WallpaperManagerService$4;-><init>(Lcom/android/server/wallpaper/WallpaperManagerService;I)V
+PLcom/android/server/wallpaper/WallpaperManagerService$4;->run()V
+PLcom/android/server/wallpaper/WallpaperManagerService$Lifecycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/wallpaper/WallpaperManagerService$Lifecycle;->onBootPhase(I)V
+PLcom/android/server/wallpaper/WallpaperManagerService$Lifecycle;->onStart()V
+PLcom/android/server/wallpaper/WallpaperManagerService$Lifecycle;->onUnlockUser(I)V
+PLcom/android/server/wallpaper/WallpaperManagerService$MyPackageMonitor;-><init>(Lcom/android/server/wallpaper/WallpaperManagerService;)V
+PLcom/android/server/wallpaper/WallpaperManagerService$MyPackageMonitor;->doPackagesChangedLocked(ZLcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;)Z
+PLcom/android/server/wallpaper/WallpaperManagerService$MyPackageMonitor;->onPackageModified(Ljava/lang/String;)V
+PLcom/android/server/wallpaper/WallpaperManagerService$MyPackageMonitor;->onSomePackagesChanged()V
+PLcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection;-><init>(Lcom/android/server/wallpaper/WallpaperManagerService;Landroid/app/WallpaperInfo;Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;)V
+PLcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection;->attachEngine(Landroid/service/wallpaper/IWallpaperEngine;)V
+PLcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection;->engineShown(Landroid/service/wallpaper/IWallpaperEngine;)V
+PLcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection;->onWallpaperColorsChanged(Landroid/app/WallpaperColors;)V
+PLcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;-><init>(ILjava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;->cropExists()Z
+PLcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;->sourceExists()Z
+PLcom/android/server/wallpaper/WallpaperManagerService$WallpaperObserver;-><init>(Lcom/android/server/wallpaper/WallpaperManagerService;Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;)V
+PLcom/android/server/wallpaper/WallpaperManagerService$WallpaperObserver;->dataForEvent(ZZ)Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;
+PLcom/android/server/wallpaper/WallpaperManagerService$WallpaperObserver;->onEvent(ILjava/lang/String;)V
+PLcom/android/server/wallpaper/WallpaperManagerService;->-wrap0(I)Ljava/io/File;
+PLcom/android/server/wallpaper/WallpaperManagerService;->-wrap5(Lcom/android/server/wallpaper/WallpaperManagerService;I)V
+PLcom/android/server/wallpaper/WallpaperManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/wallpaper/WallpaperManagerService;->attachServiceLocked(Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection;Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;)V
+PLcom/android/server/wallpaper/WallpaperManagerService;->bindWallpaperComponentLocked(Landroid/content/ComponentName;ZZLcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;Landroid/os/IRemoteCallback;)Z
+PLcom/android/server/wallpaper/WallpaperManagerService;->checkPermission(Ljava/lang/String;)V
+PLcom/android/server/wallpaper/WallpaperManagerService;->ensureSaneWallpaperData(Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;)V
+PLcom/android/server/wallpaper/WallpaperManagerService;->extractColors(Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;)V
+PLcom/android/server/wallpaper/WallpaperManagerService;->getAttributeInt(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;I)I
+PLcom/android/server/wallpaper/WallpaperManagerService;->getHeightHint()I
+PLcom/android/server/wallpaper/WallpaperManagerService;->getMaximumSizeDimension()I
+PLcom/android/server/wallpaper/WallpaperManagerService;->getWallpaper(Landroid/app/IWallpaperManagerCallback;ILandroid/os/Bundle;I)Landroid/os/ParcelFileDescriptor;
+PLcom/android/server/wallpaper/WallpaperManagerService;->getWallpaperColors(I)Landroid/app/WallpaperColors;
+PLcom/android/server/wallpaper/WallpaperManagerService;->getWallpaperDir(I)Ljava/io/File;
+PLcom/android/server/wallpaper/WallpaperManagerService;->getWallpaperIdForUser(II)I
+PLcom/android/server/wallpaper/WallpaperManagerService;->getWallpaperInfo(I)Landroid/app/WallpaperInfo;
+PLcom/android/server/wallpaper/WallpaperManagerService;->getWallpaperSafeLocked(II)Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;
+PLcom/android/server/wallpaper/WallpaperManagerService;->getWidthHint()I
+PLcom/android/server/wallpaper/WallpaperManagerService;->isWallpaperSupported(Ljava/lang/String;)Z
+PLcom/android/server/wallpaper/WallpaperManagerService;->loadSettingsLocked(IZ)V
+PLcom/android/server/wallpaper/WallpaperManagerService;->makeJournaledFile(I)Lcom/android/internal/util/JournaledFile;
+PLcom/android/server/wallpaper/WallpaperManagerService;->onUnlockUser(I)V
+PLcom/android/server/wallpaper/WallpaperManagerService;->parseWallpaperAttributes(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;Z)V
+PLcom/android/server/wallpaper/WallpaperManagerService;->registerWallpaperColorsCallback(Landroid/app/IWallpaperManagerCallback;)V
+PLcom/android/server/wallpaper/WallpaperManagerService;->saveSettingsLocked(I)V
+PLcom/android/server/wallpaper/WallpaperManagerService;->setLockWallpaperCallback(Landroid/app/IWallpaperManagerCallback;)Z
+PLcom/android/server/wallpaper/WallpaperManagerService;->switchUser(ILandroid/os/IRemoteCallback;)V
+PLcom/android/server/wallpaper/WallpaperManagerService;->switchWallpaper(Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;Landroid/os/IRemoteCallback;)V
+PLcom/android/server/wallpaper/WallpaperManagerService;->systemReady()V
+PLcom/android/server/wallpaper/WallpaperManagerService;->writeWallpaperAttributes(Lorg/xmlpull/v1/XmlSerializer;Ljava/lang/String;Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;)V
+PLcom/android/server/webkit/SystemImpl$LazyHolder;->-get0()Lcom/android/server/webkit/SystemImpl;
+PLcom/android/server/webkit/SystemImpl;-><init>()V
+PLcom/android/server/webkit/SystemImpl;-><init>(Lcom/android/server/webkit/SystemImpl;)V
+PLcom/android/server/webkit/SystemImpl;->getFactoryPackageVersion(Ljava/lang/String;)I
+PLcom/android/server/webkit/SystemImpl;->getInstance()Lcom/android/server/webkit/SystemImpl;
+PLcom/android/server/webkit/SystemImpl;->getMultiProcessSetting(Landroid/content/Context;)I
+PLcom/android/server/webkit/SystemImpl;->getPackageInfoForProvider(Landroid/webkit/WebViewProviderInfo;)Landroid/content/pm/PackageInfo;
+PLcom/android/server/webkit/SystemImpl;->getPackageInfoForProviderAllUsers(Landroid/content/Context;Landroid/webkit/WebViewProviderInfo;)Ljava/util/List;
+PLcom/android/server/webkit/SystemImpl;->getUserChosenWebViewProvider(Landroid/content/Context;)Ljava/lang/String;
+PLcom/android/server/webkit/SystemImpl;->getWebViewPackages()[Landroid/webkit/WebViewProviderInfo;
+PLcom/android/server/webkit/SystemImpl;->isFallbackLogicEnabled()Z
+PLcom/android/server/webkit/SystemImpl;->isMultiProcessDefaultEnabled()Z
+PLcom/android/server/webkit/SystemImpl;->notifyZygote(Z)V
+PLcom/android/server/webkit/SystemImpl;->onWebViewProviderChanged(Landroid/content/pm/PackageInfo;)I
+PLcom/android/server/webkit/SystemImpl;->readSignatures(Landroid/content/res/XmlResourceParser;)[Ljava/lang/String;
+PLcom/android/server/webkit/SystemImpl;->systemIsDebuggable()Z
+PLcom/android/server/webkit/SystemImpl;->updateUserSetting(Landroid/content/Context;Ljava/lang/String;)V
+PLcom/android/server/webkit/WebViewUpdateService$1;-><init>(Lcom/android/server/webkit/WebViewUpdateService;)V
+PLcom/android/server/webkit/WebViewUpdateService$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/webkit/WebViewUpdateService$BinderService;-><init>(Lcom/android/server/webkit/WebViewUpdateService;)V
+PLcom/android/server/webkit/WebViewUpdateService$BinderService;-><init>(Lcom/android/server/webkit/WebViewUpdateService;Lcom/android/server/webkit/WebViewUpdateService$BinderService;)V
+PLcom/android/server/webkit/WebViewUpdateService$BinderService;->isMultiProcessEnabled()Z
+PLcom/android/server/webkit/WebViewUpdateService$BinderService;->notifyRelroCreationCompleted()V
+PLcom/android/server/webkit/WebViewUpdateService$BinderService;->waitForAndGetProvider()Landroid/webkit/WebViewProviderResponse;
+PLcom/android/server/webkit/WebViewUpdateService;->-get0(Lcom/android/server/webkit/WebViewUpdateService;)Lcom/android/server/webkit/WebViewUpdateServiceImpl;
+PLcom/android/server/webkit/WebViewUpdateService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/webkit/WebViewUpdateService;->onStart()V
+PLcom/android/server/webkit/WebViewUpdateService;->prepareWebViewInSystemServer()V
+PLcom/android/server/webkit/WebViewUpdateServiceImpl;-><init>(Landroid/content/Context;Lcom/android/server/webkit/SystemInterface;)V
+PLcom/android/server/webkit/WebViewUpdateServiceImpl;->existsValidNonFallbackProvider([Landroid/webkit/WebViewProviderInfo;)Z
+PLcom/android/server/webkit/WebViewUpdateServiceImpl;->getFallbackProvider([Landroid/webkit/WebViewProviderInfo;)Landroid/webkit/WebViewProviderInfo;
+PLcom/android/server/webkit/WebViewUpdateServiceImpl;->getWebViewPackages()[Landroid/webkit/WebViewProviderInfo;
+PLcom/android/server/webkit/WebViewUpdateServiceImpl;->handleNewUser(I)V
+PLcom/android/server/webkit/WebViewUpdateServiceImpl;->isDisabledForAllUsers(Ljava/util/List;)Z
+PLcom/android/server/webkit/WebViewUpdateServiceImpl;->isMultiProcessEnabled()Z
+PLcom/android/server/webkit/WebViewUpdateServiceImpl;->notifyRelroCreationCompleted()V
+PLcom/android/server/webkit/WebViewUpdateServiceImpl;->prepareWebViewInSystemServer()V
+PLcom/android/server/webkit/WebViewUpdateServiceImpl;->updateFallbackState([Landroid/webkit/WebViewProviderInfo;)V
+PLcom/android/server/webkit/WebViewUpdateServiceImpl;->updateFallbackStateOnBoot()V
+PLcom/android/server/webkit/WebViewUpdateServiceImpl;->waitForAndGetProvider()Landroid/webkit/WebViewProviderResponse;
+PLcom/android/server/webkit/WebViewUpdater$ProviderAndPackageInfo;-><init>(Landroid/webkit/WebViewProviderInfo;Landroid/content/pm/PackageInfo;)V
+PLcom/android/server/webkit/WebViewUpdater;-><init>(Landroid/content/Context;Lcom/android/server/webkit/SystemInterface;)V
+PLcom/android/server/webkit/WebViewUpdater;->checkIfRelrosDoneLocked()V
+PLcom/android/server/webkit/WebViewUpdater;->findPreferredWebViewPackage()Landroid/content/pm/PackageInfo;
+PLcom/android/server/webkit/WebViewUpdater;->getMinimumVersionCode()I
+PLcom/android/server/webkit/WebViewUpdater;->getValidWebViewPackagesAndInfos()[Lcom/android/server/webkit/WebViewUpdater$ProviderAndPackageInfo;
+PLcom/android/server/webkit/WebViewUpdater;->isInstalledAndEnabledForAllUsers(Ljava/util/List;)Z
+PLcom/android/server/webkit/WebViewUpdater;->isValidProvider(Landroid/webkit/WebViewProviderInfo;Landroid/content/pm/PackageInfo;)Z
+PLcom/android/server/webkit/WebViewUpdater;->notifyRelroCreationCompleted()V
+PLcom/android/server/webkit/WebViewUpdater;->onWebViewProviderChanged(Landroid/content/pm/PackageInfo;)V
+PLcom/android/server/webkit/WebViewUpdater;->prepareWebViewInSystemServer()V
+PLcom/android/server/webkit/WebViewUpdater;->providerHasValidSignature(Landroid/webkit/WebViewProviderInfo;Landroid/content/pm/PackageInfo;Lcom/android/server/webkit/SystemInterface;)Z
+PLcom/android/server/webkit/WebViewUpdater;->validityResult(Landroid/webkit/WebViewProviderInfo;Landroid/content/pm/PackageInfo;)I
+PLcom/android/server/webkit/WebViewUpdater;->versionCodeGE(II)Z
+PLcom/android/server/webkit/WebViewUpdater;->waitForAndGetProvider()Landroid/webkit/WebViewProviderResponse;
+PLcom/android/server/webkit/WebViewUpdater;->webViewIsReadyLocked()Z
+PLcom/android/server/wifi/-$Lambda$-8OLNNnyamdUDQS-yMRzScsmdRA$10;->$m$0(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/StaLinkLayerStats;)V
+PLcom/android/server/wifi/-$Lambda$-8OLNNnyamdUDQS-yMRzScsmdRA$10;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/wifi/-$Lambda$-8OLNNnyamdUDQS-yMRzScsmdRA$10;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/StaLinkLayerStats;)V
+PLcom/android/server/wifi/-$Lambda$-8OLNNnyamdUDQS-yMRzScsmdRA$11;->$m$0(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/-$Lambda$-8OLNNnyamdUDQS-yMRzScsmdRA$11;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/wifi/-$Lambda$-8OLNNnyamdUDQS-yMRzScsmdRA$11;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/-$Lambda$-8OLNNnyamdUDQS-yMRzScsmdRA$12;->$m$0(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/StaBackgroundScanCapabilities;)V
+PLcom/android/server/wifi/-$Lambda$-8OLNNnyamdUDQS-yMRzScsmdRA$12;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/wifi/-$Lambda$-8OLNNnyamdUDQS-yMRzScsmdRA$12;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/StaBackgroundScanCapabilities;)V
+PLcom/android/server/wifi/-$Lambda$-8OLNNnyamdUDQS-yMRzScsmdRA$13;->$m$0(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/-$Lambda$-8OLNNnyamdUDQS-yMRzScsmdRA$13;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/wifi/-$Lambda$-8OLNNnyamdUDQS-yMRzScsmdRA$13;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/-$Lambda$-8OLNNnyamdUDQS-yMRzScsmdRA$14;->$m$0(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/-$Lambda$-8OLNNnyamdUDQS-yMRzScsmdRA$14;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/wifi/-$Lambda$-8OLNNnyamdUDQS-yMRzScsmdRA$14;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/-$Lambda$-8OLNNnyamdUDQS-yMRzScsmdRA$15;->$m$0(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/StaRoamingCapabilities;)V
+PLcom/android/server/wifi/-$Lambda$-8OLNNnyamdUDQS-yMRzScsmdRA$15;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/wifi/-$Lambda$-8OLNNnyamdUDQS-yMRzScsmdRA$15;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/StaRoamingCapabilities;)V
+PLcom/android/server/wifi/-$Lambda$-8OLNNnyamdUDQS-yMRzScsmdRA$16;->$m$0()V
+PLcom/android/server/wifi/-$Lambda$-8OLNNnyamdUDQS-yMRzScsmdRA$16;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/wifi/-$Lambda$-8OLNNnyamdUDQS-yMRzScsmdRA$16;->run()V
+PLcom/android/server/wifi/-$Lambda$-8OLNNnyamdUDQS-yMRzScsmdRA$3;->$m$0(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/-$Lambda$-8OLNNnyamdUDQS-yMRzScsmdRA$3;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/wifi/-$Lambda$-8OLNNnyamdUDQS-yMRzScsmdRA$3;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/-$Lambda$-8OLNNnyamdUDQS-yMRzScsmdRA$8;->$m$0(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/StaApfPacketFilterCapabilities;)V
+PLcom/android/server/wifi/-$Lambda$-8OLNNnyamdUDQS-yMRzScsmdRA$8;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/wifi/-$Lambda$-8OLNNnyamdUDQS-yMRzScsmdRA$8;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/StaApfPacketFilterCapabilities;)V
+PLcom/android/server/wifi/-$Lambda$-8OLNNnyamdUDQS-yMRzScsmdRA$9;->$m$0(Landroid/hardware/wifi/V1_0/WifiStatus;I)V
+PLcom/android/server/wifi/-$Lambda$-8OLNNnyamdUDQS-yMRzScsmdRA$9;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/wifi/-$Lambda$-8OLNNnyamdUDQS-yMRzScsmdRA$9;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;I)V
+PLcom/android/server/wifi/-$Lambda$-8OLNNnyamdUDQS-yMRzScsmdRA;->$m$0(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/IWifiChip$ChipDebugInfo;)V
+PLcom/android/server/wifi/-$Lambda$-8OLNNnyamdUDQS-yMRzScsmdRA;-><init>(Ljava/lang/Object;)V
+PLcom/android/server/wifi/-$Lambda$-8OLNNnyamdUDQS-yMRzScsmdRA;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/IWifiChip$ChipDebugInfo;)V
+PLcom/android/server/wifi/-$Lambda$YuIVlKWZZmb4gGMvJqVJEVQ4abs;-><init>(Ljava/lang/Object;)V
+PLcom/android/server/wifi/-$Lambda$fnayIWgoPf1mYwUZ1jv9XAubNu8$1;->$m$0(Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/-$Lambda$fnayIWgoPf1mYwUZ1jv9XAubNu8$1;-><init>(Ljava/lang/Object;)V
+PLcom/android/server/wifi/-$Lambda$fnayIWgoPf1mYwUZ1jv9XAubNu8$1;->onValues(Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/-$Lambda$fnayIWgoPf1mYwUZ1jv9XAubNu8$2;->$m$0(Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;Landroid/hardware/wifi/supplicant/V1_0/ISupplicantNetwork;)V
+PLcom/android/server/wifi/-$Lambda$fnayIWgoPf1mYwUZ1jv9XAubNu8$2;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/wifi/-$Lambda$fnayIWgoPf1mYwUZ1jv9XAubNu8$2;->onValues(Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;Landroid/hardware/wifi/supplicant/V1_0/ISupplicantNetwork;)V
+PLcom/android/server/wifi/-$Lambda$fnayIWgoPf1mYwUZ1jv9XAubNu8$4;->$m$0(Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/-$Lambda$fnayIWgoPf1mYwUZ1jv9XAubNu8$4;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/wifi/-$Lambda$fnayIWgoPf1mYwUZ1jv9XAubNu8$4;->onValues(Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/-$Lambda$fnayIWgoPf1mYwUZ1jv9XAubNu8$5;->$m$0(Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;[B)V
+PLcom/android/server/wifi/-$Lambda$fnayIWgoPf1mYwUZ1jv9XAubNu8$5;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/wifi/-$Lambda$fnayIWgoPf1mYwUZ1jv9XAubNu8$5;->onValues(Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;[B)V
+PLcom/android/server/wifi/-$Lambda$fnayIWgoPf1mYwUZ1jv9XAubNu8;->$m$0(Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;Landroid/hardware/wifi/supplicant/V1_0/ISupplicantIface;)V
+PLcom/android/server/wifi/-$Lambda$fnayIWgoPf1mYwUZ1jv9XAubNu8;-><init>(Ljava/lang/Object;)V
+PLcom/android/server/wifi/-$Lambda$fnayIWgoPf1mYwUZ1jv9XAubNu8;->onValues(Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;Landroid/hardware/wifi/supplicant/V1_0/ISupplicantIface;)V
+PLcom/android/server/wifi/-$Lambda$lKwQPnSIRFCOpiR3PrChpeYqVrQ;-><init>(BLjava/lang/Object;)V
+PLcom/android/server/wifi/-$Lambda$zRsSIzbfvkJSErD1TWUPvfb3F7k$10;->$m$0(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/-$Lambda$zRsSIzbfvkJSErD1TWUPvfb3F7k$10;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/wifi/-$Lambda$zRsSIzbfvkJSErD1TWUPvfb3F7k$10;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/-$Lambda$zRsSIzbfvkJSErD1TWUPvfb3F7k$12;->$m$0(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/-$Lambda$zRsSIzbfvkJSErD1TWUPvfb3F7k$12;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/wifi/-$Lambda$zRsSIzbfvkJSErD1TWUPvfb3F7k$12;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/-$Lambda$zRsSIzbfvkJSErD1TWUPvfb3F7k$13;->$m$0(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/-$Lambda$zRsSIzbfvkJSErD1TWUPvfb3F7k$13;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/wifi/-$Lambda$zRsSIzbfvkJSErD1TWUPvfb3F7k$13;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/-$Lambda$zRsSIzbfvkJSErD1TWUPvfb3F7k$14;->$m$0(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/-$Lambda$zRsSIzbfvkJSErD1TWUPvfb3F7k$14;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/wifi/-$Lambda$zRsSIzbfvkJSErD1TWUPvfb3F7k$14;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/-$Lambda$zRsSIzbfvkJSErD1TWUPvfb3F7k$15;->$m$0(Landroid/hardware/wifi/V1_0/WifiStatus;I)V
+PLcom/android/server/wifi/-$Lambda$zRsSIzbfvkJSErD1TWUPvfb3F7k$15;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/wifi/-$Lambda$zRsSIzbfvkJSErD1TWUPvfb3F7k$15;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;I)V
+PLcom/android/server/wifi/-$Lambda$zRsSIzbfvkJSErD1TWUPvfb3F7k$19;->$m$0(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/IWifiStaIface;)V
+PLcom/android/server/wifi/-$Lambda$zRsSIzbfvkJSErD1TWUPvfb3F7k$19;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/wifi/-$Lambda$zRsSIzbfvkJSErD1TWUPvfb3F7k$19;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/IWifiStaIface;)V
+PLcom/android/server/wifi/-$Lambda$zRsSIzbfvkJSErD1TWUPvfb3F7k$1;->$m$0(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/lang/String;)V
+PLcom/android/server/wifi/-$Lambda$zRsSIzbfvkJSErD1TWUPvfb3F7k$1;-><init>(Ljava/lang/Object;)V
+PLcom/android/server/wifi/-$Lambda$zRsSIzbfvkJSErD1TWUPvfb3F7k$1;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/lang/String;)V
+PLcom/android/server/wifi/-$Lambda$zRsSIzbfvkJSErD1TWUPvfb3F7k$3;->$m$0(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/IWifiChip;)V
+PLcom/android/server/wifi/-$Lambda$zRsSIzbfvkJSErD1TWUPvfb3F7k$3;-><init>(BLjava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/wifi/-$Lambda$zRsSIzbfvkJSErD1TWUPvfb3F7k$3;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/IWifiChip;)V
+PLcom/android/server/wifi/-$Lambda$zRsSIzbfvkJSErD1TWUPvfb3F7k$4;->$m$0(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/-$Lambda$zRsSIzbfvkJSErD1TWUPvfb3F7k$4;-><init>(BLjava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/wifi/-$Lambda$zRsSIzbfvkJSErD1TWUPvfb3F7k$4;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/-$Lambda$zRsSIzbfvkJSErD1TWUPvfb3F7k$8;->$m$0(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/IWifiStaIface;)V
+PLcom/android/server/wifi/-$Lambda$zRsSIzbfvkJSErD1TWUPvfb3F7k$8;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/wifi/-$Lambda$zRsSIzbfvkJSErD1TWUPvfb3F7k$8;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/IWifiStaIface;)V
+PLcom/android/server/wifi/-$Lambda$zRsSIzbfvkJSErD1TWUPvfb3F7k$9;->$m$0(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/-$Lambda$zRsSIzbfvkJSErD1TWUPvfb3F7k$9;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/wifi/-$Lambda$zRsSIzbfvkJSErD1TWUPvfb3F7k$9;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/-$Lambda$zRsSIzbfvkJSErD1TWUPvfb3F7k;->$m$0(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/IWifiRttController;)V
+PLcom/android/server/wifi/-$Lambda$zRsSIzbfvkJSErD1TWUPvfb3F7k;-><init>(Ljava/lang/Object;)V
+PLcom/android/server/wifi/-$Lambda$zRsSIzbfvkJSErD1TWUPvfb3F7k;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/IWifiRttController;)V
+PLcom/android/server/wifi/BackupManagerProxy;-><init>()V
+PLcom/android/server/wifi/BaseWifiDiagnostics;-><init>(Lcom/android/server/wifi/WifiNative;)V
+PLcom/android/server/wifi/ByteBufferReader;->readInteger(Ljava/nio/ByteBuffer;Ljava/nio/ByteOrder;I)J
+PLcom/android/server/wifi/Clock;-><init>()V
+PLcom/android/server/wifi/Clock;->getElapsedSinceBootMillis()J
+PLcom/android/server/wifi/Clock;->getUptimeSinceBootMillis()J
+PLcom/android/server/wifi/Clock;->getWallClockMillis()J
+PLcom/android/server/wifi/ConfigurationMap$ScanResultMatchInfo;-><init>()V
+PLcom/android/server/wifi/ConfigurationMap$ScanResultMatchInfo;->equals(Ljava/lang/Object;)Z
+PLcom/android/server/wifi/ConfigurationMap$ScanResultMatchInfo;->fromScanResult(Landroid/net/wifi/ScanResult;)Lcom/android/server/wifi/ConfigurationMap$ScanResultMatchInfo;
+PLcom/android/server/wifi/ConfigurationMap$ScanResultMatchInfo;->fromWifiConfiguration(Landroid/net/wifi/WifiConfiguration;)Lcom/android/server/wifi/ConfigurationMap$ScanResultMatchInfo;
+PLcom/android/server/wifi/ConfigurationMap$ScanResultMatchInfo;->hashCode()I
+PLcom/android/server/wifi/ConfigurationMap;-><init>(Landroid/os/UserManager;)V
+PLcom/android/server/wifi/ConfigurationMap;->clear()V
+PLcom/android/server/wifi/ConfigurationMap;->getByScanResultForCurrentUser(Landroid/net/wifi/ScanResult;)Landroid/net/wifi/WifiConfiguration;
+PLcom/android/server/wifi/ConfigurationMap;->getForCurrentUser(I)Landroid/net/wifi/WifiConfiguration;
+PLcom/android/server/wifi/ConfigurationMap;->put(Landroid/net/wifi/WifiConfiguration;)Landroid/net/wifi/WifiConfiguration;
+PLcom/android/server/wifi/ConfigurationMap;->sizeForAllUsers()I
+PLcom/android/server/wifi/ConfigurationMap;->valuesForAllUsers()Ljava/util/Collection;
+PLcom/android/server/wifi/ConfigurationMap;->valuesForCurrentUser()Ljava/util/Collection;
+PLcom/android/server/wifi/DeletedEphemeralSsidsStoreData;-><init>()V
+PLcom/android/server/wifi/DeletedEphemeralSsidsStoreData;->deserializeData(Lorg/xmlpull/v1/XmlPullParser;IZ)V
+PLcom/android/server/wifi/DeletedEphemeralSsidsStoreData;->getName()Ljava/lang/String;
+PLcom/android/server/wifi/DeletedEphemeralSsidsStoreData;->getSsidList()Ljava/util/Set;
+PLcom/android/server/wifi/DeletedEphemeralSsidsStoreData;->resetData(Z)V
+PLcom/android/server/wifi/DeletedEphemeralSsidsStoreData;->serializeData(Lorg/xmlpull/v1/XmlSerializer;Z)V
+PLcom/android/server/wifi/DeletedEphemeralSsidsStoreData;->setSsidList(Ljava/util/Set;)V
+PLcom/android/server/wifi/DeletedEphemeralSsidsStoreData;->supportShareData()Z
+PLcom/android/server/wifi/DummyLogMessage;-><init>()V
+PLcom/android/server/wifi/DummyLogMessage;->c(J)Lcom/android/server/wifi/WifiLog$LogMessage;
+PLcom/android/server/wifi/DummyLogMessage;->c(Ljava/lang/String;)Lcom/android/server/wifi/WifiLog$LogMessage;
+PLcom/android/server/wifi/DummyLogMessage;->c(Z)Lcom/android/server/wifi/WifiLog$LogMessage;
+PLcom/android/server/wifi/DummyLogMessage;->flush()V
+PLcom/android/server/wifi/FakeWifiLog;-><init>()V
+PLcom/android/server/wifi/FakeWifiLog;->i(Ljava/lang/String;)V
+PLcom/android/server/wifi/FakeWifiLog;->info(Ljava/lang/String;)Lcom/android/server/wifi/WifiLog$LogMessage;
+PLcom/android/server/wifi/FrameworkFacade;-><init>()V
+PLcom/android/server/wifi/FrameworkFacade;->getBatteryService()Lcom/android/internal/app/IBatteryStats;
+PLcom/android/server/wifi/FrameworkFacade;->getBroadcast(Landroid/content/Context;ILandroid/content/Intent;I)Landroid/app/PendingIntent;
+PLcom/android/server/wifi/FrameworkFacade;->getIntegerSetting(Landroid/content/Context;Ljava/lang/String;I)I
+PLcom/android/server/wifi/FrameworkFacade;->getLongSetting(Landroid/content/Context;Ljava/lang/String;J)J
+PLcom/android/server/wifi/FrameworkFacade;->getRxPackets(Ljava/lang/String;)J
+PLcom/android/server/wifi/FrameworkFacade;->getService(Ljava/lang/String;)Landroid/os/IBinder;
+PLcom/android/server/wifi/FrameworkFacade;->getStringSetting(Landroid/content/Context;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/wifi/FrameworkFacade;->getTxPackets(Ljava/lang/String;)J
+PLcom/android/server/wifi/FrameworkFacade;->inStorageManagerCryptKeeperBounce()Z
+PLcom/android/server/wifi/FrameworkFacade;->makeIpManager(Landroid/content/Context;Ljava/lang/String;Landroid/net/ip/IpManager$Callback;)Landroid/net/ip/IpManager;
+PLcom/android/server/wifi/FrameworkFacade;->makeSupplicantStateTracker(Landroid/content/Context;Lcom/android/server/wifi/WifiConfigManager;Landroid/os/Handler;)Lcom/android/server/wifi/SupplicantStateTracker;
+PLcom/android/server/wifi/FrameworkFacade;->makeWifiAsyncChannel(Ljava/lang/String;)Lcom/android/server/wifi/util/WifiAsyncChannel;
+PLcom/android/server/wifi/FrameworkFacade;->registerContentObserver(Landroid/content/Context;Landroid/net/Uri;ZLandroid/database/ContentObserver;)V
+PLcom/android/server/wifi/HalDeviceManager$1;-><init>(Lcom/android/server/wifi/HalDeviceManager;)V
+PLcom/android/server/wifi/HalDeviceManager$1;->onRegistration(Ljava/lang/String;Ljava/lang/String;Z)V
+PLcom/android/server/wifi/HalDeviceManager$IfaceCreationData;-><init>(Lcom/android/server/wifi/HalDeviceManager;)V
+PLcom/android/server/wifi/HalDeviceManager$IfaceCreationData;-><init>(Lcom/android/server/wifi/HalDeviceManager;Lcom/android/server/wifi/HalDeviceManager$IfaceCreationData;)V
+PLcom/android/server/wifi/HalDeviceManager$InterfaceCacheEntry;-><init>(Lcom/android/server/wifi/HalDeviceManager;)V
+PLcom/android/server/wifi/HalDeviceManager$InterfaceCacheEntry;-><init>(Lcom/android/server/wifi/HalDeviceManager;Lcom/android/server/wifi/HalDeviceManager$InterfaceCacheEntry;)V
+PLcom/android/server/wifi/HalDeviceManager$ListenerProxy$1;-><init>(Lcom/android/server/wifi/HalDeviceManager$ListenerProxy;Landroid/os/Looper;Ljava/lang/String;)V
+PLcom/android/server/wifi/HalDeviceManager$ListenerProxy$1;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/wifi/HalDeviceManager$ListenerProxy;-><init>(Lcom/android/server/wifi/HalDeviceManager;Ljava/lang/Object;Landroid/os/Looper;Ljava/lang/String;)V
+PLcom/android/server/wifi/HalDeviceManager$ListenerProxy;->hashCode()I
+PLcom/android/server/wifi/HalDeviceManager$ListenerProxy;->trigger()V
+PLcom/android/server/wifi/HalDeviceManager$ManagerStatusListenerProxy;-><init>(Lcom/android/server/wifi/HalDeviceManager;Lcom/android/server/wifi/HalDeviceManager$ManagerStatusListener;Landroid/os/Looper;)V
+PLcom/android/server/wifi/HalDeviceManager$ManagerStatusListenerProxy;->action()V
+PLcom/android/server/wifi/HalDeviceManager$Mutable;-><init>()V
+PLcom/android/server/wifi/HalDeviceManager$WifiChipInfo;-><init>(Lcom/android/server/wifi/HalDeviceManager;)V
+PLcom/android/server/wifi/HalDeviceManager$WifiChipInfo;-><init>(Lcom/android/server/wifi/HalDeviceManager;Lcom/android/server/wifi/HalDeviceManager$WifiChipInfo;)V
+PLcom/android/server/wifi/HalDeviceManager$WifiEventCallback;-><init>(Lcom/android/server/wifi/HalDeviceManager;)V
+PLcom/android/server/wifi/HalDeviceManager$WifiEventCallback;-><init>(Lcom/android/server/wifi/HalDeviceManager;Lcom/android/server/wifi/HalDeviceManager$WifiEventCallback;)V
+PLcom/android/server/wifi/HalDeviceManager$WifiEventCallback;->onStart()V
+PLcom/android/server/wifi/HalDeviceManager$WifiEventCallback;->onStop()V
+PLcom/android/server/wifi/HalDeviceManager$WifiIfaceInfo;-><init>(Lcom/android/server/wifi/HalDeviceManager;)V
+PLcom/android/server/wifi/HalDeviceManager$WifiIfaceInfo;-><init>(Lcom/android/server/wifi/HalDeviceManager;Lcom/android/server/wifi/HalDeviceManager$WifiIfaceInfo;)V
+PLcom/android/server/wifi/HalDeviceManager;->-get0()[I
+PLcom/android/server/wifi/HalDeviceManager;->-set0(Lcom/android/server/wifi/HalDeviceManager;Landroid/hardware/wifi/V1_0/IWifi;)Landroid/hardware/wifi/V1_0/IWifi;
+PLcom/android/server/wifi/HalDeviceManager;->-wrap1(Lcom/android/server/wifi/HalDeviceManager;)V
+PLcom/android/server/wifi/HalDeviceManager;->-wrap2(Lcom/android/server/wifi/HalDeviceManager;)V
+PLcom/android/server/wifi/HalDeviceManager;-><init>()V
+PLcom/android/server/wifi/HalDeviceManager;->canIfaceComboSupportRequest(Lcom/android/server/wifi/HalDeviceManager$WifiChipInfo;Landroid/hardware/wifi/V1_0/IWifiChip$ChipMode;[II)Lcom/android/server/wifi/HalDeviceManager$IfaceCreationData;
+PLcom/android/server/wifi/HalDeviceManager;->compareIfaceCreationData(Lcom/android/server/wifi/HalDeviceManager$IfaceCreationData;Lcom/android/server/wifi/HalDeviceManager$IfaceCreationData;)Z
+PLcom/android/server/wifi/HalDeviceManager;->createIface(ILcom/android/server/wifi/HalDeviceManager$InterfaceDestroyedListener;Landroid/os/Looper;)Landroid/hardware/wifi/V1_0/IWifiIface;
+PLcom/android/server/wifi/HalDeviceManager;->createIfaceIfPossible([Lcom/android/server/wifi/HalDeviceManager$WifiChipInfo;ILcom/android/server/wifi/HalDeviceManager$InterfaceDestroyedListener;Landroid/os/Looper;)Landroid/hardware/wifi/V1_0/IWifiIface;
+PLcom/android/server/wifi/HalDeviceManager;->createRttController(Landroid/hardware/wifi/V1_0/IWifiIface;)Landroid/hardware/wifi/V1_0/IWifiRttController;
+PLcom/android/server/wifi/HalDeviceManager;->createStaIface(Lcom/android/server/wifi/HalDeviceManager$InterfaceDestroyedListener;Landroid/os/Looper;)Landroid/hardware/wifi/V1_0/IWifiStaIface;
+PLcom/android/server/wifi/HalDeviceManager;->dispatchAllDestroyedListeners()V
+PLcom/android/server/wifi/HalDeviceManager;->dispatchAvailableForRequestListeners()Z
+PLcom/android/server/wifi/HalDeviceManager;->dispatchAvailableForRequestListenersForType(I[Lcom/android/server/wifi/HalDeviceManager$WifiChipInfo;)V
+PLcom/android/server/wifi/HalDeviceManager;->executeChipReconfiguration(Lcom/android/server/wifi/HalDeviceManager$IfaceCreationData;I)Landroid/hardware/wifi/V1_0/IWifiIface;
+PLcom/android/server/wifi/HalDeviceManager;->expandIfaceCombos(Landroid/hardware/wifi/V1_0/IWifiChip$ChipIfaceCombination;)[[I
+PLcom/android/server/wifi/HalDeviceManager;->getAllChipInfo()[Lcom/android/server/wifi/HalDeviceManager$WifiChipInfo;
+PLcom/android/server/wifi/HalDeviceManager;->getChip(Landroid/hardware/wifi/V1_0/IWifiIface;)Landroid/hardware/wifi/V1_0/IWifiChip;
+PLcom/android/server/wifi/HalDeviceManager;->getName(Landroid/hardware/wifi/V1_0/IWifiIface;)Ljava/lang/String;
+PLcom/android/server/wifi/HalDeviceManager;->getServiceManagerMockable()Landroid/hidl/manager/V1_0/IServiceManager;
+PLcom/android/server/wifi/HalDeviceManager;->getSupportedIfaceTypes()Ljava/util/Set;
+PLcom/android/server/wifi/HalDeviceManager;->getSupportedIfaceTypesInternal(Landroid/hardware/wifi/V1_0/IWifiChip;)Ljava/util/Set;
+PLcom/android/server/wifi/HalDeviceManager;->getWifiServiceMockable()Landroid/hardware/wifi/V1_0/IWifi;
+PLcom/android/server/wifi/HalDeviceManager;->initIServiceManagerIfNecessary()V
+PLcom/android/server/wifi/HalDeviceManager;->initIWifiChipDebugListeners()V
+PLcom/android/server/wifi/HalDeviceManager;->initIWifiIfNecessary()V
+PLcom/android/server/wifi/HalDeviceManager;->initialize()V
+PLcom/android/server/wifi/HalDeviceManager;->initializeInternal()V
+PLcom/android/server/wifi/HalDeviceManager;->isReady()Z
+PLcom/android/server/wifi/HalDeviceManager;->isStarted()Z
+PLcom/android/server/wifi/HalDeviceManager;->isSupported()Z
+PLcom/android/server/wifi/HalDeviceManager;->isSupportedInternal()Z
+PLcom/android/server/wifi/HalDeviceManager;->isWifiStarted()Z
+PLcom/android/server/wifi/HalDeviceManager;->lambda$-com_android_server_wifi_HalDeviceManager_13565(Lcom/android/server/wifi/HalDeviceManager$Mutable;Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/lang/String;)V
+PLcom/android/server/wifi/HalDeviceManager;->lambda$-com_android_server_wifi_HalDeviceManager_16041(Lcom/android/server/wifi/HalDeviceManager$Mutable;Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/IWifiRttController;)V
+PLcom/android/server/wifi/HalDeviceManager;->lambda$-com_android_server_wifi_HalDeviceManager_32051(Landroid/util/MutableBoolean;Lcom/android/server/wifi/HalDeviceManager$Mutable;Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/HalDeviceManager;->lambda$-com_android_server_wifi_HalDeviceManager_33050(Landroid/util/MutableBoolean;Lcom/android/server/wifi/HalDeviceManager$Mutable;Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/IWifiChip;)V
+PLcom/android/server/wifi/HalDeviceManager;->lambda$-com_android_server_wifi_HalDeviceManager_33716(Landroid/util/MutableBoolean;Lcom/android/server/wifi/HalDeviceManager$Mutable;Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/HalDeviceManager;->lambda$-com_android_server_wifi_HalDeviceManager_34497(Landroid/util/MutableBoolean;Landroid/util/MutableBoolean;Landroid/util/MutableInt;Landroid/hardware/wifi/V1_0/WifiStatus;I)V
+PLcom/android/server/wifi/HalDeviceManager;->lambda$-com_android_server_wifi_HalDeviceManager_35435(Landroid/util/MutableBoolean;Lcom/android/server/wifi/HalDeviceManager$Mutable;Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/HalDeviceManager;->lambda$-com_android_server_wifi_HalDeviceManager_36264(Landroid/util/MutableBoolean;Ljava/lang/String;[Lcom/android/server/wifi/HalDeviceManager$WifiIfaceInfo;Landroid/util/MutableInt;Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/IWifiStaIface;)V
+PLcom/android/server/wifi/HalDeviceManager;->lambda$-com_android_server_wifi_HalDeviceManager_37240(Landroid/util/MutableBoolean;Lcom/android/server/wifi/HalDeviceManager$Mutable;Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/HalDeviceManager;->lambda$-com_android_server_wifi_HalDeviceManager_39040(Landroid/util/MutableBoolean;Lcom/android/server/wifi/HalDeviceManager$Mutable;Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/HalDeviceManager;->lambda$-com_android_server_wifi_HalDeviceManager_40846(Landroid/util/MutableBoolean;Lcom/android/server/wifi/HalDeviceManager$Mutable;Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/HalDeviceManager;->lambda$-com_android_server_wifi_HalDeviceManager_68740(Lcom/android/server/wifi/HalDeviceManager$Mutable;Lcom/android/server/wifi/HalDeviceManager$Mutable;Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/IWifiStaIface;)V
+PLcom/android/server/wifi/HalDeviceManager;->managerStatusListenerDispatch()V
+PLcom/android/server/wifi/HalDeviceManager;->registerStatusListener(Lcom/android/server/wifi/HalDeviceManager$ManagerStatusListener;Landroid/os/Looper;)V
+PLcom/android/server/wifi/HalDeviceManager;->start()Z
+PLcom/android/server/wifi/HalDeviceManager;->startWifi()Z
+PLcom/android/server/wifi/HalDeviceManager;->stopWifi()V
+PLcom/android/server/wifi/HalDeviceManager;->teardownInternal()V
+PLcom/android/server/wifi/HalDeviceManager;->validateInterfaceCache([Lcom/android/server/wifi/HalDeviceManager$WifiChipInfo;)Z
+PLcom/android/server/wifi/LastMileLogger;-><init>(Lcom/android/server/wifi/WifiInjector;)V
+PLcom/android/server/wifi/LastMileLogger;-><init>(Lcom/android/server/wifi/WifiInjector;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/wifi/LastMileLogger;->disableTracing()V
+PLcom/android/server/wifi/LastMileLogger;->enableTracing()V
+PLcom/android/server/wifi/LastMileLogger;->ensureFailSafeIsArmed()Z
+PLcom/android/server/wifi/LastMileLogger;->readTrace()[B
+PLcom/android/server/wifi/LastMileLogger;->reportConnectionEvent(JB)V
+PLcom/android/server/wifi/LogcatLog$RealLogMessage;->c(Ljava/lang/String;)Lcom/android/server/wifi/WifiLog$LogMessage;
+PLcom/android/server/wifi/LogcatLog$RealLogMessage;->c(Z)Lcom/android/server/wifi/WifiLog$LogMessage;
+PLcom/android/server/wifi/LogcatLog;->-get0()Z
+PLcom/android/server/wifi/LogcatLog;-><init>(Ljava/lang/String;)V
+PLcom/android/server/wifi/LogcatLog;->enableVerboseLogging(I)V
+PLcom/android/server/wifi/LogcatLog;->err(Ljava/lang/String;)Lcom/android/server/wifi/WifiLog$LogMessage;
+PLcom/android/server/wifi/LogcatLog;->i(Ljava/lang/String;)V
+PLcom/android/server/wifi/LogcatLog;->info(Ljava/lang/String;)Lcom/android/server/wifi/WifiLog$LogMessage;
+PLcom/android/server/wifi/LogcatLog;->tC(Ljava/lang/String;)V
+PLcom/android/server/wifi/LogcatLog;->wC(Ljava/lang/String;)V
+PLcom/android/server/wifi/NetworkListStoreData;-><init>()V
+PLcom/android/server/wifi/NetworkListStoreData;->deserializeData(Lorg/xmlpull/v1/XmlPullParser;IZ)V
+PLcom/android/server/wifi/NetworkListStoreData;->getName()Ljava/lang/String;
+PLcom/android/server/wifi/NetworkListStoreData;->getSharedConfigurations()Ljava/util/List;
+PLcom/android/server/wifi/NetworkListStoreData;->getUserConfigurations()Ljava/util/List;
+PLcom/android/server/wifi/NetworkListStoreData;->parseNetwork(Lorg/xmlpull/v1/XmlPullParser;I)Landroid/net/wifi/WifiConfiguration;
+PLcom/android/server/wifi/NetworkListStoreData;->parseNetworkList(Lorg/xmlpull/v1/XmlPullParser;I)Ljava/util/List;
+PLcom/android/server/wifi/NetworkListStoreData;->resetData(Z)V
+PLcom/android/server/wifi/NetworkListStoreData;->serializeData(Lorg/xmlpull/v1/XmlSerializer;Z)V
+PLcom/android/server/wifi/NetworkListStoreData;->serializeNetwork(Lorg/xmlpull/v1/XmlSerializer;Landroid/net/wifi/WifiConfiguration;)V
+PLcom/android/server/wifi/NetworkListStoreData;->serializeNetworkList(Lorg/xmlpull/v1/XmlSerializer;Ljava/util/List;)V
+PLcom/android/server/wifi/NetworkListStoreData;->setSharedConfigurations(Ljava/util/List;)V
+PLcom/android/server/wifi/NetworkListStoreData;->setUserConfigurations(Ljava/util/List;)V
+PLcom/android/server/wifi/NetworkListStoreData;->supportShareData()Z
+PLcom/android/server/wifi/RttService$RttServiceImpl$1;-><init>(Lcom/android/server/wifi/RttService$RttServiceImpl;)V
+PLcom/android/server/wifi/RttService$RttServiceImpl$2;-><init>(Lcom/android/server/wifi/RttService$RttServiceImpl;)V
+PLcom/android/server/wifi/RttService$RttServiceImpl$2;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/wifi/RttService$RttServiceImpl$ClientHandler;-><init>(Lcom/android/server/wifi/RttService$RttServiceImpl;Landroid/os/Looper;)V
+PLcom/android/server/wifi/RttService$RttServiceImpl$InterfaceEventHandler;-><init>(Lcom/android/server/wifi/RttService$RttServiceImpl$RttStateMachine;)V
+PLcom/android/server/wifi/RttService$RttServiceImpl$RttStateMachine$DefaultState;-><init>(Lcom/android/server/wifi/RttService$RttServiceImpl$RttStateMachine;)V
+PLcom/android/server/wifi/RttService$RttServiceImpl$RttStateMachine$DefaultState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/wifi/RttService$RttServiceImpl$RttStateMachine$EnabledState;-><init>(Lcom/android/server/wifi/RttService$RttServiceImpl$RttStateMachine;)V
+PLcom/android/server/wifi/RttService$RttServiceImpl$RttStateMachine$EnabledState;->enter()V
+PLcom/android/server/wifi/RttService$RttServiceImpl$RttStateMachine$EnabledState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/wifi/RttService$RttServiceImpl$RttStateMachine$InitiatorEnabledState;-><init>(Lcom/android/server/wifi/RttService$RttServiceImpl$RttStateMachine;)V
+PLcom/android/server/wifi/RttService$RttServiceImpl$RttStateMachine$ResponderEnabledState;-><init>(Lcom/android/server/wifi/RttService$RttServiceImpl$RttStateMachine;)V
+PLcom/android/server/wifi/RttService$RttServiceImpl$RttStateMachine;->-get1(Lcom/android/server/wifi/RttService$RttServiceImpl$RttStateMachine;)Lcom/android/server/wifi/RttService$RttServiceImpl$InterfaceEventHandler;
+PLcom/android/server/wifi/RttService$RttServiceImpl$RttStateMachine;->-get2(Lcom/android/server/wifi/RttService$RttServiceImpl$RttStateMachine;)Landroid/net/wifi/IWificond;
+PLcom/android/server/wifi/RttService$RttServiceImpl$RttStateMachine;->-set0(Lcom/android/server/wifi/RttService$RttServiceImpl$RttStateMachine;Landroid/net/wifi/IClientInterface;)Landroid/net/wifi/IClientInterface;
+PLcom/android/server/wifi/RttService$RttServiceImpl$RttStateMachine;->-set1(Lcom/android/server/wifi/RttService$RttServiceImpl$RttStateMachine;Lcom/android/server/wifi/RttService$RttServiceImpl$InterfaceEventHandler;)Lcom/android/server/wifi/RttService$RttServiceImpl$InterfaceEventHandler;
+PLcom/android/server/wifi/RttService$RttServiceImpl$RttStateMachine;->-set2(Lcom/android/server/wifi/RttService$RttServiceImpl$RttStateMachine;Landroid/net/wifi/IWificond;)Landroid/net/wifi/IWificond;
+PLcom/android/server/wifi/RttService$RttServiceImpl$RttStateMachine;-><init>(Lcom/android/server/wifi/RttService$RttServiceImpl;Landroid/os/Looper;)V
+PLcom/android/server/wifi/RttService$RttServiceImpl;->-get0(Lcom/android/server/wifi/RttService$RttServiceImpl;)Landroid/util/ArrayMap;
+PLcom/android/server/wifi/RttService$RttServiceImpl;->-get2(Lcom/android/server/wifi/RttService$RttServiceImpl;)Ljava/lang/Object;
+PLcom/android/server/wifi/RttService$RttServiceImpl;->-get4(Lcom/android/server/wifi/RttService$RttServiceImpl;)Lcom/android/server/wifi/RttService$RttServiceImpl$RttStateMachine;
+PLcom/android/server/wifi/RttService$RttServiceImpl;->-get5(Lcom/android/server/wifi/RttService$RttServiceImpl;)Lcom/android/server/wifi/WifiInjector;
+PLcom/android/server/wifi/RttService$RttServiceImpl;-><init>(Landroid/content/Context;Landroid/os/Looper;Lcom/android/server/wifi/WifiInjector;)V
+PLcom/android/server/wifi/RttService$RttServiceImpl;->startService()V
+PLcom/android/server/wifi/RttService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/wifi/RttService;->onBootPhase(I)V
+PLcom/android/server/wifi/RttService;->onStart()V
+PLcom/android/server/wifi/SIMAccessor;-><init>(Landroid/content/Context;)V
+PLcom/android/server/wifi/SavedNetworkEvaluator;-><init>(Landroid/content/Context;Lcom/android/server/wifi/WifiConfigManager;Lcom/android/server/wifi/Clock;Landroid/util/LocalLog;Lcom/android/server/wifi/WifiConnectivityHelper;)V
+PLcom/android/server/wifi/SavedNetworkEvaluator;->calculateBssidScore(Landroid/net/wifi/ScanResult;Landroid/net/wifi/WifiConfiguration;Landroid/net/wifi/WifiConfiguration;Ljava/lang/String;Ljava/lang/StringBuffer;)I
+PLcom/android/server/wifi/SavedNetworkEvaluator;->evaluateNetworks(Ljava/util/List;Landroid/net/wifi/WifiConfiguration;Ljava/lang/String;ZZLjava/util/List;)Landroid/net/wifi/WifiConfiguration;
+PLcom/android/server/wifi/SavedNetworkEvaluator;->getName()Ljava/lang/String;
+PLcom/android/server/wifi/SavedNetworkEvaluator;->localLog(Ljava/lang/String;)V
+PLcom/android/server/wifi/SavedNetworkEvaluator;->update(Ljava/util/List;)V
+PLcom/android/server/wifi/SavedNetworkEvaluator;->updateSavedNetworkSelectionStatus()V
+PLcom/android/server/wifi/ScanDetail;-><init>(Landroid/net/wifi/ScanResult;Lcom/android/server/wifi/hotspot2/NetworkDetail;)V
+PLcom/android/server/wifi/ScanDetail;->getBSSIDString()Ljava/lang/String;
+PLcom/android/server/wifi/ScanDetail;->getNetworkDetail()Lcom/android/server/wifi/hotspot2/NetworkDetail;
+PLcom/android/server/wifi/ScanDetail;->getSSID()Ljava/lang/String;
+PLcom/android/server/wifi/ScanDetail;->getSeen()J
+PLcom/android/server/wifi/ScanDetail;->setSeen()J
+PLcom/android/server/wifi/ScanDetailCache;-><init>(Landroid/net/wifi/WifiConfiguration;II)V
+PLcom/android/server/wifi/ScanDetailCache;->get(Ljava/lang/String;)Landroid/net/wifi/ScanResult;
+PLcom/android/server/wifi/ScanDetailCache;->getScanDetail(Ljava/lang/String;)Lcom/android/server/wifi/ScanDetail;
+PLcom/android/server/wifi/ScanDetailCache;->getVisibility(J)Landroid/net/wifi/WifiConfiguration$Visibility;
+PLcom/android/server/wifi/ScanDetailCache;->put(Lcom/android/server/wifi/ScanDetail;)V
+PLcom/android/server/wifi/ScanDetailCache;->size()I
+PLcom/android/server/wifi/ScanDetailCache;->values()Ljava/util/Collection;
+PLcom/android/server/wifi/ScoredNetworkEvaluator$1;-><init>(Lcom/android/server/wifi/ScoredNetworkEvaluator;Landroid/os/Handler;Lcom/android/server/wifi/FrameworkFacade;Landroid/content/Context;)V
+PLcom/android/server/wifi/ScoredNetworkEvaluator$1;->onChange(Z)V
+PLcom/android/server/wifi/ScoredNetworkEvaluator;->-set0(Lcom/android/server/wifi/ScoredNetworkEvaluator;Z)Z
+PLcom/android/server/wifi/ScoredNetworkEvaluator;-><init>(Landroid/content/Context;Landroid/os/Looper;Lcom/android/server/wifi/FrameworkFacade;Landroid/net/NetworkScoreManager;Lcom/android/server/wifi/WifiConfigManager;Landroid/util/LocalLog;Landroid/net/wifi/WifiNetworkScoreCache;)V
+PLcom/android/server/wifi/ScoredNetworkEvaluator;->update(Ljava/util/List;)V
+PLcom/android/server/wifi/ScoredNetworkEvaluator;->updateNetworkScoreCache(Ljava/util/List;)V
+PLcom/android/server/wifi/SelfRecovery;-><init>(Lcom/android/server/wifi/WifiController;)V
+PLcom/android/server/wifi/StateChangeResult;-><init>(ILandroid/net/wifi/WifiSsid;Ljava/lang/String;Landroid/net/wifi/SupplicantState;)V
+PLcom/android/server/wifi/StateChangeResult;->toString()Ljava/lang/String;
+PLcom/android/server/wifi/StateMachineDeathRecipient;-><init>(Lcom/android/internal/util/StateMachine;I)V
+PLcom/android/server/wifi/StateMachineDeathRecipient;->linkToDeath(Landroid/os/IBinder;)Z
+PLcom/android/server/wifi/StateMachineDeathRecipient;->unlinkToDeath()V
+PLcom/android/server/wifi/SupplicantStaIfaceHal$1;-><init>(Lcom/android/server/wifi/SupplicantStaIfaceHal;)V
+PLcom/android/server/wifi/SupplicantStaIfaceHal$1;->onRegistration(Ljava/lang/String;Ljava/lang/String;Z)V
+PLcom/android/server/wifi/SupplicantStaIfaceHal$Mutable;-><init>()V
+PLcom/android/server/wifi/SupplicantStaIfaceHal$SupplicantStaIfaceHalCallback;-><init>(Lcom/android/server/wifi/SupplicantStaIfaceHal;)V
+PLcom/android/server/wifi/SupplicantStaIfaceHal$SupplicantStaIfaceHalCallback;-><init>(Lcom/android/server/wifi/SupplicantStaIfaceHal;Lcom/android/server/wifi/SupplicantStaIfaceHal$SupplicantStaIfaceHalCallback;)V
+PLcom/android/server/wifi/SupplicantStaIfaceHal$SupplicantStaIfaceHalCallback;->onBssidChanged(B[B)V
+PLcom/android/server/wifi/SupplicantStaIfaceHal$SupplicantStaIfaceHalCallback;->onNetworkAdded(I)V
+PLcom/android/server/wifi/SupplicantStaIfaceHal$SupplicantStaIfaceHalCallback;->onStateChanged(I[BILjava/util/ArrayList;)V
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->-get0(Lcom/android/server/wifi/SupplicantStaIfaceHal;)Ljava/lang/String;
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->-get1(Lcom/android/server/wifi/SupplicantStaIfaceHal;)Ljava/lang/Object;
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->-get2(Lcom/android/server/wifi/SupplicantStaIfaceHal;)Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->-get3(Lcom/android/server/wifi/SupplicantStaIfaceHal;)Lcom/android/server/wifi/WifiMonitor;
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->-wrap0(I)Landroid/net/wifi/SupplicantState;
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->-wrap1(Lcom/android/server/wifi/SupplicantStaIfaceHal;)Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->-wrap2(Lcom/android/server/wifi/SupplicantStaIfaceHal;)Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->-wrap3(Lcom/android/server/wifi/SupplicantStaIfaceHal;)I
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->-wrap4(Lcom/android/server/wifi/SupplicantStaIfaceHal;Ljava/lang/String;)V
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->-wrap5(Lcom/android/server/wifi/SupplicantStaIfaceHal;)V
+PLcom/android/server/wifi/SupplicantStaIfaceHal;-><init>(Landroid/content/Context;Lcom/android/server/wifi/WifiMonitor;)V
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->addNetwork()Lcom/android/server/wifi/SupplicantStaNetworkHal;
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->addNetworkAndSaveConfig(Landroid/net/wifi/WifiConfiguration;)Landroid/util/Pair;
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->addRxFilter(B)Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->addRxFilter(I)Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->checkStatusAndLogFailure(Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;Ljava/lang/String;)Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->checkSupplicantAndLogFailure(Ljava/lang/String;)Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->checkSupplicantStaIfaceAndLogFailure(Ljava/lang/String;)Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->connectToNetwork(Landroid/net/wifi/WifiConfiguration;)Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->disconnect()Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->enableAutoReconnect(Z)Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->enableVerboseLogging(Z)V
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->getCurrentNetworkId()I
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->getMacAddress()Ljava/lang/String;
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->getServiceManagerMockable()Landroid/hidl/manager/V1_0/IServiceManager;
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->getStaIfaceMockable(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantIface;)Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->getStaNetworkMockable(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;)Lcom/android/server/wifi/SupplicantStaNetworkHal;
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->getSupplicantMockable()Landroid/hardware/wifi/supplicant/V1_0/ISupplicant;
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->initSupplicantService()Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->initSupplicantStaIface()Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->initialize()Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->isInitializationComplete()Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->isInitializationStarted()Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->lambda$-com_android_server_wifi_SupplicantStaIfaceHal_11270(Ljava/util/ArrayList;Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->lambda$-com_android_server_wifi_SupplicantStaIfaceHal_12381(Lcom/android/server/wifi/SupplicantStaIfaceHal$Mutable;Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;Landroid/hardware/wifi/supplicant/V1_0/ISupplicantIface;)V
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->lambda$-com_android_server_wifi_SupplicantStaIfaceHal_27007(Lcom/android/server/wifi/SupplicantStaIfaceHal$Mutable;Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;Landroid/hardware/wifi/supplicant/V1_0/ISupplicantNetwork;)V
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->lambda$-com_android_server_wifi_SupplicantStaIfaceHal_31299(Lcom/android/server/wifi/SupplicantStaIfaceHal$Mutable;Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->lambda$-com_android_server_wifi_SupplicantStaIfaceHal_47753(Lcom/android/server/wifi/SupplicantStaIfaceHal$Mutable;Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;[B)V
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->linkToServiceManagerDeath()Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->linkToSupplicantDeath()Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->linkToSupplicantStaIfaceDeath()Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->listNetworks()Ljava/util/ArrayList;
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->logCallback(Ljava/lang/String;)V
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->logd(Ljava/lang/String;)V
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->logi(Ljava/lang/String;)V
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->registerCallback(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;)Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->removeAllNetworks()Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->setBtCoexistenceMode(B)Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->setBtCoexistenceMode(I)Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->setBtCoexistenceScanModeEnabled(Z)Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->setConcurrencyPriority(I)Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->setConcurrencyPriority(Z)Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->setCountryCode(Ljava/lang/String;)Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->setCountryCode([B)Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->setCurrentNetworkBssid(Ljava/lang/String;)Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->setDebugParams(IZZ)Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->setExternalSim(Z)Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->setLogLevel(Z)Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->setPowerSave(Z)Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->setSuspendModeEnabled(Z)Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->setWpsConfigMethods(Ljava/lang/String;)Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->setWpsConfigMethods(S)Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->setWpsDeviceName(Ljava/lang/String;)Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->setWpsDeviceType(Ljava/lang/String;)Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->setWpsDeviceType([B)Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->setWpsManufacturer(Ljava/lang/String;)Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->setWpsModelName(Ljava/lang/String;)Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->setWpsModelNumber(Ljava/lang/String;)Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->setWpsSerialNumber(Ljava/lang/String;)Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->startRxFilter()Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->stopRxFilter()Z
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->stringToWpsConfigMethod(Ljava/lang/String;)S
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->supplicantHidlStateToFrameworkState(I)Landroid/net/wifi/SupplicantState;
+PLcom/android/server/wifi/SupplicantStaIfaceHal;->supplicantServiceDiedHandler()V
+PLcom/android/server/wifi/SupplicantStaNetworkHal$SupplicantStaNetworkHalCallback;-><init>(Lcom/android/server/wifi/SupplicantStaNetworkHal;ILjava/lang/String;)V
+PLcom/android/server/wifi/SupplicantStaNetworkHal;-><init>(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;Ljava/lang/String;Landroid/content/Context;Lcom/android/server/wifi/WifiMonitor;)V
+PLcom/android/server/wifi/SupplicantStaNetworkHal;->addFastTransitionFlags(Ljava/util/BitSet;)Ljava/util/BitSet;
+PLcom/android/server/wifi/SupplicantStaNetworkHal;->checkISupplicantStaNetworkAndLogFailure(Ljava/lang/String;)Z
+PLcom/android/server/wifi/SupplicantStaNetworkHal;->checkStatusAndLogFailure(Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;Ljava/lang/String;)Z
+PLcom/android/server/wifi/SupplicantStaNetworkHal;->createNetworkExtra(Ljava/util/Map;)Ljava/lang/String;
+PLcom/android/server/wifi/SupplicantStaNetworkHal;->enableVerboseLogging(Z)V
+PLcom/android/server/wifi/SupplicantStaNetworkHal;->registerCallback(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback;)Z
+PLcom/android/server/wifi/SupplicantStaNetworkHal;->saveWifiConfiguration(Landroid/net/wifi/WifiConfiguration;)Z
+PLcom/android/server/wifi/SupplicantStaNetworkHal;->select()Z
+PLcom/android/server/wifi/SupplicantStaNetworkHal;->setAuthAlg(I)Z
+PLcom/android/server/wifi/SupplicantStaNetworkHal;->setBssid(Ljava/lang/String;)Z
+PLcom/android/server/wifi/SupplicantStaNetworkHal;->setBssid([B)Z
+PLcom/android/server/wifi/SupplicantStaNetworkHal;->setGroupCipher(I)Z
+PLcom/android/server/wifi/SupplicantStaNetworkHal;->setIdStr(Ljava/lang/String;)Z
+PLcom/android/server/wifi/SupplicantStaNetworkHal;->setKeyMgmt(I)Z
+PLcom/android/server/wifi/SupplicantStaNetworkHal;->setPairwiseCipher(I)Z
+PLcom/android/server/wifi/SupplicantStaNetworkHal;->setProto(I)Z
+PLcom/android/server/wifi/SupplicantStaNetworkHal;->setRequirePmf(Z)Z
+PLcom/android/server/wifi/SupplicantStaNetworkHal;->setScanSsid(Z)Z
+PLcom/android/server/wifi/SupplicantStaNetworkHal;->setSsid(Ljava/util/ArrayList;)Z
+PLcom/android/server/wifi/SupplicantStaNetworkHal;->wifiConfigurationToSupplicantAuthAlgMask(Ljava/util/BitSet;)I
+PLcom/android/server/wifi/SupplicantStaNetworkHal;->wifiConfigurationToSupplicantGroupCipherMask(Ljava/util/BitSet;)I
+PLcom/android/server/wifi/SupplicantStaNetworkHal;->wifiConfigurationToSupplicantKeyMgmtMask(Ljava/util/BitSet;)I
+PLcom/android/server/wifi/SupplicantStaNetworkHal;->wifiConfigurationToSupplicantPairwiseCipherMask(Ljava/util/BitSet;)I
+PLcom/android/server/wifi/SupplicantStaNetworkHal;->wifiConfigurationToSupplicantProtoMask(Ljava/util/BitSet;)I
+PLcom/android/server/wifi/SupplicantStateTracker$CompletedState;-><init>(Lcom/android/server/wifi/SupplicantStateTracker;)V
+PLcom/android/server/wifi/SupplicantStateTracker$CompletedState;->enter()V
+PLcom/android/server/wifi/SupplicantStateTracker$ConnectionActiveState;-><init>(Lcom/android/server/wifi/SupplicantStateTracker;)V
+PLcom/android/server/wifi/SupplicantStateTracker$ConnectionActiveState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/wifi/SupplicantStateTracker$DefaultState;-><init>(Lcom/android/server/wifi/SupplicantStateTracker;)V
+PLcom/android/server/wifi/SupplicantStateTracker$DefaultState;->enter()V
+PLcom/android/server/wifi/SupplicantStateTracker$DefaultState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/wifi/SupplicantStateTracker$DisconnectedState;-><init>(Lcom/android/server/wifi/SupplicantStateTracker;)V
+PLcom/android/server/wifi/SupplicantStateTracker$DormantState;-><init>(Lcom/android/server/wifi/SupplicantStateTracker;)V
+PLcom/android/server/wifi/SupplicantStateTracker$HandshakeState;-><init>(Lcom/android/server/wifi/SupplicantStateTracker;)V
+PLcom/android/server/wifi/SupplicantStateTracker$HandshakeState;->enter()V
+PLcom/android/server/wifi/SupplicantStateTracker$HandshakeState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/wifi/SupplicantStateTracker$InactiveState;-><init>(Lcom/android/server/wifi/SupplicantStateTracker;)V
+PLcom/android/server/wifi/SupplicantStateTracker$ScanState;-><init>(Lcom/android/server/wifi/SupplicantStateTracker;)V
+PLcom/android/server/wifi/SupplicantStateTracker$UninitializedState;-><init>(Lcom/android/server/wifi/SupplicantStateTracker;)V
+PLcom/android/server/wifi/SupplicantStateTracker$UninitializedState;->enter()V
+PLcom/android/server/wifi/SupplicantStateTracker;->-get0()Z
+PLcom/android/server/wifi/SupplicantStateTracker;->-get1(Lcom/android/server/wifi/SupplicantStateTracker;)Z
+PLcom/android/server/wifi/SupplicantStateTracker;->-get2(Lcom/android/server/wifi/SupplicantStateTracker;)I
+PLcom/android/server/wifi/SupplicantStateTracker;->-get3(Lcom/android/server/wifi/SupplicantStateTracker;)Z
+PLcom/android/server/wifi/SupplicantStateTracker;->-get4(Lcom/android/server/wifi/SupplicantStateTracker;)Lcom/android/internal/util/State;
+PLcom/android/server/wifi/SupplicantStateTracker;->-getandroid-net-wifi-SupplicantStateSwitchesValues()[I
+PLcom/android/server/wifi/SupplicantStateTracker;->-set0(Lcom/android/server/wifi/SupplicantStateTracker;Z)Z
+PLcom/android/server/wifi/SupplicantStateTracker;->-set1(Lcom/android/server/wifi/SupplicantStateTracker;I)I
+PLcom/android/server/wifi/SupplicantStateTracker;->-wrap2(Lcom/android/server/wifi/SupplicantStateTracker;Landroid/net/wifi/SupplicantState;ZI)V
+PLcom/android/server/wifi/SupplicantStateTracker;->-wrap3(Lcom/android/server/wifi/SupplicantStateTracker;Lcom/android/server/wifi/StateChangeResult;)V
+PLcom/android/server/wifi/SupplicantStateTracker;-><init>(Landroid/content/Context;Lcom/android/server/wifi/WifiConfigManager;Lcom/android/server/wifi/FrameworkFacade;Landroid/os/Handler;)V
+PLcom/android/server/wifi/SupplicantStateTracker;->enableVerboseLogging(I)V
+PLcom/android/server/wifi/SupplicantStateTracker;->getSupplicantStateName()Ljava/lang/String;
+PLcom/android/server/wifi/SupplicantStateTracker;->sendSupplicantStateChangedBroadcast(Landroid/net/wifi/SupplicantState;ZI)V
+PLcom/android/server/wifi/SupplicantStateTracker;->transitionOnSupplicantStateChange(Lcom/android/server/wifi/StateChangeResult;)V
+PLcom/android/server/wifi/SystemBuildProperties;-><init>()V
+PLcom/android/server/wifi/SystemBuildProperties;->isUserBuild()Z
+PLcom/android/server/wifi/SystemPropertyService;-><init>()V
+PLcom/android/server/wifi/SystemPropertyService;->get(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/wifi/SystemPropertyService;->getBoolean(Ljava/lang/String;Z)Z
+PLcom/android/server/wifi/SystemPropertyService;->set(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/wifi/WifiApConfigStore;-><init>(Landroid/content/Context;Lcom/android/server/wifi/BackupManagerProxy;)V
+PLcom/android/server/wifi/WifiApConfigStore;-><init>(Landroid/content/Context;Lcom/android/server/wifi/BackupManagerProxy;Ljava/lang/String;)V
+PLcom/android/server/wifi/WifiApConfigStore;->loadApConfiguration(Ljava/lang/String;)Landroid/net/wifi/WifiConfiguration;
+PLcom/android/server/wifi/WifiBackupRestore;-><init>(Lcom/android/server/wifi/util/WifiPermissionsUtil;)V
+PLcom/android/server/wifi/WifiBackupRestore;->enableVerboseLogging(I)V
+PLcom/android/server/wifi/WifiCertManager;-><init>(Landroid/content/Context;)V
+PLcom/android/server/wifi/WifiCertManager;-><init>(Landroid/content/Context;Ljava/lang/String;)V
+PLcom/android/server/wifi/WifiCertManager;->readConfigFile()[B
+PLcom/android/server/wifi/WifiConfigManager$1;-><init>()V
+PLcom/android/server/wifi/WifiConfigManager;-><init>(Landroid/content/Context;Lcom/android/server/wifi/Clock;Landroid/os/UserManager;Landroid/telephony/TelephonyManager;Lcom/android/server/wifi/WifiKeyStore;Lcom/android/server/wifi/WifiConfigStore;Lcom/android/server/wifi/WifiConfigStoreLegacy;Lcom/android/server/wifi/util/WifiPermissionsUtil;Lcom/android/server/wifi/util/WifiPermissionsWrapper;Lcom/android/server/wifi/NetworkListStoreData;Lcom/android/server/wifi/DeletedEphemeralSsidsStoreData;)V
+PLcom/android/server/wifi/WifiConfigManager;->addToChannelSetForNetworkFromScanDetailCache(Ljava/util/Set;Lcom/android/server/wifi/ScanDetailCache;JJI)Z
+PLcom/android/server/wifi/WifiConfigManager;->attemptNetworkLinking(Landroid/net/wifi/WifiConfiguration;)V
+PLcom/android/server/wifi/WifiConfigManager;->clearInternalData()V
+PLcom/android/server/wifi/WifiConfigManager;->clearLastSelectedNetwork()V
+PLcom/android/server/wifi/WifiConfigManager;->clearNetworkCandidateScanResult(I)Z
+PLcom/android/server/wifi/WifiConfigManager;->createExternalWifiConfiguration(Landroid/net/wifi/WifiConfiguration;Z)Landroid/net/wifi/WifiConfiguration;
+PLcom/android/server/wifi/WifiConfigManager;->enableVerboseLogging(I)V
+PLcom/android/server/wifi/WifiConfigManager;->fetchChannelSetForNetworkForPartialScan(IJI)Ljava/util/Set;
+PLcom/android/server/wifi/WifiConfigManager;->getConfiguredNetwork(I)Landroid/net/wifi/WifiConfiguration;
+PLcom/android/server/wifi/WifiConfigManager;->getConfiguredNetworkForScanDetail(Lcom/android/server/wifi/ScanDetail;)Landroid/net/wifi/WifiConfiguration;
+PLcom/android/server/wifi/WifiConfigManager;->getConfiguredNetworkForScanDetailAndCache(Lcom/android/server/wifi/ScanDetail;)Landroid/net/wifi/WifiConfiguration;
+PLcom/android/server/wifi/WifiConfigManager;->getConfiguredNetworkWithPassword(I)Landroid/net/wifi/WifiConfiguration;
+PLcom/android/server/wifi/WifiConfigManager;->getConfiguredNetworks()Ljava/util/List;
+PLcom/android/server/wifi/WifiConfigManager;->getConfiguredNetworks(ZZ)Ljava/util/List;
+PLcom/android/server/wifi/WifiConfigManager;->getInternalConfiguredNetwork(I)Landroid/net/wifi/WifiConfiguration;
+PLcom/android/server/wifi/WifiConfigManager;->getInternalConfiguredNetworks()Ljava/util/Collection;
+PLcom/android/server/wifi/WifiConfigManager;->getLastSelectedNetwork()I
+PLcom/android/server/wifi/WifiConfigManager;->getLastSelectedNetworkConfigKey()Ljava/lang/String;
+PLcom/android/server/wifi/WifiConfigManager;->getOrCreateScanDetailCacheForNetwork(Landroid/net/wifi/WifiConfiguration;)Lcom/android/server/wifi/ScanDetailCache;
+PLcom/android/server/wifi/WifiConfigManager;->getSavedNetworks()Ljava/util/List;
+PLcom/android/server/wifi/WifiConfigManager;->getScanDetailCacheForNetwork(I)Lcom/android/server/wifi/ScanDetailCache;
+PLcom/android/server/wifi/WifiConfigManager;->handleUserUnlock(I)V
+PLcom/android/server/wifi/WifiConfigManager;->handleUserUnlockOrSwitch(I)V
+PLcom/android/server/wifi/WifiConfigManager;->loadFromStore()Z
+PLcom/android/server/wifi/WifiConfigManager;->loadFromUserStoreAfterUnlockOrSwitch(I)Z
+PLcom/android/server/wifi/WifiConfigManager;->loadInternalData(Ljava/util/List;Ljava/util/List;Ljava/util/Set;)V
+PLcom/android/server/wifi/WifiConfigManager;->loadInternalDataFromSharedStore(Ljava/util/List;)V
+PLcom/android/server/wifi/WifiConfigManager;->loadInternalDataFromUserStore(Ljava/util/List;Ljava/util/Set;)V
+PLcom/android/server/wifi/WifiConfigManager;->maskPasswordsInWifiConfiguration(Landroid/net/wifi/WifiConfiguration;)V
+PLcom/android/server/wifi/WifiConfigManager;->migrateFromLegacyStore()Z
+PLcom/android/server/wifi/WifiConfigManager;->needsUnlockedKeyStore()Z
+PLcom/android/server/wifi/WifiConfigManager;->resetSimNetworks(Z)V
+PLcom/android/server/wifi/WifiConfigManager;->retrieveHiddenNetworkList()Ljava/util/List;
+PLcom/android/server/wifi/WifiConfigManager;->saveToScanDetailCacheForNetwork(Landroid/net/wifi/WifiConfiguration;Lcom/android/server/wifi/ScanDetail;)V
+PLcom/android/server/wifi/WifiConfigManager;->saveToStore(Z)Z
+PLcom/android/server/wifi/WifiConfigManager;->sendConfiguredNetworkChangedBroadcast(Landroid/net/wifi/WifiConfiguration;I)V
+PLcom/android/server/wifi/WifiConfigManager;->sendConfiguredNetworksChangedBroadcast()V
+PLcom/android/server/wifi/WifiConfigManager;->setNetworkCandidateScanResult(ILandroid/net/wifi/ScanResult;I)Z
+PLcom/android/server/wifi/WifiConfigManager;->setNetworkStatus(Landroid/net/wifi/WifiConfiguration;I)V
+PLcom/android/server/wifi/WifiConfigManager;->setNetworkValidatedInternetAccess(IZ)Z
+PLcom/android/server/wifi/WifiConfigManager;->setOnSavedNetworkUpdateListener(Lcom/android/server/wifi/WifiConfigManager$OnSavedNetworkUpdateListener;)V
+PLcom/android/server/wifi/WifiConfigManager;->tryEnableNetwork(I)Z
+PLcom/android/server/wifi/WifiConfigManager;->tryEnableNetwork(Landroid/net/wifi/WifiConfiguration;)Z
+PLcom/android/server/wifi/WifiConfigManager;->updateNetworkAfterConnect(I)Z
+PLcom/android/server/wifi/WifiConfigManager;->updateScanDetailCacheFromWifiInfo(Landroid/net/wifi/WifiInfo;)V
+PLcom/android/server/wifi/WifiConfigStore$1;-><init>(Lcom/android/server/wifi/WifiConfigStore;)V
+PLcom/android/server/wifi/WifiConfigStore$1;->onAlarm()V
+PLcom/android/server/wifi/WifiConfigStore$StoreFile;-><init>(Ljava/io/File;)V
+PLcom/android/server/wifi/WifiConfigStore$StoreFile;->exists()Z
+PLcom/android/server/wifi/WifiConfigStore$StoreFile;->readRawData()[B
+PLcom/android/server/wifi/WifiConfigStore$StoreFile;->storeRawDataToWrite([B)V
+PLcom/android/server/wifi/WifiConfigStore$StoreFile;->writeBufferedRawData()V
+PLcom/android/server/wifi/WifiConfigStore;->-wrap0(Lcom/android/server/wifi/WifiConfigStore;)V
+PLcom/android/server/wifi/WifiConfigStore;-><init>(Landroid/content/Context;Landroid/os/Looper;Lcom/android/server/wifi/Clock;Lcom/android/server/wifi/WifiConfigStore$StoreFile;)V
+PLcom/android/server/wifi/WifiConfigStore;->areStoresPresent()Z
+PLcom/android/server/wifi/WifiConfigStore;->createFile(Ljava/io/File;)Lcom/android/server/wifi/WifiConfigStore$StoreFile;
+PLcom/android/server/wifi/WifiConfigStore;->createSharedFile()Lcom/android/server/wifi/WifiConfigStore$StoreFile;
+PLcom/android/server/wifi/WifiConfigStore;->createUserFile(I)Lcom/android/server/wifi/WifiConfigStore$StoreFile;
+PLcom/android/server/wifi/WifiConfigStore;->deserializeData([BZ)V
+PLcom/android/server/wifi/WifiConfigStore;->enableVerboseLogging(Z)V
+PLcom/android/server/wifi/WifiConfigStore;->parseDocumentStartAndVersionFromXml(Lorg/xmlpull/v1/XmlPullParser;)I
+PLcom/android/server/wifi/WifiConfigStore;->read()V
+PLcom/android/server/wifi/WifiConfigStore;->registerStoreData(Lcom/android/server/wifi/WifiConfigStore$StoreData;)Z
+PLcom/android/server/wifi/WifiConfigStore;->resetStoreData(Z)V
+PLcom/android/server/wifi/WifiConfigStore;->serializeData(Z)[B
+PLcom/android/server/wifi/WifiConfigStore;->startBufferedWriteAlarm()V
+PLcom/android/server/wifi/WifiConfigStore;->stopBufferedWriteAlarm()V
+PLcom/android/server/wifi/WifiConfigStore;->switchUserStoreAndRead(Lcom/android/server/wifi/WifiConfigStore$StoreFile;)V
+PLcom/android/server/wifi/WifiConfigStore;->write(Z)V
+PLcom/android/server/wifi/WifiConfigStore;->writeBufferedData()V
+PLcom/android/server/wifi/WifiConfigStoreLegacy;-><init>(Lcom/android/server/wifi/WifiNetworkHistory;Lcom/android/server/wifi/WifiNative;Lcom/android/server/net/IpConfigStore;Lcom/android/server/wifi/hotspot2/LegacyPasspointConfigParser;)V
+PLcom/android/server/wifi/WifiConfigStoreLegacy;->areStoresPresent()Z
+PLcom/android/server/wifi/WifiConfigurationUtil$WifiConfigurationComparator;-><init>()V
+PLcom/android/server/wifi/WifiConfigurationUtil;->hasAnyValidWepKey([Ljava/lang/String;)Z
+PLcom/android/server/wifi/WifiConfigurationUtil;->isConfigForEapNetwork(Landroid/net/wifi/WifiConfiguration;)Z
+PLcom/android/server/wifi/WifiConfigurationUtil;->isConfigForOpenNetwork(Landroid/net/wifi/WifiConfiguration;)Z
+PLcom/android/server/wifi/WifiConfigurationUtil;->isConfigForPskNetwork(Landroid/net/wifi/WifiConfiguration;)Z
+PLcom/android/server/wifi/WifiConfigurationUtil;->isConfigForWepNetwork(Landroid/net/wifi/WifiConfiguration;)Z
+PLcom/android/server/wifi/WifiConfigurationUtil;->isSameNetwork(Landroid/net/wifi/WifiConfiguration;Landroid/net/wifi/WifiConfiguration;)Z
+PLcom/android/server/wifi/WifiConfigurationUtil;->isVisibleToAnyProfile(Landroid/net/wifi/WifiConfiguration;Ljava/util/List;)Z
+PLcom/android/server/wifi/WifiConnectivityHelper;-><init>(Lcom/android/server/wifi/WifiNative;)V
+PLcom/android/server/wifi/WifiConnectivityHelper;->getFirmwareRoamingInfo()Z
+PLcom/android/server/wifi/WifiConnectivityHelper;->getMaxNumBlacklistBssid()I
+PLcom/android/server/wifi/WifiConnectivityHelper;->isFirmwareRoamingSupported()Z
+PLcom/android/server/wifi/WifiConnectivityHelper;->setFirmwareRoamingConfiguration(Ljava/util/ArrayList;Ljava/util/ArrayList;)Z
+PLcom/android/server/wifi/WifiConnectivityManager$1;-><init>(Lcom/android/server/wifi/WifiConnectivityManager;)V
+PLcom/android/server/wifi/WifiConnectivityManager$2;-><init>(Lcom/android/server/wifi/WifiConnectivityManager;)V
+PLcom/android/server/wifi/WifiConnectivityManager$3;-><init>(Lcom/android/server/wifi/WifiConnectivityManager;)V
+PLcom/android/server/wifi/WifiConnectivityManager$3;->onAlarm()V
+PLcom/android/server/wifi/WifiConnectivityManager$AllSingleScanListener;-><init>(Lcom/android/server/wifi/WifiConnectivityManager;)V
+PLcom/android/server/wifi/WifiConnectivityManager$AllSingleScanListener;-><init>(Lcom/android/server/wifi/WifiConnectivityManager;Lcom/android/server/wifi/WifiConnectivityManager$AllSingleScanListener;)V
+PLcom/android/server/wifi/WifiConnectivityManager$AllSingleScanListener;->clearScanDetails()V
+PLcom/android/server/wifi/WifiConnectivityManager$AllSingleScanListener;->onFullResult(Landroid/net/wifi/ScanResult;)V
+PLcom/android/server/wifi/WifiConnectivityManager$AllSingleScanListener;->onResults([Landroid/net/wifi/WifiScanner$ScanData;)V
+PLcom/android/server/wifi/WifiConnectivityManager$AllSingleScanListener;->onSuccess()V
+PLcom/android/server/wifi/WifiConnectivityManager$OnSavedNetworkUpdateListener;-><init>(Lcom/android/server/wifi/WifiConnectivityManager;)V
+PLcom/android/server/wifi/WifiConnectivityManager$OnSavedNetworkUpdateListener;-><init>(Lcom/android/server/wifi/WifiConnectivityManager;Lcom/android/server/wifi/WifiConnectivityManager$OnSavedNetworkUpdateListener;)V
+PLcom/android/server/wifi/WifiConnectivityManager$PnoScanListener;-><init>(Lcom/android/server/wifi/WifiConnectivityManager;)V
+PLcom/android/server/wifi/WifiConnectivityManager$PnoScanListener;-><init>(Lcom/android/server/wifi/WifiConnectivityManager;Lcom/android/server/wifi/WifiConnectivityManager$PnoScanListener;)V
+PLcom/android/server/wifi/WifiConnectivityManager$PnoScanListener;->resetLowRssiNetworkRetryDelay()V
+PLcom/android/server/wifi/WifiConnectivityManager$SingleScanListener;-><init>(Lcom/android/server/wifi/WifiConnectivityManager;Z)V
+PLcom/android/server/wifi/WifiConnectivityManager$SingleScanListener;->onFullResult(Landroid/net/wifi/ScanResult;)V
+PLcom/android/server/wifi/WifiConnectivityManager$SingleScanListener;->onResults([Landroid/net/wifi/WifiScanner$ScanData;)V
+PLcom/android/server/wifi/WifiConnectivityManager$SingleScanListener;->onSuccess()V
+PLcom/android/server/wifi/WifiConnectivityManager;->-get1(Lcom/android/server/wifi/WifiConnectivityManager;)Z
+PLcom/android/server/wifi/WifiConnectivityManager;->-get2(Lcom/android/server/wifi/WifiConnectivityManager;)Z
+PLcom/android/server/wifi/WifiConnectivityManager;->-get6(Lcom/android/server/wifi/WifiConnectivityManager;)Z
+PLcom/android/server/wifi/WifiConnectivityManager;->-get7(Lcom/android/server/wifi/WifiConnectivityManager;)Z
+PLcom/android/server/wifi/WifiConnectivityManager;->-get8(Lcom/android/server/wifi/WifiConnectivityManager;)Z
+PLcom/android/server/wifi/WifiConnectivityManager;->-wrap0(Lcom/android/server/wifi/WifiConnectivityManager;Ljava/util/List;Ljava/lang/String;)Z
+PLcom/android/server/wifi/WifiConnectivityManager;->-wrap2(Lcom/android/server/wifi/WifiConnectivityManager;)V
+PLcom/android/server/wifi/WifiConnectivityManager;-><init>(Landroid/content/Context;Lcom/android/server/wifi/WifiStateMachine;Landroid/net/wifi/WifiScanner;Lcom/android/server/wifi/WifiConfigManager;Landroid/net/wifi/WifiInfo;Lcom/android/server/wifi/WifiNetworkSelector;Lcom/android/server/wifi/WifiConnectivityHelper;Lcom/android/server/wifi/WifiLastResortWatchdog;Lcom/android/server/wifi/WifiMetrics;Landroid/os/Looper;Lcom/android/server/wifi/Clock;Landroid/util/LocalLog;ZLcom/android/server/wifi/FrameworkFacade;Lcom/android/server/wifi/SavedNetworkEvaluator;Lcom/android/server/wifi/ScoredNetworkEvaluator;Lcom/android/server/wifi/hotspot2/PasspointNetworkEvaluator;)V
+PLcom/android/server/wifi/WifiConnectivityManager;->buildBssidBlacklist()Ljava/util/HashSet;
+PLcom/android/server/wifi/WifiConnectivityManager;->cancelPeriodicScanTimer()V
+PLcom/android/server/wifi/WifiConnectivityManager;->clearBssidBlacklist()V
+PLcom/android/server/wifi/WifiConnectivityManager;->connectToNetwork(Landroid/net/wifi/WifiConfiguration;)V
+PLcom/android/server/wifi/WifiConnectivityManager;->enable(Z)V
+PLcom/android/server/wifi/WifiConnectivityManager;->getScanBand(Z)I
+PLcom/android/server/wifi/WifiConnectivityManager;->handleConnectionStateChanged(I)V
+PLcom/android/server/wifi/WifiConnectivityManager;->handleScanResults(Ljava/util/List;Ljava/lang/String;)Z
+PLcom/android/server/wifi/WifiConnectivityManager;->handleScreenStateChanged(Z)V
+PLcom/android/server/wifi/WifiConnectivityManager;->localLog(Ljava/lang/String;)V
+PLcom/android/server/wifi/WifiConnectivityManager;->noteConnectionAttempt(Ljava/lang/Long;)V
+PLcom/android/server/wifi/WifiConnectivityManager;->periodicScanTimerHandler()V
+PLcom/android/server/wifi/WifiConnectivityManager;->refreshBssidBlacklist()V
+PLcom/android/server/wifi/WifiConnectivityManager;->resetLastPeriodicSingleScanTimeStamp()V
+PLcom/android/server/wifi/WifiConnectivityManager;->schedulePeriodicScanTimer(I)V
+PLcom/android/server/wifi/WifiConnectivityManager;->scheduleWatchdogTimer()V
+PLcom/android/server/wifi/WifiConnectivityManager;->setScanChannels(Landroid/net/wifi/WifiScanner$ScanSettings;)Z
+PLcom/android/server/wifi/WifiConnectivityManager;->setUntrustedConnectionAllowed(Z)V
+PLcom/android/server/wifi/WifiConnectivityManager;->setWifiEnabled(Z)V
+PLcom/android/server/wifi/WifiConnectivityManager;->start()V
+PLcom/android/server/wifi/WifiConnectivityManager;->startConnectivityScan(Z)V
+PLcom/android/server/wifi/WifiConnectivityManager;->startPeriodicScan(Z)V
+PLcom/android/server/wifi/WifiConnectivityManager;->startPeriodicSingleScan()V
+PLcom/android/server/wifi/WifiConnectivityManager;->startSingleScan(Z)V
+PLcom/android/server/wifi/WifiConnectivityManager;->stateToString(I)Ljava/lang/String;
+PLcom/android/server/wifi/WifiConnectivityManager;->stop()V
+PLcom/android/server/wifi/WifiConnectivityManager;->stopConnectivityScan()V
+PLcom/android/server/wifi/WifiConnectivityManager;->stopPnoScan()V
+PLcom/android/server/wifi/WifiConnectivityManager;->trackBssid(Ljava/lang/String;ZI)Z
+PLcom/android/server/wifi/WifiConnectivityManager;->updateBssidBlacklist(Ljava/lang/String;ZI)Z
+PLcom/android/server/wifi/WifiConnectivityManager;->updateFirmwareRoamingConfiguration()V
+PLcom/android/server/wifi/WifiConnectivityManager;->updateRunningState()V
+PLcom/android/server/wifi/WifiController$1;-><init>(Lcom/android/server/wifi/WifiController;)V
+PLcom/android/server/wifi/WifiController$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/wifi/WifiController$2;-><init>(Lcom/android/server/wifi/WifiController;Landroid/os/Handler;)V
+PLcom/android/server/wifi/WifiController$3;-><init>(Lcom/android/server/wifi/WifiController;Landroid/os/Handler;)V
+PLcom/android/server/wifi/WifiController$4;-><init>(Lcom/android/server/wifi/WifiController;Landroid/os/Handler;)V
+PLcom/android/server/wifi/WifiController$ApEnabledState;-><init>(Lcom/android/server/wifi/WifiController;)V
+PLcom/android/server/wifi/WifiController$ApStaDisabledState;-><init>(Lcom/android/server/wifi/WifiController;)V
+PLcom/android/server/wifi/WifiController$DefaultState;-><init>(Lcom/android/server/wifi/WifiController;)V
+PLcom/android/server/wifi/WifiController$DefaultState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/wifi/WifiController$DeviceActiveState;-><init>(Lcom/android/server/wifi/WifiController;)V
+PLcom/android/server/wifi/WifiController$DeviceActiveState;->enter()V
+PLcom/android/server/wifi/WifiController$DeviceActiveState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/wifi/WifiController$DeviceInactiveState;-><init>(Lcom/android/server/wifi/WifiController;)V
+PLcom/android/server/wifi/WifiController$EcmState;-><init>(Lcom/android/server/wifi/WifiController;)V
+PLcom/android/server/wifi/WifiController$FullHighPerfLockHeldState;-><init>(Lcom/android/server/wifi/WifiController;)V
+PLcom/android/server/wifi/WifiController$FullLockHeldState;-><init>(Lcom/android/server/wifi/WifiController;)V
+PLcom/android/server/wifi/WifiController$NoLockHeldState;-><init>(Lcom/android/server/wifi/WifiController;)V
+PLcom/android/server/wifi/WifiController$ScanOnlyLockHeldState;-><init>(Lcom/android/server/wifi/WifiController;)V
+PLcom/android/server/wifi/WifiController$StaDisabledWithScanState;-><init>(Lcom/android/server/wifi/WifiController;)V
+PLcom/android/server/wifi/WifiController$StaDisabledWithScanState;->doDeferEnable(Landroid/os/Message;)Z
+PLcom/android/server/wifi/WifiController$StaDisabledWithScanState;->enter()V
+PLcom/android/server/wifi/WifiController$StaDisabledWithScanState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/wifi/WifiController$StaEnabledState;-><init>(Lcom/android/server/wifi/WifiController;)V
+PLcom/android/server/wifi/WifiController$StaEnabledState;->enter()V
+PLcom/android/server/wifi/WifiController$StaEnabledState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/wifi/WifiController;->-get12(Lcom/android/server/wifi/WifiController;)J
+PLcom/android/server/wifi/WifiController;->-get13(Lcom/android/server/wifi/WifiController;)Z
+PLcom/android/server/wifi/WifiController;->-get14(Lcom/android/server/wifi/WifiController;)Lcom/android/server/wifi/WifiSettingsStore;
+PLcom/android/server/wifi/WifiController;->-get16(Lcom/android/server/wifi/WifiController;)Lcom/android/server/wifi/WifiStateMachine;
+PLcom/android/server/wifi/WifiController;->-get4(Lcom/android/server/wifi/WifiController;)Lcom/android/server/wifi/WifiController$DeviceActiveState;
+PLcom/android/server/wifi/WifiController;->-get5(Lcom/android/server/wifi/WifiController;)Z
+PLcom/android/server/wifi/WifiController;->-get8(Lcom/android/server/wifi/WifiController;)Z
+PLcom/android/server/wifi/WifiController;->-set1(Lcom/android/server/wifi/WifiController;Z)Z
+PLcom/android/server/wifi/WifiController;->-set2(Lcom/android/server/wifi/WifiController;I)I
+PLcom/android/server/wifi/WifiController;->-wrap2(Lcom/android/server/wifi/WifiController;Ljava/lang/String;)V
+PLcom/android/server/wifi/WifiController;->-wrap3(Lcom/android/server/wifi/WifiController;Ljava/lang/String;)V
+PLcom/android/server/wifi/WifiController;-><init>(Landroid/content/Context;Lcom/android/server/wifi/WifiStateMachine;Lcom/android/server/wifi/WifiSettingsStore;Lcom/android/server/wifi/WifiLockManager;Landroid/os/Looper;Lcom/android/server/wifi/FrameworkFacade;)V
+PLcom/android/server/wifi/WifiController;->initializeAndRegisterForSettingsChange(Landroid/os/Looper;)V
+PLcom/android/server/wifi/WifiController;->readStayAwakeConditions()V
+PLcom/android/server/wifi/WifiController;->readWifiIdleTime()V
+PLcom/android/server/wifi/WifiController;->readWifiReEnableDelay()V
+PLcom/android/server/wifi/WifiController;->readWifiSleepPolicy()V
+PLcom/android/server/wifi/WifiController;->registerForStayAwakeModeChange(Landroid/os/Handler;)V
+PLcom/android/server/wifi/WifiController;->registerForWifiIdleTimeChange(Landroid/os/Handler;)V
+PLcom/android/server/wifi/WifiController;->registerForWifiSleepPolicyChange(Landroid/os/Handler;)V
+PLcom/android/server/wifi/WifiCountryCode;-><init>(Lcom/android/server/wifi/WifiNative;Ljava/lang/String;Z)V
+PLcom/android/server/wifi/WifiCountryCode;->enableVerboseLogging(I)V
+PLcom/android/server/wifi/WifiCountryCode;->pickCountryCode()Ljava/lang/String;
+PLcom/android/server/wifi/WifiCountryCode;->setCountryCodeNative(Ljava/lang/String;)Z
+PLcom/android/server/wifi/WifiCountryCode;->setReadyForChange(Z)V
+PLcom/android/server/wifi/WifiCountryCode;->simCardRemoved()V
+PLcom/android/server/wifi/WifiCountryCode;->updateCountryCode()V
+PLcom/android/server/wifi/WifiDiagnostics$1;-><init>(Lcom/android/server/wifi/WifiDiagnostics;)V
+PLcom/android/server/wifi/WifiDiagnostics$1;->onRingBufferData(Lcom/android/server/wifi/WifiNative$RingBufferStatus;[B)V
+PLcom/android/server/wifi/WifiDiagnostics$2;-><init>(Lcom/android/server/wifi/WifiDiagnostics;)V
+PLcom/android/server/wifi/WifiDiagnostics$2;->compare(Lcom/android/server/wifi/WifiNative$FateReport;Lcom/android/server/wifi/WifiNative$FateReport;)I
+PLcom/android/server/wifi/WifiDiagnostics$2;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+PLcom/android/server/wifi/WifiDiagnostics$LimitedCircularArray;-><init>(Lcom/android/server/wifi/WifiDiagnostics;I)V
+PLcom/android/server/wifi/WifiDiagnostics$LimitedCircularArray;->size()I
+PLcom/android/server/wifi/WifiDiagnostics;-><init>(Landroid/content/Context;Lcom/android/server/wifi/WifiInjector;Lcom/android/server/wifi/WifiStateMachine;Lcom/android/server/wifi/WifiNative;Lcom/android/server/wifi/BuildProperties;Lcom/android/server/wifi/LastMileLogger;)V
+PLcom/android/server/wifi/WifiDiagnostics;->clearVerboseLogs()V
+PLcom/android/server/wifi/WifiDiagnostics;->enableVerboseLoggingForDogfood()Z
+PLcom/android/server/wifi/WifiDiagnostics;->fetchPacketFates()Ljava/util/ArrayList;
+PLcom/android/server/wifi/WifiDiagnostics;->fetchRingBuffers()Z
+PLcom/android/server/wifi/WifiDiagnostics;->reportConnectionEvent(JB)V
+PLcom/android/server/wifi/WifiDiagnostics;->resizeRingBuffers()V
+PLcom/android/server/wifi/WifiDiagnostics;->startLogging(Z)V
+PLcom/android/server/wifi/WifiDiagnostics;->startLoggingAllExceptPerPacketBuffers()Z
+PLcom/android/server/wifi/WifiDiagnostics;->startLoggingRingBuffer(Lcom/android/server/wifi/WifiNative$RingBufferStatus;)Z
+PLcom/android/server/wifi/WifiDiagnostics;->stopLoggingAllBuffers()Z
+PLcom/android/server/wifi/WifiDiagnostics;->stopLoggingRingBuffer(Lcom/android/server/wifi/WifiNative$RingBufferStatus;)Z
+PLcom/android/server/wifi/WifiInjector;-><init>(Landroid/content/Context;)V
+PLcom/android/server/wifi/WifiInjector;->getBuildProperties()Lcom/android/server/wifi/BuildProperties;
+PLcom/android/server/wifi/WifiInjector;->getClock()Lcom/android/server/wifi/Clock;
+PLcom/android/server/wifi/WifiInjector;->getFrameworkFacade()Lcom/android/server/wifi/FrameworkFacade;
+PLcom/android/server/wifi/WifiInjector;->getInstance()Lcom/android/server/wifi/WifiInjector;
+PLcom/android/server/wifi/WifiInjector;->getJavaRuntime()Ljava/lang/Runtime;
+PLcom/android/server/wifi/WifiInjector;->getPasspointManager()Lcom/android/server/wifi/hotspot2/PasspointManager;
+PLcom/android/server/wifi/WifiInjector;->getPropertyService()Lcom/android/server/wifi/PropertyService;
+PLcom/android/server/wifi/WifiInjector;->getUserManager()Landroid/os/UserManager;
+PLcom/android/server/wifi/WifiInjector;->getWifiApConfigStore()Lcom/android/server/wifi/WifiApConfigStore;
+PLcom/android/server/wifi/WifiInjector;->getWifiBackupRestore()Lcom/android/server/wifi/WifiBackupRestore;
+PLcom/android/server/wifi/WifiInjector;->getWifiCertManager()Lcom/android/server/wifi/WifiCertManager;
+PLcom/android/server/wifi/WifiInjector;->getWifiConfigManager()Lcom/android/server/wifi/WifiConfigManager;
+PLcom/android/server/wifi/WifiInjector;->getWifiController()Lcom/android/server/wifi/WifiController;
+PLcom/android/server/wifi/WifiInjector;->getWifiCountryCode()Lcom/android/server/wifi/WifiCountryCode;
+PLcom/android/server/wifi/WifiInjector;->getWifiLastResortWatchdog()Lcom/android/server/wifi/WifiLastResortWatchdog;
+PLcom/android/server/wifi/WifiInjector;->getWifiLockManager()Lcom/android/server/wifi/WifiLockManager;
+PLcom/android/server/wifi/WifiInjector;->getWifiMetrics()Lcom/android/server/wifi/WifiMetrics;
+PLcom/android/server/wifi/WifiInjector;->getWifiMonitor()Lcom/android/server/wifi/WifiMonitor;
+PLcom/android/server/wifi/WifiInjector;->getWifiMulticastLockManager()Lcom/android/server/wifi/WifiMulticastLockManager;
+PLcom/android/server/wifi/WifiInjector;->getWifiNative()Lcom/android/server/wifi/WifiNative;
+PLcom/android/server/wifi/WifiInjector;->getWifiNotificationController()Lcom/android/server/wifi/WifiNotificationController;
+PLcom/android/server/wifi/WifiInjector;->getWifiP2pMonitor()Lcom/android/server/wifi/p2p/WifiP2pMonitor;
+PLcom/android/server/wifi/WifiInjector;->getWifiP2pNative()Lcom/android/server/wifi/p2p/WifiP2pNative;
+PLcom/android/server/wifi/WifiInjector;->getWifiPermissionsUtil()Lcom/android/server/wifi/util/WifiPermissionsUtil;
+PLcom/android/server/wifi/WifiInjector;->getWifiScanner()Landroid/net/wifi/WifiScanner;
+PLcom/android/server/wifi/WifiInjector;->getWifiServiceHandlerThread()Landroid/os/HandlerThread;
+PLcom/android/server/wifi/WifiInjector;->getWifiSettingsStore()Lcom/android/server/wifi/WifiSettingsStore;
+PLcom/android/server/wifi/WifiInjector;->getWifiStateMachine()Lcom/android/server/wifi/WifiStateMachine;
+PLcom/android/server/wifi/WifiInjector;->getWifiStateTracker()Lcom/android/server/wifi/WifiStateTracker;
+PLcom/android/server/wifi/WifiInjector;->getWifiTrafficPoller()Lcom/android/server/wifi/WifiTrafficPoller;
+PLcom/android/server/wifi/WifiInjector;->makeLog(Ljava/lang/String;)Lcom/android/server/wifi/WifiLog;
+PLcom/android/server/wifi/WifiInjector;->makeWifiConnectivityManager(Landroid/net/wifi/WifiInfo;Z)Lcom/android/server/wifi/WifiConnectivityManager;
+PLcom/android/server/wifi/WifiInjector;->makeWifiDiagnostics(Lcom/android/server/wifi/WifiNative;)Lcom/android/server/wifi/BaseWifiDiagnostics;
+PLcom/android/server/wifi/WifiInjector;->makeWificond()Landroid/net/wifi/IWificond;
+PLcom/android/server/wifi/WifiKeyStore;-><init>(Landroid/security/KeyStore;)V
+PLcom/android/server/wifi/WifiKeyStore;->enableVerboseLogging(Z)V
+PLcom/android/server/wifi/WifiLastResortWatchdog$AvailableNetworkFailureCount;-><init>(Landroid/net/wifi/WifiConfiguration;)V
+PLcom/android/server/wifi/WifiLastResortWatchdog$AvailableNetworkFailureCount;->resetCounts()V
+PLcom/android/server/wifi/WifiLastResortWatchdog;-><init>(Lcom/android/server/wifi/SelfRecovery;Lcom/android/server/wifi/WifiMetrics;)V
+PLcom/android/server/wifi/WifiLastResortWatchdog;->clearAllFailureCounts()V
+PLcom/android/server/wifi/WifiLastResortWatchdog;->connectedStateTransition(Z)V
+PLcom/android/server/wifi/WifiLastResortWatchdog;->enableVerboseLogging(I)V
+PLcom/android/server/wifi/WifiLastResortWatchdog;->setWatchdogTriggerEnabled(Z)V
+PLcom/android/server/wifi/WifiLastResortWatchdog;->updateAvailableNetworks(Ljava/util/List;)V
+PLcom/android/server/wifi/WifiLockManager$WifiLock;-><init>(Lcom/android/server/wifi/WifiLockManager;ILjava/lang/String;Landroid/os/IBinder;Landroid/os/WorkSource;)V
+PLcom/android/server/wifi/WifiLockManager$WifiLock;->getBinder()Landroid/os/IBinder;
+PLcom/android/server/wifi/WifiLockManager$WifiLock;->unlinkDeathRecipient()V
+PLcom/android/server/wifi/WifiLockManager;-><init>(Landroid/content/Context;Lcom/android/internal/app/IBatteryStats;)V
+PLcom/android/server/wifi/WifiLockManager;->acquireWifiLock(ILjava/lang/String;Landroid/os/IBinder;Landroid/os/WorkSource;)Z
+PLcom/android/server/wifi/WifiLockManager;->addLock(Lcom/android/server/wifi/WifiLockManager$WifiLock;)Z
+PLcom/android/server/wifi/WifiLockManager;->enableVerboseLogging(I)V
+PLcom/android/server/wifi/WifiLockManager;->findLockByBinder(Landroid/os/IBinder;)Lcom/android/server/wifi/WifiLockManager$WifiLock;
+PLcom/android/server/wifi/WifiLockManager;->isValidLockMode(I)Z
+PLcom/android/server/wifi/WifiLockManager;->releaseLock(Landroid/os/IBinder;)Z
+PLcom/android/server/wifi/WifiLockManager;->releaseWifiLock(Landroid/os/IBinder;)Z
+PLcom/android/server/wifi/WifiLockManager;->removeLock(Landroid/os/IBinder;)Lcom/android/server/wifi/WifiLockManager$WifiLock;
+PLcom/android/server/wifi/WifiMetrics$1;-><init>(Lcom/android/server/wifi/WifiMetrics;Landroid/os/Looper;)V
+PLcom/android/server/wifi/WifiMetrics$1;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/wifi/WifiMetrics$ConnectionEvent;->-get1(Lcom/android/server/wifi/WifiMetrics$ConnectionEvent;)Ljava/lang/String;
+PLcom/android/server/wifi/WifiMetrics$ConnectionEvent;->-get2(Lcom/android/server/wifi/WifiMetrics$ConnectionEvent;)J
+PLcom/android/server/wifi/WifiMetrics$ConnectionEvent;->-get3(Lcom/android/server/wifi/WifiMetrics$ConnectionEvent;)J
+PLcom/android/server/wifi/WifiMetrics$ConnectionEvent;->-set0(Lcom/android/server/wifi/WifiMetrics$ConnectionEvent;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/wifi/WifiMetrics$ConnectionEvent;->-set1(Lcom/android/server/wifi/WifiMetrics$ConnectionEvent;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/wifi/WifiMetrics$ConnectionEvent;->-set2(Lcom/android/server/wifi/WifiMetrics$ConnectionEvent;J)J
+PLcom/android/server/wifi/WifiMetrics$ConnectionEvent;->-set3(Lcom/android/server/wifi/WifiMetrics$ConnectionEvent;J)J
+PLcom/android/server/wifi/WifiMetrics$ConnectionEvent;->-set4(Lcom/android/server/wifi/WifiMetrics$ConnectionEvent;Z)Z
+PLcom/android/server/wifi/WifiMetrics$ConnectionEvent;->-set5(Lcom/android/server/wifi/WifiMetrics$ConnectionEvent;I)I
+PLcom/android/server/wifi/WifiMetrics$ConnectionEvent;-><init>(Lcom/android/server/wifi/WifiMetrics;)V
+PLcom/android/server/wifi/WifiMetrics$ConnectionEvent;-><init>(Lcom/android/server/wifi/WifiMetrics;Lcom/android/server/wifi/WifiMetrics$ConnectionEvent;)V
+PLcom/android/server/wifi/WifiMetrics$RouterFingerPrint;->-get0(Lcom/android/server/wifi/WifiMetrics$RouterFingerPrint;)Lcom/android/server/wifi/nano/WifiMetricsProto$RouterFingerPrint;
+PLcom/android/server/wifi/WifiMetrics$RouterFingerPrint;-><init>(Lcom/android/server/wifi/WifiMetrics;)V
+PLcom/android/server/wifi/WifiMetrics$RouterFingerPrint;->updateFromWifiConfiguration(Landroid/net/wifi/WifiConfiguration;)V
+PLcom/android/server/wifi/WifiMetrics;->-get0(Lcom/android/server/wifi/WifiMetrics;)Lcom/android/server/wifi/WifiMetrics$ConnectionEvent;
+PLcom/android/server/wifi/WifiMetrics;->-get1(Lcom/android/server/wifi/WifiMetrics;)Ljava/lang/Object;
+PLcom/android/server/wifi/WifiMetrics;->-getandroid-net-wifi-SupplicantStateSwitchesValues()[I
+PLcom/android/server/wifi/WifiMetrics;->-wrap0(Lcom/android/server/wifi/WifiMetrics;Landroid/os/Message;)V
+PLcom/android/server/wifi/WifiMetrics;->-wrap1(Lcom/android/server/wifi/WifiMetrics;Landroid/net/wifi/ScanResult;)V
+PLcom/android/server/wifi/WifiMetrics;-><init>(Lcom/android/server/wifi/Clock;Landroid/os/Looper;Lcom/android/server/wifi/aware/WifiAwareMetrics;)V
+PLcom/android/server/wifi/WifiMetrics;->addStaEvent(Lcom/android/server/wifi/nano/WifiMetricsProto$StaEvent;)V
+PLcom/android/server/wifi/WifiMetrics;->bitSetToInt(Ljava/util/BitSet;)I
+PLcom/android/server/wifi/WifiMetrics;->createConfigInfo(Landroid/net/wifi/WifiConfiguration;)Lcom/android/server/wifi/nano/WifiMetricsProto$StaEvent$ConfigInfo;
+PLcom/android/server/wifi/WifiMetrics;->endConnectionEvent(II)V
+PLcom/android/server/wifi/WifiMetrics;->getHandler()Landroid/os/Handler;
+PLcom/android/server/wifi/WifiMetrics;->handlePollResult(Landroid/net/wifi/WifiInfo;)V
+PLcom/android/server/wifi/WifiMetrics;->incrementNonEmptyScanResultCount()V
+PLcom/android/server/wifi/WifiMetrics;->incrementOneshotScanCount()V
+PLcom/android/server/wifi/WifiMetrics;->incrementRssiPollRssiCount(I)V
+PLcom/android/server/wifi/WifiMetrics;->incrementScanReturnEntry(II)V
+PLcom/android/server/wifi/WifiMetrics;->incrementWifiScoreCount(I)V
+PLcom/android/server/wifi/WifiMetrics;->incrementWifiSystemScanStateCount(IZ)V
+PLcom/android/server/wifi/WifiMetrics;->logStaEvent(I)V
+PLcom/android/server/wifi/WifiMetrics;->logStaEvent(IILandroid/net/wifi/WifiConfiguration;)V
+PLcom/android/server/wifi/WifiMetrics;->logStaEvent(ILandroid/net/wifi/WifiConfiguration;)V
+PLcom/android/server/wifi/WifiMetrics;->maybeIncrementRssiDeltaCount(I)V
+PLcom/android/server/wifi/WifiMetrics;->processMessage(Landroid/os/Message;)V
+PLcom/android/server/wifi/WifiMetrics;->setConnectionScanDetail(Lcom/android/server/wifi/ScanDetail;)V
+PLcom/android/server/wifi/WifiMetrics;->setScreenState(Z)V
+PLcom/android/server/wifi/WifiMetrics;->setWifiState(I)V
+PLcom/android/server/wifi/WifiMetrics;->startConnectionEvent(Landroid/net/wifi/WifiConfiguration;Ljava/lang/String;I)V
+PLcom/android/server/wifi/WifiMetrics;->supplicantStateToBit(Landroid/net/wifi/SupplicantState;)I
+PLcom/android/server/wifi/WifiMetrics;->updateMetricsFromNetworkDetail(Lcom/android/server/wifi/hotspot2/NetworkDetail;)V
+PLcom/android/server/wifi/WifiMetrics;->updateMetricsFromScanResult(Landroid/net/wifi/ScanResult;)V
+PLcom/android/server/wifi/WifiMonitor;-><init>(Lcom/android/server/wifi/WifiInjector;)V
+PLcom/android/server/wifi/WifiMonitor;->broadcastAssociatedBssidEvent(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/wifi/WifiMonitor;->broadcastNetworkConnectionEvent(Ljava/lang/String;ILjava/lang/String;)V
+PLcom/android/server/wifi/WifiMonitor;->broadcastScanResultEvent(Ljava/lang/String;)V
+PLcom/android/server/wifi/WifiMonitor;->broadcastSupplicantConnectionEvent(Ljava/lang/String;)V
+PLcom/android/server/wifi/WifiMonitor;->broadcastSupplicantDisconnectionEvent(Ljava/lang/String;)V
+PLcom/android/server/wifi/WifiMonitor;->broadcastSupplicantStateChangeEvent(Ljava/lang/String;ILandroid/net/wifi/WifiSsid;Ljava/lang/String;Landroid/net/wifi/SupplicantState;)V
+PLcom/android/server/wifi/WifiMonitor;->enableVerboseLogging(I)V
+PLcom/android/server/wifi/WifiMonitor;->ensureConnectedLocked()Z
+PLcom/android/server/wifi/WifiMonitor;->isMonitoring(Ljava/lang/String;)Z
+PLcom/android/server/wifi/WifiMonitor;->registerHandler(Ljava/lang/String;ILandroid/os/Handler;)V
+PLcom/android/server/wifi/WifiMonitor;->sendMessage(Landroid/os/Handler;Landroid/os/Message;)V
+PLcom/android/server/wifi/WifiMonitor;->sendMessage(Ljava/lang/String;I)V
+PLcom/android/server/wifi/WifiMonitor;->sendMessage(Ljava/lang/String;IIILjava/lang/Object;)V
+PLcom/android/server/wifi/WifiMonitor;->sendMessage(Ljava/lang/String;Landroid/os/Message;)V
+PLcom/android/server/wifi/WifiMonitor;->setMonitoring(Ljava/lang/String;Z)V
+PLcom/android/server/wifi/WifiMonitor;->setMonitoringNone()V
+PLcom/android/server/wifi/WifiMonitor;->startMonitoring(Ljava/lang/String;Z)V
+PLcom/android/server/wifi/WifiMonitor;->stopAllMonitoring()V
+PLcom/android/server/wifi/WifiMulticastLockManager$Multicaster;-><init>(Lcom/android/server/wifi/WifiMulticastLockManager;Ljava/lang/String;Landroid/os/IBinder;)V
+PLcom/android/server/wifi/WifiMulticastLockManager$Multicaster;->getUid()I
+PLcom/android/server/wifi/WifiMulticastLockManager$Multicaster;->unlinkDeathRecipient()V
+PLcom/android/server/wifi/WifiMulticastLockManager;-><init>(Lcom/android/server/wifi/WifiMulticastLockManager$FilterController;Lcom/android/internal/app/IBatteryStats;)V
+PLcom/android/server/wifi/WifiMulticastLockManager;->acquireLock(Landroid/os/IBinder;Ljava/lang/String;)V
+PLcom/android/server/wifi/WifiMulticastLockManager;->enableVerboseLogging(I)V
+PLcom/android/server/wifi/WifiMulticastLockManager;->releaseLock()V
+PLcom/android/server/wifi/WifiMulticastLockManager;->removeMulticasterLocked(II)V
+PLcom/android/server/wifi/WifiNative$BucketSettings;-><init>()V
+PLcom/android/server/wifi/WifiNative$ChannelSettings;-><init>()V
+PLcom/android/server/wifi/WifiNative$FateReport;-><init>(BJB[B)V
+PLcom/android/server/wifi/WifiNative$FateReport;->convertDriverTimestampUSecToWallclockMSec(J)J
+PLcom/android/server/wifi/WifiNative$RingBufferStatus;-><init>()V
+PLcom/android/server/wifi/WifiNative$RoamingCapabilities;-><init>()V
+PLcom/android/server/wifi/WifiNative$RoamingConfig;-><init>()V
+PLcom/android/server/wifi/WifiNative$RxFateReport;-><init>(BJB[B)V
+PLcom/android/server/wifi/WifiNative$ScanCapabilities;-><init>()V
+PLcom/android/server/wifi/WifiNative$ScanSettings;-><init>()V
+PLcom/android/server/wifi/WifiNative$SignalPollResult;-><init>()V
+PLcom/android/server/wifi/WifiNative$TxFateReport;-><init>(BJB[B)V
+PLcom/android/server/wifi/WifiNative;-><init>(Ljava/lang/String;Lcom/android/server/wifi/WifiVendorHal;Lcom/android/server/wifi/SupplicantStaIfaceHal;Lcom/android/server/wifi/WificondControl;)V
+PLcom/android/server/wifi/WifiNative;->configureNeighborDiscoveryOffload(Z)Z
+PLcom/android/server/wifi/WifiNative;->configureRoaming(Lcom/android/server/wifi/WifiNative$RoamingConfig;)Z
+PLcom/android/server/wifi/WifiNative;->connectToNetwork(Landroid/net/wifi/WifiConfiguration;)Z
+PLcom/android/server/wifi/WifiNative;->connectToSupplicant()Z
+PLcom/android/server/wifi/WifiNative;->disconnect()Z
+PLcom/android/server/wifi/WifiNative;->enableStaAutoReconnect(Z)Z
+PLcom/android/server/wifi/WifiNative;->enableSupplicant()Z
+PLcom/android/server/wifi/WifiNative;->enableVerboseLogging(I)V
+PLcom/android/server/wifi/WifiNative;->getApfCapabilities()Landroid/net/apf/ApfCapabilities;
+PLcom/android/server/wifi/WifiNative;->getBgScanCapabilities(Lcom/android/server/wifi/WifiNative$ScanCapabilities;)Z
+PLcom/android/server/wifi/WifiNative;->getChannelsForBand(I)[I
+PLcom/android/server/wifi/WifiNative;->getDriverVersion()Ljava/lang/String;
+PLcom/android/server/wifi/WifiNative;->getFirmwareVersion()Ljava/lang/String;
+PLcom/android/server/wifi/WifiNative;->getFrameworkNetworkId(I)I
+PLcom/android/server/wifi/WifiNative;->getInterfaceName()Ljava/lang/String;
+PLcom/android/server/wifi/WifiNative;->getMacAddress()Ljava/lang/String;
+PLcom/android/server/wifi/WifiNative;->getRingBufferStatus()[Lcom/android/server/wifi/WifiNative$RingBufferStatus;
+PLcom/android/server/wifi/WifiNative;->getRoamingCapabilities(Lcom/android/server/wifi/WifiNative$RoamingCapabilities;)Z
+PLcom/android/server/wifi/WifiNative;->getRxPktFates([Lcom/android/server/wifi/WifiNative$RxFateReport;)Z
+PLcom/android/server/wifi/WifiNative;->getScanResults()Ljava/util/ArrayList;
+PLcom/android/server/wifi/WifiNative;->getSupportedFeatureSet()I
+PLcom/android/server/wifi/WifiNative;->getSupportedLoggerFeatureSet()I
+PLcom/android/server/wifi/WifiNative;->getTxPktFates([Lcom/android/server/wifi/WifiNative$TxFateReport;)Z
+PLcom/android/server/wifi/WifiNative;->getWifiLinkLayerStats(Ljava/lang/String;)Landroid/net/wifi/WifiLinkLayerStats;
+PLcom/android/server/wifi/WifiNative;->initializeVendorHal(Lcom/android/server/wifi/WifiNative$VendorHalDeathEventHandler;)Z
+PLcom/android/server/wifi/WifiNative;->installPacketFilter([B)Z
+PLcom/android/server/wifi/WifiNative;->removeAllNetworks()Z
+PLcom/android/server/wifi/WifiNative;->scan(Ljava/util/Set;Ljava/util/Set;)Z
+PLcom/android/server/wifi/WifiNative;->setBluetoothCoexistenceMode(I)Z
+PLcom/android/server/wifi/WifiNative;->setBluetoothCoexistenceScanMode(Z)Z
+PLcom/android/server/wifi/WifiNative;->setConcurrencyPriority(Z)Z
+PLcom/android/server/wifi/WifiNative;->setConfigMethods(Ljava/lang/String;)Z
+PLcom/android/server/wifi/WifiNative;->setConfiguredNetworkBSSID(Ljava/lang/String;)Z
+PLcom/android/server/wifi/WifiNative;->setCountryCode(Ljava/lang/String;)Z
+PLcom/android/server/wifi/WifiNative;->setDeviceName(Ljava/lang/String;)Z
+PLcom/android/server/wifi/WifiNative;->setDeviceType(Ljava/lang/String;)Z
+PLcom/android/server/wifi/WifiNative;->setExternalSim(Z)Z
+PLcom/android/server/wifi/WifiNative;->setLoggingEventHandler(Lcom/android/server/wifi/WifiNative$WifiLoggerEventHandler;)Z
+PLcom/android/server/wifi/WifiNative;->setManufacturer(Ljava/lang/String;)Z
+PLcom/android/server/wifi/WifiNative;->setModelName(Ljava/lang/String;)Z
+PLcom/android/server/wifi/WifiNative;->setModelNumber(Ljava/lang/String;)Z
+PLcom/android/server/wifi/WifiNative;->setPowerSave(Z)V
+PLcom/android/server/wifi/WifiNative;->setScanningMacOui([B)Z
+PLcom/android/server/wifi/WifiNative;->setSerialNumber(Ljava/lang/String;)Z
+PLcom/android/server/wifi/WifiNative;->setSupplicantLogLevel(Z)V
+PLcom/android/server/wifi/WifiNative;->setSuspendOptimizations(Z)Z
+PLcom/android/server/wifi/WifiNative;->setupForClientMode()Landroid/net/wifi/IClientInterface;
+PLcom/android/server/wifi/WifiNative;->signalPoll()Lcom/android/server/wifi/WifiNative$SignalPollResult;
+PLcom/android/server/wifi/WifiNative;->startHalIfNecessary(Z)Z
+PLcom/android/server/wifi/WifiNative;->startLoggingRingBuffer(IIIILjava/lang/String;)Z
+PLcom/android/server/wifi/WifiNative;->startPktFateMonitoring()Z
+PLcom/android/server/wifi/WifiNative;->stopFilteringMulticastV4Packets()Z
+PLcom/android/server/wifi/WifiNative;->stopFilteringMulticastV6Packets()Z
+PLcom/android/server/wifi/WifiNative;->stopHalIfNecessary()V
+PLcom/android/server/wifi/WifiNative;->stopRssiMonitoring()I
+PLcom/android/server/wifi/WifiNative;->tearDown()Z
+PLcom/android/server/wifi/WifiNetworkHistory;-><init>(Landroid/content/Context;Lcom/android/server/net/DelayedDiskWrite;)V
+PLcom/android/server/wifi/WifiNetworkSelector;-><init>(Landroid/content/Context;Lcom/android/server/wifi/WifiConfigManager;Lcom/android/server/wifi/Clock;Landroid/util/LocalLog;)V
+PLcom/android/server/wifi/WifiNetworkSelector;->getFilteredScanDetails()Ljava/util/List;
+PLcom/android/server/wifi/WifiNetworkSelector;->isCurrentNetworkSufficient(Landroid/net/wifi/WifiInfo;)Z
+PLcom/android/server/wifi/WifiNetworkSelector;->isNetworkSelectionNeeded(Ljava/util/List;Landroid/net/wifi/WifiInfo;ZZ)Z
+PLcom/android/server/wifi/WifiNetworkSelector;->localLog(Ljava/lang/String;)V
+PLcom/android/server/wifi/WifiNetworkSelector;->overrideCandidateWithUserConnectChoice(Landroid/net/wifi/WifiConfiguration;)Landroid/net/wifi/WifiConfiguration;
+PLcom/android/server/wifi/WifiNetworkSelector;->registerNetworkEvaluator(Lcom/android/server/wifi/WifiNetworkSelector$NetworkEvaluator;I)Z
+PLcom/android/server/wifi/WifiNetworkSelector;->selectNetwork(Ljava/util/List;Ljava/util/HashSet;Landroid/net/wifi/WifiInfo;ZZZ)Landroid/net/wifi/WifiConfiguration;
+PLcom/android/server/wifi/WifiNetworkSelector;->toNetworkString(Landroid/net/wifi/WifiConfiguration;)Ljava/lang/String;
+PLcom/android/server/wifi/WifiNetworkSelector;->toScanId(Landroid/net/wifi/ScanResult;)Ljava/lang/String;
+PLcom/android/server/wifi/WifiNotificationController$1;->-getandroid-net-NetworkInfo$DetailedStateSwitchesValues()[I
+PLcom/android/server/wifi/WifiNotificationController$1;-><init>(Lcom/android/server/wifi/WifiNotificationController;)V
+PLcom/android/server/wifi/WifiNotificationController$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/wifi/WifiNotificationController$NotificationEnabledSettingObserver;-><init>(Lcom/android/server/wifi/WifiNotificationController;Landroid/os/Handler;)V
+PLcom/android/server/wifi/WifiNotificationController$NotificationEnabledSettingObserver;->getValue()Z
+PLcom/android/server/wifi/WifiNotificationController$NotificationEnabledSettingObserver;->register()V
+PLcom/android/server/wifi/WifiNotificationController;->-get0(Lcom/android/server/wifi/WifiNotificationController;)Landroid/content/Context;
+PLcom/android/server/wifi/WifiNotificationController;->-get1(Lcom/android/server/wifi/WifiNotificationController;)Landroid/net/NetworkInfo$DetailedState;
+PLcom/android/server/wifi/WifiNotificationController;->-get2(Lcom/android/server/wifi/WifiNotificationController;)Lcom/android/server/wifi/FrameworkFacade;
+PLcom/android/server/wifi/WifiNotificationController;->-get3(Lcom/android/server/wifi/WifiNotificationController;)Landroid/net/NetworkInfo;
+PLcom/android/server/wifi/WifiNotificationController;->-get4(Lcom/android/server/wifi/WifiNotificationController;)Lcom/android/server/wifi/WifiInjector;
+PLcom/android/server/wifi/WifiNotificationController;->-get5(Lcom/android/server/wifi/WifiNotificationController;)Landroid/net/wifi/WifiScanner;
+PLcom/android/server/wifi/WifiNotificationController;->-set0(Lcom/android/server/wifi/WifiNotificationController;Landroid/net/NetworkInfo$DetailedState;)Landroid/net/NetworkInfo$DetailedState;
+PLcom/android/server/wifi/WifiNotificationController;->-set1(Lcom/android/server/wifi/WifiNotificationController;Landroid/net/NetworkInfo;)Landroid/net/NetworkInfo;
+PLcom/android/server/wifi/WifiNotificationController;->-set2(Lcom/android/server/wifi/WifiNotificationController;Z)Z
+PLcom/android/server/wifi/WifiNotificationController;->-set3(Lcom/android/server/wifi/WifiNotificationController;Landroid/net/wifi/WifiScanner;)Landroid/net/wifi/WifiScanner;
+PLcom/android/server/wifi/WifiNotificationController;->-set4(Lcom/android/server/wifi/WifiNotificationController;I)I
+PLcom/android/server/wifi/WifiNotificationController;->-wrap0(Lcom/android/server/wifi/WifiNotificationController;Landroid/net/NetworkInfo;Ljava/util/List;)V
+PLcom/android/server/wifi/WifiNotificationController;->-wrap1(Lcom/android/server/wifi/WifiNotificationController;)V
+PLcom/android/server/wifi/WifiNotificationController;-><init>(Landroid/content/Context;Landroid/os/Looper;Lcom/android/server/wifi/FrameworkFacade;Landroid/app/Notification$Builder;Lcom/android/server/wifi/WifiInjector;)V
+PLcom/android/server/wifi/WifiNotificationController;->checkAndSetNotification(Landroid/net/NetworkInfo;Ljava/util/List;)V
+PLcom/android/server/wifi/WifiNotificationController;->resetNotification()V
+PLcom/android/server/wifi/WifiNotificationController;->setNotificationVisible(ZIZI)V
+PLcom/android/server/wifi/WifiScoreReport;-><init>(Landroid/content/Context;Lcom/android/server/wifi/WifiConfigManager;Lcom/android/server/wifi/Clock;)V
+PLcom/android/server/wifi/WifiScoreReport;->calculateAndReportScore(Landroid/net/wifi/WifiInfo;Landroid/net/NetworkAgent;ILcom/android/server/wifi/WifiMetrics;)V
+PLcom/android/server/wifi/WifiScoreReport;->calculateScore(Landroid/net/wifi/WifiInfo;I)I
+PLcom/android/server/wifi/WifiScoreReport;->enableVerboseLogging(Z)V
+PLcom/android/server/wifi/WifiScoreReport;->isHomeNetwork(Landroid/net/wifi/WifiInfo;)Z
+PLcom/android/server/wifi/WifiScoreReport;->logLinkMetrics(Landroid/net/wifi/WifiInfo;)V
+PLcom/android/server/wifi/WifiScoreReport;->multiBandScanResults(Landroid/net/wifi/WifiInfo;)Z
+PLcom/android/server/wifi/WifiScoreReport;->reset()V
+PLcom/android/server/wifi/WifiScoreReport;->updateScoringState(Landroid/net/wifi/WifiInfo;I)V
+PLcom/android/server/wifi/WifiService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/wifi/WifiService;->onBootPhase(I)V
+PLcom/android/server/wifi/WifiService;->onStart()V
+PLcom/android/server/wifi/WifiService;->onUnlockUser(I)V
+PLcom/android/server/wifi/WifiServiceImpl$1;-><init>(Lcom/android/server/wifi/WifiServiceImpl;)V
+PLcom/android/server/wifi/WifiServiceImpl$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/wifi/WifiServiceImpl$2;-><init>(Lcom/android/server/wifi/WifiServiceImpl;)V
+PLcom/android/server/wifi/WifiServiceImpl$3;-><init>(Lcom/android/server/wifi/WifiServiceImpl;)V
+PLcom/android/server/wifi/WifiServiceImpl$3;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/wifi/WifiServiceImpl$4;-><init>(Lcom/android/server/wifi/WifiServiceImpl;)V
+PLcom/android/server/wifi/WifiServiceImpl$5;-><init>(Lcom/android/server/wifi/WifiServiceImpl;Landroid/os/Handler;)V
+PLcom/android/server/wifi/WifiServiceImpl$6;-><init>(Lcom/android/server/wifi/WifiServiceImpl;Landroid/os/Handler;)V
+PLcom/android/server/wifi/WifiServiceImpl$7;-><init>(Lcom/android/server/wifi/WifiServiceImpl;Landroid/os/Handler;)V
+PLcom/android/server/wifi/WifiServiceImpl$8;-><init>(Lcom/android/server/wifi/WifiServiceImpl;)V
+PLcom/android/server/wifi/WifiServiceImpl$ClientHandler;-><init>(Lcom/android/server/wifi/WifiServiceImpl;Ljava/lang/String;Landroid/os/Looper;)V
+PLcom/android/server/wifi/WifiServiceImpl$ClientHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/wifi/WifiServiceImpl$WifiStateMachineHandler;-><init>(Lcom/android/server/wifi/WifiServiceImpl;Ljava/lang/String;Landroid/os/Looper;Lcom/android/internal/util/AsyncChannel;)V
+PLcom/android/server/wifi/WifiServiceImpl$WifiStateMachineHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/wifi/WifiServiceImpl;->-get0(Lcom/android/server/wifi/WifiServiceImpl;)Landroid/content/Context;
+PLcom/android/server/wifi/WifiServiceImpl;->-get1(Lcom/android/server/wifi/WifiServiceImpl;)Lcom/android/server/wifi/WifiCountryCode;
+PLcom/android/server/wifi/WifiServiceImpl;->-get2(Lcom/android/server/wifi/WifiServiceImpl;)Lcom/android/server/wifi/FrameworkFacade;
+PLcom/android/server/wifi/WifiServiceImpl;->-get3(Lcom/android/server/wifi/WifiServiceImpl;)Lcom/android/server/wifi/WifiTrafficPoller;
+PLcom/android/server/wifi/WifiServiceImpl;->-get4(Lcom/android/server/wifi/WifiServiceImpl;)Lcom/android/server/wifi/WifiController;
+PLcom/android/server/wifi/WifiServiceImpl;->-set0(Lcom/android/server/wifi/WifiServiceImpl;Lcom/android/internal/util/AsyncChannel;)Lcom/android/internal/util/AsyncChannel;
+PLcom/android/server/wifi/WifiServiceImpl;-><init>(Landroid/content/Context;Lcom/android/server/wifi/WifiInjector;Lcom/android/internal/util/AsyncChannel;)V
+PLcom/android/server/wifi/WifiServiceImpl;->acquireMulticastLock(Landroid/os/IBinder;Ljava/lang/String;)V
+PLcom/android/server/wifi/WifiServiceImpl;->acquireWifiLock(Landroid/os/IBinder;ILjava/lang/String;Landroid/os/WorkSource;)Z
+PLcom/android/server/wifi/WifiServiceImpl;->checkAndStartWifi()V
+PLcom/android/server/wifi/WifiServiceImpl;->checkNetworkSettingsPermission()Z
+PLcom/android/server/wifi/WifiServiceImpl;->enableVerboseLoggingInternal(I)V
+PLcom/android/server/wifi/WifiServiceImpl;->enforceAccessPermission()V
+PLcom/android/server/wifi/WifiServiceImpl;->enforceChangePermission()V
+PLcom/android/server/wifi/WifiServiceImpl;->enforceMulticastChangePermission()V
+PLcom/android/server/wifi/WifiServiceImpl;->getConfiguredNetworks()Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/wifi/WifiServiceImpl;->getDhcpInfo()Landroid/net/DhcpInfo;
+PLcom/android/server/wifi/WifiServiceImpl;->getScanResults(Ljava/lang/String;)Ljava/util/List;
+PLcom/android/server/wifi/WifiServiceImpl;->getSupportedFeatures()I
+PLcom/android/server/wifi/WifiServiceImpl;->getVerboseLoggingLevel()I
+PLcom/android/server/wifi/WifiServiceImpl;->getWifiApEnabledState()I
+PLcom/android/server/wifi/WifiServiceImpl;->getWifiEnabledState()I
+PLcom/android/server/wifi/WifiServiceImpl;->getWifiServiceMessenger()Landroid/os/Messenger;
+PLcom/android/server/wifi/WifiServiceImpl;->handleUserUnlock(I)V
+PLcom/android/server/wifi/WifiServiceImpl;->isRequestFromBackground(Ljava/lang/String;)Z
+PLcom/android/server/wifi/WifiServiceImpl;->isScanAlwaysAvailable()Z
+PLcom/android/server/wifi/WifiServiceImpl;->registerForBackgroundThrottleChanges()V
+PLcom/android/server/wifi/WifiServiceImpl;->registerForBroadcasts()V
+PLcom/android/server/wifi/WifiServiceImpl;->registerForPackageOrUserRemoval()V
+PLcom/android/server/wifi/WifiServiceImpl;->registerForScanModeChange()V
+PLcom/android/server/wifi/WifiServiceImpl;->releaseMulticastLock()V
+PLcom/android/server/wifi/WifiServiceImpl;->releaseWifiLock(Landroid/os/IBinder;)Z
+PLcom/android/server/wifi/WifiServiceImpl;->reportActivityInfo()Landroid/net/wifi/WifiActivityEnergyInfo;
+PLcom/android/server/wifi/WifiServiceImpl;->requestActivityInfo(Landroid/os/ResultReceiver;)V
+PLcom/android/server/wifi/WifiServiceImpl;->setWifiEnabled(Ljava/lang/String;Z)Z
+PLcom/android/server/wifi/WifiServiceImpl;->startScan(Landroid/net/wifi/ScanSettings;Landroid/os/WorkSource;Ljava/lang/String;)V
+PLcom/android/server/wifi/WifiServiceImpl;->updateBackgroundThrottleInterval()V
+PLcom/android/server/wifi/WifiServiceImpl;->updateBackgroundThrottlingWhitelist()V
+PLcom/android/server/wifi/WifiSettingsStore;-><init>(Landroid/content/Context;)V
+PLcom/android/server/wifi/WifiSettingsStore;->getLocationModeSetting(Landroid/content/Context;)I
+PLcom/android/server/wifi/WifiSettingsStore;->getPersistedAirplaneModeOn()Z
+PLcom/android/server/wifi/WifiSettingsStore;->getPersistedScanAlwaysAvailable()Z
+PLcom/android/server/wifi/WifiSettingsStore;->getPersistedWifiState()I
+PLcom/android/server/wifi/WifiSettingsStore;->getWifiSavedState()I
+PLcom/android/server/wifi/WifiSettingsStore;->handleWifiToggled(Z)Z
+PLcom/android/server/wifi/WifiSettingsStore;->isAirplaneModeOn()Z
+PLcom/android/server/wifi/WifiSettingsStore;->isScanAlwaysAvailable()Z
+PLcom/android/server/wifi/WifiSettingsStore;->isWifiToggleEnabled()Z
+PLcom/android/server/wifi/WifiSettingsStore;->persistWifiState(I)V
+PLcom/android/server/wifi/WifiSettingsStore;->testAndClearWifiSavedState()Z
+PLcom/android/server/wifi/WifiStateMachine$1;-><init>(Lcom/android/server/wifi/WifiStateMachine;)V
+PLcom/android/server/wifi/WifiStateMachine$2;-><init>(Lcom/android/server/wifi/WifiStateMachine;Landroid/os/Handler;)V
+PLcom/android/server/wifi/WifiStateMachine$3;-><init>(Lcom/android/server/wifi/WifiStateMachine;)V
+PLcom/android/server/wifi/WifiStateMachine$3;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/wifi/WifiStateMachine$4;-><init>(Lcom/android/server/wifi/WifiStateMachine;)V
+PLcom/android/server/wifi/WifiStateMachine$4;->onFullResult(Landroid/net/wifi/ScanResult;)V
+PLcom/android/server/wifi/WifiStateMachine$4;->onResults([Landroid/net/wifi/WifiScanner$ScanData;)V
+PLcom/android/server/wifi/WifiStateMachine$4;->onSuccess()V
+PLcom/android/server/wifi/WifiStateMachine$ConnectModeState;-><init>(Lcom/android/server/wifi/WifiStateMachine;)V
+PLcom/android/server/wifi/WifiStateMachine$ConnectModeState;->enter()V
+PLcom/android/server/wifi/WifiStateMachine$ConnectModeState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/wifi/WifiStateMachine$ConnectedState;-><init>(Lcom/android/server/wifi/WifiStateMachine;)V
+PLcom/android/server/wifi/WifiStateMachine$ConnectedState;->enter()V
+PLcom/android/server/wifi/WifiStateMachine$ConnectedState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/wifi/WifiStateMachine$DefaultState;-><init>(Lcom/android/server/wifi/WifiStateMachine;)V
+PLcom/android/server/wifi/WifiStateMachine$DefaultState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/wifi/WifiStateMachine$DisconnectedState;-><init>(Lcom/android/server/wifi/WifiStateMachine;)V
+PLcom/android/server/wifi/WifiStateMachine$DisconnectedState;->enter()V
+PLcom/android/server/wifi/WifiStateMachine$DisconnectedState;->exit()V
+PLcom/android/server/wifi/WifiStateMachine$DisconnectedState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/wifi/WifiStateMachine$DisconnectingState;-><init>(Lcom/android/server/wifi/WifiStateMachine;)V
+PLcom/android/server/wifi/WifiStateMachine$InitialState;-><init>(Lcom/android/server/wifi/WifiStateMachine;)V
+PLcom/android/server/wifi/WifiStateMachine$InitialState;->cleanup()V
+PLcom/android/server/wifi/WifiStateMachine$InitialState;->enter()V
+PLcom/android/server/wifi/WifiStateMachine$InitialState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/wifi/WifiStateMachine$IpManagerCallback;-><init>(Lcom/android/server/wifi/WifiStateMachine;)V
+PLcom/android/server/wifi/WifiStateMachine$IpManagerCallback;->installPacketFilter([B)V
+PLcom/android/server/wifi/WifiStateMachine$IpManagerCallback;->onLinkPropertiesChange(Landroid/net/LinkProperties;)V
+PLcom/android/server/wifi/WifiStateMachine$IpManagerCallback;->onNewDhcpResults(Landroid/net/DhcpResults;)V
+PLcom/android/server/wifi/WifiStateMachine$IpManagerCallback;->onPostDhcpAction()V
+PLcom/android/server/wifi/WifiStateMachine$IpManagerCallback;->onPreDhcpAction()V
+PLcom/android/server/wifi/WifiStateMachine$IpManagerCallback;->onProvisioningSuccess(Landroid/net/LinkProperties;)V
+PLcom/android/server/wifi/WifiStateMachine$IpManagerCallback;->setNeighborDiscoveryOffload(Z)V
+PLcom/android/server/wifi/WifiStateMachine$L2ConnectedState;-><init>(Lcom/android/server/wifi/WifiStateMachine;)V
+PLcom/android/server/wifi/WifiStateMachine$L2ConnectedState;->enter()V
+PLcom/android/server/wifi/WifiStateMachine$L2ConnectedState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/wifi/WifiStateMachine$ObtainingIpState;-><init>(Lcom/android/server/wifi/WifiStateMachine;)V
+PLcom/android/server/wifi/WifiStateMachine$ObtainingIpState;->enter()V
+PLcom/android/server/wifi/WifiStateMachine$ObtainingIpState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/wifi/WifiStateMachine$RoamingState;-><init>(Lcom/android/server/wifi/WifiStateMachine;)V
+PLcom/android/server/wifi/WifiStateMachine$ScanModeState;-><init>(Lcom/android/server/wifi/WifiStateMachine;)V
+PLcom/android/server/wifi/WifiStateMachine$ScanModeState;->enter()V
+PLcom/android/server/wifi/WifiStateMachine$ScanModeState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/wifi/WifiStateMachine$SoftApState;-><init>(Lcom/android/server/wifi/WifiStateMachine;)V
+PLcom/android/server/wifi/WifiStateMachine$SupplicantStartedState;-><init>(Lcom/android/server/wifi/WifiStateMachine;)V
+PLcom/android/server/wifi/WifiStateMachine$SupplicantStartedState;->enter()V
+PLcom/android/server/wifi/WifiStateMachine$SupplicantStartedState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/wifi/WifiStateMachine$SupplicantStartingState;-><init>(Lcom/android/server/wifi/WifiStateMachine;)V
+PLcom/android/server/wifi/WifiStateMachine$SupplicantStartingState;->initializeWpsDetails()V
+PLcom/android/server/wifi/WifiStateMachine$SupplicantStartingState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/wifi/WifiStateMachine$SupplicantStoppingState;-><init>(Lcom/android/server/wifi/WifiStateMachine;)V
+PLcom/android/server/wifi/WifiStateMachine$UntrustedWifiNetworkFactory;-><init>(Lcom/android/server/wifi/WifiStateMachine;Landroid/os/Looper;Landroid/content/Context;Ljava/lang/String;Landroid/net/NetworkCapabilities;)V
+PLcom/android/server/wifi/WifiStateMachine$UntrustedWifiNetworkFactory;->needNetworkFor(Landroid/net/NetworkRequest;I)V
+PLcom/android/server/wifi/WifiStateMachine$UntrustedWifiNetworkFactory;->releaseNetworkFor(Landroid/net/NetworkRequest;)V
+PLcom/android/server/wifi/WifiStateMachine$WaitForP2pDisableState;-><init>(Lcom/android/server/wifi/WifiStateMachine;)V
+PLcom/android/server/wifi/WifiStateMachine$WifiNetworkAgent;-><init>(Lcom/android/server/wifi/WifiStateMachine;Landroid/os/Looper;Landroid/content/Context;Ljava/lang/String;Landroid/net/NetworkInfo;Landroid/net/NetworkCapabilities;Landroid/net/LinkProperties;ILandroid/net/NetworkMisc;)V
+PLcom/android/server/wifi/WifiStateMachine$WifiNetworkAgent;->networkStatus(ILjava/lang/String;)V
+PLcom/android/server/wifi/WifiStateMachine$WifiNetworkAgent;->setSignalStrengthThresholds([I)V
+PLcom/android/server/wifi/WifiStateMachine$WifiNetworkFactory;-><init>(Lcom/android/server/wifi/WifiStateMachine;Landroid/os/Looper;Landroid/content/Context;Ljava/lang/String;Landroid/net/NetworkCapabilities;)V
+PLcom/android/server/wifi/WifiStateMachine$WifiNetworkFactory;->needNetworkFor(Landroid/net/NetworkRequest;I)V
+PLcom/android/server/wifi/WifiStateMachine$WifiNetworkFactory;->releaseNetworkFor(Landroid/net/NetworkRequest;)V
+PLcom/android/server/wifi/WifiStateMachine$WpsRunningState;-><init>(Lcom/android/server/wifi/WifiStateMachine;)V
+PLcom/android/server/wifi/WifiStateMachine;->-get0(Lcom/android/server/wifi/WifiStateMachine;)I
+PLcom/android/server/wifi/WifiStateMachine;->-get10(Lcom/android/server/wifi/WifiStateMachine;)Lcom/android/server/wifi/StateMachineDeathRecipient;
+PLcom/android/server/wifi/WifiStateMachine;->-get11(Lcom/android/server/wifi/WifiStateMachine;)Lcom/android/internal/util/State;
+PLcom/android/server/wifi/WifiStateMachine;->-get14(Lcom/android/server/wifi/WifiStateMachine;)Z
+PLcom/android/server/wifi/WifiStateMachine;->-get17(Lcom/android/server/wifi/WifiStateMachine;)Z
+PLcom/android/server/wifi/WifiStateMachine;->-get2(Lcom/android/server/wifi/WifiStateMachine;)Z
+PLcom/android/server/wifi/WifiStateMachine;->-get20(Lcom/android/server/wifi/WifiStateMachine;)Ljava/lang/String;
+PLcom/android/server/wifi/WifiStateMachine;->-get21(Lcom/android/server/wifi/WifiStateMachine;)Landroid/net/ip/IpManager;
+PLcom/android/server/wifi/WifiStateMachine;->-get23(Lcom/android/server/wifi/WifiStateMachine;)Z
+PLcom/android/server/wifi/WifiStateMachine;->-get24(Lcom/android/server/wifi/WifiStateMachine;)Ljava/lang/String;
+PLcom/android/server/wifi/WifiStateMachine;->-get26(Lcom/android/server/wifi/WifiStateMachine;)I
+PLcom/android/server/wifi/WifiStateMachine;->-get27(Lcom/android/server/wifi/WifiStateMachine;)Landroid/net/LinkProperties;
+PLcom/android/server/wifi/WifiStateMachine;->-get28(Lcom/android/server/wifi/WifiStateMachine;)Lcom/android/server/wifi/WifiStateMachine$WifiNetworkAgent;
+PLcom/android/server/wifi/WifiStateMachine;->-get29(Lcom/android/server/wifi/WifiStateMachine;)Landroid/net/NetworkCapabilities;
+PLcom/android/server/wifi/WifiStateMachine;->-get3(Lcom/android/server/wifi/WifiStateMachine;)Ljava/util/Queue;
+PLcom/android/server/wifi/WifiStateMachine;->-get30(Lcom/android/server/wifi/WifiStateMachine;)Landroid/net/NetworkInfo;
+PLcom/android/server/wifi/WifiStateMachine;->-get31(Lcom/android/server/wifi/WifiStateMachine;)Landroid/net/NetworkMisc;
+PLcom/android/server/wifi/WifiStateMachine;->-get32(Lcom/android/server/wifi/WifiStateMachine;)I
+PLcom/android/server/wifi/WifiStateMachine;->-get33(Lcom/android/server/wifi/WifiStateMachine;)Landroid/os/INetworkManagementService;
+PLcom/android/server/wifi/WifiStateMachine;->-get34(Lcom/android/server/wifi/WifiStateMachine;)Lcom/android/internal/util/State;
+PLcom/android/server/wifi/WifiStateMachine;->-get35(Lcom/android/server/wifi/WifiStateMachine;)I
+PLcom/android/server/wifi/WifiStateMachine;->-get36(Lcom/android/server/wifi/WifiStateMachine;)Ljava/util/concurrent/atomic/AtomicBoolean;
+PLcom/android/server/wifi/WifiStateMachine;->-get37(Lcom/android/server/wifi/WifiStateMachine;)Z
+PLcom/android/server/wifi/WifiStateMachine;->-get39(Lcom/android/server/wifi/WifiStateMachine;)I
+PLcom/android/server/wifi/WifiStateMachine;->-get4(Lcom/android/server/wifi/WifiStateMachine;)Landroid/net/wifi/IClientInterface;
+PLcom/android/server/wifi/WifiStateMachine;->-get40(Lcom/android/server/wifi/WifiStateMachine;)I
+PLcom/android/server/wifi/WifiStateMachine;->-get41(Lcom/android/server/wifi/WifiStateMachine;)Ljava/lang/String;
+PLcom/android/server/wifi/WifiStateMachine;->-get42(Lcom/android/server/wifi/WifiStateMachine;)Lcom/android/server/wifi/PropertyService;
+PLcom/android/server/wifi/WifiStateMachine;->-get45(Lcom/android/server/wifi/WifiStateMachine;)I
+PLcom/android/server/wifi/WifiStateMachine;->-get46(Lcom/android/server/wifi/WifiStateMachine;)Lcom/android/internal/util/State;
+PLcom/android/server/wifi/WifiStateMachine;->-get47(Lcom/android/server/wifi/WifiStateMachine;)Z
+PLcom/android/server/wifi/WifiStateMachine;->-get5(Lcom/android/server/wifi/WifiStateMachine;)Lcom/android/server/wifi/Clock;
+PLcom/android/server/wifi/WifiStateMachine;->-get50(Lcom/android/server/wifi/WifiStateMachine;)Lcom/android/internal/util/State;
+PLcom/android/server/wifi/WifiStateMachine;->-get51(Lcom/android/server/wifi/WifiStateMachine;)Lcom/android/internal/util/State;
+PLcom/android/server/wifi/WifiStateMachine;->-get52(Lcom/android/server/wifi/WifiStateMachine;)Lcom/android/server/wifi/SupplicantStateTracker;
+PLcom/android/server/wifi/WifiStateMachine;->-get54(Lcom/android/server/wifi/WifiStateMachine;)I
+PLcom/android/server/wifi/WifiStateMachine;->-get56(Lcom/android/server/wifi/WifiStateMachine;)I
+PLcom/android/server/wifi/WifiStateMachine;->-get57(Lcom/android/server/wifi/WifiStateMachine;)Ljava/lang/String;
+PLcom/android/server/wifi/WifiStateMachine;->-get58(Lcom/android/server/wifi/WifiStateMachine;)Ljava/lang/String;
+PLcom/android/server/wifi/WifiStateMachine;->-get59(Lcom/android/server/wifi/WifiStateMachine;)Z
+PLcom/android/server/wifi/WifiStateMachine;->-get6(Lcom/android/server/wifi/WifiStateMachine;)Lcom/android/internal/util/State;
+PLcom/android/server/wifi/WifiStateMachine;->-get61(Lcom/android/server/wifi/WifiStateMachine;)I
+PLcom/android/server/wifi/WifiStateMachine;->-get63(Lcom/android/server/wifi/WifiStateMachine;)Lcom/android/server/wifi/WifiNative$VendorHalDeathEventHandler;
+PLcom/android/server/wifi/WifiStateMachine;->-get64(Lcom/android/server/wifi/WifiStateMachine;)Z
+PLcom/android/server/wifi/WifiStateMachine;->-get66(Lcom/android/server/wifi/WifiStateMachine;)Lcom/android/server/wifi/WifiConfigManager;
+PLcom/android/server/wifi/WifiStateMachine;->-get68(Lcom/android/server/wifi/WifiStateMachine;)Lcom/android/server/wifi/WifiConnectivityManager;
+PLcom/android/server/wifi/WifiStateMachine;->-get69(Lcom/android/server/wifi/WifiStateMachine;)Lcom/android/server/wifi/BaseWifiDiagnostics;
+PLcom/android/server/wifi/WifiStateMachine;->-get7(Lcom/android/server/wifi/WifiStateMachine;)I
+PLcom/android/server/wifi/WifiStateMachine;->-get70(Lcom/android/server/wifi/WifiStateMachine;)Landroid/net/wifi/WifiInfo;
+PLcom/android/server/wifi/WifiStateMachine;->-get71(Lcom/android/server/wifi/WifiStateMachine;)Lcom/android/server/wifi/WifiInjector;
+PLcom/android/server/wifi/WifiStateMachine;->-get73(Lcom/android/server/wifi/WifiStateMachine;)Lcom/android/server/wifi/WifiMetrics;
+PLcom/android/server/wifi/WifiStateMachine;->-get74(Lcom/android/server/wifi/WifiStateMachine;)Lcom/android/server/wifi/WifiMonitor;
+PLcom/android/server/wifi/WifiStateMachine;->-get75(Lcom/android/server/wifi/WifiStateMachine;)Lcom/android/server/wifi/WifiNative;
+PLcom/android/server/wifi/WifiStateMachine;->-get76(Lcom/android/server/wifi/WifiStateMachine;)Lcom/android/internal/util/AsyncChannel;
+PLcom/android/server/wifi/WifiStateMachine;->-get77(Lcom/android/server/wifi/WifiStateMachine;)Ljava/lang/Object;
+PLcom/android/server/wifi/WifiStateMachine;->-get78(Lcom/android/server/wifi/WifiStateMachine;)Landroid/net/wifi/WifiScanner;
+PLcom/android/server/wifi/WifiStateMachine;->-get79(Lcom/android/server/wifi/WifiStateMachine;)Lcom/android/server/wifi/WifiScoreReport;
+PLcom/android/server/wifi/WifiStateMachine;->-get8(Lcom/android/server/wifi/WifiStateMachine;)Landroid/content/Context;
+PLcom/android/server/wifi/WifiStateMachine;->-get80(Lcom/android/server/wifi/WifiStateMachine;)Lcom/android/server/wifi/WifiStateTracker;
+PLcom/android/server/wifi/WifiStateMachine;->-get83(Lcom/android/server/wifi/WifiStateMachine;)Z
+PLcom/android/server/wifi/WifiStateMachine;->-get9(Lcom/android/server/wifi/WifiStateMachine;)Lcom/android/server/wifi/WifiCountryCode;
+PLcom/android/server/wifi/WifiStateMachine;->-set1(Lcom/android/server/wifi/WifiStateMachine;J)J
+PLcom/android/server/wifi/WifiStateMachine;->-set10(Lcom/android/server/wifi/WifiStateMachine;Z)Z
+PLcom/android/server/wifi/WifiStateMachine;->-set11(Lcom/android/server/wifi/WifiStateMachine;Z)Z
+PLcom/android/server/wifi/WifiStateMachine;->-set12(Lcom/android/server/wifi/WifiStateMachine;Z)Z
+PLcom/android/server/wifi/WifiStateMachine;->-set13(Lcom/android/server/wifi/WifiStateMachine;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/wifi/WifiStateMachine;->-set14(Lcom/android/server/wifi/WifiStateMachine;J)J
+PLcom/android/server/wifi/WifiStateMachine;->-set15(Lcom/android/server/wifi/WifiStateMachine;I)I
+PLcom/android/server/wifi/WifiStateMachine;->-set16(Lcom/android/server/wifi/WifiStateMachine;I)I
+PLcom/android/server/wifi/WifiStateMachine;->-set17(Lcom/android/server/wifi/WifiStateMachine;Lcom/android/server/wifi/WifiStateMachine$WifiNetworkAgent;)Lcom/android/server/wifi/WifiStateMachine$WifiNetworkAgent;
+PLcom/android/server/wifi/WifiStateMachine;->-set18(Lcom/android/server/wifi/WifiStateMachine;I)I
+PLcom/android/server/wifi/WifiStateMachine;->-set19(Lcom/android/server/wifi/WifiStateMachine;I)I
+PLcom/android/server/wifi/WifiStateMachine;->-set21(Lcom/android/server/wifi/WifiStateMachine;I)I
+PLcom/android/server/wifi/WifiStateMachine;->-set24(Lcom/android/server/wifi/WifiStateMachine;I)I
+PLcom/android/server/wifi/WifiStateMachine;->-set25(Lcom/android/server/wifi/WifiStateMachine;I)I
+PLcom/android/server/wifi/WifiStateMachine;->-set29(Lcom/android/server/wifi/WifiStateMachine;Lcom/android/server/wifi/WifiConnectivityManager;)Lcom/android/server/wifi/WifiConnectivityManager;
+PLcom/android/server/wifi/WifiStateMachine;->-set3(Lcom/android/server/wifi/WifiStateMachine;Landroid/net/wifi/IClientInterface;)Landroid/net/wifi/IClientInterface;
+PLcom/android/server/wifi/WifiStateMachine;->-set30(Lcom/android/server/wifi/WifiStateMachine;Landroid/net/wifi/WifiScanner;)Landroid/net/wifi/WifiScanner;
+PLcom/android/server/wifi/WifiStateMachine;->-set31(Lcom/android/server/wifi/WifiStateMachine;I)I
+PLcom/android/server/wifi/WifiStateMachine;->-set32(Lcom/android/server/wifi/WifiStateMachine;Landroid/net/wifi/WifiConfiguration;)Landroid/net/wifi/WifiConfiguration;
+PLcom/android/server/wifi/WifiStateMachine;->-set4(Lcom/android/server/wifi/WifiStateMachine;I)I
+PLcom/android/server/wifi/WifiStateMachine;->-set5(Lcom/android/server/wifi/WifiStateMachine;J)J
+PLcom/android/server/wifi/WifiStateMachine;->-set7(Lcom/android/server/wifi/WifiStateMachine;Z)Z
+PLcom/android/server/wifi/WifiStateMachine;->-set8(Lcom/android/server/wifi/WifiStateMachine;Z)Z
+PLcom/android/server/wifi/WifiStateMachine;->-set9(Lcom/android/server/wifi/WifiStateMachine;Z)Z
+PLcom/android/server/wifi/WifiStateMachine;->-wrap0(Lcom/android/server/wifi/WifiStateMachine;Landroid/os/Message;)Landroid/net/wifi/SupplicantState;
+PLcom/android/server/wifi/WifiStateMachine;->-wrap10(Lcom/android/server/wifi/WifiStateMachine;Landroid/net/wifi/WifiConfiguration;Ljava/lang/String;)Z
+PLcom/android/server/wifi/WifiStateMachine;->-wrap11(Lcom/android/server/wifi/WifiStateMachine;I)I
+PLcom/android/server/wifi/WifiStateMachine;->-wrap14(Lcom/android/server/wifi/WifiStateMachine;I)Ljava/lang/String;
+PLcom/android/server/wifi/WifiStateMachine;->-wrap18(Lcom/android/server/wifi/WifiStateMachine;)V
+PLcom/android/server/wifi/WifiStateMachine;->-wrap19(Lcom/android/server/wifi/WifiStateMachine;)V
+PLcom/android/server/wifi/WifiStateMachine;->-wrap21(Lcom/android/server/wifi/WifiStateMachine;Landroid/net/DhcpResults;)V
+PLcom/android/server/wifi/WifiStateMachine;->-wrap25(Lcom/android/server/wifi/WifiStateMachine;Landroid/os/Message;)V
+PLcom/android/server/wifi/WifiStateMachine;->-wrap27(Lcom/android/server/wifi/WifiStateMachine;)V
+PLcom/android/server/wifi/WifiStateMachine;->-wrap29(Lcom/android/server/wifi/WifiStateMachine;Landroid/os/Message;Lcom/android/internal/util/State;)V
+PLcom/android/server/wifi/WifiStateMachine;->-wrap33(Lcom/android/server/wifi/WifiStateMachine;Landroid/os/Message;II)V
+PLcom/android/server/wifi/WifiStateMachine;->-wrap34(Lcom/android/server/wifi/WifiStateMachine;Landroid/os/Message;ILjava/lang/Object;)V
+PLcom/android/server/wifi/WifiStateMachine;->-wrap35(Lcom/android/server/wifi/WifiStateMachine;II)V
+PLcom/android/server/wifi/WifiStateMachine;->-wrap36(Lcom/android/server/wifi/WifiStateMachine;Landroid/net/wifi/WifiConfiguration;Ljava/lang/String;I)V
+PLcom/android/server/wifi/WifiStateMachine;->-wrap37(Lcom/android/server/wifi/WifiStateMachine;)V
+PLcom/android/server/wifi/WifiStateMachine;->-wrap38(Lcom/android/server/wifi/WifiStateMachine;Ljava/lang/String;)V
+PLcom/android/server/wifi/WifiStateMachine;->-wrap40(Lcom/android/server/wifi/WifiStateMachine;Z)V
+PLcom/android/server/wifi/WifiStateMachine;->-wrap41(Lcom/android/server/wifi/WifiStateMachine;)V
+PLcom/android/server/wifi/WifiStateMachine;->-wrap43(Lcom/android/server/wifi/WifiStateMachine;IZ)V
+PLcom/android/server/wifi/WifiStateMachine;->-wrap45(Lcom/android/server/wifi/WifiStateMachine;I)V
+PLcom/android/server/wifi/WifiStateMachine;->-wrap46(Lcom/android/server/wifi/WifiStateMachine;)V
+PLcom/android/server/wifi/WifiStateMachine;->-wrap47(Lcom/android/server/wifi/WifiStateMachine;Landroid/net/LinkProperties;)V
+PLcom/android/server/wifi/WifiStateMachine;->-wrap5(Lcom/android/server/wifi/WifiStateMachine;)Z
+PLcom/android/server/wifi/WifiStateMachine;->-wrap7(Lcom/android/server/wifi/WifiStateMachine;I)Z
+PLcom/android/server/wifi/WifiStateMachine;->-wrap8(Lcom/android/server/wifi/WifiStateMachine;Landroid/net/NetworkInfo$DetailedState;)Z
+PLcom/android/server/wifi/WifiStateMachine;->-wrap9(Lcom/android/server/wifi/WifiStateMachine;)Z
+PLcom/android/server/wifi/WifiStateMachine;-><init>(Landroid/content/Context;Lcom/android/server/wifi/FrameworkFacade;Landroid/os/Looper;Landroid/os/UserManager;Lcom/android/server/wifi/WifiInjector;Lcom/android/server/wifi/BackupManagerProxy;Lcom/android/server/wifi/WifiCountryCode;Lcom/android/server/wifi/WifiNative;)V
+PLcom/android/server/wifi/WifiStateMachine;->checkAndSetConnectivityInstance()V
+PLcom/android/server/wifi/WifiStateMachine;->clearANQPCache()V
+PLcom/android/server/wifi/WifiStateMachine;->clearTargetBssid(Ljava/lang/String;)Z
+PLcom/android/server/wifi/WifiStateMachine;->configureVerboseHalLogging(Z)V
+PLcom/android/server/wifi/WifiStateMachine;->doNetworkStatus(I)V
+PLcom/android/server/wifi/WifiStateMachine;->enableRssiPolling(Z)V
+PLcom/android/server/wifi/WifiStateMachine;->enableVerboseLogging(I)V
+PLcom/android/server/wifi/WifiStateMachine;->fetchRssiLinkSpeedAndFrequencyNative()V
+PLcom/android/server/wifi/WifiStateMachine;->getAdditionalWifiServiceInterfaces()V
+PLcom/android/server/wifi/WifiStateMachine;->getCurrentScanResult()Landroid/net/wifi/ScanResult;
+PLcom/android/server/wifi/WifiStateMachine;->getCurrentWifiConfiguration()Landroid/net/wifi/WifiConfiguration;
+PLcom/android/server/wifi/WifiStateMachine;->getLinkPropertiesSummary(Landroid/net/LinkProperties;)Ljava/lang/String;
+PLcom/android/server/wifi/WifiStateMachine;->getLogRecString(Landroid/os/Message;)Ljava/lang/String;
+PLcom/android/server/wifi/WifiStateMachine;->getNetworkDetailedState()Landroid/net/NetworkInfo$DetailedState;
+PLcom/android/server/wifi/WifiStateMachine;->getWifiLinkLayerStats()Landroid/net/wifi/WifiLinkLayerStats;
+PLcom/android/server/wifi/WifiStateMachine;->handleIPv4Success(Landroid/net/DhcpResults;)V
+PLcom/android/server/wifi/WifiStateMachine;->handlePostDhcpSetup()V
+PLcom/android/server/wifi/WifiStateMachine;->handlePreDhcpSetup()V
+PLcom/android/server/wifi/WifiStateMachine;->handleScanRequest(Landroid/os/Message;)V
+PLcom/android/server/wifi/WifiStateMachine;->handleScreenStateChanged(Z)V
+PLcom/android/server/wifi/WifiStateMachine;->handleSuccessfulIpConfiguration()V
+PLcom/android/server/wifi/WifiStateMachine;->handleSupplicantStateChange(Landroid/os/Message;)Landroid/net/wifi/SupplicantState;
+PLcom/android/server/wifi/WifiStateMachine;->handleUserUnlock(I)V
+PLcom/android/server/wifi/WifiStateMachine;->hasConnectionRequests()Z
+PLcom/android/server/wifi/WifiStateMachine;->isConnected()Z
+PLcom/android/server/wifi/WifiStateMachine;->isDisconnected()Z
+PLcom/android/server/wifi/WifiStateMachine;->isLinkDebouncing()Z
+PLcom/android/server/wifi/WifiStateMachine;->isSupplicantTransientState()Z
+PLcom/android/server/wifi/WifiStateMachine;->log(Ljava/lang/String;)V
+PLcom/android/server/wifi/WifiStateMachine;->logStateAndMessage(Landroid/os/Message;Lcom/android/internal/util/State;)V
+PLcom/android/server/wifi/WifiStateMachine;->logd(Ljava/lang/String;)V
+PLcom/android/server/wifi/WifiStateMachine;->lookupFrameworkNetworkId(I)I
+PLcom/android/server/wifi/WifiStateMachine;->maybeRegisterNetworkFactory()V
+PLcom/android/server/wifi/WifiStateMachine;->obtainMessageWithWhatAndArg2(Landroid/os/Message;I)Landroid/os/Message;
+PLcom/android/server/wifi/WifiStateMachine;->p2pSendMessage(I)Z
+PLcom/android/server/wifi/WifiStateMachine;->p2pSendMessage(II)Z
+PLcom/android/server/wifi/WifiStateMachine;->recordLogRec(Landroid/os/Message;)Z
+PLcom/android/server/wifi/WifiStateMachine;->registerConnected()V
+PLcom/android/server/wifi/WifiStateMachine;->reloadTlsNetworksAndReconnect()V
+PLcom/android/server/wifi/WifiStateMachine;->replyToMessage(Landroid/os/Message;II)V
+PLcom/android/server/wifi/WifiStateMachine;->replyToMessage(Landroid/os/Message;ILjava/lang/Object;)V
+PLcom/android/server/wifi/WifiStateMachine;->reportConnectionAttemptEnd(II)V
+PLcom/android/server/wifi/WifiStateMachine;->reportConnectionAttemptStart(Landroid/net/wifi/WifiConfiguration;Ljava/lang/String;I)V
+PLcom/android/server/wifi/WifiStateMachine;->reportOnTime()Ljava/lang/String;
+PLcom/android/server/wifi/WifiStateMachine;->resetSimAuthNetworks(Z)V
+PLcom/android/server/wifi/WifiStateMachine;->sendConnectedState()V
+PLcom/android/server/wifi/WifiStateMachine;->sendLinkConfigurationChangedBroadcast()V
+PLcom/android/server/wifi/WifiStateMachine;->sendNetworkStateChangeBroadcast(Ljava/lang/String;)V
+PLcom/android/server/wifi/WifiStateMachine;->sendRssiChangeBroadcast(I)V
+PLcom/android/server/wifi/WifiStateMachine;->sendSupplicantConnectionChangedBroadcast(Z)V
+PLcom/android/server/wifi/WifiStateMachine;->setHighPerfModeEnabled(Z)V
+PLcom/android/server/wifi/WifiStateMachine;->setNetworkDetailedState(Landroid/net/NetworkInfo$DetailedState;)Z
+PLcom/android/server/wifi/WifiStateMachine;->setOperationalMode(I)V
+PLcom/android/server/wifi/WifiStateMachine;->setRandomMacOui()Z
+PLcom/android/server/wifi/WifiStateMachine;->setScanResults()V
+PLcom/android/server/wifi/WifiStateMachine;->setSupplicantLogLevel()V
+PLcom/android/server/wifi/WifiStateMachine;->setSupplicantRunning(Z)V
+PLcom/android/server/wifi/WifiStateMachine;->setSuspendOptimizations(IZ)V
+PLcom/android/server/wifi/WifiStateMachine;->setSuspendOptimizationsNative(IZ)V
+PLcom/android/server/wifi/WifiStateMachine;->setTargetBssid(Landroid/net/wifi/WifiConfiguration;Ljava/lang/String;)Z
+PLcom/android/server/wifi/WifiStateMachine;->setWifiState(I)V
+PLcom/android/server/wifi/WifiStateMachine;->smToString(I)Ljava/lang/String;
+PLcom/android/server/wifi/WifiStateMachine;->smToString(Landroid/os/Message;)Ljava/lang/String;
+PLcom/android/server/wifi/WifiStateMachine;->startConnectToNetwork(ILjava/lang/String;)V
+PLcom/android/server/wifi/WifiStateMachine;->startFilteringMulticastPackets()V
+PLcom/android/server/wifi/WifiStateMachine;->startScan(IILandroid/net/wifi/ScanSettings;Landroid/os/WorkSource;)V
+PLcom/android/server/wifi/WifiStateMachine;->startScanNative(Ljava/util/Set;Ljava/util/List;Landroid/os/WorkSource;)Z
+PLcom/android/server/wifi/WifiStateMachine;->stopFilteringMulticastPackets()V
+PLcom/android/server/wifi/WifiStateMachine;->stopIpManager()V
+PLcom/android/server/wifi/WifiStateMachine;->stopRssiMonitoringOffload()I
+PLcom/android/server/wifi/WifiStateMachine;->syncGetConfiguredNetworks(ILcom/android/internal/util/AsyncChannel;)Ljava/util/List;
+PLcom/android/server/wifi/WifiStateMachine;->syncGetDhcpResults()Landroid/net/DhcpResults;
+PLcom/android/server/wifi/WifiStateMachine;->syncGetLinkLayerStats(Lcom/android/internal/util/AsyncChannel;)Landroid/net/wifi/WifiLinkLayerStats;
+PLcom/android/server/wifi/WifiStateMachine;->syncGetSupportedFeatures(Lcom/android/internal/util/AsyncChannel;)I
+PLcom/android/server/wifi/WifiStateMachine;->syncGetWifiApState()I
+PLcom/android/server/wifi/WifiStateMachine;->syncGetWifiState()I
+PLcom/android/server/wifi/WifiStateMachine;->syncInitialize(Lcom/android/internal/util/AsyncChannel;)Z
+PLcom/android/server/wifi/WifiStateMachine;->updateBatteryWorkSource(Landroid/os/WorkSource;)V
+PLcom/android/server/wifi/WifiStateMachine;->updateCapabilities(Landroid/net/wifi/WifiConfiguration;)V
+PLcom/android/server/wifi/WifiStateMachine;->updateDefaultRouteMacAddress(I)Ljava/lang/String;
+PLcom/android/server/wifi/WifiStateMachine;->updateLinkProperties(Landroid/net/LinkProperties;)V
+PLcom/android/server/wifi/WifiStateTracker;-><init>(Lcom/android/internal/app/IBatteryStats;)V
+PLcom/android/server/wifi/WifiStateTracker;->informWifiStateBatteryStats(I)V
+PLcom/android/server/wifi/WifiStateTracker;->updateState(I)V
+PLcom/android/server/wifi/WifiTrafficPoller$1;-><init>(Lcom/android/server/wifi/WifiTrafficPoller;)V
+PLcom/android/server/wifi/WifiTrafficPoller$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/wifi/WifiTrafficPoller$TrafficHandler;-><init>(Lcom/android/server/wifi/WifiTrafficPoller;Landroid/os/Looper;)V
+PLcom/android/server/wifi/WifiTrafficPoller$TrafficHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/wifi/WifiTrafficPoller;->-get0(Lcom/android/server/wifi/WifiTrafficPoller;)Ljava/util/List;
+PLcom/android/server/wifi/WifiTrafficPoller;->-get1(Lcom/android/server/wifi/WifiTrafficPoller;)Z
+PLcom/android/server/wifi/WifiTrafficPoller;->-get3(Lcom/android/server/wifi/WifiTrafficPoller;)I
+PLcom/android/server/wifi/WifiTrafficPoller;->-get4(Lcom/android/server/wifi/WifiTrafficPoller;)Z
+PLcom/android/server/wifi/WifiTrafficPoller;->-set0(Lcom/android/server/wifi/WifiTrafficPoller;Z)Z
+PLcom/android/server/wifi/WifiTrafficPoller;->-set1(Lcom/android/server/wifi/WifiTrafficPoller;Landroid/net/NetworkInfo;)Landroid/net/NetworkInfo;
+PLcom/android/server/wifi/WifiTrafficPoller;->-set2(Lcom/android/server/wifi/WifiTrafficPoller;I)I
+PLcom/android/server/wifi/WifiTrafficPoller;->-wrap0(Lcom/android/server/wifi/WifiTrafficPoller;)V
+PLcom/android/server/wifi/WifiTrafficPoller;->-wrap1(Lcom/android/server/wifi/WifiTrafficPoller;)V
+PLcom/android/server/wifi/WifiTrafficPoller;-><init>(Landroid/content/Context;Landroid/os/Looper;Ljava/lang/String;)V
+PLcom/android/server/wifi/WifiTrafficPoller;->addClient(Landroid/os/Messenger;)V
+PLcom/android/server/wifi/WifiTrafficPoller;->evaluateTrafficStatsPolling()V
+PLcom/android/server/wifi/WifiTrafficPoller;->notifyOnDataActivity()V
+PLcom/android/server/wifi/WifiVendorHal$1AnswerBox;-><init>(Lcom/android/server/wifi/WifiVendorHal;)V
+PLcom/android/server/wifi/WifiVendorHal$4AnswerBox;-><init>(Lcom/android/server/wifi/WifiVendorHal;)V
+PLcom/android/server/wifi/WifiVendorHal$5AnswerBox;-><init>(Lcom/android/server/wifi/WifiVendorHal;)V
+PLcom/android/server/wifi/WifiVendorHal$6AnswerBox;-><init>(Lcom/android/server/wifi/WifiVendorHal;)V
+PLcom/android/server/wifi/WifiVendorHal$ChipEventCallback;-><init>(Lcom/android/server/wifi/WifiVendorHal;)V
+PLcom/android/server/wifi/WifiVendorHal$ChipEventCallback;-><init>(Lcom/android/server/wifi/WifiVendorHal;Lcom/android/server/wifi/WifiVendorHal$ChipEventCallback;)V
+PLcom/android/server/wifi/WifiVendorHal$HalDeviceManagerStatusListener;-><init>(Lcom/android/server/wifi/WifiVendorHal;)V
+PLcom/android/server/wifi/WifiVendorHal$HalDeviceManagerStatusListener;->onStatusChanged()V
+PLcom/android/server/wifi/WifiVendorHal$RttEventCallback;-><init>(Lcom/android/server/wifi/WifiVendorHal;)V
+PLcom/android/server/wifi/WifiVendorHal$RttEventCallback;-><init>(Lcom/android/server/wifi/WifiVendorHal;Lcom/android/server/wifi/WifiVendorHal$RttEventCallback;)V
+PLcom/android/server/wifi/WifiVendorHal$StaIfaceEventCallback;-><init>(Lcom/android/server/wifi/WifiVendorHal;)V
+PLcom/android/server/wifi/WifiVendorHal$StaIfaceEventCallback;-><init>(Lcom/android/server/wifi/WifiVendorHal;Lcom/android/server/wifi/WifiVendorHal$StaIfaceEventCallback;)V
+PLcom/android/server/wifi/WifiVendorHal;->-get1(Lcom/android/server/wifi/WifiVendorHal;)Lcom/android/server/wifi/HalDeviceManager;
+PLcom/android/server/wifi/WifiVendorHal;->-get2(Lcom/android/server/wifi/WifiVendorHal;)Landroid/os/Handler;
+PLcom/android/server/wifi/WifiVendorHal;->-get3(Lcom/android/server/wifi/WifiVendorHal;)Lcom/android/server/wifi/WifiNative$WifiLoggerEventHandler;
+PLcom/android/server/wifi/WifiVendorHal;->-get7()Landroid/net/apf/ApfCapabilities;
+PLcom/android/server/wifi/WifiVendorHal;->-wrap3(Landroid/hardware/wifi/V1_0/WifiDebugRingBufferStatus;)Lcom/android/server/wifi/WifiNative$RingBufferStatus;
+PLcom/android/server/wifi/WifiVendorHal;-><init>(Lcom/android/server/wifi/HalDeviceManager;Landroid/os/Looper;)V
+PLcom/android/server/wifi/WifiVendorHal;->boolResult(Z)Z
+PLcom/android/server/wifi/WifiVendorHal;->configureNeighborDiscoveryOffload(Z)Z
+PLcom/android/server/wifi/WifiVendorHal;->configureRoaming(Lcom/android/server/wifi/WifiNative$RoamingConfig;)Z
+PLcom/android/server/wifi/WifiVendorHal;->enableLinkLayerStats()V
+PLcom/android/server/wifi/WifiVendorHal;->enableVerboseLogging(Z)V
+PLcom/android/server/wifi/WifiVendorHal;->enter(Ljava/lang/String;)Lcom/android/server/wifi/WifiLog$LogMessage;
+PLcom/android/server/wifi/WifiVendorHal;->getApfCapabilities()Landroid/net/apf/ApfCapabilities;
+PLcom/android/server/wifi/WifiVendorHal;->getBgScanCapabilities(Lcom/android/server/wifi/WifiNative$ScanCapabilities;)Z
+PLcom/android/server/wifi/WifiVendorHal;->getChannelsForBand(I)[I
+PLcom/android/server/wifi/WifiVendorHal;->getDriverVersion()Ljava/lang/String;
+PLcom/android/server/wifi/WifiVendorHal;->getFirmwareVersion()Ljava/lang/String;
+PLcom/android/server/wifi/WifiVendorHal;->getRingBufferStatus()[Lcom/android/server/wifi/WifiNative$RingBufferStatus;
+PLcom/android/server/wifi/WifiVendorHal;->getRoamingCapabilities(Lcom/android/server/wifi/WifiNative$RoamingCapabilities;)Z
+PLcom/android/server/wifi/WifiVendorHal;->getRxPktFates([Lcom/android/server/wifi/WifiNative$RxFateReport;)Z
+PLcom/android/server/wifi/WifiVendorHal;->getSupportedFeatureSet()I
+PLcom/android/server/wifi/WifiVendorHal;->getSupportedLoggerFeatureSet()I
+PLcom/android/server/wifi/WifiVendorHal;->getTxPktFates([Lcom/android/server/wifi/WifiNative$TxFateReport;)Z
+PLcom/android/server/wifi/WifiVendorHal;->getWifiLinkLayerStats()Landroid/net/wifi/WifiLinkLayerStats;
+PLcom/android/server/wifi/WifiVendorHal;->halToFrameworkPktFateFrameType(I)B
+PLcom/android/server/wifi/WifiVendorHal;->halToFrameworkRxPktFate(I)B
+PLcom/android/server/wifi/WifiVendorHal;->halToFrameworkTxPktFate(I)B
+PLcom/android/server/wifi/WifiVendorHal;->initialize(Lcom/android/server/wifi/WifiNative$VendorHalDeathEventHandler;)Z
+PLcom/android/server/wifi/WifiVendorHal;->installPacketFilter([B)Z
+PLcom/android/server/wifi/WifiVendorHal;->intArrayFromArrayList(Ljava/util/ArrayList;)[I
+PLcom/android/server/wifi/WifiVendorHal;->isVendorHalSupported()Z
+PLcom/android/server/wifi/WifiVendorHal;->lambda$-com_android_server_wifi_WifiVendorHal_15968(Lcom/android/server/wifi/WifiNative$ScanCapabilities;Landroid/util/MutableBoolean;Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/StaBackgroundScanCapabilities;)V
+PLcom/android/server/wifi/WifiVendorHal;->lambda$-com_android_server_wifi_WifiVendorHal_25531(Lcom/android/server/wifi/WifiVendorHal$1AnswerBox;Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/StaLinkLayerStats;)V
+PLcom/android/server/wifi/WifiVendorHal;->lambda$-com_android_server_wifi_WifiVendorHal_32084(Landroid/util/MutableInt;Landroid/hardware/wifi/V1_0/WifiStatus;I)V
+PLcom/android/server/wifi/WifiVendorHal;->lambda$-com_android_server_wifi_WifiVendorHal_54711(Lcom/android/server/wifi/WifiVendorHal$4AnswerBox;Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/WifiVendorHal;->lambda$-com_android_server_wifi_WifiVendorHal_57111(Lcom/android/server/wifi/WifiVendorHal$5AnswerBox;Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/StaApfPacketFilterCapabilities;)V
+PLcom/android/server/wifi/WifiVendorHal;->lambda$-com_android_server_wifi_WifiVendorHal_64028(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/IWifiChip$ChipDebugInfo;)V
+PLcom/android/server/wifi/WifiVendorHal;->lambda$-com_android_server_wifi_WifiVendorHal_66971(Lcom/android/server/wifi/WifiVendorHal$6AnswerBox;Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/WifiVendorHal;->lambda$-com_android_server_wifi_WifiVendorHal_73803([Lcom/android/server/wifi/WifiNative$TxFateReport;Landroid/util/MutableBoolean;Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/WifiVendorHal;->lambda$-com_android_server_wifi_WifiVendorHal_75590([Lcom/android/server/wifi/WifiNative$RxFateReport;Landroid/util/MutableBoolean;Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/WifiVendorHal;->lambda$-com_android_server_wifi_WifiVendorHal_84658(Lcom/android/server/wifi/WifiNative$RoamingCapabilities;Landroid/util/MutableBoolean;Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/StaRoamingCapabilities;)V
+PLcom/android/server/wifi/WifiVendorHal;->makeRingBufferStatusArray(Ljava/util/ArrayList;)[Lcom/android/server/wifi/WifiNative$RingBufferStatus;
+PLcom/android/server/wifi/WifiVendorHal;->makeWifiBandFromFrameworkBand(I)I
+PLcom/android/server/wifi/WifiVendorHal;->niceMethodName([Ljava/lang/StackTraceElement;I)Ljava/lang/String;
+PLcom/android/server/wifi/WifiVendorHal;->ok(Landroid/hardware/wifi/V1_0/WifiStatus;)Z
+PLcom/android/server/wifi/WifiVendorHal;->registerChipCallback()Z
+PLcom/android/server/wifi/WifiVendorHal;->registerRttEventCallback()Z
+PLcom/android/server/wifi/WifiVendorHal;->registerStaIfaceCallback()Z
+PLcom/android/server/wifi/WifiVendorHal;->requestChipDebugInfo()V
+PLcom/android/server/wifi/WifiVendorHal;->setLoggingEventHandler(Lcom/android/server/wifi/WifiNative$WifiLoggerEventHandler;)Z
+PLcom/android/server/wifi/WifiVendorHal;->setScanningMacOui([B)Z
+PLcom/android/server/wifi/WifiVendorHal;->startLoggingRingBuffer(IIIILjava/lang/String;)Z
+PLcom/android/server/wifi/WifiVendorHal;->startPktFateMonitoring()Z
+PLcom/android/server/wifi/WifiVendorHal;->startVendorHal(Z)Z
+PLcom/android/server/wifi/WifiVendorHal;->stopRssiMonitoring()I
+PLcom/android/server/wifi/WifiVendorHal;->wifiFeatureMaskFromStaCapabilities(I)I
+PLcom/android/server/wifi/WificondControl$PnoScanEventHandler;-><init>(Lcom/android/server/wifi/WificondControl;)V
+PLcom/android/server/wifi/WificondControl$PnoScanEventHandler;-><init>(Lcom/android/server/wifi/WificondControl;Lcom/android/server/wifi/WificondControl$PnoScanEventHandler;)V
+PLcom/android/server/wifi/WificondControl$ScanEventHandler;-><init>(Lcom/android/server/wifi/WificondControl;)V
+PLcom/android/server/wifi/WificondControl$ScanEventHandler;-><init>(Lcom/android/server/wifi/WificondControl;Lcom/android/server/wifi/WificondControl$ScanEventHandler;)V
+PLcom/android/server/wifi/WificondControl$ScanEventHandler;->OnScanResultReady()V
+PLcom/android/server/wifi/WificondControl;->-get0(Lcom/android/server/wifi/WificondControl;)Ljava/lang/String;
+PLcom/android/server/wifi/WificondControl;->-get1(Lcom/android/server/wifi/WificondControl;)Lcom/android/server/wifi/WifiMonitor;
+PLcom/android/server/wifi/WificondControl;-><init>(Lcom/android/server/wifi/WifiInjector;Lcom/android/server/wifi/WifiMonitor;)V
+PLcom/android/server/wifi/WificondControl;->abortScan()V
+PLcom/android/server/wifi/WificondControl;->enableSupplicant()Z
+PLcom/android/server/wifi/WificondControl;->enableVerboseLogging(Z)V
+PLcom/android/server/wifi/WificondControl;->scan(Ljava/util/Set;Ljava/util/Set;)Z
+PLcom/android/server/wifi/WificondControl;->setupDriverForClientMode()Landroid/net/wifi/IClientInterface;
+PLcom/android/server/wifi/WificondControl;->signalPoll()Lcom/android/server/wifi/WifiNative$SignalPollResult;
+PLcom/android/server/wifi/WificondControl;->tearDownInterfaces()Z
+PLcom/android/server/wifi/aware/WifiAwareMetrics$HistParms;-><init>(IIIII)V
+PLcom/android/server/wifi/aware/WifiAwareMetrics;-><init>(Lcom/android/server/wifi/Clock;)V
+PLcom/android/server/wifi/hotspot2/ANQPRequestManager;-><init>(Lcom/android/server/wifi/hotspot2/PasspointEventHandler;Lcom/android/server/wifi/Clock;)V
+PLcom/android/server/wifi/hotspot2/AnqpCache;-><init>(Lcom/android/server/wifi/Clock;)V
+PLcom/android/server/wifi/hotspot2/CertificateVerifier;-><init>()V
+PLcom/android/server/wifi/hotspot2/LegacyPasspointConfigParser;-><init>()V
+PLcom/android/server/wifi/hotspot2/NetworkDetail$Ant;-><init>(Ljava/lang/String;I)V
+PLcom/android/server/wifi/hotspot2/NetworkDetail$Ant;->values()[Lcom/android/server/wifi/hotspot2/NetworkDetail$Ant;
+PLcom/android/server/wifi/hotspot2/NetworkDetail$HSRelease;-><init>(Ljava/lang/String;I)V
+PLcom/android/server/wifi/hotspot2/NetworkDetail;->getAnqpDomainID()I
+PLcom/android/server/wifi/hotspot2/NetworkDetail;->getAnt()Lcom/android/server/wifi/hotspot2/NetworkDetail$Ant;
+PLcom/android/server/wifi/hotspot2/NetworkDetail;->getBSSIDString()Ljava/lang/String;
+PLcom/android/server/wifi/hotspot2/NetworkDetail;->getCenterfreq0()I
+PLcom/android/server/wifi/hotspot2/NetworkDetail;->getCenterfreq1()I
+PLcom/android/server/wifi/hotspot2/NetworkDetail;->getChannelWidth()I
+PLcom/android/server/wifi/hotspot2/NetworkDetail;->getDtimInterval()I
+PLcom/android/server/wifi/hotspot2/NetworkDetail;->getHESSID()J
+PLcom/android/server/wifi/hotspot2/NetworkDetail;->getHSRelease()Lcom/android/server/wifi/hotspot2/NetworkDetail$HSRelease;
+PLcom/android/server/wifi/hotspot2/NetworkDetail;->getOsuProviders()[B
+PLcom/android/server/wifi/hotspot2/NetworkDetail;->getSSID()Ljava/lang/String;
+PLcom/android/server/wifi/hotspot2/NetworkDetail;->getWifiMode()I
+PLcom/android/server/wifi/hotspot2/NetworkDetail;->is80211McResponderSupport()Z
+PLcom/android/server/wifi/hotspot2/NetworkDetail;->isBeaconFrame()Z
+PLcom/android/server/wifi/hotspot2/NetworkDetail;->isHiddenBeaconFrame()Z
+PLcom/android/server/wifi/hotspot2/NetworkDetail;->isInterworking()Z
+PLcom/android/server/wifi/hotspot2/NetworkDetail;->toMACString(J)Ljava/lang/String;
+PLcom/android/server/wifi/hotspot2/PasspointConfigStoreData;-><init>(Lcom/android/server/wifi/WifiKeyStore;Lcom/android/server/wifi/SIMAccessor;Lcom/android/server/wifi/hotspot2/PasspointConfigStoreData$DataSource;)V
+PLcom/android/server/wifi/hotspot2/PasspointConfigStoreData;->deserializeData(Lorg/xmlpull/v1/XmlPullParser;IZ)V
+PLcom/android/server/wifi/hotspot2/PasspointConfigStoreData;->deserializeProviderList(Lorg/xmlpull/v1/XmlPullParser;I)Ljava/util/List;
+PLcom/android/server/wifi/hotspot2/PasspointConfigStoreData;->deserializeShareData(Lorg/xmlpull/v1/XmlPullParser;I)V
+PLcom/android/server/wifi/hotspot2/PasspointConfigStoreData;->deserializeUserData(Lorg/xmlpull/v1/XmlPullParser;I)V
+PLcom/android/server/wifi/hotspot2/PasspointConfigStoreData;->getName()Ljava/lang/String;
+PLcom/android/server/wifi/hotspot2/PasspointConfigStoreData;->resetData(Z)V
+PLcom/android/server/wifi/hotspot2/PasspointConfigStoreData;->resetShareData()V
+PLcom/android/server/wifi/hotspot2/PasspointConfigStoreData;->resetUserData()V
+PLcom/android/server/wifi/hotspot2/PasspointConfigStoreData;->serializeData(Lorg/xmlpull/v1/XmlSerializer;Z)V
+PLcom/android/server/wifi/hotspot2/PasspointConfigStoreData;->serializeProviderList(Lorg/xmlpull/v1/XmlSerializer;Ljava/util/List;)V
+PLcom/android/server/wifi/hotspot2/PasspointConfigStoreData;->serializeShareData(Lorg/xmlpull/v1/XmlSerializer;)V
+PLcom/android/server/wifi/hotspot2/PasspointConfigStoreData;->serializeUserData(Lorg/xmlpull/v1/XmlSerializer;)V
+PLcom/android/server/wifi/hotspot2/PasspointConfigStoreData;->supportShareData()Z
+PLcom/android/server/wifi/hotspot2/PasspointEventHandler;-><init>(Lcom/android/server/wifi/WifiNative;Lcom/android/server/wifi/hotspot2/PasspointEventHandler$Callbacks;)V
+PLcom/android/server/wifi/hotspot2/PasspointManager$CallbackHandler;-><init>(Lcom/android/server/wifi/hotspot2/PasspointManager;Landroid/content/Context;)V
+PLcom/android/server/wifi/hotspot2/PasspointManager$DataSourceHandler;-><init>(Lcom/android/server/wifi/hotspot2/PasspointManager;)V
+PLcom/android/server/wifi/hotspot2/PasspointManager$DataSourceHandler;-><init>(Lcom/android/server/wifi/hotspot2/PasspointManager;Lcom/android/server/wifi/hotspot2/PasspointManager$DataSourceHandler;)V
+PLcom/android/server/wifi/hotspot2/PasspointManager$DataSourceHandler;->getProviderIndex()J
+PLcom/android/server/wifi/hotspot2/PasspointManager$DataSourceHandler;->getProviders()Ljava/util/List;
+PLcom/android/server/wifi/hotspot2/PasspointManager$DataSourceHandler;->setProviderIndex(J)V
+PLcom/android/server/wifi/hotspot2/PasspointManager$DataSourceHandler;->setProviders(Ljava/util/List;)V
+PLcom/android/server/wifi/hotspot2/PasspointManager;->-get2(Lcom/android/server/wifi/hotspot2/PasspointManager;)J
+PLcom/android/server/wifi/hotspot2/PasspointManager;->-get3(Lcom/android/server/wifi/hotspot2/PasspointManager;)Ljava/util/Map;
+PLcom/android/server/wifi/hotspot2/PasspointManager;->-set0(Lcom/android/server/wifi/hotspot2/PasspointManager;J)J
+PLcom/android/server/wifi/hotspot2/PasspointManager;-><init>(Landroid/content/Context;Lcom/android/server/wifi/WifiNative;Lcom/android/server/wifi/WifiKeyStore;Lcom/android/server/wifi/Clock;Lcom/android/server/wifi/SIMAccessor;Lcom/android/server/wifi/hotspot2/PasspointObjectFactory;Lcom/android/server/wifi/WifiConfigManager;Lcom/android/server/wifi/WifiConfigStore;)V
+PLcom/android/server/wifi/hotspot2/PasspointNetworkEvaluator;-><init>(Lcom/android/server/wifi/hotspot2/PasspointManager;Lcom/android/server/wifi/WifiConfigManager;Landroid/util/LocalLog;)V
+PLcom/android/server/wifi/hotspot2/PasspointNetworkEvaluator;->update(Ljava/util/List;)V
+PLcom/android/server/wifi/hotspot2/PasspointObjectFactory;-><init>()V
+PLcom/android/server/wifi/hotspot2/PasspointObjectFactory;->makeANQPRequestManager(Lcom/android/server/wifi/hotspot2/PasspointEventHandler;Lcom/android/server/wifi/Clock;)Lcom/android/server/wifi/hotspot2/ANQPRequestManager;
+PLcom/android/server/wifi/hotspot2/PasspointObjectFactory;->makeAnqpCache(Lcom/android/server/wifi/Clock;)Lcom/android/server/wifi/hotspot2/AnqpCache;
+PLcom/android/server/wifi/hotspot2/PasspointObjectFactory;->makeCertificateVerifier()Lcom/android/server/wifi/hotspot2/CertificateVerifier;
+PLcom/android/server/wifi/hotspot2/PasspointObjectFactory;->makePasspointConfigStoreData(Lcom/android/server/wifi/WifiKeyStore;Lcom/android/server/wifi/SIMAccessor;Lcom/android/server/wifi/hotspot2/PasspointConfigStoreData$DataSource;)Lcom/android/server/wifi/hotspot2/PasspointConfigStoreData;
+PLcom/android/server/wifi/hotspot2/PasspointObjectFactory;->makePasspointEventHandler(Lcom/android/server/wifi/WifiNative;Lcom/android/server/wifi/hotspot2/PasspointEventHandler$Callbacks;)Lcom/android/server/wifi/hotspot2/PasspointEventHandler;
+PLcom/android/server/wifi/hotspot2/anqp/Constants$ANQPElementType;-><init>(Ljava/lang/String;I)V
+PLcom/android/server/wifi/p2p/-$Lambda$gT4KmMIiMXRpxldJVwXfElmESAo$19;-><init>(BLjava/lang/Object;)V
+PLcom/android/server/wifi/p2p/-$Lambda$gT4KmMIiMXRpxldJVwXfElmESAo$1;->$m$0(Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;Landroid/hardware/wifi/supplicant/V1_0/ISupplicantIface;)V
+PLcom/android/server/wifi/p2p/-$Lambda$gT4KmMIiMXRpxldJVwXfElmESAo$1;-><init>(Ljava/lang/Object;)V
+PLcom/android/server/wifi/p2p/-$Lambda$gT4KmMIiMXRpxldJVwXfElmESAo$1;->onValues(Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;Landroid/hardware/wifi/supplicant/V1_0/ISupplicantIface;)V
+PLcom/android/server/wifi/p2p/-$Lambda$gT4KmMIiMXRpxldJVwXfElmESAo$2;->$m$0(Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/p2p/-$Lambda$gT4KmMIiMXRpxldJVwXfElmESAo$2;-><init>(Ljava/lang/Object;)V
+PLcom/android/server/wifi/p2p/-$Lambda$gT4KmMIiMXRpxldJVwXfElmESAo$2;->onValues(Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/p2p/-$Lambda$gT4KmMIiMXRpxldJVwXfElmESAo$5;->$m$0(Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/p2p/-$Lambda$gT4KmMIiMXRpxldJVwXfElmESAo$5;-><init>(Ljava/lang/Object;)V
+PLcom/android/server/wifi/p2p/-$Lambda$gT4KmMIiMXRpxldJVwXfElmESAo$5;->onValues(Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/p2p/-$Lambda$gT4KmMIiMXRpxldJVwXfElmESAo$9;->$m$0(Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;[B)V
+PLcom/android/server/wifi/p2p/-$Lambda$gT4KmMIiMXRpxldJVwXfElmESAo$9;-><init>(Ljava/lang/Object;)V
+PLcom/android/server/wifi/p2p/-$Lambda$gT4KmMIiMXRpxldJVwXfElmESAo$9;->onValues(Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;[B)V
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceCallback;-><init>(Ljava/lang/String;Lcom/android/server/wifi/p2p/WifiP2pMonitor;)V
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal$1;-><init>(Lcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;)V
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal$1;->onRegistration(Ljava/lang/String;Ljava/lang/String;Z)V
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal$SupplicantResult;-><init>(Ljava/lang/String;)V
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal$SupplicantResult;->getResult()Ljava/lang/Object;
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal$SupplicantResult;->isSuccess()Z
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal$SupplicantResult;->setResult(Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;)V
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal$SupplicantResult;->setResult(Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;Ljava/lang/Object;)V
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;->-get0(Lcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;)Ljava/lang/Object;
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;->-wrap0(Lcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;)Z
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;->-wrap1(Lcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;)Z
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;-><init>(Lcom/android/server/wifi/p2p/WifiP2pMonitor;)V
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;->checkSupplicantP2pIfaceAndLogFailure(Ljava/lang/String;)Z
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;->flush()Z
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;->getDeviceAddress()Ljava/lang/String;
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;->getP2pIfaceMockable(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantIface;)Landroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIface;
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;->getServiceManagerMockable()Landroid/hidl/manager/V1_0/IServiceManager;
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;->getSupplicantMockable()Landroid/hardware/wifi/supplicant/V1_0/ISupplicant;
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;->initSupplicantP2pIface()Z
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;->initSupplicantService()Z
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;->initialize()Z
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;->isInitializationComplete()Z
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;->isInitializationStarted()Z
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;->lambda$-com_android_server_wifi_p2p_SupplicantP2pIfaceHal_10685(Lcom/android/server/wifi/p2p/SupplicantP2pIfaceHal$SupplicantResult;Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;Landroid/hardware/wifi/supplicant/V1_0/ISupplicantIface;)V
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;->lambda$-com_android_server_wifi_p2p_SupplicantP2pIfaceHal_35007(Lcom/android/server/wifi/p2p/SupplicantP2pIfaceHal$SupplicantResult;Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;[B)V
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;->lambda$-com_android_server_wifi_p2p_SupplicantP2pIfaceHal_67455(Lcom/android/server/wifi/p2p/SupplicantP2pIfaceHal$SupplicantResult;Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;->lambda$-com_android_server_wifi_p2p_SupplicantP2pIfaceHal_9579(Ljava/util/ArrayList;Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;Ljava/util/ArrayList;)V
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;->linkToServiceManagerDeath()Z
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;->linkToSupplicantDeath()Z
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;->linkToSupplicantP2pIfaceDeath()Z
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;->listNetworks()Ljava/util/List;
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;->loadGroups(Landroid/net/wifi/p2p/WifiP2pGroupList;)Z
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;->logCompletion(Ljava/lang/String;Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;)V
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;->logd(Ljava/lang/String;)V
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;->registerCallback(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantP2pIfaceCallback;)Z
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;->saveConfig()Z
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;->serviceFlush()Z
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;->setSsidPostfix(Ljava/lang/String;)Z
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;->setWpsConfigMethods(Ljava/lang/String;)Z
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;->setWpsDeviceName(Ljava/lang/String;)Z
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;->setWpsDeviceType(Ljava/lang/String;)Z
+PLcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;->stringToWpsConfigMethod(Ljava/lang/String;)S
+PLcom/android/server/wifi/p2p/WifiP2pMonitor;-><init>(Lcom/android/server/wifi/WifiInjector;)V
+PLcom/android/server/wifi/p2p/WifiP2pMonitor;->broadcastSupplicantConnectionEvent(Ljava/lang/String;)V
+PLcom/android/server/wifi/p2p/WifiP2pMonitor;->ensureConnectedLocked()Z
+PLcom/android/server/wifi/p2p/WifiP2pMonitor;->isMonitoring(Ljava/lang/String;)Z
+PLcom/android/server/wifi/p2p/WifiP2pMonitor;->registerHandler(Ljava/lang/String;ILandroid/os/Handler;)V
+PLcom/android/server/wifi/p2p/WifiP2pMonitor;->sendMessage(Landroid/os/Handler;Landroid/os/Message;)V
+PLcom/android/server/wifi/p2p/WifiP2pMonitor;->sendMessage(Ljava/lang/String;I)V
+PLcom/android/server/wifi/p2p/WifiP2pMonitor;->sendMessage(Ljava/lang/String;Landroid/os/Message;)V
+PLcom/android/server/wifi/p2p/WifiP2pMonitor;->setMonitoring(Ljava/lang/String;Z)V
+PLcom/android/server/wifi/p2p/WifiP2pMonitor;->startMonitoring(Ljava/lang/String;)V
+PLcom/android/server/wifi/p2p/WifiP2pNative;-><init>(Ljava/lang/String;Lcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;)V
+PLcom/android/server/wifi/p2p/WifiP2pNative;->connectToSupplicant()Z
+PLcom/android/server/wifi/p2p/WifiP2pNative;->getInterfaceName()Ljava/lang/String;
+PLcom/android/server/wifi/p2p/WifiP2pNative;->p2pFlush()Z
+PLcom/android/server/wifi/p2p/WifiP2pNative;->p2pGetDeviceAddress()Ljava/lang/String;
+PLcom/android/server/wifi/p2p/WifiP2pNative;->p2pListNetworks(Landroid/net/wifi/p2p/WifiP2pGroupList;)Z
+PLcom/android/server/wifi/p2p/WifiP2pNative;->p2pServiceFlush()Z
+PLcom/android/server/wifi/p2p/WifiP2pNative;->saveConfig()Z
+PLcom/android/server/wifi/p2p/WifiP2pNative;->setConfigMethods(Ljava/lang/String;)Z
+PLcom/android/server/wifi/p2p/WifiP2pNative;->setP2pDeviceName(Ljava/lang/String;)Z
+PLcom/android/server/wifi/p2p/WifiP2pNative;->setP2pDeviceType(Ljava/lang/String;)Z
+PLcom/android/server/wifi/p2p/WifiP2pNative;->setP2pSsidPostfix(Ljava/lang/String;)Z
+PLcom/android/server/wifi/p2p/WifiP2pService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/wifi/p2p/WifiP2pService;->onBootPhase(I)V
+PLcom/android/server/wifi/p2p/WifiP2pService;->onStart()V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$ClientHandler;-><init>(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl;Ljava/lang/String;Landroid/os/Looper;)V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$1;-><init>(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;)V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$DefaultState;-><init>(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;)V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$DefaultState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$FrequencyConflictState;-><init>(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;)V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$GroupCreatedState;-><init>(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;)V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$GroupCreatingState;-><init>(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;)V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$GroupNegotiationState;-><init>(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;)V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$InactiveState;-><init>(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;)V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$InactiveState;->enter()V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$InactiveState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$OngoingGroupRemovalState;-><init>(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;)V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$P2pDisabledState;-><init>(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;)V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$P2pDisabledState;->enter()V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$P2pDisabledState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$P2pDisablingState;-><init>(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;)V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$P2pEnabledState;-><init>(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;)V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$P2pEnabledState;->enter()V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$P2pEnabledState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$P2pEnablingState;-><init>(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;)V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$P2pEnablingState;->enter()V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$P2pEnablingState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$P2pNotSupportedState;-><init>(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;)V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$ProvisionDiscoveryState;-><init>(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;)V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$UserAuthorizingInviteRequestState;-><init>(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;)V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$UserAuthorizingJoinState;-><init>(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;)V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$UserAuthorizingNegotiationRequestState;-><init>(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;)V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;->-get10(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;)Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$P2pEnablingState;
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;->-get14(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;)Landroid/net/wifi/p2p/WifiP2pConfig;
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;->-get18(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;)Lcom/android/server/wifi/p2p/WifiP2pMonitor;
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;->-get19(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;)Lcom/android/server/wifi/p2p/WifiP2pNative;
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;->-get6(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;)Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$InactiveState;
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;->-wrap15(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;)V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;->-wrap26(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;)V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;->-wrap29(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;Z)V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;-><init>(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl;Ljava/lang/String;Landroid/os/Looper;Z)V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;->getPersistedDeviceName()Ljava/lang/String;
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;->initializeP2pSettings()V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;->sendP2pConnectionChangedBroadcast()V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;->sendP2pPersistentGroupsChangedBroadcast()V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;->sendP2pStateChangedBroadcast(Z)V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;->sendThisDeviceChangedBroadcast()V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;->updatePersistentNetworks(Z)V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;->updateThisDevice(I)V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl;->-get1()Ljava/lang/Boolean;
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl;->-get10(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl;)Landroid/net/NetworkInfo;
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl;->-get16(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl;)Landroid/net/wifi/p2p/WifiP2pDevice;
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl;->-get17(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl;)Lcom/android/internal/util/AsyncChannel;
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl;->-get3(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl;)Ljava/util/HashMap;
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl;->-get4(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl;)Landroid/content/Context;
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl;->-get6(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl;)Z
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl;->-get7(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl;)Z
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl;->-get8(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl;)Z
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl;->-set2(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl;Z)Z
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl;->-set6(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl;->-set7(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl;B)B
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl;->-set9(Lcom/android/server/wifi/p2p/WifiP2pServiceImpl;Lcom/android/internal/util/AsyncChannel;)Lcom/android/internal/util/AsyncChannel;
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl;-><init>(Landroid/content/Context;)V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl;->checkConnectivityInternalPermission()I
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl;->connectivityServiceReady()V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl;->enforceAccessPermission()V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl;->enforceChangePermission()V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl;->enforceConnectivityInternalOrLocationHardwarePermission()V
+PLcom/android/server/wifi/p2p/WifiP2pServiceImpl;->getP2pStateMachineMessenger()Landroid/os/Messenger;
+PLcom/android/server/wifi/scanner/BackgroundScanScheduler$BucketList$1;-><init>(Lcom/android/server/wifi/scanner/BackgroundScanScheduler$BucketList;)V
+PLcom/android/server/wifi/scanner/BackgroundScanScheduler$BucketList;-><init>(Lcom/android/server/wifi/scanner/BackgroundScanScheduler;)V
+PLcom/android/server/wifi/scanner/BackgroundScanScheduler;->-get2()[I
+PLcom/android/server/wifi/scanner/BackgroundScanScheduler;-><init>(Lcom/android/server/wifi/scanner/ChannelHelper;)V
+PLcom/android/server/wifi/scanner/BackgroundScanScheduler;->createSchedule(Ljava/util/List;I)V
+PLcom/android/server/wifi/scanner/BackgroundScanScheduler;->getMaxApPerScan()I
+PLcom/android/server/wifi/scanner/BackgroundScanScheduler;->getMaxBatch()I
+PLcom/android/server/wifi/scanner/BackgroundScanScheduler;->getMaxChannelsPerBucket()I
+PLcom/android/server/wifi/scanner/BackgroundScanScheduler;->setMaxApPerScan(I)V
+PLcom/android/server/wifi/scanner/BackgroundScanScheduler;->setMaxBuckets(I)V
+PLcom/android/server/wifi/scanner/ChannelHelper$ChannelCollection;-><init>(Lcom/android/server/wifi/scanner/ChannelHelper;)V
+PLcom/android/server/wifi/scanner/ChannelHelper$ChannelCollection;->addChannels(Landroid/net/wifi/WifiScanner$ScanSettings;)V
+PLcom/android/server/wifi/scanner/ChannelHelper$ChannelCollection;->addChannels(Lcom/android/server/wifi/WifiNative$BucketSettings;)V
+PLcom/android/server/wifi/scanner/ChannelHelper$ChannelCollection;->containsSettings(Landroid/net/wifi/WifiScanner$ScanSettings;)Z
+PLcom/android/server/wifi/scanner/ChannelHelper;-><init>()V
+PLcom/android/server/wifi/scanner/HalChannelHelper;-><init>(Lcom/android/server/wifi/WifiNative;)V
+PLcom/android/server/wifi/scanner/HalChannelHelper;->updateChannels()V
+PLcom/android/server/wifi/scanner/HalWifiScannerImpl;-><init>(Landroid/content/Context;Lcom/android/server/wifi/WifiNative;Lcom/android/server/wifi/WifiMonitor;Landroid/os/Looper;Lcom/android/server/wifi/Clock;)V
+PLcom/android/server/wifi/scanner/HalWifiScannerImpl;->getChannelHelper()Lcom/android/server/wifi/scanner/ChannelHelper;
+PLcom/android/server/wifi/scanner/HalWifiScannerImpl;->getLatestSingleScanResults()Landroid/net/wifi/WifiScanner$ScanData;
+PLcom/android/server/wifi/scanner/HalWifiScannerImpl;->getScanCapabilities(Lcom/android/server/wifi/WifiNative$ScanCapabilities;)Z
+PLcom/android/server/wifi/scanner/HalWifiScannerImpl;->startSingleScan(Lcom/android/server/wifi/WifiNative$ScanSettings;Lcom/android/server/wifi/WifiNative$ScanEventHandler;)Z
+PLcom/android/server/wifi/scanner/KnownBandsChannelHelper$KnownBandsChannelCollection;-><init>(Lcom/android/server/wifi/scanner/KnownBandsChannelHelper;)V
+PLcom/android/server/wifi/scanner/KnownBandsChannelHelper$KnownBandsChannelCollection;->addBand(I)V
+PLcom/android/server/wifi/scanner/KnownBandsChannelHelper$KnownBandsChannelCollection;->addChannel(I)V
+PLcom/android/server/wifi/scanner/KnownBandsChannelHelper$KnownBandsChannelCollection;->containsBand(I)Z
+PLcom/android/server/wifi/scanner/KnownBandsChannelHelper$KnownBandsChannelCollection;->containsChannel(I)Z
+PLcom/android/server/wifi/scanner/KnownBandsChannelHelper$KnownBandsChannelCollection;->fillBucketSettings(Lcom/android/server/wifi/WifiNative$BucketSettings;I)V
+PLcom/android/server/wifi/scanner/KnownBandsChannelHelper$KnownBandsChannelCollection;->getScanFreqs()Ljava/util/Set;
+PLcom/android/server/wifi/scanner/KnownBandsChannelHelper$KnownBandsChannelCollection;->isAllChannels()Z
+PLcom/android/server/wifi/scanner/KnownBandsChannelHelper$KnownBandsChannelCollection;->isEmpty()Z
+PLcom/android/server/wifi/scanner/KnownBandsChannelHelper;->-wrap0(Lcom/android/server/wifi/scanner/KnownBandsChannelHelper;I)I
+PLcom/android/server/wifi/scanner/KnownBandsChannelHelper;-><init>()V
+PLcom/android/server/wifi/scanner/KnownBandsChannelHelper;->copyChannels([Landroid/net/wifi/WifiScanner$ChannelSpec;I[I)V
+PLcom/android/server/wifi/scanner/KnownBandsChannelHelper;->createChannelCollection()Lcom/android/server/wifi/scanner/ChannelHelper$ChannelCollection;
+PLcom/android/server/wifi/scanner/KnownBandsChannelHelper;->createChannelCollection()Lcom/android/server/wifi/scanner/KnownBandsChannelHelper$KnownBandsChannelCollection;
+PLcom/android/server/wifi/scanner/KnownBandsChannelHelper;->getAvailableScanChannels(I)[Landroid/net/wifi/WifiScanner$ChannelSpec;
+PLcom/android/server/wifi/scanner/KnownBandsChannelHelper;->getBandFromChannel(I)I
+PLcom/android/server/wifi/scanner/KnownBandsChannelHelper;->isDfsChannel(I)Z
+PLcom/android/server/wifi/scanner/KnownBandsChannelHelper;->setBandChannels([I[I[I)V
+PLcom/android/server/wifi/scanner/ScanScheduleUtil;->filterResultsForSettings(Lcom/android/server/wifi/scanner/ChannelHelper;[Landroid/net/wifi/WifiScanner$ScanData;Landroid/net/wifi/WifiScanner$ScanSettings;I)[Landroid/net/wifi/WifiScanner$ScanData;
+PLcom/android/server/wifi/scanner/ScanScheduleUtil;->isBucketMaybeScanned(II)Z
+PLcom/android/server/wifi/scanner/ScanScheduleUtil;->shouldReportFullScanResultForSettings(Lcom/android/server/wifi/scanner/ChannelHelper;Landroid/net/wifi/ScanResult;ILandroid/net/wifi/WifiScanner$ScanSettings;I)Z
+PLcom/android/server/wifi/scanner/WifiScannerImpl$1;-><init>()V
+PLcom/android/server/wifi/scanner/WifiScannerImpl$1;->create(Landroid/content/Context;Landroid/os/Looper;Lcom/android/server/wifi/Clock;)Lcom/android/server/wifi/scanner/WifiScannerImpl;
+PLcom/android/server/wifi/scanner/WifiScannerImpl$2;-><init>()V
+PLcom/android/server/wifi/scanner/WifiScannerImpl$2;->compare(Landroid/net/wifi/ScanResult;Landroid/net/wifi/ScanResult;)I
+PLcom/android/server/wifi/scanner/WifiScannerImpl;-><init>()V
+PLcom/android/server/wifi/scanner/WifiScanningService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/wifi/scanner/WifiScanningService;->onBootPhase(I)V
+PLcom/android/server/wifi/scanner/WifiScanningService;->onStart()V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$1;-><init>(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl;)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$ClientHandler;-><init>(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl;Ljava/lang/String;Landroid/os/Looper;)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$ClientHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$ClientInfo;-><init>(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl;ILandroid/os/Messenger;)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$ClientInfo;->getUid()I
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$ClientInfo;->register()V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$ClientInfo;->toString()Ljava/lang/String;
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$ExternalClientInfo;-><init>(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl;ILandroid/os/Messenger;Lcom/android/internal/util/AsyncChannel;)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$ExternalClientInfo;->reportEvent(IIILjava/lang/Object;)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$RequestInfo;-><init>(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl;Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$ClientInfo;ILandroid/os/WorkSource;Ljava/lang/Object;)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$RequestInfo;->reportEvent(IILjava/lang/Object;)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$RequestList;-><init>(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl;)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$RequestList;-><init>(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl;Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$RequestList;)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$RequestList;->addRequest(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$ClientInfo;ILandroid/os/WorkSource;Ljava/lang/Object;)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$RequestList;->createMergedWorkSource()Landroid/os/WorkSource;
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiBackgroundScanStateMachine$DefaultState;-><init>(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiBackgroundScanStateMachine;)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiBackgroundScanStateMachine$DefaultState;->enter()V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiBackgroundScanStateMachine$DefaultState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiBackgroundScanStateMachine$PausedState;-><init>(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiBackgroundScanStateMachine;)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiBackgroundScanStateMachine$StartedState;-><init>(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiBackgroundScanStateMachine;)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiBackgroundScanStateMachine$StartedState;->enter()V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiBackgroundScanStateMachine;->-get0(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiBackgroundScanStateMachine;)Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$RequestList;
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiBackgroundScanStateMachine;->-get1(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiBackgroundScanStateMachine;)Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiBackgroundScanStateMachine$DefaultState;
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiBackgroundScanStateMachine;->-get3(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiBackgroundScanStateMachine;)Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiBackgroundScanStateMachine$StartedState;
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiBackgroundScanStateMachine;-><init>(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl;Landroid/os/Looper;)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiPnoScanStateMachine$DefaultState;-><init>(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiPnoScanStateMachine;)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiPnoScanStateMachine$DefaultState;->enter()V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiPnoScanStateMachine$DefaultState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiPnoScanStateMachine$HwPnoScanState;-><init>(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiPnoScanStateMachine;)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiPnoScanStateMachine$SingleScanState;-><init>(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiPnoScanStateMachine;)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiPnoScanStateMachine$StartedState;-><init>(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiPnoScanStateMachine;)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiPnoScanStateMachine$StartedState;->enter()V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiPnoScanStateMachine$SwPnoScanState;-><init>(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiPnoScanStateMachine;)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiPnoScanStateMachine;->-get0(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiPnoScanStateMachine;)Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiPnoScanStateMachine$DefaultState;
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiPnoScanStateMachine;->-get3(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiPnoScanStateMachine;)Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiPnoScanStateMachine$StartedState;
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiPnoScanStateMachine;-><init>(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl;Landroid/os/Looper;)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine$DefaultState;-><init>(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine;)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine$DefaultState;->enter()V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine$DefaultState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine$DriverStartedState;-><init>(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine;)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine$DriverStartedState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine$IdleState;-><init>(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine;)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine$IdleState;->enter()V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine$IdleState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine$ScanningState;-><init>(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine;)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine$ScanningState;->enter()V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine$ScanningState;->exit()V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine$ScanningState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine;->-get0(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine;)Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$RequestList;
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine;->-get1(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine;)[Landroid/net/wifi/ScanResult;
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine;->-get2(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine;)Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine$DefaultState;
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine;->-get3(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine;)Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine$IdleState;
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine;->-get4(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine;)Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$RequestList;
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine;->-get5(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine;)Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine$ScanningState;
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine;->-set0(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine;Lcom/android/server/wifi/WifiNative$ScanSettings;)Lcom/android/server/wifi/WifiNative$ScanSettings;
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine;-><init>(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl;Landroid/os/Looper;)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine;->activeScanSatisfies(Landroid/net/wifi/WifiScanner$ScanSettings;)Z
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine;->onFullScanResult(Landroid/net/wifi/ScanResult;I)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine;->onScanStatus(I)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine;->reportScanResults(Landroid/net/wifi/WifiScanner$ScanData;)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine;->sendOpFailedToAllAndClear(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$RequestList;ILjava/lang/String;)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine;->sendScanResultBroadcast(Z)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine;->tryToStartNewScan()V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine;->validateScanRequest(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$ClientInfo;ILandroid/net/wifi/WifiScanner$ScanSettings;Landroid/os/WorkSource;)Z
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl;->-get0(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl;)Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiBackgroundScanStateMachine;
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl;->-get1(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl;)Lcom/android/server/wifi/scanner/BackgroundScanScheduler;
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl;->-get10(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl;)Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiPnoScanStateMachine;
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl;->-get12(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl;)Lcom/android/server/wifi/scanner/WifiScannerImpl;
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl;->-get13(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl;)Lcom/android/server/wifi/scanner/WifiScannerImpl$WifiScannerImplFactory;
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl;->-get14(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl;)Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$RequestList;
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl;->-get15(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl;)Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine;
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl;->-get16(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl;)Lcom/android/server/wifi/WifiMetrics;
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl;->-get2(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl;)Lcom/android/internal/app/IBatteryStats;
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl;->-get3(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl;)Lcom/android/server/wifi/scanner/ChannelHelper;
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl;->-get5(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl;)Landroid/util/ArrayMap;
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl;->-get6(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl;)Lcom/android/server/wifi/Clock;
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl;->-get7(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl;)Landroid/content/Context;
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl;->-get8(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl;)Lcom/android/server/wifi/FrameworkFacade;
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl;->-get9(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl;)Landroid/os/Looper;
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl;->-set0(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl;Lcom/android/server/wifi/scanner/BackgroundScanScheduler;)Lcom/android/server/wifi/scanner/BackgroundScanScheduler;
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl;->-set1(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl;Lcom/android/server/wifi/scanner/ChannelHelper;)Lcom/android/server/wifi/scanner/ChannelHelper;
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl;->-set3(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl;Lcom/android/server/wifi/scanner/WifiScannerImpl;)Lcom/android/server/wifi/scanner/WifiScannerImpl;
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl;->-wrap0(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl;Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$ClientInfo;Landroid/os/WorkSource;)Landroid/os/WorkSource;
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl;->-wrap1(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl;I)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl;->-wrap2(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl;Ljava/lang/String;)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl;-><init>(Landroid/content/Context;Landroid/os/Looper;Lcom/android/server/wifi/scanner/WifiScannerImpl$WifiScannerImplFactory;Lcom/android/internal/app/IBatteryStats;Lcom/android/server/wifi/WifiInjector;)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl;->computeWorkSource(Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$ClientInfo;Landroid/os/WorkSource;)Landroid/os/WorkSource;
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl;->describeForLog([Landroid/net/wifi/WifiScanner$ScanData;)Ljava/lang/String;
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl;->describeTo(Ljava/lang/StringBuilder;Landroid/net/wifi/WifiScanner$ScanSettings;)Ljava/lang/String;
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl;->enforceLocationHardwarePermission(I)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl;->getMessenger()Landroid/os/Messenger;
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl;->isWorkSourceValid(Landroid/os/WorkSource;)Z
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl;->localLog(Ljava/lang/String;)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl;->logCallback(Ljava/lang/String;Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$ClientInfo;ILjava/lang/String;)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl;->logScanRequest(Ljava/lang/String;Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$ClientInfo;ILandroid/os/WorkSource;Landroid/net/wifi/WifiScanner$ScanSettings;Landroid/net/wifi/WifiScanner$PnoSettings;)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl;->replySucceeded(Landroid/os/Message;)V
+PLcom/android/server/wifi/scanner/WifiScanningServiceImpl;->startService()V
+PLcom/android/server/wifi/scanner/WificondScannerImpl$1;-><init>(Lcom/android/server/wifi/scanner/WificondScannerImpl;)V
+PLcom/android/server/wifi/scanner/WificondScannerImpl$2;-><init>(Lcom/android/server/wifi/scanner/WificondScannerImpl;)V
+PLcom/android/server/wifi/scanner/WificondScannerImpl$3;-><init>(Lcom/android/server/wifi/scanner/WificondScannerImpl;)V
+PLcom/android/server/wifi/scanner/WificondScannerImpl$HwPnoDebouncer$1;-><init>(Lcom/android/server/wifi/scanner/WificondScannerImpl$HwPnoDebouncer;)V
+PLcom/android/server/wifi/scanner/WificondScannerImpl$HwPnoDebouncer;-><init>(Lcom/android/server/wifi/WifiNative;Landroid/app/AlarmManager;Landroid/os/Handler;Lcom/android/server/wifi/Clock;)V
+PLcom/android/server/wifi/scanner/WificondScannerImpl$HwPnoDebouncer;->forceStopPnoScan()V
+PLcom/android/server/wifi/scanner/WificondScannerImpl$HwPnoDebouncer;->stopPnoScanInternal()Z
+PLcom/android/server/wifi/scanner/WificondScannerImpl$LastScanSettings;-><init>(J)V
+PLcom/android/server/wifi/scanner/WificondScannerImpl$LastScanSettings;->setSingleScan(ZLcom/android/server/wifi/scanner/ChannelHelper$ChannelCollection;Lcom/android/server/wifi/WifiNative$ScanEventHandler;)V
+PLcom/android/server/wifi/scanner/WificondScannerImpl$ScanBuffer;-><init>(I)V
+PLcom/android/server/wifi/scanner/WificondScannerImpl;-><init>(Landroid/content/Context;Lcom/android/server/wifi/WifiNative;Lcom/android/server/wifi/WifiMonitor;Lcom/android/server/wifi/scanner/ChannelHelper;Landroid/os/Looper;Lcom/android/server/wifi/Clock;)V
+PLcom/android/server/wifi/scanner/WificondScannerImpl;->getLatestSingleScanResults()Landroid/net/wifi/WifiScanner$ScanData;
+PLcom/android/server/wifi/scanner/WificondScannerImpl;->handleMessage(Landroid/os/Message;)Z
+PLcom/android/server/wifi/scanner/WificondScannerImpl;->isHwPnoScanRequired()Z
+PLcom/android/server/wifi/scanner/WificondScannerImpl;->pauseHwPnoScan()V
+PLcom/android/server/wifi/scanner/WificondScannerImpl;->processPendingScans()V
+PLcom/android/server/wifi/scanner/WificondScannerImpl;->startSingleScan(Lcom/android/server/wifi/WifiNative$ScanSettings;Lcom/android/server/wifi/WifiNative$ScanEventHandler;)Z
+PLcom/android/server/wifi/util/BitMask;-><init>(I)V
+PLcom/android/server/wifi/util/ByteArrayRingBuffer;-><init>(I)V
+PLcom/android/server/wifi/util/ByteArrayRingBuffer;->resize(I)V
+PLcom/android/server/wifi/util/InformationElementUtil$Capabilities;-><init>()V
+PLcom/android/server/wifi/util/InformationElementUtil$Capabilities;->cipherToString(I)Ljava/lang/String;
+PLcom/android/server/wifi/util/InformationElementUtil$Capabilities;->keyManagementToString(I)Ljava/lang/String;
+PLcom/android/server/wifi/util/InformationElementUtil$Capabilities;->parseRsnCipher(I)I
+PLcom/android/server/wifi/util/InformationElementUtil$Capabilities;->parseWpaCipher(I)I
+PLcom/android/server/wifi/util/InformationElementUtil$Capabilities;->parseWpaOneElement(Landroid/net/wifi/ScanResult$InformationElement;)V
+PLcom/android/server/wifi/util/InformationElementUtil$Capabilities;->protocolToString(I)Ljava/lang/String;
+PLcom/android/server/wifi/util/InformationElementUtil$ExtendedCapabilities;->is80211McRTTResponder()Z
+PLcom/android/server/wifi/util/InformationElementUtil$HtOperation;->from(Landroid/net/wifi/ScanResult$InformationElement;)V
+PLcom/android/server/wifi/util/InformationElementUtil$HtOperation;->getCenterFreq0(I)I
+PLcom/android/server/wifi/util/InformationElementUtil$HtOperation;->getChannelWidth()I
+PLcom/android/server/wifi/util/InformationElementUtil$Interworking;->from(Landroid/net/wifi/ScanResult$InformationElement;)V
+PLcom/android/server/wifi/util/InformationElementUtil$TrafficIndicationMap;->isValid()Z
+PLcom/android/server/wifi/util/InformationElementUtil$VhtOperation;->from(Landroid/net/wifi/ScanResult$InformationElement;)V
+PLcom/android/server/wifi/util/InformationElementUtil$VhtOperation;->getCenterFreq0()I
+PLcom/android/server/wifi/util/InformationElementUtil$VhtOperation;->getCenterFreq1()I
+PLcom/android/server/wifi/util/InformationElementUtil$VhtOperation;->getChannelWidth()I
+PLcom/android/server/wifi/util/InformationElementUtil$WifiMode;->determineMode(IIZZZ)I
+PLcom/android/server/wifi/util/NativeUtil;->decodeSsid(Ljava/lang/String;)Ljava/util/ArrayList;
+PLcom/android/server/wifi/util/NativeUtil;->hexOrQuotedAsciiStringToBytes(Ljava/lang/String;)Ljava/util/ArrayList;
+PLcom/android/server/wifi/util/NativeUtil;->hexStringToByteArray(Ljava/lang/String;)[B
+PLcom/android/server/wifi/util/NativeUtil;->macAddressToByteArray(Ljava/lang/String;)[B
+PLcom/android/server/wifi/util/NativeUtil;->stringToByteArray(Ljava/lang/String;)[B
+PLcom/android/server/wifi/util/NativeUtil;->stringToByteArrayList(Ljava/lang/String;)Ljava/util/ArrayList;
+PLcom/android/server/wifi/util/ScanResultUtil;->createQuotedSSID(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/wifi/util/ScanResultUtil;->isScanResultForEapNetwork(Landroid/net/wifi/ScanResult;)Z
+PLcom/android/server/wifi/util/ScanResultUtil;->isScanResultForOpenNetwork(Landroid/net/wifi/ScanResult;)Z
+PLcom/android/server/wifi/util/ScanResultUtil;->isScanResultForPskNetwork(Landroid/net/wifi/ScanResult;)Z
+PLcom/android/server/wifi/util/ScanResultUtil;->isScanResultForWepNetwork(Landroid/net/wifi/ScanResult;)Z
+PLcom/android/server/wifi/util/ScanResultUtil;->toScanDetail(Landroid/net/wifi/ScanResult;)Lcom/android/server/wifi/ScanDetail;
+PLcom/android/server/wifi/util/TelephonyUtil;->getSimMethodForConfig(Landroid/net/wifi/WifiConfiguration;)I
+PLcom/android/server/wifi/util/TelephonyUtil;->isSimConfig(Landroid/net/wifi/WifiConfiguration;)Z
+PLcom/android/server/wifi/util/TelephonyUtil;->isSimEapMethod(I)Z
+PLcom/android/server/wifi/util/WifiAsyncChannel;-><init>(Ljava/lang/String;)V
+PLcom/android/server/wifi/util/WifiAsyncChannel;->getOrInitLog()Lcom/android/server/wifi/WifiLog;
+PLcom/android/server/wifi/util/WifiAsyncChannel;->replyToMessage(Landroid/os/Message;Landroid/os/Message;)V
+PLcom/android/server/wifi/util/WifiAsyncChannel;->sendMessageSynchronously(Landroid/os/Message;)Landroid/os/Message;
+PLcom/android/server/wifi/util/WifiHandler;-><init>(Ljava/lang/String;Landroid/os/Looper;)V
+PLcom/android/server/wifi/util/WifiHandler;->getOrInitLog()Lcom/android/server/wifi/WifiLog;
+PLcom/android/server/wifi/util/WifiHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/wifi/util/WifiPermissionsUtil;-><init>(Lcom/android/server/wifi/util/WifiPermissionsWrapper;Landroid/content/Context;Lcom/android/server/wifi/WifiSettingsStore;Landroid/os/UserManager;Landroid/net/NetworkScoreManager;Lcom/android/server/wifi/WifiInjector;)V
+PLcom/android/server/wifi/util/WifiPermissionsUtil;->canAccessScanResults(Ljava/lang/String;II)Z
+PLcom/android/server/wifi/util/WifiPermissionsUtil;->checkAppOpAllowed(ILjava/lang/String;I)Z
+PLcom/android/server/wifi/util/WifiPermissionsUtil;->checkCallerHasPeersMacAddressPermission(I)Z
+PLcom/android/server/wifi/util/WifiPermissionsUtil;->checkCallersLocationPermission(Ljava/lang/String;I)Z
+PLcom/android/server/wifi/util/WifiPermissionsUtil;->isCallerActiveNwScorer(I)Z
+PLcom/android/server/wifi/util/WifiPermissionsUtil;->isCurrentProfile(I)Z
+PLcom/android/server/wifi/util/WifiPermissionsUtil;->isLegacyForeground(Ljava/lang/String;I)Z
+PLcom/android/server/wifi/util/WifiPermissionsUtil;->isLegacyVersion(Ljava/lang/String;I)Z
+PLcom/android/server/wifi/util/WifiPermissionsUtil;->isLocationModeEnabled(Ljava/lang/String;)Z
+PLcom/android/server/wifi/util/WifiPermissionsUtil;->isScanAllowedbyApps(Ljava/lang/String;I)Z
+PLcom/android/server/wifi/util/WifiPermissionsWrapper;-><init>(Landroid/content/Context;)V
+PLcom/android/server/wifi/util/WifiPermissionsWrapper;->getCallingUserId(I)I
+PLcom/android/server/wifi/util/WifiPermissionsWrapper;->getCurrentUser()I
+PLcom/android/server/wifi/util/WifiPermissionsWrapper;->getUidPermission(Ljava/lang/String;I)I
+PLcom/android/server/wifi/util/XmlUtil$IpConfigurationXmlUtil;->-getandroid-net-IpConfiguration$IpAssignmentSwitchesValues()[I
+PLcom/android/server/wifi/util/XmlUtil$IpConfigurationXmlUtil;->-getandroid-net-IpConfiguration$ProxySettingsSwitchesValues()[I
+PLcom/android/server/wifi/util/XmlUtil$IpConfigurationXmlUtil;->parseFromXml(Lorg/xmlpull/v1/XmlPullParser;I)Landroid/net/IpConfiguration;
+PLcom/android/server/wifi/util/XmlUtil$IpConfigurationXmlUtil;->writeToXml(Lorg/xmlpull/v1/XmlSerializer;Landroid/net/IpConfiguration;)V
+PLcom/android/server/wifi/util/XmlUtil$NetworkSelectionStatusXmlUtil;->parseFromXml(Lorg/xmlpull/v1/XmlPullParser;I)Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;
+PLcom/android/server/wifi/util/XmlUtil$NetworkSelectionStatusXmlUtil;->writeToXml(Lorg/xmlpull/v1/XmlSerializer;Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;)V
+PLcom/android/server/wifi/util/XmlUtil$WifiConfigurationXmlUtil;->parseFromXml(Lorg/xmlpull/v1/XmlPullParser;I)Landroid/util/Pair;
+PLcom/android/server/wifi/util/XmlUtil$WifiConfigurationXmlUtil;->populateWepKeysFromXmlValue(Ljava/lang/Object;[Ljava/lang/String;)V
+PLcom/android/server/wifi/util/XmlUtil$WifiConfigurationXmlUtil;->writeCommonElementsToXml(Lorg/xmlpull/v1/XmlSerializer;Landroid/net/wifi/WifiConfiguration;)V
+PLcom/android/server/wifi/util/XmlUtil$WifiConfigurationXmlUtil;->writeToXmlForConfigStore(Lorg/xmlpull/v1/XmlSerializer;Landroid/net/wifi/WifiConfiguration;)V
+PLcom/android/server/wifi/util/XmlUtil$WifiConfigurationXmlUtil;->writeWepKeysToXml(Lorg/xmlpull/v1/XmlSerializer;[Ljava/lang/String;)V
+PLcom/android/server/wifi/util/XmlUtil;->gotoDocumentStart(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)V
+PLcom/android/server/wifi/util/XmlUtil;->gotoEndTag(Lorg/xmlpull/v1/XmlPullParser;)V
+PLcom/android/server/wifi/util/XmlUtil;->gotoNextSectionOrEnd(Lorg/xmlpull/v1/XmlPullParser;[Ljava/lang/String;I)Z
+PLcom/android/server/wifi/util/XmlUtil;->gotoNextSectionWithNameOrEnd(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;I)Z
+PLcom/android/server/wifi/util/XmlUtil;->isNextSectionEnd(Lorg/xmlpull/v1/XmlPullParser;I)Z
+PLcom/android/server/wifi/util/XmlUtil;->readCurrentValue(Lorg/xmlpull/v1/XmlPullParser;[Ljava/lang/String;)Ljava/lang/Object;
+PLcom/android/server/wifi/util/XmlUtil;->readNextValueWithName(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)Ljava/lang/Object;
+PLcom/android/server/wifi/util/XmlUtil;->writeDocumentEnd(Lorg/xmlpull/v1/XmlSerializer;Ljava/lang/String;)V
+PLcom/android/server/wifi/util/XmlUtil;->writeDocumentStart(Lorg/xmlpull/v1/XmlSerializer;Ljava/lang/String;)V
+PLcom/android/server/wifi/util/XmlUtil;->writeNextSectionEnd(Lorg/xmlpull/v1/XmlSerializer;Ljava/lang/String;)V
+PLcom/android/server/wifi/util/XmlUtil;->writeNextSectionStart(Lorg/xmlpull/v1/XmlSerializer;Ljava/lang/String;)V
+PLcom/android/server/wifi/util/XmlUtil;->writeNextValue(Lorg/xmlpull/v1/XmlSerializer;Ljava/lang/String;Ljava/lang/Object;)V
+PLcom/android/server/wifi/wificond/ChannelSettings$1;-><init>()V
+PLcom/android/server/wifi/wificond/ChannelSettings;-><init>()V
+PLcom/android/server/wifi/wificond/ChannelSettings;->writeToParcel(Landroid/os/Parcel;I)V
+PLcom/android/server/wifi/wificond/NativeScanResult$1;-><init>()V
+PLcom/android/server/wifi/wificond/NativeScanResult$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
+PLcom/android/server/wifi/wificond/NativeScanResult$1;->newArray(I)[Lcom/android/server/wifi/wificond/NativeScanResult;
+PLcom/android/server/wifi/wificond/NativeScanResult$1;->newArray(I)[Ljava/lang/Object;
+PLcom/android/server/wifi/wificond/NativeScanResult;-><init>()V
+PLcom/android/server/wifi/wificond/SingleScanSettings$1;-><init>()V
+PLcom/android/server/wifi/wificond/SingleScanSettings;-><init>()V
+PLcom/android/server/wifi/wificond/SingleScanSettings;->writeToParcel(Landroid/os/Parcel;I)V
+PLcom/android/server/wm/-$Lambda$AUkchKtIxrbCkLkg2ILGagAqXvc;->$m$0(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$Lambda$AUkchKtIxrbCkLkg2ILGagAqXvc;-><init>(BZZLjava/lang/Object;)V
+PLcom/android/server/wm/-$Lambda$AUkchKtIxrbCkLkg2ILGagAqXvc;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$Lambda$JE-Xd_mgkfFanNxg9Cy6vl62umY;->$m$0()V
+PLcom/android/server/wm/-$Lambda$JE-Xd_mgkfFanNxg9Cy6vl62umY;-><init>(ILjava/lang/Object;)V
+PLcom/android/server/wm/-$Lambda$JE-Xd_mgkfFanNxg9Cy6vl62umY;->run()V
+PLcom/android/server/wm/-$Lambda$LEqle-ue9vesHjZva-SwvAvwBx8;->$m$0(Ljava/lang/Object;Ljava/lang/Object;)I
+PLcom/android/server/wm/-$Lambda$LEqle-ue9vesHjZva-SwvAvwBx8;->$m$1(Ljava/lang/Object;Ljava/lang/Object;)I
+PLcom/android/server/wm/-$Lambda$LEqle-ue9vesHjZva-SwvAvwBx8;-><init>(BLjava/lang/Object;)V
+PLcom/android/server/wm/-$Lambda$LEqle-ue9vesHjZva-SwvAvwBx8;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+PLcom/android/server/wm/-$Lambda$OQfQhd_xsxt9hoLAjIbVfOwa-jY;->$m$0(J)V
+PLcom/android/server/wm/-$Lambda$OQfQhd_xsxt9hoLAjIbVfOwa-jY;-><init>(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$Lambda$OQfQhd_xsxt9hoLAjIbVfOwa-jY;->doFrame(J)V
+PLcom/android/server/wm/-$Lambda$OzPvdnGprtQoLZLCvw2GU8IaGyI$1;->$m$0(Ljava/lang/Object;)Z
+PLcom/android/server/wm/-$Lambda$OzPvdnGprtQoLZLCvw2GU8IaGyI$1;-><init>(B)V
+PLcom/android/server/wm/-$Lambda$OzPvdnGprtQoLZLCvw2GU8IaGyI$1;->test(Ljava/lang/Object;)Z
+PLcom/android/server/wm/-$Lambda$OzPvdnGprtQoLZLCvw2GU8IaGyI$3;->$m$0(Ljava/lang/Object;)Z
+PLcom/android/server/wm/-$Lambda$OzPvdnGprtQoLZLCvw2GU8IaGyI$3;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/wm/-$Lambda$OzPvdnGprtQoLZLCvw2GU8IaGyI$3;->test(Ljava/lang/Object;)Z
+PLcom/android/server/wm/-$Lambda$OzPvdnGprtQoLZLCvw2GU8IaGyI$4;->$m$1(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$Lambda$OzPvdnGprtQoLZLCvw2GU8IaGyI$4;-><init>(BII)V
+PLcom/android/server/wm/-$Lambda$OzPvdnGprtQoLZLCvw2GU8IaGyI$4;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$Lambda$OzPvdnGprtQoLZLCvw2GU8IaGyI$7;->$m$0(Ljava/lang/Object;)Z
+PLcom/android/server/wm/-$Lambda$OzPvdnGprtQoLZLCvw2GU8IaGyI$7;-><init>(ZZILjava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/wm/-$Lambda$OzPvdnGprtQoLZLCvw2GU8IaGyI$7;->apply(Ljava/lang/Object;)Z
+PLcom/android/server/wm/-$Lambda$OzPvdnGprtQoLZLCvw2GU8IaGyI;->$m$1(Landroid/graphics/Rect;IIIIZI)Ljava/lang/Object;
+PLcom/android/server/wm/-$Lambda$OzPvdnGprtQoLZLCvw2GU8IaGyI;-><init>(B)V
+PLcom/android/server/wm/-$Lambda$OzPvdnGprtQoLZLCvw2GU8IaGyI;->screenshot(Landroid/graphics/Rect;IIIIZI)Ljava/lang/Object;
+PLcom/android/server/wm/-$Lambda$YIZfR4m-B8z_tYbP2x4OJ3o7OYE;->$m$13(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$Lambda$YIZfR4m-B8z_tYbP2x4OJ3o7OYE;->$m$14(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$Lambda$YIZfR4m-B8z_tYbP2x4OJ3o7OYE;->$m$2(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$Lambda$YIZfR4m-B8z_tYbP2x4OJ3o7OYE;->$m$5(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$Lambda$YIZfR4m-B8z_tYbP2x4OJ3o7OYE;-><init>(BLjava/lang/Object;)V
+PLcom/android/server/wm/-$Lambda$aEpJ2RCAIjecjyIIYTv6ricEwh4;->$m$12()V
+PLcom/android/server/wm/-$Lambda$aEpJ2RCAIjecjyIIYTv6ricEwh4;->$m$13()V
+PLcom/android/server/wm/-$Lambda$aEpJ2RCAIjecjyIIYTv6ricEwh4;->$m$14()V
+PLcom/android/server/wm/-$Lambda$aEpJ2RCAIjecjyIIYTv6ricEwh4;->$m$2()V
+PLcom/android/server/wm/-$Lambda$aEpJ2RCAIjecjyIIYTv6ricEwh4;->$m$3()V
+PLcom/android/server/wm/-$Lambda$aEpJ2RCAIjecjyIIYTv6ricEwh4;->$m$4()V
+PLcom/android/server/wm/-$Lambda$aEpJ2RCAIjecjyIIYTv6ricEwh4;->$m$5()V
+PLcom/android/server/wm/-$Lambda$aEpJ2RCAIjecjyIIYTv6ricEwh4;->$m$6()V
+PLcom/android/server/wm/-$Lambda$aEpJ2RCAIjecjyIIYTv6ricEwh4;->$m$7()V
+PLcom/android/server/wm/-$Lambda$aEpJ2RCAIjecjyIIYTv6ricEwh4;-><init>(BLjava/lang/Object;)V
+PLcom/android/server/wm/-$Lambda$aEpJ2RCAIjecjyIIYTv6ricEwh4;->run()V
+PLcom/android/server/wm/-$Lambda$cHAc_wCK_9-nlRTF5Ggz5ZbNDr0$2;->$m$0(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$Lambda$cHAc_wCK_9-nlRTF5Ggz5ZbNDr0$2;-><init>(ZI)V
+PLcom/android/server/wm/-$Lambda$cHAc_wCK_9-nlRTF5Ggz5ZbNDr0$2;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$Lambda$eBBEuGZ8VbEXJy0r5EYYbvnl-8w;->$m$0()V
+PLcom/android/server/wm/-$Lambda$eBBEuGZ8VbEXJy0r5EYYbvnl-8w;-><init>(ZZZLjava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/wm/-$Lambda$eBBEuGZ8VbEXJy0r5EYYbvnl-8w;->run()V
+PLcom/android/server/wm/-$Lambda$hCYoJeHmvymNpgtwuNPQ6z-HGjQ;->$m$3(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$Lambda$hCYoJeHmvymNpgtwuNPQ6z-HGjQ;-><init>(B)V
+PLcom/android/server/wm/-$Lambda$jlKbn4GPn9-0nFmS_2KB8vTwgFI;->$m$0()V
+PLcom/android/server/wm/-$Lambda$jlKbn4GPn9-0nFmS_2KB8vTwgFI;->$m$2()V
+PLcom/android/server/wm/-$Lambda$jlKbn4GPn9-0nFmS_2KB8vTwgFI;-><init>(BLjava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/wm/-$Lambda$jlKbn4GPn9-0nFmS_2KB8vTwgFI;->run()V
+PLcom/android/server/wm/-$Lambda$lByfYr6ieFYh5pmaqCgCKVVzuwA;->$m$0(Ljava/lang/Object;)Z
+PLcom/android/server/wm/-$Lambda$lByfYr6ieFYh5pmaqCgCKVVzuwA;-><init>()V
+PLcom/android/server/wm/-$Lambda$lByfYr6ieFYh5pmaqCgCKVVzuwA;->apply(Ljava/lang/Object;)Z
+PLcom/android/server/wm/-$Lambda$lpBUCbECLvWBIi8CcvaEY5AB7jM$1;->$m$0(Ljava/lang/Object;)Z
+PLcom/android/server/wm/-$Lambda$lpBUCbECLvWBIi8CcvaEY5AB7jM$1;->$m$1(Ljava/lang/Object;)Z
+PLcom/android/server/wm/-$Lambda$lpBUCbECLvWBIi8CcvaEY5AB7jM$1;->$m$2(Ljava/lang/Object;)Z
+PLcom/android/server/wm/-$Lambda$lpBUCbECLvWBIi8CcvaEY5AB7jM$1;-><init>(BLjava/lang/Object;)V
+PLcom/android/server/wm/-$Lambda$lpBUCbECLvWBIi8CcvaEY5AB7jM$1;->test(Ljava/lang/Object;)Z
+PLcom/android/server/wm/-$Lambda$lpBUCbECLvWBIi8CcvaEY5AB7jM;->$m$0(Ljava/lang/Object;)Z
+PLcom/android/server/wm/-$Lambda$lpBUCbECLvWBIi8CcvaEY5AB7jM;->$m$1(Ljava/lang/Object;)Z
+PLcom/android/server/wm/-$Lambda$lpBUCbECLvWBIi8CcvaEY5AB7jM;-><init>(BLjava/lang/Object;)V
+PLcom/android/server/wm/-$Lambda$qRW_P-TWddDPPnAT8S1SNpM72ho;->$m$0(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$Lambda$qRW_P-TWddDPPnAT8S1SNpM72ho;-><init>(BLjava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/wm/-$Lambda$qRW_P-TWddDPPnAT8S1SNpM72ho;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$Lambda$v2Yn08uofw54W8n_7KsmBjqR0Z8;->$m$0(I)Ljava/io/File;
+PLcom/android/server/wm/-$Lambda$v2Yn08uofw54W8n_7KsmBjqR0Z8;-><init>()V
+PLcom/android/server/wm/-$Lambda$v2Yn08uofw54W8n_7KsmBjqR0Z8;->getSystemDirectoryForUser(I)Ljava/io/File;
+PLcom/android/server/wm/AppTokenList;-><init>()V
+PLcom/android/server/wm/AppTransition$1;-><init>(Lcom/android/server/wm/AppTransition;)V
+PLcom/android/server/wm/AppTransition$2;-><init>(Lcom/android/server/wm/AppTransition;)V
+PLcom/android/server/wm/AppTransition$2;->getInterpolation(F)F
+PLcom/android/server/wm/AppTransition;->-get1(Lcom/android/server/wm/AppTransition;)Landroid/view/animation/Interpolator;
+PLcom/android/server/wm/AppTransition;-><init>(Landroid/content/Context;Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/AppTransition;->calculateClipRevealTransitionDuration(ZFFLandroid/graphics/Rect;)J
+PLcom/android/server/wm/AppTransition;->canSkipFirstFrame()Z
+PLcom/android/server/wm/AppTransition;->clear()V
+PLcom/android/server/wm/AppTransition;->createAspectScaledThumbnailEnterExitAnimationLocked(IIIILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;ZI)Landroid/view/animation/Animation;
+PLcom/android/server/wm/AppTransition;->createClipRevealAnimationLocked(IZLandroid/graphics/Rect;Landroid/graphics/Rect;)Landroid/view/animation/Animation;
+PLcom/android/server/wm/AppTransition;->createCurvedMotion(FFFF)Landroid/view/animation/Animation;
+PLcom/android/server/wm/AppTransition;->createThumbnailAspectScaleAnimationLocked(Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/GraphicBuffer;III)Landroid/view/animation/Animation;
+PLcom/android/server/wm/AppTransition;->fetchAppTransitionSpecsFromFuture()V
+PLcom/android/server/wm/AppTransition;->freeze()V
+PLcom/android/server/wm/AppTransition;->getAppStackClipMode()I
+PLcom/android/server/wm/AppTransition;->getAppTransition()I
+PLcom/android/server/wm/AppTransition;->getAppTransitionThumbnailHeader(I)Landroid/graphics/GraphicBuffer;
+PLcom/android/server/wm/AppTransition;->getAspectScaleDuration()J
+PLcom/android/server/wm/AppTransition;->getAspectScaleInterpolator()Landroid/view/animation/Interpolator;
+PLcom/android/server/wm/AppTransition;->getCachedAnimations(Landroid/view/WindowManager$LayoutParams;)Lcom/android/server/AttributeCache$Entry;
+PLcom/android/server/wm/AppTransition;->getCachedAnimations(Ljava/lang/String;I)Lcom/android/server/AttributeCache$Entry;
+PLcom/android/server/wm/AppTransition;->getDefaultNextAppTransitionStartRect(Landroid/graphics/Rect;)V
+PLcom/android/server/wm/AppTransition;->getNextAppTransitionStartRect(ILandroid/graphics/Rect;)V
+PLcom/android/server/wm/AppTransition;->getThumbnailTransitionState(Z)I
+PLcom/android/server/wm/AppTransition;->getTransitFlags()I
+PLcom/android/server/wm/AppTransition;->goodToGo(ILcom/android/server/wm/AppWindowAnimator;Lcom/android/server/wm/AppWindowAnimator;Landroid/util/ArraySet;Landroid/util/ArraySet;)I
+PLcom/android/server/wm/AppTransition;->isFetchingAppTransitionsSpecs()Z
+PLcom/android/server/wm/AppTransition;->isKeyguardGoingAwayTransit(I)Z
+PLcom/android/server/wm/AppTransition;->isKeyguardTransit(I)Z
+PLcom/android/server/wm/AppTransition;->isNextAppTransitionThumbnailDown()Z
+PLcom/android/server/wm/AppTransition;->isNextAppTransitionThumbnailUp()Z
+PLcom/android/server/wm/AppTransition;->isNextThumbnailTransitionAspectScaled()Z
+PLcom/android/server/wm/AppTransition;->isNextThumbnailTransitionScaleUp()Z
+PLcom/android/server/wm/AppTransition;->isReady()Z
+PLcom/android/server/wm/AppTransition;->isRunning()Z
+PLcom/android/server/wm/AppTransition;->isTimeout()Z
+PLcom/android/server/wm/AppTransition;->isTransitionEqual(I)Z
+PLcom/android/server/wm/AppTransition;->lambda$-com_android_server_wm_AppTransition_87752(Landroid/view/IAppTransitionAnimationSpecsFuture;)V
+PLcom/android/server/wm/AppTransition;->loadAnimation(Landroid/view/WindowManager$LayoutParams;IZIILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;ZZI)Landroid/view/animation/Animation;
+PLcom/android/server/wm/AppTransition;->loadAnimationAttr(Landroid/view/WindowManager$LayoutParams;I)Landroid/view/animation/Animation;
+PLcom/android/server/wm/AppTransition;->loadAnimationRes(Ljava/lang/String;I)Landroid/view/animation/Animation;
+PLcom/android/server/wm/AppTransition;->loadKeyguardExitAnimation(I)Landroid/view/animation/Animation;
+PLcom/android/server/wm/AppTransition;->notifyAppTransitionCancelledLocked(I)V
+PLcom/android/server/wm/AppTransition;->notifyAppTransitionFinishedLocked(Landroid/os/IBinder;)V
+PLcom/android/server/wm/AppTransition;->notifyAppTransitionPendingLocked()V
+PLcom/android/server/wm/AppTransition;->notifyAppTransitionStartingLocked(ILandroid/os/IBinder;Landroid/os/IBinder;Landroid/view/animation/Animation;Landroid/view/animation/Animation;)I
+PLcom/android/server/wm/AppTransition;->notifyProlongedAnimationsEnded()V
+PLcom/android/server/wm/AppTransition;->overridePendingAppTransition(Ljava/lang/String;IILandroid/os/IRemoteCallback;)V
+PLcom/android/server/wm/AppTransition;->overridePendingAppTransitionClipReveal(IIII)V
+PLcom/android/server/wm/AppTransition;->overridePendingAppTransitionMultiThumb([Landroid/view/AppTransitionAnimationSpec;Landroid/os/IRemoteCallback;Landroid/os/IRemoteCallback;Z)V
+PLcom/android/server/wm/AppTransition;->overridePendingAppTransitionMultiThumbFuture(Landroid/view/IAppTransitionAnimationSpecsFuture;Landroid/os/IRemoteCallback;Z)V
+PLcom/android/server/wm/AppTransition;->postAnimationCallback()V
+PLcom/android/server/wm/AppTransition;->prepare()Z
+PLcom/android/server/wm/AppTransition;->prepareAppTransitionLocked(IZIZ)Z
+PLcom/android/server/wm/AppTransition;->prepareThumbnailAnimationWithDuration(Landroid/view/animation/Animation;IIJLandroid/view/animation/Interpolator;)Landroid/view/animation/Animation;
+PLcom/android/server/wm/AppTransition;->putDefaultNextAppTransitionCoordinates(IIIILandroid/graphics/GraphicBuffer;)V
+PLcom/android/server/wm/AppTransition;->registerListenerLocked(Landroid/view/WindowManagerInternal$AppTransitionListener;)V
+PLcom/android/server/wm/AppTransition;->setAppTransition(II)V
+PLcom/android/server/wm/AppTransition;->setAppTransitionState(I)V
+PLcom/android/server/wm/AppTransition;->setIdle()V
+PLcom/android/server/wm/AppTransition;->setLastAppTransition(ILcom/android/server/wm/AppWindowToken;Lcom/android/server/wm/AppWindowToken;)V
+PLcom/android/server/wm/AppTransition;->setReady()V
+PLcom/android/server/wm/AppTransition;->shouldScaleDownThumbnailTransition(II)Z
+PLcom/android/server/wm/AppTransition;->updateBooster()V
+PLcom/android/server/wm/AppWindowAnimator$DummyAnimation;-><init>()V
+PLcom/android/server/wm/AppWindowAnimator;-><init>(Lcom/android/server/wm/AppWindowToken;Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/AppWindowAnimator;->clearAnimation()V
+PLcom/android/server/wm/AppWindowAnimator;->clearThumbnail()V
+PLcom/android/server/wm/AppWindowAnimator;->endProlongedAnimation()V
+PLcom/android/server/wm/AppWindowAnimator;->getAnimationFrameTime(Landroid/view/animation/Animation;J)J
+PLcom/android/server/wm/AppWindowAnimator;->getStartTimeCorrection()J
+PLcom/android/server/wm/AppWindowAnimator;->getTransit()I
+PLcom/android/server/wm/AppWindowAnimator;->getTransitFlags()I
+PLcom/android/server/wm/AppWindowAnimator;->setAnimation(Landroid/view/animation/Animation;IIIIZIII)V
+PLcom/android/server/wm/AppWindowAnimator;->setDummyAnimation()V
+PLcom/android/server/wm/AppWindowAnimator;->setNullAnimation()V
+PLcom/android/server/wm/AppWindowAnimator;->showAllWindowsLocked()Z
+PLcom/android/server/wm/AppWindowAnimator;->stepAnimation(J)Z
+PLcom/android/server/wm/AppWindowAnimator;->stepThumbnailAnimation(J)V
+PLcom/android/server/wm/AppWindowAnimator;->transferCurrentAnimation(Lcom/android/server/wm/AppWindowAnimator;Lcom/android/server/wm/WindowStateAnimator;)V
+PLcom/android/server/wm/AppWindowAnimator;->updateLayers()V
+PLcom/android/server/wm/AppWindowContainerController;-><init>(Lcom/android/server/wm/TaskWindowContainerController;Landroid/view/IApplicationToken;Lcom/android/server/wm/AppWindowContainerListener;IIZZIZZZIIJLandroid/content/res/Configuration;Landroid/graphics/Rect;)V
+PLcom/android/server/wm/AppWindowContainerController;-><init>(Lcom/android/server/wm/TaskWindowContainerController;Landroid/view/IApplicationToken;Lcom/android/server/wm/AppWindowContainerListener;IIZZIZZZIIJLcom/android/server/wm/WindowManagerService;Landroid/content/res/Configuration;Landroid/graphics/Rect;)V
+PLcom/android/server/wm/AppWindowContainerController;->addStartingWindow(Ljava/lang/String;ILandroid/content/res/CompatibilityInfo;Ljava/lang/CharSequence;IIIILandroid/os/IBinder;ZZZZZZ)Z
+PLcom/android/server/wm/AppWindowContainerController;->createAppWindow(Lcom/android/server/wm/WindowManagerService;Landroid/view/IApplicationToken;ZLcom/android/server/wm/DisplayContent;JZZIIIIZZLcom/android/server/wm/AppWindowContainerController;Landroid/content/res/Configuration;Landroid/graphics/Rect;)Lcom/android/server/wm/AppWindowToken;
+PLcom/android/server/wm/AppWindowContainerController;->createSnapshot(Landroid/app/ActivityManager$TaskSnapshot;)Z
+PLcom/android/server/wm/AppWindowContainerController;->getOrientation()I
+PLcom/android/server/wm/AppWindowContainerController;->getStartingWindowType(ZZZZZZLandroid/app/ActivityManager$TaskSnapshot;)I
+PLcom/android/server/wm/AppWindowContainerController;->lambda$-com_android_server_wm_AppWindowContainerController_2853()V
+PLcom/android/server/wm/AppWindowContainerController;->lambda$-com_android_server_wm_AppWindowContainerController_3148()V
+PLcom/android/server/wm/AppWindowContainerController;->lambda$-com_android_server_wm_AppWindowContainerController_3438()V
+PLcom/android/server/wm/AppWindowContainerController;->lambda$-com_android_server_wm_AppWindowContainerController_3729()V
+PLcom/android/server/wm/AppWindowContainerController;->lambda$-com_android_server_wm_AppWindowContainerController_4021()V
+PLcom/android/server/wm/AppWindowContainerController;->lambda$-com_android_server_wm_AppWindowContainerController_5567()V
+PLcom/android/server/wm/AppWindowContainerController;->notifyAppResumed(Z)V
+PLcom/android/server/wm/AppWindowContainerController;->notifyAppStopped()V
+PLcom/android/server/wm/AppWindowContainerController;->notifyUnknownVisibilityLaunched()V
+PLcom/android/server/wm/AppWindowContainerController;->pauseKeyDispatching()V
+PLcom/android/server/wm/AppWindowContainerController;->removeContainer(I)V
+PLcom/android/server/wm/AppWindowContainerController;->removeStartingWindow()V
+PLcom/android/server/wm/AppWindowContainerController;->reportStartingWindowDrawn()V
+PLcom/android/server/wm/AppWindowContainerController;->reportWindowsDrawn()V
+PLcom/android/server/wm/AppWindowContainerController;->reportWindowsGone()V
+PLcom/android/server/wm/AppWindowContainerController;->reportWindowsVisible()V
+PLcom/android/server/wm/AppWindowContainerController;->resumeKeyDispatching()V
+PLcom/android/server/wm/AppWindowContainerController;->scheduleAddStartingWindow()V
+PLcom/android/server/wm/AppWindowContainerController;->setDisablePreviewScreenshots(Z)V
+PLcom/android/server/wm/AppWindowContainerController;->setOrientation(IILandroid/content/res/Configuration;Z)Landroid/content/res/Configuration;
+PLcom/android/server/wm/AppWindowContainerController;->setVisibility(ZZ)V
+PLcom/android/server/wm/AppWindowContainerController;->snapshotFillsWidth(Landroid/app/ActivityManager$TaskSnapshot;)Z
+PLcom/android/server/wm/AppWindowContainerController;->startFreezingScreen(I)V
+PLcom/android/server/wm/AppWindowContainerController;->stopFreezingScreen(Z)V
+PLcom/android/server/wm/AppWindowToken;->-com_android_server_wm_AppWindowToken-mthref-0(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/AppWindowToken;-><init>(Lcom/android/server/wm/WindowManagerService;Landroid/view/IApplicationToken;ZLcom/android/server/wm/DisplayContent;JZZIIIIZZLcom/android/server/wm/AppWindowContainerController;Landroid/content/res/Configuration;Landroid/graphics/Rect;)V
+PLcom/android/server/wm/AppWindowToken;-><init>(Lcom/android/server/wm/WindowManagerService;Landroid/view/IApplicationToken;ZLcom/android/server/wm/DisplayContent;ZLandroid/content/res/Configuration;Landroid/graphics/Rect;)V
+PLcom/android/server/wm/AppWindowToken;->addWindow(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/AppWindowToken;->asAppWindowToken()Lcom/android/server/wm/AppWindowToken;
+PLcom/android/server/wm/AppWindowToken;->canRestoreSurfaces()Z
+PLcom/android/server/wm/AppWindowToken;->checkCompleteDeferredRemoval()Z
+PLcom/android/server/wm/AppWindowToken;->checkKeyguardFlagsChanged()V
+PLcom/android/server/wm/AppWindowToken;->clearAllDrawn()V
+PLcom/android/server/wm/AppWindowToken;->clearAnimatingFlags()V
+PLcom/android/server/wm/AppWindowToken;->clearRelaunching()V
+PLcom/android/server/wm/AppWindowToken;->clearWasVisibleBeforeClientHidden()V
+PLcom/android/server/wm/AppWindowToken;->destroySavedSurfaces()V
+PLcom/android/server/wm/AppWindowToken;->destroySurfaces()V
+PLcom/android/server/wm/AppWindowToken;->destroySurfaces(Z)V
+PLcom/android/server/wm/AppWindowToken;->fillsParent()Z
+PLcom/android/server/wm/AppWindowToken;->findMainWindow()Lcom/android/server/wm/WindowState;
+PLcom/android/server/wm/AppWindowToken;->getAnimLayerAdjustment()I
+PLcom/android/server/wm/AppWindowToken;->getController()Lcom/android/server/wm/AppWindowContainerController;
+PLcom/android/server/wm/AppWindowToken;->getOrientation(I)I
+PLcom/android/server/wm/AppWindowToken;->getOrientationIgnoreVisibility()I
+PLcom/android/server/wm/AppWindowToken;->getStack()Lcom/android/server/wm/TaskStack;
+PLcom/android/server/wm/AppWindowToken;->hasBounds()Z
+PLcom/android/server/wm/AppWindowToken;->isAnimatingInvisibleWithSavedSurface()Z
+PLcom/android/server/wm/AppWindowToken;->isClientHidden()Z
+PLcom/android/server/wm/AppWindowToken;->isFirstChildWindowGreaterThanSecond(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;)Z
+PLcom/android/server/wm/AppWindowToken;->isLastWindow(Lcom/android/server/wm/WindowState;)Z
+PLcom/android/server/wm/AppWindowToken;->isRelaunching()Z
+PLcom/android/server/wm/AppWindowToken;->isVisible()Z
+PLcom/android/server/wm/AppWindowToken;->lambda$-com_android_server_wm_AppWindowToken_64649(Lcom/android/server/wm/WindowState;)Z
+PLcom/android/server/wm/AppWindowToken;->markSavedSurfaceExiting()V
+PLcom/android/server/wm/AppWindowToken;->notifyAppResumed(Z)V
+PLcom/android/server/wm/AppWindowToken;->notifyAppStopped()V
+PLcom/android/server/wm/AppWindowToken;->onAppTransitionDone()V
+PLcom/android/server/wm/AppWindowToken;->onFirstWindowDrawn(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowStateAnimator;)V
+PLcom/android/server/wm/AppWindowToken;->onParentSet()V
+PLcom/android/server/wm/AppWindowToken;->onRemovedFromDisplay()V
+PLcom/android/server/wm/AppWindowToken;->postWindowRemoveStartingWindowCleanup(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/AppWindowToken;->removeChild(Lcom/android/server/wm/WindowContainer;)V
+PLcom/android/server/wm/AppWindowToken;->removeChild(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/AppWindowToken;->removeDeadWindows()V
+PLcom/android/server/wm/AppWindowToken;->removeIfPossible()V
+PLcom/android/server/wm/AppWindowToken;->removeImmediately()V
+PLcom/android/server/wm/AppWindowToken;->removeReplacedWindowIfNeeded(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/AppWindowToken;->requestUpdateWallpaperIfNeeded()V
+PLcom/android/server/wm/AppWindowToken;->restoreSavedSurfaceForInterestingWindows()V
+PLcom/android/server/wm/AppWindowToken;->setAllAppWinAnimators()V
+PLcom/android/server/wm/AppWindowToken;->setAppLayoutChanges(ILjava/lang/String;)V
+PLcom/android/server/wm/AppWindowToken;->setClientHidden(Z)V
+PLcom/android/server/wm/AppWindowToken;->setDisablePreviewScreenshots(Z)V
+PLcom/android/server/wm/AppWindowToken;->setVisibility(Landroid/view/WindowManager$LayoutParams;ZIZZ)Z
+PLcom/android/server/wm/AppWindowToken;->shouldUseAppThemeSnapshot()Z
+PLcom/android/server/wm/AppWindowToken;->startFreezingScreen()V
+PLcom/android/server/wm/AppWindowToken;->stopFreezingScreen(ZZ)V
+PLcom/android/server/wm/AppWindowToken;->toString()Ljava/lang/String;
+PLcom/android/server/wm/AppWindowToken;->transferStartingWindow(Landroid/os/IBinder;)Z
+PLcom/android/server/wm/AppWindowToken;->updateAllDrawn()V
+PLcom/android/server/wm/AppWindowToken;->updateReportedVisibilityLocked()V
+PLcom/android/server/wm/AppWindowToken;->waitingForReplacement()Z
+PLcom/android/server/wm/BlackFrame$BlackSurface;-><init>(Lcom/android/server/wm/BlackFrame;Landroid/view/SurfaceSession;IIIIII)V
+PLcom/android/server/wm/BlackFrame$BlackSurface;->setMatrix(Landroid/graphics/Matrix;)V
+PLcom/android/server/wm/BlackFrame;-><init>(Landroid/view/SurfaceSession;Landroid/graphics/Rect;Landroid/graphics/Rect;IIZ)V
+PLcom/android/server/wm/BlackFrame;->kill()V
+PLcom/android/server/wm/BlackFrame;->setMatrix(Landroid/graphics/Matrix;)V
+PLcom/android/server/wm/BoundsAnimationController$AppTransitionNotifier;-><init>(Lcom/android/server/wm/BoundsAnimationController;)V
+PLcom/android/server/wm/BoundsAnimationController$AppTransitionNotifier;-><init>(Lcom/android/server/wm/BoundsAnimationController;Lcom/android/server/wm/BoundsAnimationController$AppTransitionNotifier;)V
+PLcom/android/server/wm/BoundsAnimationController$AppTransitionNotifier;->animationFinished()V
+PLcom/android/server/wm/BoundsAnimationController$AppTransitionNotifier;->onAppTransitionFinishedLocked(Landroid/os/IBinder;)V
+PLcom/android/server/wm/BoundsAnimationController;->-get2(Lcom/android/server/wm/BoundsAnimationController;)Z
+PLcom/android/server/wm/BoundsAnimationController;-><init>(Landroid/content/Context;Lcom/android/server/wm/AppTransition;Landroid/os/Handler;Landroid/animation/AnimationHandler;)V
+PLcom/android/server/wm/DimLayer;-><init>(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/DimLayer$DimLayerUser;ILjava/lang/String;)V
+PLcom/android/server/wm/DimLayer;->adjustAlpha(F)V
+PLcom/android/server/wm/DimLayer;->adjustBounds()V
+PLcom/android/server/wm/DimLayer;->adjustLayer(I)V
+PLcom/android/server/wm/DimLayer;->constructSurface(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/DimLayer;->getBoundsForFullscreen(Landroid/graphics/Rect;)V
+PLcom/android/server/wm/DimLayer;->getLayer()I
+PLcom/android/server/wm/DimLayer;->getTargetAlpha()F
+PLcom/android/server/wm/DimLayer;->hide(J)V
+PLcom/android/server/wm/DimLayer;->isAnimating()Z
+PLcom/android/server/wm/DimLayer;->setAlpha(F)V
+PLcom/android/server/wm/DimLayer;->setBounds(Landroid/graphics/Rect;)V
+PLcom/android/server/wm/DimLayer;->setBoundsForFullscreen()V
+PLcom/android/server/wm/DimLayer;->setLayer(I)V
+PLcom/android/server/wm/DimLayer;->show(IFJ)V
+PLcom/android/server/wm/DimLayer;->stepAnimation()Z
+PLcom/android/server/wm/DimLayerController$DimLayerState;-><init>()V
+PLcom/android/server/wm/DimLayerController$DimLayerState;-><init>(Lcom/android/server/wm/DimLayerController$DimLayerState;)V
+PLcom/android/server/wm/DimLayerController;-><init>(Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/DimLayerController;->applyDim(Lcom/android/server/wm/DimLayer$DimLayerUser;Lcom/android/server/wm/WindowStateAnimator;Z)V
+PLcom/android/server/wm/DimLayerController;->applyDimBehind(Lcom/android/server/wm/DimLayer$DimLayerUser;Lcom/android/server/wm/WindowStateAnimator;)V
+PLcom/android/server/wm/DimLayerController;->getContinueDimming(Lcom/android/server/wm/DimLayer$DimLayerUser;)Z
+PLcom/android/server/wm/DimLayerController;->getDimLayerTag(Lcom/android/server/wm/DimLayer$DimLayerUser;)Ljava/lang/String;
+PLcom/android/server/wm/DimLayerController;->getOrCreateDimLayerState(Lcom/android/server/wm/DimLayer$DimLayerUser;)Lcom/android/server/wm/DimLayerController$DimLayerState;
+PLcom/android/server/wm/DimLayerController;->isDimming()Z
+PLcom/android/server/wm/DimLayerController;->removeDimLayerUser(Lcom/android/server/wm/DimLayer$DimLayerUser;)V
+PLcom/android/server/wm/DimLayerController;->setContinueDimming(Lcom/android/server/wm/DimLayer$DimLayerUser;)V
+PLcom/android/server/wm/DimLayerController;->startDimmingIfNeeded(Lcom/android/server/wm/DimLayer$DimLayerUser;Lcom/android/server/wm/WindowStateAnimator;Z)V
+PLcom/android/server/wm/DimLayerController;->updateDimLayer(Lcom/android/server/wm/DimLayer$DimLayerUser;)V
+PLcom/android/server/wm/DisplayContent$ApplySurfaceChangesTransactionState;-><init>()V
+PLcom/android/server/wm/DisplayContent$ApplySurfaceChangesTransactionState;-><init>(Lcom/android/server/wm/DisplayContent$ApplySurfaceChangesTransactionState;)V
+PLcom/android/server/wm/DisplayContent$ApplySurfaceChangesTransactionState;->reset()V
+PLcom/android/server/wm/DisplayContent$DisplayChildWindowContainer;-><init>()V
+PLcom/android/server/wm/DisplayContent$DisplayChildWindowContainer;->fillsParent()Z
+PLcom/android/server/wm/DisplayContent$NonAppWindowContainers;-><init>(Lcom/android/server/wm/DisplayContent;Ljava/lang/String;)V
+PLcom/android/server/wm/DisplayContent$NonAppWindowContainers;->addChild(Lcom/android/server/wm/WindowToken;)V
+PLcom/android/server/wm/DisplayContent$NonAppWindowContainers;->getOrientation()I
+PLcom/android/server/wm/DisplayContent$NonAppWindowContainers;->lambda$-com_android_server_wm_DisplayContent$NonAppWindowContainers_153307(Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/WindowToken;)I
+PLcom/android/server/wm/DisplayContent$NonAppWindowContainers;->lambda$-com_android_server_wm_DisplayContent$NonAppWindowContainers_153746(Lcom/android/server/wm/WindowState;)Z
+PLcom/android/server/wm/DisplayContent$ScreenshotApplicationState;-><init>()V
+PLcom/android/server/wm/DisplayContent$ScreenshotApplicationState;-><init>(Lcom/android/server/wm/DisplayContent$ScreenshotApplicationState;)V
+PLcom/android/server/wm/DisplayContent$ScreenshotApplicationState;->reset(Z)V
+PLcom/android/server/wm/DisplayContent$TaskForResizePointSearchResult;-><init>()V
+PLcom/android/server/wm/DisplayContent$TaskStackContainers;-><init>(Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/DisplayContent$TaskStackContainers;-><init>(Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent$TaskStackContainers;)V
+PLcom/android/server/wm/DisplayContent$TaskStackContainers;->addChild(Lcom/android/server/wm/TaskStack;Z)V
+PLcom/android/server/wm/DisplayContent$TaskStackContainers;->addStackToDisplay(Lcom/android/server/wm/TaskStack;Z)V
+PLcom/android/server/wm/DisplayContent$TaskStackContainers;->findPositionForStack(ILcom/android/server/wm/TaskStack;Z)I
+PLcom/android/server/wm/DisplayContent$TaskStackContainers;->getOrientation()I
+PLcom/android/server/wm/DisplayContent$TaskStackContainers;->positionChildAt(ILcom/android/server/wm/TaskStack;Z)V
+PLcom/android/server/wm/DisplayContent$TaskStackContainers;->positionChildAt(ILcom/android/server/wm/WindowContainer;Z)V
+PLcom/android/server/wm/DisplayContent;->-com_android_server_wm_DisplayContent-mthref-1(Landroid/graphics/Rect;IIIIZI)Landroid/graphics/GraphicBuffer;
+PLcom/android/server/wm/DisplayContent;->-get0(Lcom/android/server/wm/DisplayContent;)Lcom/android/server/wm/TaskStack;
+PLcom/android/server/wm/DisplayContent;->-get1(Lcom/android/server/wm/DisplayContent;)I
+PLcom/android/server/wm/DisplayContent;->-set0(Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/TaskStack;)Lcom/android/server/wm/TaskStack;
+PLcom/android/server/wm/DisplayContent;->-set1(Lcom/android/server/wm/DisplayContent;I)I
+PLcom/android/server/wm/DisplayContent;->-set2(Lcom/android/server/wm/DisplayContent;I)I
+PLcom/android/server/wm/DisplayContent;-><init>(Landroid/view/Display;Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowLayersController;Lcom/android/server/wm/WallpaperController;)V
+PLcom/android/server/wm/DisplayContent;->addStackToDisplay(IZ)Lcom/android/server/wm/TaskStack;
+PLcom/android/server/wm/DisplayContent;->addWindowToken(Landroid/os/IBinder;Lcom/android/server/wm/WindowToken;)V
+PLcom/android/server/wm/DisplayContent;->adjustDisplaySizeRanges(Landroid/view/DisplayInfo;IIIII)V
+PLcom/android/server/wm/DisplayContent;->animateDimLayers()Z
+PLcom/android/server/wm/DisplayContent;->assignWindowLayers(Z)V
+PLcom/android/server/wm/DisplayContent;->checkCompleteDeferredRemoval()Z
+PLcom/android/server/wm/DisplayContent;->checkWaitingForWindows()Z
+PLcom/android/server/wm/DisplayContent;->clearLayoutNeeded()V
+PLcom/android/server/wm/DisplayContent;->computeCompatSmallestWidth(ZIIII)I
+PLcom/android/server/wm/DisplayContent;->computeImeTarget(Z)Lcom/android/server/wm/WindowState;
+PLcom/android/server/wm/DisplayContent;->computeScreenConfiguration(Landroid/content/res/Configuration;)V
+PLcom/android/server/wm/DisplayContent;->computeSizeRangesAndScreenLayout(Landroid/view/DisplayInfo;IZIIIFLandroid/content/res/Configuration;)V
+PLcom/android/server/wm/DisplayContent;->convertCropForSurfaceFlinger(Landroid/graphics/Rect;III)V
+PLcom/android/server/wm/DisplayContent;->deltaRotation(II)I
+PLcom/android/server/wm/DisplayContent;->findFocusedWindow()Lcom/android/server/wm/WindowState;
+PLcom/android/server/wm/DisplayContent;->forAllImeWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z
+PLcom/android/server/wm/DisplayContent;->getDisplay()Landroid/view/Display;
+PLcom/android/server/wm/DisplayContent;->getDisplayMetrics()Landroid/util/DisplayMetrics;
+PLcom/android/server/wm/DisplayContent;->getDockedDividerController()Lcom/android/server/wm/DockedStackDividerController;
+PLcom/android/server/wm/DisplayContent;->getDockedStackIgnoringVisibility()Lcom/android/server/wm/TaskStack;
+PLcom/android/server/wm/DisplayContent;->getLastOrientation()I
+PLcom/android/server/wm/DisplayContent;->getNeedsMenu(Lcom/android/server/wm/WindowState;Landroid/view/WindowManagerPolicy$WindowState;)Z
+PLcom/android/server/wm/DisplayContent;->getOrientation()I
+PLcom/android/server/wm/DisplayContent;->getPinnedStackController()Lcom/android/server/wm/PinnedStackController;
+PLcom/android/server/wm/DisplayContent;->getRotation()I
+PLcom/android/server/wm/DisplayContent;->getWindowToken(Landroid/os/IBinder;)Lcom/android/server/wm/WindowToken;
+PLcom/android/server/wm/DisplayContent;->hasAccess(I)Z
+PLcom/android/server/wm/DisplayContent;->hasSecureWindowOnScreen()Z
+PLcom/android/server/wm/DisplayContent;->initializeDisplayBaseInfo()V
+PLcom/android/server/wm/DisplayContent;->inputMethodClientHasFocus(Lcom/android/internal/view/IInputMethodClient;)Z
+PLcom/android/server/wm/DisplayContent;->isDimming()Z
+PLcom/android/server/wm/DisplayContent;->isLayoutNeeded()Z
+PLcom/android/server/wm/DisplayContent;->isReady()Z
+PLcom/android/server/wm/DisplayContent;->isRemovalDeferred()Z
+PLcom/android/server/wm/DisplayContent;->lambda$-com_android_server_wm_DisplayContent_109805(Lcom/android/server/wm/WindowState;Landroid/view/WindowManagerPolicy$WindowState;Lcom/android/server/wm/WindowState;)Z
+PLcom/android/server/wm/DisplayContent;->lambda$-com_android_server_wm_DisplayContent_112425(Landroid/view/WindowManagerPolicy;ZZLcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/DisplayContent;->lambda$-com_android_server_wm_DisplayContent_112991(Lcom/android/server/wm/WindowState;)Z
+PLcom/android/server/wm/DisplayContent;->lambda$-com_android_server_wm_DisplayContent_117361(IILcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/DisplayContent;->lambda$-com_android_server_wm_DisplayContent_118293(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/DisplayContent;->lambda$-com_android_server_wm_DisplayContent_118854(Landroid/view/WindowManagerPolicy;Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/DisplayContent;->lambda$-com_android_server_wm_DisplayContent_130079(IZLandroid/os/IBinder;Landroid/util/MutableBoolean;ZLandroid/graphics/Rect;Landroid/graphics/Rect;Lcom/android/server/wm/WindowState;)Z
+PLcom/android/server/wm/DisplayContent;->lambda$-com_android_server_wm_DisplayContent_20286(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/DisplayContent;->lambda$-com_android_server_wm_DisplayContent_20782(Lcom/android/server/wm/WindowState;)Z
+PLcom/android/server/wm/DisplayContent;->lambda$-com_android_server_wm_DisplayContent_28225(Lcom/android/server/wm/WindowState;)Z
+PLcom/android/server/wm/DisplayContent;->layoutAndAssignWindowLayersIfNeeded()V
+PLcom/android/server/wm/DisplayContent;->onAppTransitionDone()V
+PLcom/android/server/wm/DisplayContent;->onConfigurationChanged(Landroid/content/res/Configuration;)V
+PLcom/android/server/wm/DisplayContent;->onWindowFreezeTimeout()V
+PLcom/android/server/wm/DisplayContent;->positionChildAt(ILcom/android/server/wm/DisplayContent$DisplayChildWindowContainer;Z)V
+PLcom/android/server/wm/DisplayContent;->positionChildAt(ILcom/android/server/wm/WindowContainer;Z)V
+PLcom/android/server/wm/DisplayContent;->prepareFreezingTaskBounds()V
+PLcom/android/server/wm/DisplayContent;->prepareWindowSurfaces()V
+PLcom/android/server/wm/DisplayContent;->reParentWindowToken(Lcom/android/server/wm/WindowToken;)V
+PLcom/android/server/wm/DisplayContent;->reduceCompatConfigWidthSize(IIILandroid/util/DisplayMetrics;III)I
+PLcom/android/server/wm/DisplayContent;->reduceConfigLayout(IIFIIII)I
+PLcom/android/server/wm/DisplayContent;->removeAppToken(Landroid/os/IBinder;)V
+PLcom/android/server/wm/DisplayContent;->removeExistingTokensIfPossible()V
+PLcom/android/server/wm/DisplayContent;->removeWindowToken(Landroid/os/IBinder;)Lcom/android/server/wm/WindowToken;
+PLcom/android/server/wm/DisplayContent;->resetDimming()V
+PLcom/android/server/wm/DisplayContent;->scheduleToastWindowsTimeoutIfNeededLocked(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/DisplayContent;->screenshotApplications(Landroid/os/IBinder;IIZFZZLcom/android/server/wm/DisplayContent$Screenshoter;)Ljava/lang/Object;
+PLcom/android/server/wm/DisplayContent;->screenshotApplicationsToBuffer(Landroid/os/IBinder;IIZFZZ)Landroid/graphics/GraphicBuffer;
+PLcom/android/server/wm/DisplayContent;->setExitingTokensHasVisible(Z)V
+PLcom/android/server/wm/DisplayContent;->setInputMethodAnimLayerAdjustment(I)V
+PLcom/android/server/wm/DisplayContent;->setInputMethodTarget(Lcom/android/server/wm/WindowState;ZI)V
+PLcom/android/server/wm/DisplayContent;->setLastOrientation(I)V
+PLcom/android/server/wm/DisplayContent;->setLayoutNeeded()V
+PLcom/android/server/wm/DisplayContent;->startKeyguardExitOnNonAppWindows(ZZ)V
+PLcom/android/server/wm/DisplayContent;->stopDimmingIfNeeded()V
+PLcom/android/server/wm/DisplayContent;->updateBaseDisplayMetrics(III)V
+PLcom/android/server/wm/DisplayContent;->updateBaseDisplayMetricsIfNeeded()V
+PLcom/android/server/wm/DisplayContent;->updateDisplayAndOrientation(I)Landroid/view/DisplayInfo;
+PLcom/android/server/wm/DisplayContent;->updateDisplayInfo()V
+PLcom/android/server/wm/DisplayContent;->updateRotationUnchecked(Z)Z
+PLcom/android/server/wm/DisplayContent;->updateStackBoundsAfterConfigChange(Ljava/util/List;)V
+PLcom/android/server/wm/DisplayContent;->updateSystemUiVisibility(II)V
+PLcom/android/server/wm/DisplayContent;->updateWallpaperForAnimator(Lcom/android/server/wm/WindowAnimator;)V
+PLcom/android/server/wm/DisplayContent;->updateWindowsForAnimator(Lcom/android/server/wm/WindowAnimator;)V
+PLcom/android/server/wm/DisplayContent;->waitForAllWindowsDrawn()V
+PLcom/android/server/wm/DisplaySettings;-><init>()V
+PLcom/android/server/wm/DisplaySettings;->getOverscanLocked(Ljava/lang/String;Ljava/lang/String;Landroid/graphics/Rect;)V
+PLcom/android/server/wm/DisplaySettings;->readSettingsLocked()V
+PLcom/android/server/wm/DockedStackDividerController;-><init>(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/DockedStackDividerController;->animate(J)Z
+PLcom/android/server/wm/DockedStackDividerController;->checkMinimizeChanged(Z)V
+PLcom/android/server/wm/DockedStackDividerController;->getContentWidth()I
+PLcom/android/server/wm/DockedStackDividerController;->getImeHeightAdjustedFor()I
+PLcom/android/server/wm/DockedStackDividerController;->initSnapAlgorithmForRotations()V
+PLcom/android/server/wm/DockedStackDividerController;->isHomeStackResizable()Z
+PLcom/android/server/wm/DockedStackDividerController;->isImeHideRequested()Z
+PLcom/android/server/wm/DockedStackDividerController;->isMinimizedDock()Z
+PLcom/android/server/wm/DockedStackDividerController;->loadDimens()V
+PLcom/android/server/wm/DockedStackDividerController;->notifyAdjustedForImeChanged(ZJ)V
+PLcom/android/server/wm/DockedStackDividerController;->notifyAppTransitionStarting(Landroid/util/ArraySet;I)V
+PLcom/android/server/wm/DockedStackDividerController;->notifyAppVisibilityChanged()V
+PLcom/android/server/wm/DockedStackDividerController;->notifyDockedDividerVisibilityChanged(Z)V
+PLcom/android/server/wm/DockedStackDividerController;->notifyDockedStackExistsChanged(Z)V
+PLcom/android/server/wm/DockedStackDividerController;->notifyDockedStackMinimizedChanged(ZZZ)V
+PLcom/android/server/wm/DockedStackDividerController;->onConfigurationChanged()V
+PLcom/android/server/wm/DockedStackDividerController;->positionDockedStackedDivider(Landroid/graphics/Rect;)V
+PLcom/android/server/wm/DockedStackDividerController;->reevaluateVisibility(Z)V
+PLcom/android/server/wm/DockedStackDividerController;->registerDockedStackListener(Landroid/view/IDockedStackListener;)V
+PLcom/android/server/wm/DockedStackDividerController;->resetImeHideRequested()V
+PLcom/android/server/wm/DockedStackDividerController;->setAdjustedForIme(ZZZLcom/android/server/wm/WindowState;I)V
+PLcom/android/server/wm/DockedStackDividerController;->setMinimizedDockedStack(ZZ)V
+PLcom/android/server/wm/DockedStackDividerController;->setTouchRegion(Landroid/graphics/Rect;)V
+PLcom/android/server/wm/DockedStackDividerController;->setWindow(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/DockedStackDividerController;->wasVisible()Z
+PLcom/android/server/wm/InputConsumerImpl;-><init>(Lcom/android/server/wm/WindowManagerService;Ljava/lang/String;Landroid/view/InputChannel;)V
+PLcom/android/server/wm/InputConsumerImpl;->getLayerLw(I)I
+PLcom/android/server/wm/InputConsumerImpl;->layout(II)V
+PLcom/android/server/wm/InputMonitor$UpdateInputForAllWindowsConsumer;->-wrap0(Lcom/android/server/wm/InputMonitor$UpdateInputForAllWindowsConsumer;Z)V
+PLcom/android/server/wm/InputMonitor$UpdateInputForAllWindowsConsumer;-><init>(Lcom/android/server/wm/InputMonitor;)V
+PLcom/android/server/wm/InputMonitor$UpdateInputForAllWindowsConsumer;-><init>(Lcom/android/server/wm/InputMonitor;Lcom/android/server/wm/InputMonitor$UpdateInputForAllWindowsConsumer;)V
+PLcom/android/server/wm/InputMonitor;->-get1(Lcom/android/server/wm/InputMonitor;)Z
+PLcom/android/server/wm/InputMonitor;->-get3(Lcom/android/server/wm/InputMonitor;)Z
+PLcom/android/server/wm/InputMonitor;->-get4(Lcom/android/server/wm/InputMonitor;)Lcom/android/server/input/InputWindowHandle;
+PLcom/android/server/wm/InputMonitor;->-get6(Lcom/android/server/wm/InputMonitor;)[Lcom/android/server/input/InputWindowHandle;
+PLcom/android/server/wm/InputMonitor;->-get7(Lcom/android/server/wm/InputMonitor;)Lcom/android/server/wm/WindowManagerService;
+PLcom/android/server/wm/InputMonitor;->-get8(Lcom/android/server/wm/InputMonitor;)Landroid/graphics/Rect;
+PLcom/android/server/wm/InputMonitor;->-set0(Lcom/android/server/wm/InputMonitor;Z)Z
+PLcom/android/server/wm/InputMonitor;->-set1(Lcom/android/server/wm/InputMonitor;Z)Z
+PLcom/android/server/wm/InputMonitor;->-set2(Lcom/android/server/wm/InputMonitor;Z)Z
+PLcom/android/server/wm/InputMonitor;->-set3(Lcom/android/server/wm/InputMonitor;Z)Z
+PLcom/android/server/wm/InputMonitor;->-wrap1(Lcom/android/server/wm/InputMonitor;)V
+PLcom/android/server/wm/InputMonitor;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/InputMonitor;->addInputConsumer(Ljava/lang/String;Lcom/android/server/wm/InputConsumerImpl;)V
+PLcom/android/server/wm/InputMonitor;->createInputConsumer(Ljava/lang/String;Landroid/view/InputChannel;)V
+PLcom/android/server/wm/InputMonitor;->destroyInputConsumer(Ljava/lang/String;)Z
+PLcom/android/server/wm/InputMonitor;->dispatchUnhandledKey(Lcom/android/server/input/InputWindowHandle;Landroid/view/KeyEvent;I)Landroid/view/KeyEvent;
+PLcom/android/server/wm/InputMonitor;->disposeInputConsumer(Lcom/android/server/wm/InputConsumerImpl;)Z
+PLcom/android/server/wm/InputMonitor;->freezeInputDispatchingLw()V
+PLcom/android/server/wm/InputMonitor;->interceptKeyBeforeDispatching(Lcom/android/server/input/InputWindowHandle;Landroid/view/KeyEvent;I)J
+PLcom/android/server/wm/InputMonitor;->interceptKeyBeforeQueueing(Landroid/view/KeyEvent;I)I
+PLcom/android/server/wm/InputMonitor;->layoutInputConsumers(II)V
+PLcom/android/server/wm/InputMonitor;->notifyConfigurationChanged()V
+PLcom/android/server/wm/InputMonitor;->pauseDispatchingLw(Lcom/android/server/wm/WindowToken;)V
+PLcom/android/server/wm/InputMonitor;->resumeDispatchingLw(Lcom/android/server/wm/WindowToken;)V
+PLcom/android/server/wm/InputMonitor;->setEventDispatchingLw(Z)V
+PLcom/android/server/wm/InputMonitor;->setFocusedAppLw(Lcom/android/server/wm/AppWindowToken;)V
+PLcom/android/server/wm/InputMonitor;->setInputFocusLw(Lcom/android/server/wm/WindowState;Z)V
+PLcom/android/server/wm/InputMonitor;->setUpdateInputWindowsNeededLw()V
+PLcom/android/server/wm/InputMonitor;->thawInputDispatchingLw()V
+PLcom/android/server/wm/InputMonitor;->updateInputDispatchModeLw()V
+PLcom/android/server/wm/InputMonitor;->updateInputWindowsLw(Z)V
+PLcom/android/server/wm/InputMonitor;->waitForInputDevicesReady(J)Z
+PLcom/android/server/wm/KeyguardDisableHandler;-><init>(Landroid/content/Context;Landroid/view/WindowManagerPolicy;)V
+PLcom/android/server/wm/PinnedStackController$PinnedStackControllerCallback;-><init>(Lcom/android/server/wm/PinnedStackController;)V
+PLcom/android/server/wm/PinnedStackController$PinnedStackControllerCallback;-><init>(Lcom/android/server/wm/PinnedStackController;Lcom/android/server/wm/PinnedStackController$PinnedStackControllerCallback;)V
+PLcom/android/server/wm/PinnedStackController$PinnedStackControllerCallback;->lambda$-com_android_server_wm_PinnedStackController$PinnedStackControllerCallback_4973(I)V
+PLcom/android/server/wm/PinnedStackController$PinnedStackControllerCallback;->setMinEdgeSize(I)V
+PLcom/android/server/wm/PinnedStackController$PinnedStackListenerDeathHandler;-><init>(Lcom/android/server/wm/PinnedStackController;)V
+PLcom/android/server/wm/PinnedStackController$PinnedStackListenerDeathHandler;-><init>(Lcom/android/server/wm/PinnedStackController;Lcom/android/server/wm/PinnedStackController$PinnedStackListenerDeathHandler;)V
+PLcom/android/server/wm/PinnedStackController;->-get0(Lcom/android/server/wm/PinnedStackController;)I
+PLcom/android/server/wm/PinnedStackController;->-get2(Lcom/android/server/wm/PinnedStackController;)Landroid/os/Handler;
+PLcom/android/server/wm/PinnedStackController;->-set0(Lcom/android/server/wm/PinnedStackController;I)I
+PLcom/android/server/wm/PinnedStackController;-><init>(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/PinnedStackController;->dpToPx(FLandroid/util/DisplayMetrics;)I
+PLcom/android/server/wm/PinnedStackController;->getDefaultBounds()Landroid/graphics/Rect;
+PLcom/android/server/wm/PinnedStackController;->getInsetBounds(Landroid/graphics/Rect;)V
+PLcom/android/server/wm/PinnedStackController;->getMovementBounds(Landroid/graphics/Rect;)Landroid/graphics/Rect;
+PLcom/android/server/wm/PinnedStackController;->getMovementBounds(Landroid/graphics/Rect;Z)Landroid/graphics/Rect;
+PLcom/android/server/wm/PinnedStackController;->isValidPictureInPictureAspectRatio(F)Z
+PLcom/android/server/wm/PinnedStackController;->notifyActionsChanged(Ljava/util/List;)V
+PLcom/android/server/wm/PinnedStackController;->notifyImeVisibilityChanged(ZI)V
+PLcom/android/server/wm/PinnedStackController;->notifyMinimizeChanged(Z)V
+PLcom/android/server/wm/PinnedStackController;->notifyMovementBoundsChanged(Z)V
+PLcom/android/server/wm/PinnedStackController;->onConfigurationChanged()V
+PLcom/android/server/wm/PinnedStackController;->onDisplayInfoChanged()V
+PLcom/android/server/wm/PinnedStackController;->registerPinnedStackListener(Landroid/view/IPinnedStackListener;)V
+PLcom/android/server/wm/PinnedStackController;->reloadResources()V
+PLcom/android/server/wm/PinnedStackController;->setAdjustedForIme(ZI)V
+PLcom/android/server/wm/PinnedStackController;->transformBoundsToAspectRatio(Landroid/graphics/Rect;FZ)Landroid/graphics/Rect;
+PLcom/android/server/wm/PointerEventDispatcher;-><init>(Landroid/view/InputChannel;)V
+PLcom/android/server/wm/PointerEventDispatcher;->registerInputEventListener(Landroid/view/WindowManagerPolicy$PointerEventListener;)V
+PLcom/android/server/wm/RootWindowContainer$MyHandler;-><init>(Lcom/android/server/wm/RootWindowContainer;Landroid/os/Looper;)V
+PLcom/android/server/wm/RootWindowContainer$MyHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/wm/RootWindowContainer;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/RootWindowContainer;->applySurfaceChangesTransaction(ZII)V
+PLcom/android/server/wm/RootWindowContainer;->closeSystemDialogs(Ljava/lang/String;)V
+PLcom/android/server/wm/RootWindowContainer;->computeFocusedWindow()Lcom/android/server/wm/WindowState;
+PLcom/android/server/wm/RootWindowContainer;->copyAnimToLayoutParams()Z
+PLcom/android/server/wm/RootWindowContainer;->createDisplayContent(Landroid/view/Display;)Lcom/android/server/wm/DisplayContent;
+PLcom/android/server/wm/RootWindowContainer;->getDisplaysInFocusOrder(Landroid/util/SparseIntArray;)V
+PLcom/android/server/wm/RootWindowContainer;->getWindowTokenDisplay(Lcom/android/server/wm/WindowToken;)Lcom/android/server/wm/DisplayContent;
+PLcom/android/server/wm/RootWindowContainer;->lambda$-com_android_server_wm_RootWindowContainer_17105(IZLcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/RootWindowContainer;->lambda$-com_android_server_wm_RootWindowContainer_6986(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/RootWindowContainer;->lambda$-com_android_server_wm_RootWindowContainer_7267(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/RootWindowContainer;->onConfigurationChanged(Landroid/content/res/Configuration;)V
+PLcom/android/server/wm/RootWindowContainer;->prepareFreezingTaskBounds()V
+PLcom/android/server/wm/RootWindowContainer;->removeReplacedWindows()V
+PLcom/android/server/wm/RootWindowContainer;->setDisplayOverrideConfigurationIfNeeded(Landroid/content/res/Configuration;I)[I
+PLcom/android/server/wm/RootWindowContainer;->setGlobalConfigurationIfNeeded(Landroid/content/res/Configuration;)[I
+PLcom/android/server/wm/RootWindowContainer;->setSecureSurfaceState(IZ)V
+PLcom/android/server/wm/RootWindowContainer;->updateStackBoundsAfterConfigChange()[I
+PLcom/android/server/wm/ScreenRotationAnimation;-><init>(Landroid/content/Context;Lcom/android/server/wm/DisplayContent;Landroid/view/SurfaceSession;ZZZLcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/ScreenRotationAnimation;->createRotationMatrix(IIILandroid/graphics/Matrix;)V
+PLcom/android/server/wm/ScreenRotationAnimation;->dismiss(Landroid/view/SurfaceSession;JFIIII)Z
+PLcom/android/server/wm/ScreenRotationAnimation;->getEnterTransformation()Landroid/view/animation/Transformation;
+PLcom/android/server/wm/ScreenRotationAnimation;->hasAnimations()Z
+PLcom/android/server/wm/ScreenRotationAnimation;->hasScreenshot()Z
+PLcom/android/server/wm/ScreenRotationAnimation;->isAnimating()Z
+PLcom/android/server/wm/ScreenRotationAnimation;->isRotating()Z
+PLcom/android/server/wm/ScreenRotationAnimation;->kill()V
+PLcom/android/server/wm/ScreenRotationAnimation;->setRotationInTransaction(I)V
+PLcom/android/server/wm/ScreenRotationAnimation;->setSnapshotTransformInTransaction(Landroid/graphics/Matrix;F)V
+PLcom/android/server/wm/ScreenRotationAnimation;->startAnimation(Landroid/view/SurfaceSession;JFIIZII)Z
+PLcom/android/server/wm/ScreenRotationAnimation;->stepAnimation(J)Z
+PLcom/android/server/wm/ScreenRotationAnimation;->stepAnimationLocked(J)Z
+PLcom/android/server/wm/ScreenRotationAnimation;->updateSurfacesInTransaction()V
+PLcom/android/server/wm/Session;-><init>(Lcom/android/server/wm/WindowManagerService;Landroid/view/IWindowSessionCallback;Lcom/android/internal/view/IInputMethodClient;Lcom/android/internal/view/IInputContext;)V
+PLcom/android/server/wm/Session;->addToDisplay(Landroid/view/IWindow;ILandroid/view/WindowManager$LayoutParams;IILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/view/InputChannel;)I
+PLcom/android/server/wm/Session;->binderDied()V
+PLcom/android/server/wm/Session;->cancelAlertWindowNotification()V
+PLcom/android/server/wm/Session;->finishDrawing(Landroid/view/IWindow;)V
+PLcom/android/server/wm/Session;->getDisplayFrame(Landroid/view/IWindow;Landroid/graphics/Rect;)V
+PLcom/android/server/wm/Session;->getInTouchMode()Z
+PLcom/android/server/wm/Session;->getWindowId(Landroid/os/IBinder;)Landroid/view/IWindowId;
+PLcom/android/server/wm/Session;->killSessionLocked()V
+PLcom/android/server/wm/Session;->onRectangleOnScreenRequested(Landroid/os/IBinder;Landroid/graphics/Rect;)V
+PLcom/android/server/wm/Session;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+PLcom/android/server/wm/Session;->onWindowSurfaceVisibilityChanged(Lcom/android/server/wm/WindowSurfaceController;ZI)V
+PLcom/android/server/wm/Session;->performHapticFeedback(Landroid/view/IWindow;IZ)Z
+PLcom/android/server/wm/Session;->relayout(Landroid/view/IWindow;ILandroid/view/WindowManager$LayoutParams;IIIILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/util/MergedConfiguration;Landroid/view/Surface;)I
+PLcom/android/server/wm/Session;->remove(Landroid/view/IWindow;)V
+PLcom/android/server/wm/Session;->sendWallpaperCommand(Landroid/os/IBinder;Ljava/lang/String;IIILandroid/os/Bundle;Z)Landroid/os/Bundle;
+PLcom/android/server/wm/Session;->setHasOverlayUi(Z)V
+PLcom/android/server/wm/Session;->setInsets(Landroid/view/IWindow;ILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Region;)V
+PLcom/android/server/wm/Session;->setTransparentRegion(Landroid/view/IWindow;Landroid/graphics/Region;)V
+PLcom/android/server/wm/Session;->setWallpaperPosition(Landroid/os/IBinder;FFFF)V
+PLcom/android/server/wm/Session;->wallpaperOffsetsComplete(Landroid/os/IBinder;)V
+PLcom/android/server/wm/Session;->windowAddedLocked(Ljava/lang/String;)V
+PLcom/android/server/wm/Session;->windowRemovedLocked()V
+PLcom/android/server/wm/SnapshotStartingData;-><init>(Lcom/android/server/wm/WindowManagerService;Landroid/app/ActivityManager$TaskSnapshot;)V
+PLcom/android/server/wm/SnapshotStartingData;->createStartingSurface(Lcom/android/server/wm/AppWindowToken;)Landroid/view/WindowManagerPolicy$StartingSurface;
+PLcom/android/server/wm/SplashScreenStartingData;-><init>(Lcom/android/server/wm/WindowManagerService;Ljava/lang/String;ILandroid/content/res/CompatibilityInfo;Ljava/lang/CharSequence;IIIILandroid/content/res/Configuration;)V
+PLcom/android/server/wm/SplashScreenStartingData;->createStartingSurface(Lcom/android/server/wm/AppWindowToken;)Landroid/view/WindowManagerPolicy$StartingSurface;
+PLcom/android/server/wm/StackWindowController$H;-><init>(Ljava/lang/ref/WeakReference;Landroid/os/Looper;)V
+PLcom/android/server/wm/StackWindowController;-><init>(ILcom/android/server/wm/StackWindowListener;IZLandroid/graphics/Rect;)V
+PLcom/android/server/wm/StackWindowController;-><init>(ILcom/android/server/wm/StackWindowListener;IZLandroid/graphics/Rect;Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/StackWindowController;->getBounds(Landroid/graphics/Rect;)V
+PLcom/android/server/wm/StackWindowController;->getRawBounds(Landroid/graphics/Rect;)V
+PLcom/android/server/wm/StackWindowController;->positionChildAtTop(Lcom/android/server/wm/TaskWindowContainerController;Z)V
+PLcom/android/server/wm/StartingData;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/Task;-><init>(ILcom/android/server/wm/TaskStack;ILcom/android/server/wm/WindowManagerService;Landroid/graphics/Rect;Landroid/content/res/Configuration;IZZLandroid/app/ActivityManager$TaskDescription;Lcom/android/server/wm/TaskWindowContainerController;)V
+PLcom/android/server/wm/Task;->addChild(Lcom/android/server/wm/AppWindowToken;I)V
+PLcom/android/server/wm/Task;->cancelTaskThumbnailTransition()V
+PLcom/android/server/wm/Task;->cancelTaskWindowTransition()V
+PLcom/android/server/wm/Task;->fillsParent()Z
+PLcom/android/server/wm/Task;->forceWindowsScaleable(Z)V
+PLcom/android/server/wm/Task;->getAdjustedAddPosition(I)I
+PLcom/android/server/wm/Task;->getBounds(Landroid/graphics/Rect;)V
+PLcom/android/server/wm/Task;->getController()Lcom/android/server/wm/TaskWindowContainerController;
+PLcom/android/server/wm/Task;->getTaskDescription()Landroid/app/ActivityManager$TaskDescription;
+PLcom/android/server/wm/Task;->hasWindowsAlive()Z
+PLcom/android/server/wm/Task;->isDragResizing()Z
+PLcom/android/server/wm/Task;->isFloating()Z
+PLcom/android/server/wm/Task;->isHomeTask()Z
+PLcom/android/server/wm/Task;->onParentSet()V
+PLcom/android/server/wm/Task;->positionChildAt(ILcom/android/server/wm/AppWindowToken;Z)V
+PLcom/android/server/wm/Task;->removeChild(Lcom/android/server/wm/AppWindowToken;)V
+PLcom/android/server/wm/Task;->removeChild(Lcom/android/server/wm/WindowContainer;)V
+PLcom/android/server/wm/Task;->removeIfPossible()V
+PLcom/android/server/wm/Task;->removeImmediately()V
+PLcom/android/server/wm/Task;->setBounds(Landroid/graphics/Rect;Landroid/content/res/Configuration;)I
+PLcom/android/server/wm/Task;->setSendingToBottom(Z)V
+PLcom/android/server/wm/Task;->setTaskDescription(Landroid/app/ActivityManager$TaskDescription;)V
+PLcom/android/server/wm/Task;->shouldDeferRemoval()Z
+PLcom/android/server/wm/Task;->showForAllUsers()Z
+PLcom/android/server/wm/Task;->updateDisplayInfo(Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/TaskSnapshotCache$CacheEntry;-><init>(Landroid/app/ActivityManager$TaskSnapshot;Lcom/android/server/wm/AppWindowToken;)V
+PLcom/android/server/wm/TaskSnapshotCache;-><init>(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/TaskSnapshotLoader;)V
+PLcom/android/server/wm/TaskSnapshotCache;->getSnapshot(IIZZ)Landroid/app/ActivityManager$TaskSnapshot;
+PLcom/android/server/wm/TaskSnapshotCache;->onAppRemoved(Lcom/android/server/wm/AppWindowToken;)V
+PLcom/android/server/wm/TaskSnapshotCache;->onTaskRemoved(I)V
+PLcom/android/server/wm/TaskSnapshotCache;->putSnapshot(Lcom/android/server/wm/Task;Landroid/app/ActivityManager$TaskSnapshot;)V
+PLcom/android/server/wm/TaskSnapshotCache;->removeRunningEntry(I)V
+PLcom/android/server/wm/TaskSnapshotCache;->tryRestoreFromDisk(IIZ)Landroid/app/ActivityManager$TaskSnapshot;
+PLcom/android/server/wm/TaskSnapshotController;->-com_android_server_wm_TaskSnapshotController-mthref-0(I)Ljava/io/File;
+PLcom/android/server/wm/TaskSnapshotController;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/TaskSnapshotController;->createStartingSurface(Lcom/android/server/wm/AppWindowToken;Landroid/app/ActivityManager$TaskSnapshot;)Landroid/view/WindowManagerPolicy$StartingSurface;
+PLcom/android/server/wm/TaskSnapshotController;->drawAppThemeSnapshot(Lcom/android/server/wm/Task;)Landroid/app/ActivityManager$TaskSnapshot;
+PLcom/android/server/wm/TaskSnapshotController;->getClosingTasks(Landroid/util/ArraySet;Landroid/util/ArraySet;)V
+PLcom/android/server/wm/TaskSnapshotController;->getSnapshot(IIZZ)Landroid/app/ActivityManager$TaskSnapshot;
+PLcom/android/server/wm/TaskSnapshotController;->getSnapshotMode(Lcom/android/server/wm/Task;)I
+PLcom/android/server/wm/TaskSnapshotController;->handleClosingApps(Landroid/util/ArraySet;)V
+PLcom/android/server/wm/TaskSnapshotController;->minRect(Landroid/graphics/Rect;Landroid/graphics/Rect;)Landroid/graphics/Rect;
+PLcom/android/server/wm/TaskSnapshotController;->notifyAppVisibilityChanged(Lcom/android/server/wm/AppWindowToken;Z)V
+PLcom/android/server/wm/TaskSnapshotController;->notifyTaskRemovedFromRecents(II)V
+PLcom/android/server/wm/TaskSnapshotController;->onAppRemoved(Lcom/android/server/wm/AppWindowToken;)V
+PLcom/android/server/wm/TaskSnapshotController;->onTransitionStarting()V
+PLcom/android/server/wm/TaskSnapshotController;->removeObsoleteTaskFiles(Landroid/util/ArraySet;[I)V
+PLcom/android/server/wm/TaskSnapshotController;->setPersisterPaused(Z)V
+PLcom/android/server/wm/TaskSnapshotController;->shouldDisableSnapshots()Z
+PLcom/android/server/wm/TaskSnapshotController;->snapshotTask(Lcom/android/server/wm/Task;)Landroid/app/ActivityManager$TaskSnapshot;
+PLcom/android/server/wm/TaskSnapshotController;->snapshotTasks(Landroid/util/ArraySet;)V
+PLcom/android/server/wm/TaskSnapshotController;->systemReady()V
+PLcom/android/server/wm/TaskSnapshotLoader;-><init>(Lcom/android/server/wm/TaskSnapshotPersister;)V
+PLcom/android/server/wm/TaskSnapshotLoader;->loadTask(IIZ)Landroid/app/ActivityManager$TaskSnapshot;
+PLcom/android/server/wm/TaskSnapshotPersister$1;-><init>(Lcom/android/server/wm/TaskSnapshotPersister;Ljava/lang/String;)V
+PLcom/android/server/wm/TaskSnapshotPersister$1;->run()V
+PLcom/android/server/wm/TaskSnapshotPersister$DeleteWriteQueueItem;-><init>(Lcom/android/server/wm/TaskSnapshotPersister;II)V
+PLcom/android/server/wm/TaskSnapshotPersister$DeleteWriteQueueItem;->write()V
+PLcom/android/server/wm/TaskSnapshotPersister$RemoveObsoleteFilesQueueItem;-><init>(Lcom/android/server/wm/TaskSnapshotPersister;Landroid/util/ArraySet;[I)V
+PLcom/android/server/wm/TaskSnapshotPersister$RemoveObsoleteFilesQueueItem;->getTaskId(Ljava/lang/String;)I
+PLcom/android/server/wm/TaskSnapshotPersister$RemoveObsoleteFilesQueueItem;->write()V
+PLcom/android/server/wm/TaskSnapshotPersister$StoreWriteQueueItem;-><init>(Lcom/android/server/wm/TaskSnapshotPersister;IILandroid/app/ActivityManager$TaskSnapshot;)V
+PLcom/android/server/wm/TaskSnapshotPersister$StoreWriteQueueItem;->onDequeuedLocked()V
+PLcom/android/server/wm/TaskSnapshotPersister$StoreWriteQueueItem;->onQueuedLocked()V
+PLcom/android/server/wm/TaskSnapshotPersister$StoreWriteQueueItem;->write()V
+PLcom/android/server/wm/TaskSnapshotPersister$StoreWriteQueueItem;->writeBuffer()Z
+PLcom/android/server/wm/TaskSnapshotPersister$StoreWriteQueueItem;->writeProto()Z
+PLcom/android/server/wm/TaskSnapshotPersister$WriteQueueItem;-><init>(Lcom/android/server/wm/TaskSnapshotPersister;)V
+PLcom/android/server/wm/TaskSnapshotPersister$WriteQueueItem;-><init>(Lcom/android/server/wm/TaskSnapshotPersister;Lcom/android/server/wm/TaskSnapshotPersister$WriteQueueItem;)V
+PLcom/android/server/wm/TaskSnapshotPersister$WriteQueueItem;->onDequeuedLocked()V
+PLcom/android/server/wm/TaskSnapshotPersister$WriteQueueItem;->onQueuedLocked()V
+PLcom/android/server/wm/TaskSnapshotPersister;->-get1(Lcom/android/server/wm/TaskSnapshotPersister;)Ljava/lang/Object;
+PLcom/android/server/wm/TaskSnapshotPersister;->-get2(Lcom/android/server/wm/TaskSnapshotPersister;)Z
+PLcom/android/server/wm/TaskSnapshotPersister;->-get3(Lcom/android/server/wm/TaskSnapshotPersister;)Landroid/util/ArraySet;
+PLcom/android/server/wm/TaskSnapshotPersister;->-get4(Lcom/android/server/wm/TaskSnapshotPersister;)Ljava/util/ArrayDeque;
+PLcom/android/server/wm/TaskSnapshotPersister;->-get5(Lcom/android/server/wm/TaskSnapshotPersister;)Ljava/util/ArrayDeque;
+PLcom/android/server/wm/TaskSnapshotPersister;->-set0(Lcom/android/server/wm/TaskSnapshotPersister;Z)Z
+PLcom/android/server/wm/TaskSnapshotPersister;->-wrap0(Lcom/android/server/wm/TaskSnapshotPersister;I)Z
+PLcom/android/server/wm/TaskSnapshotPersister;->-wrap1(Lcom/android/server/wm/TaskSnapshotPersister;I)Ljava/io/File;
+PLcom/android/server/wm/TaskSnapshotPersister;->-wrap2(Lcom/android/server/wm/TaskSnapshotPersister;II)V
+PLcom/android/server/wm/TaskSnapshotPersister;-><init>(Lcom/android/server/wm/TaskSnapshotPersister$DirectoryResolver;)V
+PLcom/android/server/wm/TaskSnapshotPersister;->createDirectory(I)Z
+PLcom/android/server/wm/TaskSnapshotPersister;->deleteSnapshot(II)V
+PLcom/android/server/wm/TaskSnapshotPersister;->ensureStoreQueueDepthLocked()V
+PLcom/android/server/wm/TaskSnapshotPersister;->getBitmapFile(II)Ljava/io/File;
+PLcom/android/server/wm/TaskSnapshotPersister;->getDirectory(I)Ljava/io/File;
+PLcom/android/server/wm/TaskSnapshotPersister;->getProtoFile(II)Ljava/io/File;
+PLcom/android/server/wm/TaskSnapshotPersister;->getReducedResolutionBitmapFile(II)Ljava/io/File;
+PLcom/android/server/wm/TaskSnapshotPersister;->onTaskRemovedFromRecents(II)V
+PLcom/android/server/wm/TaskSnapshotPersister;->persistSnapshot(IILandroid/app/ActivityManager$TaskSnapshot;)V
+PLcom/android/server/wm/TaskSnapshotPersister;->removeObsoleteFiles(Landroid/util/ArraySet;[I)V
+PLcom/android/server/wm/TaskSnapshotPersister;->sendToQueueLocked(Lcom/android/server/wm/TaskSnapshotPersister$WriteQueueItem;)V
+PLcom/android/server/wm/TaskSnapshotPersister;->setPaused(Z)V
+PLcom/android/server/wm/TaskSnapshotPersister;->start()V
+PLcom/android/server/wm/TaskSnapshotSurface$1;-><init>(Landroid/os/Looper;)V
+PLcom/android/server/wm/TaskSnapshotSurface$SystemBarBackgroundPainter;-><init>(IIIII)V
+PLcom/android/server/wm/TaskSnapshotSurface$SystemBarBackgroundPainter;->drawDecors(Landroid/graphics/Canvas;Landroid/graphics/Rect;)V
+PLcom/android/server/wm/TaskSnapshotSurface$SystemBarBackgroundPainter;->drawNavigationBarBackground(Landroid/graphics/Canvas;)V
+PLcom/android/server/wm/TaskSnapshotSurface$SystemBarBackgroundPainter;->drawStatusBarBackground(Landroid/graphics/Canvas;Landroid/graphics/Rect;I)V
+PLcom/android/server/wm/TaskSnapshotSurface$SystemBarBackgroundPainter;->getStatusBarColorViewHeight()I
+PLcom/android/server/wm/TaskSnapshotSurface$SystemBarBackgroundPainter;->isNavigationBarColorViewVisible()Z
+PLcom/android/server/wm/TaskSnapshotSurface$SystemBarBackgroundPainter;->setInsets(Landroid/graphics/Rect;Landroid/graphics/Rect;)V
+PLcom/android/server/wm/TaskSnapshotSurface$Window;-><init>()V
+PLcom/android/server/wm/TaskSnapshotSurface$Window;->resized(Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;ZLandroid/util/MergedConfiguration;Landroid/graphics/Rect;ZZI)V
+PLcom/android/server/wm/TaskSnapshotSurface$Window;->setOuter(Lcom/android/server/wm/TaskSnapshotSurface;)V
+PLcom/android/server/wm/TaskSnapshotSurface;-><init>(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/TaskSnapshotSurface$Window;Landroid/view/Surface;Landroid/app/ActivityManager$TaskSnapshot;Ljava/lang/CharSequence;IIIIIILandroid/graphics/Rect;I)V
+PLcom/android/server/wm/TaskSnapshotSurface;->create(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/AppWindowToken;Landroid/app/ActivityManager$TaskSnapshot;)Lcom/android/server/wm/TaskSnapshotSurface;
+PLcom/android/server/wm/TaskSnapshotSurface;->drawSizeMatchSnapshot(Landroid/graphics/GraphicBuffer;)V
+PLcom/android/server/wm/TaskSnapshotSurface;->drawSnapshot()V
+PLcom/android/server/wm/TaskSnapshotSurface;->remove()V
+PLcom/android/server/wm/TaskSnapshotSurface;->reportDrawn()V
+PLcom/android/server/wm/TaskSnapshotSurface;->setFrames(Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;)V
+PLcom/android/server/wm/TaskStack;-><init>(Lcom/android/server/wm/WindowManagerService;I)V
+PLcom/android/server/wm/TaskStack;->addTask(Lcom/android/server/wm/Task;IZZ)V
+PLcom/android/server/wm/TaskStack;->checkCompleteDeferredRemoval()Z
+PLcom/android/server/wm/TaskStack;->computeMinPosition(II)I
+PLcom/android/server/wm/TaskStack;->findHomeTask()Lcom/android/server/wm/Task;
+PLcom/android/server/wm/TaskStack;->findPositionForTask(Lcom/android/server/wm/Task;IZZ)I
+PLcom/android/server/wm/TaskStack;->getDisplayInfo()Landroid/view/DisplayInfo;
+PLcom/android/server/wm/TaskStack;->getRawFullscreen()Z
+PLcom/android/server/wm/TaskStack;->hasMovementAnimations()Z
+PLcom/android/server/wm/TaskStack;->isAdjustedForIme()Z
+PLcom/android/server/wm/TaskStack;->isAnimatingBounds()Z
+PLcom/android/server/wm/TaskStack;->isAnimatingForIme()Z
+PLcom/android/server/wm/TaskStack;->isAttachedToDisplay()Z
+PLcom/android/server/wm/TaskStack;->isForceScaled()Z
+PLcom/android/server/wm/TaskStack;->isMinimizedDockAndHomeStackResizable()Z
+PLcom/android/server/wm/TaskStack;->onDisplayChanged(Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/TaskStack;->positionChildAt(ILcom/android/server/wm/Task;Z)V
+PLcom/android/server/wm/TaskStack;->positionChildAt(ILcom/android/server/wm/Task;ZZ)V
+PLcom/android/server/wm/TaskStack;->prepareFreezingTaskBounds()V
+PLcom/android/server/wm/TaskStack;->removeChild(Lcom/android/server/wm/Task;)V
+PLcom/android/server/wm/TaskStack;->removeChild(Lcom/android/server/wm/WindowContainer;)V
+PLcom/android/server/wm/TaskStack;->resetAdjustedForIme(Z)V
+PLcom/android/server/wm/TaskStack;->setAdjustedBounds(Landroid/graphics/Rect;)V
+PLcom/android/server/wm/TaskStack;->setBounds(Landroid/graphics/Rect;)Z
+PLcom/android/server/wm/TaskStack;->toShortString()Ljava/lang/String;
+PLcom/android/server/wm/TaskStack;->updateBoundsAfterConfigChange()Z
+PLcom/android/server/wm/TaskStack;->updateDisplayInfo(Landroid/graphics/Rect;)V
+PLcom/android/server/wm/TaskTapPointerEventListener;-><init>(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/TaskTapPointerEventListener;->onPointerEvent(Landroid/view/MotionEvent;)V
+PLcom/android/server/wm/TaskTapPointerEventListener;->setTouchExcludeRegion(Landroid/graphics/Region;)V
+PLcom/android/server/wm/TaskWindowContainerController$H;-><init>(Ljava/lang/ref/WeakReference;Landroid/os/Looper;)V
+PLcom/android/server/wm/TaskWindowContainerController$H;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/wm/TaskWindowContainerController;-><init>(ILcom/android/server/wm/TaskWindowContainerListener;Lcom/android/server/wm/StackWindowController;ILandroid/graphics/Rect;Landroid/content/res/Configuration;IZZZZLandroid/app/ActivityManager$TaskDescription;)V
+PLcom/android/server/wm/TaskWindowContainerController;-><init>(ILcom/android/server/wm/TaskWindowContainerListener;Lcom/android/server/wm/StackWindowController;ILandroid/graphics/Rect;Landroid/content/res/Configuration;IZZZZLandroid/app/ActivityManager$TaskDescription;Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/TaskWindowContainerController;->cancelThumbnailTransition()V
+PLcom/android/server/wm/TaskWindowContainerController;->cancelWindowTransition()V
+PLcom/android/server/wm/TaskWindowContainerController;->createTask(ILcom/android/server/wm/TaskStack;ILandroid/graphics/Rect;Landroid/content/res/Configuration;IZZLandroid/app/ActivityManager$TaskDescription;)Lcom/android/server/wm/Task;
+PLcom/android/server/wm/TaskWindowContainerController;->getBounds(Landroid/graphics/Rect;)V
+PLcom/android/server/wm/TaskWindowContainerController;->positionChildAt(Lcom/android/server/wm/AppWindowContainerController;I)V
+PLcom/android/server/wm/TaskWindowContainerController;->removeContainer()V
+PLcom/android/server/wm/TaskWindowContainerController;->reportSnapshotChanged(Landroid/app/ActivityManager$TaskSnapshot;)V
+PLcom/android/server/wm/TaskWindowContainerController;->setTaskDescription(Landroid/app/ActivityManager$TaskDescription;)V
+PLcom/android/server/wm/UnknownAppVisibilityController;->-com_android_server_wm_UnknownAppVisibilityController-mthref-0()V
+PLcom/android/server/wm/UnknownAppVisibilityController;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/UnknownAppVisibilityController;->allResolved()Z
+PLcom/android/server/wm/UnknownAppVisibilityController;->appRemovedOrHidden(Lcom/android/server/wm/AppWindowToken;)V
+PLcom/android/server/wm/UnknownAppVisibilityController;->clear()V
+PLcom/android/server/wm/UnknownAppVisibilityController;->notifyAppResumedFinished(Lcom/android/server/wm/AppWindowToken;)V
+PLcom/android/server/wm/UnknownAppVisibilityController;->notifyLaunched(Lcom/android/server/wm/AppWindowToken;)V
+PLcom/android/server/wm/UnknownAppVisibilityController;->notifyRelayouted(Lcom/android/server/wm/AppWindowToken;)V
+PLcom/android/server/wm/UnknownAppVisibilityController;->notifyVisibilitiesUpdated()V
+PLcom/android/server/wm/WallpaperController$FindWallpaperTargetResult;-><init>()V
+PLcom/android/server/wm/WallpaperController$FindWallpaperTargetResult;-><init>(Lcom/android/server/wm/WallpaperController$FindWallpaperTargetResult;)V
+PLcom/android/server/wm/WallpaperController$FindWallpaperTargetResult;->reset()V
+PLcom/android/server/wm/WallpaperController$FindWallpaperTargetResult;->setTopWallpaper(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/WallpaperController$FindWallpaperTargetResult;->setUseTopWallpaperAsTarget(Z)V
+PLcom/android/server/wm/WallpaperController$FindWallpaperTargetResult;->setWallpaperTarget(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/WallpaperController;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/WallpaperController;->addWallpaperToken(Lcom/android/server/wm/WallpaperWindowToken;)V
+PLcom/android/server/wm/WallpaperController;->adjustWallpaperWindows(Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/WallpaperController;->adjustWallpaperWindowsForAppTransitionIfNeeded(Lcom/android/server/wm/DisplayContent;Landroid/util/ArraySet;)V
+PLcom/android/server/wm/WallpaperController;->clearLastWallpaperTimeoutTime()V
+PLcom/android/server/wm/WallpaperController;->findWallpaperTarget(Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/WallpaperController;->getAnimLayerAdjustment()I
+PLcom/android/server/wm/WallpaperController;->hideDeferredWallpapersIfNeeded()V
+PLcom/android/server/wm/WallpaperController;->hideWallpapers(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/WallpaperController;->isBelowWallpaperTarget(Lcom/android/server/wm/WindowState;)Z
+PLcom/android/server/wm/WallpaperController;->isWallpaperTargetAnimating()Z
+PLcom/android/server/wm/WallpaperController;->isWallpaperVisible()Z
+PLcom/android/server/wm/WallpaperController;->isWallpaperVisible(Lcom/android/server/wm/WindowState;)Z
+PLcom/android/server/wm/WallpaperController;->lambda$-com_android_server_wm_WallpaperController_22771(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;)Z
+PLcom/android/server/wm/WallpaperController;->lambda$-com_android_server_wm_WallpaperController_4687(Lcom/android/server/wm/WindowState;)Z
+PLcom/android/server/wm/WallpaperController;->sendWindowWallpaperCommand(Lcom/android/server/wm/WindowState;Ljava/lang/String;IIILandroid/os/Bundle;Z)Landroid/os/Bundle;
+PLcom/android/server/wm/WallpaperController;->setWindowWallpaperPosition(Lcom/android/server/wm/WindowState;FFFF)V
+PLcom/android/server/wm/WallpaperController;->updateWallpaperOffset(Lcom/android/server/wm/WindowState;IIZ)Z
+PLcom/android/server/wm/WallpaperController;->updateWallpaperOffsetLocked(Lcom/android/server/wm/WindowState;Z)V
+PLcom/android/server/wm/WallpaperController;->updateWallpaperTokens(Z)V
+PLcom/android/server/wm/WallpaperController;->updateWallpaperWindowsTarget(Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/WallpaperController$FindWallpaperTargetResult;)V
+PLcom/android/server/wm/WallpaperController;->wallpaperOffsetsComplete(Landroid/os/IBinder;)V
+PLcom/android/server/wm/WallpaperController;->wallpaperTransitionReady()Z
+PLcom/android/server/wm/WallpaperVisibilityListeners;-><init>()V
+PLcom/android/server/wm/WallpaperVisibilityListeners;->notifyWallpaperVisibilityChanged(Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/WallpaperVisibilityListeners;->registerWallpaperVisibilityListener(Landroid/view/IWallpaperVisibilityListener;I)V
+PLcom/android/server/wm/WallpaperWindowToken;-><init>(Lcom/android/server/wm/WindowManagerService;Landroid/os/IBinder;ZLcom/android/server/wm/DisplayContent;Z)V
+PLcom/android/server/wm/WallpaperWindowToken;->hasVisibleNotDrawnWallpaper()Z
+PLcom/android/server/wm/WallpaperWindowToken;->hideWallpaperToken(ZLjava/lang/String;)V
+PLcom/android/server/wm/WallpaperWindowToken;->sendWindowWallpaperCommand(Ljava/lang/String;IIILandroid/os/Bundle;Z)V
+PLcom/android/server/wm/WallpaperWindowToken;->updateWallpaperOffset(IIZ)V
+PLcom/android/server/wm/WallpaperWindowToken;->updateWallpaperWindows(ZI)V
+PLcom/android/server/wm/WindowAnimator$DisplayContentsAnimator;-><init>(Lcom/android/server/wm/WindowAnimator;)V
+PLcom/android/server/wm/WindowAnimator$DisplayContentsAnimator;-><init>(Lcom/android/server/wm/WindowAnimator;Lcom/android/server/wm/WindowAnimator$DisplayContentsAnimator;)V
+PLcom/android/server/wm/WindowAnimator;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/WindowAnimator;->addDisplayLocked(I)V
+PLcom/android/server/wm/WindowAnimator;->getPendingLayoutChanges(I)I
+PLcom/android/server/wm/WindowAnimator;->isAnimating()Z
+PLcom/android/server/wm/WindowAnimator;->isAnimationScheduled()Z
+PLcom/android/server/wm/WindowAnimator;->lambda$-com_android_server_wm_WindowAnimator_3911()V
+PLcom/android/server/wm/WindowAnimator;->requestRemovalOfReplacedWindows(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/WindowAnimator;->scheduleAnimation()V
+PLcom/android/server/wm/WindowAnimator;->setAnimating(Z)V
+PLcom/android/server/wm/WindowAnimator;->setPendingLayoutChanges(II)V
+PLcom/android/server/wm/WindowAnimator;->setScreenRotationAnimationLocked(ILcom/android/server/wm/ScreenRotationAnimation;)V
+PLcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;-><init>(Lcom/android/server/wm/WindowContainer;)V
+PLcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;-><init>(Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;)V
+PLcom/android/server/wm/WindowContainer;-><init>()V
+PLcom/android/server/wm/WindowContainer;->addChild(Lcom/android/server/wm/WindowContainer;I)V
+PLcom/android/server/wm/WindowContainer;->addChild(Lcom/android/server/wm/WindowContainer;Ljava/util/Comparator;)V
+PLcom/android/server/wm/WindowContainer;->compareTo(Lcom/android/server/wm/WindowContainer;)I
+PLcom/android/server/wm/WindowContainer;->getController()Lcom/android/server/wm/WindowContainerController;
+PLcom/android/server/wm/WindowContainer;->getMergedOverrideConfiguration()Landroid/content/res/Configuration;
+PLcom/android/server/wm/WindowContainer;->getOrientation()I
+PLcom/android/server/wm/WindowContainer;->getOverrideConfiguration()Landroid/content/res/Configuration;
+PLcom/android/server/wm/WindowContainer;->getParents(Ljava/util/LinkedList;)V
+PLcom/android/server/wm/WindowContainer;->getTopChild()Lcom/android/server/wm/WindowContainer;
+PLcom/android/server/wm/WindowContainer;->hasContentToDisplay()Z
+PLcom/android/server/wm/WindowContainer;->isVisible()Z
+PLcom/android/server/wm/WindowContainer;->onAppTransitionDone()V
+PLcom/android/server/wm/WindowContainer;->onConfigurationChanged(Landroid/content/res/Configuration;)V
+PLcom/android/server/wm/WindowContainer;->onDescendantOverrideConfigurationChanged()V
+PLcom/android/server/wm/WindowContainer;->onDisplayChanged(Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/WindowContainer;->onMergedOverrideConfigurationChanged()V
+PLcom/android/server/wm/WindowContainer;->onOverrideConfigurationChanged(Landroid/content/res/Configuration;)V
+PLcom/android/server/wm/WindowContainer;->onParentSet()V
+PLcom/android/server/wm/WindowContainer;->positionChildAt(ILcom/android/server/wm/WindowContainer;Z)V
+PLcom/android/server/wm/WindowContainer;->removeChild(Lcom/android/server/wm/WindowContainer;)V
+PLcom/android/server/wm/WindowContainer;->removeIfPossible()V
+PLcom/android/server/wm/WindowContainer;->removeImmediately()V
+PLcom/android/server/wm/WindowContainer;->sendAppVisibilityToClients()V
+PLcom/android/server/wm/WindowContainer;->setController(Lcom/android/server/wm/WindowContainerController;)V
+PLcom/android/server/wm/WindowContainer;->setOrientation(I)V
+PLcom/android/server/wm/WindowContainer;->setParent(Lcom/android/server/wm/WindowContainer;)V
+PLcom/android/server/wm/WindowContainer;->setVisibleBeforeClientHidden()V
+PLcom/android/server/wm/WindowContainerController;-><init>(Lcom/android/server/wm/WindowContainerListener;Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/WindowContainerController;->removeContainer()V
+PLcom/android/server/wm/WindowContainerController;->setContainer(Lcom/android/server/wm/WindowContainer;)V
+PLcom/android/server/wm/WindowHashMap;-><init>()V
+PLcom/android/server/wm/WindowLayersController;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/WindowLayersController;->adjustSpecialWindows()V
+PLcom/android/server/wm/WindowLayersController;->assignAndIncreaseLayerIfNeeded(Lcom/android/server/wm/WindowState;I)I
+PLcom/android/server/wm/WindowLayersController;->assignWindowLayers(Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/WindowLayersController;->reset()V
+PLcom/android/server/wm/WindowList;-><init>()V
+PLcom/android/server/wm/WindowList;->peekFirst()Ljava/lang/Object;
+PLcom/android/server/wm/WindowList;->peekLast()Ljava/lang/Object;
+PLcom/android/server/wm/WindowManagerService$1;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/WindowManagerService$2;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/WindowManagerService$2;->onAppTransitionCancelledLocked(I)V
+PLcom/android/server/wm/WindowManagerService$2;->onAppTransitionFinishedLocked(Landroid/os/IBinder;)V
+PLcom/android/server/wm/WindowManagerService$3;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/WindowManagerService$3;->run()V
+PLcom/android/server/wm/WindowManagerService$4;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/WindowManagerService$5;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/WindowManagerService$7;-><init>(Lcom/android/server/wm/WindowManagerService;Landroid/os/IBinder;)V
+PLcom/android/server/wm/WindowManagerService$H;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/WindowManagerService$H;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/wm/WindowManagerService$LocalService;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/WindowManagerService$LocalService;-><init>(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService$LocalService;)V
+PLcom/android/server/wm/WindowManagerService$LocalService;->getInputMethodWindowVisibleHeight()I
+PLcom/android/server/wm/WindowManagerService$LocalService;->isDockedDividerResizing()Z
+PLcom/android/server/wm/WindowManagerService$LocalService;->isHardKeyboardAvailable()Z
+PLcom/android/server/wm/WindowManagerService$LocalService;->isKeyguardGoingAway()Z
+PLcom/android/server/wm/WindowManagerService$LocalService;->registerAppTransitionListener(Landroid/view/WindowManagerInternal$AppTransitionListener;)V
+PLcom/android/server/wm/WindowManagerService$LocalService;->requestTraversalFromDisplayManager()V
+PLcom/android/server/wm/WindowManagerService$LocalService;->setOnHardKeyboardStatusChangeListener(Landroid/view/WindowManagerInternal$OnHardKeyboardStatusChangeListener;)V
+PLcom/android/server/wm/WindowManagerService$LocalService;->updateInputMethodWindowStatus(Landroid/os/IBinder;ZZLandroid/os/IBinder;)V
+PLcom/android/server/wm/WindowManagerService$LocalService;->waitForAllWindowsDrawn(Ljava/lang/Runnable;J)V
+PLcom/android/server/wm/WindowManagerService$MousePositionTracker;-><init>()V
+PLcom/android/server/wm/WindowManagerService$MousePositionTracker;-><init>(Lcom/android/server/wm/WindowManagerService$MousePositionTracker;)V
+PLcom/android/server/wm/WindowManagerService$MousePositionTracker;->onPointerEvent(Landroid/view/MotionEvent;)V
+PLcom/android/server/wm/WindowManagerService$RotationWatcher;-><init>(Lcom/android/server/wm/WindowManagerService;Landroid/view/IRotationWatcher;Landroid/os/IBinder$DeathRecipient;I)V
+PLcom/android/server/wm/WindowManagerService$SettingsObserver;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/WindowManagerService;->-wrap0(Lcom/android/server/wm/WindowManagerService;)Z
+PLcom/android/server/wm/WindowManagerService;->-wrap4(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/WindowManagerService;->-wrap6(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/WindowManagerService;-><init>(Landroid/content/Context;Lcom/android/server/input/InputManagerService;ZZZLandroid/view/WindowManagerPolicy;)V
+PLcom/android/server/wm/WindowManagerService;->addWindow(Lcom/android/server/wm/Session;Landroid/view/IWindow;ILandroid/view/WindowManager$LayoutParams;IILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/view/InputChannel;)I
+PLcom/android/server/wm/WindowManagerService;->addWindowToken(Landroid/os/IBinder;II)V
+PLcom/android/server/wm/WindowManagerService;->applyAnimationLocked(Lcom/android/server/wm/AppWindowToken;Landroid/view/WindowManager$LayoutParams;IZZ)Z
+PLcom/android/server/wm/WindowManagerService;->canDispatchPointerEvents()Z
+PLcom/android/server/wm/WindowManagerService;->checkBootAnimationCompleteLocked()Z
+PLcom/android/server/wm/WindowManagerService;->checkCallingPermission(Ljava/lang/String;Ljava/lang/String;)Z
+PLcom/android/server/wm/WindowManagerService;->checkDrawnWindowsLocked()V
+PLcom/android/server/wm/WindowManagerService;->closeSystemDialogs(Ljava/lang/String;)V
+PLcom/android/server/wm/WindowManagerService;->computeNewConfiguration(I)Landroid/content/res/Configuration;
+PLcom/android/server/wm/WindowManagerService;->computeNewConfigurationLocked(I)Landroid/content/res/Configuration;
+PLcom/android/server/wm/WindowManagerService;->configureDisplayPolicyLocked(Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/WindowManagerService;->containsDismissKeyguardWindow(Landroid/os/IBinder;)Z
+PLcom/android/server/wm/WindowManagerService;->containsShowWhenLockedWindow(Landroid/os/IBinder;)Z
+PLcom/android/server/wm/WindowManagerService;->continueSurfaceLayout()V
+PLcom/android/server/wm/WindowManagerService;->createDisplayContentLocked(Landroid/view/Display;)V
+PLcom/android/server/wm/WindowManagerService;->createInputConsumer(Ljava/lang/String;Landroid/view/InputChannel;)V
+PLcom/android/server/wm/WindowManagerService;->createSurfaceControl(Landroid/view/Surface;ILcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowStateAnimator;)I
+PLcom/android/server/wm/WindowManagerService;->createWatermarkInTransaction()V
+PLcom/android/server/wm/WindowManagerService;->deferSurfaceLayout()V
+PLcom/android/server/wm/WindowManagerService;->destroyInputConsumer(Ljava/lang/String;)Z
+PLcom/android/server/wm/WindowManagerService;->destroyPreservedSurfaceLocked()V
+PLcom/android/server/wm/WindowManagerService;->detectSafeMode()Z
+PLcom/android/server/wm/WindowManagerService;->dipToPixel(ILandroid/util/DisplayMetrics;)I
+PLcom/android/server/wm/WindowManagerService;->displayReady()V
+PLcom/android/server/wm/WindowManagerService;->displayReady(I)V
+PLcom/android/server/wm/WindowManagerService;->enableScreenAfterBoot()V
+PLcom/android/server/wm/WindowManagerService;->enableScreenIfNeeded()V
+PLcom/android/server/wm/WindowManagerService;->enableScreenIfNeededLocked()V
+PLcom/android/server/wm/WindowManagerService;->endProlongedAnimations()V
+PLcom/android/server/wm/WindowManagerService;->excludeWindowTypeFromTapOutTask(I)Z
+PLcom/android/server/wm/WindowManagerService;->executeAppTransition()V
+PLcom/android/server/wm/WindowManagerService;->finishDrawingWindow(Lcom/android/server/wm/Session;Landroid/view/IWindow;)V
+PLcom/android/server/wm/WindowManagerService;->getBaseDisplaySize(ILandroid/graphics/Point;)V
+PLcom/android/server/wm/WindowManagerService;->getCameraLensCoverState()I
+PLcom/android/server/wm/WindowManagerService;->getCurrentAnimatorScale()F
+PLcom/android/server/wm/WindowManagerService;->getDefaultDisplayRotation()I
+PLcom/android/server/wm/WindowManagerService;->getDisplaysInFocusOrder(Landroid/util/SparseIntArray;)V
+PLcom/android/server/wm/WindowManagerService;->getDockedStackSide()I
+PLcom/android/server/wm/WindowManagerService;->getForcedDisplayDensityForUserLocked(I)I
+PLcom/android/server/wm/WindowManagerService;->getInitialDisplaySize(ILandroid/graphics/Point;)V
+PLcom/android/server/wm/WindowManagerService;->getInputMethodWindowLw()Landroid/view/WindowManagerPolicy$WindowState;
+PLcom/android/server/wm/WindowManagerService;->getInputMonitor()Lcom/android/server/wm/InputMonitor;
+PLcom/android/server/wm/WindowManagerService;->getInstance()Lcom/android/server/wm/WindowManagerService;
+PLcom/android/server/wm/WindowManagerService;->getLidState()I
+PLcom/android/server/wm/WindowManagerService;->getPendingAppTransition()I
+PLcom/android/server/wm/WindowManagerService;->getStableInsets(ILandroid/graphics/Rect;)V
+PLcom/android/server/wm/WindowManagerService;->getStableInsetsLocked(ILandroid/graphics/Rect;)V
+PLcom/android/server/wm/WindowManagerService;->getTaskSnapshot(IIZ)Landroid/app/ActivityManager$TaskSnapshot;
+PLcom/android/server/wm/WindowManagerService;->getTransitionAnimationScaleLocked()F
+PLcom/android/server/wm/WindowManagerService;->getWindowAnimationScaleLocked()F
+PLcom/android/server/wm/WindowManagerService;->getWindowDisplayFrame(Lcom/android/server/wm/Session;Landroid/view/IWindow;Landroid/graphics/Rect;)V
+PLcom/android/server/wm/WindowManagerService;->getWindowId(Landroid/os/IBinder;)Landroid/view/IWindowId;
+PLcom/android/server/wm/WindowManagerService;->getWindowManagerLock()Ljava/lang/Object;
+PLcom/android/server/wm/WindowManagerService;->handleAnimatingStoppedAndTransitionLocked()I
+PLcom/android/server/wm/WindowManagerService;->hasNavigationBar()Z
+PLcom/android/server/wm/WindowManagerService;->hideBootMessagesLocked()V
+PLcom/android/server/wm/WindowManagerService;->inKeyguardRestrictedInputMode()Z
+PLcom/android/server/wm/WindowManagerService;->initPolicy()V
+PLcom/android/server/wm/WindowManagerService;->inputMethodClientHasFocus(Lcom/android/internal/view/IInputMethodClient;)Z
+PLcom/android/server/wm/WindowManagerService;->isCurrentProfileLocked(I)Z
+PLcom/android/server/wm/WindowManagerService;->isKeyguardLocked()Z
+PLcom/android/server/wm/WindowManagerService;->isKeyguardSecure()Z
+PLcom/android/server/wm/WindowManagerService;->isSafeModeEnabled()Z
+PLcom/android/server/wm/WindowManagerService;->isScreenCaptureDisabledLocked(I)Z
+PLcom/android/server/wm/WindowManagerService;->isSecureLocked(Lcom/android/server/wm/WindowState;)Z
+PLcom/android/server/wm/WindowManagerService;->isShowingDream()Z
+PLcom/android/server/wm/WindowManagerService;->lambda$-com_android_server_wm_WindowManagerService_128943(Ljava/lang/Runnable;)V
+PLcom/android/server/wm/WindowManagerService;->lambda$-com_android_server_wm_WindowManagerService_40672(Landroid/content/Context;Lcom/android/server/input/InputManagerService;ZZZLandroid/view/WindowManagerPolicy;)V
+PLcom/android/server/wm/WindowManagerService;->main(Landroid/content/Context;Lcom/android/server/input/InputManagerService;ZZZLandroid/view/WindowManagerPolicy;)Lcom/android/server/wm/WindowManagerService;
+PLcom/android/server/wm/WindowManagerService;->makeWindowFreezingScreenIfNeededLocked(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/WindowManagerService;->monitor()V
+PLcom/android/server/wm/WindowManagerService;->notifyAppRelaunchesCleared(Landroid/os/IBinder;)V
+PLcom/android/server/wm/WindowManagerService;->notifyAppResumedFinished(Landroid/os/IBinder;)V
+PLcom/android/server/wm/WindowManagerService;->notifyFocusChanged()V
+PLcom/android/server/wm/WindowManagerService;->notifyKeyguardFlagsChanged(Ljava/lang/Runnable;)V
+PLcom/android/server/wm/WindowManagerService;->notifyKeyguardTrustedChanged()V
+PLcom/android/server/wm/WindowManagerService;->notifyTaskRemovedFromRecents(II)V
+PLcom/android/server/wm/WindowManagerService;->onDisplayChanged(I)V
+PLcom/android/server/wm/WindowManagerService;->onKeyguardOccludedChanged(Z)V
+PLcom/android/server/wm/WindowManagerService;->onRectangleOnScreenRequested(Landroid/os/IBinder;Landroid/graphics/Rect;)V
+PLcom/android/server/wm/WindowManagerService;->onSystemUiStarted()V
+PLcom/android/server/wm/WindowManagerService;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+PLcom/android/server/wm/WindowManagerService;->openSession(Landroid/view/IWindowSessionCallback;Lcom/android/internal/view/IInputMethodClient;Lcom/android/internal/view/IInputContext;)Landroid/view/IWindowSession;
+PLcom/android/server/wm/WindowManagerService;->overridePendingAppTransition(Ljava/lang/String;IILandroid/os/IRemoteCallback;)V
+PLcom/android/server/wm/WindowManagerService;->overridePendingAppTransitionClipReveal(IIII)V
+PLcom/android/server/wm/WindowManagerService;->overridePendingAppTransitionMultiThumbFuture(Landroid/view/IAppTransitionAnimationSpecsFuture;Landroid/os/IRemoteCallback;Z)V
+PLcom/android/server/wm/WindowManagerService;->performBootTimeout()V
+PLcom/android/server/wm/WindowManagerService;->performEnableScreen()V
+PLcom/android/server/wm/WindowManagerService;->postWindowRemoveCleanupLocked(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/WindowManagerService;->prepareAppTransition(IZ)V
+PLcom/android/server/wm/WindowManagerService;->prepareAppTransition(IZIZ)V
+PLcom/android/server/wm/WindowManagerService;->prepareNoneTransitionForRelaunching(Lcom/android/server/wm/AppWindowToken;)V
+PLcom/android/server/wm/WindowManagerService;->prepareWindowReplacementTransition(Lcom/android/server/wm/AppWindowToken;)Z
+PLcom/android/server/wm/WindowManagerService;->prolongAnimationsFromSpecs([Landroid/view/AppTransitionAnimationSpec;Z)V
+PLcom/android/server/wm/WindowManagerService;->readForcedDisplayPropertiesLocked(Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/WindowManagerService;->reconfigureDisplayLocked(Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/WindowManagerService;->registerAppFreezeListener(Lcom/android/server/wm/WindowManagerService$AppFreezeListener;)V
+PLcom/android/server/wm/WindowManagerService;->registerDockedStackListener(Landroid/view/IDockedStackListener;)V
+PLcom/android/server/wm/WindowManagerService;->registerPinnedStackListener(ILandroid/view/IPinnedStackListener;)V
+PLcom/android/server/wm/WindowManagerService;->registerPointerEventListener(Landroid/view/WindowManagerPolicy$PointerEventListener;)V
+PLcom/android/server/wm/WindowManagerService;->registerShortcutKey(JLcom/android/internal/policy/IShortcutService;)V
+PLcom/android/server/wm/WindowManagerService;->registerWallpaperVisibilityListener(Landroid/view/IWallpaperVisibilityListener;I)Z
+PLcom/android/server/wm/WindowManagerService;->removeObsoleteTaskFiles(Landroid/util/ArraySet;[I)V
+PLcom/android/server/wm/WindowManagerService;->removeWindow(Lcom/android/server/wm/Session;Landroid/view/IWindow;)V
+PLcom/android/server/wm/WindowManagerService;->requestTraversal()V
+PLcom/android/server/wm/WindowManagerService;->scheduleAnimationLocked()V
+PLcom/android/server/wm/WindowManagerService;->sendNewConfiguration(I)V
+PLcom/android/server/wm/WindowManagerService;->setAnimatorDurationScale(F)V
+PLcom/android/server/wm/WindowManagerService;->setDockedStackDividerTouchRegion(Landroid/graphics/Rect;)V
+PLcom/android/server/wm/WindowManagerService;->setEventDispatching(Z)V
+PLcom/android/server/wm/WindowManagerService;->setFocusTaskRegionLocked(Lcom/android/server/wm/AppWindowToken;)V
+PLcom/android/server/wm/WindowManagerService;->setFocusedApp(Landroid/os/IBinder;Z)V
+PLcom/android/server/wm/WindowManagerService;->setForceResizableTasks(Z)V
+PLcom/android/server/wm/WindowManagerService;->setHoldScreenLocked(Lcom/android/server/wm/Session;)V
+PLcom/android/server/wm/WindowManagerService;->setInputMethodWindowLocked(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/WindowManagerService;->setInsetsWindow(Lcom/android/server/wm/Session;Landroid/view/IWindow;ILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Region;)V
+PLcom/android/server/wm/WindowManagerService;->setKeyguardGoingAway(Z)V
+PLcom/android/server/wm/WindowManagerService;->setNewDisplayOverrideConfiguration(Landroid/content/res/Configuration;I)[I
+PLcom/android/server/wm/WindowManagerService;->setRecentsVisibility(Z)V
+PLcom/android/server/wm/WindowManagerService;->setScreenCaptureDisabled(IZ)V
+PLcom/android/server/wm/WindowManagerService;->setSupportsPictureInPicture(Z)V
+PLcom/android/server/wm/WindowManagerService;->setTransparentRegionWindow(Lcom/android/server/wm/Session;Landroid/view/IWindow;Landroid/graphics/Region;)V
+PLcom/android/server/wm/WindowManagerService;->showEmulatorDisplayOverlayIfNeeded()V
+PLcom/android/server/wm/WindowManagerService;->startFreezingDisplayLocked(ZIILcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/WindowManagerService;->statusBarVisibilityChanged(I)V
+PLcom/android/server/wm/WindowManagerService;->stopFreezingDisplayLocked()V
+PLcom/android/server/wm/WindowManagerService;->stopUsingSavedSurfaceLocked()V
+PLcom/android/server/wm/WindowManagerService;->systemReady()V
+PLcom/android/server/wm/WindowManagerService;->tryStartExitingAnimation(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowStateAnimator;ZZ)Z
+PLcom/android/server/wm/WindowManagerService;->unregisterAppFreezeListener(Lcom/android/server/wm/WindowManagerService$AppFreezeListener;)V
+PLcom/android/server/wm/WindowManagerService;->updateCircularDisplayMaskIfNeeded()V
+PLcom/android/server/wm/WindowManagerService;->updateFocusedWindowLocked(IZ)Z
+PLcom/android/server/wm/WindowManagerService;->updateOrientationFromAppTokens(Landroid/content/res/Configuration;Landroid/os/IBinder;I)Landroid/content/res/Configuration;
+PLcom/android/server/wm/WindowManagerService;->updateOrientationFromAppTokensLocked(Landroid/content/res/Configuration;Landroid/os/IBinder;I)Landroid/content/res/Configuration;
+PLcom/android/server/wm/WindowManagerService;->updateRotation(ZZ)V
+PLcom/android/server/wm/WindowManagerService;->updateRotationUnchecked(ZZ)V
+PLcom/android/server/wm/WindowManagerService;->updateStatusBarVisibilityLocked(I)Z
+PLcom/android/server/wm/WindowManagerService;->watchRotation(Landroid/view/IRotationWatcher;I)I
+PLcom/android/server/wm/WindowManagerService;->windowForClientLocked(Lcom/android/server/wm/Session;Landroid/os/IBinder;Z)Lcom/android/server/wm/WindowState;
+PLcom/android/server/wm/WindowManagerService;->windowForClientLocked(Lcom/android/server/wm/Session;Landroid/view/IWindow;Z)Lcom/android/server/wm/WindowState;
+PLcom/android/server/wm/WindowManagerThreadPriorityBooster;-><init>()V
+PLcom/android/server/wm/WindowManagerThreadPriorityBooster;->setAppTransitionRunning(Z)V
+PLcom/android/server/wm/WindowManagerThreadPriorityBooster;->updatePriorityLocked()V
+PLcom/android/server/wm/WindowState$1;-><init>()V
+PLcom/android/server/wm/WindowState$DeathRecipient;-><init>(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/WindowState$DeathRecipient;-><init>(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState$DeathRecipient;)V
+PLcom/android/server/wm/WindowState$UpdateReportedVisibilityResults;-><init>()V
+PLcom/android/server/wm/WindowState$UpdateReportedVisibilityResults;->reset()V
+PLcom/android/server/wm/WindowState$WindowId;-><init>(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/WindowState$WindowId;-><init>(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState$WindowId;)V
+PLcom/android/server/wm/WindowState;-><init>(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/Session;Landroid/view/IWindow;Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/WindowState;IILandroid/view/WindowManager$LayoutParams;IIZ)V
+PLcom/android/server/wm/WindowState;->addWinAnimatorToList(Ljava/util/ArrayList;)V
+PLcom/android/server/wm/WindowState;->adjustStartingWindowFlags()V
+PLcom/android/server/wm/WindowState;->applyAdjustForImeIfNeeded()V
+PLcom/android/server/wm/WindowState;->applyInsets(Landroid/graphics/Region;Landroid/graphics/Rect;Landroid/graphics/Rect;)V
+PLcom/android/server/wm/WindowState;->attach()V
+PLcom/android/server/wm/WindowState;->canBeImeTarget()Z
+PLcom/android/server/wm/WindowState;->canRestoreSurface()Z
+PLcom/android/server/wm/WindowState;->checkPolicyVisibilityChange()V
+PLcom/android/server/wm/WindowState;->clearAnimatingFlags()Z
+PLcom/android/server/wm/WindowState;->clearAnimatingWithSavedSurface()Z
+PLcom/android/server/wm/WindowState;->clearHasSavedSurface()V
+PLcom/android/server/wm/WindowState;->clearWasVisibleBeforeClientHidden()V
+PLcom/android/server/wm/WindowState;->destroyOrSaveSurfaceUnchecked()V
+PLcom/android/server/wm/WindowState;->destroySavedSurface()V
+PLcom/android/server/wm/WindowState;->destroySurface(ZZ)Z
+PLcom/android/server/wm/WindowState;->dispatchResized(Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;ZLandroid/util/MergedConfiguration;ZI)V
+PLcom/android/server/wm/WindowState;->dispatchWallpaperVisibility(Z)V
+PLcom/android/server/wm/WindowState;->disposeInputChannel()V
+PLcom/android/server/wm/WindowState;->forAllWindowBottomToTop(Lcom/android/internal/util/ToBooleanFunction;)Z
+PLcom/android/server/wm/WindowState;->forAllWindowTopToBottom(Lcom/android/internal/util/ToBooleanFunction;)Z
+PLcom/android/server/wm/WindowState;->getBackdropFrame(Landroid/graphics/Rect;)Landroid/graphics/Rect;
+PLcom/android/server/wm/WindowState;->getContentFrameLw()Landroid/graphics/Rect;
+PLcom/android/server/wm/WindowState;->getDisplayFrameLw()Landroid/graphics/Rect;
+PLcom/android/server/wm/WindowState;->getFrameLw()Landroid/graphics/Rect;
+PLcom/android/server/wm/WindowState;->getGivenContentInsetsLw()Landroid/graphics/Rect;
+PLcom/android/server/wm/WindowState;->getGivenInsetsPendingLw()Z
+PLcom/android/server/wm/WindowState;->getGivenVisibleInsetsLw()Landroid/graphics/Rect;
+PLcom/android/server/wm/WindowState;->getHighestAnimLayer()I
+PLcom/android/server/wm/WindowState;->getName()Ljava/lang/String;
+PLcom/android/server/wm/WindowState;->getNeedsMenuLw(Landroid/view/WindowManagerPolicy$WindowState;)Z
+PLcom/android/server/wm/WindowState;->getOwningPackage()Ljava/lang/String;
+PLcom/android/server/wm/WindowState;->getOwningUid()I
+PLcom/android/server/wm/WindowState;->getReplacingWindow()Lcom/android/server/wm/WindowState;
+PLcom/android/server/wm/WindowState;->getSurfaceLayer()I
+PLcom/android/server/wm/WindowState;->getSystemUiVisibility()I
+PLcom/android/server/wm/WindowState;->getVisibleFrameLw()Landroid/graphics/Rect;
+PLcom/android/server/wm/WindowState;->hasAppShownWindows()Z
+PLcom/android/server/wm/WindowState;->hasContentToDisplay()Z
+PLcom/android/server/wm/WindowState;->hasDrawnLw()Z
+PLcom/android/server/wm/WindowState;->hasVisibleNotDrawnWallpaper()Z
+PLcom/android/server/wm/WindowState;->hideLw(Z)Z
+PLcom/android/server/wm/WindowState;->hideLw(ZZ)Z
+PLcom/android/server/wm/WindowState;->hideWallpaperWindow(ZLjava/lang/String;)V
+PLcom/android/server/wm/WindowState;->isAnimatingInvisibleWithSavedSurface()Z
+PLcom/android/server/wm/WindowState;->isAnimatingWithSavedSurface()Z
+PLcom/android/server/wm/WindowState;->isClosing()Z
+PLcom/android/server/wm/WindowState;->isDrawFinishedLw()Z
+PLcom/android/server/wm/WindowState;->isInputMethodWindow()Z
+PLcom/android/server/wm/WindowState;->isInteresting()Z
+PLcom/android/server/wm/WindowState;->isLaidOut()Z
+PLcom/android/server/wm/WindowState;->isReadyForDisplay()Z
+PLcom/android/server/wm/WindowState;->isResizedWhileNotDragResizingReported()Z
+PLcom/android/server/wm/WindowState;->isRtl()Z
+PLcom/android/server/wm/WindowState;->isVisibleNow()Z
+PLcom/android/server/wm/WindowState;->isVoiceInteraction()Z
+PLcom/android/server/wm/WindowState;->isWinVisibleLw()Z
+PLcom/android/server/wm/WindowState;->isWindowAnimationSet()Z
+PLcom/android/server/wm/WindowState;->layoutInParentFrame()Z
+PLcom/android/server/wm/WindowState;->logPerformShow(Ljava/lang/String;)V
+PLcom/android/server/wm/WindowState;->markSavedSurfaceExiting()V
+PLcom/android/server/wm/WindowState;->mightAffectAllDrawn(Z)Z
+PLcom/android/server/wm/WindowState;->onAppVisibilityChanged(ZZ)Z
+PLcom/android/server/wm/WindowState;->onExitAnimationDone()V
+PLcom/android/server/wm/WindowState;->onStopFreezingScreen()Z
+PLcom/android/server/wm/WindowState;->openInputChannel(Landroid/view/InputChannel;)V
+PLcom/android/server/wm/WindowState;->performShowLocked()Z
+PLcom/android/server/wm/WindowState;->prelayout()V
+PLcom/android/server/wm/WindowState;->prepareWindowToDisplayDuringRelayout(Landroid/util/MergedConfiguration;Z)V
+PLcom/android/server/wm/WindowState;->relayoutVisibleWindow(Landroid/util/MergedConfiguration;III)I
+PLcom/android/server/wm/WindowState;->removeIfPossible()V
+PLcom/android/server/wm/WindowState;->removeIfPossible(Z)V
+PLcom/android/server/wm/WindowState;->removeImmediately()V
+PLcom/android/server/wm/WindowState;->removeReplacedWindowIfNeeded(Lcom/android/server/wm/WindowState;)Z
+PLcom/android/server/wm/WindowState;->reportFocusChangedSerialized(ZZ)V
+PLcom/android/server/wm/WindowState;->reportResized()V
+PLcom/android/server/wm/WindowState;->requestUpdateWallpaperIfNeeded()V
+PLcom/android/server/wm/WindowState;->restoreSavedSurface()Z
+PLcom/android/server/wm/WindowState;->scheduleAnimationIfDimming()V
+PLcom/android/server/wm/WindowState;->sendAppVisibilityToClients()V
+PLcom/android/server/wm/WindowState;->setDisplayLayoutNeeded()V
+PLcom/android/server/wm/WindowState;->setDragResizing()V
+PLcom/android/server/wm/WindowState;->setHasSurface(Z)V
+PLcom/android/server/wm/WindowState;->setReplacementWindowIfNeeded(Lcom/android/server/wm/WindowState;)Z
+PLcom/android/server/wm/WindowState;->setRequestedSize(II)V
+PLcom/android/server/wm/WindowState;->setResizedWhileNotDragResizing(Z)V
+PLcom/android/server/wm/WindowState;->setShowToOwnerOnlyLocked(Z)V
+PLcom/android/server/wm/WindowState;->setVisibleBeforeClientHidden()V
+PLcom/android/server/wm/WindowState;->setWindowScale(II)V
+PLcom/android/server/wm/WindowState;->setupWindowForRemoveOnExit()V
+PLcom/android/server/wm/WindowState;->shouldSaveSurface()Z
+PLcom/android/server/wm/WindowState;->surfaceInsetsChanging()Z
+PLcom/android/server/wm/WindowState;->updateLastInsetValues()V
+PLcom/android/server/wm/WindowState;->updateReportedVisibility(Lcom/android/server/wm/WindowState$UpdateReportedVisibilityResults;)V
+PLcom/android/server/wm/WindowState;->usesRelativeZOrdering()Z
+PLcom/android/server/wm/WindowState;->waitingForReplacement()Z
+PLcom/android/server/wm/WindowStateAnimator;-><init>(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/WindowStateAnimator;->applyAnimationLocked(IZ)Z
+PLcom/android/server/wm/WindowStateAnimator;->applyEnterAnimationLocked()V
+PLcom/android/server/wm/WindowStateAnimator;->clearAnimation()V
+PLcom/android/server/wm/WindowStateAnimator;->commitFinishDrawingLocked()Z
+PLcom/android/server/wm/WindowStateAnimator;->createSurfaceLocked(II)Lcom/android/server/wm/WindowSurfaceController;
+PLcom/android/server/wm/WindowStateAnimator;->destroyDeferredSurfaceLocked()V
+PLcom/android/server/wm/WindowStateAnimator;->destroyPreservedSurfaceLocked()V
+PLcom/android/server/wm/WindowStateAnimator;->destroySurface()V
+PLcom/android/server/wm/WindowStateAnimator;->destroySurfaceLocked()V
+PLcom/android/server/wm/WindowStateAnimator;->detachChildren()V
+PLcom/android/server/wm/WindowStateAnimator;->finishDrawingLocked()Z
+PLcom/android/server/wm/WindowStateAnimator;->getAnimationFrameTime(Landroid/view/animation/Animation;J)J
+PLcom/android/server/wm/WindowStateAnimator;->getLayerStack()I
+PLcom/android/server/wm/WindowStateAnimator;->hide(Ljava/lang/String;)V
+PLcom/android/server/wm/WindowStateAnimator;->isDummyAnimation()Z
+PLcom/android/server/wm/WindowStateAnimator;->isWindowAnimationSet()Z
+PLcom/android/server/wm/WindowStateAnimator;->markPreservedSurfaceForDestroy()V
+PLcom/android/server/wm/WindowStateAnimator;->resetDrawState()V
+PLcom/android/server/wm/WindowStateAnimator;->setAnimation(Landroid/view/animation/Animation;)V
+PLcom/android/server/wm/WindowStateAnimator;->setAnimation(Landroid/view/animation/Animation;JI)V
+PLcom/android/server/wm/WindowStateAnimator;->setMoveAnimation(II)V
+PLcom/android/server/wm/WindowStateAnimator;->setOpaqueLocked(Z)V
+PLcom/android/server/wm/WindowStateAnimator;->setTransparentRegionHintLocked(Landroid/graphics/Region;)V
+PLcom/android/server/wm/WindowStateAnimator;->showSurfaceRobustlyLocked()Z
+PLcom/android/server/wm/WindowStateAnimator;->stepAnimation(J)Z
+PLcom/android/server/wm/WindowStateAnimator;->tryChangeFormatInPlaceLocked()Z
+PLcom/android/server/wm/WindowSurfaceController;-><init>(Landroid/view/SurfaceSession;Ljava/lang/String;IIIILcom/android/server/wm/WindowStateAnimator;II)V
+PLcom/android/server/wm/WindowSurfaceController;->destroyInTransaction()V
+PLcom/android/server/wm/WindowSurfaceController;->detachChildren()V
+PLcom/android/server/wm/WindowSurfaceController;->getLayer()I
+PLcom/android/server/wm/WindowSurfaceController;->getShown()Z
+PLcom/android/server/wm/WindowSurfaceController;->getSurface(Landroid/view/Surface;)V
+PLcom/android/server/wm/WindowSurfaceController;->hideInTransaction(Ljava/lang/String;)V
+PLcom/android/server/wm/WindowSurfaceController;->hideSurface()V
+PLcom/android/server/wm/WindowSurfaceController;->prepareToShowInTransaction(FFFFFZ)Z
+PLcom/android/server/wm/WindowSurfaceController;->setCropInTransaction(Landroid/graphics/Rect;Z)V
+PLcom/android/server/wm/WindowSurfaceController;->setFinalCropInTransaction(Landroid/graphics/Rect;)V
+PLcom/android/server/wm/WindowSurfaceController;->setLayer(I)V
+PLcom/android/server/wm/WindowSurfaceController;->setLayerStackInTransaction(I)V
+PLcom/android/server/wm/WindowSurfaceController;->setOpaque(Z)V
+PLcom/android/server/wm/WindowSurfaceController;->setShown(Z)V
+PLcom/android/server/wm/WindowSurfaceController;->setSizeInTransaction(IIZ)Z
+PLcom/android/server/wm/WindowSurfaceController;->setTransparentRegionHint(Landroid/graphics/Region;)V
+PLcom/android/server/wm/WindowSurfaceController;->showRobustlyInTransaction()Z
+PLcom/android/server/wm/WindowSurfaceController;->showSurface()Z
+PLcom/android/server/wm/WindowSurfaceController;->updateVisibility()Z
+PLcom/android/server/wm/WindowSurfacePlacer$LayerAndToken;-><init>()V
+PLcom/android/server/wm/WindowSurfacePlacer$LayerAndToken;-><init>(Lcom/android/server/wm/WindowSurfacePlacer$LayerAndToken;)V
+PLcom/android/server/wm/WindowSurfacePlacer;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/WindowSurfacePlacer;->canBeWallpaperTarget(Landroid/util/ArraySet;)Z
+PLcom/android/server/wm/WindowSurfacePlacer;->continueLayout()V
+PLcom/android/server/wm/WindowSurfacePlacer;->createThumbnailAppAnimator(ILcom/android/server/wm/AppWindowToken;II)V
+PLcom/android/server/wm/WindowSurfacePlacer;->deferLayout()V
+PLcom/android/server/wm/WindowSurfacePlacer;->destroyAfterTransaction(Landroid/view/SurfaceControl;)V
+PLcom/android/server/wm/WindowSurfacePlacer;->handleAppTransitionReadyLocked()I
+PLcom/android/server/wm/WindowSurfacePlacer;->handleClosingApps(ILandroid/view/WindowManager$LayoutParams;ZLcom/android/server/wm/WindowSurfacePlacer$LayerAndToken;)V
+PLcom/android/server/wm/WindowSurfacePlacer;->handleNonAppWindowsInTransition(II)V
+PLcom/android/server/wm/WindowSurfacePlacer;->handleOpeningApps(ILandroid/view/WindowManager$LayoutParams;ZI)Lcom/android/server/wm/AppWindowToken;
+PLcom/android/server/wm/WindowSurfacePlacer;->isInLayout()Z
+PLcom/android/server/wm/WindowSurfacePlacer;->lambda$-com_android_server_wm_WindowSurfacePlacer_5259()V
+PLcom/android/server/wm/WindowSurfacePlacer;->maybeUpdateTransitToWallpaper(IZZ)I
+PLcom/android/server/wm/WindowSurfacePlacer;->performSurfacePlacement()V
+PLcom/android/server/wm/WindowSurfacePlacer;->performSurfacePlacement(Z)V
+PLcom/android/server/wm/WindowSurfacePlacer;->processApplicationsAnimatingInPlace(I)V
+PLcom/android/server/wm/WindowSurfacePlacer;->requestTraversal()V
+PLcom/android/server/wm/WindowSurfacePlacer;->transitionGoodToGo(I)Z
+PLcom/android/server/wm/WindowToken;-><init>(Lcom/android/server/wm/WindowManagerService;Landroid/os/IBinder;IZLcom/android/server/wm/DisplayContent;Z)V
+PLcom/android/server/wm/WindowToken;->addWindow(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/WindowToken;->asAppWindowToken()Lcom/android/server/wm/AppWindowToken;
+PLcom/android/server/wm/WindowToken;->getAnimLayerAdjustment()I
+PLcom/android/server/wm/WindowToken;->getHighestAnimLayer()I
+PLcom/android/server/wm/WindowToken;->getReplacingWindow()Lcom/android/server/wm/WindowState;
+PLcom/android/server/wm/WindowToken;->isEmpty()Z
+PLcom/android/server/wm/WindowToken;->lambda$-com_android_server_wm_WindowToken_3278(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;)I
+PLcom/android/server/wm/WindowToken;->onDisplayChanged(Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/WindowToken;->removeAllWindowsIfPossible()V
+PLcom/android/server/wm/WindowToken;->removeImmediately()V
+PLcom/android/server/wm/WindowToken;->setExiting()V
+PLcom/android/server/wm/WindowToken;->windowsCanBeWallpaperTarget()Z
+PLcom/android/server/wm/animation/ClipRectLRAnimation;-><init>(IIII)V
+PLcom/android/server/wm/animation/ClipRectLRAnimation;->applyTransformation(FLandroid/view/animation/Transformation;)V
+PLcom/android/server/wm/animation/ClipRectTBAnimation;-><init>(IIIIIILandroid/view/animation/Interpolator;)V
+PLcom/android/server/wm/animation/ClipRectTBAnimation;->applyTransformation(FLandroid/view/animation/Transformation;)V
+PLcom/android/server/wm/animation/ClipRectTBAnimation;->getTransformation(JLandroid/view/animation/Transformation;)Z
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
index cb91f93..71f699c 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
@@ -464,6 +464,7 @@
private void updateCachedServiceLocked(int userId, boolean disabled) {
AutofillManagerServiceImpl service = getServiceForUserLocked(userId);
if (service != null) {
+ service.destroySessionsLocked();
service.updateLocked(disabled);
if (!service.isEnabled()) {
removeCachedServiceLocked(userId);
diff --git a/services/autofill/java/com/android/server/autofill/Helper.java b/services/autofill/java/com/android/server/autofill/Helper.java
index 86e32e0..086dd29 100644
--- a/services/autofill/java/com/android/server/autofill/Helper.java
+++ b/services/autofill/java/com/android/server/autofill/Helper.java
@@ -16,11 +16,16 @@
package com.android.server.autofill;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.os.Bundle;
+import android.service.autofill.Dataset;
+import android.util.ArrayMap;
import android.util.ArraySet;
import android.view.autofill.AutofillId;
+import android.view.autofill.AutofillValue;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Objects;
import java.util.Set;
@@ -82,4 +87,16 @@
}
return array;
}
+
+ @NonNull
+ static ArrayMap<AutofillId, AutofillValue> getFields(@NonNull Dataset dataset) {
+ final ArrayList<AutofillId> ids = dataset.getFieldIds();
+ final ArrayList<AutofillValue> values = dataset.getFieldValues();
+ final int size = ids == null ? 0 : ids.size();
+ final ArrayMap<AutofillId, AutofillValue> fields = new ArrayMap<>(size);
+ for (int i = 0; i < size; i++) {
+ fields.put(ids.get(i), values.get(i));
+ }
+ return fields;
+ }
}
diff --git a/services/autofill/java/com/android/server/autofill/RemoteFillService.java b/services/autofill/java/com/android/server/autofill/RemoteFillService.java
index aebe92e..5e25dfa 100644
--- a/services/autofill/java/com/android/server/autofill/RemoteFillService.java
+++ b/services/autofill/java/com/android/server/autofill/RemoteFillService.java
@@ -430,6 +430,8 @@
Slog.w(LOG_TAG, getClass().getSimpleName() + " timed out");
final RemoteFillService remoteService = mWeakService.get();
if (remoteService != null) {
+ Slog.w(LOG_TAG, getClass().getSimpleName() + " timed out after "
+ + TIMEOUT_REMOTE_REQUEST_MILLIS + " ms");
fail(remoteService);
}
};
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index 6bc9c9c..f8fb13a 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -55,8 +55,10 @@
import android.service.autofill.FillContext;
import android.service.autofill.FillRequest;
import android.service.autofill.FillResponse;
+import android.service.autofill.InternalValidator;
import android.service.autofill.SaveInfo;
import android.service.autofill.SaveRequest;
+import android.service.autofill.ValueFinder;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Slog;
@@ -78,6 +80,7 @@
import java.io.PrintWriter;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -214,7 +217,7 @@
final int numContexts = mContexts.size();
for (int i = 0; i < numContexts; i++) {
- fillContextWithAllowedValues(mContexts.get(i), flags);
+ fillContextWithAllowedValuesLocked(mContexts.get(i), flags);
}
// Dispatch a snapshot of the current contexts list since it may change
@@ -232,7 +235,7 @@
/**
* Returns the ids of all entries in {@link #mViewStates} in the same order.
*/
- private AutofillId[] getIdsOfAllViewStates() {
+ private AutofillId[] getIdsOfAllViewStatesLocked() {
final int numViewState = mViewStates.size();
final AutofillId[] ids = new AutofillId[numViewState];
for (int i = 0; i < numViewState; i++) {
@@ -243,6 +246,43 @@
}
/**
+ * Gets the value of a field, using either the {@code viewStates} or the {@code mContexts}, or
+ * {@code null} when not found on either of them.
+ */
+ @Nullable
+ private String getValueAsString(@NonNull AutofillId id) {
+ AutofillValue value = null;
+ synchronized (mLock) {
+ final ViewState state = mViewStates.get(id);
+ if (state == null) {
+ if (sDebug) Slog.d(TAG, "getValue(): no view state for " + id);
+ return null;
+ }
+ value = state.getCurrentValue();
+ if (value == null) {
+ if (sDebug) Slog.d(TAG, "getValue(): no current value for " + id);
+ value = getValueFromContexts(id);
+ }
+ }
+ if (value != null) {
+ if (value.isText()) {
+ return value.getTextValue().toString();
+ }
+ if (value.isList()) {
+ final CharSequence[] options = getAutofillOptionsFromContexts(id);
+ if (options != null) {
+ final int index = value.getListValue();
+ final CharSequence option = options[index];
+ return option != null ? option.toString() : null;
+ } else {
+ Slog.w(TAG, "getValueAsString(): no autofill options for id " + id);
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
* Updates values of the nodes in the context's structure so that:
* - proper node is focused
* - autofillValue is sent back to service when it was previously autofilled
@@ -251,8 +291,9 @@
* @param fillContext The context to be filled
* @param flags The flags that started the session
*/
- private void fillContextWithAllowedValues(@NonNull FillContext fillContext, int flags) {
- final ViewNode[] nodes = fillContext.findViewNodesByAutofillIds(getIdsOfAllViewStates());
+ private void fillContextWithAllowedValuesLocked(@NonNull FillContext fillContext, int flags) {
+ final ViewNode[] nodes = fillContext
+ .findViewNodesByAutofillIds(getIdsOfAllViewStatesLocked());
final int numViewState = mViewStates.size();
for (int i = 0; i < numViewState; i++) {
@@ -674,7 +715,13 @@
+ id + " destroyed");
return;
}
-
+ if (mResponses == null) {
+ // Typically happens when app explicitly called cancel() while the service was showing
+ // the auth UI.
+ Slog.w(TAG, "setAuthenticationResultLocked(" + authenticationId + "): no responses");
+ removeSelf();
+ return;
+ }
final int requestId = AutofillManager.getRequestIdFromAuthenticationId(authenticationId);
final FillResponse authenticatedResponse = mResponses.get(requestId);
if (authenticatedResponse == null || data == null) {
@@ -740,7 +787,7 @@
return true;
}
- final int lastResponseIdx = getLastResponseIndex();
+ final int lastResponseIdx = getLastResponseIndexLocked();
if (lastResponseIdx < 0) {
Slog.w(TAG, "showSaveLocked(): did not get last response. mResponses=" + mResponses
+ ", mViewStates=" + mViewStates);
@@ -757,57 +804,65 @@
/*
* The Save dialog is only shown if all conditions below are met:
*
- * - saveInfo is not null
- * - autofillValue of all required ids is not null
+ * - saveInfo is not null.
+ * - autofillValue of all required ids is not null.
* - autofillValue of at least one id (required or optional) has changed.
+ * - there is no Dataset in the last FillResponse whose values of all dataset fields matches
+ * the current values of all fields in the screen.
*/
-
if (saveInfo == null) {
return true;
}
- final AutofillId[] requiredIds = saveInfo.getRequiredIds();
- if (requiredIds == null || requiredIds.length == 0) {
- Slog.w(TAG, "showSaveLocked(): no required ids on saveInfo");
- return true;
- }
+ // Cache used to make sure changed fields do not belong to a dataset.
+ final ArrayMap<AutofillId, AutofillValue> currentValues = new ArrayMap<>();
+ final ArraySet<AutofillId> allIds = new ArraySet<>();
+ final AutofillId[] requiredIds = saveInfo.getRequiredIds();
boolean allRequiredAreNotEmpty = true;
boolean atLeastOneChanged = false;
- for (int i = 0; i < requiredIds.length; i++) {
- final AutofillId id = requiredIds[i];
- final ViewState viewState = mViewStates.get(id);
- if (viewState == null) {
- Slog.w(TAG, "showSaveLocked(): no ViewState for required " + id);
- allRequiredAreNotEmpty = false;
- break;
- }
-
- AutofillValue value = viewState.getCurrentValue();
- if (value == null || value.isEmpty()) {
- final AutofillValue initialValue = getValueFromContexts(id);
- if (initialValue != null) {
- if (sDebug) {
- Slog.d(TAG, "Value of required field " + id + " didn't change; "
- + "using initial value (" + initialValue + ") instead");
- }
- value = initialValue;
- } else {
- if (sDebug) {
- Slog.d(TAG, "showSaveLocked(): empty value for required " + id );
- }
+ if (requiredIds != null) {
+ for (int i = 0; i < requiredIds.length; i++) {
+ final AutofillId id = requiredIds[i];
+ if (id == null) {
+ Slog.w(TAG, "null autofill id on " + Arrays.toString(requiredIds));
+ continue;
+ }
+ allIds.add(id);
+ final ViewState viewState = mViewStates.get(id);
+ if (viewState == null) {
+ Slog.w(TAG, "showSaveLocked(): no ViewState for required " + id);
allRequiredAreNotEmpty = false;
break;
}
- }
- final AutofillValue filledValue = viewState.getAutofilledValue();
- if (!value.equals(filledValue)) {
- if (sDebug) {
- Slog.d(TAG, "showSaveLocked(): found a change on required " + id + ": "
- + filledValue + " => " + value);
+ AutofillValue value = viewState.getCurrentValue();
+ if (value == null || value.isEmpty()) {
+ final AutofillValue initialValue = getValueFromContexts(id);
+ if (initialValue != null) {
+ if (sDebug) {
+ Slog.d(TAG, "Value of required field " + id + " didn't change; "
+ + "using initial value (" + initialValue + ") instead");
+ }
+ value = initialValue;
+ } else {
+ if (sDebug) {
+ Slog.d(TAG, "empty value for required " + id );
+ }
+ allRequiredAreNotEmpty = false;
+ break;
+ }
}
- atLeastOneChanged = true;
+ currentValues.put(id, value);
+ final AutofillValue filledValue = viewState.getAutofilledValue();
+
+ if (!value.equals(filledValue)) {
+ if (sDebug) {
+ Slog.d(TAG, "found a change on required " + id + ": " + filledValue
+ + " => " + value);
+ }
+ atLeastOneChanged = true;
+ }
}
}
@@ -817,31 +872,100 @@
// No change on required ids yet, look for changes on optional ids.
for (int i = 0; i < optionalIds.length; i++) {
final AutofillId id = optionalIds[i];
+ allIds.add(id);
final ViewState viewState = mViewStates.get(id);
if (viewState == null) {
- Slog.w(TAG, "showSaveLocked(): no ViewState for optional " + id);
+ Slog.w(TAG, "no ViewState for optional " + id);
continue;
}
if ((viewState.getState() & ViewState.STATE_CHANGED) != 0) {
final AutofillValue currentValue = viewState.getCurrentValue();
+ currentValues.put(id, currentValue);
final AutofillValue filledValue = viewState.getAutofilledValue();
if (currentValue != null && !currentValue.equals(filledValue)) {
if (sDebug) {
- Slog.d(TAG, "finishSessionLocked(): found a change on optional "
- + id + ": " + filledValue + " => " + currentValue);
+ Slog.d(TAG, "found a change on optional " + id + ": " + filledValue
+ + " => " + currentValue);
}
atLeastOneChanged = true;
break;
}
+ } else {
+ // Update current values cache based on initial value
+ final AutofillValue initialValue = getValueFromContexts(id);
+ if (sDebug) {
+ Slog.d(TAG, "no current value for " + id + "; initial value is "
+ + initialValue);
+ }
+ if (initialValue != null) {
+ currentValues.put(id, initialValue);
+ }
}
}
}
if (atLeastOneChanged) {
- if (sDebug) Slog.d(TAG, "at least one field changed - showing save UI");
- mService.setSaveShown(id);
- getUiForShowing().showSaveUi(mService.getServiceLabel(), saveInfo, mPackageName,
- this);
+ if (sDebug) {
+ Slog.d(TAG, "at least one field changed, validate fields for save UI");
+ }
+ final ValueFinder valueFinder = (id) -> {return getValueAsString(id);};
+ final InternalValidator validator = saveInfo.getValidator();
+ if (validator != null) {
+ boolean isValid;
+ try {
+ isValid = validator.isValid(valueFinder);
+ } catch (Exception e) {
+ Slog.e(TAG, "Not showing save UI because of exception during validation "
+ + e.getClass());
+ return true;
+ }
+
+ if (!isValid) {
+ Slog.i(TAG, "not showing save UI because fields failed validation");
+ return true;
+ }
+ }
+
+ // Make sure the service doesn't have the fields already by checking the datasets
+ // content.
+ final List<Dataset> datasets = response.getDatasets();
+ if (datasets != null) {
+ datasets_loop: for (int i = 0; i < datasets.size(); i++) {
+ final Dataset dataset = datasets.get(i);
+ final ArrayMap<AutofillId, AutofillValue> datasetValues =
+ Helper.getFields(dataset);
+ if (sVerbose) {
+ Slog.v(TAG, "Checking if saved fields match contents of dataset #" + i
+ + ": " + dataset + "; allIds=" + allIds);
+ }
+ for (int j = 0; j < allIds.size(); j++) {
+ final AutofillId id = allIds.valueAt(j);
+ final AutofillValue currentValue = currentValues.get(id);
+ if (currentValue == null) {
+ if (sDebug) {
+ Slog.d(TAG, "dataset has value for field that is null: " + id);
+ }
+ continue datasets_loop;
+ }
+ final AutofillValue datasetValue = datasetValues.get(id);
+ if (!currentValue.equals(datasetValue)) {
+ if (sDebug) Slog.d(TAG, "found a change on id " + id);
+ continue datasets_loop;
+ }
+ if (sVerbose) Slog.v(TAG, "no changes for id " + id);
+ }
+ if (sDebug) {
+ Slog.d(TAG, "ignoring Save UI because all fields match contents of "
+ + "dataset #" + i + ": " + dataset);
+ }
+ return true;
+ }
+ }
+
+ if (sDebug) Slog.d(TAG, "Good news, everyone! All checks passed, show save UI!");
+ mService.setSaveShown(id);
+ getUiForShowing().showSaveUi(mService.getServiceLabel(), saveInfo,
+ valueFinder, mPackageName, this);
mIsSaving = true;
return false;
}
@@ -867,22 +991,38 @@
*/
@Nullable
private AutofillValue getValueFromContexts(AutofillId id) {
- AutofillValue value = null;
final int numContexts = mContexts.size();
- for (int i = 0; i < numContexts; i++) {
+ for (int i = numContexts - 1; i >= 0; i--) {
final FillContext context = mContexts.get(i);
final ViewNode node = context.findViewNodeByAutofillId(id);
if (node != null) {
- final AutofillValue candidate = node.getAutofillValue();
+ final AutofillValue value = node.getAutofillValue();
if (sDebug) {
- Slog.d(TAG, "getValueFromContexts(" + id + ") at " + i + ": " + candidate);
+ Slog.d(TAG, "getValueFromContexts(" + id + ") at " + i + ": " + value);
}
- if (candidate != null && !candidate.isEmpty()) {
- value = candidate;
+ if (value != null && !value.isEmpty()) {
+ return value;
}
}
}
- return value;
+ return null;
+ }
+
+ /**
+ * Gets the latest autofill options for the given id in the autofill contexts.
+ */
+ @Nullable
+ private CharSequence[] getAutofillOptionsFromContexts(AutofillId id) {
+ final int numContexts = mContexts.size();
+
+ for (int i = numContexts - 1; i >= 0; i--) {
+ final FillContext context = mContexts.get(i);
+ final ViewNode node = context.findViewNodeByAutofillId(id);
+ if (node != null && node.getAutofillOptions() != null) {
+ return node.getAutofillOptions();
+ }
+ }
+ return null;
}
/**
@@ -902,7 +1042,8 @@
for (int contextNum = 0; contextNum < numContexts; contextNum++) {
final FillContext context = mContexts.get(contextNum);
- final ViewNode[] nodes = context.findViewNodesByAutofillIds(getIdsOfAllViewStates());
+ final ViewNode[] nodes =
+ context.findViewNodesByAutofillIds(getIdsOfAllViewStatesLocked());
if (sVerbose) Slog.v(TAG, "callSaveLocked(): updating " + context);
@@ -1016,7 +1157,7 @@
}
}
- final ArrayList<Dataset> datasets = response.getDatasets();
+ final List<Dataset> datasets = response.getDatasets();
if (datasets != null) {
final int numDatasets = datasets.size();
@@ -1185,7 +1326,7 @@
// Only track the views of the last response as only those are reported back to the
// service, see #showSaveLocked
- final FillResponse response = mResponses.valueAt(getLastResponseIndex());
+ final FillResponse response = mResponses.valueAt(getLastResponseIndexLocked());
ArraySet<AutofillId> trackedViews = null;
boolean saveOnAllViewsInvisible = false;
@@ -1212,7 +1353,7 @@
// Must also track that are part of datasets, otherwise the FillUI won't be hidden when
// they go away (if they're not savable).
- final ArrayList<Dataset> datasets = response.getDatasets();
+ final List<Dataset> datasets = response.getDatasets();
ArraySet<AutofillId> fillableIds = null;
if (datasets != null) {
for (int i = 0; i < datasets.size(); i++) {
@@ -1285,7 +1426,7 @@
* Sets the state of all views in the given response.
*/
private void setViewStatesLocked(FillResponse response, int state, boolean clearResponse) {
- final ArrayList<Dataset> datasets = response.getDatasets();
+ final List<Dataset> datasets = response.getDatasets();
if (datasets != null) {
for (int i = 0; i < datasets.size(); i++) {
final Dataset dataset = datasets.get(i);
@@ -1308,8 +1449,10 @@
final SaveInfo saveInfo = response.getSaveInfo();
if (saveInfo != null) {
final AutofillId[] requiredIds = saveInfo.getRequiredIds();
- for (AutofillId id : requiredIds) {
- createOrUpdateViewStateLocked(id, state, null);
+ if (requiredIds != null) {
+ for (AutofillId id : requiredIds) {
+ createOrUpdateViewStateLocked(id, state, null);
+ }
}
final AutofillId[] optionalIds = saveInfo.getOptionalIds();
if (optionalIds != null) {
@@ -1560,17 +1703,19 @@
}
}
- private int getLastResponseIndex() {
+ private int getLastResponseIndexLocked() {
// The response ids are monotonically increasing so
// we just find the largest id which is the last. We
// do not rely on the internal ordering in sparse
// array to avoid - wow this stopped working!?
int lastResponseIdx = -1;
int lastResponseId = -1;
- final int responseCount = mResponses.size();
- for (int i = 0; i < responseCount; i++) {
- if (mResponses.keyAt(i) > lastResponseId) {
- lastResponseIdx = i;
+ if (mResponses != null) {
+ final int responseCount = mResponses.size();
+ for (int i = 0; i < responseCount; i++) {
+ if (mResponses.keyAt(i) > lastResponseId) {
+ lastResponseIdx = i;
+ }
}
}
return lastResponseIdx;
diff --git a/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java b/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java
index 4f90019..67ee185 100644
--- a/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java
+++ b/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java
@@ -28,6 +28,7 @@
import android.service.autofill.Dataset;
import android.service.autofill.FillResponse;
import android.service.autofill.SaveInfo;
+import android.service.autofill.ValueFinder;
import android.text.TextUtils;
import android.util.Slog;
import android.view.autofill.AutofillId;
@@ -162,7 +163,8 @@
@Nullable String filterText, @NonNull String packageName,
@NonNull AutoFillUiCallback callback) {
if (sDebug) {
- Slog.d(TAG, "showFillUi(): id=" + focusedId + ", filter=" + filterText);
+ final int size = filterText == null ? 0 : filterText.length();
+ Slog.d(TAG, "showFillUi(): id=" + focusedId + ", filter=" + size + " chars");
}
final LogMaker log = (new LogMaker(MetricsProto.MetricsEvent.AUTOFILL_FILL_UI))
.setPackageName(packageName)
@@ -242,7 +244,8 @@
* Shows the UI asking the user to save for autofill.
*/
public void showSaveUi(@NonNull CharSequence providerLabel, @NonNull SaveInfo info,
- @NonNull String packageName, @NonNull AutoFillUiCallback callback) {
+ @NonNull ValueFinder valueFinder, @NonNull String packageName,
+ @NonNull AutoFillUiCallback callback) {
if (sVerbose) Slog.v(TAG, "showSaveUi() for " + packageName + ": " + info);
int numIds = 0;
numIds += info.getRequiredIds() == null ? 0 : info.getRequiredIds().length;
@@ -257,8 +260,8 @@
return;
}
hideAllUiThread(callback);
- mSaveUi = new SaveUi(mContext, providerLabel, info,
- mOverlayControl, new SaveUi.OnSaveListener() {
+ mSaveUi = new SaveUi(mContext, providerLabel, info, valueFinder, mOverlayControl,
+ new SaveUi.OnSaveListener() {
@Override
public void onSave() {
log.setType(MetricsProto.MetricsEvent.TYPE_ACTION);
diff --git a/services/autofill/java/com/android/server/autofill/ui/CustomScrollView.java b/services/autofill/java/com/android/server/autofill/ui/CustomScrollView.java
new file mode 100644
index 0000000..e68263a
--- /dev/null
+++ b/services/autofill/java/com/android/server/autofill/ui/CustomScrollView.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.server.autofill.ui;
+
+import static com.android.server.autofill.Helper.sDebug;
+
+import android.content.Context;
+import android.graphics.Point;
+import android.util.AttributeSet;
+import android.util.Slog;
+import android.util.TypedValue;
+import android.view.View;
+import android.widget.ScrollView;
+
+import com.android.internal.R;
+
+/**
+ * Custom scroll view that stretches to a maximum height.
+ */
+public class CustomScrollView extends ScrollView {
+
+ private static final String TAG = "CustomScrollView";
+
+ private int mWidth = -1;
+ private int mHeight = -1;
+
+ public CustomScrollView(Context context) {
+ super(context);
+ }
+
+ public CustomScrollView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public CustomScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ public CustomScrollView(Context context, AttributeSet attrs, int defStyleAttr,
+ int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+
+ if (getChildCount() == 0) {
+ // Should not happen
+ Slog.e(TAG, "no children");
+ return;
+ }
+
+ calculateDimensions();
+ setMeasuredDimension(mWidth, mHeight);
+ }
+
+ private void calculateDimensions() {
+ if (mWidth != -1) return;
+
+ final TypedValue typedValue = new TypedValue();
+ final Point point = new Point();
+ final Context context = getContext();
+ context.getDisplay().getSize(point);
+ context.getTheme().resolveAttribute(R.attr.autofillSaveCustomSubtitleMaxHeight,
+ typedValue, true);
+ final View child = getChildAt(0);
+ final int childHeight = child.getMeasuredHeight();
+ final int maxHeight = (int) typedValue.getFraction(point.y, point.y);
+
+ mWidth = point.x;
+ mHeight = Math.min(childHeight, maxHeight);
+ if (sDebug) {
+ Slog.d(TAG, "calculateDimensions(): maxHeight=" + maxHeight
+ + ", childHeight=" + childHeight + ", w=" + mWidth + ", h=" + mHeight);
+ }
+ }
+}
diff --git a/services/autofill/java/com/android/server/autofill/ui/FillUi.java b/services/autofill/java/com/android/server/autofill/ui/FillUi.java
index 51a239f..24f3b33 100644
--- a/services/autofill/java/com/android/server/autofill/ui/FillUi.java
+++ b/services/autofill/java/com/android/server/autofill/ui/FillUi.java
@@ -204,7 +204,10 @@
return;
}
if (count <= 0) {
- if (sDebug) Slog.d(TAG, "No dataset matches filter: " + mFilterText);
+ if (sDebug) {
+ final int size = mFilterText == null ? 0 : mFilterText.length();
+ Slog.d(TAG, "No dataset matches filter with " + size + " chars");
+ }
mCallback.requestHideFillUi();
} else {
if (updateContentSize()) {
diff --git a/services/autofill/java/com/android/server/autofill/ui/OverlayControl.java b/services/autofill/java/com/android/server/autofill/ui/OverlayControl.java
index fe0611e..49f4b53 100644
--- a/services/autofill/java/com/android/server/autofill/ui/OverlayControl.java
+++ b/services/autofill/java/com/android/server/autofill/ui/OverlayControl.java
@@ -21,6 +21,7 @@
import android.content.Context;
import android.os.Binder;
import android.os.IBinder;
+import android.os.UserHandle;
/**
* This class controls showing/hiding overlays. We don't
@@ -47,10 +48,10 @@
private void setOverlayAllowed(boolean allowed) {
if (mAppOpsManager != null) {
- mAppOpsManager.setUserRestriction(
- AppOpsManager.OP_SYSTEM_ALERT_WINDOW, !allowed, mToken);
- mAppOpsManager.setUserRestriction(
- AppOpsManager.OP_TOAST_WINDOW, !allowed, mToken);
+ mAppOpsManager.setUserRestrictionForUser(AppOpsManager.OP_SYSTEM_ALERT_WINDOW, !allowed,
+ mToken, null, UserHandle.USER_ALL);
+ mAppOpsManager.setUserRestrictionForUser(AppOpsManager.OP_TOAST_WINDOW, !allowed,
+ mToken, null, UserHandle.USER_ALL);
}
}
}
diff --git a/services/autofill/java/com/android/server/autofill/ui/SaveUi.java b/services/autofill/java/com/android/server/autofill/ui/SaveUi.java
index c9e2a92..0351865 100644
--- a/services/autofill/java/com/android/server/autofill/ui/SaveUi.java
+++ b/services/autofill/java/com/android/server/autofill/ui/SaveUi.java
@@ -24,16 +24,22 @@
import android.content.Context;
import android.content.IntentSender;
import android.os.Handler;
+import android.service.autofill.CustomDescription;
import android.service.autofill.SaveInfo;
+import android.service.autofill.ValueFinder;
import android.text.Html;
import android.util.ArraySet;
import android.util.Slog;
import android.view.Gravity;
import android.view.Window;
import android.view.WindowManager;
+import android.widget.RemoteViews;
+import android.widget.ScrollView;
import android.widget.TextView;
import android.view.LayoutInflater;
import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewGroup.LayoutParams;
import com.android.internal.R;
import com.android.server.UiThread;
@@ -107,14 +113,15 @@
private boolean mDestroyed;
SaveUi(@NonNull Context context, @NonNull CharSequence providerLabel, @NonNull SaveInfo info,
- @NonNull OverlayControl overlayControl, @NonNull OnSaveListener listener) {
+ @NonNull ValueFinder valueFinder, @NonNull OverlayControl overlayControl,
+ @NonNull OnSaveListener listener) {
mListener = new OneTimeListener(listener);
mOverlayControl = overlayControl;
final LayoutInflater inflater = LayoutInflater.from(context);
final View view = inflater.inflate(R.layout.autofill_save, null);
- final TextView titleView = (TextView) view.findViewById(R.id.autofill_save_title);
+ final TextView titleView = view.findViewById(R.id.autofill_save_title);
final ArraySet<String> types = new ArraySet<>(3);
final int type = info.getType();
@@ -155,15 +162,38 @@
}
titleView.setText(mTitle);
- mSubTitle = info.getDescription();
- if (mSubTitle != null) {
- final TextView subTitleView = (TextView) view.findViewById(R.id.autofill_save_subtitle);
- subTitleView.setText(mSubTitle);
- subTitleView.setVisibility(View.VISIBLE);
- }
- if (sDebug) {
- Slog.d(TAG, "on constructor: title=" + mTitle + ", subTitle=" + mSubTitle);
+ ScrollView subtitleContainer = null;
+ final CustomDescription customDescription = info.getCustomDescription();
+ if (customDescription != null) {
+ mSubTitle = null;
+ if (sDebug) Slog.d(TAG, "Using custom description");
+
+ final RemoteViews presentation = customDescription.getPresentation(valueFinder);
+ if (presentation != null) {
+ try {
+ final View customSubtitleView = presentation.apply(context, null);
+ subtitleContainer = view.findViewById(R.id.autofill_save_custom_subtitle);
+ subtitleContainer.addView(customSubtitleView);
+ subtitleContainer.setVisibility(View.VISIBLE);
+ } catch (Exception e) {
+ Slog.e(TAG, "Could not inflate custom description. ", e);
+ }
+ } else {
+ Slog.w(TAG, "could not create remote presentation for custom title");
+ }
+ } else {
+ mSubTitle = info.getDescription();
+ if (mSubTitle != null) {
+ subtitleContainer = view.findViewById(R.id.autofill_save_custom_subtitle);
+ final TextView subtitleView = new TextView(context);
+ subtitleView.setText(mSubTitle);
+ subtitleContainer.addView(subtitleView,
+ new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT));
+ subtitleContainer.setVisibility(View.VISIBLE);
+ }
+ if (sDebug) Slog.d(TAG, "on constructor: title=" + mTitle + ", subTitle=" + mSubTitle);
}
final TextView noButton = view.findViewById(R.id.autofill_save_no);
@@ -198,6 +228,7 @@
final WindowManager.LayoutParams params = window.getAttributes();
params.width = WindowManager.LayoutParams.MATCH_PARENT;
params.accessibilityTitle = context.getString(R.string.autofill_save_accessibility_title);
+ params.windowAnimations = R.style.AutofillSaveAnimation;
Slog.i(TAG, "Showing save dialog: " + mTitle);
mDialog.show();
diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java
index a27a77e..41de97c 100644
--- a/services/backup/java/com/android/server/backup/BackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/BackupManagerService.java
@@ -98,6 +98,7 @@
import android.os.SELinux;
import android.os.ServiceManager;
import android.os.SystemClock;
+import android.os.Trace;
import android.os.UserHandle;
import android.os.WorkSource;
import android.os.storage.IStorageManager;
@@ -106,6 +107,7 @@
import android.system.ErrnoException;
import android.system.Os;
import android.text.TextUtils;
+import android.util.ArraySet;
import android.util.AtomicFile;
import android.util.EventLog;
import android.util.Log;
@@ -259,7 +261,6 @@
private static final int MSG_RUN_ADB_BACKUP = 2;
private static final int MSG_RUN_RESTORE = 3;
private static final int MSG_RUN_CLEAR = 4;
- private static final int MSG_RUN_INITIALIZE = 5;
private static final int MSG_RUN_GET_RESTORE_SETS = 6;
private static final int MSG_RESTORE_SESSION_TIMEOUT = 8;
private static final int MSG_FULL_CONFIRMATION_TIMEOUT = 9;
@@ -397,9 +398,12 @@
@Override
public void onUnlockUser(int userId) {
if (userId == UserHandle.USER_SYSTEM) {
+ Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "backup init");
sInstance.initialize(userId);
+ Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
// Migrate legacy setting
+ Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "backup migrate");
if (!backupSettingMigrated(userId)) {
if (DEBUG) {
Slog.i(TAG, "Backup enable apparently not migrated");
@@ -420,12 +424,15 @@
}
}
}
+ Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
+ Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "backup enable");
try {
sInstance.setBackupEnabled(readBackupEnableState(userId));
} catch (RemoteException e) {
// can't happen; it's a local object
}
+ Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
}
}
}
@@ -734,7 +741,7 @@
// Persistently track the need to do a full init
static final String INIT_SENTINEL_FILE_NAME = "_need_init_";
- HashSet<String> mPendingInits = new HashSet<String>(); // transport names
+ ArraySet<String> mPendingInits = new ArraySet<String>(); // transport names
// Round-robin queue for scheduling full backup passes
static final int SCHEDULE_FILE_VERSION = 1; // current version of the schedule file
@@ -1043,20 +1050,6 @@
break;
}
- case MSG_RUN_INITIALIZE:
- {
- HashSet<String> queue;
-
- // Snapshot the pending-init queue and work on that
- synchronized (mQueueLock) {
- queue = new HashSet<String>(mPendingInits);
- mPendingInits.clear();
- }
-
- (new PerformInitializeTask(queue)).run();
- break;
- }
-
case MSG_RETRY_INIT:
{
synchronized (mQueueLock) {
@@ -1320,7 +1313,7 @@
Intent initIntent = new Intent(RUN_INITIALIZE_ACTION);
backupIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
- mRunInitIntent = PendingIntent.getBroadcast(context, MSG_RUN_INITIALIZE, initIntent, 0);
+ mRunInitIntent = PendingIntent.getBroadcast(context, 0, initIntent, 0);
// Set up the backup-request journaling
mJournalDir = new File(mBaseStateDir, "pending");
@@ -1407,15 +1400,15 @@
private class RunInitializeReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
if (RUN_INITIALIZE_ACTION.equals(intent.getAction())) {
+ // Snapshot the pending-init queue and work on that
synchronized (mQueueLock) {
- if (DEBUG) Slog.v(TAG, "Running a device init");
+ String[] queue = mPendingInits.toArray(new String[mPendingInits.size()]);
+ mPendingInits.clear();
// Acquire the wakelock and pass it to the init thread. it will
// be released once init concludes.
mWakelock.acquire();
-
- Message msg = mBackupHandler.obtainMessage(MSG_RUN_INITIALIZE);
- mBackupHandler.sendMessage(msg);
+ mBackupHandler.post(new PerformInitializeTask(queue, null));
}
}
}
@@ -2456,6 +2449,17 @@
throw new IllegalArgumentException("No packages are provided for backup");
}
+ if (!mEnabled || !mProvisioned) {
+ Slog.i(TAG, "Backup requested but e=" + mEnabled + " p=" +mProvisioned);
+ sendBackupFinished(observer, BackupManager.ERROR_BACKUP_NOT_ALLOWED);
+ final int logTag = mProvisioned
+ ? BackupManagerMonitor.LOG_EVENT_ID_BACKUP_DISABLED
+ : BackupManagerMonitor.LOG_EVENT_ID_DEVICE_NOT_PROVISIONED;
+ monitor = monitorEvent(monitor, logTag, null,
+ BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY, null);
+ return BackupManager.ERROR_BACKUP_NOT_ALLOWED;
+ }
+
IBackupTransport transport = mTransportManager.getCurrentTransportBinder();
if (transport == null) {
sendBackupFinished(observer, BackupManager.ERROR_TRANSPORT_ABORTED);
@@ -4843,7 +4847,7 @@
+ " provisioned=" + mProvisioned + "; ignoring");
}
int monitoringEvent;
- if (!mEnabled) {
+ if (mProvisioned) {
monitoringEvent = BackupManagerMonitor.LOG_EVENT_ID_BACKUP_DISABLED;
} else {
monitoringEvent = BackupManagerMonitor.LOG_EVENT_ID_DEVICE_NOT_PROVISIONED;
@@ -7573,7 +7577,9 @@
// All set; now set up the IPC and launch the agent
setUpPipes();
mAgent = bindToAgentSynchronous(mTargetApp,
- ApplicationThreadConstants.BACKUP_MODE_RESTORE_FULL);
+ FullBackup.KEY_VALUE_DATA_TOKEN.equals(info.domain)
+ ? ApplicationThreadConstants.BACKUP_MODE_INCREMENTAL
+ : ApplicationThreadConstants.BACKUP_MODE_RESTORE_FULL);
mAgentPackage = pkg;
} catch (IOException e) {
// fall through to error handling
@@ -9777,13 +9783,37 @@
}
class PerformInitializeTask implements Runnable {
- HashSet<String> mQueue;
+ String[] mQueue;
+ IBackupObserver mObserver;
- PerformInitializeTask(HashSet<String> transportNames) {
+ PerformInitializeTask(String[] transportNames, IBackupObserver observer) {
mQueue = transportNames;
+ mObserver = observer;
+ }
+
+ private void notifyResult(String target, int status) {
+ try {
+ if (mObserver != null) {
+ mObserver.onResult(target, status);
+ }
+ } catch (RemoteException ignored) {
+ mObserver = null; // don't try again
+ }
+ }
+
+ private void notifyFinished(int status) {
+ try {
+ if (mObserver != null) {
+ mObserver.backupFinished(status);
+ }
+ } catch (RemoteException ignored) {
+ mObserver = null;
+ }
}
public void run() {
+ // mWakelock is *acquired* when execution begins here
+ int result = BackupTransport.TRANSPORT_OK;
try {
for (String transportName : mQueue) {
IBackupTransport transport =
@@ -9812,6 +9842,7 @@
synchronized (mQueueLock) {
recordInitPendingLocked(false, transportName);
}
+ notifyResult(transportName, BackupTransport.TRANSPORT_OK);
} else {
// If this didn't work, requeue this one and try again
// after a suitable interval
@@ -9820,6 +9851,9 @@
synchronized (mQueueLock) {
recordInitPendingLocked(true, transportName);
}
+ notifyResult(transportName, status);
+ result = status;
+
// do this via another alarm to make sure of the wakelock states
long delay = transport.requestBackupTime();
Slog.w(TAG, "Init failed on " + transportName + " resched in " + delay);
@@ -9829,8 +9863,10 @@
}
} catch (Exception e) {
Slog.e(TAG, "Unexpected error performing init", e);
+ result = BackupTransport.TRANSPORT_ERROR;
} finally {
// Done; release the wakelock
+ notifyFinished(result);
mWakelock.release();
}
}
@@ -9948,6 +9984,23 @@
});
}
+ // Run an initialize operation for the given transport
+ @Override
+ public void initializeTransports(String[] transportNames, IBackupObserver observer) {
+ mContext.enforceCallingPermission(android.Manifest.permission.BACKUP, "initializeTransport");
+ if (MORE_DEBUG) {
+ Slog.v(TAG, "initializeTransports() of " + transportNames);
+ }
+
+ final long oldId = Binder.clearCallingIdentity();
+ try {
+ mWakelock.acquire();
+ mBackupHandler.post(new PerformInitializeTask(transportNames, observer));
+ } finally {
+ Binder.restoreCallingIdentity(oldId);
+ }
+ }
+
// Clear the given package's backup data from the current transport
@Override
public void clearBackupData(String transportName, String packageName) {
diff --git a/services/backup/java/com/android/server/backup/BackupManagerServiceInterface.java b/services/backup/java/com/android/server/backup/BackupManagerServiceInterface.java
index e415494..5dfa630 100644
--- a/services/backup/java/com/android/server/backup/BackupManagerServiceInterface.java
+++ b/services/backup/java/com/android/server/backup/BackupManagerServiceInterface.java
@@ -77,6 +77,9 @@
void dataChanged(String packageName);
+ // Initialize the given transport
+ void initializeTransports(String[] transportName, IBackupObserver observer);
+
// Clear the given package's backup data from the current transport
void clearBackupData(String transportName, String packageName);
diff --git a/services/backup/java/com/android/server/backup/BackupPasswordManager.java b/services/backup/java/com/android/server/backup/BackupPasswordManager.java
new file mode 100644
index 0000000..ee7651b
--- /dev/null
+++ b/services/backup/java/com/android/server/backup/BackupPasswordManager.java
@@ -0,0 +1,307 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.backup;
+
+import android.content.Context;
+import android.util.Slog;
+
+import com.android.server.backup.utils.DataStreamFileCodec;
+import com.android.server.backup.utils.DataStreamCodec;
+import com.android.server.backup.utils.PasswordUtils;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.security.SecureRandom;
+
+/**
+ * Manages persisting and verifying backup passwords.
+ *
+ * <p>Does not persist the password itself, but persists a PBKDF2 hash with a randomly chosen (also
+ * persisted) salt. Validation is performed by running the challenge text through the same
+ * PBKDF2 cycle with the persisted salt, and checking the hashes match.
+ *
+ * @see PasswordUtils for the hashing algorithm.
+ */
+public final class BackupPasswordManager {
+ private static final String TAG = "BackupPasswordManager";
+ private static final boolean DEBUG = false;
+
+ private static final int BACKUP_PW_FILE_VERSION = 2;
+ private static final int DEFAULT_PW_FILE_VERSION = 1;
+
+ private static final String PASSWORD_VERSION_FILE_NAME = "pwversion";
+ private static final String PASSWORD_HASH_FILE_NAME = "pwhash";
+
+ // See https://android-developers.googleblog.com/2013/12/changes-to-secretkeyfactory-api-in.html
+ public static final String PBKDF_CURRENT = "PBKDF2WithHmacSHA1";
+ public static final String PBKDF_FALLBACK = "PBKDF2WithHmacSHA1And8bit";
+
+ private final SecureRandom mRng;
+ private final Context mContext;
+ private final File mBaseStateDir;
+
+ private String mPasswordHash;
+ private int mPasswordVersion;
+ private byte[] mPasswordSalt;
+
+ /**
+ * Creates an instance enforcing permissions using the {@code context} and persisting password
+ * data within the {@code baseStateDir}.
+ *
+ * @param context The context, for enforcing permissions around setting the password.
+ * @param baseStateDir A directory within which to persist password data.
+ * @param secureRandom Random number generator with which to generate password salts.
+ */
+ BackupPasswordManager(Context context, File baseStateDir, SecureRandom secureRandom) {
+ mContext = context;
+ mRng = secureRandom;
+ mBaseStateDir = baseStateDir;
+ loadStateFromFilesystem();
+ }
+
+ /**
+ * Returns {@code true} if a password for backup is set.
+ *
+ * @throws SecurityException If caller does not have {@link android.Manifest.permission#BACKUP}
+ * permission.
+ */
+ boolean hasBackupPassword() {
+ mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP,
+ "hasBackupPassword");
+ return mPasswordHash != null && mPasswordHash.length() > 0;
+ }
+
+ /**
+ * Returns {@code true} if {@code password} matches the persisted password.
+ *
+ * @throws SecurityException If caller does not have {@link android.Manifest.permission#BACKUP}
+ * permission.
+ */
+ boolean backupPasswordMatches(String password) {
+ if (hasBackupPassword() && !passwordMatchesSaved(password)) {
+ if (DEBUG) Slog.w(TAG, "Backup password mismatch; aborting");
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Sets the new password, given a correct current password.
+ *
+ * @throws SecurityException If caller does not have {@link android.Manifest.permission#BACKUP}
+ * permission.
+ * @return {@code true} if has permission to set the password, {@code currentPassword}
+ * matches the currently persisted password, and is able to persist {@code newPassword}.
+ */
+ boolean setBackupPassword(String currentPassword, String newPassword) {
+ mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP,
+ "setBackupPassword");
+
+ if (!passwordMatchesSaved(currentPassword)) {
+ return false;
+ }
+
+ // Snap up to latest password file version.
+ try {
+ getPasswordVersionFileCodec().serialize(BACKUP_PW_FILE_VERSION);
+ mPasswordVersion = BACKUP_PW_FILE_VERSION;
+ } catch (IOException e) {
+ Slog.e(TAG, "Unable to write backup pw version; password not changed");
+ return false;
+ }
+
+ if (newPassword == null || newPassword.isEmpty()) {
+ return clearPassword();
+ }
+
+ try {
+ byte[] salt = randomSalt();
+ String newPwHash = PasswordUtils.buildPasswordHash(
+ PBKDF_CURRENT, newPassword, salt, PasswordUtils.PBKDF2_HASH_ROUNDS);
+
+ getPasswordHashFileCodec().serialize(new BackupPasswordHash(newPwHash, salt));
+ mPasswordHash = newPwHash;
+ mPasswordSalt = salt;
+ return true;
+ } catch (IOException e) {
+ Slog.e(TAG, "Unable to set backup password");
+ }
+ return false;
+ }
+
+ /**
+ * Returns {@code true} if should try salting using the older PBKDF algorithm.
+ *
+ * <p>This is {@code true} for v1 files.
+ */
+ private boolean usePbkdf2Fallback() {
+ return mPasswordVersion < BACKUP_PW_FILE_VERSION;
+ }
+
+ /**
+ * Deletes the current backup password.
+ *
+ * @return {@code true} if successful.
+ */
+ private boolean clearPassword() {
+ File passwordHashFile = getPasswordHashFile();
+ if (passwordHashFile.exists() && !passwordHashFile.delete()) {
+ Slog.e(TAG, "Unable to clear backup password");
+ return false;
+ }
+
+ mPasswordHash = null;
+ mPasswordSalt = null;
+ return true;
+ }
+
+ /**
+ * Sets the password hash, salt, and version in the object from what has been persisted to the
+ * filesystem.
+ */
+ private void loadStateFromFilesystem() {
+ try {
+ mPasswordVersion = getPasswordVersionFileCodec().deserialize();
+ } catch (IOException e) {
+ Slog.e(TAG, "Unable to read backup pw version");
+ mPasswordVersion = DEFAULT_PW_FILE_VERSION;
+ }
+
+ try {
+ BackupPasswordHash hash = getPasswordHashFileCodec().deserialize();
+ mPasswordHash = hash.hash;
+ mPasswordSalt = hash.salt;
+ } catch (IOException e) {
+ Slog.e(TAG, "Unable to read saved backup pw hash");
+ }
+ }
+
+ /**
+ * Whether the candidate password matches the current password. If the persisted password is an
+ * older version, attempts hashing using the older algorithm.
+ *
+ * @param candidatePassword The password to try.
+ * @return {@code true} if the passwords match.
+ */
+ private boolean passwordMatchesSaved(String candidatePassword) {
+ return passwordMatchesSaved(PBKDF_CURRENT, candidatePassword)
+ || (usePbkdf2Fallback() && passwordMatchesSaved(PBKDF_FALLBACK, candidatePassword));
+ }
+
+ /**
+ * Returns {@code true} if the candidate password is correct.
+ *
+ * @param algorithm The algorithm used to hash passwords.
+ * @param candidatePassword The candidate password to compare to the current password.
+ * @return {@code true} if the candidate password matched the saved password.
+ */
+ private boolean passwordMatchesSaved(String algorithm, String candidatePassword) {
+ if (mPasswordHash == null) {
+ return candidatePassword == null || candidatePassword.equals("");
+ } else if (candidatePassword == null || candidatePassword.length() == 0) {
+ // The current password is not zero-length, but the candidate password is.
+ return false;
+ } else {
+ String candidatePasswordHash = PasswordUtils.buildPasswordHash(
+ algorithm, candidatePassword, mPasswordSalt, PasswordUtils.PBKDF2_HASH_ROUNDS);
+ return mPasswordHash.equalsIgnoreCase(candidatePasswordHash);
+ }
+ }
+
+ private byte[] randomSalt() {
+ int bitsPerByte = 8;
+ byte[] array = new byte[PasswordUtils.PBKDF2_SALT_SIZE / bitsPerByte];
+ mRng.nextBytes(array);
+ return array;
+ }
+
+ private DataStreamFileCodec<Integer> getPasswordVersionFileCodec() {
+ return new DataStreamFileCodec<>(
+ new File(mBaseStateDir, PASSWORD_VERSION_FILE_NAME),
+ new PasswordVersionFileCodec());
+ }
+
+ private DataStreamFileCodec<BackupPasswordHash> getPasswordHashFileCodec() {
+ return new DataStreamFileCodec<>(getPasswordHashFile(), new PasswordHashFileCodec());
+ }
+
+ private File getPasswordHashFile() {
+ return new File(mBaseStateDir, PASSWORD_HASH_FILE_NAME);
+ }
+
+ /**
+ * Container class for a PBKDF hash and the salt used to create the hash.
+ */
+ private static final class BackupPasswordHash {
+ public String hash;
+ public byte[] salt;
+
+ BackupPasswordHash(String hash, byte[] salt) {
+ this.hash = hash;
+ this.salt = salt;
+ }
+ }
+
+ /**
+ * The password version file contains a single 32-bit integer.
+ */
+ private static final class PasswordVersionFileCodec implements
+ DataStreamCodec<Integer> {
+ @Override
+ public void serialize(Integer integer, DataOutputStream dataOutputStream)
+ throws IOException {
+ dataOutputStream.write(integer);
+ }
+
+ @Override
+ public Integer deserialize(DataInputStream dataInputStream) throws IOException {
+ return dataInputStream.readInt();
+ }
+ }
+
+ /**
+ * The passwords hash file contains
+ *
+ * <ul>
+ * <li>A 32-bit integer representing the number of bytes in the salt;
+ * <li>The salt bytes;
+ * <li>A UTF-8 string of the hash.
+ * </ul>
+ */
+ private static final class PasswordHashFileCodec implements
+ DataStreamCodec<BackupPasswordHash> {
+ @Override
+ public void serialize(BackupPasswordHash backupPasswordHash,
+ DataOutputStream dataOutputStream) throws IOException {
+ dataOutputStream.writeInt(backupPasswordHash.salt.length);
+ dataOutputStream.write(backupPasswordHash.salt);
+ dataOutputStream.writeUTF(backupPasswordHash.hash);
+ }
+
+ @Override
+ public BackupPasswordHash deserialize(
+ DataInputStream dataInputStream) throws IOException {
+ int saltLen = dataInputStream.readInt();
+ byte[] salt = new byte[saltLen];
+ dataInputStream.readFully(salt);
+ String hash = dataInputStream.readUTF();
+ return new BackupPasswordHash(hash, salt);
+ }
+ }
+}
diff --git a/services/backup/java/com/android/server/backup/DataChangedJournal.java b/services/backup/java/com/android/server/backup/DataChangedJournal.java
new file mode 100644
index 0000000..9360c85
--- /dev/null
+++ b/services/backup/java/com/android/server/backup/DataChangedJournal.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.backup;
+
+import android.annotation.Nullable;
+
+import java.io.BufferedInputStream;
+import java.io.DataInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.util.ArrayList;
+
+/**
+ * A journal of packages that have indicated that their data has changed (and therefore should be
+ * backed up in the next scheduled K/V backup pass).
+ *
+ * <p>This information is persisted to the filesystem so that it is not lost in the event of a
+ * reboot.
+ */
+public final class DataChangedJournal {
+ private static final String FILE_NAME_PREFIX = "journal";
+
+ /**
+ * Journals tend to be on the order of a few kilobytes, hence setting the buffer size to 8kb.
+ */
+ private static final int BUFFER_SIZE_BYTES = 8 * 1024;
+
+ private final File mFile;
+
+ /**
+ * Constructs an instance that reads from and writes to the given file.
+ */
+ DataChangedJournal(File file) {
+ mFile = file;
+ }
+
+ /**
+ * Adds the given package to the journal.
+ *
+ * @param packageName The name of the package whose data has changed.
+ * @throws IOException if there is an IO error writing to the journal file.
+ */
+ public void addPackage(String packageName) throws IOException {
+ try (RandomAccessFile out = new RandomAccessFile(mFile, "rws")) {
+ out.seek(out.length());
+ out.writeUTF(packageName);
+ }
+ }
+
+ /**
+ * Invokes {@link Consumer#accept(String)} with every package name in the journal file.
+ *
+ * @param consumer The callback.
+ * @throws IOException If there is an IO error reading from the file.
+ */
+ public void forEach(Consumer consumer) throws IOException {
+ try (
+ BufferedInputStream bufferedInputStream = new BufferedInputStream(
+ new FileInputStream(mFile), BUFFER_SIZE_BYTES);
+ DataInputStream dataInputStream = new DataInputStream(bufferedInputStream)
+ ) {
+ while (dataInputStream.available() > 0) {
+ String packageName = dataInputStream.readUTF();
+ consumer.accept(packageName);
+ }
+ }
+ }
+
+ /**
+ * Deletes the journal from the filesystem.
+ *
+ * @return {@code true} if successfully deleted journal.
+ */
+ public boolean delete() {
+ return mFile.delete();
+ }
+
+ @Override
+ public boolean equals(@Nullable Object object) {
+ if (object instanceof DataChangedJournal) {
+ DataChangedJournal that = (DataChangedJournal) object;
+ try {
+ return this.mFile.getCanonicalPath().equals(that.mFile.getCanonicalPath());
+ } catch (IOException exception) {
+ return false;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return mFile.toString();
+ }
+
+ /**
+ * Consumer for iterating over package names in the journal.
+ */
+ @FunctionalInterface
+ public interface Consumer {
+ void accept(String packageName);
+ }
+
+ /**
+ * Creates a new journal with a random file name in the given journal directory.
+ *
+ * @param journalDirectory The directory where journals are kept.
+ * @return The journal.
+ * @throws IOException if there is an IO error creating the file.
+ */
+ static DataChangedJournal newJournal(File journalDirectory) throws IOException {
+ return new DataChangedJournal(
+ File.createTempFile(FILE_NAME_PREFIX, null, journalDirectory));
+ }
+
+ /**
+ * Returns a list of journals in the given journal directory.
+ */
+ static ArrayList<DataChangedJournal> listJournals(File journalDirectory) {
+ ArrayList<DataChangedJournal> journals = new ArrayList<>();
+ for (File file : journalDirectory.listFiles()) {
+ journals.add(new DataChangedJournal(file));
+ }
+ return journals;
+ }
+}
diff --git a/services/backup/java/com/android/server/backup/RefactoredBackupManagerService.java b/services/backup/java/com/android/server/backup/RefactoredBackupManagerService.java
index b57c0bc..d118917 100644
--- a/services/backup/java/com/android/server/backup/RefactoredBackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/RefactoredBackupManagerService.java
@@ -17,7 +17,6 @@
package com.android.server.backup;
import static android.content.pm.ApplicationInfo.PRIVATE_FLAG_BACKUP_IN_FOREGROUND;
-
import static com.android.server.backup.internal.BackupHandler.MSG_BACKUP_OPERATION_TIMEOUT;
import static com.android.server.backup.internal.BackupHandler.MSG_FULL_CONFIRMATION_TIMEOUT;
import static com.android.server.backup.internal.BackupHandler.MSG_OP_COMPLETE;
@@ -30,10 +29,10 @@
import static com.android.server.backup.internal.BackupHandler.MSG_RUN_ADB_RESTORE;
import static com.android.server.backup.internal.BackupHandler.MSG_RUN_BACKUP;
import static com.android.server.backup.internal.BackupHandler.MSG_RUN_CLEAR;
-import static com.android.server.backup.internal.BackupHandler.MSG_RUN_INITIALIZE;
import static com.android.server.backup.internal.BackupHandler.MSG_RUN_RESTORE;
import static com.android.server.backup.internal.BackupHandler.MSG_SCHEDULE_BACKUP_PACKAGE;
+import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.AlarmManager;
import android.app.AppGlobals;
@@ -83,6 +82,7 @@
import android.os.storage.StorageManager;
import android.provider.Settings;
import android.text.TextUtils;
+import android.util.ArraySet;
import android.util.AtomicFile;
import android.util.EventLog;
import android.util.Pair;
@@ -102,6 +102,7 @@
import com.android.server.backup.internal.BackupRequest;
import com.android.server.backup.internal.ClearDataObserver;
import com.android.server.backup.internal.Operation;
+import com.android.server.backup.internal.PerformInitializeTask;
import com.android.server.backup.internal.ProvisionedObserver;
import com.android.server.backup.internal.RunBackupReceiver;
import com.android.server.backup.internal.RunInitializeReceiver;
@@ -117,13 +118,12 @@
import com.android.server.backup.utils.AppBackupUtils;
import com.android.server.backup.utils.BackupManagerMonitorUtils;
import com.android.server.backup.utils.BackupObserverUtils;
-import com.android.server.backup.utils.PasswordUtils;
+import com.android.server.backup.utils.SparseArrayUtils;
import com.android.server.power.BatterySaverPolicy.ServiceType;
-import libcore.io.IoUtils;
+import com.google.android.collect.Sets;
import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
@@ -135,13 +135,13 @@
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
-import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.RandomAccessFile;
import java.security.SecureRandom;
import java.text.SimpleDateFormat;
import java.util.ArrayDeque;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
@@ -168,10 +168,6 @@
// with U+FF00 or higher for system use).
public static final String KEY_WIDGET_STATE = "\uffed\uffedwidget";
- // Historical and current algorithm names
- public static final String PBKDF_CURRENT = "PBKDF2WithHmacSHA1";
- public static final String PBKDF_FALLBACK = "PBKDF2WithHmacSHA1And8bit";
-
// Name and current contents version of the full-backup manifest file
//
// Manifest version history:
@@ -189,7 +185,6 @@
// 5 : added support for key-value packages
public static final int BACKUP_FILE_VERSION = 5;
public static final String BACKUP_FILE_HEADER_MAGIC = "ANDROID BACKUP\n";
- private static final int BACKUP_PW_FILE_VERSION = 2;
public static final String BACKUP_METADATA_FILENAME = "_meta";
public static final int BACKUP_METADATA_VERSION = 1;
public static final int BACKUP_WIDGET_METADATA_TOKEN = 0x01FFED01;
@@ -282,6 +277,8 @@
private final Object mClearDataLock = new Object();
private volatile boolean mClearingData;
+ private final BackupPasswordManager mBackupPasswordManager;
+
@GuardedBy("mPendingRestores")
private boolean mIsRestoreInProgress;
@GuardedBy("mPendingRestores")
@@ -481,11 +478,11 @@
mDataDir = dataDir;
}
- public File getJournal() {
+ public DataChangedJournal getJournal() {
return mJournal;
}
- public void setJournal(File journal) {
+ public void setJournal(@Nullable DataChangedJournal journal) {
mJournal = journal;
}
@@ -517,12 +514,12 @@
mCurrentToken = currentToken;
}
- public HashSet<String> getPendingInits() {
+ public ArraySet<String> getPendingInits() {
return mPendingInits;
}
- public void setPendingInits(HashSet<String> pendingInits) {
- mPendingInits = pendingInits;
+ public void clearPendingInits() {
+ mPendingInits.clear();
}
public PerformFullTransportBackupTask getRunningFullBackupTask() {
@@ -629,20 +626,9 @@
private File mBaseStateDir;
private File mDataDir;
private File mJournalDir;
- private File mJournal;
+ @Nullable private DataChangedJournal mJournal;
- // Backup password, if any, and the file where it's saved. What is stored is not the
- // password text itself; it's the result of a PBKDF2 hash with a randomly chosen (but
- // persisted) salt. Validation is performed by running the challenge text through the
- // same PBKDF2 cycle with the persisted salt; if the resulting derived key string matches
- // the saved hash string, then the challenge text matches the originally supplied
- // password text.
private final SecureRandom mRng = new SecureRandom();
- private String mPasswordHash;
- private File mPasswordHashFile;
- private int mPasswordVersion;
- private File mPasswordVersionFile;
- private byte[] mPasswordSalt;
// Keep a log of all the apps we've ever backed up, and what the
// dataset tokens are for both the current backup dataset and
@@ -659,7 +645,7 @@
// Persistently track the need to do a full init
private static final String INIT_SENTINEL_FILE_NAME = "_need_init_";
- private HashSet<String> mPendingInits = new HashSet<>(); // transport names
+ private ArraySet<String> mPendingInits = new ArraySet<>(); // transport names
// Round-robin queue for scheduling full backup passes
private static final int SCHEDULE_FILE_VERSION = 1; // current version of the schedule file
@@ -744,52 +730,7 @@
// This dir on /cache is managed directly in init.rc
mDataDir = new File(Environment.getDownloadCacheDirectory(), "backup_stage");
- mPasswordVersion = 1; // unless we hear otherwise
- mPasswordVersionFile = new File(mBaseStateDir, "pwversion");
- if (mPasswordVersionFile.exists()) {
- FileInputStream fin = null;
- DataInputStream in = null;
- try {
- fin = new FileInputStream(mPasswordVersionFile);
- in = new DataInputStream(fin);
- mPasswordVersion = in.readInt();
- } catch (IOException e) {
- Slog.e(TAG, "Unable to read backup pw version");
- } finally {
- try {
- if (in != null) in.close();
- if (fin != null) fin.close();
- } catch (IOException e) {
- Slog.w(TAG, "Error closing pw version files");
- }
- }
- }
-
- mPasswordHashFile = new File(mBaseStateDir, "pwhash");
- if (mPasswordHashFile.exists()) {
- FileInputStream fin = null;
- DataInputStream in = null;
- try {
- fin = new FileInputStream(mPasswordHashFile);
- in = new DataInputStream(new BufferedInputStream(fin));
- // integer length of the salt array, followed by the salt,
- // then the hex pw hash string
- int saltLen = in.readInt();
- byte[] salt = new byte[saltLen];
- in.readFully(salt);
- mPasswordHash = in.readUTF();
- mPasswordSalt = salt;
- } catch (IOException e) {
- Slog.e(TAG, "Unable to read saved backup pw hash");
- } finally {
- try {
- if (in != null) in.close();
- if (fin != null) fin.close();
- } catch (IOException e) {
- Slog.w(TAG, "Unable to close streams");
- }
- }
- }
+ mBackupPasswordManager = new BackupPasswordManager(mContext, mBaseStateDir, mRng);
// Alarm receivers for scheduled backups & initialization operations
mRunBackupReceiver = new RunBackupReceiver(this);
@@ -806,11 +747,11 @@
Intent backupIntent = new Intent(RUN_BACKUP_ACTION);
backupIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
- mRunBackupIntent = PendingIntent.getBroadcast(context, MSG_RUN_BACKUP, backupIntent, 0);
+ mRunBackupIntent = PendingIntent.getBroadcast(context, 0, backupIntent, 0);
Intent initIntent = new Intent(RUN_INITIALIZE_ACTION);
backupIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
- mRunInitIntent = PendingIntent.getBroadcast(context, MSG_RUN_INITIALIZE, initIntent, 0);
+ mRunInitIntent = PendingIntent.getBroadcast(context, 0, initIntent, 0);
// Set up the backup-request journaling
mJournalDir = new File(mBaseStateDir, "pending");
@@ -858,8 +799,7 @@
// Remember our ancestral dataset
mTokenFile = new File(mBaseStateDir, "ancestral");
- try {
- RandomAccessFile tf = new RandomAccessFile(mTokenFile, "r");
+ try (RandomAccessFile tf = new RandomAccessFile(mTokenFile, "r")) {
int version = tf.readInt();
if (version == CURRENT_ANCESTRAL_RECORD_VERSION) {
mAncestralToken = tf.readLong();
@@ -874,7 +814,6 @@
}
}
}
- tf.close();
} catch (FileNotFoundException fnf) {
// Probably innocuous
Slog.v(TAG, "No ancestral data");
@@ -898,13 +837,8 @@
// If there are previous contents, parse them out then start a new
// file to continue the recordkeeping.
if (mEverStored.exists()) {
- RandomAccessFile temp = null;
- RandomAccessFile in = null;
-
- try {
- temp = new RandomAccessFile(tempProcessedFile, "rws");
- in = new RandomAccessFile(mEverStored, "r");
-
+ try (RandomAccessFile temp = new RandomAccessFile(tempProcessedFile, "rws");
+ RandomAccessFile in = new RandomAccessFile(mEverStored, "r")) {
// Loop until we hit EOF
while (true) {
String pkg = in.readUTF();
@@ -928,15 +862,6 @@
}
} catch (IOException e) {
Slog.e(TAG, "Error in processed file", e);
- } finally {
- try {
- if (temp != null) temp.close();
- } catch (IOException e) {
- }
- try {
- if (in != null) in.close();
- } catch (IOException e) {
- }
}
}
@@ -967,14 +892,9 @@
PackageManagerBackupAgent.getStorableApplications(mPackageManager);
if (mFullBackupScheduleFile.exists()) {
- FileInputStream fstream = null;
- BufferedInputStream bufStream = null;
- DataInputStream in = null;
- try {
- fstream = new FileInputStream(mFullBackupScheduleFile);
- bufStream = new BufferedInputStream(fstream);
- in = new DataInputStream(bufStream);
-
+ try (FileInputStream fstream = new FileInputStream(mFullBackupScheduleFile);
+ BufferedInputStream bufStream = new BufferedInputStream(fstream);
+ DataInputStream in = new DataInputStream(bufStream)) {
int version = in.readInt();
if (version != SCHEDULE_FILE_VERSION) {
Slog.e(TAG, "Unknown backup schedule version " + version);
@@ -1035,10 +955,6 @@
Slog.e(TAG, "Unable to read backup schedule", e);
mFullBackupScheduleFile.delete();
schedule = null;
- } finally {
- IoUtils.closeQuietly(in);
- IoUtils.closeQuietly(bufStream);
- IoUtils.closeQuietly(fstream);
}
}
@@ -1104,35 +1020,17 @@
}
private void parseLeftoverJournals() {
- for (File f : mJournalDir.listFiles()) {
- if (mJournal == null || f.compareTo(mJournal) != 0) {
- // This isn't the current journal, so it must be a leftover. Read
- // out the package names mentioned there and schedule them for
- // backup.
- DataInputStream in = null;
+ ArrayList<DataChangedJournal> journals = DataChangedJournal.listJournals(mJournalDir);
+ for (DataChangedJournal journal : journals) {
+ if (!journal.equals(mJournal)) {
try {
- Slog.i(TAG, "Found stale backup journal, scheduling");
- // Journals will tend to be on the order of a few kilobytes(around 4k), hence,
- // setting the buffer size to 8192.
- InputStream bufferedInputStream = new BufferedInputStream(
- new FileInputStream(f), 8192);
- in = new DataInputStream(bufferedInputStream);
- while (true) {
- String packageName = in.readUTF();
+ journal.forEach(packageName -> {
+ Slog.i(TAG, "Found stale backup journal, scheduling");
if (MORE_DEBUG) Slog.i(TAG, " " + packageName);
dataChangedImpl(packageName);
- }
- } catch (EOFException e) {
- // no more data; we're done
- } catch (Exception e) {
- Slog.e(TAG, "Can't read " + f, e);
- } finally {
- // close/delete the file
- try {
- if (in != null) in.close();
- } catch (IOException e) {
- }
- f.delete();
+ });
+ } catch (IOException e) {
+ Slog.e(TAG, "Can't read " + journal, e);
}
}
}
@@ -1145,128 +1043,18 @@
return array;
}
- private boolean passwordMatchesSaved(String algorithm, String candidatePw, int rounds) {
- if (mPasswordHash == null) {
- // no current password case -- require that 'currentPw' be null or empty
- if (candidatePw == null || "".equals(candidatePw)) {
- return true;
- } // else the non-empty candidate does not match the empty stored pw
- } else {
- // hash the stated current pw and compare to the stored one
- if (candidatePw != null && candidatePw.length() > 0) {
- String currentPwHash = PasswordUtils.buildPasswordHash(algorithm, candidatePw,
- mPasswordSalt,
- rounds);
- if (mPasswordHash.equalsIgnoreCase(currentPwHash)) {
- // candidate hash matches the stored hash -- the password matches
- return true;
- }
- } // else the stored pw is nonempty but the candidate is empty; no match
- }
- return false;
- }
-
@Override
public boolean setBackupPassword(String currentPw, String newPw) {
- mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP,
- "setBackupPassword");
-
- // When processing v1 passwords we may need to try two different PBKDF2 checksum regimes
- final boolean pbkdf2Fallback = (mPasswordVersion < BACKUP_PW_FILE_VERSION);
-
- // If the supplied pw doesn't hash to the the saved one, fail. The password
- // might be caught in the legacy crypto mismatch; verify that too.
- if (!passwordMatchesSaved(PBKDF_CURRENT, currentPw, PasswordUtils.PBKDF2_HASH_ROUNDS)
- && !(pbkdf2Fallback && passwordMatchesSaved(PBKDF_FALLBACK,
- currentPw, PasswordUtils.PBKDF2_HASH_ROUNDS))) {
- return false;
- }
-
- // Snap up to current on the pw file version
- mPasswordVersion = BACKUP_PW_FILE_VERSION;
- FileOutputStream pwFout = null;
- DataOutputStream pwOut = null;
- try {
- pwFout = new FileOutputStream(mPasswordVersionFile);
- pwOut = new DataOutputStream(pwFout);
- pwOut.writeInt(mPasswordVersion);
- } catch (IOException e) {
- Slog.e(TAG, "Unable to write backup pw version; password not changed");
- return false;
- } finally {
- try {
- if (pwOut != null) pwOut.close();
- if (pwFout != null) pwFout.close();
- } catch (IOException e) {
- Slog.w(TAG, "Unable to close pw version record");
- }
- }
-
- // Clearing the password is okay
- if (newPw == null || newPw.isEmpty()) {
- if (mPasswordHashFile.exists()) {
- if (!mPasswordHashFile.delete()) {
- // Unable to delete the old pw file, so fail
- Slog.e(TAG, "Unable to clear backup password");
- return false;
- }
- }
- mPasswordHash = null;
- mPasswordSalt = null;
- return true;
- }
-
- try {
- // Okay, build the hash of the new backup password
- byte[] salt = randomBytes(PasswordUtils.PBKDF2_SALT_SIZE);
- String newPwHash = PasswordUtils.buildPasswordHash(PBKDF_CURRENT, newPw, salt,
- PasswordUtils.PBKDF2_HASH_ROUNDS);
-
- OutputStream pwf = null, buffer = null;
- DataOutputStream out = null;
- try {
- pwf = new FileOutputStream(mPasswordHashFile);
- buffer = new BufferedOutputStream(pwf);
- out = new DataOutputStream(buffer);
- // integer length of the salt array, followed by the salt,
- // then the hex pw hash string
- out.writeInt(salt.length);
- out.write(salt);
- out.writeUTF(newPwHash);
- out.flush();
- mPasswordHash = newPwHash;
- mPasswordSalt = salt;
- return true;
- } finally {
- if (out != null) out.close();
- if (buffer != null) buffer.close();
- if (pwf != null) pwf.close();
- }
- } catch (IOException e) {
- Slog.e(TAG, "Unable to set backup password");
- }
- return false;
+ return mBackupPasswordManager.setBackupPassword(currentPw, newPw);
}
@Override
public boolean hasBackupPassword() {
- mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP,
- "hasBackupPassword");
-
- return mPasswordHash != null && mPasswordHash.length() > 0;
+ return mBackupPasswordManager.hasBackupPassword();
}
public boolean backupPasswordMatches(String currentPw) {
- if (hasBackupPassword()) {
- final boolean pbkdf2Fallback = (mPasswordVersion < BACKUP_PW_FILE_VERSION);
- if (!passwordMatchesSaved(PBKDF_CURRENT, currentPw, PasswordUtils.PBKDF2_HASH_ROUNDS)
- && !(pbkdf2Fallback && passwordMatchesSaved(PBKDF_FALLBACK,
- currentPw, PasswordUtils.PBKDF2_HASH_ROUNDS))) {
- if (DEBUG) Slog.w(TAG, "Backup password mismatch; aborting");
- return false;
- }
- }
- return true;
+ return mBackupPasswordManager.backupPasswordMatches(currentPw);
}
// Maintain persistent state around whether need to do an initialize operation.
@@ -1627,18 +1415,11 @@
synchronized (mEverStoredApps) {
if (!mEverStoredApps.add(packageName)) return;
- RandomAccessFile out = null;
- try {
- out = new RandomAccessFile(mEverStored, "rws");
+ try (RandomAccessFile out = new RandomAccessFile(mEverStored, "rws")) {
out.seek(out.length());
out.writeUTF(packageName);
} catch (IOException e) {
Slog.e(TAG, "Can't log backup of " + packageName + " to " + mEverStored);
- } finally {
- try {
- if (out != null) out.close();
- } catch (IOException e) {
- }
}
}
}
@@ -1653,16 +1434,13 @@
// we'll recognize on initialization time that the package no longer
// exists and fix it up then.
File tempKnownFile = new File(mBaseStateDir, "processed.new");
- RandomAccessFile known = null;
- try {
- known = new RandomAccessFile(tempKnownFile, "rws");
+ try (RandomAccessFile known = new RandomAccessFile(tempKnownFile, "rws")) {
mEverStoredApps.remove(packageName);
for (String s : mEverStoredApps) {
known.writeUTF(s);
if (MORE_DEBUG) Slog.v(TAG, " " + s);
}
known.close();
- known = null;
if (!tempKnownFile.renameTo(mEverStored)) {
throw new IOException("Can't rename " + tempKnownFile + " to " + mEverStored);
}
@@ -1675,11 +1453,6 @@
mEverStoredApps.clear();
tempKnownFile.delete();
mEverStored.delete();
- } finally {
- try {
- if (known != null) known.close();
- } catch (IOException e) {
- }
}
}
}
@@ -1688,9 +1461,7 @@
// as the set of packages with data [supposedly] available in the
// ancestral dataset.
public void writeRestoreTokens() {
- try {
- RandomAccessFile af = new RandomAccessFile(mTokenFile, "rwd");
-
+ try (RandomAccessFile af = new RandomAccessFile(mTokenFile, "rwd")) {
// First, the version number of this record, for futureproofing
af.writeInt(CURRENT_ANCESTRAL_RECORD_VERSION);
@@ -1709,7 +1480,6 @@
if (MORE_DEBUG) Slog.v(TAG, " " + pkgName);
}
}
- af.close();
} catch (IOException e) {
Slog.w(TAG, "Unable to write token file:", e);
}
@@ -1851,6 +1621,17 @@
throw new IllegalArgumentException("No packages are provided for backup");
}
+ if (!mEnabled || !mProvisioned) {
+ Slog.i(TAG, "Backup requested but e=" + mEnabled + " p=" +mProvisioned);
+ BackupObserverUtils.sendBackupFinished(observer, BackupManager.ERROR_BACKUP_NOT_ALLOWED);
+ final int logTag = mProvisioned
+ ? BackupManagerMonitor.LOG_EVENT_ID_BACKUP_DISABLED
+ : BackupManagerMonitor.LOG_EVENT_ID_DEVICE_NOT_PROVISIONED;
+ monitor = BackupManagerMonitorUtils.monitorEvent(monitor, logTag, null,
+ BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY, null);
+ return BackupManager.ERROR_BACKUP_NOT_ALLOWED;
+ }
+
IBackupTransport transport = mTransportManager.getCurrentTransportBinder();
if (transport == null) {
BackupObserverUtils.sendBackupFinished(observer, BackupManager.ERROR_TRANSPORT_ABORTED);
@@ -2477,38 +2258,22 @@
}
// a caller with full permission can ask to back up any participating app
- HashSet<String> targets = new HashSet<>();
if (PACKAGE_MANAGER_SENTINEL.equals(packageName)) {
- targets.add(PACKAGE_MANAGER_SENTINEL);
+ return Sets.newHashSet(PACKAGE_MANAGER_SENTINEL);
} else {
synchronized (mBackupParticipants) {
- int N = mBackupParticipants.size();
- for (int i = 0; i < N; i++) {
- HashSet<String> s = mBackupParticipants.valueAt(i);
- if (s != null) {
- targets.addAll(s);
- }
- }
+ return SparseArrayUtils.union(mBackupParticipants);
}
}
- return targets;
}
private void writeToJournalLocked(String str) {
- RandomAccessFile out = null;
try {
- if (mJournal == null) mJournal = File.createTempFile("journal", null, mJournalDir);
- out = new RandomAccessFile(mJournal, "rws");
- out.seek(out.length());
- out.writeUTF(str);
+ if (mJournal == null) mJournal = DataChangedJournal.newJournal(mJournalDir);
+ mJournal.addPackage(str);
} catch (IOException e) {
Slog.e(TAG, "Can't write " + str + " to backup journal", e);
mJournal = null;
- } finally {
- try {
- if (out != null) out.close();
- } catch (IOException e) {
- }
}
}
@@ -2544,6 +2309,23 @@
});
}
+ // Run an initialize operation for the given transport
+ @Override
+ public void initializeTransports(String[] transportNames, IBackupObserver observer) {
+ mContext.enforceCallingPermission(android.Manifest.permission.BACKUP, "initializeTransport");
+ if (MORE_DEBUG || true) {
+ Slog.v(TAG, "initializeTransport(): " + Arrays.asList(transportNames));
+ }
+
+ final long oldId = Binder.clearCallingIdentity();
+ try {
+ mWakelock.acquire();
+ mBackupHandler.post(new PerformInitializeTask(this, transportNames, observer));
+ } finally {
+ Binder.restoreCallingIdentity(oldId);
+ }
+ }
+
// Clear the given package's backup data from the current transport
@Override
public void clearBackupData(String transportName, String packageName) {
@@ -2566,14 +2348,7 @@
// a caller with full permission can ask to back up any participating app
// !!! TODO: allow data-clear of ANY app?
if (MORE_DEBUG) Slog.v(TAG, "Privileged caller, allowing clear of other apps");
- apps = new HashSet<>();
- int N = mBackupParticipants.size();
- for (int i = 0; i < N; i++) {
- HashSet<String> s = mBackupParticipants.valueAt(i);
- if (s != null) {
- apps.addAll(s);
- }
- }
+ apps = SparseArrayUtils.union(mBackupParticipants);
}
// Is the given app an available participant?
@@ -2949,9 +2724,7 @@
File base = new File(Environment.getDataDirectory(), "backup");
File enableFile = new File(base, BACKUP_ENABLE_FILE);
File stage = new File(base, BACKUP_ENABLE_FILE + "-stage");
- FileOutputStream fout = null;
- try {
- fout = new FileOutputStream(stage);
+ try (FileOutputStream fout = new FileOutputStream(stage)) {
fout.write(enable ? 1 : 0);
fout.close();
stage.renameTo(enableFile);
@@ -2967,8 +2740,6 @@
Settings.Secure.BACKUP_ENABLED, null, userId);
enableFile.delete();
stage.delete();
- } finally {
- IoUtils.closeQuietly(fout);
}
}
diff --git a/services/backup/java/com/android/server/backup/Trampoline.java b/services/backup/java/com/android/server/backup/Trampoline.java
index 9e7a29e..fcd929a 100644
--- a/services/backup/java/com/android/server/backup/Trampoline.java
+++ b/services/backup/java/com/android/server/backup/Trampoline.java
@@ -199,6 +199,15 @@
}
@Override
+ public void initializeTransports(String[] transportNames, IBackupObserver observer)
+ throws RemoteException {
+ BackupManagerServiceInterface svc = mService;
+ if (svc != null) {
+ svc.initializeTransports(transportNames, observer);
+ }
+ }
+
+ @Override
public void clearBackupData(String transportName, String packageName)
throws RemoteException {
BackupManagerServiceInterface svc = mService;
diff --git a/services/backup/java/com/android/server/backup/fullbackup/PerformAdbBackupTask.java b/services/backup/java/com/android/server/backup/fullbackup/PerformAdbBackupTask.java
index 007d930..804e92c 100644
--- a/services/backup/java/com/android/server/backup/fullbackup/PerformAdbBackupTask.java
+++ b/services/backup/java/com/android/server/backup/fullbackup/PerformAdbBackupTask.java
@@ -16,11 +16,11 @@
package com.android.server.backup.fullbackup;
+import static com.android.server.backup.BackupPasswordManager.PBKDF_CURRENT;
import static com.android.server.backup.RefactoredBackupManagerService.BACKUP_FILE_HEADER_MAGIC;
import static com.android.server.backup.RefactoredBackupManagerService.BACKUP_FILE_VERSION;
import static com.android.server.backup.RefactoredBackupManagerService.DEBUG;
import static com.android.server.backup.RefactoredBackupManagerService.MORE_DEBUG;
-import static com.android.server.backup.RefactoredBackupManagerService.PBKDF_CURRENT;
import static com.android.server.backup.RefactoredBackupManagerService.SHARED_BACKUP_AGENT_PACKAGE;
import static com.android.server.backup.RefactoredBackupManagerService.TAG;
diff --git a/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java b/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java
index 0f1e485..bc7c117 100644
--- a/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java
+++ b/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java
@@ -277,7 +277,7 @@
+ "; ignoring");
}
int monitoringEvent;
- if (!backupManagerService.isEnabled()) {
+ if (backupManagerService.isProvisioned()) {
monitoringEvent = BackupManagerMonitor.LOG_EVENT_ID_BACKUP_DISABLED;
} else {
monitoringEvent = BackupManagerMonitor.LOG_EVENT_ID_DEVICE_NOT_PROVISIONED;
diff --git a/services/backup/java/com/android/server/backup/internal/BackupHandler.java b/services/backup/java/com/android/server/backup/internal/BackupHandler.java
index 886d1f8..8f82300 100644
--- a/services/backup/java/com/android/server/backup/internal/BackupHandler.java
+++ b/services/backup/java/com/android/server/backup/internal/BackupHandler.java
@@ -36,6 +36,7 @@
import com.android.internal.backup.IBackupTransport;
import com.android.server.EventLogTags;
import com.android.server.backup.BackupRestoreTask;
+import com.android.server.backup.DataChangedJournal;
import com.android.server.backup.RefactoredBackupManagerService;
import com.android.server.backup.fullbackup.PerformAdbBackupTask;
import com.android.server.backup.fullbackup.PerformFullTransportBackupTask;
@@ -64,7 +65,6 @@
public static final int MSG_RUN_ADB_BACKUP = 2;
public static final int MSG_RUN_RESTORE = 3;
public static final int MSG_RUN_CLEAR = 4;
- public static final int MSG_RUN_INITIALIZE = 5;
public static final int MSG_RUN_GET_RESTORE_SETS = 6;
public static final int MSG_RESTORE_SESSION_TIMEOUT = 8;
public static final int MSG_FULL_CONFIRMATION_TIMEOUT = 9;
@@ -108,7 +108,7 @@
// snapshot the pending-backup set and work on that
ArrayList<BackupRequest> queue = new ArrayList<>();
- File oldJournal = backupManagerService.getJournal();
+ DataChangedJournal oldJournal = backupManagerService.getJournal();
synchronized (backupManagerService.getQueueLock()) {
// Do we have any work to do? Construct the work queue
// then release the synchronization lock to actually run
@@ -265,19 +265,6 @@
break;
}
- case MSG_RUN_INITIALIZE: {
- HashSet<String> queue;
-
- // Snapshot the pending-init queue and work on that
- synchronized (backupManagerService.getQueueLock()) {
- queue = new HashSet<>(backupManagerService.getPendingInits());
- backupManagerService.getPendingInits().clear();
- }
-
- (new PerformInitializeTask(backupManagerService, queue)).run();
- break;
- }
-
case MSG_RETRY_INIT: {
synchronized (backupManagerService.getQueueLock()) {
backupManagerService.recordInitPendingLocked(msg.arg1 != 0, (String) msg.obj);
diff --git a/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java b/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java
index a996e2d..5d4fcf4 100644
--- a/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java
+++ b/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java
@@ -28,6 +28,7 @@
import static com.android.server.backup.internal.BackupHandler.MSG_BACKUP_OPERATION_TIMEOUT;
import static com.android.server.backup.internal.BackupHandler.MSG_BACKUP_RESTORE_STEP;
+import android.annotation.Nullable;
import android.app.ApplicationThreadConstants;
import android.app.IBackupAgent;
import android.app.backup.BackupDataInput;
@@ -57,6 +58,7 @@
import com.android.server.AppWidgetBackupBridge;
import com.android.server.EventLogTags;
import com.android.server.backup.BackupRestoreTask;
+import com.android.server.backup.DataChangedJournal;
import com.android.server.backup.KeyValueBackupJob;
import com.android.server.backup.PackageManagerBackupAgent;
import com.android.server.backup.RefactoredBackupManagerService;
@@ -114,7 +116,7 @@
ArrayList<BackupRequest> mQueue;
ArrayList<BackupRequest> mOriginalQueue;
File mStateDir;
- File mJournal;
+ @Nullable DataChangedJournal mJournal;
BackupState mCurrentState;
List<String> mPendingFullBackups;
IBackupObserver mObserver;
@@ -142,9 +144,9 @@
public PerformBackupTask(RefactoredBackupManagerService backupManagerService,
IBackupTransport transport, String dirName,
- ArrayList<BackupRequest> queue, File journal, IBackupObserver observer,
- IBackupManagerMonitor monitor, List<String> pendingFullBackups,
- boolean userInitiated, boolean nonIncremental) {
+ ArrayList<BackupRequest> queue, @Nullable DataChangedJournal journal,
+ IBackupObserver observer, IBackupManagerMonitor monitor,
+ List<String> pendingFullBackups, boolean userInitiated, boolean nonIncremental) {
this.backupManagerService = backupManagerService;
mTransport = transport;
mOriginalQueue = queue;
diff --git a/services/backup/java/com/android/server/backup/internal/PerformInitializeTask.java b/services/backup/java/com/android/server/backup/internal/PerformInitializeTask.java
index 5a75b66..939b1ae 100644
--- a/services/backup/java/com/android/server/backup/internal/PerformInitializeTask.java
+++ b/services/backup/java/com/android/server/backup/internal/PerformInitializeTask.java
@@ -20,6 +20,8 @@
import android.app.AlarmManager;
import android.app.backup.BackupTransport;
+import android.app.backup.IBackupObserver;
+import android.os.RemoteException;
import android.os.SystemClock;
import android.util.EventLog;
import android.util.Slog;
@@ -29,20 +31,43 @@
import com.android.server.backup.RefactoredBackupManagerService;
import java.io.File;
-import java.util.HashSet;
public class PerformInitializeTask implements Runnable {
private RefactoredBackupManagerService backupManagerService;
- HashSet<String> mQueue;
+ String[] mQueue;
+ IBackupObserver mObserver;
- PerformInitializeTask(RefactoredBackupManagerService backupManagerService,
- HashSet<String> transportNames) {
+ public PerformInitializeTask(RefactoredBackupManagerService backupManagerService,
+ String[] transportNames, IBackupObserver observer) {
this.backupManagerService = backupManagerService;
mQueue = transportNames;
+ mObserver = observer;
+ }
+
+ private void notifyResult(String target, int status) {
+ try {
+ if (mObserver != null) {
+ mObserver.onResult(target, status);
+ }
+ } catch (RemoteException ignored) {
+ mObserver = null; // don't try again
+ }
+ }
+
+ private void notifyFinished(int status) {
+ try {
+ if (mObserver != null) {
+ mObserver.backupFinished(status);
+ }
+ } catch (RemoteException ignored) {
+ mObserver = null;
+ }
}
public void run() {
+ // mWakelock is *acquired* when execution begins here
+ int result = BackupTransport.TRANSPORT_OK;
try {
for (String transportName : mQueue) {
IBackupTransport transport =
@@ -74,6 +99,7 @@
synchronized (backupManagerService.getQueueLock()) {
backupManagerService.recordInitPendingLocked(false, transportName);
}
+ notifyResult(transportName, BackupTransport.TRANSPORT_OK);
} else {
// If this didn't work, requeue this one and try again
// after a suitable interval
@@ -82,6 +108,9 @@
synchronized (backupManagerService.getQueueLock()) {
backupManagerService.recordInitPendingLocked(true, transportName);
}
+ notifyResult(transportName, status);
+ result = status;
+
// do this via another alarm to make sure of the wakelock states
long delay = transport.requestBackupTime();
Slog.w(TAG, "Init failed on " + transportName + " resched in " + delay);
@@ -92,8 +121,10 @@
}
} catch (Exception e) {
Slog.e(TAG, "Unexpected error performing init", e);
+ result = BackupTransport.TRANSPORT_ERROR;
} finally {
// Done; release the wakelock
+ notifyFinished(result);
backupManagerService.getWakelock().release();
}
}
diff --git a/services/backup/java/com/android/server/backup/internal/RunInitializeReceiver.java b/services/backup/java/com/android/server/backup/internal/RunInitializeReceiver.java
index 1621a91..a6897d0 100644
--- a/services/backup/java/com/android/server/backup/internal/RunInitializeReceiver.java
+++ b/services/backup/java/com/android/server/backup/internal/RunInitializeReceiver.java
@@ -19,12 +19,10 @@
import static com.android.server.backup.RefactoredBackupManagerService.DEBUG;
import static com.android.server.backup.RefactoredBackupManagerService.RUN_INITIALIZE_ACTION;
import static com.android.server.backup.RefactoredBackupManagerService.TAG;
-import static com.android.server.backup.internal.BackupHandler.MSG_RUN_INITIALIZE;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
-import android.os.Message;
import android.util.Slog;
import com.android.server.backup.RefactoredBackupManagerService;
@@ -44,13 +42,15 @@
Slog.v(TAG, "Running a device init");
}
+ String[] pendingInits = (String[]) backupManagerService.getPendingInits().toArray();
+ backupManagerService.clearPendingInits();
+ PerformInitializeTask initTask = new PerformInitializeTask(backupManagerService,
+ pendingInits, null);
+
// Acquire the wakelock and pass it to the init thread. it will
// be released once init concludes.
backupManagerService.getWakelock().acquire();
-
- Message msg = backupManagerService.getBackupHandler().obtainMessage(
- MSG_RUN_INITIALIZE);
- backupManagerService.getBackupHandler().sendMessage(msg);
+ backupManagerService.getBackupHandler().post(initTask);
}
}
}
diff --git a/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java b/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java
index d5c62af..62ae065 100644
--- a/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java
+++ b/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java
@@ -16,6 +16,8 @@
package com.android.server.backup.restore;
+import static com.android.server.backup.BackupPasswordManager.PBKDF_CURRENT;
+import static com.android.server.backup.BackupPasswordManager.PBKDF_FALLBACK;
import static com.android.server.backup.RefactoredBackupManagerService.BACKUP_FILE_HEADER_MAGIC;
import static com.android.server.backup.RefactoredBackupManagerService.BACKUP_FILE_VERSION;
import static com.android.server.backup.RefactoredBackupManagerService.BACKUP_MANIFEST_FILENAME;
@@ -23,8 +25,6 @@
import static com.android.server.backup.RefactoredBackupManagerService.DEBUG;
import static com.android.server.backup.RefactoredBackupManagerService.MORE_DEBUG;
import static com.android.server.backup.RefactoredBackupManagerService.OP_TYPE_RESTORE_WAIT;
-import static com.android.server.backup.RefactoredBackupManagerService.PBKDF_CURRENT;
-import static com.android.server.backup.RefactoredBackupManagerService.PBKDF_FALLBACK;
import static com.android.server.backup.RefactoredBackupManagerService.SETTINGS_PACKAGE;
import static com.android.server.backup.RefactoredBackupManagerService.SHARED_BACKUP_AGENT_PACKAGE;
import static com.android.server.backup.RefactoredBackupManagerService.TAG;
@@ -610,7 +610,9 @@
// All set; now set up the IPC and launch the agent
setUpPipes();
mAgent = mBackupManagerService.bindToAgentSynchronous(mTargetApp,
- ApplicationThreadConstants.BACKUP_MODE_RESTORE_FULL);
+ FullBackup.KEY_VALUE_DATA_TOKEN.equals(info.domain)
+ ? ApplicationThreadConstants.BACKUP_MODE_INCREMENTAL
+ : ApplicationThreadConstants.BACKUP_MODE_RESTORE_FULL);
mAgentPackage = pkg;
} catch (IOException e) {
// fall through to error handling
diff --git a/services/backup/java/com/android/server/backup/utils/DataStreamCodec.java b/services/backup/java/com/android/server/backup/utils/DataStreamCodec.java
new file mode 100644
index 0000000..b1e226d
--- /dev/null
+++ b/services/backup/java/com/android/server/backup/utils/DataStreamCodec.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.backup.utils;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+/**
+ * Implements how to serialize a {@code T} to a {@link DataOutputStream} and how to deserialize a
+ * {@code T} from a {@link DataInputStream}.
+ *
+ * @param <T> Type of object to be serialized / deserialized.
+ */
+public interface DataStreamCodec<T> {
+ /**
+ * Serializes {@code t} to {@code dataOutputStream}.
+ */
+ void serialize(T t, DataOutputStream dataOutputStream) throws IOException;
+
+ /**
+ * Deserializes {@code t} from {@code dataInputStream}.
+ */
+ T deserialize(DataInputStream dataInputStream) throws IOException;
+}
+
diff --git a/services/backup/java/com/android/server/backup/utils/DataStreamFileCodec.java b/services/backup/java/com/android/server/backup/utils/DataStreamFileCodec.java
new file mode 100644
index 0000000..7753b03
--- /dev/null
+++ b/services/backup/java/com/android/server/backup/utils/DataStreamFileCodec.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.backup.utils;
+
+import java.io.BufferedOutputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+/**
+ * Provides an interface for serializing an object to a file and deserializing it back again.
+ *
+ * <p>Serialization logic is implemented as a {@link DataStreamCodec}.
+ *
+ * @param <T> The type of object to serialize / deserialize.
+ */
+public final class DataStreamFileCodec<T> {
+ private final File mFile;
+ private final DataStreamCodec<T> mCodec;
+
+ /**
+ * Constructs an instance to serialize to or deserialize from the given file, with the given
+ * serialization / deserialization strategy.
+ */
+ public DataStreamFileCodec(File file, DataStreamCodec<T> codec) {
+ mFile = file;
+ mCodec = codec;
+ }
+
+ /**
+ * Deserializes a {@code T} from the file, automatically closing input streams.
+ *
+ * @return The deserialized object.
+ * @throws IOException if an IO error occurred.
+ */
+ public T deserialize() throws IOException {
+ try (
+ FileInputStream fileInputStream = new FileInputStream(mFile);
+ DataInputStream dataInputStream = new DataInputStream(fileInputStream)
+ ) {
+ return mCodec.deserialize(dataInputStream);
+ }
+ }
+
+ /**
+ * Serializes {@code t} to the file, automatically flushing and closing output streams.
+ *
+ * @param t The object to serialize.
+ * @throws IOException if an IO error occurs.
+ */
+ public void serialize(T t) throws IOException {
+ try (
+ FileOutputStream fileOutputStream = new FileOutputStream(mFile);
+ BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
+ DataOutputStream dataOutputStream = new DataOutputStream(bufferedOutputStream)
+ ) {
+ mCodec.serialize(t, dataOutputStream);
+ dataOutputStream.flush();
+ }
+ }
+}
diff --git a/services/backup/java/com/android/server/backup/utils/PasswordUtils.java b/services/backup/java/com/android/server/backup/utils/PasswordUtils.java
index 12fc927..9c5e283 100644
--- a/services/backup/java/com/android/server/backup/utils/PasswordUtils.java
+++ b/services/backup/java/com/android/server/backup/utils/PasswordUtils.java
@@ -123,8 +123,7 @@
int rounds) {
try {
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(algorithm);
- KeySpec
- ks = new PBEKeySpec(pwArray, salt, rounds, PBKDF2_KEY_SIZE);
+ KeySpec ks = new PBEKeySpec(pwArray, salt, rounds, PBKDF2_KEY_SIZE);
return keyFactory.generateSecret(ks);
} catch (InvalidKeySpecException e) {
Slog.e(TAG, "Invalid key spec for PBKDF2!");
diff --git a/services/backup/java/com/android/server/backup/utils/SparseArrayUtils.java b/services/backup/java/com/android/server/backup/utils/SparseArrayUtils.java
new file mode 100644
index 0000000..954d714
--- /dev/null
+++ b/services/backup/java/com/android/server/backup/utils/SparseArrayUtils.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.backup.utils;
+
+import android.util.SparseArray;
+
+import java.util.HashSet;
+
+/**
+ * Helper functions for manipulating instances of {@link SparseArray}.
+ */
+public final class SparseArrayUtils {
+ // Statics only
+ private SparseArrayUtils() {}
+
+ /**
+ * Given a {@link SparseArray<HashSet>}, returns a new {@link HashSet} containing every element
+ * from every set in the array.
+ *
+ * @param sets The array of sets from which to take the union.
+ * @param <V> The type of element contained in the set.
+ * @return The complete set.
+ */
+ public static<V> HashSet<V> union(SparseArray<HashSet<V>> sets) {
+ HashSet<V> unionSet = new HashSet<>();
+ int n = sets.size();
+ for (int i = 0; i < n; i++) {
+ HashSet<V> ithSet = sets.valueAt(i);
+ if (ithSet != null) {
+ unionSet.addAll(ithSet);
+ }
+ }
+ return unionSet;
+ }
+}
diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
index f47b0d3..f2f01cf 100644
--- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
+++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
@@ -57,6 +57,7 @@
import android.provider.Settings;
import android.provider.SettingsStringUtil.ComponentNameSet;
import android.text.BidiFormatter;
+import android.util.ArraySet;
import android.util.AtomicFile;
import android.util.ExceptionUtils;
import android.util.Log;
@@ -83,6 +84,7 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
+import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.function.Function;
@@ -247,9 +249,9 @@
throws RemoteException {
checkCallerIsSystemOr(callingPackage, userId);
checkUsesFeature(callingPackage, getCallingUserId());
- return CollectionUtils.map(
+ return new ArrayList<>(CollectionUtils.map(
readAllAssociations(userId, callingPackage),
- a -> a.deviceAddress);
+ a -> a.deviceAddress));
}
//TODO also revoke notification access
@@ -495,20 +497,20 @@
new Association(userId, deviceAddress, priviledgedPackage)));
}
- private void updateAssociations(Function<List<Association>, List<Association>> update) {
+ private void updateAssociations(Function<Set<Association>, Set<Association>> update) {
updateAssociations(update, getCallingUserId());
}
- private void updateAssociations(Function<List<Association>, List<Association>> update,
+ private void updateAssociations(Function<Set<Association>, Set<Association>> update,
int userId) {
final AtomicFile file = getStorageFileForUser(userId);
synchronized (file) {
- List<Association> associations = readAllAssociations(userId);
- final List<Association> old = CollectionUtils.copyOf(associations);
+ Set<Association> associations = readAllAssociations(userId);
+ final Set<Association> old = CollectionUtils.copyOf(associations);
associations = update.apply(associations);
if (size(old) == size(associations)) return;
- List<Association> finalAssociations = associations;
+ Set<Association> finalAssociations = associations;
file.write((out) -> {
XmlSerializer xml = Xml.newSerializer();
try {
@@ -517,13 +519,12 @@
xml.startDocument(null, true);
xml.startTag(null, XML_TAG_ASSOCIATIONS);
- for (int i = 0; i < size(finalAssociations); i++) {
- Association association = finalAssociations.get(i);
+ CollectionUtils.forEach(finalAssociations, association -> {
xml.startTag(null, XML_TAG_ASSOCIATION)
- .attribute(null, XML_ATTR_PACKAGE, association.companionAppPackage)
- .attribute(null, XML_ATTR_DEVICE, association.deviceAddress)
- .endTag(null, XML_TAG_ASSOCIATION);
- }
+ .attribute(null, XML_ATTR_PACKAGE, association.companionAppPackage)
+ .attribute(null, XML_ATTR_DEVICE, association.deviceAddress)
+ .endTag(null, XML_TAG_ASSOCIATION);
+ });
xml.endTag(null, XML_TAG_ASSOCIATIONS);
xml.endDocument();
@@ -545,17 +546,17 @@
}
@Nullable
- private ArrayList<Association> readAllAssociations(int userId) {
+ private Set<Association> readAllAssociations(int userId) {
return readAllAssociations(userId, null);
}
@Nullable
- private ArrayList<Association> readAllAssociations(int userId, @Nullable String packageFilter) {
+ private Set<Association> readAllAssociations(int userId, @Nullable String packageFilter) {
final AtomicFile file = getStorageFileForUser(userId);
if (!file.getBaseFile().exists()) return null;
- ArrayList<Association> result = null;
+ ArraySet<Association> result = null;
final XmlPullParser parser = Xml.newPullParser();
synchronized (file) {
try (FileInputStream in = file.openRead()) {
@@ -627,12 +628,10 @@
public int onCommand(String cmd) {
switch (cmd) {
case "list": {
- ArrayList<Association> associations = readAllAssociations(getNextArgInt());
- for (int i = 0; i < size(associations); i++) {
- Association a = associations.get(i);
- getOutPrintWriter()
- .println(a.companionAppPackage + " " + a.deviceAddress);
- }
+ CollectionUtils.forEach(
+ readAllAssociations(getNextArgInt()),
+ a -> getOutPrintWriter()
+ .println(a.companionAppPackage + " " + a.deviceAddress));
} break;
case "associate": {
diff --git a/services/core/Android.mk b/services/core/Android.mk
index 0d01c20..c90b402 100644
--- a/services/core/Android.mk
+++ b/services/core/Android.mk
@@ -25,8 +25,8 @@
android.hidl.manager-V1.0-java
LOCAL_STATIC_JAVA_LIBRARIES := \
- tzdata_shared2 \
- tzdata_update2 \
+ time_zone_distro \
+ time_zone_distro_installer \
android.hidl.base-V1.0-java-static \
android.hardware.weaver-V1.0-java-static \
android.hardware.biometrics.fingerprint-V2.1-java-static \
@@ -46,4 +46,16 @@
-D jack.transformations.boost-locked-region-priority.request=com.android.server.am.ActivityManagerService\#boostPriorityForLockedSection,com.android.server.wm.WindowManagerService\#boostPriorityForLockedSection \
-D jack.transformations.boost-locked-region-priority.reset=com.android.server.am.ActivityManagerService\#resetPriorityAfterLockedSection,com.android.server.wm.WindowManagerService\#resetPriorityAfterLockedSection
+LOCAL_JAR_PROCESSOR := lockedregioncodeinjection
+# Use = instead of := to delay evaluation of ${in} and ${out}
+LOCAL_JAR_PROCESSOR_ARGS = \
+ --targets \
+ "Lcom/android/server/am/ActivityManagerService;,Lcom/android/server/wm/WindowHashMap;" \
+ --pre \
+ "com/android/server/am/ActivityManagerService.boostPriorityForLockedSection,com/android/server/wm/WindowManagerService.boostPriorityForLockedSection" \
+ --post \
+ "com/android/server/am/ActivityManagerService.resetPriorityAfterLockedSection,com/android/server/wm/WindowManagerService.resetPriorityAfterLockedSection" \
+ -o ${out} \
+ -i ${in}
+
include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java
index a15992d..e860dd6 100644
--- a/services/core/java/com/android/server/AlarmManagerService.java
+++ b/services/core/java/com/android/server/AlarmManagerService.java
@@ -2893,11 +2893,10 @@
}
final class UidObserver extends IUidObserver.Stub {
- @Override public void onUidStateChanged(int uid, int procState,
- long procStateSeq) throws RemoteException {
+ @Override public void onUidStateChanged(int uid, int procState, long procStateSeq) {
}
- @Override public void onUidGone(int uid, boolean disabled) throws RemoteException {
+ @Override public void onUidGone(int uid, boolean disabled) {
if (disabled) {
synchronized (mLock) {
removeForStoppedLocked(uid);
@@ -2905,16 +2904,19 @@
}
}
- @Override public void onUidActive(int uid) throws RemoteException {
+ @Override public void onUidActive(int uid) {
}
- @Override public void onUidIdle(int uid, boolean disabled) throws RemoteException {
+ @Override public void onUidIdle(int uid, boolean disabled) {
if (disabled) {
synchronized (mLock) {
removeForStoppedLocked(uid);
}
}
}
+
+ @Override public void onUidCachedChanged(int uid, boolean cached) {
+ }
};
private final BroadcastStats getStatsLocked(PendingIntent pi) {
diff --git a/services/core/java/com/android/server/AppOpsService.java b/services/core/java/com/android/server/AppOpsService.java
index c8e6e2e..29f8a11 100644
--- a/services/core/java/com/android/server/AppOpsService.java
+++ b/services/core/java/com/android/server/AppOpsService.java
@@ -16,6 +16,57 @@
package com.android.server;
+import android.Manifest;
+import android.app.ActivityManager;
+import android.app.ActivityThread;
+import android.app.AppGlobals;
+import android.app.AppOpsManager;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.IPackageManager;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManagerInternal;
+import android.content.pm.UserInfo;
+import android.media.AudioAttributes;
+import android.os.AsyncTask;
+import android.os.Binder;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Process;
+import android.os.RemoteException;
+import android.os.ResultReceiver;
+import android.os.ServiceManager;
+import android.os.ShellCallback;
+import android.os.ShellCommand;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.os.storage.StorageManagerInternal;
+import android.util.ArrayMap;
+import android.util.ArraySet;
+import android.util.AtomicFile;
+import android.util.Log;
+import android.util.Slog;
+import android.util.SparseArray;
+import android.util.SparseIntArray;
+import android.util.TimeUtils;
+import android.util.Xml;
+
+import com.android.internal.app.IAppOpsCallback;
+import com.android.internal.app.IAppOpsService;
+import com.android.internal.os.Zygote;
+import com.android.internal.util.ArrayUtils;
+import com.android.internal.util.DumpUtils;
+import com.android.internal.util.FastXmlSerializer;
+import com.android.internal.util.Preconditions;
+import com.android.internal.util.XmlUtils;
+
+import libcore.util.EmptyArray;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+import org.xmlpull.v1.XmlSerializer;
+
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
@@ -32,54 +83,6 @@
import java.util.List;
import java.util.Map;
-import android.Manifest;
-import android.app.ActivityManager;
-import android.app.ActivityThread;
-import android.app.AppGlobals;
-import android.app.AppOpsManager;
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.IPackageManager;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManagerInternal;
-import android.media.AudioAttributes;
-import android.os.AsyncTask;
-import android.os.Binder;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Process;
-import android.os.RemoteException;
-import android.os.ResultReceiver;
-import android.os.ServiceManager;
-import android.os.ShellCallback;
-import android.os.ShellCommand;
-import android.os.UserHandle;
-import android.os.storage.StorageManagerInternal;
-import android.util.ArrayMap;
-import android.util.ArraySet;
-import android.util.AtomicFile;
-import android.util.Log;
-import android.util.Slog;
-import android.util.SparseArray;
-import android.util.SparseIntArray;
-import android.util.TimeUtils;
-import android.util.Xml;
-
-import com.android.internal.app.IAppOpsService;
-import com.android.internal.app.IAppOpsCallback;
-import com.android.internal.os.Zygote;
-import com.android.internal.util.ArrayUtils;
-import com.android.internal.util.DumpUtils;
-import com.android.internal.util.FastXmlSerializer;
-import com.android.internal.util.Preconditions;
-import com.android.internal.util.XmlUtils;
-
-import libcore.util.EmptyArray;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-import org.xmlpull.v1.XmlSerializer;
-
public class AppOpsService extends IAppOpsService.Stub {
static final String TAG = "AppOps";
static final boolean DEBUG = false;
@@ -2526,38 +2529,56 @@
perUserRestrictions = new SparseArray<>();
}
- if (perUserRestrictions != null) {
- boolean[] userRestrictions = perUserRestrictions.get(userId);
- if (userRestrictions == null && restricted) {
- userRestrictions = new boolean[AppOpsManager._NUM_OP];
- perUserRestrictions.put(userId, userRestrictions);
- }
- if (userRestrictions != null && userRestrictions[code] != restricted) {
- userRestrictions[code] = restricted;
- if (!restricted && isDefault(userRestrictions)) {
- perUserRestrictions.remove(userId);
- userRestrictions = null;
- }
- changed = true;
- }
+ int[] users;
+ if (userId == UserHandle.USER_ALL) {
+ List<UserInfo> liveUsers = UserManager.get(mContext).getUsers(false);
- if (userRestrictions != null) {
- final boolean noExcludedPackages = ArrayUtils.isEmpty(excludedPackages);
- if (perUserExcludedPackages == null && !noExcludedPackages) {
- perUserExcludedPackages = new SparseArray<>();
+ users = new int[liveUsers.size()];
+ for (int i = 0; i < liveUsers.size(); i++) {
+ users[i] = liveUsers.get(i).id;
+ }
+ } else {
+ users = new int[]{userId};
+ }
+
+ if (perUserRestrictions != null) {
+ int numUsers = users.length;
+
+ for (int i = 0; i < numUsers; i++) {
+ int thisUserId = users[i];
+
+ boolean[] userRestrictions = perUserRestrictions.get(thisUserId);
+ if (userRestrictions == null && restricted) {
+ userRestrictions = new boolean[AppOpsManager._NUM_OP];
+ perUserRestrictions.put(thisUserId, userRestrictions);
}
- if (perUserExcludedPackages != null && !Arrays.equals(excludedPackages,
- perUserExcludedPackages.get(userId))) {
- if (noExcludedPackages) {
- perUserExcludedPackages.remove(userId);
- if (perUserExcludedPackages.size() <= 0) {
- perUserExcludedPackages = null;
- }
- } else {
- perUserExcludedPackages.put(userId, excludedPackages);
+ if (userRestrictions != null && userRestrictions[code] != restricted) {
+ userRestrictions[code] = restricted;
+ if (!restricted && isDefault(userRestrictions)) {
+ perUserRestrictions.remove(thisUserId);
+ userRestrictions = null;
}
changed = true;
}
+
+ if (userRestrictions != null) {
+ final boolean noExcludedPackages = ArrayUtils.isEmpty(excludedPackages);
+ if (perUserExcludedPackages == null && !noExcludedPackages) {
+ perUserExcludedPackages = new SparseArray<>();
+ }
+ if (perUserExcludedPackages != null && !Arrays.equals(excludedPackages,
+ perUserExcludedPackages.get(thisUserId))) {
+ if (noExcludedPackages) {
+ perUserExcludedPackages.remove(thisUserId);
+ if (perUserExcludedPackages.size() <= 0) {
+ perUserExcludedPackages = null;
+ }
+ } else {
+ perUserExcludedPackages.put(thisUserId, excludedPackages);
+ }
+ changed = true;
+ }
+ }
}
}
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index c4e0e52..71c423c 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -40,7 +40,6 @@
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
-import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.database.ContentObserver;
import android.net.ConnectivityManager;
@@ -52,10 +51,10 @@
import android.net.INetworkStatsService;
import android.net.LinkProperties;
import android.net.LinkProperties.CompareResult;
+import android.net.MatchAllNetworkSpecifier;
import android.net.Network;
import android.net.NetworkAgent;
import android.net.NetworkCapabilities;
-import android.net.MatchAllNetworkSpecifier;
import android.net.NetworkConfig;
import android.net.NetworkInfo;
import android.net.NetworkInfo.DetailedState;
@@ -124,13 +123,12 @@
import com.android.internal.util.MessageUtils;
import com.android.internal.util.WakeupMessage;
import com.android.internal.util.XmlUtils;
-import com.android.server.LocalServices;
import com.android.server.am.BatteryStatsService;
import com.android.server.connectivity.DataConnectionStats;
import com.android.server.connectivity.KeepaliveTracker;
+import com.android.server.connectivity.LingerMonitor;
import com.android.server.connectivity.MockableSystemProperties;
import com.android.server.connectivity.Nat464Xlat;
-import com.android.server.connectivity.LingerMonitor;
import com.android.server.connectivity.NetworkAgentInfo;
import com.android.server.connectivity.NetworkDiagnostics;
import com.android.server.connectivity.NetworkMonitor;
@@ -139,8 +137,8 @@
import com.android.server.connectivity.PacManager;
import com.android.server.connectivity.PermissionMonitor;
import com.android.server.connectivity.Tethering;
-import com.android.server.connectivity.tethering.TetheringDependencies;
import com.android.server.connectivity.Vpn;
+import com.android.server.connectivity.tethering.TetheringDependencies;
import com.android.server.net.BaseNetworkObserver;
import com.android.server.net.LockdownVpnTracker;
import com.android.server.net.NetworkPolicyManagerInternal;
@@ -1036,8 +1034,7 @@
/**
* Apply any relevant filters to {@link NetworkState} for the given UID. For
* example, this may mark the network as {@link DetailedState#BLOCKED} based
- * on {@link #isNetworkWithLinkPropertiesBlocked}, or
- * {@link NetworkInfo#isMetered()} based on network policies.
+ * on {@link #isNetworkWithLinkPropertiesBlocked}.
*/
private void filterNetworkStateForUid(NetworkState state, int uid, boolean ignoreBlocked) {
if (state == null || state.networkInfo == null || state.linkProperties == null) return;
@@ -1048,15 +1045,6 @@
if (mLockdownTracker != null) {
mLockdownTracker.augmentNetworkInfo(state.networkInfo);
}
-
- // TODO: apply metered state closer to NetworkAgentInfo
- final long token = Binder.clearCallingIdentity();
- try {
- state.networkInfo.setMetered(mPolicyManager.isNetworkMetered(state));
- } catch (RemoteException e) {
- } finally {
- Binder.restoreCallingIdentity(token);
- }
}
/**
@@ -1326,30 +1314,24 @@
}
@Override
+ @Deprecated
public NetworkQuotaInfo getActiveNetworkQuotaInfo() {
- enforceAccessPermission();
- final int uid = Binder.getCallingUid();
- final long token = Binder.clearCallingIdentity();
- try {
- final NetworkState state = getUnfilteredActiveNetworkState(uid);
- if (state.networkInfo != null) {
- try {
- return mPolicyManager.getNetworkQuotaInfo(state);
- } catch (RemoteException e) {
- }
- }
- return null;
- } finally {
- Binder.restoreCallingIdentity(token);
- }
+ Log.w(TAG, "Shame on UID " + Binder.getCallingUid()
+ + " for calling the hidden API getNetworkQuotaInfo(). Shame!");
+ return new NetworkQuotaInfo();
}
@Override
public boolean isActiveNetworkMetered() {
enforceAccessPermission();
- final NetworkInfo info = getActiveNetworkInfo();
- return (info != null) ? info.isMetered() : false;
+ final NetworkCapabilities caps = getNetworkCapabilities(getActiveNetwork());
+ if (caps != null) {
+ return !caps.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
+ } else {
+ // Always return the most conservative value
+ return true;
+ }
}
private INetworkManagementEventObserver mDataActivityObserver = new BaseNetworkObserver() {
@@ -1510,6 +1492,12 @@
ConnectivityManager.enforceChangePermission(mContext);
}
+ private void enforceSettingsPermission() {
+ mContext.enforceCallingOrSelfPermission(
+ android.Manifest.permission.NETWORK_SETTINGS,
+ "ConnectivityService");
+ }
+
private void enforceTetherAccessPermission() {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.ACCESS_NETWORK_STATE,
@@ -2759,7 +2747,8 @@
enforceAccessPermission();
NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(network);
- if (nai != null && !nai.networkInfo.isMetered()) {
+ if (nai != null && nai.networkCapabilities
+ .hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)) {
return ConnectivityManager.MULTIPATH_PREFERENCE_UNMETERED;
}
@@ -2970,12 +2959,16 @@
return mTethering.getTetheredDhcpRanges();
}
+ @Override
+ public boolean isTetheringSupported(String callerPkg) {
+ ConnectivityManager.enforceTetherChangePermission(mContext, callerPkg);
+ return isTetheringSupported();
+ }
+
// if ro.tether.denied = true we default to no tethering
// gservices could set the secure setting to 1 though to enable it on a build where it
// had previously been turned off.
- @Override
- public boolean isTetheringSupported() {
- enforceTetherAccessPermission();
+ private boolean isTetheringSupported() {
int defaultVal = encodeBool(!mSystemProperties.get("ro.tether.denied").equals("true"));
boolean tetherSupported = toBool(Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.TETHER_SUPPORTED, defaultVal));
@@ -3636,6 +3629,21 @@
}
@Override
+ public boolean isAlwaysOnVpnPackageSupported(int userId, String packageName) {
+ enforceSettingsPermission();
+ enforceCrossUserPermission(userId);
+
+ synchronized (mVpns) {
+ Vpn vpn = mVpns.get(userId);
+ if (vpn == null) {
+ Slog.w(TAG, "User " + userId + " has no Vpn configuration");
+ return false;
+ }
+ return vpn.isAlwaysOnPackageSupported(packageName);
+ }
+ }
+
+ @Override
public boolean setAlwaysOnVpnPackage(int userId, String packageName, boolean lockdown) {
enforceConnectivityInternalPermission();
enforceCrossUserPermission(userId);
@@ -3784,6 +3792,9 @@
public void setProvisioningNotificationVisible(boolean visible, int networkType,
String action) {
enforceConnectivityInternalPermission();
+ if (!ConnectivityManager.isNetworkTypeValid(networkType)) {
+ return;
+ }
final long ident = Binder.clearCallingIdentity();
try {
// Concatenate the range of types onto the range of NetIDs.
@@ -4942,12 +4953,12 @@
if (!newNetwork.networkCapabilities.equalRequestableCapabilities(nc)) {
Slog.wtf(TAG, String.format(
"BUG: %s changed requestable capabilities during rematch: %s -> %s",
- nc, newNetwork.networkCapabilities));
+ newNetwork.name(), nc, newNetwork.networkCapabilities));
}
if (newNetwork.getCurrentScore() != score) {
Slog.wtf(TAG, String.format(
"BUG: %s changed score during rematch: %d -> %d",
- score, newNetwork.getCurrentScore()));
+ newNetwork.name(), score, newNetwork.getCurrentScore()));
}
// Second pass: process all listens.
@@ -5390,6 +5401,7 @@
@Override
public String getCaptivePortalServerUrl() {
+ enforceConnectivityInternalPermission();
return NetworkMonitor.getCaptivePortalServerHttpUrl(mContext);
}
diff --git a/services/core/java/com/android/server/EventLogTags.logtags b/services/core/java/com/android/server/EventLogTags.logtags
index 68f8c1b..b516a91 100644
--- a/services/core/java/com/android/server/EventLogTags.logtags
+++ b/services/core/java/com/android/server/EventLogTags.logtags
@@ -268,3 +268,16 @@
# GestureLauncherService.java
# ---------------------------
40100 camera_gesture_triggered (gesture_on_time|2|3), (sensor1_on_time|2|3), (sensor2_on_time|2|3), (event_extra|1|1)
+
+# ---------------------------
+# timezone/RulesManagerService.java
+# ---------------------------
+51600 timezone_trigger_check (token|3)
+51610 timezone_request_install (token|3)
+51611 timezone_install_started (token|3)
+51612 timezone_install_complete (token|3), (result|1)
+51620 timezone_request_uninstall (token|3)
+51621 timezone_uninstall_started (token|3)
+51622 timezone_uninstall_complete (token|3), (result|1)
+51630 timezone_request_nothing (token|3)
+51631 timezone_nothing_complete (token|3)
diff --git a/services/core/java/com/android/server/InputMethodManagerService.java b/services/core/java/com/android/server/InputMethodManagerService.java
index bff39b3..ce062aa 100644
--- a/services/core/java/com/android/server/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/InputMethodManagerService.java
@@ -50,6 +50,7 @@
import org.xmlpull.v1.XmlSerializer;
import android.annotation.BinderThread;
+import android.annotation.ColorInt;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -231,6 +232,13 @@
int WIRED_AFFORDANCE = 1;
}
+ /**
+ * A protected broadcast intent action for internal use for {@link PendingIntent} in
+ * the notification.
+ */
+ private static final String ACTION_SHOW_INPUT_METHOD_PICKER =
+ "com.android.server.InputMethodManagerService.SHOW_INPUT_METHOD_PICKER";
+
final Context mContext;
final Resources mRes;
final Handler mHandler;
@@ -836,6 +844,16 @@
}
} else if (Intent.ACTION_LOCALE_CHANGED.equals(action)) {
onActionLocaleChanged();
+ } else if (ACTION_SHOW_INPUT_METHOD_PICKER.equals(action)) {
+ // ACTION_SHOW_INPUT_METHOD_PICKER action is a protected-broadcast and it is
+ // guaranteed to be send only from the system, so that there is no need for extra
+ // security check such as
+ // {@link #canShowInputMethodPickerLocked(IInputMethodClient)}.
+ mHandler.obtainMessage(
+ MSG_SHOW_IM_SUBTYPE_PICKER,
+ InputMethodManager.SHOW_IM_PICKER_MODE_INCLUDE_AUXILIARY_SUBTYPES,
+ 0 /* arg2 */)
+ .sendToTarget();
} else {
Slog.w(TAG, "Unexpected intent " + intent);
}
@@ -1285,6 +1303,8 @@
Bundle extras = new Bundle();
extras.putBoolean(Notification.EXTRA_ALLOW_DURING_SETUP, true);
+ @ColorInt final int accentColor = mContext.getColor(
+ com.android.internal.R.color.system_notification_accent_color);
mImeSwitcherNotification =
new Notification.Builder(mContext, SystemNotificationChannels.VIRTUAL_KEYBOARD)
.setSmallIcon(com.android.internal.R.drawable.ic_notification_ime_default)
@@ -1292,9 +1312,10 @@
.setOngoing(true)
.addExtras(extras)
.setCategory(Notification.CATEGORY_SYSTEM)
- .setColor(com.android.internal.R.color.system_notification_accent_color);
+ .setColor(accentColor);
- Intent intent = new Intent(Settings.ACTION_SHOW_INPUT_METHOD_PICKER);
+ Intent intent = new Intent(ACTION_SHOW_INPUT_METHOD_PICKER)
+ .setPackage(mContext.getPackageName());
mImeSwitchPendingIntent = PendingIntent.getBroadcast(mContext, 0, intent, 0);
mShowOngoingImeSwitcherForPhones = false;
@@ -1445,6 +1466,7 @@
broadcastFilter.addAction(Intent.ACTION_USER_REMOVED);
broadcastFilter.addAction(Intent.ACTION_SETTING_RESTORED);
broadcastFilter.addAction(Intent.ACTION_LOCALE_CHANGED);
+ broadcastFilter.addAction(ACTION_SHOW_INPUT_METHOD_PICKER);
mContext.registerReceiver(new ImmsBroadcastReceiver(), broadcastFilter);
buildInputMethodListLocked(true /* resetDefaultEnabledIme */);
@@ -2788,6 +2810,27 @@
return res;
}
+ private boolean canShowInputMethodPickerLocked(IInputMethodClient client) {
+ final int uid = Binder.getCallingUid();
+ if (UserHandle.getAppId(uid) == Process.SYSTEM_UID) {
+ return true;
+ } else if (mCurClient != null && client != null
+ && mCurClient.client.asBinder() == client.asBinder()) {
+ return true;
+ } else if (mCurIntent != null && InputMethodUtils.checkIfPackageBelongsToUid(
+ mAppOpsManager,
+ uid,
+ mCurIntent.getComponent().getPackageName())) {
+ return true;
+ } else if (mContext.checkCallingPermission(
+ android.Manifest.permission.WRITE_SECURE_SETTINGS)
+ == PackageManager.PERMISSION_GRANTED) {
+ return true;
+ }
+
+ return false;
+ }
+
@Override
public void showInputMethodPickerFromClient(
IInputMethodClient client, int auxiliarySubtypeMode) {
@@ -2795,10 +2838,10 @@
return;
}
synchronized (mMethodMap) {
- if (mCurClient == null || client == null
- || mCurClient.client.asBinder() != client.asBinder()) {
+ if(!canShowInputMethodPickerLocked(client)) {
Slog.w(TAG, "Ignoring showInputMethodPickerFromClient of uid "
+ Binder.getCallingUid() + ": " + client);
+ return;
}
// Always call subtype picker, because subtype picker is a superset of input method
diff --git a/services/core/java/com/android/server/IpSecService.java b/services/core/java/com/android/server/IpSecService.java
index ec275cc..ac5da93 100644
--- a/services/core/java/com/android/server/IpSecService.java
+++ b/services/core/java/com/android/server/IpSecService.java
@@ -206,7 +206,11 @@
T get(int key) {
T val = mArray.get(key);
- val.checkOwnerOrSystemAndThrow();
+ // The value should never be null unless the resource doesn't exist
+ // (since we do not allow null resources to be added).
+ if (val != null) {
+ val.checkOwnerOrSystemAndThrow();
+ }
return val;
}
@@ -343,7 +347,7 @@
public void setOwnedByTransform() {
if (mOwnedByTransform) {
// Programming error
- new IllegalStateException("Cannot own an SPI twice!");
+ throw new IllegalStateException("Cannot own an SPI twice!");
}
mOwnedByTransform = true;
@@ -402,17 +406,14 @@
private void connectNativeNetdService() {
// Avoid blocking the system server to do this
- Thread t =
- new Thread(
- new Runnable() {
- @Override
- public void run() {
- synchronized (IpSecService.this) {
- NetdService.get(NETD_FETCH_TIMEOUT);
- }
- }
- });
- t.run();
+ new Thread() {
+ @Override
+ public void run() {
+ synchronized (IpSecService.this) {
+ NetdService.get(NETD_FETCH_TIMEOUT);
+ }
+ }
+ }.start();
}
INetd getNetdInstance() throws RemoteException {
@@ -605,38 +606,33 @@
spis[direction] = mSpiRecords.get(c.getSpiResourceId(direction));
int spi = spis[direction].getSpi();
try {
- int result =
- getNetdInstance()
- .ipSecAddSecurityAssociation(
- resourceId,
- c.getMode(),
- direction,
- (c.getLocalAddress() != null)
- ? c.getLocalAddress().getHostAddress()
- : "",
- (c.getRemoteAddress() != null)
- ? c.getRemoteAddress().getHostAddress()
- : "",
- (c.getNetwork() != null)
- ? c.getNetwork().getNetworkHandle()
- : 0,
- spi,
- (auth != null) ? auth.getName() : "",
- (auth != null) ? auth.getKey() : null,
- (auth != null) ? auth.getTruncationLengthBits() : 0,
- (crypt != null) ? crypt.getName() : "",
- (crypt != null) ? crypt.getKey() : null,
- (crypt != null) ? crypt.getTruncationLengthBits() : 0,
- encapType,
- encapLocalPort,
- encapRemotePort);
- if (result != spi) {
- // TODO: cleanup the first SA if creation of second SA fails
- return new IpSecTransformResponse(
- IpSecManager.Status.SPI_UNAVAILABLE, INVALID_RESOURCE_ID);
- }
+ getNetdInstance()
+ .ipSecAddSecurityAssociation(
+ resourceId,
+ c.getMode(),
+ direction,
+ (c.getLocalAddress() != null)
+ ? c.getLocalAddress().getHostAddress()
+ : "",
+ (c.getRemoteAddress() != null)
+ ? c.getRemoteAddress().getHostAddress()
+ : "",
+ (c.getNetwork() != null)
+ ? c.getNetwork().getNetworkHandle()
+ : 0,
+ spi,
+ (auth != null) ? auth.getName() : "",
+ (auth != null) ? auth.getKey() : null,
+ (auth != null) ? auth.getTruncationLengthBits() : 0,
+ (crypt != null) ? crypt.getName() : "",
+ (crypt != null) ? crypt.getKey() : null,
+ (crypt != null) ? crypt.getTruncationLengthBits() : 0,
+ encapType,
+ encapLocalPort,
+ encapRemotePort);
} catch (ServiceSpecificException e) {
// FIXME: get the error code and throw is at an IOException from Errno Exception
+ return new IpSecTransformResponse(IpSecManager.Status.RESOURCE_UNAVAILABLE);
}
}
// Both SAs were created successfully, time to construct a record and lock it away
diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java
index a4e673d..966e553 100644
--- a/services/core/java/com/android/server/LocationManagerService.java
+++ b/services/core/java/com/android/server/LocationManagerService.java
@@ -325,58 +325,13 @@
ActivityManager.OnUidImportanceListener uidImportanceListener
= new ActivityManager.OnUidImportanceListener() {
@Override
- public void onUidImportance(int uid, int importance) {
- boolean foreground = isImportanceForeground(importance);
- HashSet<String> affectedProviders = new HashSet<>(mRecordsByProvider.size());
- synchronized (mLock) {
- for (Entry<String, ArrayList<UpdateRecord>> entry
- : mRecordsByProvider.entrySet()) {
- String provider = entry.getKey();
- for (UpdateRecord record : entry.getValue()) {
- if (record.mReceiver.mIdentity.mUid == uid
- && record.mIsForegroundUid != foreground) {
- if (D) Log.d(TAG, "request from uid " + uid + " is now "
- + (foreground ? "foreground" : "background)"));
- record.mIsForegroundUid = foreground;
-
- if (!isThrottlingExemptLocked(record.mReceiver.mIdentity)) {
- affectedProviders.add(provider);
- }
- }
- }
+ public void onUidImportance(final int uid, final int importance) {
+ mLocationHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ onUidImportanceChanged(uid, importance);
}
- for (String provider : affectedProviders) {
- applyRequirementsLocked(provider);
- }
-
- for (Entry<IGnssMeasurementsListener, Identity> entry
- : mGnssMeasurementsListeners.entrySet()) {
- if (entry.getValue().mUid == uid) {
- if (D) Log.d(TAG, "gnss measurements listener from uid " + uid
- + " is now " + (foreground ? "foreground" : "background)"));
- if (foreground || isThrottlingExemptLocked(entry.getValue())) {
- mGnssMeasurementsProvider.addListener(entry.getKey());
- } else {
- mGnssMeasurementsProvider.removeListener(entry.getKey());
- }
- }
- }
-
- for (Entry<IGnssNavigationMessageListener, Identity> entry
- : mGnssNavigationMessageListeners.entrySet()) {
- if (entry.getValue().mUid == uid) {
- if (D) Log.d(TAG, "gnss navigation message listener from uid "
- + uid + " is now "
- + (foreground ? "foreground" : "background)"));
- if (foreground || isThrottlingExemptLocked(entry.getValue())) {
- mGnssNavigationMessageProvider.addListener(entry.getKey());
- } else {
- mGnssNavigationMessageProvider.removeListener(entry.getKey());
- }
- }
- }
- }
-
+ });
}
};
mActivityManager.addOnUidImportanceListener(uidImportanceListener,
@@ -456,6 +411,59 @@
}, UserHandle.ALL, intentFilter, null, mLocationHandler);
}
+ private void onUidImportanceChanged(int uid, int importance) {
+ boolean foreground = isImportanceForeground(importance);
+ HashSet<String> affectedProviders = new HashSet<>(mRecordsByProvider.size());
+ synchronized (mLock) {
+ for (Entry<String, ArrayList<UpdateRecord>> entry
+ : mRecordsByProvider.entrySet()) {
+ String provider = entry.getKey();
+ for (UpdateRecord record : entry.getValue()) {
+ if (record.mReceiver.mIdentity.mUid == uid
+ && record.mIsForegroundUid != foreground) {
+ if (D) Log.d(TAG, "request from uid " + uid + " is now "
+ + (foreground ? "foreground" : "background)"));
+ record.mIsForegroundUid = foreground;
+
+ if (!isThrottlingExemptLocked(record.mReceiver.mIdentity)) {
+ affectedProviders.add(provider);
+ }
+ }
+ }
+ }
+ for (String provider : affectedProviders) {
+ applyRequirementsLocked(provider);
+ }
+
+ for (Entry<IGnssMeasurementsListener, Identity> entry
+ : mGnssMeasurementsListeners.entrySet()) {
+ if (entry.getValue().mUid == uid) {
+ if (D) Log.d(TAG, "gnss measurements listener from uid " + uid
+ + " is now " + (foreground ? "foreground" : "background)"));
+ if (foreground || isThrottlingExemptLocked(entry.getValue())) {
+ mGnssMeasurementsProvider.addListener(entry.getKey());
+ } else {
+ mGnssMeasurementsProvider.removeListener(entry.getKey());
+ }
+ }
+ }
+
+ for (Entry<IGnssNavigationMessageListener, Identity> entry
+ : mGnssNavigationMessageListeners.entrySet()) {
+ if (entry.getValue().mUid == uid) {
+ if (D) Log.d(TAG, "gnss navigation message listener from uid "
+ + uid + " is now "
+ + (foreground ? "foreground" : "background)"));
+ if (foreground || isThrottlingExemptLocked(entry.getValue())) {
+ mGnssNavigationMessageProvider.addListener(entry.getKey());
+ } else {
+ mGnssNavigationMessageProvider.removeListener(entry.getKey());
+ }
+ }
+ }
+ }
+ }
+
private static boolean isImportanceForeground(int importance) {
return importance <= FOREGROUND_IMPORTANCE_CUTOFF;
}
diff --git a/services/core/java/com/android/server/OWNERS b/services/core/java/com/android/server/OWNERS
new file mode 100644
index 0000000..e5fbdd21
--- /dev/null
+++ b/services/core/java/com/android/server/OWNERS
@@ -0,0 +1,9 @@
+per-file ConnectivityService.java=ek@google.com
+per-file ConnectivityService.java=hugobenichi@google.com
+per-file ConnectivityService.java=lorenzo@google.com
+per-file NetworkManagementService.java=ek@google.com
+per-file NetworkManagementService.java=hugobenichi@google.com
+per-file NetworkManagementService.java=lorenzo@google.com
+per-file NsdService.java=ek@google.com
+per-file NsdService.java=hugobenichi@google.com
+per-file NsdService.java=lorenzo@google.com
diff --git a/services/core/java/com/android/server/PersistentDataBlockService.java b/services/core/java/com/android/server/PersistentDataBlockService.java
index 1d4c3db..c32a2d1 100644
--- a/services/core/java/com/android/server/PersistentDataBlockService.java
+++ b/services/core/java/com/android/server/PersistentDataBlockService.java
@@ -380,6 +380,12 @@
}
}
+ private long doGetMaximumDataBlockSize() {
+ long actualSize = getBlockDeviceSize() - HEADER_SIZE - DIGEST_SIZE_BYTES
+ - FRP_CREDENTIAL_RESERVED_SIZE - 1;
+ return actualSize <= MAX_DATA_BLOCK_SIZE ? actualSize : MAX_DATA_BLOCK_SIZE;
+ }
+
private native long nativeGetBlockDeviceSize(String path);
private native int nativeWipe(String path);
@@ -389,7 +395,7 @@
enforceUid(Binder.getCallingUid());
// Need to ensure we don't write over the last byte
- long maxBlockSize = getMaximumDataBlockSize();
+ long maxBlockSize = doGetMaximumDataBlockSize();
if (data.length > maxBlockSize) {
// partition is ~500k so shouldn't be a problem to downcast
return (int) -maxBlockSize;
@@ -569,9 +575,8 @@
@Override
public long getMaximumDataBlockSize() {
- long actualSize = getBlockDeviceSize() - HEADER_SIZE - DIGEST_SIZE_BYTES
- - FRP_CREDENTIAL_RESERVED_SIZE - 1;
- return actualSize <= MAX_DATA_BLOCK_SIZE ? actualSize : MAX_DATA_BLOCK_SIZE;
+ enforceUid(Binder.getCallingUid());
+ return doGetMaximumDataBlockSize();
}
@Override
diff --git a/services/core/java/com/android/server/RescueParty.java b/services/core/java/com/android/server/RescueParty.java
index 3b36c3c..1924a86 100644
--- a/services/core/java/com/android/server/RescueParty.java
+++ b/services/core/java/com/android/server/RescueParty.java
@@ -55,6 +55,7 @@
private static final String PROP_RESCUE_LEVEL = "sys.rescue_level";
private static final String PROP_RESCUE_BOOT_COUNT = "sys.rescue_boot_count";
private static final String PROP_RESCUE_BOOT_START = "sys.rescue_boot_start";
+ private static final String PROP_VIRTUAL_DEVICE = "ro.hardware.virtual_device";
private static final int LEVEL_NONE = 0;
private static final int LEVEL_RESET_SETTINGS_UNTRUSTED_DEFAULTS = 1;
@@ -336,6 +337,10 @@
* a good proxy for someone doing local development work.
*/
private static boolean isUsbActive() {
+ if (SystemProperties.getBoolean(PROP_VIRTUAL_DEVICE, false)) {
+ Slog.v(TAG, "Assuming virtual device is connected over USB");
+ return true;
+ }
try {
final String state = FileUtils
.readTextFile(new File("/sys/class/android_usb/android0/state"), 128, "");
diff --git a/services/core/java/com/android/server/SamplingProfilerService.java b/services/core/java/com/android/server/SamplingProfilerService.java
deleted file mode 100644
index 5f92695..0000000
--- a/services/core/java/com/android/server/SamplingProfilerService.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server;
-
-import android.content.ContentResolver;
-import android.os.DropBoxManager;
-import android.os.FileObserver;
-import android.os.Binder;
-
-import android.util.Slog;
-import android.content.Context;
-import android.database.ContentObserver;
-import android.os.SystemProperties;
-import android.provider.Settings;
-import com.android.internal.os.SamplingProfilerIntegration;
-import com.android.internal.util.DumpUtils;
-
-import java.io.File;
-import java.io.FileDescriptor;
-import java.io.IOException;
-import java.io.PrintWriter;
-
-public class SamplingProfilerService extends Binder {
-
- private static final String TAG = "SamplingProfilerService";
- private static final boolean LOCAL_LOGV = false;
- public static final String SNAPSHOT_DIR = SamplingProfilerIntegration.SNAPSHOT_DIR;
-
- private final Context mContext;
- private FileObserver snapshotObserver;
-
- public SamplingProfilerService(Context context) {
- mContext = context;
- registerSettingObserver(context);
- startWorking(context);
- }
-
- private void startWorking(Context context) {
- if (LOCAL_LOGV) Slog.v(TAG, "starting SamplingProfilerService!");
-
- final DropBoxManager dropbox =
- (DropBoxManager) context.getSystemService(Context.DROPBOX_SERVICE);
-
- // before FileObserver is ready, there could have already been some snapshots
- // in the directory, we don't want to miss them
- File[] snapshotFiles = new File(SNAPSHOT_DIR).listFiles();
- for (int i = 0; snapshotFiles != null && i < snapshotFiles.length; i++) {
- handleSnapshotFile(snapshotFiles[i], dropbox);
- }
-
- // detect new snapshot and put it in dropbox
- // delete it afterwards no matter what happened before
- // Note: needs listening at event ATTRIB rather than CLOSE_WRITE, because we set the
- // readability of snapshot files after writing them!
- snapshotObserver = new FileObserver(SNAPSHOT_DIR, FileObserver.ATTRIB) {
- @Override
- public void onEvent(int event, String path) {
- handleSnapshotFile(new File(SNAPSHOT_DIR, path), dropbox);
- }
- };
- snapshotObserver.startWatching();
-
- if (LOCAL_LOGV) Slog.v(TAG, "SamplingProfilerService activated");
- }
-
- private void handleSnapshotFile(File file, DropBoxManager dropbox) {
- try {
- dropbox.addFile(TAG, file, 0);
- if (LOCAL_LOGV) Slog.v(TAG, file.getPath() + " added to dropbox");
- } catch (IOException e) {
- Slog.e(TAG, "Can't add " + file.getPath() + " to dropbox", e);
- } finally {
- file.delete();
- }
- }
-
- private void registerSettingObserver(Context context) {
- ContentResolver contentResolver = context.getContentResolver();
- contentResolver.registerContentObserver(
- Settings.Global.getUriFor(Settings.Global.SAMPLING_PROFILER_MS),
- false, new SamplingProfilerSettingsObserver(contentResolver));
- }
-
- @Override
- protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
- if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return;
-
- pw.println("SamplingProfilerService:");
- pw.println("Watching directory: " + SNAPSHOT_DIR);
- }
-
- private class SamplingProfilerSettingsObserver extends ContentObserver {
- private ContentResolver mContentResolver;
- public SamplingProfilerSettingsObserver(ContentResolver contentResolver) {
- super(null);
- mContentResolver = contentResolver;
- onChange(false);
- }
- @Override
- public void onChange(boolean selfChange) {
- Integer samplingProfilerMs = Settings.Global.getInt(
- mContentResolver, Settings.Global.SAMPLING_PROFILER_MS, 0);
- // setting this secure property will start or stop sampling profiler,
- // as well as adjust the the time between taking snapshots.
- SystemProperties.set("persist.sys.profiler_ms", samplingProfilerMs.toString());
- }
- }
-}
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index 383cc8b..1ca0112 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -108,6 +108,7 @@
import com.android.internal.widget.LockPatternUtils;
import com.android.server.NativeDaemonConnector.Command;
import com.android.server.NativeDaemonConnector.SensitiveArg;
+import com.android.server.pm.PackageManagerException;
import com.android.server.pm.PackageManagerService;
import com.android.server.storage.AppFuseBridge;
@@ -1078,7 +1079,8 @@
flags |= DiskInfo.FLAG_ADOPTABLE;
}
// Adoptable storage isn't currently supported on FBE devices
- if (StorageManager.isFileEncryptedNativeOnly()) {
+ if (StorageManager.isFileEncryptedNativeOnly()
+ && !SystemProperties.getBoolean(StorageManager.PROP_ADOPTABLE_FBE, false)) {
flags &= ~DiskInfo.FLAG_ADOPTABLE;
}
mDisks.put(id, new DiskInfo(id, flags));
@@ -2045,7 +2047,8 @@
}
if ((mask & StorageManager.DEBUG_FORCE_ADOPTABLE) != 0) {
- if (StorageManager.isFileEncryptedNativeOnly()) {
+ if (StorageManager.isFileEncryptedNativeOnly()
+ && !SystemProperties.getBoolean(StorageManager.PROP_ADOPTABLE_FBE, false)) {
throw new IllegalStateException(
"Adoptable storage not available on device with native FBE");
}
@@ -2121,6 +2124,17 @@
mMoveCallback = callback;
mMoveTargetUuid = volumeUuid;
+ // We need all the users unlocked to move their primary storage
+ final List<UserInfo> users = mContext.getSystemService(UserManager.class).getUsers();
+ for (UserInfo user : users) {
+ if (StorageManager.isFileEncryptedNativeOrEmulated()
+ && !isUserKeyUnlocked(user.id)) {
+ Slog.w(TAG, "Failing move due to locked user " + user.id);
+ onMoveStatusLocked(PackageManager.MOVE_FAILED_LOCKED_USER);
+ return;
+ }
+ }
+
// When moving to/from primary physical volume, we probably just nuked
// the current storage location, so we have nothing to move.
if (Objects.equals(StorageManager.UUID_PRIMARY_PHYSICAL, mPrimaryStorageUuid)
diff --git a/services/core/java/com/android/server/TextServicesManagerService.java b/services/core/java/com/android/server/TextServicesManagerService.java
index 9068745..80d39f5 100644
--- a/services/core/java/com/android/server/TextServicesManagerService.java
+++ b/services/core/java/com/android/server/TextServicesManagerService.java
@@ -49,6 +49,7 @@
import android.os.Bundle;
import android.os.IBinder;
import android.os.Process;
+import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserManager;
@@ -84,6 +85,7 @@
private final TextServicesSettings mSettings;
@NonNull
private final UserManager mUserManager;
+ private final Object mLock = new Object();
public static final class Lifecycle extends SystemService {
private TextServicesManagerService mService;
@@ -123,7 +125,7 @@
}
void systemRunning() {
- synchronized (mSpellCheckerMap) {
+ synchronized (mLock) {
if (!mSystemReady) {
mSystemReady = true;
resetInternalState(mSettings.getCurrentUserId());
@@ -132,13 +134,13 @@
}
void onSwitchUser(@UserIdInt int userId) {
- synchronized (mSpellCheckerMap) {
+ synchronized (mLock) {
resetInternalState(userId);
}
}
void onUnlockUser(@UserIdInt int userId) {
- synchronized(mSpellCheckerMap) {
+ synchronized (mLock) {
final int currentUserId = mSettings.getCurrentUserId();
if (userId != currentUserId) {
return;
@@ -189,7 +191,7 @@
// Set the current spell checker if there is one or more spell checkers
// available. In this case, "sci" is the first one in the available spell
// checkers.
- setCurrentSpellCheckerLocked(sci.getId());
+ setCurrentSpellCheckerLocked(sci);
}
}
}
@@ -214,11 +216,11 @@
if (!isChangingPackagesOfCurrentUser()) {
return;
}
- synchronized (mSpellCheckerMap) {
- buildSpellCheckerMapLocked(
- mContext, mSpellCheckerList, mSpellCheckerMap, mSettings);
+ synchronized (mLock) {
// TODO: Update for each locale
SpellCheckerInfo sci = getCurrentSpellChecker(null);
+ buildSpellCheckerMapLocked(
+ mContext, mSpellCheckerList, mSpellCheckerMap, mSettings);
// If no spell checker is enabled, just return. The user should explicitly
// enable the spell checker.
if (sci == null) return;
@@ -228,9 +230,10 @@
change == PACKAGE_PERMANENT_CHANGE || change == PACKAGE_TEMPORARY_CHANGE
// Package modified
|| isPackageModified(packageName)) {
- sci = findAvailSpellCheckerLocked(packageName);
- if (sci != null) {
- setCurrentSpellCheckerLocked(sci.getId());
+ SpellCheckerInfo availSci = findAvailSpellCheckerLocked(packageName);
+ // Set the spell checker settings if different than before
+ if (availSci != null && !availSci.getId().equals(sci.getId())) {
+ setCurrentSpellCheckerLocked(availSci);
}
}
}
@@ -439,7 +442,7 @@
}
private SpellCheckerInfo getCurrentSpellCheckerWithoutVerification() {
- synchronized (mSpellCheckerMap) {
+ synchronized (mLock) {
final String curSpellCheckerId = mSettings.getSelectedSpellChecker();
if (DBG) {
Slog.w(TAG, "getCurrentSpellChecker: " + curSpellCheckerId);
@@ -463,7 +466,7 @@
final int subtypeHashCode;
final SpellCheckerInfo sci;
final Locale systemLocale;
- synchronized (mSpellCheckerMap) {
+ synchronized (mLock) {
subtypeHashCode =
mSettings.getSelectedSpellCheckerSubtype(SpellCheckerSubtype.SUBTYPE_ID_NONE);
if (DBG) {
@@ -545,7 +548,7 @@
Slog.e(TAG, "getSpellCheckerService: Invalid input.");
return;
}
- synchronized(mSpellCheckerMap) {
+ synchronized (mLock) {
if (!mSpellCheckerMap.containsKey(sciId)) {
return;
}
@@ -577,7 +580,7 @@
if (!calledFromValidUser()) {
return false;
}
- synchronized(mSpellCheckerMap) {
+ synchronized (mLock) {
return isSpellCheckerEnabledLocked();
}
}
@@ -627,7 +630,7 @@
if (DBG) {
Slog.d(TAG, "FinishSpellCheckerService");
}
- synchronized(mSpellCheckerMap) {
+ synchronized (mLock) {
final ArrayList<SpellCheckerBindGroup> removeList = new ArrayList<>();
for (SpellCheckerBindGroup group : mSpellCheckerBindGroups.values()) {
if (group == null) continue;
@@ -641,67 +644,11 @@
}
}
- @Override
- public void setCurrentSpellChecker(String locale, String sciId) {
- if (!calledFromValidUser()) {
- return;
- }
- synchronized(mSpellCheckerMap) {
- if (mContext.checkCallingOrSelfPermission(
- android.Manifest.permission.WRITE_SECURE_SETTINGS)
- != PackageManager.PERMISSION_GRANTED) {
- throw new SecurityException(
- "Requires permission "
- + android.Manifest.permission.WRITE_SECURE_SETTINGS);
- }
- setCurrentSpellCheckerLocked(sciId);
- }
- }
-
- @Override
- public void setCurrentSpellCheckerSubtype(String locale, int hashCode) {
- if (!calledFromValidUser()) {
- return;
- }
- synchronized(mSpellCheckerMap) {
- if (mContext.checkCallingOrSelfPermission(
- android.Manifest.permission.WRITE_SECURE_SETTINGS)
- != PackageManager.PERMISSION_GRANTED) {
- throw new SecurityException(
- "Requires permission "
- + android.Manifest.permission.WRITE_SECURE_SETTINGS);
- }
- setCurrentSpellCheckerSubtypeLocked(hashCode);
- }
- }
-
- @Override
- public void setSpellCheckerEnabled(boolean enabled) {
- if (!calledFromValidUser()) {
- return;
- }
- synchronized(mSpellCheckerMap) {
- if (mContext.checkCallingOrSelfPermission(
- android.Manifest.permission.WRITE_SECURE_SETTINGS)
- != PackageManager.PERMISSION_GRANTED) {
- throw new SecurityException(
- "Requires permission "
- + android.Manifest.permission.WRITE_SECURE_SETTINGS);
- }
- setSpellCheckerEnabledLocked(enabled);
- }
- }
-
- private void setCurrentSpellCheckerLocked(String sciId) {
+ private void setCurrentSpellCheckerLocked(SpellCheckerInfo sci) {
+ final String sciId = sci.getId();
if (DBG) {
Slog.w(TAG, "setCurrentSpellChecker: " + sciId);
}
- if (TextUtils.isEmpty(sciId) || !mSpellCheckerMap.containsKey(sciId)) return;
- final SpellCheckerInfo currentSci = getCurrentSpellChecker(null);
- if (currentSci != null && currentSci.getId().equals(sciId)) {
- // Do nothing if the current spell checker is same as new spell checker.
- return;
- }
final long ident = Binder.clearCallingIdentity();
try {
mSettings.putSelectedSpellChecker(sciId);
@@ -731,18 +678,6 @@
}
}
- private void setSpellCheckerEnabledLocked(boolean enabled) {
- if (DBG) {
- Slog.w(TAG, "setSpellCheckerEnabled: " + enabled);
- }
- final long ident = Binder.clearCallingIdentity();
- try {
- mSettings.setSpellCheckerEnabled(enabled);
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- }
-
private boolean isSpellCheckerEnabledLocked() {
final long ident = Binder.clearCallingIdentity();
try {
@@ -760,7 +695,7 @@
protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return;
- synchronized(mSpellCheckerMap) {
+ synchronized (mLock) {
pw.println("Current Text Services Manager state:");
pw.println(" Spell Checkers:");
int spellCheckerIndex = 0;
@@ -797,12 +732,13 @@
pw.println(
" " + "mScLocale=" + req.mLocale + " mUid=" + req.mUserId);
}
- final int N = grp.mListeners.size();
+ final int N = grp.mListeners.getRegisteredCallbackCount();
for (int i = 0; i < N; i++) {
- final InternalDeathRecipient listener = grp.mListeners.get(i);
+ final ISpellCheckerSessionListener mScListener =
+ grp.mListeners.getRegisteredCallbackItem(i);
pw.println(" " + "Listener #" + i + ":");
- pw.println(" " + "mScListener=" + listener.mScListener);
- pw.println(" " + "mGroup=" + listener.mGroup);
+ pw.println(" " + "mScListener=" + mScListener);
+ pw.println(" " + "mGroup=" + grp);
}
}
pw.println("");
@@ -840,7 +776,7 @@
private final class SpellCheckerBindGroup {
private final String TAG = SpellCheckerBindGroup.class.getSimpleName();
private final InternalServiceConnection mInternalConnection;
- private final ArrayList<InternalDeathRecipient> mListeners = new ArrayList<>();
+ private final InternalDeathRecipients mListeners;
private boolean mUnbindCalled;
private ISpellCheckerService mSpellChecker;
private boolean mConnected;
@@ -849,6 +785,7 @@
public SpellCheckerBindGroup(InternalServiceConnection connection) {
mInternalConnection = connection;
+ mListeners = new InternalDeathRecipients(this);
}
public void onServiceConnected(ISpellCheckerService spellChecker) {
@@ -856,7 +793,7 @@
Slog.d(TAG, "onServiceConnected");
}
- synchronized(mSpellCheckerMap) {
+ synchronized (mLock) {
mSpellChecker = spellChecker;
mConnected = true;
// Dispatch pending getISpellCheckerSession requests.
@@ -865,31 +802,23 @@
}
}
+ public void onServiceDisconnected() {
+ if (DBG) {
+ Slog.d(TAG, "onServiceDisconnected");
+ }
+
+ synchronized (mLock) {
+ mSpellChecker = null;
+ mConnected = false;
+ }
+ }
+
public void removeListener(ISpellCheckerSessionListener listener) {
if (DBG) {
Slog.w(TAG, "remove listener: " + listener.hashCode());
}
- synchronized(mSpellCheckerMap) {
- final int size = mListeners.size();
- final ArrayList<InternalDeathRecipient> removeList = new ArrayList<>();
- for (int i = 0; i < size; ++i) {
- final InternalDeathRecipient tempRecipient = mListeners.get(i);
- if(tempRecipient.hasSpellCheckerListener(listener)) {
- if (DBG) {
- Slog.w(TAG, "found existing listener.");
- }
- removeList.add(tempRecipient);
- }
- }
- final int removeSize = removeList.size();
- for (int i = 0; i < removeSize; ++i) {
- if (DBG) {
- Slog.w(TAG, "Remove " + removeList.get(i));
- }
- final InternalDeathRecipient idr = removeList.get(i);
- idr.mScListener.asBinder().unlinkToDeath(idr, 0);
- mListeners.remove(idr);
- }
+ synchronized (mLock) {
+ mListeners.unregister(listener);
cleanLocked();
}
}
@@ -903,7 +832,7 @@
return;
}
// If there are no more active listeners, clean up. Only do this once.
- if (!mListeners.isEmpty()) {
+ if (mListeners.getRegisteredCallbackCount() > 0) {
return;
}
if (!mPendingSessionRequests.isEmpty()) {
@@ -926,13 +855,11 @@
public void removeAll() {
Slog.e(TAG, "Remove the spell checker bind unexpectedly.");
- synchronized(mSpellCheckerMap) {
- final int size = mListeners.size();
- for (int i = 0; i < size; ++i) {
- final InternalDeathRecipient idr = mListeners.get(i);
- idr.mScListener.asBinder().unlinkToDeath(idr, 0);
+ synchronized (mLock) {
+ final int size = mListeners.getRegisteredCallbackCount();
+ for (int i = size - 1; i >= 0; --i) {
+ mListeners.unregister(mListeners.getRegisteredCallbackItem(i));
}
- mListeners.clear();
mPendingSessionRequests.clear();
mOnGoingSessionRequests.clear();
cleanLocked();
@@ -968,17 +895,14 @@
void onSessionCreated(@Nullable final ISpellCheckerSession newSession,
@NonNull final SessionRequest request) {
- synchronized (mSpellCheckerMap) {
+ synchronized (mLock) {
if (mUnbindCalled) {
return;
}
if (mOnGoingSessionRequests.remove(request)) {
- final InternalDeathRecipient recipient =
- new InternalDeathRecipient(this, request.mScListener);
try {
request.mTsListener.onServiceConnected(newSession);
- request.mScListener.asBinder().linkToDeath(recipient, 0);
- mListeners.add(recipient);
+ mListeners.register(request.mScListener);
} catch (RemoteException e) {
// Technically this can happen if the spell checker client app is already
// dead. We can just forget about this request; the request is already
@@ -999,7 +923,7 @@
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
- synchronized(mSpellCheckerMap) {
+ synchronized (mLock) {
onServiceConnectedInnerLocked(name, service);
}
}
@@ -1018,32 +942,33 @@
@Override
public void onServiceDisconnected(ComponentName name) {
- synchronized(mSpellCheckerMap) {
- final SpellCheckerBindGroup group = mSpellCheckerBindGroups.get(mSciId);
- if (group != null && this == group.mInternalConnection) {
- mSpellCheckerBindGroups.remove(mSciId);
- }
+ synchronized (mLock) {
+ onServiceDisconnectedInnerLocked(name);
+ }
+ }
+
+ private void onServiceDisconnectedInnerLocked(ComponentName name) {
+ if (DBG) {
+ Slog.w(TAG, "onServiceDisconnected: " + name);
+ }
+ final SpellCheckerBindGroup group = mSpellCheckerBindGroups.get(mSciId);
+ if (group != null && this == group.mInternalConnection) {
+ group.onServiceDisconnected();
}
}
}
- private static final class InternalDeathRecipient implements IBinder.DeathRecipient {
- public final ISpellCheckerSessionListener mScListener;
+ private static final class InternalDeathRecipients extends
+ RemoteCallbackList<ISpellCheckerSessionListener> {
private final SpellCheckerBindGroup mGroup;
- public InternalDeathRecipient(SpellCheckerBindGroup group,
- ISpellCheckerSessionListener scListener) {
- mScListener = scListener;
+ public InternalDeathRecipients(SpellCheckerBindGroup group) {
mGroup = group;
}
- public boolean hasSpellCheckerListener(ISpellCheckerSessionListener listener) {
- return listener.asBinder().equals(mScListener.asBinder());
- }
-
@Override
- public void binderDied() {
- mGroup.removeListener(mScListener);
+ public void onCallbackDied(ISpellCheckerSessionListener listener) {
+ mGroup.removeListener(listener);
}
}
@@ -1144,10 +1069,6 @@
return Settings.Secure.getIntForUser(mResolver, key, defaultValue, mCurrentUserId);
}
- private void putBoolean(final String key, final boolean value) {
- putInt(key, value ? 1 : 0);
- }
-
private boolean getBoolean(final String key, final boolean defaultValue) {
return getInt(key, defaultValue ? 1 : 0) == 1;
}
@@ -1187,10 +1108,6 @@
putInt(Settings.Secure.SELECTED_SPELL_CHECKER_SUBTYPE, hashCode);
}
- public void setSpellCheckerEnabled(boolean enabled) {
- putBoolean(Settings.Secure.SPELL_CHECKER_ENABLED, enabled);
- }
-
@NonNull
public String getSelectedSpellChecker() {
return getString(Settings.Secure.SELECTED_SPELL_CHECKER, "");
diff --git a/services/core/java/com/android/server/Watchdog.java b/services/core/java/com/android/server/Watchdog.java
index aceedf1..6a81d32 100644
--- a/services/core/java/com/android/server/Watchdog.java
+++ b/services/core/java/com/android/server/Watchdog.java
@@ -19,6 +19,7 @@
import android.app.IActivityController;
import android.os.Binder;
import android.os.RemoteException;
+import com.android.internal.os.ZygoteConnectionConstants;
import com.android.server.am.ActivityManagerService;
import android.content.BroadcastReceiver;
@@ -57,6 +58,11 @@
// Set this to true to have the watchdog record kernel thread stacks when it fires
static final boolean RECORD_KERNEL_THREADS = true;
+ // Note 1: Do not lower this value below thirty seconds without tightening the invoke-with
+ // timeout in com.android.internal.os.ZygoteConnection, or wrapped applications
+ // can trigger the watchdog.
+ // Note 2: The debug value is already below the wait time in ZygoteConnection. Wrapped
+ // applications may not work with a debug build. CTS will fail.
static final long DEFAULT_TIMEOUT = DB ? 10*1000 : 60*1000;
static final long CHECK_INTERVAL = DEFAULT_TIMEOUT / 2;
@@ -262,6 +268,10 @@
// Initialize monitor for Binder threads.
addMonitor(new BinderThreadMonitor());
+
+ // See the notes on DEFAULT_TIMEOUT.
+ assert DB ||
+ DEFAULT_TIMEOUT > ZygoteConnectionConstants.WRAPPED_PID_TIMEOUT_MILLIS;
}
public void init(Context context, ActivityManagerService activity) {
diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java
index 1604729..c6f2fc0 100644
--- a/services/core/java/com/android/server/accounts/AccountManagerService.java
+++ b/services/core/java/com/android/server/accounts/AccountManagerService.java
@@ -162,7 +162,8 @@
@Override
public void onStopUser(int userHandle) {
- mService.onStopUser(userHandle);
+ Slog.i(TAG, "onStopUser " + userHandle);
+ mService.purgeUserData(userHandle);
}
}
@@ -314,6 +315,21 @@
injector.addLocalService(new AccountManagerInternalImpl());
+ IntentFilter userFilter = new IntentFilter();
+ userFilter.addAction(Intent.ACTION_USER_REMOVED);
+ mContext.registerReceiverAsUser(new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (Intent.ACTION_USER_REMOVED.equals(action)) {
+ int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
+ if (userId < 1) return;
+ Slog.i(TAG, "User " + userId + " removed");
+ purgeUserData(userId);
+ }
+ }
+ }, UserHandle.ALL, userFilter, null, null);
+
// Need to cancel account request notifications if the update/install can access the account
new PackageMonitor() {
@Override
@@ -1360,9 +1376,7 @@
}
}
-
- private void onStopUser(int userId) {
- Log.i(TAG, "onStopUser " + userId);
+ private void purgeUserData(int userId) {
UserAccounts accounts;
synchronized (mUsers) {
accounts = mUsers.get(userId);
@@ -4446,11 +4460,12 @@
}
private void startChooseAccountActivityWithAccounts(
- IAccountManagerResponse response, Account[] accounts) {
+ IAccountManagerResponse response, Account[] accounts, String callingPackage) {
Intent intent = new Intent(mContext, ChooseAccountActivity.class);
intent.putExtra(AccountManager.KEY_ACCOUNTS, accounts);
intent.putExtra(AccountManager.KEY_ACCOUNT_MANAGER_RESPONSE,
new AccountManagerResponse(response));
+ intent.putExtra(AccountManager.KEY_ANDROID_PACKAGE_NAME, callingPackage);
mContext.startActivityAsUser(intent, UserHandle.of(UserHandle.getCallingUserId()));
}
@@ -4461,7 +4476,7 @@
String callingPackage) {
if (needToStartChooseAccountActivity(accounts, callingPackage)) {
- startChooseAccountActivityWithAccounts(response, accounts);
+ startChooseAccountActivityWithAccounts(response, accounts, callingPackage);
return;
}
if (accounts.length == 1) {
@@ -4704,6 +4719,10 @@
protected void checkKeyIntent(
int authUid,
Intent intent) throws SecurityException {
+ intent.setFlags(intent.getFlags() & ~(Intent.FLAG_GRANT_READ_URI_PERMISSION
+ | Intent.FLAG_GRANT_WRITE_URI_PERMISSION
+ | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
+ | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION));
long bid = Binder.clearCallingIdentity();
try {
PackageManager pm = mContext.getPackageManager();
@@ -5161,6 +5180,28 @@
fout.println();
mAuthenticatorCache.dump(fd, fout, args, userAccounts.userId);
+
+ boolean isUserUnlocked;
+ synchronized (mUsers) {
+ isUserUnlocked = isLocalUnlockedUser(userAccounts.userId);
+ }
+ // Following logs are printed only when user is unlocked.
+ if (!isUserUnlocked) {
+ return;
+ }
+ fout.println();
+ synchronized (userAccounts.dbLock) {
+ Map<Account, Map<String, Integer>> allVisibilityValues =
+ userAccounts.accountsDb.findAllVisibilityValues();
+ fout.println("Account visibility:");
+ for (Account account : allVisibilityValues.keySet()) {
+ fout.println(" " + account.name);
+ Map<String, Integer> visibilities = allVisibilityValues.get(account);
+ for (Entry<String, Integer> entry : visibilities.entrySet()) {
+ fout.println(" " + entry.getKey() + ", " + entry.getValue());
+ }
+ }
+ }
}
}
@@ -5912,11 +5953,9 @@
String tokenType,
String callingPackage,
byte[] pkgSigDigest) {
- synchronized (accounts.dbLock) {
- synchronized (accounts.cacheLock) {
- return accounts.accountTokenCaches.get(
- account, tokenType, callingPackage, pkgSigDigest);
- }
+ synchronized (accounts.cacheLock) {
+ return accounts.accountTokenCaches.get(
+ account, tokenType, callingPackage, pkgSigDigest);
}
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerConstants.java b/services/core/java/com/android/server/am/ActivityManagerConstants.java
index 6c3fe91..2cd2603 100644
--- a/services/core/java/com/android/server/am/ActivityManagerConstants.java
+++ b/services/core/java/com/android/server/am/ActivityManagerConstants.java
@@ -48,9 +48,11 @@
private static final String KEY_GC_MIN_INTERVAL = "gc_min_interval";
private static final String KEY_FULL_PSS_MIN_INTERVAL = "full_pss_min_interval";
private static final String KEY_FULL_PSS_LOWERED_INTERVAL = "full_pss_lowered_interval";
- private static final String KEY_POWER_CHECK_DELAY = "power_check_delay";
- private static final String KEY_WAKE_LOCK_MIN_CHECK_DURATION = "wake_lock_min_check_duration";
- private static final String KEY_CPU_MIN_CHECK_DURATION = "cpu_min_check_duration";
+ private static final String KEY_POWER_CHECK_INTERVAL = "power_check_interval";
+ private static final String KEY_POWER_CHECK_MAX_CPU_1 = "power_check_max_cpu_1";
+ private static final String KEY_POWER_CHECK_MAX_CPU_2 = "power_check_max_cpu_2";
+ private static final String KEY_POWER_CHECK_MAX_CPU_3 = "power_check_max_cpu_3";
+ private static final String KEY_POWER_CHECK_MAX_CPU_4 = "power_check_max_cpu_4";
private static final String KEY_SERVICE_USAGE_INTERACTION_TIME
= "service_usage_interaction_time";
private static final String KEY_USAGE_STATS_INTERACTION_INTERVAL
@@ -73,11 +75,11 @@
private static final long DEFAULT_GC_MIN_INTERVAL = 60*1000;
private static final long DEFAULT_FULL_PSS_MIN_INTERVAL = 10*60*1000;
private static final long DEFAULT_FULL_PSS_LOWERED_INTERVAL = 2*60*1000;
- private static final long DEFAULT_POWER_CHECK_DELAY = (DEBUG_POWER_QUICK ? 2 : 15) * 60*1000;
- private static final long DEFAULT_WAKE_LOCK_MIN_CHECK_DURATION
- = (DEBUG_POWER_QUICK ? 1 : 5) * 60*1000;
- private static final long DEFAULT_CPU_MIN_CHECK_DURATION
- = (DEBUG_POWER_QUICK ? 1 : 5) * 60*1000;
+ private static final long DEFAULT_POWER_CHECK_INTERVAL = (DEBUG_POWER_QUICK ? 1 : 5) * 60*1000;
+ private static final int DEFAULT_POWER_CHECK_MAX_CPU_1 = 25;
+ private static final int DEFAULT_POWER_CHECK_MAX_CPU_2 = 25;
+ private static final int DEFAULT_POWER_CHECK_MAX_CPU_3 = 10;
+ private static final int DEFAULT_POWER_CHECK_MAX_CPU_4 = 2;
private static final long DEFAULT_SERVICE_USAGE_INTERACTION_TIME = 30*60*1000;
private static final long DEFAULT_USAGE_STATS_INTERACTION_INTERVAL = 24*60*60*1000L;
private static final long DEFAULT_SERVICE_RESTART_DURATION = 1*1000;
@@ -133,16 +135,26 @@
// when the request is due to the memory state being lowered.
long FULL_PSS_LOWERED_INTERVAL = DEFAULT_FULL_PSS_LOWERED_INTERVAL;
- // The rate at which we check for apps using excessive power -- 15 mins.
- long POWER_CHECK_DELAY = DEFAULT_POWER_CHECK_DELAY;
-
- // The minimum sample duration we will allow before deciding we have
- // enough data on wake locks to start killing things.
- long WAKE_LOCK_MIN_CHECK_DURATION = DEFAULT_WAKE_LOCK_MIN_CHECK_DURATION;
-
// The minimum sample duration we will allow before deciding we have
// enough data on CPU usage to start killing things.
- long CPU_MIN_CHECK_DURATION = DEFAULT_CPU_MIN_CHECK_DURATION;
+ long POWER_CHECK_INTERVAL = DEFAULT_POWER_CHECK_INTERVAL;
+
+ // The maximum CPU (as a percentage) a process is allowed to use over the first
+ // power check interval that it is cached.
+ int POWER_CHECK_MAX_CPU_1 = DEFAULT_POWER_CHECK_MAX_CPU_1;
+
+ // The maximum CPU (as a percentage) a process is allowed to use over the second
+ // power check interval that it is cached. The home app will never check for less
+ // CPU than this (it will not test against the 3 or 4 levels).
+ int POWER_CHECK_MAX_CPU_2 = DEFAULT_POWER_CHECK_MAX_CPU_2;
+
+ // The maximum CPU (as a percentage) a process is allowed to use over the third
+ // power check interval that it is cached.
+ int POWER_CHECK_MAX_CPU_3 = DEFAULT_POWER_CHECK_MAX_CPU_3;
+
+ // The maximum CPU (as a percentage) a process is allowed to use over the fourth
+ // power check interval that it is cached.
+ int POWER_CHECK_MAX_CPU_4 = DEFAULT_POWER_CHECK_MAX_CPU_4;
// This is the amount of time an app needs to be running a foreground service before
// we will consider it to be doing interaction for usage stats.
@@ -270,12 +282,16 @@
DEFAULT_FULL_PSS_MIN_INTERVAL);
FULL_PSS_LOWERED_INTERVAL = mParser.getLong(KEY_FULL_PSS_LOWERED_INTERVAL,
DEFAULT_FULL_PSS_LOWERED_INTERVAL);
- POWER_CHECK_DELAY = mParser.getLong(KEY_POWER_CHECK_DELAY,
- DEFAULT_POWER_CHECK_DELAY);
- WAKE_LOCK_MIN_CHECK_DURATION = mParser.getLong(KEY_WAKE_LOCK_MIN_CHECK_DURATION,
- DEFAULT_WAKE_LOCK_MIN_CHECK_DURATION);
- CPU_MIN_CHECK_DURATION = mParser.getLong(KEY_CPU_MIN_CHECK_DURATION,
- DEFAULT_CPU_MIN_CHECK_DURATION);
+ POWER_CHECK_INTERVAL = mParser.getLong(KEY_POWER_CHECK_INTERVAL,
+ DEFAULT_POWER_CHECK_INTERVAL);
+ POWER_CHECK_MAX_CPU_1 = mParser.getInt(KEY_POWER_CHECK_MAX_CPU_1,
+ DEFAULT_POWER_CHECK_MAX_CPU_1);
+ POWER_CHECK_MAX_CPU_2 = mParser.getInt(KEY_POWER_CHECK_MAX_CPU_2,
+ DEFAULT_POWER_CHECK_MAX_CPU_2);
+ POWER_CHECK_MAX_CPU_3 = mParser.getInt(KEY_POWER_CHECK_MAX_CPU_3,
+ DEFAULT_POWER_CHECK_MAX_CPU_3);
+ POWER_CHECK_MAX_CPU_4 = mParser.getInt(KEY_POWER_CHECK_MAX_CPU_4,
+ DEFAULT_POWER_CHECK_MAX_CPU_4);
SERVICE_USAGE_INTERACTION_TIME = mParser.getLong(KEY_SERVICE_USAGE_INTERACTION_TIME,
DEFAULT_SERVICE_USAGE_INTERACTION_TIME);
USAGE_STATS_INTERACTION_INTERVAL = mParser.getLong(KEY_USAGE_STATS_INTERACTION_INTERVAL,
@@ -335,12 +351,16 @@
pw.println(FULL_PSS_MIN_INTERVAL);
pw.print(" "); pw.print(KEY_FULL_PSS_LOWERED_INTERVAL); pw.print("=");
pw.println(FULL_PSS_LOWERED_INTERVAL);
- pw.print(" "); pw.print(KEY_POWER_CHECK_DELAY); pw.print("=");
- pw.println(POWER_CHECK_DELAY);
- pw.print(" "); pw.print(KEY_WAKE_LOCK_MIN_CHECK_DURATION); pw.print("=");
- pw.println(WAKE_LOCK_MIN_CHECK_DURATION);
- pw.print(" "); pw.print(KEY_CPU_MIN_CHECK_DURATION); pw.print("=");
- pw.println(CPU_MIN_CHECK_DURATION);
+ pw.print(" "); pw.print(KEY_POWER_CHECK_INTERVAL); pw.print("=");
+ pw.println(POWER_CHECK_INTERVAL);
+ pw.print(" "); pw.print(KEY_POWER_CHECK_MAX_CPU_1); pw.print("=");
+ pw.println(POWER_CHECK_MAX_CPU_1);
+ pw.print(" "); pw.print(KEY_POWER_CHECK_MAX_CPU_2); pw.print("=");
+ pw.println(POWER_CHECK_MAX_CPU_2);
+ pw.print(" "); pw.print(KEY_POWER_CHECK_MAX_CPU_3); pw.print("=");
+ pw.println(POWER_CHECK_MAX_CPU_3);
+ pw.print(" "); pw.print(KEY_POWER_CHECK_MAX_CPU_4); pw.print("=");
+ pw.println(POWER_CHECK_MAX_CPU_4);
pw.print(" "); pw.print(KEY_SERVICE_USAGE_INTERACTION_TIME); pw.print("=");
pw.println(SERVICE_USAGE_INTERACTION_TIME);
pw.print(" "); pw.print(KEY_USAGE_STATS_INTERACTION_INTERVAL); pw.print("=");
diff --git a/services/core/java/com/android/server/am/ActivityManagerDebugConfig.java b/services/core/java/com/android/server/am/ActivityManagerDebugConfig.java
index f440100..3a9bf12 100644
--- a/services/core/java/com/android/server/am/ActivityManagerDebugConfig.java
+++ b/services/core/java/com/android/server/am/ActivityManagerDebugConfig.java
@@ -91,7 +91,6 @@
static final boolean DEBUG_URI_PERMISSION = DEBUG_ALL || false;
static final boolean DEBUG_USER_LEAVING = DEBUG_ALL || false;
static final boolean DEBUG_VISIBILITY = DEBUG_ALL || false;
- static final boolean DEBUG_VISIBLE_BEHIND = DEBUG_ALL_ACTIVITIES || false;
static final boolean DEBUG_USAGE_STATS = DEBUG_ALL || false;
static final boolean DEBUG_PERMISSIONS_REVIEW = DEBUG_ALL || false;
static final boolean DEBUG_WHITELISTS = DEBUG_ALL || false;
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 803d8f0..1281fb1 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -95,6 +95,7 @@
import static android.provider.Settings.Global.WAIT_FOR_DEBUGGER;
import static android.provider.Settings.System.FONT_SCALE;
import static android.service.voice.VoiceInteractionSession.SHOW_SOURCE_APPLICATION;
+import static android.text.format.DateUtils.DAY_IN_MILLIS;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.INVALID_DISPLAY;
import static com.android.internal.util.XmlUtils.readBooleanAttribute;
@@ -135,7 +136,6 @@
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_URI_PERMISSION;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_USAGE_STATS;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_VISIBILITY;
-import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_VISIBLE_BEHIND;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_WHITELISTS;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_BACKUP;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_BROADCAST;
@@ -164,7 +164,6 @@
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_VISIBLE_BEHIND;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
-import static com.android.server.am.ActivityStackSupervisor.ActivityContainer.FORCE_NEW_TASK_FLAGS;
import static com.android.server.am.ActivityStackSupervisor.CREATE_IF_NEEDED;
import static com.android.server.am.ActivityStackSupervisor.DEFER_RESUME;
import static com.android.server.am.ActivityStackSupervisor.MATCH_TASK_IN_STACKS_ONLY;
@@ -211,8 +210,6 @@
import android.app.BroadcastOptions;
import android.app.ContentProviderHolder;
import android.app.Dialog;
-import android.app.IActivityContainer;
-import android.app.IActivityContainerCallback;
import android.app.IActivityController;
import android.app.IActivityManager;
import android.app.IAppTask;
@@ -255,7 +252,6 @@
import android.content.IIntentSender;
import android.content.Intent;
import android.content.IntentFilter;
-import android.content.IntentSender;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.ConfigurationInfo;
@@ -415,6 +411,7 @@
import com.android.server.wm.PinnedStackWindowController;
import com.android.server.wm.WindowManagerService;
+import java.text.SimpleDateFormat;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;
@@ -508,8 +505,6 @@
static final String SYSTEM_DEBUGGABLE = "ro.debuggable";
- static final boolean IS_USER_BUILD = "user".equals(Build.TYPE);
-
// Amount of time after a call to stopAppSwitches() during which we will
// prevent further untrusted switches from happening.
static final long APP_SWITCH_DELAY_TIME = 5*1000;
@@ -1320,11 +1315,6 @@
boolean mDidAppSwitch;
/**
- * Last time (in realtime) at which we checked for power usage.
- */
- long mLastPowerCheckRealtime;
-
- /**
* Last time (in uptime) at which we checked for power usage.
*/
long mLastPowerCheckUptime;
@@ -1507,11 +1497,7 @@
boolean mControllerIsAMonkey = false;
String mProfileApp = null;
ProcessRecord mProfileProc = null;
- String mProfileFile;
- ParcelFileDescriptor mProfileFd;
- int mSamplingInterval = 0;
- boolean mAutoStopProfiler = false;
- boolean mStreamingOutput = false;
+ ProfilerInfo mProfilerInfo = null;
int mProfileType = 0;
final ProcessMap<Pair<Long, String>> mMemWatchProcesses = new ProcessMap<>();
String mMemWatchDumpProcName;
@@ -1658,7 +1644,7 @@
static final int POST_HEAVY_NOTIFICATION_MSG = 24;
static final int CANCEL_HEAVY_NOTIFICATION_MSG = 25;
static final int SHOW_STRICT_MODE_VIOLATION_UI_MSG = 26;
- static final int CHECK_EXCESSIVE_WAKE_LOCKS_MSG = 27;
+ static final int CHECK_EXCESSIVE_POWER_USE_MSG = 27;
static final int CLEAR_DNS_CACHE_MSG = 28;
static final int UPDATE_HTTP_PROXY_MSG = 29;
static final int SHOW_COMPAT_MODE_DIALOG_UI_MSG = 30;
@@ -1743,6 +1729,8 @@
final boolean mPermissionReviewRequired;
+ private static String sTheRealBuildSerial = Build.UNKNOWN;
+
/**
* Current global configuration information. Contains general settings for the entire system,
* also corresponds to the merged configuration of the default display.
@@ -2123,12 +2111,12 @@
} catch (RemoteException e) {
}
} break;
- case CHECK_EXCESSIVE_WAKE_LOCKS_MSG: {
+ case CHECK_EXCESSIVE_POWER_USE_MSG: {
synchronized (ActivityManagerService.this) {
- checkExcessivePowerUsageLocked(true);
- removeMessages(CHECK_EXCESSIVE_WAKE_LOCKS_MSG);
- Message nmsg = obtainMessage(CHECK_EXCESSIVE_WAKE_LOCKS_MSG);
- sendMessageDelayed(nmsg, mConstants.POWER_CHECK_DELAY);
+ checkExcessivePowerUsageLocked();
+ removeMessages(CHECK_EXCESSIVE_POWER_USE_MSG);
+ Message nmsg = obtainMessage(CHECK_EXCESSIVE_POWER_USE_MSG);
+ sendMessageDelayed(nmsg, mConstants.POWER_CHECK_INTERVAL);
}
} break;
case REPORT_MEM_USAGE_MSG: {
@@ -2660,6 +2648,11 @@
mService.start();
}
+ @Override
+ public void onCleanupUser(int userId) {
+ mService.mBatteryStatsService.onCleanupUser(userId);
+ }
+
public ActivityManagerService getService() {
return mService;
}
@@ -2743,7 +2736,7 @@
File dataDir = Environment.getDataDirectory();
File systemDir = new File(dataDir, "system");
systemDir.mkdirs();
- mBatteryStatsService = new BatteryStatsService(systemDir, mHandler);
+ mBatteryStatsService = new BatteryStatsService(systemContext, systemDir, mHandler);
mBatteryStatsService.getActiveStatistics().readLocked();
mBatteryStatsService.scheduleWriteToDisk();
mOnBattery = DEBUG_POWER ? true
@@ -2846,7 +2839,7 @@
removeAllProcessGroups();
mProcessCpuThread.start();
- mBatteryStatsService.publish(mContext);
+ mBatteryStatsService.publish();
mAppOpsService.publish(mContext);
Slog.d("AppOps", "AppOpsService published");
LocalServices.addService(ActivityManagerInternal.class, new LocalService());
@@ -3003,6 +2996,9 @@
}
ps.addCpuTimeLocked(st.rel_utime, st.rel_stime);
pr.curCpuTime += st.rel_utime + st.rel_stime;
+ if (pr.lastCpuTime == 0) {
+ pr.lastCpuTime = pr.curCpuTime;
+ }
} else {
BatteryStatsImpl.Uid.Proc ps = st.batteryStats;
if (ps == null || !ps.isActive()) {
@@ -4123,8 +4119,7 @@
ri.activityInfo.packageName, ri.activityInfo.name));
mActivityStarter.startActivityLocked(null, intent, null /*ephemeralIntent*/,
null, ri.activityInfo, null /*rInfo*/, null, null, null, null, 0, 0, 0,
- null, 0, 0, 0, null, false, false, null, null, null,
- "startSetupActivity");
+ null, 0, 0, 0, null, false, false, null, null, "startSetupActivity");
}
}
}
@@ -4347,8 +4342,7 @@
if (VALIDATE_UID_STATES && mUidObservers.getRegisteredCallbackCount() > 0) {
for (int j = 0; j < N; ++j) {
final UidRecord.ChangeItem item = mActiveUidChanges[j];
- if (item.change == UidRecord.CHANGE_GONE
- || item.change == UidRecord.CHANGE_GONE_IDLE) {
+ if ((item.change & UidRecord.CHANGE_GONE) != 0) {
mValidateUids.remove(item.uid);
} else {
UidRecord validateUid = mValidateUids.get(item.uid);
@@ -4356,9 +4350,9 @@
validateUid = new UidRecord(item.uid);
mValidateUids.put(item.uid, validateUid);
}
- if (item.change == UidRecord.CHANGE_IDLE) {
+ if ((item.change & UidRecord.CHANGE_IDLE) != 0) {
validateUid.idle = true;
- } else if (item.change == UidRecord.CHANGE_ACTIVE) {
+ } else if ((item.change & UidRecord.CHANGE_ACTIVE) != 0) {
validateUid.idle = false;
}
validateUid.curProcState = validateUid.setProcState = item.processState;
@@ -4383,22 +4377,37 @@
for (int j = 0; j < changesSize; j++) {
UidRecord.ChangeItem item = mActiveUidChanges[j];
final int change = item.change;
- if (change == UidRecord.CHANGE_IDLE
- || change == UidRecord.CHANGE_GONE_IDLE) {
+ if (change == UidRecord.CHANGE_PROCSTATE &&
+ (reg.which & ActivityManager.UID_OBSERVER_PROCSTATE) == 0) {
+ // No-op common case: no significant change, the observer is not
+ // interested in all proc state changes.
+ continue;
+ }
+ if ((change & UidRecord.CHANGE_IDLE) != 0) {
if ((reg.which & ActivityManager.UID_OBSERVER_IDLE) != 0) {
if (DEBUG_UID_OBSERVERS) Slog.i(TAG_UID_OBSERVERS,
"UID idle uid=" + item.uid);
observer.onUidIdle(item.uid, item.ephemeral);
}
- } else if (change == UidRecord.CHANGE_ACTIVE) {
+ } else if ((change & UidRecord.CHANGE_ACTIVE) != 0) {
if ((reg.which & ActivityManager.UID_OBSERVER_ACTIVE) != 0) {
if (DEBUG_UID_OBSERVERS) Slog.i(TAG_UID_OBSERVERS,
"UID active uid=" + item.uid);
observer.onUidActive(item.uid);
}
}
- if (change == UidRecord.CHANGE_GONE
- || change == UidRecord.CHANGE_GONE_IDLE) {
+ if ((reg.which & ActivityManager.UID_OBSERVER_CACHED) != 0) {
+ if ((change & UidRecord.CHANGE_CACHED) != 0) {
+ if (DEBUG_UID_OBSERVERS) Slog.i(TAG_UID_OBSERVERS,
+ "UID cached uid=" + item.uid);
+ observer.onUidCachedChanged(item.uid, true);
+ } else if ((change & UidRecord.CHANGE_UNCACHED) != 0) {
+ if (DEBUG_UID_OBSERVERS) Slog.i(TAG_UID_OBSERVERS,
+ "UID active uid=" + item.uid);
+ observer.onUidCachedChanged(item.uid, false);
+ }
+ }
+ if ((change & UidRecord.CHANGE_GONE) != 0) {
if ((reg.which & ActivityManager.UID_OBSERVER_GONE) != 0) {
if (DEBUG_UID_OBSERVERS) Slog.i(TAG_UID_OBSERVERS,
"UID gone uid=" + item.uid);
@@ -4448,26 +4457,6 @@
UserHandle.getCallingUserId());
}
- final int startActivity(Intent intent, ActivityStackSupervisor.ActivityContainer container) {
- enforceNotIsolatedCaller("ActivityContainer.startActivity");
- final int userId = mUserController.handleIncomingUser(Binder.getCallingPid(),
- Binder.getCallingUid(), mStackSupervisor.mCurrentUser, false,
- ActivityManagerService.ALLOW_FULL_ONLY, "ActivityContainer", null);
-
- // TODO: Switch to user app stacks here.
- String mimeType = intent.getType();
- final Uri data = intent.getData();
- if (mimeType == null && data != null && "content".equals(data.getScheme())) {
- mimeType = getProviderMimeType(data, userId);
- }
- container.checkEmbeddedAllowedInner(userId, intent, mimeType);
-
- intent.addFlags(FORCE_NEW_TASK_FLAGS);
- return mActivityStarter.startActivityMayWait(null, -1, null, intent, mimeType, null, null,
- null, null, 0, 0, null, null, null, null, false, userId, container, null,
- "startActivity");
- }
-
@Override
public final int startActivityAsUser(IApplicationThread caller, String callingPackage,
Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
@@ -4478,8 +4467,7 @@
// TODO: Switch to user app stacks here.
return mActivityStarter.startActivityMayWait(caller, -1, callingPackage, intent,
resolvedType, null, null, resultTo, resultWho, requestCode, startFlags,
- profilerInfo, null, null, bOptions, false, userId, null, null,
- "startActivityAsUser");
+ profilerInfo, null, null, bOptions, false, userId, null, "startActivityAsUser");
}
@Override
@@ -4542,7 +4530,7 @@
try {
int ret = mActivityStarter.startActivityMayWait(null, targetUid, targetPackage, intent,
resolvedType, null, null, resultTo, resultWho, requestCode, startFlags, null,
- null, null, bOptions, ignoreTargetSecurity, userId, null, null,
+ null, null, bOptions, ignoreTargetSecurity, userId, null,
"startActivityAsCaller");
return ret;
} catch (SecurityException e) {
@@ -4572,7 +4560,7 @@
// TODO: Switch to user app stacks here.
mActivityStarter.startActivityMayWait(caller, -1, callingPackage, intent, resolvedType,
null, null, resultTo, resultWho, requestCode, startFlags, profilerInfo, res, null,
- bOptions, false, userId, null, null, "startActivityAndWait");
+ bOptions, false, userId, null, "startActivityAndWait");
return res;
}
@@ -4586,7 +4574,7 @@
// TODO: Switch to user app stacks here.
int ret = mActivityStarter.startActivityMayWait(caller, -1, callingPackage, intent,
resolvedType, null, null, resultTo, resultWho, requestCode, startFlags,
- null, null, config, bOptions, false, userId, null, null, "startActivityWithConfig");
+ null, null, config, bOptions, false, userId, null, "startActivityWithConfig");
return ret;
}
@@ -4617,7 +4605,7 @@
}
}
int ret = pir.sendInner(0, fillInIntent, resolvedType, whitelistToken, null, null,
- resultTo, resultWho, requestCode, flagsMask, flagsValues, bOptions, null);
+ resultTo, resultWho, requestCode, flagsMask, flagsValues, bOptions);
return ret;
}
@@ -4643,7 +4631,7 @@
// TODO: Switch to user app stacks here.
return mActivityStarter.startActivityMayWait(null, callingUid, callingPackage, intent,
resolvedType, session, interactor, null, null, 0, startFlags, profilerInfo, null,
- null, bOptions, false, userId, null, null, "startVoiceActivity");
+ null, bOptions, false, userId, null, "startVoiceActivity");
}
@Override
@@ -4662,7 +4650,7 @@
ALLOW_FULL_ONLY, "startAssistantActivity", null);
return mActivityStarter.startActivityMayWait(null, callingUid, callingPackage, intent,
resolvedType, null, null, null, null, 0, 0, null, null, null, bOptions, false,
- userId, null, null, "startAssistantActivity");
+ userId, null, "startAssistantActivity");
}
@Override
@@ -4835,7 +4823,7 @@
null /*ephemeralIntent*/, r.resolvedType, aInfo, null /*rInfo*/, null,
null, resultTo != null ? resultTo.appToken : null, resultWho, requestCode, -1,
r.launchedFromUid, r.launchedFromPackage, -1, r.launchedFromUid, 0, options,
- false, false, null, null, null, "startNextMatchingActivity");
+ false, false, null, null, "startNextMatchingActivity");
Binder.restoreCallingIdentity(origId);
r.finishing = wasFinishing;
@@ -4867,16 +4855,15 @@
final int startActivityInPackage(int uid, String callingPackage,
Intent intent, String resolvedType, IBinder resultTo,
String resultWho, int requestCode, int startFlags, Bundle bOptions, int userId,
- IActivityContainer container, TaskRecord inTask, String reason) {
+ TaskRecord inTask, String reason) {
userId = mUserController.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
userId, false, ALLOW_FULL_ONLY, "startActivityInPackage", null);
// TODO: Switch to user app stacks here.
- int ret = mActivityStarter.startActivityMayWait(null, uid, callingPackage, intent,
+ return mActivityStarter.startActivityMayWait(null, uid, callingPackage, intent,
resolvedType, null, null, resultTo, resultWho, requestCode, startFlags,
- null, null, null, bOptions, false, userId, container, inTask, reason);
- return ret;
+ null, null, null, bOptions, false, userId, inTask, reason);
}
@Override
@@ -5473,8 +5460,8 @@
boolean useTombstonedForJavaTraces = false;
File tracesFile;
- final String tracesDir = SystemProperties.get("dalvik.vm.stack-trace-dir", "");
- if (tracesDir.isEmpty()) {
+ final String tracesDirProp = SystemProperties.get("dalvik.vm.stack-trace-dir", "");
+ if (tracesDirProp.isEmpty()) {
// When dalvik.vm.stack-trace-dir is not set, we are using the "old" trace
// dumping scheme. All traces are written to a global trace file (usually
// "/data/anr/traces.txt") so the code below must take care to unlink and recreate
@@ -5502,18 +5489,17 @@
return null;
}
} else {
+ File tracesDir = new File(tracesDirProp);
// When dalvik.vm.stack-trace-dir is set, we use the "new" trace dumping scheme.
// Each set of ANR traces is written to a separate file and dumpstate will process
// all such files and add them to a captured bug report if they're recent enough.
- //
+ maybePruneOldTraces(tracesDir);
+
// NOTE: We should consider creating the file in native code atomically once we've
// gotten rid of the old scheme of dumping and lot of the code that deals with paths
// can be removed.
- try {
- tracesFile = File.createTempFile("anr_", "", new File(tracesDir));
- FileUtils.setPermissions(tracesFile.getAbsolutePath(), 0600, -1, -1); // -rw-------
- } catch (IOException ioe) {
- Slog.w(TAG, "Unable to create ANR traces file: ", ioe);
+ tracesFile = createAnrDumpFile(tracesDir);
+ if (tracesFile == null) {
return null;
}
@@ -5525,6 +5511,53 @@
return tracesFile;
}
+ @GuardedBy("ActivityManagerService.class")
+ private static SimpleDateFormat sAnrFileDateFormat;
+
+ private static synchronized File createAnrDumpFile(File tracesDir) {
+ if (sAnrFileDateFormat == null) {
+ sAnrFileDateFormat = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss-SSS");
+ }
+
+ final String formattedDate = sAnrFileDateFormat.format(new Date());
+ final File anrFile = new File(tracesDir, "anr_" + formattedDate);
+
+ try {
+ if (anrFile.createNewFile()) {
+ FileUtils.setPermissions(anrFile.getAbsolutePath(), 0600, -1, -1); // -rw-------
+ return anrFile;
+ } else {
+ Slog.w(TAG, "Unable to create ANR dump file: createNewFile failed");
+ }
+ } catch (IOException ioe) {
+ Slog.w(TAG, "Exception creating ANR dump file:", ioe);
+ }
+
+ return null;
+ }
+
+ /**
+ * Prune all trace files that are more than a day old.
+ *
+ * NOTE: It might make sense to move this functionality to tombstoned eventually, along with a
+ * shift away from anr_XX and tombstone_XX to a more descriptive name. We do it here for now
+ * since it's the system_server that creates trace files for most ANRs.
+ */
+ private static void maybePruneOldTraces(File tracesDir) {
+ final long now = System.currentTimeMillis();
+ final File[] traceFiles = tracesDir.listFiles();
+
+ if (traceFiles != null) {
+ for (File file : traceFiles) {
+ if ((now - file.lastModified()) > DAY_IN_MILLIS) {
+ if (!file.delete()) {
+ Slog.w(TAG, "Unable to prune stale trace file: " + file);
+ }
+ }
+ }
+ }
+ }
+
/**
* Legacy code, do not use. Existing users will be deleted.
*
@@ -5709,7 +5742,7 @@
}
final void logAppTooSlow(ProcessRecord app, long startTime, String msg) {
- if (true || IS_USER_BUILD) {
+ if (true || Build.IS_USER) {
return;
}
String tracesPath = SystemProperties.get("dalvik.vm.stack-trace-file", null);
@@ -6658,7 +6691,6 @@
mActiveUids.put(proc.uid, uidRec);
EventLogTags.writeAmUidRunning(uidRec.uid);
noteUidProcessState(uidRec.uid, uidRec.curProcState);
- enqueueUidChangeLocked(uidRec, -1, UidRecord.CHANGE_ACTIVE);
}
proc.uidRecord = uidRec;
@@ -6698,10 +6730,6 @@
mHandler.removeMessages(PROC_START_TIMEOUT_MSG, app);
}
mBatteryStatsService.noteProcessFinish(app.processName, app.info.uid);
- if (app.isolated) {
- mBatteryStatsService.removeIsolatedUid(app.uid, app.info.uid);
- getPackageManagerInternalLocked().removeIsolatedUid(app.uid);
- }
boolean willRestart = false;
if (app.persistent && !app.isolated) {
if (!callerWillRestart) {
@@ -6711,6 +6739,10 @@
}
}
app.kill(reason, true);
+ if (app.isolated) {
+ mBatteryStatsService.removeIsolatedUid(app.uid, app.info.uid);
+ getPackageManagerInternalLocked().removeIsolatedUid(app.uid);
+ }
handleAppDiedLocked(app, willRestart, allowRestart);
if (willRestart) {
removeLruProcessLocked(app);
@@ -6750,14 +6782,14 @@
mHeavyWeightProcess = null;
}
mBatteryStatsService.noteProcessFinish(app.processName, app.info.uid);
- if (app.isolated) {
- mBatteryStatsService.removeIsolatedUid(app.uid, app.info.uid);
- }
// Take care of any launching providers waiting for this process.
cleanupAppInLaunchingProvidersLocked(app, true);
// Take care of any services that are waiting for the process.
mServices.processStartTimedOutLocked(app);
app.kill("start timeout", true);
+ if (app.isolated) {
+ mBatteryStatsService.removeIsolatedUid(app.uid, app.info.uid);
+ }
removeLruProcessLocked(app);
if (mBackupTarget != null && mBackupTarget.app.pid == pid) {
Slog.w(TAG, "Unattached app died before backup, skipping");
@@ -6890,19 +6922,19 @@
mWaitForDebugger = mOrigWaitForDebugger;
}
}
- String profileFile = app.instr != null ? app.instr.mProfileFile : null;
- ParcelFileDescriptor profileFd = null;
- int samplingInterval = 0;
- boolean profileAutoStop = false;
- boolean profileStreamingOutput = false;
+
+ ProfilerInfo profilerInfo = null;
+ String agent = null;
if (mProfileApp != null && mProfileApp.equals(processName)) {
mProfileProc = app;
- profileFile = mProfileFile;
- profileFd = mProfileFd;
- samplingInterval = mSamplingInterval;
- profileAutoStop = mAutoStopProfiler;
- profileStreamingOutput = mStreamingOutput;
+ profilerInfo = (mProfilerInfo != null && mProfilerInfo.profileFile != null) ?
+ new ProfilerInfo(mProfilerInfo) : null;
+ agent = profilerInfo.agent;
+ } else if (app.instr != null && app.instr.mProfileFile != null) {
+ profilerInfo = new ProfilerInfo(app.instr.mProfileFile, null, 0, false, false,
+ null);
}
+
boolean enableTrackAllocation = false;
if (mTrackAllocationApp != null && mTrackAllocationApp.equals(processName)) {
enableTrackAllocation = true;
@@ -6926,22 +6958,16 @@
+ processName + " with config " + getGlobalConfiguration());
ApplicationInfo appInfo = app.instr != null ? app.instr.mTargetInfo : app.info;
app.compat = compatibilityInfoForPackageLocked(appInfo);
- if (profileFd != null) {
- profileFd = profileFd.dup();
+
+ if (profilerInfo != null && profilerInfo.profileFd != null) {
+ profilerInfo.profileFd = profilerInfo.profileFd.dup();
}
- ProfilerInfo profilerInfo = profileFile == null ? null
- : new ProfilerInfo(profileFile, profileFd, samplingInterval, profileAutoStop,
- profileStreamingOutput);
// We deprecated Build.SERIAL and it is not accessible to
// apps that target the v2 security sandbox. Since access to
// the serial is now behind a permission we push down the value.
- String buildSerial = Build.UNKNOWN;
- if (appInfo.targetSandboxVersion != 2) {
- buildSerial = IDeviceIdentifiersPolicyService.Stub.asInterface(
- ServiceManager.getService(Context.DEVICE_IDENTIFIERS_SERVICE))
- .getSerial();
- }
+ String buildSerial = appInfo.targetSandboxVersion < 2
+ ? sTheRealBuildSerial : Build.UNKNOWN;
// Check if this is a secondary process that should be incorporated into some
// currently active instrumentation. (Note we do this AFTER all of the profiling
@@ -6971,6 +6997,12 @@
}
}
+ // If we were asked to attach an agent on startup, do so now, before we're binding
+ // application code.
+ if (agent != null) {
+ thread.attachAgent(agent);
+ }
+
checkTime(startTime, "attachApplicationLocked: immediately before bindApplication");
mStackSupervisor.mActivityMetricsLogger.notifyBindApplication(app);
if (app.instr != null) {
@@ -7106,11 +7138,7 @@
mStackSupervisor.activityIdleInternalLocked(token, false /* fromTimeout */,
false /* processPausingActivities */, config);
if (stopProfiling) {
- if ((mProfileProc == r.app) && (mProfileFd != null)) {
- try {
- mProfileFd.close();
- } catch (IOException e) {
- }
+ if ((mProfileProc == r.app) && mProfilerInfo != null) {
clearProfilerLocked();
}
}
@@ -7239,8 +7267,8 @@
if (mFactoryTest != FactoryTest.FACTORY_TEST_LOW_LEVEL) {
// Start looking for apps that are abusing wake locks.
- Message nmsg = mHandler.obtainMessage(CHECK_EXCESSIVE_WAKE_LOCKS_MSG);
- mHandler.sendMessageDelayed(nmsg, mConstants.POWER_CHECK_DELAY);
+ Message nmsg = mHandler.obtainMessage(CHECK_EXCESSIVE_POWER_USE_MSG);
+ mHandler.sendMessageDelayed(nmsg, mConstants.POWER_CHECK_INTERVAL);
// Tell anyone interested that we are done booting!
SystemProperties.set("sys.boot_completed", "1");
@@ -7384,21 +7412,6 @@
}
@Override
- public final void backgroundResourcesReleased(IBinder token) {
- final long origId = Binder.clearCallingIdentity();
- try {
- synchronized (this) {
- ActivityStack stack = ActivityRecord.getStackLocked(token);
- if (stack != null) {
- stack.backgroundResourcesReleased();
- }
- }
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- }
-
- @Override
public final void notifyLaunchTaskBehindComplete(IBinder token) {
mStackSupervisor.scheduleLaunchTaskBehindComplete(token);
}
@@ -8698,6 +8711,19 @@
return -1;
}
+ // Bail early if system is trying to hand out permissions directly; it
+ // must always grant permissions on behalf of someone explicit.
+ final int callingAppId = UserHandle.getAppId(callingUid);
+ if ((callingAppId == SYSTEM_UID) || (callingAppId == ROOT_UID)) {
+ if ("com.android.settings.files".equals(grantUri.uri.getAuthority())) {
+ // Exempted authority for cropping user photos in Settings app
+ } else {
+ Slog.w(TAG, "For security reasons, the system cannot issue a Uri permission"
+ + " grant to " + grantUri + "; use startActivityAsCaller() instead");
+ return -1;
+ }
+ }
+
final String authority = grantUri.uri.getAuthority();
final ProviderInfo pi = getProviderInfoLocked(authority, grantUri.sourceUserId,
MATCH_DEBUG_TRIAGED_MISSING);
@@ -8793,16 +8819,6 @@
// Third... does the caller itself have permission to access
// this uri?
- final int callingAppId = UserHandle.getAppId(callingUid);
- if ((callingAppId == SYSTEM_UID) || (callingAppId == ROOT_UID)) {
- if ("com.android.settings.files".equals(grantUri.uri.getAuthority())) {
- // Exempted authority for cropping user photos in Settings app
- } else {
- Slog.w(TAG, "For security reasons, the system cannot issue a Uri permission"
- + " grant to " + grantUri + "; use startActivityAsCaller() instead");
- return -1;
- }
- }
if (!checkHoldingPermissionsLocked(pm, pi, grantUri, callingUid, modeFlags)) {
// Require they hold a strong enough Uri permission
if (!checkUriPermissionLocked(grantUri, callingUid, modeFlags)) {
@@ -10437,44 +10453,25 @@
}
@Override
- public IActivityContainer createVirtualActivityContainer(IBinder parentActivityToken,
- IActivityContainerCallback callback) throws RemoteException {
- enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "createActivityContainer()");
- synchronized (this) {
- if (parentActivityToken == null) {
- throw new IllegalArgumentException("parent token must not be null");
- }
- ActivityRecord r = ActivityRecord.forTokenLocked(parentActivityToken);
- if (r == null) {
- return null;
- }
- if (callback == null) {
- throw new IllegalArgumentException("callback must not be null");
- }
- return mStackSupervisor.createVirtualActivityContainer(r, callback);
- }
- }
-
- @Override
- public IActivityContainer createStackOnDisplay(int displayId) throws RemoteException {
+ public int createStackOnDisplay(int displayId) throws RemoteException {
enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "createStackOnDisplay()");
synchronized (this) {
final int stackId = mStackSupervisor.getNextStackId();
final ActivityStack stack =
mStackSupervisor.createStackOnDisplay(stackId, displayId, true /*onTop*/);
if (stack == null) {
- return null;
+ return INVALID_STACK_ID;
}
- return stack.mActivityContainer;
+ return stack.mStackId;
}
}
@Override
public int getActivityDisplayId(IBinder activityToken) throws RemoteException {
synchronized (this) {
- ActivityStack stack = ActivityRecord.getStackLocked(activityToken);
- if (stack != null && stack.mActivityContainer.isAttachedLocked()) {
- return stack.mActivityContainer.getDisplayId();
+ final ActivityStack stack = ActivityRecord.getStackLocked(activityToken);
+ if (stack != null && stack.mDisplayId != INVALID_DISPLAY) {
+ return stack.mDisplayId;
}
return DEFAULT_DISPLAY;
}
@@ -12428,12 +12425,6 @@
mStackSupervisor.goingToSleepLocked();
sendNotifyVrManagerOfSleepState(true);
updateOomAdjLocked();
-
- // Initialize the wake times of all processes.
- checkExcessivePowerUsageLocked(false);
- mHandler.removeMessages(CHECK_EXCESSIVE_WAKE_LOCKS_MSG);
- Message nmsg = mHandler.obtainMessage(CHECK_EXCESSIVE_WAKE_LOCKS_MSG);
- mHandler.sendMessageDelayed(nmsg, mConstants.POWER_CHECK_DELAY);
}
// Also update state in a special way for running foreground services UI.
@@ -12737,18 +12728,16 @@
}
}
mProfileApp = processName;
- mProfileFile = profilerInfo.profileFile;
- if (mProfileFd != null) {
- try {
- mProfileFd.close();
- } catch (IOException e) {
+
+ if (mProfilerInfo != null) {
+ if (mProfilerInfo.profileFd != null) {
+ try {
+ mProfilerInfo.profileFd.close();
+ } catch (IOException e) {
+ }
}
- mProfileFd = null;
}
- mProfileFd = profilerInfo.profileFd;
- mSamplingInterval = profilerInfo.samplingInterval;
- mAutoStopProfiler = profilerInfo.autoStopProfiler;
- mStreamingOutput = profilerInfo.streamingOutput;
+ mProfilerInfo = new ProfilerInfo(profilerInfo);
mProfileType = 0;
}
}
@@ -13286,7 +13275,6 @@
}
final boolean translucentChanged = r.changeWindowTranslucency(true);
if (translucentChanged) {
- r.getStack().releaseBackgroundResources(r);
mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
}
mWindowManager.setAppFullscreen(token, true);
@@ -13326,38 +13314,6 @@
}
@Override
- public boolean requestVisibleBehind(IBinder token, boolean visible) {
- final long origId = Binder.clearCallingIdentity();
- try {
- synchronized (this) {
- final ActivityRecord r = ActivityRecord.isInStackLocked(token);
- if (r != null) {
- return mStackSupervisor.requestVisibleBehindLocked(r, visible);
- }
- }
- return false;
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- }
-
- @Override
- public boolean isBackgroundVisibleBehind(IBinder token) {
- final long origId = Binder.clearCallingIdentity();
- try {
- synchronized (this) {
- final ActivityStack stack = ActivityRecord.getStackLocked(token);
- final boolean visible = stack == null ? false : stack.hasVisibleBehindActivity();
- if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG_VISIBLE_BEHIND,
- "isBackgroundVisibleBehind: stack=" + stack + " visible=" + visible);
- return visible;
- }
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- }
-
- @Override
public Bundle getActivityOptions(IBinder token) {
final long origId = Binder.clearCallingIdentity();
try {
@@ -14114,6 +14070,12 @@
mSystemReady = true;
}
+ try {
+ sTheRealBuildSerial = IDeviceIdentifiersPolicyService.Stub.asInterface(
+ ServiceManager.getService(Context.DEVICE_IDENTIFIERS_SERVICE))
+ .getSerial();
+ } catch (RemoteException e) {}
+
ArrayList<ProcessRecord> procsToKill = null;
synchronized(mPidsSelfLocked) {
for (int i=mPidsSelfLocked.size()-1; i>=0; i--) {
@@ -14520,7 +14482,7 @@
final ProcessRecord r = handleApplicationWtfInner(callingUid, callingPid, app, tag,
crashInfo);
- final boolean isFatal = "eng".equals(Build.TYPE) || Settings.Global
+ final boolean isFatal = Build.IS_ENG || Settings.Global
.getInt(mContext.getContentResolver(), Settings.Global.WTF_IS_FATAL, 0) != 0;
final boolean isSystem = (r == null) || r.persistent;
@@ -15910,18 +15872,22 @@
pw.println(" mTrackAllocationApp=" + mTrackAllocationApp);
}
}
- if (mProfileApp != null || mProfileProc != null || mProfileFile != null
- || mProfileFd != null) {
+ if (mProfileApp != null || mProfileProc != null || (mProfilerInfo != null &&
+ (mProfilerInfo.profileFile != null || mProfilerInfo.profileFd != null))) {
if (dumpPackage == null || dumpPackage.equals(mProfileApp)) {
if (needSep) {
pw.println();
needSep = false;
}
pw.println(" mProfileApp=" + mProfileApp + " mProfileProc=" + mProfileProc);
- pw.println(" mProfileFile=" + mProfileFile + " mProfileFd=" + mProfileFd);
- pw.println(" mSamplingInterval=" + mSamplingInterval + " mAutoStopProfiler="
- + mAutoStopProfiler + " mStreamingOutput=" + mStreamingOutput);
- pw.println(" mProfileType=" + mProfileType);
+ if (mProfilerInfo != null) {
+ pw.println(" mProfileFile=" + mProfilerInfo.profileFile + " mProfileFd=" +
+ mProfilerInfo.profileFd);
+ pw.println(" mSamplingInterval=" + mProfilerInfo.samplingInterval +
+ " mAutoStopProfiler=" + mProfilerInfo.autoStopProfiler +
+ " mStreamingOutput=" + mProfilerInfo.streamingOutput);
+ pw.println(" mProfileType=" + mProfileType);
+ }
}
}
if (mNativeDebuggingApp != null) {
@@ -15950,9 +15916,6 @@
pw.println(" mBooting=" + mBooting
+ " mCallFinishBooting=" + mCallFinishBooting
+ " mBootAnimationComplete=" + mBootAnimationComplete);
- pw.print(" mLastPowerCheckRealtime=");
- TimeUtils.formatDuration(mLastPowerCheckRealtime, pw);
- pw.println("");
pw.print(" mLastPowerCheckUptime=");
TimeUtils.formatDuration(mLastPowerCheckUptime, pw);
pw.println("");
@@ -16607,8 +16570,6 @@
Collections.sort(list, comparator);
- final long curRealtime = SystemClock.elapsedRealtime();
- final long realtimeSince = curRealtime - service.mLastPowerCheckRealtime;
final long curUptime = SystemClock.uptimeMillis();
final long uptimeSince = curUptime - service.mLastPowerCheckUptime;
@@ -16705,24 +16666,6 @@
pw.print(" hasAboveClient="); pw.println(r.hasAboveClient);
if (r.setProcState >= ActivityManager.PROCESS_STATE_SERVICE) {
- if (r.lastWakeTime != 0) {
- long wtime;
- BatteryStatsImpl stats = service.mBatteryStatsService.getActiveStatistics();
- synchronized (stats) {
- wtime = stats.getProcessWakeTime(r.info.uid,
- r.pid, curRealtime);
- }
- long timeUsed = wtime - r.lastWakeTime;
- pw.print(prefix);
- pw.print(" ");
- pw.print("keep awake over ");
- TimeUtils.formatDuration(realtimeSince, pw);
- pw.print(" used ");
- TimeUtils.formatDuration(timeUsed, pw);
- pw.print(" (");
- pw.print((timeUsed*100)/realtimeSince);
- pw.println("%)");
- }
if (r.lastCpuTime != 0) {
long timeUsed = r.curCpuTime - r.lastCpuTime;
pw.print(prefix);
@@ -17245,12 +17188,12 @@
}
} catch (IOException e) {
if (!isCheckinRequest) {
- pw.println("Got IoException!");
+ pw.println("Got IoException! " + e);
pw.flush();
}
} catch (RemoteException e) {
if (!isCheckinRequest) {
- pw.println("Got RemoteException!");
+ pw.println("Got RemoteException! " + e);
pw.flush();
}
}
@@ -17382,23 +17325,41 @@
ArrayList<MemItem> catMems = new ArrayList<MemItem>();
catMems.add(new MemItem("Native", "Native", nativePss, nativeSwapPss, -1));
- final MemItem dalvikItem =
- new MemItem("Dalvik", "Dalvik", dalvikPss, dalvikSwapPss, -2);
- if (dalvikSubitemPss.length > 0) {
- dalvikItem.subitems = new ArrayList<MemItem>();
- for (int j=0; j<dalvikSubitemPss.length; j++) {
- final String name = Debug.MemoryInfo.getOtherLabel(
- Debug.MemoryInfo.NUM_OTHER_STATS + j);
- dalvikItem.subitems.add(new MemItem(name, name, dalvikSubitemPss[j],
- dalvikSubitemSwapPss[j], j));
- }
- }
- catMems.add(dalvikItem);
+ final int dalvikId = -2;
+ catMems.add(new MemItem("Dalvik", "Dalvik", dalvikPss, dalvikSwapPss, dalvikId));
catMems.add(new MemItem("Unknown", "Unknown", otherPss, otherSwapPss, -3));
for (int j=0; j<Debug.MemoryInfo.NUM_OTHER_STATS; j++) {
String label = Debug.MemoryInfo.getOtherLabel(j);
catMems.add(new MemItem(label, label, miscPss[j], miscSwapPss[j], j));
}
+ if (dalvikSubitemPss.length > 0) {
+ // Add dalvik subitems.
+ for (MemItem memItem : catMems) {
+ int memItemStart = 0, memItemEnd = 0;
+ if (memItem.id == dalvikId) {
+ memItemStart = Debug.MemoryInfo.OTHER_DVK_STAT_DALVIK_START;
+ memItemEnd = Debug.MemoryInfo.OTHER_DVK_STAT_DALVIK_END;
+ } else if (memItem.id == Debug.MemoryInfo.OTHER_DALVIK_OTHER) {
+ memItemStart = Debug.MemoryInfo.OTHER_DVK_STAT_DALVIK_OTHER_START;
+ memItemEnd = Debug.MemoryInfo.OTHER_DVK_STAT_DALVIK_OTHER_END;
+ } else if (memItem.id == Debug.MemoryInfo.OTHER_DEX) {
+ memItemStart = Debug.MemoryInfo.OTHER_DVK_STAT_DEX_START;
+ memItemEnd = Debug.MemoryInfo.OTHER_DVK_STAT_DEX_END;
+ } else if (memItem.id == Debug.MemoryInfo.OTHER_ART) {
+ memItemStart = Debug.MemoryInfo.OTHER_DVK_STAT_ART_START;
+ memItemEnd = Debug.MemoryInfo.OTHER_DVK_STAT_ART_END;
+ } else {
+ continue; // No subitems, continue.
+ }
+ memItem.subitems = new ArrayList<MemItem>();
+ for (int j=memItemStart; j<=memItemEnd; j++) {
+ final String name = Debug.MemoryInfo.getOtherLabel(
+ Debug.MemoryInfo.NUM_OTHER_STATS + j);
+ memItem.subitems.add(new MemItem(name, name, dalvikSubitemPss[j],
+ dalvikSubitemSwapPss[j], j));
+ }
+ }
+ }
ArrayList<MemItem> oomMems = new ArrayList<MemItem>();
for (int j=0; j<oomPss.length; j++) {
@@ -20590,7 +20551,7 @@
&& config.navigation == Configuration.NAVIGATION_NONAV);
int modeType = config.uiMode & Configuration.UI_MODE_TYPE_MASK;
final boolean uiModeSupportsDialogs = (modeType != Configuration.UI_MODE_TYPE_CAR
- && !(modeType == Configuration.UI_MODE_TYPE_WATCH && "user".equals(Build.TYPE))
+ && !(modeType == Configuration.UI_MODE_TYPE_WATCH && Build.IS_USER)
&& modeType != Configuration.UI_MODE_TYPE_TELEVISION
&& modeType != Configuration.UI_MODE_TYPE_VR_HEADSET);
return inputMethodExists && uiModeSupportsDialogs;
@@ -21645,7 +21606,9 @@
if (DEBUG_PSS) Slog.d(TAG_PSS,
"Requesting dump heap from "
+ myProc + " to " + heapdumpFile);
- thread.dumpHeap(true, heapdumpFile.toString(), fd);
+ thread.dumpHeap(/* managed= */ true,
+ /* mallocInfo= */ false, /* runGc= */ false,
+ heapdumpFile.toString(), fd);
} catch (RemoteException e) {
}
}
@@ -21861,58 +21824,28 @@
}
}
- final void checkExcessivePowerUsageLocked(boolean doKills) {
+ final void checkExcessivePowerUsageLocked() {
updateCpuStatsNow();
BatteryStatsImpl stats = mBatteryStatsService.getActiveStatistics();
- boolean doWakeKills = doKills;
- boolean doCpuKills = doKills;
- if (mLastPowerCheckRealtime == 0) {
- doWakeKills = false;
- }
+ boolean doCpuKills = true;
if (mLastPowerCheckUptime == 0) {
doCpuKills = false;
}
- if (stats.isScreenOn()) {
- doWakeKills = false;
- }
- final long curRealtime = SystemClock.elapsedRealtime();
- final long realtimeSince = curRealtime - mLastPowerCheckRealtime;
final long curUptime = SystemClock.uptimeMillis();
final long uptimeSince = curUptime - mLastPowerCheckUptime;
- mLastPowerCheckRealtime = curRealtime;
mLastPowerCheckUptime = curUptime;
- if (realtimeSince < mConstants.WAKE_LOCK_MIN_CHECK_DURATION) {
- doWakeKills = false;
- }
- if (uptimeSince < mConstants.CPU_MIN_CHECK_DURATION) {
- doCpuKills = false;
- }
int i = mLruProcesses.size();
while (i > 0) {
i--;
ProcessRecord app = mLruProcesses.get(i);
if (app.setProcState >= ActivityManager.PROCESS_STATE_HOME) {
- long wtime;
- synchronized (stats) {
- wtime = stats.getProcessWakeTime(app.info.uid,
- app.pid, curRealtime);
+ if (app.lastCpuTime <= 0) {
+ continue;
}
- long wtimeUsed = wtime - app.lastWakeTime;
long cputimeUsed = app.curCpuTime - app.lastCpuTime;
if (DEBUG_POWER) {
StringBuilder sb = new StringBuilder(128);
- sb.append("Wake for ");
- app.toShortString(sb);
- sb.append(": over ");
- TimeUtils.formatDuration(realtimeSince, sb);
- sb.append(" used ");
- TimeUtils.formatDuration(wtimeUsed, sb);
- sb.append(" (");
- sb.append((wtimeUsed*100)/realtimeSince);
- sb.append("%)");
- Slog.i(TAG_POWER, sb.toString());
- sb.setLength(0);
sb.append("CPU for ");
app.toShortString(sb);
sb.append(": over ");
@@ -21924,29 +21857,33 @@
sb.append("%)");
Slog.i(TAG_POWER, sb.toString());
}
- // If a process has held a wake lock for more
- // than 50% of the time during this period,
- // that sounds bad. Kill!
- if (doWakeKills && realtimeSince > 0
- && ((wtimeUsed*100)/realtimeSince) >= 50) {
- synchronized (stats) {
- stats.reportExcessiveWakeLocked(app.info.uid, app.processName,
- realtimeSince, wtimeUsed);
+ // If the process has used too much CPU over the last duration, the
+ // user probably doesn't want this, so kill!
+ if (doCpuKills && uptimeSince > 0) {
+ // What is the limit for this process?
+ int cpuLimit;
+ long checkDur = curUptime - app.whenUnimportant;
+ if (checkDur <= mConstants.POWER_CHECK_INTERVAL) {
+ cpuLimit = mConstants.POWER_CHECK_MAX_CPU_1;
+ } else if (checkDur <= (mConstants.POWER_CHECK_INTERVAL*2)
+ || app.setProcState <= ActivityManager.PROCESS_STATE_HOME) {
+ cpuLimit = mConstants.POWER_CHECK_MAX_CPU_2;
+ } else if (checkDur <= (mConstants.POWER_CHECK_INTERVAL*3)) {
+ cpuLimit = mConstants.POWER_CHECK_MAX_CPU_3;
+ } else {
+ cpuLimit = mConstants.POWER_CHECK_MAX_CPU_4;
}
- app.kill("excessive wake held " + wtimeUsed + " during " + realtimeSince, true);
- app.baseProcessTracker.reportExcessiveWake(app.pkgList);
- } else if (doCpuKills && uptimeSince > 0
- && ((cputimeUsed*100)/uptimeSince) >= 25) {
- synchronized (stats) {
- stats.reportExcessiveCpuLocked(app.info.uid, app.processName,
- uptimeSince, cputimeUsed);
+ if (((cputimeUsed*100)/uptimeSince) >= cpuLimit) {
+ synchronized (stats) {
+ stats.reportExcessiveCpuLocked(app.info.uid, app.processName,
+ uptimeSince, cputimeUsed);
+ }
+ app.kill("excessive cpu " + cputimeUsed + " during " + uptimeSince
+ + " dur=" + checkDur + " limit=" + cpuLimit, true);
+ app.baseProcessTracker.reportExcessiveCpu(app.pkgList);
}
- app.kill("excessive cpu " + cputimeUsed + " during " + uptimeSince, true);
- app.baseProcessTracker.reportExcessiveCpu(app.pkgList);
- } else {
- app.lastWakeTime = wtime;
- app.lastCpuTime = app.curCpuTime;
}
+ app.lastCpuTime = app.curCpuTime;
}
}
}
@@ -22120,15 +22057,10 @@
if (setImportant && !curImportant) {
// This app is no longer something we consider important enough to allow to
// use arbitrary amounts of battery power. Note
- // its current wake lock time to later know to kill it if
+ // its current CPU time to later know to kill it if
// it is not behaving well.
- BatteryStatsImpl stats = mBatteryStatsService.getActiveStatistics();
- synchronized (stats) {
- app.lastWakeTime = stats.getProcessWakeTime(app.info.uid,
- app.pid, nowElapsed);
- }
- app.lastCpuTime = app.curCpuTime;
-
+ app.whenUnimportant = now;
+ app.lastCpuTime = 0;
}
// Inform UsageStats of important process state change
// Must be called before updating setProcState
@@ -22229,10 +22161,10 @@
}
if (uidRec != null) {
uidRec.pendingChange = pendingChange;
- if (change == UidRecord.CHANGE_GONE && !uidRec.idle) {
+ if ((change & UidRecord.CHANGE_GONE) != 0 && !uidRec.idle) {
// If this uid is going away, and we haven't yet reported it is gone,
// then do so now.
- change = UidRecord.CHANGE_GONE_IDLE;
+ change |= UidRecord.CHANGE_IDLE;
}
} else if (uid < 0) {
throw new IllegalArgumentException("No UidRecord or uid");
@@ -22242,8 +22174,26 @@
mPendingUidChanges.add(pendingChange);
} else {
pendingChange = uidRec.pendingChange;
- if (change == UidRecord.CHANGE_GONE && pendingChange.change == UidRecord.CHANGE_IDLE) {
- change = UidRecord.CHANGE_GONE_IDLE;
+ // If there is no change in idle or active state, then keep whatever was pending.
+ if ((change & (UidRecord.CHANGE_IDLE | UidRecord.CHANGE_ACTIVE)) == 0) {
+ change |= (pendingChange.change & (UidRecord.CHANGE_IDLE
+ | UidRecord.CHANGE_ACTIVE));
+ }
+ // If there is no change in cached or uncached state, then keep whatever was pending.
+ if ((change & (UidRecord.CHANGE_CACHED | UidRecord.CHANGE_UNCACHED)) == 0) {
+ change |= (pendingChange.change & (UidRecord.CHANGE_CACHED
+ | UidRecord.CHANGE_UNCACHED));
+ }
+ // If this is a report of the UID being gone, then we shouldn't keep any previous
+ // report of it being active or cached. (That is, a gone uid is never active,
+ // and never cached.)
+ if ((change & UidRecord.CHANGE_GONE) != 0) {
+ change &= ~(UidRecord.CHANGE_ACTIVE | UidRecord.CHANGE_CACHED);
+ if (!uidRec.idle) {
+ // If this uid is going away, and we haven't yet reported it is gone,
+ // then do so now.
+ change |= UidRecord.CHANGE_IDLE;
+ }
}
}
pendingChange.change = change;
@@ -22252,27 +22202,26 @@
pendingChange.ephemeral = uidRec != null ? uidRec.ephemeral : isEphemeralLocked(uid);
pendingChange.procStateSeq = uidRec != null ? uidRec.curProcStateSeq : 0;
if (uidRec != null) {
+ uidRec.lastReportedChange = change;
uidRec.updateLastDispatchedProcStateSeq(change);
}
// Directly update the power manager, since we sit on top of it and it is critical
// it be kept in sync (so wake locks will be held as soon as appropriate).
if (mLocalPowerManager != null) {
- switch (change) {
- case UidRecord.CHANGE_GONE:
- case UidRecord.CHANGE_GONE_IDLE:
- mLocalPowerManager.uidGone(pendingChange.uid);
- break;
- case UidRecord.CHANGE_IDLE:
- mLocalPowerManager.uidIdle(pendingChange.uid);
- break;
- case UidRecord.CHANGE_ACTIVE:
- mLocalPowerManager.uidActive(pendingChange.uid);
- break;
- default:
- mLocalPowerManager.updateUidProcState(pendingChange.uid,
- pendingChange.processState);
- break;
+ // TO DO: dispatch cached/uncached changes here, so we don't need to report
+ // all proc state changes.
+ if ((change & UidRecord.CHANGE_ACTIVE) != 0) {
+ mLocalPowerManager.uidActive(pendingChange.uid);
+ }
+ if ((change & UidRecord.CHANGE_IDLE) != 0) {
+ mLocalPowerManager.uidIdle(pendingChange.uid);
+ }
+ if ((change & UidRecord.CHANGE_GONE) != 0) {
+ mLocalPowerManager.uidGone(pendingChange.uid);
+ } else {
+ mLocalPowerManager.updateUidProcState(pendingChange.uid,
+ pendingChange.processState);
}
}
}
@@ -22834,8 +22783,9 @@
for (int i=mActiveUids.size()-1; i>=0; i--) {
final UidRecord uidRec = mActiveUids.valueAt(i);
int uidChange = UidRecord.CHANGE_PROCSTATE;
- if (uidRec.setProcState != uidRec.curProcState
- || uidRec.setWhitelist != uidRec.curWhitelist) {
+ if (uidRec.curProcState != ActivityManager.PROCESS_STATE_NONEXISTENT
+ && (uidRec.setProcState != uidRec.curProcState
+ || uidRec.setWhitelist != uidRec.curWhitelist)) {
if (DEBUG_UID_OBSERVERS) Slog.i(TAG_UID_OBSERVERS,
"Changes in " + uidRec + ": proc state from " + uidRec.setProcState
+ " to " + uidRec.curProcState + ", whitelist from " + uidRec.setWhitelist
@@ -22856,6 +22806,9 @@
mConstants.BACKGROUND_SETTLE_TIME);
}
}
+ if (uidRec.idle && !uidRec.setIdle) {
+ uidChange = UidRecord.CHANGE_IDLE;
+ }
} else {
if (uidRec.idle) {
uidChange = UidRecord.CHANGE_ACTIVE;
@@ -22864,8 +22817,17 @@
}
uidRec.lastBackgroundTime = 0;
}
+ final boolean wasCached = uidRec.setProcState
+ > ActivityManager.PROCESS_STATE_RECEIVER && uidRec.setProcState
+ != ActivityManager.PROCESS_STATE_NONEXISTENT;
+ final boolean isCached = uidRec.curProcState
+ > ActivityManager.PROCESS_STATE_RECEIVER;
+ if (wasCached != isCached) {
+ uidChange |= isCached ? UidRecord.CHANGE_CACHED : UidRecord.CHANGE_UNCACHED;
+ }
uidRec.setProcState = uidRec.curProcState;
uidRec.setWhitelist = uidRec.curWhitelist;
+ uidRec.setIdle = uidRec.idle;
enqueueUidChangeLocked(uidRec, -1, uidChange);
noteUidProcessState(uidRec.uid, uidRec.curProcState);
if (uidRec.foregroundServices) {
@@ -22940,6 +22902,7 @@
userId == UserHandle.getUserId(uidRec.uid)) {
EventLogTags.writeAmUidIdle(uidRec.uid);
uidRec.idle = true;
+ uidRec.setIdle = true;
Slog.w(TAG, "Idling uid " + UserHandle.formatUid(uidRec.uid)
+ " from package " + packageName + " user " + userId);
doStopUidLocked(uidRec.uid, uidRec);
@@ -22975,6 +22938,7 @@
if (bgTime <= maxBgTime) {
EventLogTags.writeAmUidIdle(uidRec.uid);
uidRec.idle = true;
+ uidRec.setIdle = true;
doStopUidLocked(uidRec.uid, uidRec);
} else {
if (nextTime == 0 || nextTime > bgTime) {
@@ -23294,19 +23258,15 @@
}
private void clearProfilerLocked() {
- if (mProfileFd != null) {
+ if (mProfilerInfo !=null && mProfilerInfo.profileFd != null) {
try {
- mProfileFd.close();
+ mProfilerInfo.profileFd.close();
} catch (IOException e) {
}
}
mProfileApp = null;
mProfileProc = null;
- mProfileFile = null;
- mProfileType = 0;
- mAutoStopProfiler = false;
- mStreamingOutput = false;
- mSamplingInterval = 0;
+ mProfilerInfo = null;
}
public boolean profileControl(String process, int userId, boolean start,
@@ -23350,10 +23310,10 @@
proc.thread.profilerControl(start, profilerInfo, profileType);
fd = null;
try {
- mProfileFd.close();
+ mProfilerInfo.profileFd.close();
} catch (IOException e) {
}
- mProfileFd = null;
+ mProfilerInfo.profileFd = null;
} else {
stopProfilerLocked(proc, profileType);
if (profilerInfo != null && profilerInfo.profileFd != null) {
@@ -23411,8 +23371,8 @@
return proc;
}
- public boolean dumpHeap(String process, int userId, boolean managed,
- String path, ParcelFileDescriptor fd) throws RemoteException {
+ public boolean dumpHeap(String process, int userId, boolean managed, boolean mallocInfo,
+ boolean runGc, String path, ParcelFileDescriptor fd) throws RemoteException {
try {
synchronized (this) {
@@ -23440,7 +23400,7 @@
}
}
- proc.thread.dumpHeap(managed, path, fd);
+ proc.thread.dumpHeap(managed, mallocInfo, runGc, path, fd);
fd = null;
return true;
}
@@ -23509,6 +23469,9 @@
}
if (DEBUG_PSS) Slog.d(TAG_PSS, "Dump heap finished for " + path);
mHandler.sendEmptyMessage(POST_DUMP_HEAP_NOTIFICATION_MSG);
+
+ // Forced gc to clean up the remnant hprof fd.
+ Runtime.getRuntime().gc();
}
}
@@ -23831,6 +23794,7 @@
synchronized (ActivityManagerService.this) {
ActivityManagerService.this.onUserStoppedLocked(userId);
}
+ mBatteryStatsService.onUserRemoved(userId);
}
@Override
@@ -24194,7 +24158,7 @@
record.networkStateLock.wait(mWaitForNetworkTimeoutMs);
record.waitingForNetwork = false;
final long totalTime = SystemClock.uptimeMillis() - startTime;
- if (totalTime >= mWaitForNetworkTimeoutMs) {
+ if (totalTime >= mWaitForNetworkTimeoutMs || DEBUG_NETWORK) {
Slog.wtf(TAG_NETWORK, "Total time waited for network rules to get updated: "
+ totalTime + ". Uid: " + callingUid + " procStateSeq: "
+ procStateSeq + " UidRec: " + record
@@ -24364,7 +24328,7 @@
}
return mActivityStarter.startActivityMayWait(appThread, -1, callingPackage, intent,
resolvedType, null, null, null, null, 0, 0, null, null,
- null, bOptions, false, callingUser, null, tr, "AppTaskImpl");
+ null, bOptions, false, callingUser, tr, "AppTaskImpl");
}
@Override
@@ -24542,4 +24506,37 @@
return mNmi != null;
}
}
+
+ @Override
+ public void setShowWhenLocked(IBinder token, boolean showWhenLocked)
+ throws RemoteException {
+ synchronized (this) {
+ final ActivityRecord r = ActivityRecord.isInStackLocked(token);
+ if (r == null) {
+ return;
+ }
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ r.setShowWhenLocked(showWhenLocked);
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+ }
+
+ @Override
+ public void setTurnScreenOn(IBinder token, boolean turnScreenOn) throws RemoteException {
+ synchronized (this) {
+ final ActivityRecord r = ActivityRecord.isInStackLocked(token);
+ if (r == null) {
+ return;
+ }
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ r.setTurnScreenOn(turnScreenOn);
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+ }
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
index d768304..45357cb 100644
--- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
+++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
@@ -19,10 +19,10 @@
import android.app.ActivityManager;
import android.app.ActivityOptions;
import android.app.AppGlobals;
-import android.app.IActivityContainer;
import android.app.IActivityController;
import android.app.IActivityManager;
import android.app.IStopUserCallback;
+import android.app.IUidObserver;
import android.app.ProfilerInfo;
import android.app.WaitResult;
import android.app.usage.ConfigurationStats;
@@ -114,6 +114,7 @@
private int mSamplingInterval;
private boolean mAutoStop;
private boolean mStreaming; // Streaming the profiling output to a file.
+ private String mAgent; // Agent to attach on startup.
private int mDisplayId;
private int mStackId;
private int mTaskId;
@@ -183,6 +184,8 @@
return runMakeIdle(pw);
case "monitor":
return runMonitor(pw);
+ case "watch-uids":
+ return runWatchUids(pw);
case "hang":
return runHang(pw);
case "restart":
@@ -292,6 +295,8 @@
mSamplingInterval = Integer.parseInt(getNextArgRequired());
} else if (opt.equals("--streaming")) {
mStreaming = true;
+ } else if (opt.equals("--attach-agent")) {
+ mAgent = getNextArgRequired();
} else if (opt.equals("-R")) {
mRepeat = Integer.parseInt(getNextArgRequired());
} else if (opt.equals("-S")) {
@@ -368,13 +373,16 @@
ProfilerInfo profilerInfo = null;
- if (mProfileFile != null) {
- ParcelFileDescriptor fd = openOutputFileForSystem(mProfileFile);
- if (fd == null) {
- return 1;
+ if (mProfileFile != null || mAgent != null) {
+ ParcelFileDescriptor fd = null;
+ if (mProfileFile != null) {
+ fd = openOutputFileForSystem(mProfileFile);
+ if (fd == null) {
+ return 1;
+ }
}
profilerInfo = new ProfilerInfo(mProfileFile, fd, mSamplingInterval, mAutoStop,
- mStreaming);
+ mStreaming, mAgent);
}
pw.println("Starting: " + intent);
@@ -747,7 +755,8 @@
if (fd == null) {
return -1;
}
- profilerInfo = new ProfilerInfo(profileFile, fd, mSamplingInterval, false, mStreaming);
+ profilerInfo = new ProfilerInfo(profileFile, fd, mSamplingInterval, false, mStreaming,
+ null);
}
try {
@@ -777,7 +786,9 @@
int runDumpHeap(PrintWriter pw) throws RemoteException {
final PrintWriter err = getErrPrintWriter();
boolean managed = true;
+ boolean mallocInfo = false;
int userId = UserHandle.USER_CURRENT;
+ boolean runGc = false;
String opt;
while ((opt=getNextOption()) != null) {
@@ -789,6 +800,11 @@
}
} else if (opt.equals("-n")) {
managed = false;
+ } else if (opt.equals("-g")) {
+ runGc = true;
+ } else if (opt.equals("-m")) {
+ managed = false;
+ mallocInfo = true;
} else {
err.println("Error: Unknown option: " + opt);
return -1;
@@ -804,7 +820,7 @@
return -1;
}
- if (!mInterface.dumpHeap(process, userId, managed, heapFile, fd)) {
+ if (!mInterface.dumpHeap(process, userId, managed, mallocInfo, runGc, heapFile, fd)) {
err.println("HEAP DUMP FAILED on process " + process);
return -1;
}
@@ -1280,6 +1296,141 @@
return 0;
}
+ static final class MyUidObserver extends IUidObserver.Stub {
+ final IActivityManager mInterface;
+ final PrintWriter mPw;
+ final InputStream mInput;
+
+ static final int STATE_NORMAL = 0;
+
+ int mState;
+
+ MyUidObserver(IActivityManager iam, PrintWriter pw, InputStream input) {
+ mInterface = iam;
+ mPw = pw;
+ mInput = input;
+ }
+
+ @Override
+ public void onUidStateChanged(int uid, int procState, long procStateSeq) throws RemoteException {
+ synchronized (this) {
+ mPw.print(uid);
+ mPw.print(" procstate ");
+ mPw.print(ProcessList.makeProcStateString(procState));
+ mPw.print(" seq ");
+ mPw.println(procStateSeq);
+ mPw.flush();
+ }
+ }
+
+ @Override
+ public void onUidGone(int uid, boolean disabled) throws RemoteException {
+ synchronized (this) {
+ mPw.print(uid);
+ mPw.print(" gone");
+ if (disabled) {
+ mPw.print(" disabled");
+ }
+ mPw.println();
+ mPw.flush();
+ }
+ }
+
+ @Override
+ public void onUidActive(int uid) throws RemoteException {
+ synchronized (this) {
+ mPw.print(uid);
+ mPw.println(" active");
+ mPw.flush();
+ }
+ }
+
+ @Override
+ public void onUidIdle(int uid, boolean disabled) throws RemoteException {
+ synchronized (this) {
+ mPw.print(uid);
+ mPw.print(" idle");
+ if (disabled) {
+ mPw.print(" disabled");
+ }
+ mPw.println();
+ mPw.flush();
+ }
+ }
+
+ @Override
+ public void onUidCachedChanged(int uid, boolean cached) throws RemoteException {
+ synchronized (this) {
+ mPw.print(uid);
+ mPw.println(cached ? " cached" : " uncached");
+ mPw.flush();
+ }
+ }
+
+ void printMessageForState() {
+ switch (mState) {
+ case STATE_NORMAL:
+ mPw.println("Watching uid states... available commands:");
+ break;
+ }
+ mPw.println("(q)uit: finish watching");
+ }
+
+ void run() throws RemoteException {
+ try {
+ printMessageForState();
+ mPw.flush();
+
+ mInterface.registerUidObserver(this, ActivityManager.UID_OBSERVER_ACTIVE
+ | ActivityManager.UID_OBSERVER_GONE | ActivityManager.UID_OBSERVER_PROCSTATE
+ | ActivityManager.UID_OBSERVER_IDLE | ActivityManager.UID_OBSERVER_CACHED,
+ ActivityManager.PROCESS_STATE_UNKNOWN, null);
+ mState = STATE_NORMAL;
+
+ InputStreamReader converter = new InputStreamReader(mInput);
+ BufferedReader in = new BufferedReader(converter);
+ String line;
+
+ while ((line = in.readLine()) != null) {
+ boolean addNewline = true;
+ if (line.length() <= 0) {
+ addNewline = false;
+ } else if ("q".equals(line) || "quit".equals(line)) {
+ break;
+ } else {
+ mPw.println("Invalid command: " + line);
+ }
+
+ synchronized (this) {
+ if (addNewline) {
+ mPw.println("");
+ }
+ printMessageForState();
+ mPw.flush();
+ }
+ }
+
+ } catch (IOException e) {
+ e.printStackTrace(mPw);
+ mPw.flush();
+ } finally {
+ mInterface.unregisterUidObserver(this);
+ }
+ }
+ }
+
+ int runWatchUids(PrintWriter pw) throws RemoteException {
+ String opt;
+ while ((opt=getNextOption()) != null) {
+ getErrPrintWriter().println("Error: Unknown option: " + opt);
+ return -1;
+ }
+
+ MyUidObserver controller = new MyUidObserver(mInterface, pw, getRawInputStream());
+ controller.run();
+ return 0;
+ }
+
int runHang(PrintWriter pw) throws RemoteException {
String opt;
boolean allowRestart = false;
@@ -1807,9 +1958,17 @@
throw new RuntimeException(e.getMessage(), e);
}
- IActivityContainer container = mInterface.createStackOnDisplay(displayId);
- if (container != null) {
- container.startActivity(intent);
+ final int stackId = mInterface.createStackOnDisplay(displayId);
+ if (stackId != INVALID_STACK_ID) {
+ // TODO: Need proper support if this is used by test...
+// container.startActivity(intent);
+// ActivityOptions options = ActivityOptions.makeBasic();
+// options.setLaunchDisplayId(displayId);
+// options.setLaunchStackId(stackId);
+// mInterface.startAct
+// mInterface.startActivityAsUser(null, null, intent, mimeType,
+// null, null, 0, mStartFlags, profilerInfo,
+// options != null ? options.toBundle() : null, mUserId);
}
return 0;
}
@@ -2490,6 +2649,7 @@
pw.println(" --streaming: stream the profiling output to the specified file");
pw.println(" (use with --start-profiler)");
pw.println(" -P <FILE>: like above, but profiling stops when app goes idle");
+ pw.println(" --attach-agent <agent>: attach the given agent before binding");
pw.println(" -R: repeat the activity launch <COUNT> times. Prior to each repeat,");
pw.println(" the top activity will be finished.");
pw.println(" -S: force stop the target app before starting the activity");
@@ -2547,10 +2707,11 @@
pw.println(" --sampling INTERVAL: use sample profiling with INTERVAL microseconds");
pw.println(" between samples");
pw.println(" --streaming: stream the profiling output to the specified file");
- pw.println(" dumpheap [--user <USER_ID> current] [-n] <PROCESS> <FILE>");
+ pw.println(" dumpheap [--user <USER_ID> current] [-n] [-g] <PROCESS> <FILE>");
pw.println(" Dump the heap of a process. The given <PROCESS> argument may");
pw.println(" be either a process name or pid. Options are:");
pw.println(" -n: dump native heap instead of managed heap");
+ pw.println(" -g: force GC before dumping the heap");
pw.println(" --user <USER_ID> | current: When supplying a process name,");
pw.println(" specify user of process to dump; uses current user if not specified.");
pw.println(" set-debug-app [-w] [--persistent] <PACKAGE>");
@@ -2583,6 +2744,8 @@
pw.println(" monitor [--gdb <port>]");
pw.println(" Start monitoring for crashes or ANRs.");
pw.println(" --gdb: start gdbserv on the given port at crash/ANR");
+ pw.println(" watch-uids [--gdb <port>]");
+ pw.println(" Start watching for and reporting uid state changes.");
pw.println(" hang [--allow-restart]");
pw.println(" Hang the system.");
pw.println(" --allow-restart: allow watchdog to perform normal system restart");
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java
index c09947c..3c84941 100644
--- a/services/core/java/com/android/server/am/ActivityRecord.java
+++ b/services/core/java/com/android/server/am/ActivityRecord.java
@@ -49,11 +49,13 @@
import static android.content.pm.ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE;
import static android.content.pm.ActivityInfo.CONFIG_UI_MODE;
import static android.content.pm.ActivityInfo.FLAG_ALWAYS_FOCUSABLE;
+import static android.content.pm.ActivityInfo.FLAG_SHOW_WHEN_LOCKED;
import static android.content.pm.ActivityInfo.FLAG_EXCLUDE_FROM_RECENTS;
import static android.content.pm.ActivityInfo.FLAG_IMMERSIVE;
import static android.content.pm.ActivityInfo.FLAG_MULTIPROCESS;
import static android.content.pm.ActivityInfo.FLAG_SHOW_FOR_ALL_USERS;
import static android.content.pm.ActivityInfo.FLAG_STATE_NOT_NEEDED;
+import static android.content.pm.ActivityInfo.FLAG_TURN_SCREEN_ON;
import static android.content.pm.ActivityInfo.LAUNCH_MULTIPLE;
import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_INSTANCE;
import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_TASK;
@@ -94,7 +96,6 @@
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_VISIBILITY;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
-import static com.android.server.am.ActivityManagerService.IS_USER_BUILD;
import static com.android.server.am.ActivityManagerService.TAKE_FULLSCREEN_SCREENSHOTS;
import static com.android.server.am.ActivityStack.ActivityState.DESTROYED;
import static com.android.server.am.ActivityStack.ActivityState.DESTROYING;
@@ -164,7 +165,6 @@
import com.android.server.AttributeCache;
import com.android.server.AttributeCache.Entry;
import com.android.server.am.ActivityStack.ActivityState;
-import com.android.server.am.ActivityStackSupervisor.ActivityContainer;
import com.android.server.wm.AppWindowContainerController;
import com.android.server.wm.AppWindowContainerListener;
import com.android.server.wm.TaskWindowContainerController;
@@ -306,7 +306,6 @@
int launchCount; // count of launches since last state
long lastLaunchTime; // time of last launch of this activity
ComponentName requestedVrComponent; // the requested component for handling VR mode.
- ArrayList<ActivityContainer> mChildContainers = new ArrayList<>();
String stringName; // for caching of toString().
@@ -320,7 +319,6 @@
boolean mTaskOverlay = false; // Task is always on-top of other activities in the task.
boolean mUpdateTaskThumbnailWhenHidden;
- ActivityContainer mInitialActivityContainer;
TaskDescription taskDescription; // the recents information for this activity
boolean mLaunchTaskBehind; // this activity is actively being launched with
@@ -349,6 +347,9 @@
// handle calculating override configuration from the bounds.
private final Rect mBounds = new Rect();
+ private boolean mShowWhenLocked;
+ private boolean mTurnScreenOn;
+
/**
* Temp configs used in {@link #ensureActivityConfigurationLocked(int, boolean)}
*/
@@ -795,8 +796,8 @@
ActivityInfo aInfo, Configuration _configuration,
ActivityRecord _resultTo, String _resultWho, int _reqCode,
boolean _componentSpecified, boolean _rootVoiceInteraction,
- ActivityStackSupervisor supervisor,
- ActivityContainer container, ActivityOptions options, ActivityRecord sourceRecord) {
+ ActivityStackSupervisor supervisor, ActivityOptions options,
+ ActivityRecord sourceRecord) {
service = _service;
appToken = new Token(this);
info = aInfo;
@@ -827,7 +828,6 @@
idle = false;
hasBeenLaunched = false;
mStackSupervisor = supervisor;
- mInitialActivityContainer = container;
mRotationAnimationHint = aInfo.rotationAnimation;
@@ -909,6 +909,9 @@
requestedVrComponent = (aInfo.requestedVrComponent == null) ?
null : ComponentName.unflattenFromString(aInfo.requestedVrComponent);
+
+ mShowWhenLocked = (aInfo.flags & FLAG_SHOW_WHEN_LOCKED) != 0;
+ mTurnScreenOn = (aInfo.flags & FLAG_TURN_SCREEN_ON) != 0;
}
AppWindowContainerController getWindowContainerController() {
@@ -1178,7 +1181,7 @@
*/
boolean canBeLaunchedOnDisplay(int displayId) {
return service.mStackSupervisor.canPlaceEntityOnDisplay(displayId,
- supportsResizeableMultiWindow());
+ supportsResizeableMultiWindow(), launchedFromPid, launchedFromUid, info);
}
/**
@@ -1263,13 +1266,6 @@
return (info.flags & FLAG_ALWAYS_FOCUSABLE) != 0;
}
- /**
- * @return true if the activity contains windows that have
- * {@link LayoutParams#FLAG_SHOW_WHEN_LOCKED} set
- */
- boolean hasShowWhenLockedWindows() {
- return service.mWindowManager.containsShowWhenLockedWindow(appToken);
- }
/**
* @return true if the activity contains windows that have
@@ -1280,20 +1276,16 @@
}
void makeFinishingLocked() {
- if (!finishing) {
- final ActivityStack stack = getStack();
- if (stack != null && this == stack.getVisibleBehindActivity()) {
- // A finishing activity should not remain as visible in the background
- mStackSupervisor.requestVisibleBehindLocked(this, false);
- }
- finishing = true;
- if (stopped) {
- clearOptionsLocked();
- }
+ if (finishing) {
+ return;
+ }
+ finishing = true;
+ if (stopped) {
+ clearOptionsLocked();
+ }
- if (service != null) {
- service.mTaskChangeNotificationController.notifyTaskStackChanged();
- }
+ if (service != null) {
+ service.mTaskChangeNotificationController.notifyTaskStackChanged();
}
}
@@ -1350,11 +1342,7 @@
intent, getUriPermissionsLocked(), userId);
final ReferrerIntent rintent = new ReferrerIntent(intent, referrer);
boolean unsent = true;
- final ActivityStack stack = getStack();
- final boolean isTopActivityInStack =
- stack != null && stack.topRunningActivityLocked() == this;
- final boolean isTopActivityWhileSleeping =
- service.isSleepingLocked() && isTopActivityInStack;
+ final boolean isTopActivityWhileSleeping = service.isSleepingLocked() && isTopRunningActivity();
// We want to immediately deliver the intent to the activity if:
// - It is currently resumed or paused. i.e. it is currently visible to the user and we want
@@ -1604,11 +1592,6 @@
mUpdateTaskThumbnailWhenHidden = false;
}
setVisibility(visible);
- final ArrayList<ActivityContainer> containers = mChildContainers;
- for (int containerNdx = containers.size() - 1; containerNdx >= 0; --containerNdx) {
- final ActivityContainer container = containers.get(containerNdx);
- container.setVisible(visible);
- }
mStackSupervisor.mAppVisibilitiesChangedSinceLastPause = true;
}
@@ -1626,20 +1609,12 @@
*
* @see {@link ActivityStack#checkKeyguardVisibility}
*/
- boolean shouldBeVisibleIgnoringKeyguard(boolean behindTranslucentActivity,
- boolean stackVisibleBehind, ActivityRecord visibleBehind,
- boolean behindFullscreenActivity) {
+ boolean shouldBeVisibleIgnoringKeyguard(boolean behindFullscreenActivity) {
if (!okToShowLocked()) {
return false;
}
- // mLaunchingBehind: Activities launching behind are at the back of the task stack
- // but must be drawn initially for the animation as though they were visible.
- final boolean activityVisibleBehind =
- (behindTranslucentActivity || stackVisibleBehind) && visibleBehind == this;
-
- boolean isVisible =
- !behindFullscreenActivity || mLaunchTaskBehind || activityVisibleBehind;
+ boolean isVisible = !behindFullscreenActivity || mLaunchTaskBehind;
if (service.mSupportsLeanbackOnly && isVisible && isRecentsActivity()) {
// On devices that support leanback only (Android TV), Recents activity can only be
@@ -1751,11 +1726,14 @@
returningOptions = null;
- if (stack.getVisibleBehindActivity() == this) {
- // When resuming an activity, require it to call requestVisibleBehind() again.
- stack.setVisibleBehindActivity(null /* ActivityRecord */);
+ if (canTurnScreenOn()) {
+ mStackSupervisor.wakeUp("turnScreenOnFlag");
+ } else {
+ // If the screen is going to turn on because the caller explicitly requested it and
+ // the keyguard is not showing don't attempt to sleep. Otherwise the Activity will
+ // pause and then resume again later, which will result in a double life-cycle event.
+ mStackSupervisor.checkReadyForSleepLocked();
}
- mStackSupervisor.checkReadyForSleepLocked();
}
final void activityStoppedLocked(Bundle newIcicle, PersistableBundle newPersistentState,
@@ -1788,9 +1766,6 @@
mWindowContainerController.notifyAppStopped();
- if (stack.getVisibleBehindActivity() == this) {
- mStackSupervisor.requestVisibleBehindLocked(this, false /* visible */);
- }
if (finishing) {
clearOptionsLocked();
} else {
@@ -1805,7 +1780,7 @@
}
void startLaunchTickingLocked() {
- if (IS_USER_BUILD) {
+ if (Build.IS_USER) {
return;
}
if (launchTickTime == 0) {
@@ -2638,8 +2613,6 @@
startFreezingScreenLocked(app, 0);
- mStackSupervisor.removeChildActivityContainers(this);
-
try {
if (DEBUG_SWITCH || DEBUG_STATES) Slog.i(TAG_SWITCH,
"Moving to " + (andResume ? "RESUMED" : "PAUSED") + " Relaunching " + this
@@ -2818,7 +2791,7 @@
0 /* launchedFromPid */, launchedFromUid, launchedFromPackage, intent, resolvedType,
aInfo, service.getConfiguration(), null /* resultTo */, null /* resultWho */,
0 /* reqCode */, componentSpecified, false /* rootVoiceInteraction */,
- stackSupervisor, null /* container */, null /* options */, null /* sourceRecord */);
+ stackSupervisor, null /* options */, null /* sourceRecord */);
r.persistentState = persistentState;
r.taskDescription = taskDescription;
@@ -2845,6 +2818,44 @@
return info.applicationInfo.uid;
}
+ void setShowWhenLocked(boolean showWhenLocked) {
+ mShowWhenLocked = showWhenLocked;
+ }
+
+ /**
+ * @return true if the activity contains windows that have
+ * {@link LayoutParams#FLAG_SHOW_WHEN_LOCKED} set or if the activity has set
+ * {@link #mShowWhenLocked}.
+ */
+ boolean canShowWhenLocked() {
+ return mShowWhenLocked || service.mWindowManager.containsShowWhenLockedWindow(appToken);
+ }
+
+ void setTurnScreenOn(boolean turnScreenOn) {
+ mTurnScreenOn = turnScreenOn;
+ }
+
+ /**
+ * Determines whether this ActivityRecord can turn the screen on. It checks whether the flag
+ * {@link #mTurnScreenOn} is set and checks whether the ActivityRecord should be visible
+ * depending on Keyguard state
+ *
+ * @return true if the screen can be turned on, false otherwise.
+ */
+ boolean canTurnScreenOn() {
+ final ActivityStack stack = getStack();
+ return mTurnScreenOn && stack != null &&
+ stack.checkKeyguardVisibility(this, true /* shouldBeVisible */, true /* isTop */);
+ }
+
+ boolean getTurnScreenOnFlag() {
+ return mTurnScreenOn;
+ }
+
+ boolean isTopRunningActivity() {
+ return mStackSupervisor.topRunningActivityLocked() == this;
+ }
+
@Override
public String toString() {
if (stringName != null) {
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index 51e0e3b..9925ba0 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -30,6 +30,7 @@
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.FLAG_CAN_SHOW_WITH_INSECURE_KEYGUARD;
+import static android.view.Display.INVALID_DISPLAY;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ADD_REMOVE;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ALL;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_APP;
@@ -124,7 +125,6 @@
import com.android.internal.os.BatteryStatsImpl;
import com.android.server.Watchdog;
import com.android.server.am.ActivityManagerService.ItemMatcher;
-import com.android.server.am.ActivityStackSupervisor.ActivityContainer;
import com.android.server.wm.StackWindowController;
import com.android.server.wm.StackWindowListener;
import com.android.server.wm.WindowManagerService;
@@ -205,7 +205,7 @@
@Override
protected ConfigurationContainer getParent() {
- return mActivityContainer.mActivityDisplay;
+ return getDisplay();
}
@Override
@@ -230,9 +230,6 @@
static final int STACK_INVISIBLE = 0;
// Stack is considered visible
static final int STACK_VISIBLE = 1;
- // Stack is considered visible, but only becuase it has activity that is visible behind other
- // activities and there is a specific combination of stacks.
- static final int STACK_VISIBLE_ACTIVITY_BEHIND = 2;
@VisibleForTesting
/* The various modes for the method {@link #removeTask}. */
@@ -339,8 +336,8 @@
int mCurrentUser;
final int mStackId;
- final ActivityContainer mActivityContainer;
/** The other stacks, in order, on the attached display. Updated at attach/detach time. */
+ // TODO: This list doesn't belong here...
ArrayList<ActivityStack> mStacks;
/** The attached Display's unique identifier, or -1 if detached */
int mDisplayId;
@@ -365,8 +362,6 @@
static final int STOP_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 4;
static final int DESTROY_ACTIVITIES_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 5;
static final int TRANSLUCENT_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 6;
- static final int RELEASE_BACKGROUND_RESOURCES_TIMEOUT_MSG =
- ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 7;
private static class ScheduleDestroyArgs {
final ProcessRecord mOwner;
@@ -440,15 +435,6 @@
notifyActivityDrawnLocked(null);
}
} break;
- case RELEASE_BACKGROUND_RESOURCES_TIMEOUT_MSG: {
- synchronized (mService) {
- final ActivityRecord r = getVisibleBehindActivity();
- Slog.e(TAG, "Timeout waiting for cancelVisibleBehind player=" + r);
- if (r != null) {
- mService.killAppAtUsersRequest(r.app, null);
- }
- }
- } break;
}
}
}
@@ -461,24 +447,21 @@
return count;
}
- ActivityStack(ActivityStackSupervisor.ActivityContainer activityContainer,
- RecentTasks recentTasks, boolean onTop) {
- mActivityContainer = activityContainer;
- mStackSupervisor = activityContainer.getOuter();
- mService = mStackSupervisor.mService;
+ ActivityStack(ActivityStackSupervisor.ActivityDisplay display, int stackId,
+ ActivityStackSupervisor supervisor, RecentTasks recentTasks, boolean onTop) {
+ mStackSupervisor = supervisor;
+ mService = supervisor.mService;
mHandler = new ActivityStackHandler(mService.mHandler.getLooper());
mWindowManager = mService.mWindowManager;
- mStackId = activityContainer.mStackId;
+ mStackId = stackId;
mCurrentUser = mService.mUserController.getCurrentUserIdLocked();
mRecentTasks = recentTasks;
mTaskPositioner = mStackId == FREEFORM_WORKSPACE_STACK_ID
? new LaunchingTaskPositioner() : null;
- final ActivityStackSupervisor.ActivityDisplay display = mActivityContainer.mActivityDisplay;
mTmpRect2.setEmpty();
mWindowContainerController = createStackWindowController(display.mDisplayId, onTop,
mTmpRect2);
- activityContainer.mStack = this;
- mStackSupervisor.mActivityContainers.put(mStackId, activityContainer);
+ mStackSupervisor.mStacks.put(mStackId, this);
postAddToDisplay(display, mTmpRect2.isEmpty() ? null : mTmpRect2, onTop);
}
@@ -535,7 +518,11 @@
* either destroyed completely or re-parented.
*/
private void removeFromDisplay() {
- mDisplayId = Display.INVALID_DISPLAY;
+ final ActivityStackSupervisor.ActivityDisplay display = getDisplay();
+ if (display != null) {
+ display.detachStack(this);
+ }
+ mDisplayId = INVALID_DISPLAY;
mStacks = null;
if (mTaskPositioner != null) {
mTaskPositioner.reset();
@@ -551,14 +538,18 @@
/** Removes the stack completely. Also calls WindowManager to do the same on its side. */
void remove() {
removeFromDisplay();
- mStackSupervisor.deleteActivityContainerRecord(mStackId);
+ mStackSupervisor.mStacks.remove(mStackId);
mWindowContainerController.removeContainer();
mWindowContainerController = null;
onParentChanged();
}
+ ActivityStackSupervisor.ActivityDisplay getDisplay() {
+ return mStackSupervisor.getActivityDisplay(mDisplayId);
+ }
+
void getDisplaySize(Point out) {
- mActivityContainer.mActivityDisplay.mDisplay.getSize(out);
+ getDisplay().mDisplay.getSize(out);
}
/**
@@ -843,8 +834,7 @@
}
final boolean isOnHomeDisplay() {
- return isAttached() &&
- mActivityContainer.mActivityDisplay.mDisplayId == DEFAULT_DISPLAY;
+ return isAttached() && mDisplayId == DEFAULT_DISPLAY;
}
void moveToFront(String reason) {
@@ -1202,15 +1192,6 @@
if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Sleep still waiting to pause " + mPausingActivity);
return true;
}
-
- if (hasVisibleBehindActivity()) {
- // Stop visible behind activity before going to sleep.
- final ActivityRecord r = getVisibleBehindActivity();
- mStackSupervisor.mStoppingActivities.add(r);
- if (DEBUG_STATES) Slog.v(TAG_STATES, "Sleep still waiting to stop visible behind " + r);
- return true;
- }
-
return false;
}
@@ -1280,12 +1261,6 @@
return false;
}
- if (mActivityContainer.mParentActivity == null) {
- // Top level stack, not a child. Look for child stacks.
- mStackSupervisor.pauseChildStacks(prev, userLeaving, uiSleeping, resuming,
- pauseImmediately);
- }
-
if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to PAUSING: " + prev);
else if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Start pausing: " + prev);
mResumedActivity = null;
@@ -1429,8 +1404,7 @@
// We can't clobber it, because the stop confirmation will not be handled.
// We don't need to schedule another stop, we only need to let it happen.
prev.state = STOPPING;
- } else if ((!prev.visible && !hasVisibleBehindActivity())
- || mService.isSleepingOrShuttingDownLocked()) {
+ } else if (!prev.visible || mService.isSleepingOrShuttingDownLocked()) {
// Clear out any deferred client hide we might currently have.
prev.setDeferHidingClient(false);
// If we were visible then resumeTopActivities will release resources before
@@ -1635,8 +1609,8 @@
}
/**
- * Returns what the stack visibility should be: {@link #STACK_INVISIBLE}, {@link #STACK_VISIBLE}
- * or {@link #STACK_VISIBLE_ACTIVITY_BEHIND}.
+ * Returns what the stack visibility should be: {@link #STACK_INVISIBLE} or
+ * {@link #STACK_VISIBLE}.
*
* @param starting The currently starting activity or null if there is none.
*/
@@ -1661,14 +1635,6 @@
final ActivityStack topStack = getTopStackOnDisplay();
final int topStackId = topStack.mStackId;
- if (StackId.isBackdropToTranslucentActivity(mStackId)
- && hasVisibleBehindActivity() && StackId.isHomeOrRecentsStack(topStackId)
- && (topStack.topActivity() == null || !topStack.topActivity().fullscreen)) {
- // The fullscreen or assistant stack should be visible if it has a visible behind
- // activity behind the home or recents stack that is translucent.
- return STACK_VISIBLE_ACTIVITY_BEHIND;
- }
-
if (mStackId == DOCKED_STACK_ID) {
// If the assistant stack is focused and translucent, then the docked stack is always
// visible
@@ -1793,12 +1759,10 @@
boolean aboveTop = top != null;
final int stackVisibility = shouldBeVisible(starting);
final boolean stackInvisible = stackVisibility != STACK_VISIBLE;
- final boolean stackVisibleBehind = stackVisibility == STACK_VISIBLE_ACTIVITY_BEHIND;
boolean behindFullscreenActivity = stackInvisible;
boolean resumeNextActivity = mStackSupervisor.isFocusedStack(this)
&& (isInStackLocked(starting) == null);
boolean behindTranslucentActivity = false;
- final ActivityRecord visibleBehind = getVisibleBehindActivity();
for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
final TaskRecord task = mTaskHistory.get(taskNdx);
final ArrayList<ActivityRecord> activities = task.mActivities;
@@ -1823,7 +1787,6 @@
// Check whether activity should be visible without Keyguard influence
final boolean visibleIgnoringKeyguard = r.shouldBeVisibleIgnoringKeyguard(
- behindTranslucentActivity, stackVisibleBehind, visibleBehind,
behindFullscreenActivity);
r.visibleIgnoringKeyguard = visibleIgnoringKeyguard;
@@ -1875,7 +1838,7 @@
+ stackInvisible + " behindFullscreenActivity="
+ behindFullscreenActivity + " mLaunchTaskBehind="
+ r.mLaunchTaskBehind);
- makeInvisible(r, visibleBehind);
+ makeInvisible(r);
}
}
if (mStackId == FREEFORM_WORKSPACE_STACK_ID) {
@@ -1964,7 +1927,7 @@
final boolean isInPinnedStack = r.getStack().getStackId() == PINNED_STACK_ID;
final boolean keyguardShowing = mStackSupervisor.mKeyguardController.isKeyguardShowing();
final boolean keyguardLocked = mStackSupervisor.mKeyguardController.isKeyguardLocked();
- final boolean showWhenLocked = r.hasShowWhenLockedWindows() && !isInPinnedStack;
+ final boolean showWhenLocked = r.canShowWhenLocked() && !isInPinnedStack;
final boolean dismissKeyguard = r.hasDismissKeyguardWindows();
if (shouldBeVisible) {
if (dismissKeyguard && mTopDismissingKeyguardActivity == null) {
@@ -2002,8 +1965,7 @@
* {@link Display#FLAG_CAN_SHOW_WITH_INSECURE_KEYGUARD} applied.
*/
private boolean canShowWithInsecureKeyguard() {
- final ActivityStackSupervisor.ActivityDisplay activityDisplay
- = mActivityContainer.mActivityDisplay;
+ final ActivityStackSupervisor.ActivityDisplay activityDisplay = getDisplay();
if (activityDisplay == null) {
throw new IllegalStateException("Stack is not attached to any display, stackId="
+ mStackId);
@@ -2050,7 +2012,8 @@
return false;
}
- private void makeInvisible(ActivityRecord r, ActivityRecord visibleBehind) {
+ // TODO: Should probably be moved into ActivityRecord.
+ private void makeInvisible(ActivityRecord r) {
if (!r.visible) {
if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Already invisible: " + r);
return;
@@ -2086,14 +2049,8 @@
case RESUMED:
case PAUSING:
case PAUSED:
- // This case created for transitioning activities from
- // translucent to opaque {@link Activity#convertToOpaque}.
- if (visibleBehind == r) {
- releaseBackgroundResources(r);
- } else {
- addToStopping(r, true /* scheduleIdle */,
- canEnterPictureInPicture /* idleDelayed */);
- }
+ addToStopping(r, true /* scheduleIdle */,
+ canEnterPictureInPicture /* idleDelayed */);
break;
default:
@@ -2150,7 +2107,6 @@
* occurred and the activity will be notified immediately.
*/
void notifyActivityDrawnLocked(ActivityRecord r) {
- mActivityContainer.setDrawn();
if ((r == null)
|| (mUndrawnActivitiesBelowTopTranslucent.remove(r) &&
mUndrawnActivitiesBelowTopTranslucent.isEmpty())) {
@@ -2238,12 +2194,18 @@
} finally {
mStackSupervisor.inResumeTopActivity = false;
}
+
// When resuming the top activity, it may be necessary to pause the top activity (for
// example, returning to the lock screen. We suppress the normal pause logic in
// {@link #resumeTopActivityUncheckedLocked}, since the top activity is resumed at the end.
// We call the {@link ActivityStackSupervisor#checkReadyForSleepLocked} again here to ensure
- // any necessary pause logic occurs.
- mStackSupervisor.checkReadyForSleepLocked();
+ // any necessary pause logic occurs. In the case where the Activity will be shown regardless
+ // of the lock screen, the call to {@link ActivityStackSupervisor#checkReadyForSleepLocked}
+ // is skipped.
+ final ActivityRecord next = topRunningActivityLocked(true /* focusableOnly */);
+ if (next == null || !next.canTurnScreenOn()) {
+ mStackSupervisor.checkReadyForSleepLocked();
+ }
return result;
}
@@ -2272,12 +2234,8 @@
final boolean hasRunningActivity = next != null;
- final ActivityRecord parent = mActivityContainer.mParentActivity;
- final boolean isParentNotResumed = parent != null && parent.state != ActivityState.RESUMED;
- if (hasRunningActivity
- && (isParentNotResumed || !mActivityContainer.isAttachedLocked())) {
- // Do not resume this stack if its parent is not resumed.
- // TODO: If in a loop, make sure that parent stack resumeTopActivity is called 1st.
+ // TODO: Maybe this entire condition can get removed?
+ if (hasRunningActivity && getDisplay() == null) {
return false;
}
@@ -3845,7 +3803,7 @@
}
}
if (noActivitiesInStack) {
- mActivityContainer.onTaskListEmptyLocked();
+ remove();
}
}
@@ -3956,7 +3914,7 @@
destIntent, null /*ephemeralIntent*/, null, aInfo, null /*rInfo*/, null,
null, parent.appToken, null, 0, -1, parent.launchedFromUid,
parent.launchedFromPackage, -1, parent.launchedFromUid, 0, null,
- false, true, null, null, null, "navigateUpTo");
+ false, true, null, null, "navigateUpTo");
foundParentInTask = res == ActivityManager.START_SUCCESS;
} catch (RemoteException e) {
foundParentInTask = false;
@@ -4027,10 +3985,6 @@
// Get rid of any pending idle timeouts.
removeTimeoutsForActivityLocked(r);
- if (getVisibleBehindActivity() == r) {
- mStackSupervisor.requestVisibleBehindLocked(r, false);
- }
-
// Clean-up activities are no longer relaunching (e.g. app process died). Notify window
// manager so it can update its bookkeeping.
mWindowManager.notifyAppRelaunchesCleared(r.appToken);
@@ -4045,7 +3999,6 @@
}
private void removeActivityFromHistoryLocked(ActivityRecord r, String reason) {
- mStackSupervisor.removeChildActivityContainers(r);
finishActivityResultsLocked(r, Activity.RESULT_CANCELED, null);
r.makeFinishingLocked();
if (DEBUG_ADD_REMOVE) Slog.i(TAG_ADD_REMOVE,
@@ -4334,56 +4287,6 @@
}
}
- void releaseBackgroundResources(ActivityRecord r) {
- if (hasVisibleBehindActivity() &&
- !mHandler.hasMessages(RELEASE_BACKGROUND_RESOURCES_TIMEOUT_MSG)) {
- if (r == topRunningActivityLocked()
- && shouldBeVisible(null) == STACK_VISIBLE) {
- // Don't release the top activity if it has requested to run behind the next
- // activity and the stack is currently visible.
- return;
- }
- if (DEBUG_STATES) Slog.d(TAG_STATES, "releaseBackgroundResources activtyDisplay=" +
- mActivityContainer.mActivityDisplay + " visibleBehind=" + r + " app=" + r.app +
- " thread=" + r.app.thread);
- if (r != null && r.app != null && r.app.thread != null) {
- try {
- r.app.thread.scheduleCancelVisibleBehind(r.appToken);
- } catch (RemoteException e) {
- }
- mHandler.sendEmptyMessageDelayed(RELEASE_BACKGROUND_RESOURCES_TIMEOUT_MSG, 500);
- } else {
- Slog.e(TAG, "releaseBackgroundResources: activity " + r + " no longer running");
- backgroundResourcesReleased();
- }
- }
- }
-
- final void backgroundResourcesReleased() {
- mHandler.removeMessages(RELEASE_BACKGROUND_RESOURCES_TIMEOUT_MSG);
- final ActivityRecord r = getVisibleBehindActivity();
- if (r != null) {
- mStackSupervisor.mStoppingActivities.add(r);
- setVisibleBehindActivity(null);
- mStackSupervisor.scheduleIdleTimeoutLocked(null);
- }
- mStackSupervisor.resumeFocusedStackTopActivityLocked();
- }
-
- boolean hasVisibleBehindActivity() {
- return isAttached() && mActivityContainer.mActivityDisplay.hasVisibleBehindActivity();
- }
-
- void setVisibleBehindActivity(ActivityRecord r) {
- if (isAttached()) {
- mActivityContainer.mActivityDisplay.setVisibleBehindActivity(r);
- }
- }
-
- ActivityRecord getVisibleBehindActivity() {
- return isAttached() ? mActivityContainer.mActivityDisplay.mVisibleBehindActivity : null;
- }
-
private void removeHistoryRecordsForAppLocked(ArrayList<ActivityRecord> list,
ProcessRecord app, String listName) {
int i = list.size();
@@ -4647,28 +4550,6 @@
if (DEBUG_TRANSITION) Slog.v(TAG_TRANSITION, "Prepare to back transition: task=" + taskId);
- if (mStackId == HOME_STACK_ID && topTask().isHomeTask()) {
- // For the case where we are moving the home task back and there is an activity visible
- // behind it on the fullscreen or assistant stack, we want to move the focus to the
- // visible behind activity to maintain order with what the user is seeing.
- ActivityRecord visibleBehind = null;
- final ActivityStack fullscreenStack =
- mStackSupervisor.getStack(FULLSCREEN_WORKSPACE_STACK_ID);
- final ActivityStack assistantStack =
- mStackSupervisor.getStack(ASSISTANT_STACK_ID);
- if (fullscreenStack != null && fullscreenStack.hasVisibleBehindActivity()) {
- visibleBehind = fullscreenStack.getVisibleBehindActivity();
- } else if (assistantStack != null && assistantStack.hasVisibleBehindActivity()) {
- visibleBehind = assistantStack.getVisibleBehindActivity();
- }
- if (visibleBehind != null) {
- mStackSupervisor.moveFocusableActivityStackToFrontLocked(visibleBehind,
- "moveTaskToBack");
- mStackSupervisor.resumeFocusedStackTopActivityLocked();
- return true;
- }
- }
-
boolean prevIsHome = false;
// If true, we should resume the home activity next if the task we are moving to the
@@ -4732,7 +4613,7 @@
* focus may be on another display.
*/
private ActivityStack getTopStackOnDisplay() {
- final ArrayList<ActivityStack> stacks = mActivityContainer.mActivityDisplay.mStacks;
+ final ArrayList<ActivityStack> stacks = getDisplay().mStacks;
return stacks.isEmpty() ? null : stacks.get(stacks.size() - 1);
}
@@ -5209,7 +5090,7 @@
mStacks.add(0, this);
}
if (!isHomeOrRecentsStack()) {
- mActivityContainer.onTaskListEmptyLocked();
+ remove();
}
}
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index f3963ed..5f42cdb 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -17,7 +17,6 @@
package com.android.server.am;
import static android.Manifest.permission.INTERNAL_SYSTEM_WINDOW;
-import static android.Manifest.permission.MANAGE_ACTIVITY_STACKS;
import static android.Manifest.permission.START_ANY_ACTIVITY;
import static android.Manifest.permission.START_TASKS_FROM_RECENTS;
import static android.app.ActivityManager.LOCK_TASK_MODE_LOCKED;
@@ -36,10 +35,9 @@
import static android.app.ActivityManager.StackId.RECENTS_STACK_ID;
import static android.app.ITaskStackListener.FORCED_RESIZEABLE_REASON_SECONDARY_DISPLAY;
import static android.app.ITaskStackListener.FORCED_RESIZEABLE_REASON_SPLIT_SCREEN;
-import static android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
-import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.os.Process.SYSTEM_UID;
+import static android.os.PowerManager.PARTIAL_WAKE_LOCK;
import static android.os.Trace.TRACE_TAG_ACTIVITY_MANAGER;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.FLAG_PRIVATE;
@@ -49,7 +47,6 @@
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_PICTURE_IN_PICTURE_EXPANDED_TO_FULLSCREEN;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ALL;
-import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_CONTAINERS;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_FOCUS;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_IDLE;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_LOCKTASK;
@@ -60,7 +57,6 @@
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_STATES;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_SWITCH;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_TASKS;
-import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_VISIBLE_BEHIND;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_CONTAINERS;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_FOCUS;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_IDLE;
@@ -72,7 +68,6 @@
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_STATES;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_SWITCH;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_TASKS;
-import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_VISIBLE_BEHIND;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.am.ActivityManagerService.ANIMATE;
@@ -112,7 +107,6 @@
import android.app.ActivityManager.StackInfo;
import android.app.ActivityOptions;
import android.app.AppOpsManager;
-import android.app.IActivityContainerCallback;
import android.app.ProfilerInfo;
import android.app.ResultInfo;
import android.app.StatusBarManager;
@@ -120,7 +114,6 @@
import android.app.admin.IDevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
-import android.content.IIntentSender;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
@@ -132,10 +125,7 @@
import android.graphics.Rect;
import android.hardware.display.DisplayManager;
import android.hardware.display.DisplayManager.DisplayListener;
-import android.hardware.display.DisplayManagerGlobal;
import android.hardware.display.DisplayManagerInternal;
-import android.hardware.display.VirtualDisplay;
-import android.hardware.input.InputManager;
import android.hardware.input.InputManagerInternal;
import android.os.Binder;
import android.os.Bundle;
@@ -151,7 +141,6 @@
import android.os.ServiceManager;
import android.os.SystemClock;
import android.os.Trace;
-import android.os.TransactionTooLargeException;
import android.os.UserHandle;
import android.os.UserManager;
import android.os.WorkSource;
@@ -168,9 +157,8 @@
import android.util.SparseArray;
import android.util.SparseIntArray;
import android.view.Display;
-import android.view.InputEvent;
-import android.view.Surface;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.content.ReferrerIntent;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.os.TransferPipe;
@@ -194,7 +182,6 @@
public class ActivityStackSupervisor extends ConfigurationContainer implements DisplayListener {
private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityStackSupervisor" : TAG_AM;
- private static final String TAG_CONTAINERS = TAG + POSTFIX_CONTAINERS;
private static final String TAG_FOCUS = TAG + POSTFIX_FOCUS;
private static final String TAG_IDLE = TAG + POSTFIX_IDLE;
private static final String TAG_LOCKTASK = TAG + POSTFIX_LOCKTASK;
@@ -205,7 +192,6 @@
private static final String TAG_STATES = TAG + POSTFIX_STATES;
private static final String TAG_SWITCH = TAG + POSTFIX_SWITCH;
static final String TAG_TASKS = TAG + POSTFIX_TASKS;
- private static final String TAG_VISIBLE_BEHIND = TAG + POSTFIX_VISIBLE_BEHIND;
/** How long we wait until giving up on the last activity telling us it is idle. */
static final int IDLE_TIMEOUT = 10 * 1000;
@@ -224,10 +210,8 @@
static final int HANDLE_DISPLAY_ADDED = FIRST_SUPERVISOR_STACK_MSG + 5;
static final int HANDLE_DISPLAY_CHANGED = FIRST_SUPERVISOR_STACK_MSG + 6;
static final int HANDLE_DISPLAY_REMOVED = FIRST_SUPERVISOR_STACK_MSG + 7;
- static final int CONTAINER_CALLBACK_VISIBILITY = FIRST_SUPERVISOR_STACK_MSG + 8;
static final int LOCK_TASK_START_MSG = FIRST_SUPERVISOR_STACK_MSG + 9;
static final int LOCK_TASK_END_MSG = FIRST_SUPERVISOR_STACK_MSG + 10;
- static final int CONTAINER_CALLBACK_TASK_LIST_EMPTY = FIRST_SUPERVISOR_STACK_MSG + 11;
static final int LAUNCH_TASK_BEHIND_COMPLETE = FIRST_SUPERVISOR_STACK_MSG + 12;
static final int SHOW_LOCK_TASK_ESCAPE_MESSAGE_MSG = FIRST_SUPERVISOR_STACK_MSG + 13;
static final int REPORT_MULTI_WINDOW_MODE_CHANGED_MSG = FIRST_SUPERVISOR_STACK_MSG + 14;
@@ -414,7 +398,7 @@
// TODO: Add listener for removal of references.
/** Mapping from (ActivityStack/TaskStack).mStackId to their current state */
- SparseArray<ActivityContainer> mActivityContainers = new SparseArray<>();
+ SparseArray<ActivityStack> mStacks = new SparseArray<>();
// TODO: There should be an ActivityDisplayController coordinating am/wm interaction.
/** Mapping from displayId to display current state */
@@ -491,9 +475,27 @@
}
/** Check if placing task or activity on specified display is allowed. */
- boolean canPlaceEntityOnDisplay(int displayId, boolean resizeable) {
- return displayId == DEFAULT_DISPLAY || (mService.mSupportsMultiDisplay
- && (resizeable || displayConfigMatchesGlobal(displayId)));
+ boolean canPlaceEntityOnDisplay(int displayId, boolean resizeable, int callingPid,
+ int callingUid, ActivityInfo activityInfo) {
+ if (displayId == DEFAULT_DISPLAY) {
+ // No restrictions for the default display.
+ return true;
+ }
+ if (!mService.mSupportsMultiDisplay) {
+ // Can't launch on secondary displays if feature is not supported.
+ return false;
+ }
+ if (!resizeable && !displayConfigMatchesGlobal(displayId)) {
+ // Can't apply wrong configuration to non-resizeable activities.
+ return false;
+ }
+ if (!isCallerAllowedToLaunchOnDisplay(callingPid, callingUid, displayId, activityInfo)) {
+ // Can't place activities to a display that has restricted launch rules.
+ // In this case the request should be made by explicitly adding target display id and
+ // by caller with corresponding permissions. See #isCallerAllowedToLaunchOnDisplay().
+ return false;
+ }
+ return true;
}
/**
@@ -557,6 +559,9 @@
final KeyguardController mKeyguardController;
+ private PowerManager mPowerManager;
+ private int mDeferResumeCount;
+
/**
* Description of a request to start a new activity, which has been held
* due to app switches being disabled.
@@ -605,9 +610,10 @@
* initialized. So we initialize our wakelocks afterwards.
*/
void initPowerManagement() {
- PowerManager pm = (PowerManager)mService.mContext.getSystemService(Context.POWER_SERVICE);
- mGoingToSleep = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Sleep");
- mLaunchingActivity = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*launch*");
+ mPowerManager = (PowerManager)mService.mContext.getSystemService(Context.POWER_SERVICE);
+ mGoingToSleep = mPowerManager
+ .newWakeLock(PARTIAL_WAKE_LOCK, "ActivityManager-Sleep");
+ mLaunchingActivity = mPowerManager.newWakeLock(PARTIAL_WAKE_LOCK, "*launch*");
mLaunchingActivity.setReferenceCounted(false);
}
@@ -676,31 +682,15 @@
}
boolean isFocusedStack(ActivityStack stack) {
- if (stack == null) {
- return false;
- }
-
- final ActivityRecord parent = stack.mActivityContainer.mParentActivity;
- if (parent != null) {
- stack = parent.getStack();
- }
- return stack == mFocusedStack;
+ return stack != null && stack == mFocusedStack;
}
/** The top most stack on its display. */
boolean isFrontStackOnDisplay(ActivityStack stack) {
- return isFrontOfStackList(stack, stack.mActivityContainer.mActivityDisplay.mStacks);
+ return isFrontOfStackList(stack, stack.getDisplay().mStacks);
}
private boolean isFrontOfStackList(ActivityStack stack, List<ActivityStack> stackList) {
- if (stack == null) {
- return false;
- }
-
- final ActivityRecord parent = stack.mActivityContainer.mParentActivity;
- if (parent != null) {
- stack = parent.getStack();
- }
return stack == stackList.get((stackList.size() - 1));
}
@@ -1093,21 +1083,6 @@
return pausing;
}
- void pauseChildStacks(ActivityRecord parent, boolean userLeaving, boolean uiSleeping,
- ActivityRecord resuming, boolean dontWait) {
- // TODO: Put all stacks in supervisor and iterate through them instead.
- for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
- ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
- for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
- final ActivityStack stack = stacks.get(stackNdx);
- if (stack.mResumedActivity != null &&
- stack.mActivityContainer.mParentActivity == parent) {
- stack.startPausingLocked(userLeaving, uiSleeping, resuming, dontWait);
- }
- }
- }
- }
-
void cancelInitializingActivities() {
for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
@@ -1335,184 +1310,187 @@
return false;
}
- r.startFreezingScreenLocked(app, 0);
- if (r.getStack().checkKeyguardVisibility(r, true /* shouldBeVisible */, true /* isTop */)) {
- // We only set the visibility to true if the activity is allowed to be visible based on
- // keyguard state. This avoids setting this into motion in window manager that is later
- // cancelled due to later calls to ensure visible activities that set visibility back to
- // false.
- r.setVisibility(true);
- }
-
- // schedule launch ticks to collect information about slow apps.
- r.startLaunchTickingLocked();
-
- // Have the window manager re-evaluate the orientation of the screen based on the new
- // activity order. Note that as a result of this, it can call back into the activity
- // manager with a new orientation. We don't care about that, because the activity is not
- // currently running so we are just restarting it anyway.
- if (checkConfig) {
- final int displayId = r.getDisplayId();
- final Configuration config = mWindowManager.updateOrientationFromAppTokens(
- getDisplayOverrideConfiguration(displayId),
- r.mayFreezeScreenLocked(app) ? r.appToken : null, displayId);
- // Deferring resume here because we're going to launch new activity shortly.
- // We don't want to perform a redundant launch of the same record while ensuring
- // configurations and trying to resume top activity of focused stack.
- mService.updateDisplayOverrideConfigurationLocked(config, r, true /* deferResume */,
- displayId);
- }
-
- if (mKeyguardController.isKeyguardLocked()) {
- r.notifyUnknownVisibilityLaunched();
- }
- final int applicationInfoUid =
- (r.info.applicationInfo != null) ? r.info.applicationInfo.uid : -1;
- if ((r.userId != app.userId) || (r.appInfo.uid != applicationInfoUid)) {
- Slog.wtf(TAG,
- "User ID for activity changing for " + r
- + " appInfo.uid=" + r.appInfo.uid
- + " info.ai.uid=" + applicationInfoUid
- + " old=" + r.app + " new=" + app);
- }
-
- r.app = app;
- app.waitingToKill = null;
- r.launchCount++;
- r.lastLaunchTime = SystemClock.uptimeMillis();
-
- if (DEBUG_ALL) Slog.v(TAG, "Launching: " + r);
-
- int idx = app.activities.indexOf(r);
- if (idx < 0) {
- app.activities.add(r);
- }
- mService.updateLruProcessLocked(app, true, null);
- mService.updateOomAdjLocked();
-
final TaskRecord task = r.getTask();
- if (task.mLockTaskAuth == LOCK_TASK_AUTH_LAUNCHABLE ||
- task.mLockTaskAuth == LOCK_TASK_AUTH_LAUNCHABLE_PRIV) {
- setLockTaskModeLocked(task, LOCK_TASK_MODE_LOCKED, "mLockTaskAuth==LAUNCHABLE", false);
- }
-
final ActivityStack stack = task.getStack();
+
+ beginDeferResume();
+
try {
- if (app.thread == null) {
- throw new RemoteException();
+ r.startFreezingScreenLocked(app, 0);
+
+ // schedule launch ticks to collect information about slow apps.
+ r.startLaunchTickingLocked();
+
+ r.app = app;
+
+ // Have the window manager re-evaluate the orientation of the screen based on the new
+ // activity order. Note that as a result of this, it can call back into the activity
+ // manager with a new orientation. We don't care about that, because the activity is
+ // not currently running so we are just restarting it anyway.
+ if (checkConfig) {
+ final int displayId = r.getDisplayId();
+ final Configuration config = mWindowManager.updateOrientationFromAppTokens(
+ getDisplayOverrideConfiguration(displayId),
+ r.mayFreezeScreenLocked(app) ? r.appToken : null, displayId);
+ // Deferring resume here because we're going to launch new activity shortly.
+ // We don't want to perform a redundant launch of the same record while ensuring
+ // configurations and trying to resume top activity of focused stack.
+ mService.updateDisplayOverrideConfigurationLocked(config, r, true /* deferResume */,
+ displayId);
}
- List<ResultInfo> results = null;
- List<ReferrerIntent> newIntents = null;
- if (andResume) {
- // We don't need to deliver new intents and/or set results if activity is going
- // to pause immediately after launch.
- results = r.results;
- newIntents = r.newIntents;
+
+ if (r.getStack().checkKeyguardVisibility(r, true /* shouldBeVisible */,
+ true /* isTop */)) {
+ // We only set the visibility to true if the activity is allowed to be visible
+ // based on
+ // keyguard state. This avoids setting this into motion in window manager that is
+ // later cancelled due to later calls to ensure visible activities that set
+ // visibility back to false.
+ r.setVisibility(true);
}
- if (DEBUG_SWITCH) Slog.v(TAG_SWITCH,
- "Launching: " + r + " icicle=" + r.icicle + " with results=" + results
- + " newIntents=" + newIntents + " andResume=" + andResume);
- EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY, r.userId,
- System.identityHashCode(r), task.taskId, r.shortComponentName);
- if (r.isHomeActivity()) {
- // Home process is the root process of the task.
- mService.mHomeProcess = task.mActivities.get(0).app;
+
+ if (mKeyguardController.isKeyguardLocked()) {
+ r.notifyUnknownVisibilityLaunched();
}
- mService.notifyPackageUse(r.intent.getComponent().getPackageName(),
- PackageManager.NOTIFY_PACKAGE_USE_ACTIVITY);
- r.sleeping = false;
- r.forceNewConfig = false;
- mService.showUnsupportedZoomDialogIfNeededLocked(r);
- mService.showAskCompatModeDialogLocked(r);
- r.compat = mService.compatibilityInfoForPackageLocked(r.info.applicationInfo);
- ProfilerInfo profilerInfo = null;
- if (mService.mProfileApp != null && mService.mProfileApp.equals(app.processName)) {
- if (mService.mProfileProc == null || mService.mProfileProc == app) {
- mService.mProfileProc = app;
- final String profileFile = mService.mProfileFile;
- if (profileFile != null) {
- ParcelFileDescriptor profileFd = mService.mProfileFd;
- if (profileFd != null) {
- try {
- profileFd = profileFd.dup();
- } catch (IOException e) {
- if (profileFd != null) {
- try {
- profileFd.close();
- } catch (IOException o) {
- }
- profileFd = null;
+ final int applicationInfoUid =
+ (r.info.applicationInfo != null) ? r.info.applicationInfo.uid : -1;
+ if ((r.userId != app.userId) || (r.appInfo.uid != applicationInfoUid)) {
+ Slog.wtf(TAG,
+ "User ID for activity changing for " + r
+ + " appInfo.uid=" + r.appInfo.uid
+ + " info.ai.uid=" + applicationInfoUid
+ + " old=" + r.app + " new=" + app);
+ }
+
+ app.waitingToKill = null;
+ r.launchCount++;
+ r.lastLaunchTime = SystemClock.uptimeMillis();
+
+ if (DEBUG_ALL) Slog.v(TAG, "Launching: " + r);
+
+ int idx = app.activities.indexOf(r);
+ if (idx < 0) {
+ app.activities.add(r);
+ }
+ mService.updateLruProcessLocked(app, true, null);
+ mService.updateOomAdjLocked();
+
+ if (task.mLockTaskAuth == LOCK_TASK_AUTH_LAUNCHABLE ||
+ task.mLockTaskAuth == LOCK_TASK_AUTH_LAUNCHABLE_PRIV) {
+ setLockTaskModeLocked(task, LOCK_TASK_MODE_LOCKED, "mLockTaskAuth==LAUNCHABLE",
+ false);
+ }
+
+ try {
+ if (app.thread == null) {
+ throw new RemoteException();
+ }
+ List<ResultInfo> results = null;
+ List<ReferrerIntent> newIntents = null;
+ if (andResume) {
+ // We don't need to deliver new intents and/or set results if activity is going
+ // to pause immediately after launch.
+ results = r.results;
+ newIntents = r.newIntents;
+ }
+ if (DEBUG_SWITCH) Slog.v(TAG_SWITCH,
+ "Launching: " + r + " icicle=" + r.icicle + " with results=" + results
+ + " newIntents=" + newIntents + " andResume=" + andResume);
+ EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY, r.userId,
+ System.identityHashCode(r), task.taskId, r.shortComponentName);
+ if (r.isHomeActivity()) {
+ // Home process is the root process of the task.
+ mService.mHomeProcess = task.mActivities.get(0).app;
+ }
+ mService.notifyPackageUse(r.intent.getComponent().getPackageName(),
+ PackageManager.NOTIFY_PACKAGE_USE_ACTIVITY);
+ r.sleeping = false;
+ r.forceNewConfig = false;
+ mService.showUnsupportedZoomDialogIfNeededLocked(r);
+ mService.showAskCompatModeDialogLocked(r);
+ r.compat = mService.compatibilityInfoForPackageLocked(r.info.applicationInfo);
+ ProfilerInfo profilerInfo = null;
+ if (mService.mProfileApp != null && mService.mProfileApp.equals(app.processName)) {
+ if (mService.mProfileProc == null || mService.mProfileProc == app) {
+ mService.mProfileProc = app;
+ ProfilerInfo profilerInfoSvc = mService.mProfilerInfo;
+ if (profilerInfoSvc != null && profilerInfoSvc.profileFile != null) {
+ if (profilerInfoSvc.profileFd != null) {
+ try {
+ profilerInfoSvc.profileFd = profilerInfoSvc.profileFd.dup();
+ } catch (IOException e) {
+ profilerInfoSvc.closeFd();
}
}
+
+ profilerInfo = new ProfilerInfo(profilerInfoSvc);
}
-
- profilerInfo = new ProfilerInfo(profileFile, profileFd,
- mService.mSamplingInterval, mService.mAutoStopProfiler,
- mService.mStreamingOutput);
}
}
- }
- app.hasShownUi = true;
- app.pendingUiClean = true;
- app.forceProcessStateUpTo(mService.mTopProcessState);
- // Because we could be starting an Activity in the system process this may not go across
- // a Binder interface which would create a new Configuration. Consequently we have to
- // always create a new Configuration here.
+ app.hasShownUi = true;
+ app.pendingUiClean = true;
+ app.forceProcessStateUpTo(mService.mTopProcessState);
+ // Because we could be starting an Activity in the system process this may not go
+ // across a Binder interface which would create a new Configuration. Consequently
+ // we have to always create a new Configuration here.
- final MergedConfiguration mergedConfiguration = new MergedConfiguration(
- mService.getGlobalConfiguration(), r.getMergedOverrideConfiguration());
- r.setLastReportedConfiguration(mergedConfiguration);
+ final MergedConfiguration mergedConfiguration = new MergedConfiguration(
+ mService.getGlobalConfiguration(), r.getMergedOverrideConfiguration());
+ r.setLastReportedConfiguration(mergedConfiguration);
- logIfTransactionTooLarge(r.intent, r.icicle);
- app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
- System.identityHashCode(r), r.info,
- // TODO: Have this take the merged configuration instead of separate global and
- // override configs.
- mergedConfiguration.getGlobalConfiguration(),
- mergedConfiguration.getOverrideConfiguration(), r.compat,
- r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle,
- r.persistentState, results, newIntents, !andResume,
- mService.isNextTransitionForward(), profilerInfo);
+ logIfTransactionTooLarge(r.intent, r.icicle);
+ app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
+ System.identityHashCode(r), r.info,
+ // TODO: Have this take the merged configuration instead of separate global
+ // and override configs.
+ mergedConfiguration.getGlobalConfiguration(),
+ mergedConfiguration.getOverrideConfiguration(), r.compat,
+ r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle,
+ r.persistentState, results, newIntents, !andResume,
+ mService.isNextTransitionForward(), profilerInfo);
- if ((app.info.privateFlags&ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE) != 0) {
- // This may be a heavy-weight process! Note that the package
- // manager will ensure that only activity can run in the main
- // process of the .apk, which is the only thing that will be
- // considered heavy-weight.
- if (app.processName.equals(app.info.packageName)) {
- if (mService.mHeavyWeightProcess != null
- && mService.mHeavyWeightProcess != app) {
- Slog.w(TAG, "Starting new heavy weight process " + app
- + " when already running "
- + mService.mHeavyWeightProcess);
+ if ((app.info.privateFlags & ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE) != 0) {
+ // This may be a heavy-weight process! Note that the package
+ // manager will ensure that only activity can run in the main
+ // process of the .apk, which is the only thing that will be
+ // considered heavy-weight.
+ if (app.processName.equals(app.info.packageName)) {
+ if (mService.mHeavyWeightProcess != null
+ && mService.mHeavyWeightProcess != app) {
+ Slog.w(TAG, "Starting new heavy weight process " + app
+ + " when already running "
+ + mService.mHeavyWeightProcess);
+ }
+ mService.mHeavyWeightProcess = app;
+ Message msg = mService.mHandler.obtainMessage(
+ ActivityManagerService.POST_HEAVY_NOTIFICATION_MSG);
+ msg.obj = r;
+ mService.mHandler.sendMessage(msg);
}
- mService.mHeavyWeightProcess = app;
- Message msg = mService.mHandler.obtainMessage(
- ActivityManagerService.POST_HEAVY_NOTIFICATION_MSG);
- msg.obj = r;
- mService.mHandler.sendMessage(msg);
}
- }
- } catch (RemoteException e) {
- if (r.launchFailed) {
- // This is the second time we failed -- finish activity
- // and give up.
- Slog.e(TAG, "Second failure launching "
- + r.intent.getComponent().flattenToShortString()
- + ", giving up", e);
- mService.appDiedLocked(app);
- stack.requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null,
- "2nd-crash", false);
- return false;
- }
+ } catch (RemoteException e) {
+ if (r.launchFailed) {
+ // This is the second time we failed -- finish activity
+ // and give up.
+ Slog.e(TAG, "Second failure launching "
+ + r.intent.getComponent().flattenToShortString()
+ + ", giving up", e);
+ mService.appDiedLocked(app);
+ stack.requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null,
+ "2nd-crash", false);
+ return false;
+ }
- // This is the first time we failed -- restart process and
- // retry.
- r.launchFailed = true;
- app.activities.remove(r);
- throw e;
+ // This is the first time we failed -- restart process and
+ // retry.
+ r.launchFailed = true;
+ app.activities.remove(r);
+ throw e;
+ }
+ } finally {
+ endDeferResume();
}
r.launchFailed = false;
@@ -1520,7 +1498,7 @@
Slog.w(TAG, "Activity " + r + " being launched, but already in LRU list");
}
- if (andResume) {
+ if (andResume && readyToResume()) {
// As part of the process of launching, ActivityThread also performs
// a resume.
stack.minimalResumeActivityLocked(r);
@@ -1672,8 +1650,8 @@
// Check if someone tries to launch an activity on a private display with a different
// owner.
final int launchDisplayId = options.getLaunchDisplayId();
- if (launchDisplayId != INVALID_DISPLAY
- && !isCallerAllowedToLaunchOnDisplay(callingPid, callingUid, launchDisplayId)) {
+ if (launchDisplayId != INVALID_DISPLAY && !isCallerAllowedToLaunchOnDisplay(callingPid,
+ callingUid, launchDisplayId, aInfo)) {
final String msg = "Permission Denial: starting " + intent.toString()
+ " from " + callerApp + " (pid=" + callingPid
+ ", uid=" + callingUid + ") with launchDisplayId="
@@ -1687,17 +1665,24 @@
}
/** Check if caller is allowed to launch activities on specified display. */
- boolean isCallerAllowedToLaunchOnDisplay(int callingPid, int callingUid, int launchDisplayId) {
+ boolean isCallerAllowedToLaunchOnDisplay(int callingPid, int callingUid, int launchDisplayId,
+ ActivityInfo aInfo) {
if (DEBUG_TASKS) Slog.d(TAG, "Launch on display check: displayId=" + launchDisplayId
+ " callingPid=" + callingPid + " callingUid=" + callingUid);
+ if (callingPid == -1 && callingUid == -1) {
+ if (DEBUG_TASKS) Slog.d(TAG, "Launch on display check: no caller info, skip check");
+ return true;
+ }
+
final ActivityDisplay activityDisplay = getActivityDisplayOrCreateLocked(launchDisplayId);
if (activityDisplay == null) {
Slog.w(TAG, "Launch on display check: display not found");
return false;
}
- // Check if the caller can manage activity stacks.
+ // Check if the caller has enough privileges to embed activities and launch to private
+ // displays.
final int startAnyPerm = mService.checkPermission(INTERNAL_SYSTEM_WINDOW, callingPid,
callingUid);
if (startAnyPerm == PERMISSION_GRANTED) {
@@ -1707,12 +1692,15 @@
}
if (activityDisplay.mDisplay.getType() == TYPE_VIRTUAL
- && activityDisplay.mDisplay.getOwnerUid() != SYSTEM_UID) {
+ && activityDisplay.mDisplay.getOwnerUid() != SYSTEM_UID
+ && activityDisplay.mDisplay.getOwnerUid() != aInfo.applicationInfo.uid) {
// Limit launching on virtual displays, because their contents can be read from Surface
// by apps that created them.
- if (DEBUG_TASKS) Slog.d(TAG, "Launch on display check:"
- + " disallow launch on virtual display for not-embedded activity");
- return false;
+ if ((aInfo.flags & ActivityInfo.FLAG_ALLOW_EMBEDDED) == 0) {
+ if (DEBUG_TASKS) Slog.d(TAG, "Launch on display check:"
+ + " disallow launch on virtual display for not-embedded activity.");
+ return false;
+ }
}
if (!activityDisplay.isPrivate()) {
@@ -2074,9 +2062,15 @@
boolean resumeFocusedStackTopActivityLocked(
ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) {
+
+ if (!readyToResume()) {
+ return false;
+ }
+
if (targetStack != null && isFocusedStack(targetStack)) {
return targetStack.resumeTopActivityUncheckedLocked(target, targetOptions);
}
+
final ActivityRecord r = mFocusedStack.topRunningActivityLocked();
if (r == null || r.state != RESUMED) {
mFocusedStack.resumeTopActivityUncheckedLocked(null, null);
@@ -2084,6 +2078,7 @@
// Kick off any lingering app transitions form the MoveTaskToFront operation.
mFocusedStack.executeAppTransition(targetOptions);
}
+
return false;
}
@@ -2196,9 +2191,9 @@
protected <T extends ActivityStack> T getStack(int stackId, boolean createStaticStackIfNeeded,
boolean createOnTop) {
- final ActivityContainer activityContainer = mActivityContainers.get(stackId);
- if (activityContainer != null) {
- return (T) activityContainer.mStack;
+ final ActivityStack stack = mStacks.get(stackId);
+ if (stack != null) {
+ return (T) stack;
}
if (!createStaticStackIfNeeded || !StackId.isStaticStack(stackId)) {
return null;
@@ -2341,33 +2336,6 @@
(StackId.isResizeableByDockedStack(stackId) && getStack(DOCKED_STACK_ID) != null);
}
- ActivityContainer createVirtualActivityContainer(ActivityRecord parentActivity,
- IActivityContainerCallback callback) {
- ActivityContainer activityContainer =
- new VirtualActivityContainer(parentActivity, callback);
- mActivityContainers.put(activityContainer.mStackId, activityContainer);
- if (DEBUG_CONTAINERS) Slog.d(TAG_CONTAINERS,
- "createActivityContainer: " + activityContainer);
- parentActivity.mChildContainers.add(activityContainer);
- return activityContainer;
- }
-
- void removeChildActivityContainers(ActivityRecord parentActivity) {
- final ArrayList<ActivityContainer> childStacks = parentActivity.mChildContainers;
- for (int containerNdx = childStacks.size() - 1; containerNdx >= 0; --containerNdx) {
- ActivityContainer container = childStacks.remove(containerNdx);
- if (DEBUG_CONTAINERS) Slog.d(TAG_CONTAINERS, "removeChildActivityContainers: removing "
- + container);
- container.release();
- }
- }
-
- void deleteActivityContainerRecord(int stackId) {
- if (DEBUG_CONTAINERS) Slog.d(TAG_CONTAINERS,
- "deleteActivityContainerRecord: callers=" + Debug.getCallers(4));
- mActivityContainers.remove(stackId);
- }
-
void resizeStackLocked(int stackId, Rect bounds, Rect tempTaskBounds, Rect tempTaskInsetBounds,
boolean preserveWindows, boolean allowResizeInDockedMode, boolean deferResume) {
if (stackId == DOCKED_STACK_ID) {
@@ -2632,12 +2600,18 @@
if (activityDisplay == null) {
return null;
}
+ return createStack(stackId, activityDisplay, onTop);
- final ActivityContainer activityContainer =
- new ActivityContainer(stackId, activityDisplay, onTop);
- return activityContainer.mStack;
}
+ ActivityStack createStack(int stackId, ActivityDisplay display, boolean onTop) {
+ switch (stackId) {
+ case PINNED_STACK_ID:
+ return new PinnedActivityStack(display, stackId, this, mRecentTasks, onTop);
+ default:
+ return new ActivityStack(display, stackId, this, mRecentTasks, onTop);
+ }
+ }
void removeStackInSurfaceTransaction(int stackId) {
final ActivityStack stack = getStack(stackId);
@@ -2865,23 +2839,24 @@
throw new IllegalArgumentException("moveStackToDisplayLocked: Unknown displayId="
+ displayId);
}
- final ActivityContainer activityContainer = mActivityContainers.get(stackId);
- if (activityContainer != null) {
- if (activityContainer.isAttachedLocked()) {
- if (activityContainer.getDisplayId() == displayId) {
- throw new IllegalArgumentException("Trying to move stackId=" + stackId
- + " to its current displayId=" + displayId);
- }
-
- activityContainer.moveToDisplayLocked(activityDisplay, onTop);
- } else {
- throw new IllegalStateException("moveStackToDisplayLocked: Stack with stackId="
- + stackId + " is not attached to any display.");
- }
- } else {
+ final ActivityStack stack = mStacks.get(stackId);
+ if (stack == null) {
throw new IllegalArgumentException("moveStackToDisplayLocked: Unknown stackId="
+ stackId);
}
+
+ final ActivityDisplay currentDisplay = stack.getDisplay();
+ if (currentDisplay == null) {
+ throw new IllegalStateException("moveStackToDisplayLocked: Stack with stack=" + stack
+ + " is not attached to any display.");
+ }
+
+ if (currentDisplay.mDisplayId == displayId) {
+ throw new IllegalArgumentException("Trying to move stack=" + stack
+ + " to its current displayId=" + displayId);
+ }
+
+ stack.reparent(activityDisplay, onTop);
// TODO(multi-display): resize stacks properly if moved from split-screen.
}
@@ -2909,7 +2884,6 @@
// Ensure that we're not moving a task to a dynamic stack if device doesn't support
// multi-display.
// TODO(multi-display): Support non-dynamic stacks on secondary displays.
- // TODO: Check ActivityView after fixing b/35349678.
if (StackId.isDynamicStack(stackId) && !mService.mSupportsMultiDisplay) {
throw new IllegalArgumentException("Device doesn't support multi-display, can not"
+ " reparent task=" + task + " to stackId=" + stackId);
@@ -2983,13 +2957,6 @@
try {
final TaskRecord task = r.getTask();
-
- if (r == task.getStack().getVisibleBehindActivity()) {
- // An activity can't be pinned and visible behind at the same time. Go ahead and
- // release it from been visible behind before pinning.
- requestVisibleBehindLocked(r, false);
- }
-
// Resize the pinned stack to match the current size of the task the activity we are
// going to be moving is currently contained in. We do this to have the right starting
// animation bounds for the pinned stack to the desired bounds the caller wants.
@@ -3100,11 +3067,6 @@
+ stack);
continue;
}
- if (!stack.mActivityContainer.isEligibleForNewTasks()) {
- if (DEBUG_TASKS) Slog.d(TAG_TASKS,
- "Skipping stack: (new task not allowed) " + stack);
- continue;
- }
stack.findTaskLocked(r, mTmpFindTaskResult);
// 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
@@ -3312,70 +3274,6 @@
}
}
- boolean requestVisibleBehindLocked(ActivityRecord r, boolean visible) {
- final ActivityStack stack = r.getStack();
- if (stack == null) {
- if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG_VISIBLE_BEHIND,
- "requestVisibleBehind: r=" + r + " visible=" + visible + " stack is null");
- return false;
- }
-
- if (visible && !StackId.activitiesCanRequestVisibleBehind(stack.mStackId)) {
- if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG_VISIBLE_BEHIND, "requestVisibleBehind: r=" + r
- + " visible=" + visible + " stackId=" + stack.mStackId
- + " can't contain visible behind activities");
- return false;
- }
-
- final boolean isVisible = stack.hasVisibleBehindActivity();
- if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG_VISIBLE_BEHIND,
- "requestVisibleBehind r=" + r + " visible=" + visible + " isVisible=" + isVisible);
-
- final ActivityRecord top = topRunningActivityLocked();
- if (top == null || top == r || (visible == isVisible)) {
- if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG_VISIBLE_BEHIND, "requestVisibleBehind: quick return");
- stack.setVisibleBehindActivity(visible ? r : null);
- return true;
- }
-
- // A non-top activity is reporting a visibility change.
- if (visible && top.fullscreen) {
- // Let the caller know that it can't be seen.
- if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG_VISIBLE_BEHIND,
- "requestVisibleBehind: returning top.fullscreen=" + top.fullscreen
- + " top.state=" + top.state + " top.app=" + top.app + " top.app.thread="
- + top.app.thread);
- return false;
- } else if (!visible && stack.getVisibleBehindActivity() != r) {
- // Only the activity set as currently visible behind should actively reset its
- // visible behind state.
- if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG_VISIBLE_BEHIND,
- "requestVisibleBehind: returning visible=" + visible
- + " stack.getVisibleBehindActivity()=" + stack.getVisibleBehindActivity()
- + " r=" + r);
- return false;
- }
-
- stack.setVisibleBehindActivity(visible ? r : null);
- if (!visible) {
- // If there is a translucent home activity, we need to force it stop being translucent,
- // because we can't depend on the application to necessarily perform that operation.
- // Check out b/14469711 for details.
- final ActivityRecord next = stack.findNextTranslucentActivity(r);
- if (next != null && next.isHomeActivity()) {
- mService.convertFromTranslucent(next.appToken);
- }
- }
- if (top.app != null && top.app.thread != null) {
- // Notify the top app of the change.
- try {
- top.app.thread.scheduleBackgroundVisibleBehindChanged(top.appToken, visible);
- } catch (RemoteException e) {
- }
- }
- return true;
- }
-
// Called when WindowManager has finished animating the launchingBehind activity to the back.
private void handleLaunchTaskBehindCompleteLocked(ActivityRecord r) {
final TaskRecord task = r.getTask();
@@ -3683,7 +3581,7 @@
pw.print(prefix);
pw.println("mCurTaskIdForUser=" + mCurTaskIdForUser);
pw.print(prefix); pw.println("mUserStackInFront=" + mUserStackInFront);
- pw.print(prefix); pw.println("mActivityContainers=" + mActivityContainers);
+ pw.print(prefix); pw.println("mStacks=" + mStacks);
pw.print(prefix); pw.print("mLockTaskModeState=" + lockTaskModeToString());
final SparseArray<String[]> packages = mService.mLockTaskPackages;
if (packages.size() > 0) {
@@ -3977,6 +3875,10 @@
return getActivityDisplayOrCreateLocked(displayId) != null;
}
+ ActivityDisplay getActivityDisplay(int displayId) {
+ return mActivityDisplays.get(displayId);
+ }
+
/**
* Get an existing instance of {@link ActivityDisplay} or create new if there is a
* corresponding record in display manager.
@@ -4433,6 +4335,31 @@
mIsDockMinimized = minimized;
}
+ void wakeUp(String reason) {
+ mPowerManager.wakeUp(SystemClock.uptimeMillis(), "android.server.am:TURN_ON:" + reason);
+ }
+
+ /**
+ * Begin deferring resume to avoid duplicate resumes in one pass.
+ */
+ private void beginDeferResume() {
+ mDeferResumeCount++;
+ }
+
+ /**
+ * End deferring resume and determine if resume can be called.
+ */
+ private void endDeferResume() {
+ mDeferResumeCount--;
+ }
+
+ /**
+ * @return True if resume can be called.
+ */
+ private boolean readyToResume() {
+ return mDeferResumeCount == 0;
+ }
+
private final class ActivityStackSupervisorHandler extends Handler {
public ActivityStackSupervisorHandler(Looper looper) {
@@ -4513,16 +4440,6 @@
case HANDLE_DISPLAY_REMOVED: {
handleDisplayRemoved(msg.arg1);
} break;
- case CONTAINER_CALLBACK_VISIBILITY: {
- final ActivityContainer container = (ActivityContainer) msg.obj;
- final IActivityContainerCallback callback = container.mCallback;
- if (callback != null) {
- try {
- callback.setVisible(container.asBinder(), msg.arg1 == 1);
- } catch (RemoteException e) {
- }
- }
- } break;
case LOCK_TASK_START_MSG: {
// When lock task starts, we disable the status bars.
try {
@@ -4595,16 +4512,6 @@
}
mLockTaskNotify.showToast(LOCK_TASK_MODE_PINNED);
} break;
- case CONTAINER_CALLBACK_TASK_LIST_EMPTY: {
- final ActivityContainer container = (ActivityContainer) msg.obj;
- final IActivityContainerCallback callback = container.mCallback;
- if (callback != null) {
- try {
- callback.onAllActivitiesComplete(container.asBinder());
- } catch (RemoteException e) {
- }
- }
- } break;
case LAUNCH_TASK_BEHIND_COMPLETE: {
synchronized (mService) {
ActivityRecord r = ActivityRecord.forTokenLocked((IBinder) msg.obj);
@@ -4618,340 +4525,7 @@
}
}
- class ActivityContainer extends android.app.IActivityContainer.Stub {
- final static int FORCE_NEW_TASK_FLAGS = FLAG_ACTIVITY_NEW_TASK |
- FLAG_ACTIVITY_MULTIPLE_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION;
- final int mStackId;
- IActivityContainerCallback mCallback = null;
- ActivityStack mStack;
- ActivityRecord mParentActivity = null;
- String mIdString;
-
- boolean mVisible = true;
-
- /** Display this ActivityStack is currently on. Null if not attached to a Display. */
- ActivityDisplay mActivityDisplay;
-
- final static int CONTAINER_STATE_HAS_SURFACE = 0;
- final static int CONTAINER_STATE_NO_SURFACE = 1;
- final static int CONTAINER_STATE_FINISHING = 2;
- int mContainerState = CONTAINER_STATE_HAS_SURFACE;
-
- ActivityContainer(int stackId, ActivityDisplay activityDisplay, boolean onTop) {
- synchronized (mService) {
- mStackId = stackId;
- mActivityDisplay = activityDisplay;
- mIdString = "ActivtyContainer{" + mStackId + "}";
-
- createStack(stackId, onTop);
- if (DEBUG_STACK) Slog.d(TAG_STACK, "Creating " + this);
- }
- }
-
- protected void createStack(int stackId, boolean onTop) {
- switch (stackId) {
- case PINNED_STACK_ID:
- new PinnedActivityStack(this, mRecentTasks, onTop);
- break;
- default:
- new ActivityStack(this, mRecentTasks, onTop);
- break;
- }
- }
-
- /**
- * Adds the stack to specified display. Also calls WindowManager to do the same from
- * {@link ActivityStack#reparent(ActivityDisplay, boolean)}.
- * @param activityDisplay The display to add the stack to.
- */
- void addToDisplayLocked(ActivityDisplay activityDisplay) {
- if (DEBUG_STACK) Slog.d(TAG_STACK, "addToDisplayLocked: " + this
- + " to display=" + activityDisplay);
- if (mActivityDisplay != null) {
- throw new IllegalStateException("ActivityContainer is already attached, " +
- "displayId=" + mActivityDisplay.mDisplayId);
- }
- mActivityDisplay = activityDisplay;
- mStack.reparent(activityDisplay, true /* onTop */);
- }
-
- @Override
- public void addToDisplay(int displayId) {
- synchronized (mService) {
- final ActivityDisplay activityDisplay = getActivityDisplayOrCreateLocked(displayId);
- if (activityDisplay == null) {
- return;
- }
- addToDisplayLocked(activityDisplay);
- }
- }
-
- @Override
- public int getDisplayId() {
- synchronized (mService) {
- if (mActivityDisplay != null) {
- return mActivityDisplay.mDisplayId;
- }
- }
- return -1;
- }
-
- @Override
- public int getStackId() {
- synchronized (mService) {
- return mStackId;
- }
- }
-
- @Override
- public boolean injectEvent(InputEvent event) {
- final long origId = Binder.clearCallingIdentity();
- try {
- synchronized (mService) {
- if (mActivityDisplay != null) {
- return mInputManagerInternal.injectInputEvent(event,
- mActivityDisplay.mDisplayId,
- InputManager.INJECT_INPUT_EVENT_MODE_ASYNC);
- }
- }
- return false;
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- }
-
- @Override
- public void release() {
- synchronized (mService) {
- if (mContainerState == CONTAINER_STATE_FINISHING) {
- return;
- }
- mContainerState = CONTAINER_STATE_FINISHING;
-
- long origId = Binder.clearCallingIdentity();
- try {
- mStack.finishAllActivitiesLocked(false);
- mService.mActivityStarter.removePendingActivityLaunchesLocked(mStack);
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- }
- }
-
- /**
- * Remove the stack completely. Must be called only when there are no tasks left in it,
- * as this method does not finish running activities.
- */
- void removeLocked() {
- if (DEBUG_STACK) Slog.d(TAG_STACK, "removeLocked: " + this + " from display="
- + mActivityDisplay + " Callers=" + Debug.getCallers(2));
- if (mActivityDisplay != null) {
- removeFromDisplayLocked();
- }
- mStack.remove();
- }
-
- /**
- * Remove the stack from its current {@link ActivityDisplay}, so it can be either destroyed
- * completely or re-parented.
- */
- private void removeFromDisplayLocked() {
- if (DEBUG_STACK) Slog.d(TAG_STACK, "removeFromDisplayLocked: " + this
- + " current displayId=" + mActivityDisplay.mDisplayId);
-
- mActivityDisplay.detachStack(mStack);
- mActivityDisplay = null;
- }
-
- /**
- * Move the stack to specified display.
- * @param activityDisplay Target display to move the stack to.
- * @param onTop Indicates whether container should be place on top or on bottom.
- */
- void moveToDisplayLocked(ActivityDisplay activityDisplay, boolean onTop) {
- if (DEBUG_STACK) Slog.d(TAG_STACK, "moveToDisplayLocked: " + this + " from display="
- + mActivityDisplay + " to display=" + activityDisplay
- + " Callers=" + Debug.getCallers(2));
-
- removeFromDisplayLocked();
-
- mActivityDisplay = activityDisplay;
- mStack.reparent(activityDisplay, onTop);
- }
-
- @Override
- public final int startActivity(Intent intent) {
- return mService.startActivity(intent, this);
- }
-
- @Override
- public final int startActivityIntentSender(IIntentSender intentSender)
- throws TransactionTooLargeException {
- mService.enforceNotIsolatedCaller("ActivityContainer.startActivityIntentSender");
-
- if (!(intentSender instanceof PendingIntentRecord)) {
- throw new IllegalArgumentException("Bad PendingIntent object");
- }
-
- final int userId = mService.mUserController.handleIncomingUser(Binder.getCallingPid(),
- Binder.getCallingUid(), mCurrentUser, false,
- ActivityManagerService.ALLOW_FULL_ONLY, "ActivityContainer", null);
-
- final PendingIntentRecord pendingIntent = (PendingIntentRecord) intentSender;
- checkEmbeddedAllowedInner(userId, pendingIntent.key.requestIntent,
- pendingIntent.key.requestResolvedType);
-
- return pendingIntent.sendInner(0, null, null, null, null, null, null, null, 0,
- FORCE_NEW_TASK_FLAGS, FORCE_NEW_TASK_FLAGS, null, this);
- }
-
- void checkEmbeddedAllowedInner(int userId, Intent intent, String resolvedType) {
- ActivityInfo aInfo = resolveActivity(intent, resolvedType, 0, null, userId);
- if (aInfo != null && (aInfo.flags & ActivityInfo.FLAG_ALLOW_EMBEDDED) == 0) {
- throw new SecurityException(
- "Attempt to embed activity that has not set allowEmbedded=\"true\"");
- }
- }
-
- @Override
- public IBinder asBinder() {
- return this;
- }
-
- @Override
- public void setSurface(Surface surface, int width, int height, int density) {
- mService.enforceNotIsolatedCaller("ActivityContainer.attachToSurface");
- }
-
- ActivityStackSupervisor getOuter() {
- return ActivityStackSupervisor.this;
- }
-
- boolean isAttachedLocked() {
- return mActivityDisplay != null;
- }
-
- // TODO: Make sure every change to ActivityRecord.visible results in a call to this.
- void setVisible(boolean visible) {
- if (mVisible != visible) {
- mVisible = visible;
- if (mCallback != null) {
- mHandler.obtainMessage(CONTAINER_CALLBACK_VISIBILITY, visible ? 1 : 0,
- 0 /* unused */, this).sendToTarget();
- }
- }
- }
-
- void setDrawn() {
- }
-
- // You can always start a new task on a regular ActivityStack.
- boolean isEligibleForNewTasks() {
- return true;
- }
-
- void onTaskListEmptyLocked() {
- removeLocked();
- mHandler.obtainMessage(CONTAINER_CALLBACK_TASK_LIST_EMPTY, this).sendToTarget();
- }
-
- @Override
- public String toString() {
- return mIdString + (mActivityDisplay == null ? "N" : "A");
- }
- }
-
- private class VirtualActivityContainer extends ActivityContainer {
- Surface mSurface;
- boolean mDrawn = false;
-
- VirtualActivityContainer(ActivityRecord parent, IActivityContainerCallback callback) {
- super(getNextStackId(), parent.getStack().mActivityContainer.mActivityDisplay,
- true /* onTop */);
- mParentActivity = parent;
- mCallback = callback;
- mContainerState = CONTAINER_STATE_NO_SURFACE;
- mIdString = "VirtualActivityContainer{" + mStackId + ", parent=" + mParentActivity + "}";
- }
-
- @Override
- public void setSurface(Surface surface, int width, int height, int density) {
- super.setSurface(surface, width, height, density);
-
- synchronized (mService) {
- final long origId = Binder.clearCallingIdentity();
- try {
- setSurfaceLocked(surface, width, height, density);
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- }
- }
-
- private void setSurfaceLocked(Surface surface, int width, int height, int density) {
- if (mContainerState == CONTAINER_STATE_FINISHING) {
- return;
- }
- VirtualActivityDisplay virtualActivityDisplay =
- (VirtualActivityDisplay) mActivityDisplay;
- if (virtualActivityDisplay == null) {
- virtualActivityDisplay =
- new VirtualActivityDisplay(width, height, density);
- mActivityDisplay = virtualActivityDisplay;
- mActivityDisplays.put(virtualActivityDisplay.mDisplayId, virtualActivityDisplay);
- addToDisplayLocked(virtualActivityDisplay);
- }
-
- if (mSurface != null) {
- mSurface.release();
- }
-
- mSurface = surface;
- if (surface != null) {
- resumeFocusedStackTopActivityLocked();
- } else {
- mContainerState = CONTAINER_STATE_NO_SURFACE;
- ((VirtualActivityDisplay) mActivityDisplay).setSurface(null);
- if (mStack.mPausingActivity == null && mStack.mResumedActivity != null) {
- mStack.startPausingLocked(false, true, null, false);
- }
- }
-
- setSurfaceIfReadyLocked();
-
- if (DEBUG_STACK) Slog.d(TAG_STACK,
- "setSurface: " + this + " to display=" + virtualActivityDisplay);
- }
-
- @Override
- boolean isAttachedLocked() {
- return mSurface != null && super.isAttachedLocked();
- }
-
- @Override
- void setDrawn() {
- synchronized (mService) {
- mDrawn = true;
- setSurfaceIfReadyLocked();
- }
- }
-
- // Never start a new task on an ActivityView if it isn't explicitly specified.
- @Override
- boolean isEligibleForNewTasks() {
- return false;
- }
-
- private void setSurfaceIfReadyLocked() {
- if (DEBUG_STACK) Slog.v(TAG_STACK, "setSurfaceIfReadyLocked: mDrawn=" + mDrawn +
- " mContainerState=" + mContainerState + " mSurface=" + mSurface);
- if (mDrawn && mSurface != null && mContainerState == CONTAINER_STATE_NO_SURFACE) {
- ((VirtualActivityDisplay) mActivityDisplay).setSurface(mSurface);
- mContainerState = CONTAINER_STATE_HAS_SURFACE;
- }
- }
- }
-
+ // TODO: Move to its own file.
/** Exactly one of these classes per Display in the system. Capable of holding zero or more
* attached {@link ActivityStack}s */
class ActivityDisplay extends ConfigurationContainer {
@@ -4963,12 +4537,12 @@
* stacks, bottommost behind. Accessed directly by ActivityManager package classes */
final ArrayList<ActivityStack> mStacks = new ArrayList<>();
- ActivityRecord mVisibleBehindActivity;
-
/** Array of all UIDs that are present on the display. */
private IntArray mDisplayAccessUIDs = new IntArray();
+ @VisibleForTesting
ActivityDisplay() {
+ mActivityDisplays.put(mDisplayId, this);
}
// After instantiation, check that mDisplay is not null before using this. The alternative
@@ -4998,14 +4572,6 @@
mStacks.remove(stack);
}
- void setVisibleBehindActivity(ActivityRecord r) {
- mVisibleBehindActivity = r;
- }
-
- boolean hasVisibleBehindActivity() {
- return mVisibleBehindActivity != null;
- }
-
@Override
public String toString() {
return "ActivityDisplay={" + mDisplayId + " numStacks=" + mStacks.size() + "}";
@@ -5053,43 +4619,6 @@
}
}
- class VirtualActivityDisplay extends ActivityDisplay {
- VirtualDisplay mVirtualDisplay;
-
- VirtualActivityDisplay(int width, int height, int density) {
- DisplayManagerGlobal dm = DisplayManagerGlobal.getInstance();
- mVirtualDisplay = dm.createVirtualDisplay(mService.mContext, null /* projection */,
- VIRTUAL_DISPLAY_BASE_NAME, width, height, density, null /* surface */,
- DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC |
- DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY, null /* callback */,
- null /* handler */, null /* uniqueId */);
-
- init(mVirtualDisplay.getDisplay());
-
- mWindowManager.onDisplayAdded(mDisplayId);
- }
-
- void setSurface(Surface surface) {
- if (mVirtualDisplay != null) {
- mVirtualDisplay.setSurface(surface);
- }
- }
-
- @Override
- void detachStack(ActivityStack stack) {
- super.detachStack(stack);
- if (mVirtualDisplay != null) {
- mVirtualDisplay.release();
- mVirtualDisplay = null;
- }
- }
-
- @Override
- public String toString() {
- return "VirtualActivityDisplay={" + mDisplayId + "}";
- }
- }
-
ActivityStack findStackBehind(ActivityStack stack) {
// TODO(multi-display): We are only looking for stacks on the default display.
final ActivityDisplay display = mActivityDisplays.get(DEFAULT_DISPLAY);
@@ -5199,7 +4728,7 @@
intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);
userId = task.userId;
int result = mService.startActivityInPackage(callingUid, callingPackage, intent, null,
- null, null, 0, 0, bOptions, userId, null, task, "startActivityFromRecents");
+ null, null, 0, 0, bOptions, userId, task, "startActivityFromRecents");
if (launchStackId == DOCKED_STACK_ID) {
setResizingDuringAnimation(task);
}
diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java
index 76f65e2..0931587 100644
--- a/services/core/java/com/android/server/am/ActivityStarter.java
+++ b/services/core/java/com/android/server/am/ActivityStarter.java
@@ -90,12 +90,10 @@
import android.app.ActivityManager;
import android.app.ActivityOptions;
import android.app.AppGlobals;
-import android.app.IActivityContainer;
import android.app.IApplicationThread;
import android.app.PendingIntent;
import android.app.ProfilerInfo;
import android.app.WaitResult;
-import android.content.ComponentName;
import android.content.IIntentSender;
import android.content.Intent;
import android.content.IntentSender;
@@ -260,8 +258,7 @@
IBinder resultTo, String resultWho, int requestCode, int callingPid, int callingUid,
String callingPackage, int realCallingPid, int realCallingUid, int startFlags,
ActivityOptions options, boolean ignoreTargetSecurity, boolean componentSpecified,
- ActivityRecord[] outActivity, ActivityStackSupervisor.ActivityContainer container,
- TaskRecord inTask, String reason) {
+ ActivityRecord[] outActivity, TaskRecord inTask, String reason) {
if (TextUtils.isEmpty(reason)) {
throw new IllegalArgumentException("Need to specify a reason.");
@@ -274,7 +271,7 @@
aInfo, rInfo, voiceSession, voiceInteractor, resultTo, resultWho, requestCode,
callingPid, callingUid, callingPackage, realCallingPid, realCallingUid, startFlags,
options, ignoreTargetSecurity, componentSpecified, mLastStartActivityRecord,
- container, inTask);
+ inTask);
if (outActivity != null) {
// mLastStartActivityRecord[0] is set in the call to startActivity above.
@@ -292,8 +289,7 @@
IBinder resultTo, String resultWho, int requestCode, int callingPid, int callingUid,
String callingPackage, int realCallingPid, int realCallingUid, int startFlags,
ActivityOptions options, boolean ignoreTargetSecurity, boolean componentSpecified,
- ActivityRecord[] outActivity, ActivityStackSupervisor.ActivityContainer container,
- TaskRecord inTask) {
+ ActivityRecord[] outActivity, TaskRecord inTask) {
int err = ActivityManager.START_SUCCESS;
// Pull the optional Ephemeral Installer-only bundle out of the options early.
final Bundle verificationBundle
@@ -505,10 +501,8 @@
if (DEBUG_PERMISSIONS_REVIEW) {
Slog.i(TAG, "START u" + userId + " {" + intent.toShortString(true, true,
true, false) + "} from uid " + callingUid + " on display "
- + (container == null ? (mSupervisor.mFocusedStack == null ?
- DEFAULT_DISPLAY : mSupervisor.mFocusedStack.mDisplayId) :
- (container.mActivityDisplay == null ? DEFAULT_DISPLAY :
- container.mActivityDisplay.mDisplayId)));
+ + (mSupervisor.mFocusedStack == null
+ ? DEFAULT_DISPLAY : mSupervisor.mFocusedStack.mDisplayId));
}
}
}
@@ -530,7 +524,7 @@
ActivityRecord r = new ActivityRecord(mService, callerApp, callingPid, callingUid,
callingPackage, intent, resolvedType, aInfo, mService.getGlobalConfiguration(),
resultRecord, resultWho, requestCode, componentSpecified, voiceSession != null,
- mSupervisor, container, options, sourceRecord);
+ mSupervisor, options, sourceRecord);
if (outActivity != null) {
outActivity[0] = r;
}
@@ -649,7 +643,7 @@
null /*callingPackage*/, 0 /*realCallingPid*/, 0 /*realCallingUid*/,
0 /*startFlags*/, null /*options*/, false /*ignoreTargetSecurity*/,
false /*componentSpecified*/, mLastHomeActivityStartRecord /*outActivity*/,
- null /*container*/, null /*inTask*/, "startHomeActivity: " + reason);
+ null /*inTask*/, "startHomeActivity: " + reason);
if (mSupervisor.inResumeTopActivity) {
// If we are in resume section already, home activity will be initialized, but not
// resumed (to avoid recursive resume) and will stay that way until something pokes it
@@ -674,7 +668,7 @@
IBinder resultTo, String resultWho, int requestCode, int startFlags,
ProfilerInfo profilerInfo, WaitResult outResult,
Configuration globalConfig, Bundle bOptions, boolean ignoreTargetSecurity, int userId,
- IActivityContainer iContainer, TaskRecord inTask, String reason) {
+ TaskRecord inTask, String reason) {
// Refuse possible leaked file descriptors
if (intent != null && intent.hasFileDescriptors()) {
throw new IllegalArgumentException("File descriptors passed in Intent");
@@ -727,14 +721,7 @@
ActivityInfo aInfo = mSupervisor.resolveActivity(intent, rInfo, startFlags, profilerInfo);
ActivityOptions options = ActivityOptions.fromBundle(bOptions);
- ActivityStackSupervisor.ActivityContainer container =
- (ActivityStackSupervisor.ActivityContainer)iContainer;
synchronized (mService) {
- if (container != null && container.mParentActivity != null &&
- container.mParentActivity.state != RESUMED) {
- // Cannot start a child activity if the parent is not resumed.
- return ActivityManager.START_CANCELED;
- }
final int realCallingPid = Binder.getCallingPid();
final int realCallingUid = Binder.getCallingUid();
int callingPid;
@@ -747,12 +734,7 @@
callingPid = callingUid = -1;
}
- final ActivityStack stack;
- if (container == null || container.mStack.isOnHomeDisplay()) {
- stack = mSupervisor.mFocusedStack;
- } else {
- stack = container.mStack;
- }
+ final ActivityStack stack = mSupervisor.mFocusedStack;
stack.mConfigWillChange = globalConfig != null
&& mService.getGlobalConfiguration().diff(globalConfig) != 0;
if (DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION,
@@ -828,8 +810,8 @@
aInfo, rInfo, voiceSession, voiceInteractor,
resultTo, resultWho, requestCode, callingPid,
callingUid, callingPackage, realCallingPid, realCallingUid, startFlags,
- options, ignoreTargetSecurity, componentSpecified, outRecord, container,
- inTask, reason);
+ options, ignoreTargetSecurity, componentSpecified, outRecord, inTask,
+ reason);
Binder.restoreCallingIdentity(origId);
@@ -954,7 +936,7 @@
resolvedTypes[i], aInfo, null /*rInfo*/, null, null, resultTo, null, -1,
callingPid, callingUid, callingPackage,
realCallingPid, realCallingUid, 0,
- options, false, componentSpecified, outActivity, null, null, reason);
+ options, false, componentSpecified, outActivity, null, reason);
if (res < 0) {
return res;
}
@@ -1853,13 +1835,30 @@
final TaskRecord sourceTask = mSourceRecord.getTask();
final ActivityStack sourceStack = mSourceRecord.getStack();
- // We only want to allow changing stack if the target task is not the top one,
- // otherwise we would move the launching task to the other side, rather than show
- // two side by side.
- final boolean moveStackAllowed = sourceStack.topTask() != sourceTask;
+ // We only want to allow changing stack in two cases:
+ // 1. If the target task is not the top one. Otherwise we would move the launching task to
+ // the other side, rather than show two side by side.
+ // 2. If activity is not allowed on target display.
+ final int targetDisplayId = mTargetStack != null ? mTargetStack.mDisplayId
+ : sourceStack.mDisplayId;
+ final boolean moveStackAllowed = sourceStack.topTask() != sourceTask
+ || !mStartActivity.canBeLaunchedOnDisplay(targetDisplayId);
if (moveStackAllowed) {
mTargetStack = getLaunchStack(mStartActivity, mLaunchFlags, mStartActivity.getTask(),
mOptions);
+ // If target stack is not found now - we can't just rely on the source stack, as it may
+ // be not suitable. Let's check other displays.
+ if (mTargetStack == null && targetDisplayId != sourceStack.mDisplayId) {
+ // Can't use target display, lets find a stack on the source display.
+ mTargetStack = mService.mStackSupervisor.getValidLaunchStackOnDisplay(
+ sourceStack.mDisplayId, mStartActivity);
+ }
+ if (mTargetStack == null) {
+ // There are no suitable stacks on the target and source display(s). Look on all
+ // displays.
+ mTargetStack = mService.mStackSupervisor.getNextValidLaunchStackLocked(
+ mStartActivity, -1 /* currentFocus */);
+ }
}
if (mTargetStack == null) {
@@ -2071,13 +2070,6 @@
return currentStack;
}
- final ActivityStackSupervisor.ActivityContainer container = r.mInitialActivityContainer;
- if (container != null) {
- // The first time put it on the desired stack, after this put on task stack.
- r.mInitialActivityContainer = null;
- return container.mStack;
- }
-
if (canLaunchIntoFocusedStack(r, newTask)) {
if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG_FOCUS,
"computeStackFocus: Have a focused stack=" + mSupervisor.mFocusedStack);
@@ -2142,13 +2134,11 @@
default:
// Dynamic stacks behave similarly to the fullscreen stack and can contain any
// resizeable task.
- // TODO: Check ActivityView after fixing b/35349678.
canUseFocusedStack = isDynamicStack(focusedStackId)
&& r.canBeLaunchedOnDisplay(focusedStack.mDisplayId);
}
- return canUseFocusedStack
- && (!newTask || focusedStack.mActivityContainer.isEligibleForNewTasks())
+ return canUseFocusedStack && !newTask
// We strongly prefer to launch activities on the same display as their source.
&& (mSourceDisplayId == focusedStack.mDisplayId);
}
@@ -2214,9 +2204,7 @@
// The parent activity doesn't want to launch the activity on top of itself, but
// instead tries to put it onto other side in side-by-side mode.
- final ActivityStack parentStack = task != null ? task.getStack()
- : r.mInitialActivityContainer != null ? r.mInitialActivityContainer.mStack
- : mSupervisor.mFocusedStack;
+ final ActivityStack parentStack = task != null ? task.getStack(): mSupervisor.mFocusedStack;
if (parentStack != mSupervisor.mFocusedStack) {
// If task's parent stack is not focused - use it during adjacent launch.
@@ -2267,7 +2255,6 @@
case ASSISTANT_STACK_ID:
return r.isAssistantActivity();
default:
- // TODO: Check ActivityView after fixing b/35349678.
if (StackId.isDynamicStack(stackId)) {
return r.canBeLaunchedOnDisplay(displayId);
}
diff --git a/services/core/java/com/android/server/am/AppErrorDialog.java b/services/core/java/com/android/server/am/AppErrorDialog.java
index c9c1d00..51ce30e 100644
--- a/services/core/java/com/android/server/am/AppErrorDialog.java
+++ b/services/core/java/com/android/server/am/AppErrorDialog.java
@@ -21,6 +21,7 @@
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Resources;
+import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
@@ -32,8 +33,6 @@
import android.widget.FrameLayout;
import android.widget.TextView;
-import static com.android.server.am.ActivityManagerService.IS_USER_BUILD;
-
final class AppErrorDialog extends BaseErrorDialog implements View.OnClickListener {
private final ActivityManagerService mService;
@@ -124,7 +123,7 @@
close.setVisibility(!hasRestart ? View.VISIBLE : View.GONE);
close.setOnClickListener(this);
- boolean showMute = !IS_USER_BUILD && Settings.Global.getInt(context.getContentResolver(),
+ boolean showMute = !Build.IS_USER && Settings.Global.getInt(context.getContentResolver(),
Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) != 0;
final TextView mute = findViewById(com.android.internal.R.id.aerr_mute);
mute.setOnClickListener(this);
diff --git a/services/core/java/com/android/server/am/AppErrors.java b/services/core/java/com/android/server/am/AppErrors.java
index 0d1c579..fc03db1 100644
--- a/services/core/java/com/android/server/am/AppErrors.java
+++ b/services/core/java/com/android/server/am/AppErrors.java
@@ -409,10 +409,9 @@
final Set<String> cats = task.intent.getCategories();
if (cats != null && cats.contains(Intent.CATEGORY_LAUNCHER)) {
mService.startActivityInPackage(task.mCallingUid,
- task.mCallingPackage, task.intent,
- null, null, null, 0, 0,
- ActivityOptions.makeBasic().toBundle(),
- task.userId, null, null, "AppErrors");
+ task.mCallingPackage, task.intent, null, null, null, 0, 0,
+ ActivityOptions.makeBasic().toBundle(), task.userId, null,
+ "AppErrors");
}
}
}
diff --git a/services/core/java/com/android/server/am/AppNotRespondingDialog.java b/services/core/java/com/android/server/am/AppNotRespondingDialog.java
index a3a6778..d9c6a30 100644
--- a/services/core/java/com/android/server/am/AppNotRespondingDialog.java
+++ b/services/core/java/com/android/server/am/AppNotRespondingDialog.java
@@ -35,8 +35,6 @@
import android.widget.FrameLayout;
import android.widget.TextView;
-import static com.android.server.am.ActivityManagerService.IS_USER_BUILD;
-
final class AppNotRespondingDialog extends BaseErrorDialog implements View.OnClickListener {
private static final String TAG = "AppNotRespondingDialog";
diff --git a/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java b/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java
new file mode 100644
index 0000000..eb84adc
--- /dev/null
+++ b/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java
@@ -0,0 +1,388 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+package com.android.server.am;
+
+import android.annotation.Nullable;
+import android.bluetooth.BluetoothActivityEnergyInfo;
+import android.bluetooth.BluetoothAdapter;
+import android.content.Context;
+import android.net.wifi.IWifiManager;
+import android.net.wifi.WifiActivityEnergyInfo;
+import android.os.BatteryStats;
+import android.os.Parcelable;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.os.SynchronousResultReceiver;
+import android.os.SystemClock;
+import android.telephony.ModemActivityInfo;
+import android.telephony.TelephonyManager;
+import android.util.IntArray;
+import android.util.Slog;
+import android.util.TimeUtils;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.os.BatteryStatsImpl;
+
+import libcore.util.EmptyArray;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeoutException;
+
+/**
+ * A Worker that fetches data from external sources (WiFi controller, bluetooth chipset) on a
+ * dedicated thread and updates BatteryStatsImpl with that information.
+ *
+ * As much work as possible is done without holding the BatteryStatsImpl lock, and only the
+ * readily available data is pushed into BatteryStatsImpl with the lock held.
+ */
+class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync {
+ private static final String TAG = "BatteryExternalStatsWorker";
+ private static final boolean DEBUG = false;
+
+ /**
+ * How long to wait on an individual subsystem to return its stats.
+ */
+ private static final long EXTERNAL_STATS_SYNC_TIMEOUT_MILLIS = 2000;
+
+ // There is some accuracy error in wifi reports so allow some slop in the results.
+ private static final long MAX_WIFI_STATS_SAMPLE_ERROR_MILLIS = 750;
+
+ private final ExecutorService mExecutorService = Executors.newSingleThreadExecutor(
+ (ThreadFactory) r -> {
+ Thread t = new Thread(r, "batterystats-worker");
+ t.setPriority(Thread.NORM_PRIORITY);
+ return t;
+ });
+
+ private final Context mContext;
+ private final BatteryStatsImpl mStats;
+
+ @GuardedBy("this")
+ private int mUpdateFlags = 0;
+
+ @GuardedBy("this")
+ private Future<?> mCurrentFuture = null;
+
+ @GuardedBy("this")
+ private String mCurrentReason = null;
+
+ @GuardedBy("this")
+ private final IntArray mUidsToRemove = new IntArray();
+
+ private final Object mWorkerLock = new Object();
+
+ @GuardedBy("mWorkerLock")
+ private IWifiManager mWifiManager = null;
+
+ @GuardedBy("mWorkerLock")
+ private TelephonyManager mTelephony = null;
+
+ // WiFi keeps an accumulated total of stats, unlike Bluetooth.
+ // 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);
+
+ BatteryExternalStatsWorker(Context context, BatteryStatsImpl stats) {
+ mContext = context;
+ mStats = stats;
+ }
+
+ @Override
+ public synchronized Future<?> scheduleSync(String reason, int flags) {
+ return scheduleSyncLocked(reason, flags);
+ }
+
+ @Override
+ public synchronized Future<?> scheduleCpuSyncDueToRemovedUid(int uid) {
+ mUidsToRemove.add(uid);
+ return scheduleSyncLocked("remove-uid", UPDATE_CPU);
+ }
+
+ public synchronized Future<?> scheduleWrite() {
+ scheduleSyncLocked("write", UPDATE_ALL);
+ // Since we use a single threaded executor, we can assume the next scheduled task's
+ // Future finishes after the sync.
+ return mExecutorService.submit(mWriteTask);
+ }
+
+ /**
+ * Schedules a task to run on the BatteryExternalStatsWorker thread. If scheduling more work
+ * within the task, never wait on the resulting Future. This will result in a deadlock.
+ */
+ public synchronized void scheduleRunnable(Runnable runnable) {
+ mExecutorService.submit(runnable);
+ }
+
+ public void shutdown() {
+ mExecutorService.shutdownNow();
+ }
+
+ private Future<?> scheduleSyncLocked(String reason, int flags) {
+ if (mCurrentFuture == null) {
+ mUpdateFlags = flags;
+ mCurrentReason = reason;
+ mCurrentFuture = mExecutorService.submit(mSyncTask);
+ }
+ mUpdateFlags |= flags;
+ return mCurrentFuture;
+ }
+
+ private final Runnable mSyncTask = new Runnable() {
+ @Override
+ public void run() {
+ // Capture a snapshot of the state we are meant to process.
+ final int updateFlags;
+ final String reason;
+ final int[] uidsToRemove;
+ synchronized (BatteryExternalStatsWorker.this) {
+ updateFlags = mUpdateFlags;
+ reason = mCurrentReason;
+ uidsToRemove = mUidsToRemove.size() > 0 ? mUidsToRemove.toArray() : EmptyArray.INT;
+ mUpdateFlags = 0;
+ mCurrentReason = null;
+ mUidsToRemove.clear();
+ mCurrentFuture = null;
+ }
+
+ synchronized (mWorkerLock) {
+ if (DEBUG) {
+ Slog.d(TAG, "begin updateExternalStatsSync reason=" + reason);
+ }
+ try {
+ updateExternalStatsLocked(reason, updateFlags);
+ } finally {
+ if (DEBUG) {
+ Slog.d(TAG, "end updateExternalStatsSync");
+ }
+ }
+ }
+
+ // Clean up any UIDs if necessary.
+ synchronized (mStats) {
+ for (int uid : uidsToRemove) {
+ mStats.removeIsolatedUidLocked(uid);
+ }
+ }
+ }
+ };
+
+ private final Runnable mWriteTask = new Runnable() {
+ @Override
+ public void run() {
+ synchronized (mStats) {
+ mStats.writeAsyncLocked();
+ }
+ }
+ };
+
+ private void updateExternalStatsLocked(final String reason, int updateFlags) {
+ // We will request data from external processes asynchronously, and wait on a timeout.
+ SynchronousResultReceiver wifiReceiver = null;
+ SynchronousResultReceiver bluetoothReceiver = null;
+ SynchronousResultReceiver modemReceiver = null;
+
+ if ((updateFlags & BatteryStatsImpl.ExternalStatsSync.UPDATE_WIFI) != 0) {
+ // We were asked to fetch WiFi data.
+ if (mWifiManager == null) {
+ mWifiManager = IWifiManager.Stub.asInterface(ServiceManager.getService(
+ Context.WIFI_SERVICE));
+ }
+
+ if (mWifiManager != null) {
+ try {
+ wifiReceiver = new SynchronousResultReceiver("wifi");
+ mWifiManager.requestActivityInfo(wifiReceiver);
+ } catch (RemoteException e) {
+ // Oh well.
+ }
+ }
+ }
+
+ if ((updateFlags & BatteryStatsImpl.ExternalStatsSync.UPDATE_BT) != 0) {
+ // We were asked to fetch Bluetooth data.
+ final BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
+ if (adapter != null) {
+ bluetoothReceiver = new SynchronousResultReceiver("bluetooth");
+ adapter.requestControllerActivityEnergyInfo(bluetoothReceiver);
+ }
+ }
+
+ if ((updateFlags & BatteryStatsImpl.ExternalStatsSync.UPDATE_RADIO) != 0) {
+ // We were asked to fetch Telephony data.
+ if (mTelephony == null) {
+ mTelephony = TelephonyManager.from(mContext);
+ }
+
+ if (mTelephony != null) {
+ modemReceiver = new SynchronousResultReceiver("telephony");
+ mTelephony.requestModemActivityInfo(modemReceiver);
+ }
+ }
+
+ final WifiActivityEnergyInfo wifiInfo = awaitControllerInfo(wifiReceiver);
+ final BluetoothActivityEnergyInfo bluetoothInfo = awaitControllerInfo(bluetoothReceiver);
+ final ModemActivityInfo modemInfo = awaitControllerInfo(modemReceiver);
+
+ synchronized (mStats) {
+ mStats.addHistoryEventLocked(
+ SystemClock.elapsedRealtime(),
+ SystemClock.uptimeMillis(),
+ BatteryStats.HistoryItem.EVENT_COLLECT_EXTERNAL_STATS,
+ reason, 0);
+
+ if ((updateFlags & UPDATE_CPU) != 0) {
+ mStats.updateCpuTimeLocked(true /* updateCpuFreqData */);
+ mStats.updateKernelWakelocksLocked();
+ mStats.updateKernelMemoryBandwidthLocked();
+ }
+
+ if (bluetoothInfo != null) {
+ if (bluetoothInfo.isValid()) {
+ mStats.updateBluetoothStateLocked(bluetoothInfo);
+ } else {
+ Slog.e(TAG, "bluetooth info is invalid: " + bluetoothInfo);
+ }
+ }
+ }
+
+ // WiFi and Modem state are updated without the mStats lock held, because they
+ // do some network stats retrieval before internally grabbing the mStats lock.
+
+ if (wifiInfo != null) {
+ if (wifiInfo.isValid()) {
+ mStats.updateWifiState(extractDeltaLocked(wifiInfo));
+ } else {
+ Slog.e(TAG, "wifi info is invalid: " + wifiInfo);
+ }
+ }
+
+ if (modemInfo != null) {
+ if (modemInfo.isValid()) {
+ mStats.updateMobileRadioState(modemInfo);
+ } else {
+ Slog.e(TAG, "modem info is invalid: " + modemInfo);
+ }
+ }
+ }
+
+ /**
+ * Helper method to extract the Parcelable controller info from a
+ * SynchronousResultReceiver.
+ */
+ private static <T extends Parcelable> T awaitControllerInfo(
+ @Nullable SynchronousResultReceiver receiver) {
+ if (receiver == null) {
+ return null;
+ }
+
+ try {
+ final SynchronousResultReceiver.Result result =
+ receiver.awaitResult(EXTERNAL_STATS_SYNC_TIMEOUT_MILLIS);
+ if (result.bundle != null) {
+ // This is the final destination for the Bundle.
+ result.bundle.setDefusable(true);
+
+ final T data = result.bundle.getParcelable(
+ BatteryStats.RESULT_RECEIVER_CONTROLLER_KEY);
+ if (data != null) {
+ return data;
+ }
+ }
+ Slog.e(TAG, "no controller energy info supplied for " + receiver.getName());
+ } catch (TimeoutException e) {
+ Slog.w(TAG, "timeout reading " + receiver.getName() + " stats");
+ }
+ return null;
+ }
+
+ private WifiActivityEnergyInfo extractDeltaLocked(WifiActivityEnergyInfo latest) {
+ final long timePeriodMs = latest.mTimestamp - mLastInfo.mTimestamp;
+ final long lastIdleMs = mLastInfo.mControllerIdleTimeMs;
+ final long lastTxMs = mLastInfo.mControllerTxTimeMs;
+ final long lastRxMs = mLastInfo.mControllerRxTimeMs;
+ final long lastEnergy = mLastInfo.mControllerEnergyUsed;
+
+ // 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();
+
+ final long txTimeMs = latest.mControllerTxTimeMs - lastTxMs;
+ final long rxTimeMs = latest.mControllerRxTimeMs - lastRxMs;
+ final long idleTimeMs = latest.mControllerIdleTimeMs - lastIdleMs;
+
+ if (txTimeMs < 0 || rxTimeMs < 0) {
+ // The stats were reset by the WiFi system (which is why our delta is negative).
+ // Returns the unaltered stats.
+ delta.mControllerEnergyUsed = latest.mControllerEnergyUsed;
+ delta.mControllerRxTimeMs = latest.mControllerRxTimeMs;
+ delta.mControllerTxTimeMs = latest.mControllerTxTimeMs;
+ delta.mControllerIdleTimeMs = latest.mControllerIdleTimeMs;
+ Slog.v(TAG, "WiFi energy data was reset, new WiFi energy data is " + delta);
+ } else {
+ final long totalActiveTimeMs = txTimeMs + rxTimeMs;
+ long maxExpectedIdleTimeMs;
+ if (totalActiveTimeMs > timePeriodMs) {
+ // Cap the max idle time at zero since the active time consumed the whole time
+ maxExpectedIdleTimeMs = 0;
+ if (totalActiveTimeMs > timePeriodMs + MAX_WIFI_STATS_SAMPLE_ERROR_MILLIS) {
+ StringBuilder sb = new StringBuilder();
+ sb.append("Total Active time ");
+ TimeUtils.formatDuration(totalActiveTimeMs, sb);
+ sb.append(" is longer than sample period ");
+ TimeUtils.formatDuration(timePeriodMs, sb);
+ sb.append(".\n");
+ sb.append("Previous WiFi snapshot: ").append("idle=");
+ TimeUtils.formatDuration(lastIdleMs, sb);
+ sb.append(" rx=");
+ TimeUtils.formatDuration(lastRxMs, sb);
+ sb.append(" tx=");
+ TimeUtils.formatDuration(lastTxMs, sb);
+ sb.append(" e=").append(lastEnergy);
+ sb.append("\n");
+ sb.append("Current WiFi snapshot: ").append("idle=");
+ TimeUtils.formatDuration(latest.mControllerIdleTimeMs, sb);
+ sb.append(" rx=");
+ TimeUtils.formatDuration(latest.mControllerRxTimeMs, sb);
+ sb.append(" tx=");
+ TimeUtils.formatDuration(latest.mControllerTxTimeMs, sb);
+ sb.append(" e=").append(latest.mControllerEnergyUsed);
+ Slog.wtf(TAG, sb.toString());
+ }
+ } else {
+ maxExpectedIdleTimeMs = timePeriodMs - totalActiveTimeMs;
+ }
+ // These times seem to be the most reliable.
+ delta.mControllerTxTimeMs = txTimeMs;
+ delta.mControllerRxTimeMs = rxTimeMs;
+ // 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);
+ }
+
+ mLastInfo = latest;
+ return delta;
+ }
+}
diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java
index 65697e9..33568cd 100644
--- a/services/core/java/com/android/server/am/BatteryStatsService.java
+++ b/services/core/java/com/android/server/am/BatteryStatsService.java
@@ -16,36 +16,25 @@
package com.android.server.am;
-import static com.android.internal.os.BatteryStatsImpl.ExternalStatsSync.UPDATE_CPU;
-import static com.android.internal.os.BatteryStatsImpl.ExternalStatsSync.UPDATE_RADIO;
-import static com.android.internal.os.BatteryStatsImpl.ExternalStatsSync.UPDATE_WIFI;
-
-import android.annotation.Nullable;
import android.bluetooth.BluetoothActivityEnergyInfo;
-import android.bluetooth.BluetoothAdapter;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
-import android.net.wifi.IWifiManager;
import android.net.wifi.WifiActivityEnergyInfo;
import android.os.PowerSaveState;
import android.os.BatteryStats;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
-import android.os.Looper;
-import android.os.Message;
import android.os.Parcel;
import android.os.ParcelFileDescriptor;
import android.os.ParcelFormatException;
-import android.os.Parcelable;
import android.os.PowerManagerInternal;
import android.os.Process;
-import android.os.RemoteException;
import android.os.ServiceManager;
-import android.os.SynchronousResultReceiver;
import android.os.SystemClock;
import android.os.UserHandle;
+import android.os.UserManagerInternal;
import android.os.WorkSource;
import android.os.health.HealthStatsParceler;
import android.os.health.HealthStatsWriter;
@@ -54,18 +43,14 @@
import android.telephony.ModemActivityInfo;
import android.telephony.SignalStrength;
import android.telephony.TelephonyManager;
-import android.util.IntArray;
import android.util.Slog;
-import android.util.TimeUtils;
-import com.android.internal.annotations.GuardedBy;
import com.android.internal.app.IBatteryStats;
import com.android.internal.os.BatteryStatsHelper;
import com.android.internal.os.BatteryStatsImpl;
import com.android.internal.os.PowerProfile;
import com.android.internal.util.DumpUtils;
import com.android.server.LocalServices;
-import com.android.server.ServiceThread;
import com.android.server.power.BatterySaverPolicy.ServiceType;
import java.io.File;
@@ -79,7 +64,8 @@
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.List;
-import java.util.concurrent.TimeoutException;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
/**
* All information we are collecting about things that can happen that impact
@@ -91,101 +77,12 @@
static final String TAG = "BatteryStatsService";
static final boolean DBG = false;
- /**
- * How long to wait on an individual subsystem to return its stats.
- */
- private static final long EXTERNAL_STATS_SYNC_TIMEOUT_MILLIS = 2000;
-
- // There is some accuracy error in wifi reports so allow some slop in the results.
- private static final long MAX_WIFI_STATS_SAMPLE_ERROR_MILLIS = 750;
-
private static IBatteryStats sService;
final BatteryStatsImpl mStats;
- private final BatteryStatsHandler mHandler;
- private Context mContext;
- private IWifiManager mWifiManager;
- private TelephonyManager mTelephony;
-
- // Lock acquired when extracting data from external sources.
- private final Object mExternalStatsLock = new Object();
-
- // WiFi keeps an accumulated total of stats, unlike Bluetooth.
- // Keep the last WiFi stats so we can compute a delta.
- @GuardedBy("mExternalStatsLock")
- private WifiActivityEnergyInfo mLastInfo =
- new WifiActivityEnergyInfo(0, 0, 0, new long[]{0}, 0, 0, 0);
-
- class BatteryStatsHandler extends Handler implements BatteryStatsImpl.ExternalStatsSync {
- public static final int MSG_SYNC_EXTERNAL_STATS = 1;
- public static final int MSG_WRITE_TO_DISK = 2;
-
- private int mUpdateFlags = 0;
- private IntArray mUidsToRemove = new IntArray();
-
- public BatteryStatsHandler(Looper looper) {
- super(looper);
- }
-
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MSG_SYNC_EXTERNAL_STATS:
- final int updateFlags;
- synchronized (this) {
- removeMessages(MSG_SYNC_EXTERNAL_STATS);
- updateFlags = mUpdateFlags;
- mUpdateFlags = 0;
- }
- updateExternalStatsSync((String)msg.obj, updateFlags);
-
- // other parts of the system could be calling into us
- // from mStats in order to report of changes. We must grab the mStats
- // lock before grabbing our own or we'll end up in a deadlock.
- synchronized (mStats) {
- synchronized (this) {
- final int numUidsToRemove = mUidsToRemove.size();
- for (int i = 0; i < numUidsToRemove; i++) {
- mStats.removeIsolatedUidLocked(mUidsToRemove.get(i));
- }
- }
- mUidsToRemove.clear();
- }
- break;
-
- case MSG_WRITE_TO_DISK:
- updateExternalStatsSync("write", UPDATE_ALL);
- if (DBG) Slog.d(TAG, "begin writeAsyncLocked");
- synchronized (mStats) {
- mStats.writeAsyncLocked();
- }
- if (DBG) Slog.d(TAG, "end writeAsyncLocked");
- break;
- }
- }
-
- @Override
- public void scheduleSync(String reason, int updateFlags) {
- synchronized (this) {
- scheduleSyncLocked(reason, updateFlags);
- }
- }
-
- @Override
- public void scheduleCpuSyncDueToRemovedUid(int uid) {
- synchronized (this) {
- scheduleSyncLocked("remove-uid", UPDATE_CPU);
- mUidsToRemove.add(uid);
- }
- }
-
- private void scheduleSyncLocked(String reason, int updateFlags) {
- if (mUpdateFlags == 0) {
- sendMessage(Message.obtain(this, MSG_SYNC_EXTERNAL_STATS, reason));
- }
- mUpdateFlags |= updateFlags;
- }
- }
+ private final BatteryStatsImpl.UserInfoProvider mUserManagerUserInfoProvider;
+ private final Context mContext;
+ private final BatteryExternalStatsWorker mWorker;
private native int getPlatformLowPowerStats(ByteBuffer outBuffer);
private native int getSubsystemLowPowerStats(ByteBuffer outBuffer);
@@ -242,29 +139,44 @@
}
}
- BatteryStatsService(File systemDir, Handler handler) {
- // Our handler here will be accessing the disk, use a different thread than
- // what the ActivityManagerService gave us (no I/O on that one!).
- final ServiceThread thread = new ServiceThread("batterystats-sync",
- Process.THREAD_PRIORITY_DEFAULT, true);
- thread.start();
- mHandler = new BatteryStatsHandler(thread.getLooper());
-
+ BatteryStatsService(Context context, File systemDir, Handler handler) {
// BatteryStatsImpl expects the ActivityManagerService handler, so pass that one through.
- mStats = new BatteryStatsImpl(systemDir, handler, mHandler, this);
+ mContext = context;
+ mUserManagerUserInfoProvider = new BatteryStatsImpl.UserInfoProvider() {
+ private UserManagerInternal umi;
+ @Override
+ public int[] getUserIds() {
+ if (umi == null) {
+ umi = LocalServices.getService(UserManagerInternal.class);
+ }
+ return (umi != null) ? umi.getUserIds() : null;
+ }
+ };
+ mStats = new BatteryStatsImpl(systemDir, handler, this, mUserManagerUserInfoProvider);
+ mWorker = new BatteryExternalStatsWorker(context, mStats);
+ mStats.setExternalStatsSyncLocked(mWorker);
+ mStats.setRadioScanningTimeoutLocked(mContext.getResources().getInteger(
+ com.android.internal.R.integer.config_radioScanningTimeout) * 1000L);
+ mStats.setPowerProfileLocked(new PowerProfile(context));
}
- public void publish(Context context) {
- mContext = context;
- synchronized (mStats) {
- mStats.setRadioScanningTimeoutLocked(mContext.getResources().getInteger(
- com.android.internal.R.integer.config_radioScanningTimeout)
- * 1000L);
- mStats.setPowerProfileLocked(new PowerProfile(context));
- }
+ public void publish() {
ServiceManager.addService(BatteryStats.SERVICE_NAME, asBinder());
}
+ private static void awaitUninterruptibly(Future<?> future) {
+ while (true) {
+ try {
+ future.get();
+ return;
+ } catch (ExecutionException e) {
+ return;
+ } catch (InterruptedException e) {
+ // Keep looping
+ }
+ }
+ }
+
/**
* At the time when the constructor runs, the power manager has not yet been
* initialized. So we initialize the low power observer later.
@@ -283,13 +195,14 @@
public void shutdown() {
Slog.w("BatteryStats", "Writing battery stats before shutdown...");
- updateExternalStatsSync("shutdown", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
+ awaitUninterruptibly(mWorker.scheduleSync("shutdown", BatteryExternalStatsWorker.UPDATE_ALL));
+
synchronized (mStats) {
mStats.shutdownLocked();
}
// Shutdown the thread we made.
- mHandler.getLooper().quit();
+ mWorker.shutdown();
}
public static IBatteryStats getService() {
@@ -327,7 +240,7 @@
* object to update with the latest info, then write to disk.
*/
public void scheduleWriteToDisk() {
- mHandler.sendEmptyMessage(BatteryStatsHandler.MSG_WRITE_TO_DISK);
+ mWorker.scheduleWrite();
}
// These are for direct use by the activity manager...
@@ -341,6 +254,18 @@
}
}
+ void onCleanupUser(int userId) {
+ synchronized (mStats) {
+ mStats.onCleanupUserLocked(userId);
+ }
+ }
+
+ void onUserRemoved(int userId) {
+ synchronized (mStats) {
+ mStats.onUserRemovedLocked(userId);
+ }
+ }
+
void addIsolatedUid(int isolatedUid, int appUid) {
synchronized (mStats) {
mStats.addIsolatedUidLocked(isolatedUid, appUid);
@@ -391,7 +316,7 @@
//Slog.i("foo", "SENDING BATTERY INFO:");
//mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM));
Parcel out = Parcel.obtain();
- updateExternalStatsSync("get-stats", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
+ awaitUninterruptibly(mWorker.scheduleSync("get-stats", BatteryExternalStatsWorker.UPDATE_ALL));
synchronized (mStats) {
mStats.writeToParcel(out, 0);
}
@@ -406,7 +331,7 @@
//Slog.i("foo", "SENDING BATTERY INFO:");
//mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM));
Parcel out = Parcel.obtain();
- updateExternalStatsSync("get-stats", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
+ awaitUninterruptibly(mWorker.scheduleSync("get-stats", BatteryExternalStatsWorker.UPDATE_ALL));
synchronized (mStats) {
mStats.writeToParcel(out, 0);
}
@@ -468,10 +393,10 @@
}
}
- public void noteJobFinish(String name, int uid) {
+ public void noteJobFinish(String name, int uid, int stopReason) {
enforceCallingPermission();
synchronized (mStats) {
- mStats.noteJobFinishLocked(name, uid);
+ mStats.noteJobFinishLocked(name, uid, stopReason);
}
}
@@ -635,13 +560,13 @@
public void noteMobileRadioPowerState(int powerState, long timestampNs, int uid) {
enforceCallingPermission();
- boolean update;
+ final boolean update;
synchronized (mStats) {
update = mStats.noteMobileRadioPowerStateLocked(powerState, timestampNs, uid);
}
if (update) {
- mHandler.scheduleSync("modem-data", UPDATE_RADIO);
+ mWorker.scheduleSync("modem-data", BatteryExternalStatsWorker.UPDATE_RADIO);
}
}
@@ -792,8 +717,7 @@
final String type = (powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_HIGH ||
powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_MEDIUM) ? "active"
: "inactive";
- mHandler.scheduleSync("wifi-data: " + type,
- UPDATE_WIFI);
+ mWorker.scheduleSync("wifi-data: " + type, BatteryExternalStatsWorker.UPDATE_WIFI);
}
mStats.noteWifiRadioPowerState(powerState, tsNanos, uid);
}
@@ -951,7 +875,11 @@
@Override
public void noteNetworkStatsEnabled() {
enforceCallingPermission();
- mHandler.scheduleSync("network-stats-enabled", UPDATE_RADIO | UPDATE_WIFI);
+ // During device boot, qtaguid isn't enabled until after the inital
+ // loading of battery stats. Now that they're enabled, take our initial
+ // snapshot for future delta calculation.
+ mWorker.scheduleSync("network-stats-enabled",
+ BatteryExternalStatsWorker.UPDATE_RADIO | BatteryExternalStatsWorker.UPDATE_WIFI);
}
@Override
@@ -1028,9 +956,7 @@
return;
}
- synchronized (mStats) {
- mStats.updateBluetoothStateLocked(info);
- }
+ mStats.updateBluetoothStateLocked(info);
}
@Override
@@ -1057,28 +983,29 @@
// BatteryService calls us here and we may update external state. It would be wrong
// to block such a low level service like BatteryService on external stats like WiFi.
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- synchronized (mStats) {
- final boolean onBattery = plugType == BatteryStatsImpl.BATTERY_PLUGGED_NONE;
- if (mStats.isOnBattery() == onBattery) {
- // The battery state has not changed, so we don't need to sync external
- // stats immediately.
- mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt,
- chargeUAh, chargeFullUAh);
- return;
- }
+ mWorker.scheduleRunnable(() -> {
+ synchronized (mStats) {
+ final boolean onBattery = plugType == BatteryStatsImpl.BATTERY_PLUGGED_NONE;
+ if (mStats.isOnBattery() == onBattery) {
+ // The battery state has not changed, so we don't need to sync external
+ // stats immediately.
+ mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt,
+ chargeUAh, chargeFullUAh);
+ return;
}
+ }
- // Sync external stats first as the battery has changed states. If we don't sync
- // immediately here, we may not collect the relevant data later.
- updateExternalStatsSync("battery-state", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
+ // Sync external stats first as the battery has changed states. If we don't sync
+ // before changing the state, we may not collect the relevant data later.
+ // Order here is guaranteed since we're scheduling from the same thread and we are
+ // using a single threaded executor.
+ mWorker.scheduleSync("battery-state", BatteryExternalStatsWorker.UPDATE_ALL);
+ mWorker.scheduleRunnable(() -> {
synchronized (mStats) {
mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt,
chargeUAh, chargeFullUAh);
}
- }
+ });
});
}
@@ -1260,9 +1187,10 @@
pw.println("Battery stats reset.");
noOutput = true;
}
- updateExternalStatsSync("dump", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
+ mWorker.scheduleSync("dump", BatteryExternalStatsWorker.UPDATE_ALL);
} else if ("--write".equals(arg)) {
- updateExternalStatsSync("dump", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
+ awaitUninterruptibly(mWorker.scheduleSync("dump",
+ BatteryExternalStatsWorker.UPDATE_ALL));
synchronized (mStats) {
mStats.writeSyncLocked();
pw.println("Battery stats written.");
@@ -1326,7 +1254,7 @@
flags |= BatteryStats.DUMP_DEVICE_WIFI_ONLY;
}
// Fetch data from external sources and update the BatteryStatsImpl object with them.
- updateExternalStatsSync("dump", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
+ awaitUninterruptibly(mWorker.scheduleSync("dump", BatteryExternalStatsWorker.UPDATE_ALL));
} finally {
Binder.restoreCallingIdentity(ident);
}
@@ -1356,7 +1284,7 @@
in.unmarshall(raw, 0, raw.length);
in.setDataPosition(0);
BatteryStatsImpl checkinStats = new BatteryStatsImpl(
- null, mStats.mHandler, null);
+ null, mStats.mHandler, null, mUserManagerUserInfoProvider);
checkinStats.readSummaryFromParcel(in);
in.recycle();
checkinStats.dumpCheckinLocked(mContext, pw, apps, flags,
@@ -1391,229 +1319,6 @@
}
}
- private WifiActivityEnergyInfo extractDelta(WifiActivityEnergyInfo latest) {
- final long timePeriodMs = latest.mTimestamp - mLastInfo.mTimestamp;
- final long lastIdleMs = mLastInfo.mControllerIdleTimeMs;
- final long lastTxMs = mLastInfo.mControllerTxTimeMs;
- final long lastRxMs = mLastInfo.mControllerRxTimeMs;
- final long lastEnergy = mLastInfo.mControllerEnergyUsed;
-
- // 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();
-
- final long txTimeMs = latest.mControllerTxTimeMs - lastTxMs;
- final long rxTimeMs = latest.mControllerRxTimeMs - lastRxMs;
- final long idleTimeMs = latest.mControllerIdleTimeMs - lastIdleMs;
-
- if (txTimeMs < 0 || rxTimeMs < 0) {
- // The stats were reset by the WiFi system (which is why our delta is negative).
- // Returns the unaltered stats.
- delta.mControllerEnergyUsed = latest.mControllerEnergyUsed;
- delta.mControllerRxTimeMs = latest.mControllerRxTimeMs;
- delta.mControllerTxTimeMs = latest.mControllerTxTimeMs;
- delta.mControllerIdleTimeMs = latest.mControllerIdleTimeMs;
- Slog.v(TAG, "WiFi energy data was reset, new WiFi energy data is " + delta);
- } else {
- final long totalActiveTimeMs = txTimeMs + rxTimeMs;
- long maxExpectedIdleTimeMs;
- if (totalActiveTimeMs > timePeriodMs) {
- // Cap the max idle time at zero since the active time consumed the whole time
- maxExpectedIdleTimeMs = 0;
- if (totalActiveTimeMs > timePeriodMs + MAX_WIFI_STATS_SAMPLE_ERROR_MILLIS) {
- StringBuilder sb = new StringBuilder();
- sb.append("Total Active time ");
- TimeUtils.formatDuration(totalActiveTimeMs, sb);
- sb.append(" is longer than sample period ");
- TimeUtils.formatDuration(timePeriodMs, sb);
- sb.append(".\n");
- sb.append("Previous WiFi snapshot: ").append("idle=");
- TimeUtils.formatDuration(lastIdleMs, sb);
- sb.append(" rx=");
- TimeUtils.formatDuration(lastRxMs, sb);
- sb.append(" tx=");
- TimeUtils.formatDuration(lastTxMs, sb);
- sb.append(" e=").append(lastEnergy);
- sb.append("\n");
- sb.append("Current WiFi snapshot: ").append("idle=");
- TimeUtils.formatDuration(latest.mControllerIdleTimeMs, sb);
- sb.append(" rx=");
- TimeUtils.formatDuration(latest.mControllerRxTimeMs, sb);
- sb.append(" tx=");
- TimeUtils.formatDuration(latest.mControllerTxTimeMs, sb);
- sb.append(" e=").append(latest.mControllerEnergyUsed);
- Slog.wtf(TAG, sb.toString());
- }
- } else {
- maxExpectedIdleTimeMs = timePeriodMs - totalActiveTimeMs;
- }
- // These times seem to be the most reliable.
- delta.mControllerTxTimeMs = txTimeMs;
- delta.mControllerRxTimeMs = rxTimeMs;
- // 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);
- }
-
- mLastInfo = latest;
- return delta;
- }
-
- /**
- * Helper method to extract the Parcelable controller info from a
- * SynchronousResultReceiver.
- */
- private static <T extends Parcelable> T awaitControllerInfo(
- @Nullable SynchronousResultReceiver receiver) throws TimeoutException {
- if (receiver == null) {
- return null;
- }
-
- final SynchronousResultReceiver.Result result =
- receiver.awaitResult(EXTERNAL_STATS_SYNC_TIMEOUT_MILLIS);
- if (result.bundle != null) {
- // This is the final destination for the Bundle.
- result.bundle.setDefusable(true);
-
- final T data = result.bundle.getParcelable(BatteryStats.RESULT_RECEIVER_CONTROLLER_KEY);
- if (data != null) {
- return data;
- }
- }
- Slog.e(TAG, "no controller energy info supplied");
- return null;
- }
-
- /**
- * Fetches data from external sources (WiFi controller, bluetooth chipset) and updates
- * batterystats with that information.
- *
- * We first grab a lock specific to this method, then once all the data has been collected,
- * we grab the mStats lock and update the data.
- *
- * @param reason The reason why this collection was requested. Useful for debugging.
- * @param updateFlags Which external stats to update. Can be a combination of
- * {@link BatteryStatsImpl.ExternalStatsSync#UPDATE_CPU},
- * {@link BatteryStatsImpl.ExternalStatsSync#UPDATE_RADIO},
- * {@link BatteryStatsImpl.ExternalStatsSync#UPDATE_WIFI},
- * and {@link BatteryStatsImpl.ExternalStatsSync#UPDATE_BT}.
- */
- void updateExternalStatsSync(final String reason, int updateFlags) {
- SynchronousResultReceiver wifiReceiver = null;
- SynchronousResultReceiver bluetoothReceiver = null;
- SynchronousResultReceiver modemReceiver = null;
-
- if (DBG) Slog.d(TAG, "begin updateExternalStatsSync reason=" + reason);
- synchronized (mExternalStatsLock) {
- if (mContext == null) {
- // Don't do any work yet.
- if (DBG) Slog.d(TAG, "end updateExternalStatsSync");
- return;
- }
-
- if ((updateFlags & UPDATE_WIFI) != 0) {
- if (mWifiManager == null) {
- mWifiManager = IWifiManager.Stub.asInterface(
- ServiceManager.getService(Context.WIFI_SERVICE));
- }
-
- if (mWifiManager != null) {
- try {
- wifiReceiver = new SynchronousResultReceiver();
- mWifiManager.requestActivityInfo(wifiReceiver);
- } catch (RemoteException e) {
- // Oh well.
- }
- }
- }
-
- if ((updateFlags & BatteryStatsImpl.ExternalStatsSync.UPDATE_BT) != 0) {
- final BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
- if (adapter != null) {
- bluetoothReceiver = new SynchronousResultReceiver();
- adapter.requestControllerActivityEnergyInfo(bluetoothReceiver);
- }
- }
-
- if ((updateFlags & BatteryStatsImpl.ExternalStatsSync.UPDATE_RADIO) != 0) {
- if (mTelephony == null) {
- mTelephony = TelephonyManager.from(mContext);
- }
-
- if (mTelephony != null) {
- modemReceiver = new SynchronousResultReceiver();
- mTelephony.requestModemActivityInfo(modemReceiver);
- }
- }
-
- WifiActivityEnergyInfo wifiInfo = null;
- BluetoothActivityEnergyInfo bluetoothInfo = null;
- ModemActivityInfo modemInfo = null;
- try {
- wifiInfo = awaitControllerInfo(wifiReceiver);
- } catch (TimeoutException e) {
- Slog.w(TAG, "Timeout reading wifi stats");
- }
-
- try {
- bluetoothInfo = awaitControllerInfo(bluetoothReceiver);
- } catch (TimeoutException e) {
- Slog.w(TAG, "Timeout reading bt stats");
- }
-
- try {
- modemInfo = awaitControllerInfo(modemReceiver);
- } catch (TimeoutException e) {
- Slog.w(TAG, "Timeout reading modem stats");
- }
-
- synchronized (mStats) {
- mStats.addHistoryEventLocked(
- SystemClock.elapsedRealtime(),
- SystemClock.uptimeMillis(),
- BatteryStats.HistoryItem.EVENT_COLLECT_EXTERNAL_STATS,
- reason, 0);
-
- if ((updateFlags & UPDATE_CPU) != 0) {
- mStats.updateCpuTimeLocked(true /* updateCpuFreqData */);
- }
- mStats.updateKernelWakelocksLocked();
- mStats.updateKernelMemoryBandwidthLocked();
-
- if (bluetoothInfo != null) {
- if (bluetoothInfo.isValid()) {
- mStats.updateBluetoothStateLocked(bluetoothInfo);
- } else {
- Slog.e(TAG, "bluetooth info is invalid: " + bluetoothInfo);
- }
- }
- }
-
- if (wifiInfo != null) {
- if (wifiInfo.isValid()) {
- mStats.updateWifiState(extractDelta(wifiInfo));
- } else {
- Slog.e(TAG, "wifi info is invalid: " + wifiInfo);
- }
- }
-
- if (modemInfo != null) {
- if (modemInfo.isValid()) {
- mStats.updateMobileRadioState(modemInfo);
- } else {
- Slog.e(TAG, "modem info is invalid: " + modemInfo);
- }
- }
- }
- if (DBG) Slog.d(TAG, "end updateExternalStatsSync");
- }
-
/**
* Gets a snapshot of the system health for a particular uid.
*/
@@ -1625,8 +1330,8 @@
}
long ident = Binder.clearCallingIdentity();
try {
- updateExternalStatsSync("get-health-stats-for-uid",
- BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
+ awaitUninterruptibly(mWorker.scheduleSync("get-health-stats-for-uids",
+ BatteryExternalStatsWorker.UPDATE_ALL));
synchronized (mStats) {
return getHealthStatsForUidLocked(requestUid);
}
@@ -1650,8 +1355,8 @@
long ident = Binder.clearCallingIdentity();
int i=-1;
try {
- updateExternalStatsSync("get-health-stats-for-uids",
- BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
+ awaitUninterruptibly(mWorker.scheduleSync("get-health-stats-for-uids",
+ BatteryExternalStatsWorker.UPDATE_ALL));
synchronized (mStats) {
final int N = requestUids.length;
final HealthStatsParceler[] results = new HealthStatsParceler[N];
diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java
index da196e2..7c7eda7 100644
--- a/services/core/java/com/android/server/am/BroadcastQueue.java
+++ b/services/core/java/com/android/server/am/BroadcastQueue.java
@@ -1498,25 +1498,29 @@
else return x;
}
- private final void addBroadcastToHistoryLocked(BroadcastRecord r) {
- if (r.callingUid < 0) {
+ private final void addBroadcastToHistoryLocked(BroadcastRecord original) {
+ if (original.callingUid < 0) {
// This was from a registerReceiver() call; ignore it.
return;
}
- r.finishTime = SystemClock.uptimeMillis();
+ original.finishTime = SystemClock.uptimeMillis();
if (Trace.isTagEnabled(Trace.TRACE_TAG_ACTIVITY_MANAGER)) {
Trace.asyncTraceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER,
- createBroadcastTraceTitle(r, BroadcastRecord.DELIVERY_DELIVERED),
- System.identityHashCode(r));
+ createBroadcastTraceTitle(original, BroadcastRecord.DELIVERY_DELIVERED),
+ System.identityHashCode(original));
}
- mBroadcastHistory[mHistoryNext] = r;
+ // Note sometimes (only for sticky broadcasts?) we reuse BroadcastRecords,
+ // So don't change the incoming record directly.
+ final BroadcastRecord historyRecord = original.maybeStripForHistory();
+
+ mBroadcastHistory[mHistoryNext] = historyRecord;
mHistoryNext = ringAdvance(mHistoryNext, 1, MAX_BROADCAST_HISTORY);
- mBroadcastSummaryHistory[mSummaryHistoryNext] = r.intent;
- mSummaryHistoryEnqueueTime[mSummaryHistoryNext] = r.enqueueClockTime;
- mSummaryHistoryDispatchTime[mSummaryHistoryNext] = r.dispatchClockTime;
+ mBroadcastSummaryHistory[mSummaryHistoryNext] = historyRecord.intent;
+ mSummaryHistoryEnqueueTime[mSummaryHistoryNext] = historyRecord.enqueueClockTime;
+ mSummaryHistoryDispatchTime[mSummaryHistoryNext] = historyRecord.dispatchClockTime;
mSummaryHistoryFinishTime[mSummaryHistoryNext] = System.currentTimeMillis();
mSummaryHistoryNext = ringAdvance(mSummaryHistoryNext, 1, MAX_BROADCAST_SUMMARY_HISTORY);
}
diff --git a/services/core/java/com/android/server/am/BroadcastRecord.java b/services/core/java/com/android/server/am/BroadcastRecord.java
index 7764be7..6bc0744 100644
--- a/services/core/java/com/android/server/am/BroadcastRecord.java
+++ b/services/core/java/com/android/server/am/BroadcastRecord.java
@@ -248,6 +248,55 @@
state = IDLE;
}
+ /**
+ * Copy constructor which takes a different intent.
+ * Only used by {@link #maybeStripForHistory}.
+ */
+ private BroadcastRecord(BroadcastRecord from, Intent newIntent) {
+ intent = newIntent;
+ targetComp = newIntent.getComponent();
+
+ callerApp = from.callerApp;
+ callerPackage = from.callerPackage;
+ callingPid = from.callingPid;
+ callingUid = from.callingUid;
+ callerInstantApp = from.callerInstantApp;
+ ordered = from.ordered;
+ sticky = from.sticky;
+ initialSticky = from.initialSticky;
+ userId = from.userId;
+ resolvedType = from.resolvedType;
+ requiredPermissions = from.requiredPermissions;
+ appOp = from.appOp;
+ options = from.options;
+ receivers = from.receivers;
+ delivery = from.delivery;
+ resultTo = from.resultTo;
+ enqueueClockTime = from.enqueueClockTime;
+ dispatchTime = from.dispatchTime;
+ dispatchClockTime = from.dispatchClockTime;
+ receiverTime = from.receiverTime;
+ finishTime = from.finishTime;
+ resultCode = from.resultCode;
+ resultData = from.resultData;
+ resultExtras = from.resultExtras;
+ resultAbort = from.resultAbort;
+ nextReceiver = from.nextReceiver;
+ receiver = from.receiver;
+ state = from.state;
+ anrCount = from.anrCount;
+ manifestCount = from.manifestCount;
+ manifestSkipCount = from.manifestSkipCount;
+ queue = from.queue;
+ }
+
+ public BroadcastRecord maybeStripForHistory() {
+ if (!intent.canStripForHistory()) {
+ return this;
+ }
+ return new BroadcastRecord(this, intent.maybeStripForHistory());
+ }
+
boolean cleanupDisabledPackageReceiversLocked(
String packageName, Set<String> filterByClasses, int userId, boolean doit) {
if ((userId != UserHandle.USER_ALL && this.userId != userId) || receivers == null) {
diff --git a/services/core/java/com/android/server/am/KeyguardController.java b/services/core/java/com/android/server/am/KeyguardController.java
index d10f9fb..58e71df 100644
--- a/services/core/java/com/android/server/am/KeyguardController.java
+++ b/services/core/java/com/android/server/am/KeyguardController.java
@@ -30,7 +30,6 @@
import static com.android.server.wm.AppTransition.TRANSIT_KEYGUARD_GOING_AWAY;
import static com.android.server.wm.AppTransition.TRANSIT_KEYGUARD_OCCLUDE;
import static com.android.server.wm.AppTransition.TRANSIT_KEYGUARD_UNOCCLUDE;
-import static com.android.server.wm.AppTransition.TRANSIT_NONE;
import static com.android.server.wm.AppTransition.TRANSIT_UNSET;
import android.os.IBinder;
@@ -145,6 +144,13 @@
return;
}
Slog.i(TAG, "Activity requesting to dismiss Keyguard: " + activityRecord);
+
+ // If the client has requested to dismiss the keyguard and the Activity has the flag to
+ // turn the screen on, wakeup the screen if it's the top Activity.
+ if (activityRecord.getTurnScreenOnFlag() && activityRecord.isTopRunningActivity()) {
+ mStackSupervisor.wakeUp("dismissKeyguard");
+ }
+
mWindowManager.dismissKeyguard(callback);
}
diff --git a/services/core/java/com/android/server/am/PendingIntentRecord.java b/services/core/java/com/android/server/am/PendingIntentRecord.java
index cad5dcf..ee59386 100644
--- a/services/core/java/com/android/server/am/PendingIntentRecord.java
+++ b/services/core/java/com/android/server/am/PendingIntentRecord.java
@@ -20,7 +20,6 @@
import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
import android.app.ActivityManager;
-import android.app.IActivityContainer;
import android.content.IIntentSender;
import android.content.IIntentReceiver;
import android.app.PendingIntent;
@@ -37,7 +36,6 @@
import android.util.TimeUtils;
import com.android.internal.os.IResultReceiver;
-import com.android.server.am.ActivityStackSupervisor.ActivityContainer;
import java.io.PrintWriter;
import java.lang.ref.WeakReference;
@@ -234,30 +232,23 @@
public void send(int code, Intent intent, String resolvedType, IBinder whitelistToken,
IIntentReceiver finishedReceiver, String requiredPermission, Bundle options) {
sendInner(code, intent, resolvedType, whitelistToken, finishedReceiver,
- requiredPermission, null, null, 0, 0, 0, options, null);
+ requiredPermission, null, null, 0, 0, 0, options);
}
public int sendWithResult(int code, Intent intent, String resolvedType, IBinder whitelistToken,
IIntentReceiver finishedReceiver, String requiredPermission, Bundle options) {
return sendInner(code, intent, resolvedType, whitelistToken, finishedReceiver,
- requiredPermission, null, null, 0, 0, 0, options, null);
+ requiredPermission, null, null, 0, 0, 0, options);
}
int sendInner(int code, Intent intent, String resolvedType, IBinder whitelistToken,
IIntentReceiver finishedReceiver,
String requiredPermission, IBinder resultTo, String resultWho, int requestCode,
- int flagsMask, int flagsValues, Bundle options, IActivityContainer container) {
+ int flagsMask, int flagsValues, Bundle options) {
if (intent != null) intent.setDefusable(true);
if (options != null) options.setDefusable(true);
synchronized (owner) {
- final ActivityContainer activityContainer = (ActivityContainer)container;
- if (activityContainer != null && activityContainer.mParentActivity != null &&
- activityContainer.mParentActivity.state
- != ActivityStack.ActivityState.RESUMED) {
- // Cannot start a child activity if the parent is not resumed.
- return ActivityManager.START_CANCELED;
- }
if (!canceled) {
sent = true;
if ((key.flags&PendingIntent.FLAG_ONE_SHOT) != 0) {
@@ -346,7 +337,7 @@
} else {
owner.startActivityInPackage(uid, key.packageName, finalIntent,
resolvedType, resultTo, resultWho, requestCode, 0,
- options, userId, container, null, "PendingIntentRecord");
+ options, userId, null, "PendingIntentRecord");
}
} catch (RuntimeException e) {
Slog.w(TAG, "Unable to send startActivity intent", e);
diff --git a/services/core/java/com/android/server/am/PinnedActivityStack.java b/services/core/java/com/android/server/am/PinnedActivityStack.java
index 2010c24..392fbb2 100644
--- a/services/core/java/com/android/server/am/PinnedActivityStack.java
+++ b/services/core/java/com/android/server/am/PinnedActivityStack.java
@@ -20,7 +20,6 @@
import android.content.res.Configuration;
import android.graphics.Rect;
-import com.android.server.am.ActivityStackSupervisor.ActivityContainer;
import com.android.server.wm.PinnedStackWindowController;
import com.android.server.wm.PinnedStackWindowListener;
@@ -33,9 +32,9 @@
class PinnedActivityStack extends ActivityStack<PinnedStackWindowController>
implements PinnedStackWindowListener {
- PinnedActivityStack(ActivityContainer activityContainer,
- RecentTasks recentTasks, boolean onTop) {
- super(activityContainer, recentTasks, onTop);
+ PinnedActivityStack(ActivityStackSupervisor.ActivityDisplay display, int stackId,
+ ActivityStackSupervisor supervisor, RecentTasks recentTasks, boolean onTop) {
+ super(display, stackId, supervisor, recentTasks, onTop);
}
@Override
diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java
index 53c7f84..411e973 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -143,7 +143,7 @@
ActiveInstrumentation instr;// Set to currently active instrumentation running in process
boolean usingWrapper; // Set to true when process was launched with a wrapper attached
final ArraySet<BroadcastRecord> curReceivers = new ArraySet<BroadcastRecord>();// receivers currently running in the app
- long lastWakeTime; // How long proc held wake lock at last check
+ long whenUnimportant; // When (uptime) the process last became unimportant
long lastCpuTime; // How long proc has run CPU at last check
long curCpuTime; // How long proc has run CPU most recently
long lastRequestedGc; // When we last asked the app to do a gc
@@ -204,7 +204,7 @@
boolean whitelistManager;
void dump(PrintWriter pw, String prefix) {
- final long now = SystemClock.uptimeMillis();
+ final long nowUptime = SystemClock.uptimeMillis();
pw.print(prefix); pw.print("user #"); pw.print(userId);
pw.print(" uid="); pw.print(info.uid);
@@ -254,11 +254,11 @@
pw.print(prefix); pw.print("pid="); pw.print(pid); pw.print(" starting=");
pw.println(starting);
pw.print(prefix); pw.print("lastActivityTime=");
- TimeUtils.formatDuration(lastActivityTime, now, pw);
+ TimeUtils.formatDuration(lastActivityTime, nowUptime, pw);
pw.print(" lastPssTime=");
- TimeUtils.formatDuration(lastPssTime, now, pw);
+ TimeUtils.formatDuration(lastPssTime, nowUptime, pw);
pw.print(" nextPssTime=");
- TimeUtils.formatDuration(nextPssTime, now, pw);
+ TimeUtils.formatDuration(nextPssTime, nowUptime, pw);
pw.println();
pw.print(prefix); pw.print("adjSeq="); pw.print(adjSeq);
pw.print(" lruSeq="); pw.print(lruSeq);
@@ -294,7 +294,7 @@
pw.print(" pssProcState="); pw.print(pssProcState);
pw.print(" setProcState="); pw.print(setProcState);
pw.print(" lastStateTime=");
- TimeUtils.formatDuration(lastStateTime, now, pw);
+ TimeUtils.formatDuration(lastStateTime, nowUptime, pw);
pw.println();
if (hasShownUi || pendingUiClean || hasAboveClient || treatLikeActivity) {
pw.print(prefix); pw.print("hasShownUi="); pw.print(hasShownUi);
@@ -334,29 +334,26 @@
}
if (lastProviderTime > 0) {
pw.print(prefix); pw.print("lastProviderTime=");
- TimeUtils.formatDuration(lastProviderTime, now, pw);
+ TimeUtils.formatDuration(lastProviderTime, nowUptime, pw);
pw.println();
}
if (hasStartedServices) {
pw.print(prefix); pw.print("hasStartedServices="); pw.println(hasStartedServices);
}
- if (setProcState >= ActivityManager.PROCESS_STATE_SERVICE) {
- long wtime;
- synchronized (mBatteryStats) {
- wtime = mBatteryStats.getProcessWakeTime(info.uid,
- pid, SystemClock.elapsedRealtime());
- }
- pw.print(prefix); pw.print("lastWakeTime="); pw.print(lastWakeTime);
- pw.print(" timeUsed=");
- TimeUtils.formatDuration(wtime-lastWakeTime, pw); pw.println("");
+ if (setProcState > ActivityManager.PROCESS_STATE_SERVICE) {
pw.print(prefix); pw.print("lastCpuTime="); pw.print(lastCpuTime);
- pw.print(" timeUsed=");
- TimeUtils.formatDuration(curCpuTime-lastCpuTime, pw); pw.println("");
+ if (lastCpuTime > 0) {
+ pw.print(" timeUsed=");
+ TimeUtils.formatDuration(curCpuTime - lastCpuTime, pw);
+ }
+ pw.print(" whenUnimportant=");
+ TimeUtils.formatDuration(whenUnimportant - nowUptime, pw);
+ pw.println();
}
pw.print(prefix); pw.print("lastRequestedGc=");
- TimeUtils.formatDuration(lastRequestedGc, now, pw);
+ TimeUtils.formatDuration(lastRequestedGc, nowUptime, pw);
pw.print(" lastLowMemory=");
- TimeUtils.formatDuration(lastLowMemory, now, pw);
+ TimeUtils.formatDuration(lastLowMemory, nowUptime, pw);
pw.print(" reportLowMemory="); pw.println(reportLowMemory);
if (killed || killedByAm || waitingToKill != null) {
pw.print(prefix); pw.print("killed="); pw.print(killed);
diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java
index 96d8573..5753fbc 100644
--- a/services/core/java/com/android/server/am/TaskRecord.java
+++ b/services/core/java/com/android/server/am/TaskRecord.java
@@ -1045,8 +1045,7 @@
}
// We need to provide the current orientation of the display on which this task resides,
// not the orientation of the task.
- final int orientation =
- getStack().mActivityContainer.mActivityDisplay.getConfiguration().orientation;
+ final int orientation = getStack().getDisplay().getConfiguration().orientation;
return setLastThumbnailLocked(thumbnail, taskWidth, taskHeight, orientation);
}
@@ -1582,7 +1581,8 @@
*/
boolean canBeLaunchedOnDisplay(int displayId) {
return mService.mStackSupervisor.canPlaceEntityOnDisplay(displayId,
- isResizeable(false /* checkSupportsPip */));
+ isResizeable(false /* checkSupportsPip */), -1 /* don't check PID */,
+ -1 /* don't check UID */, null /* activityInfo */);
}
/**
diff --git a/services/core/java/com/android/server/am/UidRecord.java b/services/core/java/com/android/server/am/UidRecord.java
index c411bce..8efcb4f 100644
--- a/services/core/java/com/android/server/am/UidRecord.java
+++ b/services/core/java/com/android/server/am/UidRecord.java
@@ -39,6 +39,7 @@
boolean curWhitelist;
boolean setWhitelist;
boolean idle;
+ boolean setIdle;
int numProcs;
/**
@@ -79,10 +80,11 @@
final Object networkStateLock = new Object();
static final int CHANGE_PROCSTATE = 0;
- static final int CHANGE_GONE = 1;
- static final int CHANGE_GONE_IDLE = 2;
- static final int CHANGE_IDLE = 3;
- static final int CHANGE_ACTIVE = 4;
+ static final int CHANGE_GONE = 1<<0;
+ static final int CHANGE_IDLE = 1<<1;
+ static final int CHANGE_ACTIVE = 1<<2;
+ static final int CHANGE_CACHED = 1<<3;
+ static final int CHANGE_UNCACHED = 1<<4;
static final class ChangeItem {
UidRecord uidRecord;
@@ -94,6 +96,7 @@
}
ChangeItem pendingChange;
+ int lastReportedChange;
public UidRecord(int _uid) {
uid = _uid;
@@ -112,12 +115,12 @@
}
/**
- * If the change being dispatched is neither CHANGE_GONE nor CHANGE_GONE_IDLE (not interested in
+ * If the change being dispatched is not CHANGE_GONE (not interested in
* these changes), then update the {@link #lastDispatchedProcStateSeq} with
* {@link #curProcStateSeq}.
*/
public void updateLastDispatchedProcStateSeq(int changeToDispatch) {
- if (changeToDispatch != CHANGE_GONE && changeToDispatch != CHANGE_GONE_IDLE) {
+ if ((changeToDispatch & CHANGE_GONE) == 0) {
lastDispatchedProcStateSeq = curProcStateSeq;
}
}
@@ -146,6 +149,41 @@
if (idle) {
sb.append(" idle");
}
+ if (lastReportedChange != 0) {
+ sb.append(" change:");
+ boolean printed = false;
+ if ((lastReportedChange & CHANGE_GONE) != 0) {
+ printed = true;
+ sb.append("gone");
+ }
+ if ((lastReportedChange & CHANGE_IDLE) != 0) {
+ if (printed) {
+ sb.append("|");
+ }
+ printed = true;
+ sb.append("idle");
+ }
+ if ((lastReportedChange & CHANGE_ACTIVE) != 0) {
+ if (printed) {
+ sb.append("|");
+ }
+ printed = true;
+ sb.append("active");
+ }
+ if ((lastReportedChange & CHANGE_CACHED) != 0) {
+ if (printed) {
+ sb.append("|");
+ }
+ printed = true;
+ sb.append("cached");
+ }
+ if ((lastReportedChange & CHANGE_UNCACHED) != 0) {
+ if (printed) {
+ sb.append("|");
+ }
+ sb.append("uncached");
+ }
+ }
sb.append(" procs:");
sb.append(numProcs);
sb.append(" seq(");
diff --git a/services/core/java/com/android/server/am/UriPermission.java b/services/core/java/com/android/server/am/UriPermission.java
index 0aa54d9..90577e3 100644
--- a/services/core/java/com/android/server/am/UriPermission.java
+++ b/services/core/java/com/android/server/am/UriPermission.java
@@ -17,6 +17,7 @@
package com.android.server.am;
import android.content.Intent;
+import android.os.Binder;
import android.os.UserHandle;
import android.util.ArraySet;
import android.util.Log;
@@ -101,7 +102,8 @@
Slog.d(TAG,
"Permission for " + targetPkg + " to " + uri + " is changing from 0x"
+ Integer.toHexString(oldModeFlags) + " to 0x"
- + Integer.toHexString(modeFlags),
+ + Integer.toHexString(modeFlags) + " via calling UID "
+ + Binder.getCallingUid() + " PID " + Binder.getCallingPid(),
new Throwable());
}
}
diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java
index f720cd5..405ee32 100644
--- a/services/core/java/com/android/server/am/UserController.java
+++ b/services/core/java/com/android/server/am/UserController.java
@@ -1478,6 +1478,10 @@
case UserState.STATE_RUNNING_UNLOCKING:
case UserState.STATE_RUNNING_UNLOCKED:
return true;
+ // In the stopping/shutdown state return unlock state of the user key
+ case UserState.STATE_STOPPING:
+ case UserState.STATE_SHUTDOWN:
+ return StorageManager.isUserKeyUnlocked(userId);
default:
return false;
}
@@ -1486,13 +1490,16 @@
switch (state.state) {
case UserState.STATE_RUNNING_UNLOCKED:
return true;
+ // In the stopping/shutdown state return unlock state of the user key
+ case UserState.STATE_STOPPING:
+ case UserState.STATE_SHUTDOWN:
+ return StorageManager.isUserKeyUnlocked(userId);
default:
return false;
}
}
- // One way or another, we're running!
- return true;
+ return state.state != UserState.STATE_STOPPING && state.state != UserState.STATE_SHUTDOWN;
}
UserInfo getCurrentUser() {
diff --git a/services/core/java/com/android/server/am/UserState.java b/services/core/java/com/android/server/am/UserState.java
index b89586d..2e27387 100644
--- a/services/core/java/com/android/server/am/UserState.java
+++ b/services/core/java/com/android/server/am/UserState.java
@@ -20,6 +20,7 @@
import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
import android.app.IStopUserCallback;
+import android.os.Trace;
import android.os.UserHandle;
import android.util.ArrayMap;
import android.util.Slog;
@@ -81,9 +82,18 @@
if (newState == state) {
return;
}
- Slog.i(TAG, "User " + mHandle.getIdentifier() + " state changed from "
+ final int userId = mHandle.getIdentifier();
+ if (state != STATE_BOOTING) {
+ Trace.asyncTraceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER,
+ stateToString(state) + " " + userId, userId);
+ }
+ if (newState != STATE_SHUTDOWN) {
+ Trace.asyncTraceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,
+ stateToString(newState) + " " + userId, userId);
+ }
+ Slog.i(TAG, "User " + userId + " state changed from "
+ stateToString(state) + " to " + stateToString(newState));
- EventLogTags.writeAmUserStateChanged(mHandle.getIdentifier(), newState);
+ EventLogTags.writeAmUserStateChanged(userId, newState);
lastState = state;
state = newState;
}
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index dda8c1c..0d3ee93 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -28,6 +28,7 @@
import android.app.ActivityManagerInternal;
import android.app.AppGlobals;
import android.app.AppOpsManager;
+import android.app.IUidObserver;
import android.app.NotificationManager;
import android.bluetooth.BluetoothA2dp;
import android.bluetooth.BluetoothAdapter;
@@ -624,6 +625,32 @@
}
}
+ final private IUidObserver mUidObserver = new IUidObserver.Stub() {
+ @Override public void onUidStateChanged(int uid, int procState, long procStateSeq) {
+ }
+
+ @Override public void onUidGone(int uid, boolean disabled) {
+ // Once the uid is no longer running, no need to keep trying to disable its audio.
+ disableAudioForUid(false, uid);
+ }
+
+ @Override public void onUidActive(int uid) throws RemoteException {
+ }
+
+ @Override public void onUidIdle(int uid, boolean disabled) {
+ }
+
+ @Override public void onUidCachedChanged(int uid, boolean cached) {
+ disableAudioForUid(cached, uid);
+ }
+
+ private void disableAudioForUid(boolean disable, int uid) {
+ queueMsgUnderWakeLock(mAudioHandler, MSG_DISABLE_AUDIO_FOR_UID,
+ disable ? 1 : 0 /* arg1 */, uid /* arg2 */,
+ null /* obj */, 0 /* delay */);
+ }
+ };
+
///////////////////////////////////////////////////////////////////////////
// Construction
///////////////////////////////////////////////////////////////////////////
@@ -719,6 +746,8 @@
mMediaFocusControl = new MediaFocusControl(mContext, mPlaybackMonitor);
+ mRecordMonitor = new RecordingActivityMonitor(mContext);
+
readAndSetLowRamDevice();
// Call setRingerModeInt() to apply correct mute
@@ -767,6 +796,13 @@
public void systemReady() {
sendMsg(mAudioHandler, MSG_SYSTEM_READY, SENDMSG_QUEUE,
0, 0, null, 0);
+ try {
+ ActivityManager.getService().registerUidObserver(mUidObserver,
+ ActivityManager.UID_OBSERVER_CACHED | ActivityManager.UID_OBSERVER_GONE,
+ ActivityManager.PROCESS_STATE_UNKNOWN, null);
+ } catch (RemoteException e) {
+ // ignored; both services live in system_server
+ }
}
public void onSystemReady() {
@@ -1933,6 +1969,7 @@
streamType = getActiveStreamType(streamType);
}
synchronized (VolumeStreamState.class) {
+ ensureValidStreamType(streamType);
return mStreamStates[streamType].mIsMuted;
}
}
@@ -6346,6 +6383,8 @@
dumpAudioPolicies(pw);
mPlaybackMonitor.dump(pw);
+
+ mRecordMonitor.dump(pw);
}
private static String safeMediaVolumeStateToString(Integer state) {
@@ -6628,13 +6667,6 @@
}
}
}
-
- @Override
- public void disableAudioForUid(boolean disable, int uid) {
- queueMsgUnderWakeLock(mAudioHandler, MSG_DISABLE_AUDIO_FOR_UID,
- disable ? 1 : 0 /* arg1 */, uid /* arg2 */,
- null /* obj */, 0 /* delay */);
- }
}
//==========================================================================================
@@ -6774,10 +6806,13 @@
//======================
// Audio policy callbacks from AudioSystem for recording configuration updates
//======================
- private final RecordingActivityMonitor mRecordMonitor = new RecordingActivityMonitor();
+ private final RecordingActivityMonitor mRecordMonitor;
public void registerRecordingCallback(IRecordingConfigDispatcher rcdb) {
- mRecordMonitor.registerRecordingCallback(rcdb);
+ final boolean isPrivileged =
+ (PackageManager.PERMISSION_GRANTED == mContext.checkCallingPermission(
+ android.Manifest.permission.MODIFY_AUDIO_ROUTING));
+ mRecordMonitor.registerRecordingCallback(rcdb, isPrivileged);
}
public void unregisterRecordingCallback(IRecordingConfigDispatcher rcdb) {
@@ -6785,7 +6820,10 @@
}
public List<AudioRecordingConfiguration> getActiveRecordingConfigurations() {
- return mRecordMonitor.getActiveRecordingConfigurations();
+ final boolean isPrivileged =
+ (PackageManager.PERMISSION_GRANTED == mContext.checkCallingPermission(
+ android.Manifest.permission.MODIFY_AUDIO_ROUTING));
+ return mRecordMonitor.getActiveRecordingConfigurations(isPrivileged);
}
public void disableRingtoneSync(final int userId) {
diff --git a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java
index 663559f..9ef45ea 100644
--- a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java
+++ b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java
@@ -34,6 +34,7 @@
import java.io.PrintWriter;
import java.text.DateFormat;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
@@ -224,11 +225,18 @@
pw.println("\nPlaybackActivityMonitor dump time: "
+ DateFormat.getTimeInstance().format(new Date()));
synchronized(mPlayerLock) {
- for (AudioPlaybackConfiguration conf : mPlayers.values()) {
- conf.dump(pw);
+ // all players
+ pw.println("\n players:");
+ final List<Integer> piidIntList = new ArrayList<Integer>(mPlayers.keySet());
+ Collections.sort(piidIntList);
+ for (Integer piidInt : piidIntList) {
+ final AudioPlaybackConfiguration apc = mPlayers.get(piidInt);
+ if (apc != null) {
+ apc.dump(pw);
+ }
}
// ducked players
- pw.println("\n ducked players:");
+ pw.println("\n ducked players piids:");
mDuckingManager.dump(pw);
// players muted due to the device ringing or being in a call
pw.print("\n muted player piids:");
diff --git a/services/core/java/com/android/server/audio/RecordingActivityMonitor.java b/services/core/java/com/android/server/audio/RecordingActivityMonitor.java
index 57d55de..34309b6 100644
--- a/services/core/java/com/android/server/audio/RecordingActivityMonitor.java
+++ b/services/core/java/com/android/server/audio/RecordingActivityMonitor.java
@@ -16,8 +16,11 @@
package com.android.server.audio;
+import android.content.Context;
+import android.content.pm.PackageManager;
import android.media.AudioFormat;
import android.media.AudioManager;
+import android.media.AudioPlaybackConfiguration;
import android.media.AudioRecordingConfiguration;
import android.media.AudioSystem;
import android.media.IRecordingConfigDispatcher;
@@ -26,7 +29,10 @@
import android.os.RemoteException;
import android.util.Log;
+import java.io.PrintWriter;
+import java.text.DateFormat;
import java.util.ArrayList;
+import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
@@ -39,31 +45,47 @@
public final static String TAG = "AudioService.RecordingActivityMonitor";
private ArrayList<RecMonitorClient> mClients = new ArrayList<RecMonitorClient>();
+ // a public client is one that needs an anonymized version of the playback configurations, we
+ // keep track of whether there is at least one to know when we need to create the list of
+ // playback configurations that do not contain uid/package name information.
+ private boolean mHasPublicClients = false;
private HashMap<Integer, AudioRecordingConfiguration> mRecordConfigs =
new HashMap<Integer, AudioRecordingConfiguration>();
- RecordingActivityMonitor() {
+ private final PackageManager mPackMan;
+
+ RecordingActivityMonitor(Context ctxt) {
RecMonitorClient.sMonitor = this;
+ mPackMan = ctxt.getPackageManager();
}
/**
* Implementation of android.media.AudioSystem.AudioRecordingCallback
*/
- public void onRecordingConfigurationChanged(int event, int session, int source,
- int[] recordingInfo) {
+ public void onRecordingConfigurationChanged(int event, int uid, int session, int source,
+ int[] recordingInfo, String packName) {
if (MediaRecorder.isSystemOnlyAudioSource(source)) {
return;
}
- final List<AudioRecordingConfiguration> configs =
- updateSnapshot(event, session, source, recordingInfo);
- if (configs != null){
- synchronized(mClients) {
+ final List<AudioRecordingConfiguration> configsSystem =
+ updateSnapshot(event, uid, session, source, recordingInfo);
+ if (configsSystem != null){
+ synchronized (mClients) {
+ // list of recording configurations for "public consumption". It is only computed if
+ // there are non-system recording activity listeners.
+ final List<AudioRecordingConfiguration> configsPublic = mHasPublicClients ?
+ anonymizeForPublicConsumption(configsSystem) :
+ new ArrayList<AudioRecordingConfiguration>();
final Iterator<RecMonitorClient> clientIterator = mClients.iterator();
while (clientIterator.hasNext()) {
+ final RecMonitorClient rmc = clientIterator.next();
try {
- clientIterator.next().mDispatcherCb.dispatchRecordingConfigChange(
- configs);
+ if (rmc.mIsPrivileged) {
+ rmc.mDispatcherCb.dispatchRecordingConfigChange(configsSystem);
+ } else {
+ rmc.mDispatcherCb.dispatchRecordingConfigChange(configsPublic);
+ }
} catch (RemoteException e) {
Log.w(TAG, "Could not call dispatchRecordingConfigChange() on client", e);
}
@@ -72,17 +94,42 @@
}
}
+ protected void dump(PrintWriter pw) {
+ // players
+ pw.println("\nRecordActivityMonitor dump time: "
+ + DateFormat.getTimeInstance().format(new Date()));
+ synchronized(mRecordConfigs) {
+ for (AudioRecordingConfiguration conf : mRecordConfigs.values()) {
+ conf.dump(pw);
+ }
+ }
+ }
+
+ private ArrayList<AudioRecordingConfiguration> anonymizeForPublicConsumption(
+ List<AudioRecordingConfiguration> sysConfigs) {
+ ArrayList<AudioRecordingConfiguration> publicConfigs =
+ new ArrayList<AudioRecordingConfiguration>();
+ // only add active anonymized configurations,
+ for (AudioRecordingConfiguration config : sysConfigs) {
+ publicConfigs.add(AudioRecordingConfiguration.anonymizedCopy(config));
+ }
+ return publicConfigs;
+ }
+
void initMonitor() {
AudioSystem.setRecordingCallback(this);
}
- void registerRecordingCallback(IRecordingConfigDispatcher rcdb) {
+ void registerRecordingCallback(IRecordingConfigDispatcher rcdb, boolean isPrivileged) {
if (rcdb == null) {
return;
}
- synchronized(mClients) {
- final RecMonitorClient rmc = new RecMonitorClient(rcdb);
+ synchronized (mClients) {
+ final RecMonitorClient rmc = new RecMonitorClient(rcdb, isPrivileged);
if (rmc.init()) {
+ if (!isPrivileged) {
+ mHasPublicClients = true;
+ }
mClients.add(rmc);
}
}
@@ -92,22 +139,34 @@
if (rcdb == null) {
return;
}
- synchronized(mClients) {
+ synchronized (mClients) {
final Iterator<RecMonitorClient> clientIterator = mClients.iterator();
+ boolean hasPublicClients = false;
while (clientIterator.hasNext()) {
RecMonitorClient rmc = clientIterator.next();
if (rcdb.equals(rmc.mDispatcherCb)) {
rmc.release();
clientIterator.remove();
- break;
+ } else {
+ if (!rmc.mIsPrivileged) {
+ hasPublicClients = true;
+ }
}
}
+ mHasPublicClients = hasPublicClients;
}
}
- List<AudioRecordingConfiguration> getActiveRecordingConfigurations() {
+ List<AudioRecordingConfiguration> getActiveRecordingConfigurations(boolean isPrivileged) {
synchronized(mRecordConfigs) {
- return new ArrayList<AudioRecordingConfiguration>(mRecordConfigs.values());
+ if (isPrivileged) {
+ return new ArrayList<AudioRecordingConfiguration>(mRecordConfigs.values());
+ } else {
+ final List<AudioRecordingConfiguration> configsPublic =
+ anonymizeForPublicConsumption(
+ new ArrayList<AudioRecordingConfiguration>(mRecordConfigs.values()));
+ return configsPublic;
+ }
}
}
@@ -122,8 +181,8 @@
* @return null if the list of active recording sessions has not been modified, a list
* with the current active configurations otherwise.
*/
- private List<AudioRecordingConfiguration> updateSnapshot(int event, int session, int source,
- int[] recordingInfo) {
+ private List<AudioRecordingConfiguration> updateSnapshot(int event, int uid, int session,
+ int source, int[] recordingInfo) {
final boolean configChanged;
final ArrayList<AudioRecordingConfiguration> configs;
synchronized(mRecordConfigs) {
@@ -147,10 +206,19 @@
.build();
final int patchHandle = recordingInfo[6];
final Integer sessionKey = new Integer(session);
+
+ final String[] packages = mPackMan.getPackagesForUid(uid);
+ final String packageName;
+ if (packages != null && packages.length > 0) {
+ packageName = packages[0];
+ } else {
+ packageName = "";
+ }
+ final AudioRecordingConfiguration updatedConfig =
+ new AudioRecordingConfiguration(uid, session, source,
+ clientFormat, deviceFormat, patchHandle, packageName);
+
if (mRecordConfigs.containsKey(sessionKey)) {
- final AudioRecordingConfiguration updatedConfig =
- new AudioRecordingConfiguration(session, source,
- clientFormat, deviceFormat, patchHandle);
if (updatedConfig.equals(mRecordConfigs.get(sessionKey))) {
configChanged = false;
} else {
@@ -160,9 +228,7 @@
configChanged = true;
}
} else {
- mRecordConfigs.put(sessionKey,
- new AudioRecordingConfiguration(session, source,
- clientFormat, deviceFormat, patchHandle));
+ mRecordConfigs.put(sessionKey, updatedConfig);
configChanged = true;
}
break;
@@ -189,9 +255,11 @@
static RecordingActivityMonitor sMonitor;
final IRecordingConfigDispatcher mDispatcherCb;
+ final boolean mIsPrivileged;
- RecMonitorClient(IRecordingConfigDispatcher rcdb) {
+ RecMonitorClient(IRecordingConfigDispatcher rcdb, boolean isPrivileged) {
mDispatcherCb = rcdb;
+ mIsPrivileged = isPrivileged;
}
public void binderDied() {
diff --git a/services/core/java/com/android/server/broadcastradio/BroadcastRadioService.java b/services/core/java/com/android/server/broadcastradio/BroadcastRadioService.java
new file mode 100644
index 0000000..8fdbcf6c
--- /dev/null
+++ b/services/core/java/com/android/server/broadcastradio/BroadcastRadioService.java
@@ -0,0 +1,100 @@
+/**
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.broadcastradio;
+
+import android.Manifest;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.hardware.radio.IRadioService;
+import android.hardware.radio.ITuner;
+import android.hardware.radio.ITunerCallback;
+import android.hardware.radio.RadioManager;
+import android.os.ParcelableException;
+
+import com.android.server.SystemService;
+
+import java.util.List;
+
+public class BroadcastRadioService extends SystemService {
+ private final ServiceImpl mServiceImpl = new ServiceImpl();
+
+ /**
+ * This field is used by native code, do not access or modify.
+ */
+ private final long mNativeContext = nativeInit();
+
+ private final Object mLock = new Object();
+ private List<RadioManager.ModuleProperties> mModules = null;
+
+ public BroadcastRadioService(Context context) {
+ super(context);
+ }
+
+ @Override
+ protected void finalize() throws Throwable {
+ nativeFinalize(mNativeContext);
+ super.finalize();
+ }
+
+ private native long nativeInit();
+ private native void nativeFinalize(long nativeContext);
+ private native List<RadioManager.ModuleProperties> nativeLoadModules(long nativeContext);
+ private native Tuner nativeOpenTuner(long nativeContext, int moduleId,
+ RadioManager.BandConfig config, boolean withAudio, ITunerCallback callback);
+
+ @Override
+ public void onStart() {
+ publishBinderService(Context.RADIO_SERVICE, mServiceImpl);
+ }
+
+ private class ServiceImpl extends IRadioService.Stub {
+ private void enforcePolicyAccess() {
+ if (PackageManager.PERMISSION_GRANTED != getContext().checkCallingPermission(
+ Manifest.permission.ACCESS_BROADCAST_RADIO)) {
+ throw new SecurityException("ACCESS_BROADCAST_RADIO permission not granted");
+ }
+ }
+
+ @Override
+ public List<RadioManager.ModuleProperties> listModules() {
+ enforcePolicyAccess();
+ synchronized (mLock) {
+ if (mModules != null) return mModules;
+
+ mModules = nativeLoadModules(mNativeContext);
+ if (mModules == null) {
+ throw new ParcelableException(new NullPointerException(
+ "couldn't load radio modules"));
+ }
+
+ return mModules;
+ }
+ }
+
+ @Override
+ public ITuner openTuner(int moduleId, RadioManager.BandConfig bandConfig,
+ boolean withAudio, ITunerCallback callback) {
+ enforcePolicyAccess();
+ if (callback == null) {
+ throw new IllegalArgumentException("Callback must not be empty");
+ }
+ synchronized (mLock) {
+ return nativeOpenTuner(mNativeContext, moduleId, bandConfig, withAudio, callback);
+ }
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/broadcastradio/Tuner.java b/services/core/java/com/android/server/broadcastradio/Tuner.java
new file mode 100644
index 0000000..b9a1e81
--- /dev/null
+++ b/services/core/java/com/android/server/broadcastradio/Tuner.java
@@ -0,0 +1,279 @@
+/**
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.broadcastradio;
+
+import android.annotation.NonNull;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.hardware.radio.ITuner;
+import android.hardware.radio.ITunerCallback;
+import android.hardware.radio.ProgramSelector;
+import android.hardware.radio.RadioManager;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.util.Slog;
+
+import java.util.List;
+
+class Tuner extends ITuner.Stub {
+ private static final String TAG = "BroadcastRadioService.Tuner";
+
+ /**
+ * This field is used by native code, do not access or modify.
+ */
+ private final long mNativeContext;
+
+ private final Object mLock = new Object();
+ @NonNull private final TunerCallback mTunerCallback;
+ @NonNull private final ITunerCallback mClientCallback;
+ @NonNull private final IBinder.DeathRecipient mDeathRecipient;
+
+ private boolean mIsClosed = false;
+ private boolean mIsMuted = false;
+ private int mRegion; // TODO(b/62710330): find better solution to handle regions
+ private final boolean mWithAudio;
+
+ Tuner(@NonNull ITunerCallback clientCallback, int halRev,
+ int region, boolean withAudio, int band) {
+ mClientCallback = clientCallback;
+ mTunerCallback = new TunerCallback(this, clientCallback, halRev);
+ mRegion = region;
+ mWithAudio = withAudio;
+ mNativeContext = nativeInit(halRev, withAudio, band);
+ mDeathRecipient = this::close;
+ try {
+ mClientCallback.asBinder().linkToDeath(mDeathRecipient, 0);
+ } catch (RemoteException ex) {
+ close();
+ }
+ }
+
+ @Override
+ protected void finalize() throws Throwable {
+ nativeFinalize(mNativeContext);
+ super.finalize();
+ }
+
+ private native long nativeInit(int halRev, boolean withAudio, int band);
+ private native void nativeFinalize(long nativeContext);
+ private native void nativeClose(long nativeContext);
+
+ private native void nativeSetConfiguration(long nativeContext,
+ @NonNull RadioManager.BandConfig config);
+ private native RadioManager.BandConfig nativeGetConfiguration(long nativeContext, int region);
+
+ private native void nativeStep(long nativeContext, boolean directionDown, boolean skipSubChannel);
+ private native void nativeScan(long nativeContext, boolean directionDown, boolean skipSubChannel);
+ private native void nativeTune(long nativeContext, @NonNull ProgramSelector selector);
+ private native void nativeCancel(long nativeContext);
+
+ private native void nativeCancelAnnouncement(long nativeContext);
+
+ private native RadioManager.ProgramInfo nativeGetProgramInformation(long nativeContext);
+ private native boolean nativeStartBackgroundScan(long nativeContext);
+ private native List<RadioManager.ProgramInfo> nativeGetProgramList(long nativeContext,
+ String filter);
+
+ private native byte[] nativeGetImage(long nativeContext, int id);
+
+ private native boolean nativeIsAnalogForced(long nativeContext);
+ private native void nativeSetAnalogForced(long nativeContext, boolean isForced);
+
+ private native boolean nativeIsAntennaConnected(long nativeContext);
+
+ @Override
+ public void close() {
+ synchronized (mLock) {
+ if (mIsClosed) return;
+ mIsClosed = true;
+ mTunerCallback.detach();
+ mClientCallback.asBinder().unlinkToDeath(mDeathRecipient, 0);
+ nativeClose(mNativeContext);
+ }
+ }
+
+ @Override
+ public boolean isClosed() {
+ return mIsClosed;
+ }
+
+ private void checkNotClosedLocked() {
+ if (mIsClosed) {
+ throw new IllegalStateException("Tuner is closed, no further operations are allowed");
+ }
+ }
+
+ @Override
+ public void setConfiguration(RadioManager.BandConfig config) {
+ if (config == null) {
+ throw new IllegalArgumentException("The argument must not be a null pointer");
+ }
+ synchronized (mLock) {
+ checkNotClosedLocked();
+ nativeSetConfiguration(mNativeContext, config);
+ mRegion = config.getRegion();
+ }
+ }
+
+ @Override
+ public RadioManager.BandConfig getConfiguration() {
+ synchronized (mLock) {
+ checkNotClosedLocked();
+ return nativeGetConfiguration(mNativeContext, mRegion);
+ }
+ }
+
+ @Override
+ public void setMuted(boolean mute) {
+ if (!mWithAudio) {
+ throw new IllegalStateException("Can't operate on mute - no audio requested");
+ }
+ synchronized (mLock) {
+ checkNotClosedLocked();
+ if (mIsMuted == mute) return;
+ mIsMuted = mute;
+
+ // TODO(b/62713378): notifify audio policy manager of media activity on radio audio
+ // device. This task is pulled directly from previous implementation of native service.
+ }
+ }
+
+ @Override
+ public boolean isMuted() {
+ if (!mWithAudio) {
+ Slog.w(TAG, "Tuner did not request audio, pretending it was muted");
+ return true;
+ }
+ synchronized (mLock) {
+ checkNotClosedLocked();
+ return mIsMuted;
+ }
+ }
+
+ @Override
+ public void step(boolean directionDown, boolean skipSubChannel) {
+ synchronized (mLock) {
+ checkNotClosedLocked();
+ nativeStep(mNativeContext, directionDown, skipSubChannel);
+ }
+ }
+
+ @Override
+ public void scan(boolean directionDown, boolean skipSubChannel) {
+ synchronized (mLock) {
+ checkNotClosedLocked();
+ nativeScan(mNativeContext, directionDown, skipSubChannel);
+ }
+ }
+
+ @Override
+ public void tune(ProgramSelector selector) {
+ if (selector == null) {
+ throw new IllegalArgumentException("The argument must not be a null pointer");
+ }
+ Slog.i(TAG, "Tuning to " + selector);
+ synchronized (mLock) {
+ checkNotClosedLocked();
+ nativeTune(mNativeContext, selector);
+ }
+ }
+
+ @Override
+ public void cancel() {
+ synchronized (mLock) {
+ checkNotClosedLocked();
+ nativeCancel(mNativeContext);
+ }
+ }
+
+ @Override
+ public void cancelAnnouncement() {
+ synchronized (mLock) {
+ checkNotClosedLocked();
+ nativeCancelAnnouncement(mNativeContext);
+ }
+ }
+
+ @Override
+ public RadioManager.ProgramInfo getProgramInformation() {
+ synchronized (mLock) {
+ checkNotClosedLocked();
+ return nativeGetProgramInformation(mNativeContext);
+ }
+ }
+
+ @Override
+ public Bitmap getImage(int id) {
+ if (id == 0) {
+ throw new IllegalArgumentException("Image ID is missing");
+ }
+
+ byte[] rawImage;
+ synchronized (mLock) {
+ rawImage = nativeGetImage(mNativeContext, id);
+ }
+ if (rawImage == null || rawImage.length == 0) {
+ return null;
+ }
+
+ return BitmapFactory.decodeByteArray(rawImage, 0, rawImage.length);
+ }
+
+ @Override
+ public boolean startBackgroundScan() {
+ synchronized (mLock) {
+ checkNotClosedLocked();
+ return nativeStartBackgroundScan(mNativeContext);
+ }
+ }
+
+ @Override
+ public List<RadioManager.ProgramInfo> getProgramList(String filter) {
+ synchronized (mLock) {
+ checkNotClosedLocked();
+ List<RadioManager.ProgramInfo> list = nativeGetProgramList(mNativeContext, filter);
+ if (list == null) {
+ throw new IllegalStateException("Program list is not ready");
+ }
+ return list;
+ }
+ }
+
+ @Override
+ public boolean isAnalogForced() {
+ synchronized (mLock) {
+ checkNotClosedLocked();
+ return nativeIsAnalogForced(mNativeContext);
+ }
+ }
+
+ @Override
+ public void setAnalogForced(boolean isForced) {
+ synchronized (mLock) {
+ checkNotClosedLocked();
+ nativeSetAnalogForced(mNativeContext, isForced);
+ }
+ }
+
+ @Override
+ public boolean isAntennaConnected() {
+ synchronized (mLock) {
+ checkNotClosedLocked();
+ return nativeIsAntennaConnected(mNativeContext);
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/broadcastradio/TunerCallback.java b/services/core/java/com/android/server/broadcastradio/TunerCallback.java
new file mode 100644
index 0000000..25f3775
--- /dev/null
+++ b/services/core/java/com/android/server/broadcastradio/TunerCallback.java
@@ -0,0 +1,127 @@
+/**
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.broadcastradio;
+
+import android.annotation.NonNull;
+import android.hardware.radio.ITuner;
+import android.hardware.radio.ITunerCallback;
+import android.hardware.radio.RadioManager;
+import android.hardware.radio.RadioMetadata;
+import android.hardware.radio.RadioTuner;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.util.Slog;
+
+class TunerCallback implements ITunerCallback {
+ private static final String TAG = "BroadcastRadioService.TunerCallback";
+
+ /**
+ * This field is used by native code, do not access or modify.
+ */
+ private final long mNativeContext;
+
+ @NonNull private final Tuner mTuner;
+ @NonNull private final ITunerCallback mClientCallback;
+
+ TunerCallback(@NonNull Tuner tuner, @NonNull ITunerCallback clientCallback, int halRev) {
+ mTuner = tuner;
+ mClientCallback = clientCallback;
+ mNativeContext = nativeInit(tuner, halRev);
+ }
+
+ @Override
+ protected void finalize() throws Throwable {
+ nativeFinalize(mNativeContext);
+ super.finalize();
+ }
+
+ private native long nativeInit(@NonNull Tuner tuner, int halRev);
+ private native void nativeFinalize(long nativeContext);
+ private native void nativeDetach(long nativeContext);
+
+ public void detach() {
+ nativeDetach(mNativeContext);
+ }
+
+ private interface RunnableThrowingRemoteException {
+ void run() throws RemoteException;
+ }
+
+ private void dispatch(RunnableThrowingRemoteException func) {
+ try {
+ func.run();
+ } catch (RemoteException e) {
+ Slog.e(TAG, "client died", e);
+ }
+ }
+
+ // called from native side
+ private void handleHwFailure() {
+ onError(RadioTuner.ERROR_HARDWARE_FAILURE);
+ mTuner.close();
+ }
+
+ @Override
+ public void onError(int status) {
+ dispatch(() -> mClientCallback.onError(status));
+ }
+
+ @Override
+ public void onConfigurationChanged(RadioManager.BandConfig config) {
+ dispatch(() -> mClientCallback.onConfigurationChanged(config));
+ }
+
+ @Override
+ public void onProgramInfoChanged() {
+ dispatch(() -> mClientCallback.onProgramInfoChanged());
+ }
+
+ @Override
+ public void onTrafficAnnouncement(boolean active) {
+ dispatch(() -> mClientCallback.onTrafficAnnouncement(active));
+ }
+
+ @Override
+ public void onEmergencyAnnouncement(boolean active) {
+ dispatch(() -> mClientCallback.onEmergencyAnnouncement(active));
+ }
+
+ @Override
+ public void onAntennaState(boolean connected) {
+ dispatch(() -> mClientCallback.onAntennaState(connected));
+ }
+
+ @Override
+ public void onBackgroundScanAvailabilityChange(boolean isAvailable) {
+ dispatch(() -> mClientCallback.onBackgroundScanAvailabilityChange(isAvailable));
+ }
+
+ @Override
+ public void onBackgroundScanComplete() {
+ dispatch(() -> mClientCallback.onBackgroundScanComplete());
+ }
+
+ @Override
+ public void onProgramListChanged() {
+ dispatch(() -> mClientCallback.onProgramListChanged());
+ }
+
+ @Override
+ public IBinder asBinder() {
+ throw new RuntimeException("Not a binder");
+ }
+}
diff --git a/services/core/java/com/android/server/connectivity/IpConnectivityEventBuilder.java b/services/core/java/com/android/server/connectivity/IpConnectivityEventBuilder.java
index 5dee91d..ee38219 100644
--- a/services/core/java/com/android/server/connectivity/IpConnectivityEventBuilder.java
+++ b/services/core/java/com/android/server/connectivity/IpConnectivityEventBuilder.java
@@ -20,6 +20,7 @@
import static android.net.NetworkCapabilities.TRANSPORT_BLUETOOTH;
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
import static android.net.NetworkCapabilities.TRANSPORT_ETHERNET;
+import static android.net.NetworkCapabilities.TRANSPORT_LOWPAN;
import static android.net.NetworkCapabilities.TRANSPORT_VPN;
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
import static android.net.NetworkCapabilities.TRANSPORT_WIFI_AWARE;
@@ -362,29 +363,46 @@
TRANSPORT_LINKLAYER_MAP[TRANSPORT_BLUETOOTH] = IpConnectivityLogClass.BLUETOOTH;
TRANSPORT_LINKLAYER_MAP[TRANSPORT_ETHERNET] = IpConnectivityLogClass.ETHERNET;
TRANSPORT_LINKLAYER_MAP[TRANSPORT_VPN] = IpConnectivityLogClass.UNKNOWN;
- // TODO: change mapping TRANSPORT_WIFI_AWARE -> WIFI_AWARE
- TRANSPORT_LINKLAYER_MAP[TRANSPORT_WIFI_AWARE] = IpConnectivityLogClass.UNKNOWN;
+ TRANSPORT_LINKLAYER_MAP[TRANSPORT_WIFI_AWARE] = IpConnectivityLogClass.WIFI_NAN;
+ TRANSPORT_LINKLAYER_MAP[TRANSPORT_LOWPAN] = IpConnectivityLogClass.LOWPAN;
};
private static int ifnameToLinkLayer(String ifname) {
// Do not try to catch all interface names with regexes, instead only catch patterns that
// are cheap to check, and otherwise fallback on postprocessing in aggregation layer.
- for (int i = 0; i < IFNAME_LINKLAYER_MAP.size(); i++) {
- String pattern = IFNAME_LINKLAYER_MAP.valueAt(i);
+ for (int i = 0; i < KNOWN_PREFIX; i++) {
+ String pattern = IFNAME_PREFIXES[i];
if (ifname.startsWith(pattern)) {
- return IFNAME_LINKLAYER_MAP.keyAt(i);
+ return IFNAME_LINKLAYERS[i];
}
}
return IpConnectivityLogClass.UNKNOWN;
}
- private static final SparseArray<String> IFNAME_LINKLAYER_MAP = new SparseArray<String>();
+ private static final int KNOWN_PREFIX = 7;
+ private static final String[] IFNAME_PREFIXES = new String[KNOWN_PREFIX];
+ private static final int[] IFNAME_LINKLAYERS = new int[KNOWN_PREFIX];
static {
- IFNAME_LINKLAYER_MAP.put(IpConnectivityLogClass.CELLULAR, "rmnet");
- IFNAME_LINKLAYER_MAP.put(IpConnectivityLogClass.WIFI, "wlan");
- IFNAME_LINKLAYER_MAP.put(IpConnectivityLogClass.BLUETOOTH, "bt-pan");
- // TODO: rekey to USB
- IFNAME_LINKLAYER_MAP.put(IpConnectivityLogClass.ETHERNET, "usb");
- // TODO: add mappings for nan -> WIFI_AWARE and p2p -> WIFI_P2P
+ // Ordered from most likely link layer to least likely.
+ IFNAME_PREFIXES[0] = "rmnet";
+ IFNAME_LINKLAYERS[0] = IpConnectivityLogClass.CELLULAR;
+
+ IFNAME_PREFIXES[1] = "wlan";
+ IFNAME_LINKLAYERS[1] = IpConnectivityLogClass.WIFI;
+
+ IFNAME_PREFIXES[2] = "bt-pan";
+ IFNAME_LINKLAYERS[2] = IpConnectivityLogClass.BLUETOOTH;
+
+ IFNAME_PREFIXES[3] = "p2p";
+ IFNAME_LINKLAYERS[3] = IpConnectivityLogClass.WIFI_P2P;
+
+ IFNAME_PREFIXES[4] = "aware";
+ IFNAME_LINKLAYERS[4] = IpConnectivityLogClass.WIFI_NAN;
+
+ IFNAME_PREFIXES[5] = "eth";
+ IFNAME_LINKLAYERS[5] = IpConnectivityLogClass.ETHERNET;
+
+ IFNAME_PREFIXES[6] = "wpan";
+ IFNAME_LINKLAYERS[6] = IpConnectivityLogClass.LOWPAN;
}
}
diff --git a/services/core/java/com/android/server/connectivity/NetworkMonitor.java b/services/core/java/com/android/server/connectivity/NetworkMonitor.java
index 0ee2a41..d3a9354 100644
--- a/services/core/java/com/android/server/connectivity/NetworkMonitor.java
+++ b/services/core/java/com/android/server/connectivity/NetworkMonitor.java
@@ -29,6 +29,7 @@
import android.net.CaptivePortal;
import android.net.ConnectivityManager;
import android.net.ICaptivePortal;
+import android.net.Network;
import android.net.NetworkRequest;
import android.net.ProxyInfo;
import android.net.TrafficStats;
@@ -71,6 +72,9 @@
import java.net.URL;
import java.net.UnknownHostException;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Random;
import java.util.concurrent.CountDownLatch;
@@ -95,7 +99,7 @@
"http://play.googleapis.com/generate_204";
private static final String DEFAULT_USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64) "
+ "AppleWebKit/537.36 (KHTML, like Gecko) "
- + "Chrome/52.0.2743.82 Safari/537.36";
+ + "Chrome/60.0.3112.32 Safari/537.36";
private static final int SOCKET_TIMEOUT_MS = 10000;
private static final int PROBE_TIMEOUT_MS = 3000;
@@ -228,6 +232,7 @@
private final Context mContext;
private final Handler mConnectivityServiceHandler;
private final NetworkAgentInfo mNetworkAgentInfo;
+ private final Network mNetwork;
private final int mNetId;
private final TelephonyManager mTelephonyManager;
private final WifiManager mWifiManager;
@@ -286,7 +291,8 @@
mMetricsLog = logger;
mConnectivityServiceHandler = handler;
mNetworkAgentInfo = networkAgentInfo;
- mNetId = mNetworkAgentInfo.network.netId;
+ mNetwork = new OneAddressPerFamilyNetwork(networkAgentInfo.network);
+ mNetId = mNetwork.netId;
mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
@@ -415,7 +421,7 @@
maybeLogEvaluationResult(
networkEventType(validationStage(), EvaluationResult.VALIDATED));
mConnectivityServiceHandler.sendMessage(obtainMessage(EVENT_NETWORK_TESTED,
- NETWORK_TEST_RESULT_VALID, mNetworkAgentInfo.network.netId, null));
+ NETWORK_TEST_RESULT_VALID, mNetId, null));
mValidations++;
}
@@ -440,7 +446,8 @@
case CMD_LAUNCH_CAPTIVE_PORTAL_APP:
final Intent intent = new Intent(
ConnectivityManager.ACTION_CAPTIVE_PORTAL_SIGN_IN);
- intent.putExtra(ConnectivityManager.EXTRA_NETWORK, mNetworkAgentInfo.network);
+ // OneAddressPerFamilyNetwork is not parcelable across processes.
+ intent.putExtra(ConnectivityManager.EXTRA_NETWORK, new Network(mNetwork));
intent.putExtra(ConnectivityManager.EXTRA_CAPTIVE_PORTAL,
new CaptivePortal(new ICaptivePortal.Stub() {
@Override
@@ -468,8 +475,7 @@
@Override
public void exit() {
- Message message = obtainMessage(EVENT_PROVISIONING_NOTIFICATION, 0,
- mNetworkAgentInfo.network.netId, null);
+ Message message = obtainMessage(EVENT_PROVISIONING_NOTIFICATION, 0, mNetId, null);
mConnectivityServiceHandler.sendMessage(message);
}
}
@@ -623,7 +629,7 @@
CustomIntentReceiver(String action, int token, int what) {
mToken = token;
mWhat = what;
- mAction = action + "_" + mNetworkAgentInfo.network.netId + "_" + token;
+ mAction = action + "_" + mNetId + "_" + token;
mContext.registerReceiver(this, new IntentFilter(mAction));
}
public PendingIntent getPendingIntent() {
@@ -659,8 +665,7 @@
CMD_LAUNCH_CAPTIVE_PORTAL_APP);
}
// Display the sign in notification.
- Message message = obtainMessage(EVENT_PROVISIONING_NOTIFICATION, 1,
- mNetworkAgentInfo.network.netId,
+ Message message = obtainMessage(EVENT_PROVISIONING_NOTIFICATION, 1, mNetId,
mLaunchCaptivePortalAppBroadcastReceiver.getPendingIntent());
mConnectivityServiceHandler.sendMessage(message);
// Retest for captive portal occasionally.
@@ -675,6 +680,31 @@
}
}
+ // Limits the list of IP addresses returned by getAllByName or tried by openConnection to at
+ // most one per address family. This ensures we only wait up to 20 seconds for TCP connections
+ // to complete, regardless of how many IP addresses a host has.
+ private static class OneAddressPerFamilyNetwork extends Network {
+ public OneAddressPerFamilyNetwork(Network network) {
+ super(network);
+ }
+
+ @Override
+ public InetAddress[] getAllByName(String host) throws UnknownHostException {
+ List<InetAddress> addrs = Arrays.asList(super.getAllByName(host));
+
+ // Ensure the address family of the first address is tried first.
+ LinkedHashMap<Class, InetAddress> addressByFamily = new LinkedHashMap<>();
+ addressByFamily.put(addrs.get(0).getClass(), addrs.get(0));
+ Collections.shuffle(addrs);
+
+ for (InetAddress addr : addrs) {
+ addressByFamily.put(addr.getClass(), addr);
+ }
+
+ return addressByFamily.values().toArray(new InetAddress[addressByFamily.size()]);
+ }
+ }
+
private static String getCaptivePortalServerHttpsUrl(Context context) {
return getSetting(context, Settings.Global.CAPTIVE_PORTAL_HTTPS_URL, DEFAULT_HTTPS_URL);
}
@@ -805,7 +835,7 @@
int result;
String connectInfo;
try {
- InetAddress[] addresses = mNetworkAgentInfo.network.getAllByName(host);
+ InetAddress[] addresses = mNetwork.getAllByName(host);
StringBuffer buffer = new StringBuffer();
for (InetAddress address : addresses) {
buffer.append(',').append(address.getHostAddress());
@@ -834,7 +864,7 @@
final Stopwatch probeTimer = new Stopwatch().start();
final int oldTag = TrafficStats.getAndSetThreadStatsTag(TrafficStats.TAG_SYSTEM_PROBE);
try {
- urlConnection = (HttpURLConnection) mNetworkAgentInfo.network.openConnection(url);
+ urlConnection = (HttpURLConnection) mNetwork.openConnection(url);
urlConnection.setInstanceFollowRedirects(probeType == ValidationProbeEvent.PROBE_PAC);
urlConnection.setConnectTimeout(SOCKET_TIMEOUT_MS);
urlConnection.setReadTimeout(SOCKET_TIMEOUT_MS);
diff --git a/services/core/java/com/android/server/connectivity/OWNERS b/services/core/java/com/android/server/connectivity/OWNERS
new file mode 100644
index 0000000..74f39a1
--- /dev/null
+++ b/services/core/java/com/android/server/connectivity/OWNERS
@@ -0,0 +1,5 @@
+set noparent
+
+ek@google.com
+hugobenichi@google.com
+lorenzo@google.com
diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java
index 27968a9..e82eabf 100644
--- a/services/core/java/com/android/server/connectivity/Vpn.java
+++ b/services/core/java/com/android/server/connectivity/Vpn.java
@@ -36,6 +36,7 @@
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
+import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
@@ -56,7 +57,10 @@
import android.net.RouteInfo;
import android.net.UidRange;
import android.net.Uri;
+import android.net.VpnService;
import android.os.Binder;
+import android.os.Build.VERSION_CODES;
+import android.os.Bundle;
import android.os.FileUtils;
import android.os.IBinder;
import android.os.INetworkManagementService;
@@ -296,6 +300,56 @@
}
/**
+ * Checks if a VPN app supports always-on mode.
+ *
+ * In order to support the always-on feature, an app has to
+ * <ul>
+ * <li>target {@link VERSION_CODES#N API 24} or above, and
+ * <li>not opt out through the {@link VpnService#METADATA_SUPPORTS_ALWAYS_ON} meta-data
+ * field.
+ * </ul>
+ *
+ * @param packageName the canonical package name of the VPN app
+ * @return {@code true} if and only if the VPN app exists and supports always-on mode
+ */
+ public boolean isAlwaysOnPackageSupported(String packageName) {
+ enforceSettingsPermission();
+
+ if (packageName == null) {
+ return false;
+ }
+
+ PackageManager pm = mContext.getPackageManager();
+ ApplicationInfo appInfo = null;
+ try {
+ appInfo = pm.getApplicationInfoAsUser(packageName, 0 /*flags*/, mUserHandle);
+ } catch (NameNotFoundException unused) {
+ Log.w(TAG, "Can't find \"" + packageName + "\" when checking always-on support");
+ }
+ if (appInfo == null || appInfo.targetSdkVersion < VERSION_CODES.N) {
+ return false;
+ }
+
+ final Intent intent = new Intent(VpnConfig.SERVICE_INTERFACE);
+ intent.setPackage(packageName);
+ List<ResolveInfo> services =
+ pm.queryIntentServicesAsUser(intent, PackageManager.GET_META_DATA, mUserHandle);
+ if (services == null || services.size() == 0) {
+ return false;
+ }
+
+ for (ResolveInfo rInfo : services) {
+ final Bundle metaData = rInfo.serviceInfo.metaData;
+ if (metaData != null
+ && !metaData.getBoolean(VpnService.METADATA_SUPPORTS_ALWAYS_ON, true)) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /**
* Configures an always-on VPN connection through a specific application.
* This connection is automatically granted and persisted after a reboot.
*
@@ -303,6 +357,10 @@
* manifest guarded by {@link android.Manifest.permission.BIND_VPN_SERVICE},
* otherwise the call will fail.
*
+ * <p>Note that this method does not check if the VPN app supports always-on mode. The check is
+ * delayed to {@link #startAlwaysOnVpn()}, which is always called immediately after this
+ * method in {@link android.net.IConnectivityManager#setAlwaysOnVpnPackage}.
+ *
* @param packageName the package to designate as always-on VPN supplier.
* @param lockdown whether to prevent traffic outside of a VPN, for example while connecting.
* @return {@code true} if the package has been set as always-on, {@code false} otherwise.
@@ -443,6 +501,11 @@
if (alwaysOnPackage == null) {
return true;
}
+ // Remove always-on VPN if it's not supported.
+ if (!isAlwaysOnPackageSupported(alwaysOnPackage)) {
+ setAlwaysOnPackage(null, false);
+ return false;
+ }
// Skip if the service is already established. This isn't bulletproof: it's not bound
// until after establish(), so if it's mid-setup onStartCommand will be sent twice,
// which may restart the connection.
@@ -1219,6 +1282,11 @@
"Unauthorized Caller");
}
+ private void enforceSettingsPermission() {
+ mContext.enforceCallingOrSelfPermission(Manifest.permission.NETWORK_SETTINGS,
+ "Unauthorized Caller");
+ }
+
private class Connection implements ServiceConnection {
private IBinder mService;
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index e858edb..fb8ae12 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -16,6 +16,7 @@
package com.android.server.display;
+import android.app.ActivityManager;
import com.android.internal.app.IBatteryStats;
import com.android.server.LocalServices;
import com.android.server.am.BatteryStatsService;
@@ -161,6 +162,9 @@
// True if should use light sensor to automatically determine doze screen brightness.
private final boolean mAllowAutoBrightnessWhileDozingConfig;
+ // Whether or not the color fade on screen on / off is enabled.
+ private final boolean mColorFadeEnabled;
+
// True if we should fade the screen while turning it off, false if we should play
// a stylish color fade animation instead.
private boolean mColorFadeFadesConfig;
@@ -171,6 +175,12 @@
// blank itself and begin an appropriate power on animation.
private boolean mDisplayBlanksAfterDozeConfig;
+ // True if there are only buckets of brightness values when the display is in the doze state,
+ // rather than a full range of values. If this is true, then we'll avoid animating the screen
+ // brightness since it'd likely be multiple jarring brightness transitions instead of just one
+ // to reach the final state.
+ private boolean mBrightnessBucketsInDozeConfig;
+
// The pending power request.
// Initially null until the first call to requestPowerState.
// Guarded by mLock.
@@ -413,12 +423,17 @@
mScreenBrightnessRangeMinimum = screenBrightnessRangeMinimum;
+
+ mColorFadeEnabled = !ActivityManager.isLowRamDeviceStatic();
mColorFadeFadesConfig = resources.getBoolean(
com.android.internal.R.bool.config_animateScreenLights);
mDisplayBlanksAfterDozeConfig = resources.getBoolean(
com.android.internal.R.bool.config_displayBlanksAfterDoze);
+ mBrightnessBucketsInDozeConfig = resources.getBoolean(
+ com.android.internal.R.bool.config_displayBrightnessBucketsInDoze);
+
if (!DEBUG_PRETEND_PROXIMITY_SENSOR_ABSENT) {
mProximitySensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
if (mProximitySensor != null) {
@@ -506,17 +521,19 @@
// Initialize the power state object for the default display.
// In the future, we might manage multiple displays independently.
mPowerState = new DisplayPowerState(mBlanker,
- new ColorFade(Display.DEFAULT_DISPLAY));
+ mColorFadeEnabled ? new ColorFade(Display.DEFAULT_DISPLAY) : null);
- mColorFadeOnAnimator = ObjectAnimator.ofFloat(
- mPowerState, DisplayPowerState.COLOR_FADE_LEVEL, 0.0f, 1.0f);
- mColorFadeOnAnimator.setDuration(COLOR_FADE_ON_ANIMATION_DURATION_MILLIS);
- mColorFadeOnAnimator.addListener(mAnimatorListener);
+ if (mColorFadeEnabled) {
+ mColorFadeOnAnimator = ObjectAnimator.ofFloat(
+ mPowerState, DisplayPowerState.COLOR_FADE_LEVEL, 0.0f, 1.0f);
+ mColorFadeOnAnimator.setDuration(COLOR_FADE_ON_ANIMATION_DURATION_MILLIS);
+ mColorFadeOnAnimator.addListener(mAnimatorListener);
- mColorFadeOffAnimator = ObjectAnimator.ofFloat(
- mPowerState, DisplayPowerState.COLOR_FADE_LEVEL, 1.0f, 0.0f);
- mColorFadeOffAnimator.setDuration(COLOR_FADE_OFF_ANIMATION_DURATION_MILLIS);
- mColorFadeOffAnimator.addListener(mAnimatorListener);
+ mColorFadeOffAnimator = ObjectAnimator.ofFloat(
+ mPowerState, DisplayPowerState.COLOR_FADE_LEVEL, 1.0f, 0.0f);
+ mColorFadeOffAnimator.setDuration(COLOR_FADE_OFF_ANIMATION_DURATION_MILLIS);
+ mColorFadeOffAnimator.addListener(mAnimatorListener);
+ }
mScreenBrightnessRampAnimator = new RampAnimator<DisplayPowerState>(
mPowerState, DisplayPowerState.SCREEN_BRIGHTNESS);
@@ -780,7 +797,7 @@
boolean wasOrWillBeInVr = (state == Display.STATE_VR || oldState == Display.STATE_VR);
if ((state == Display.STATE_ON
&& mSkipRampState == RAMP_STATE_SKIP_NONE
- || state == Display.STATE_DOZE)
+ || state == Display.STATE_DOZE && !mBrightnessBucketsInDozeConfig)
&& !wasOrWillBeInVr) {
animateScreenBrightness(brightness,
slowChange ? mBrightnessRampRateSlow : mBrightnessRampRateFast);
@@ -793,9 +810,9 @@
// Note that we do not wait for the brightness ramp animation to complete before
// reporting the display is ready because we only need to ensure the screen is in the
// right power state even as it continues to converge on the desired brightness.
- final boolean ready = mPendingScreenOnUnblocker == null
- && !mColorFadeOnAnimator.isStarted()
- && !mColorFadeOffAnimator.isStarted()
+ final boolean ready = mPendingScreenOnUnblocker == null &&
+ (!mColorFadeEnabled ||
+ (!mColorFadeOnAnimator.isStarted() && !mColorFadeOffAnimator.isStarted()))
&& mPowerState.waitUntilClean(mCleanListener);
final boolean finished = ready
&& !mScreenBrightnessRampAnimator.isAnimating();
@@ -977,8 +994,8 @@
private void animateScreenStateChange(int target, boolean performScreenOffTransition) {
// If there is already an animation in progress, don't interfere with it.
- if (mColorFadeOnAnimator.isStarted()
- || mColorFadeOffAnimator.isStarted()) {
+ if (mColorFadeEnabled &&
+ (mColorFadeOnAnimator.isStarted() || mColorFadeOffAnimator.isStarted())) {
if (target != Display.STATE_ON) {
return;
}
@@ -1018,7 +1035,7 @@
if (!setScreenState(Display.STATE_ON)) {
return; // screen on blocked
}
- if (USE_COLOR_FADE_ON_ANIMATION && mPowerRequest.isBrightOrDim()) {
+ if (USE_COLOR_FADE_ON_ANIMATION && mColorFadeEnabled && mPowerRequest.isBrightOrDim()) {
// Perform screen on animation.
if (mPowerState.getColorFadeLevel() == 1.0f) {
mPowerState.dismissColorFade();
@@ -1094,6 +1111,10 @@
} else {
// Want screen off.
mPendingScreenOff = true;
+ if (!mColorFadeEnabled) {
+ mPowerState.setColorFadeLevel(0.0f);
+ }
+
if (mPowerState.getColorFadeLevel() == 0.0f) {
// Turn the screen off.
// A black surface is already hiding the contents of the screen.
diff --git a/services/core/java/com/android/server/display/DisplayPowerState.java b/services/core/java/com/android/server/display/DisplayPowerState.java
index 7b55ec1..763f56f 100644
--- a/services/core/java/com/android/server/display/DisplayPowerState.java
+++ b/services/core/java/com/android/server/display/DisplayPowerState.java
@@ -176,7 +176,7 @@
* @return True if the electron beam was prepared.
*/
public boolean prepareColorFade(Context context, int mode) {
- if (!mColorFade.prepare(context, mode)) {
+ if (mColorFade == null || !mColorFade.prepare(context, mode)) {
mColorFadePrepared = false;
mColorFadeReady = true;
return false;
@@ -193,7 +193,7 @@
*/
public void dismissColorFade() {
Trace.traceCounter(Trace.TRACE_TAG_POWER, COUNTER_COLOR_FADE, 100);
- mColorFade.dismiss();
+ if (mColorFade != null) mColorFade.dismiss();
mColorFadePrepared = false;
mColorFadeReady = true;
}
@@ -202,7 +202,7 @@
* Dismisses the color fade resources.
*/
public void dismissColorFadeResources() {
- mColorFade.dismissResources();
+ if (mColorFade != null) mColorFade.dismissResources();
}
/**
@@ -272,7 +272,7 @@
pw.println(" mColorFadeDrawPending=" + mColorFadeDrawPending);
mPhotonicModulator.dump(pw);
- mColorFade.dump(pw);
+ if (mColorFade != null) mColorFade.dump(pw);
}
private void scheduleScreenUpdate() {
@@ -332,7 +332,7 @@
if (mColorFadePrepared) {
mColorFade.draw(mColorFadeLevel);
Trace.traceCounter(Trace.TRACE_TAG_POWER,
- COUNTER_COLOR_FADE, Math.round(mColorFadeLevel* 100));
+ COUNTER_COLOR_FADE, Math.round(mColorFadeLevel * 100));
}
mColorFadeReady = true;
diff --git a/services/core/java/com/android/server/hdmi/HdmiLogger.java b/services/core/java/com/android/server/hdmi/HdmiLogger.java
index 537df81..ebe52c0 100644
--- a/services/core/java/com/android/server/hdmi/HdmiLogger.java
+++ b/services/core/java/com/android/server/hdmi/HdmiLogger.java
@@ -44,7 +44,6 @@
private static final long ERROR_LOG_DURATTION_MILLIS = 20 * 1000; // 20s
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
- private static final boolean IS_USER_BUILD = "user".equals(Build.TYPE);
private static final ThreadLocal<HdmiLogger> sLogger = new ThreadLocal<>();
diff --git a/services/core/java/com/android/server/input/InputForwarder.java b/services/core/java/com/android/server/input/InputForwarder.java
new file mode 100644
index 0000000..bebbc93
--- /dev/null
+++ b/services/core/java/com/android/server/input/InputForwarder.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.input;
+
+import android.app.IInputForwarder;
+import android.hardware.input.InputManagerInternal;
+import android.view.InputEvent;
+import android.os.Binder;
+
+import com.android.server.LocalServices;
+
+import static android.hardware.input.InputManager.INJECT_INPUT_EVENT_MODE_ASYNC;
+
+/**
+ * Basic implementation of {@link IInputForwarder}.
+ */
+class InputForwarder extends IInputForwarder.Stub {
+
+ private final InputManagerInternal mInputManagerInternal;
+ private final int mDisplayId;
+
+ InputForwarder(int displayId) {
+ mDisplayId = displayId;
+ mInputManagerInternal = LocalServices.getService(InputManagerInternal.class);
+ }
+
+ @Override
+ public boolean forwardEvent(InputEvent event) {
+ return mInputManagerInternal.injectInputEvent(event, mDisplayId,
+ INJECT_INPUT_EVENT_MODE_ASYNC);
+ }
+}
\ No newline at end of file
diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java
index 717efbf..fa9b107 100644
--- a/services/core/java/com/android/server/input/InputManagerService.java
+++ b/services/core/java/com/android/server/input/InputManagerService.java
@@ -37,6 +37,7 @@
import org.xmlpull.v1.XmlPullParser;
import android.Manifest;
+import android.app.IInputForwarder;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
@@ -57,6 +58,7 @@
import android.content.res.TypedArray;
import android.content.res.XmlResourceParser;
import android.database.ContentObserver;
+import android.hardware.display.DisplayManager;
import android.hardware.display.DisplayViewport;
import android.hardware.input.IInputDevicesChangedListener;
import android.hardware.input.IInputManager;
@@ -85,6 +87,7 @@
import android.util.Slog;
import android.util.SparseArray;
import android.util.Xml;
+import android.view.Display;
import android.view.IInputFilter;
import android.view.IInputFilterHost;
import android.view.IWindow;
@@ -1862,6 +1865,29 @@
nativeMonitor(mPtr);
}
+ // Binder call
+ @Override
+ public IInputForwarder createInputForwarder(int displayId) throws RemoteException {
+ if (!checkCallingPermission(android.Manifest.permission.INJECT_EVENTS,
+ "createInputForwarder()")) {
+ throw new SecurityException("Requires INJECT_EVENTS permission");
+ }
+ final DisplayManager displayManager = mContext.getSystemService(DisplayManager.class);
+ final Display display = displayManager.getDisplay(displayId);
+ if (display == null) {
+ throw new IllegalArgumentException(
+ "Can't create input forwarder for non-existent displayId: " + displayId);
+ }
+ final int callingUid = Binder.getCallingUid();
+ final int displayOwnerUid = display.getOwnerUid();
+ if (callingUid != displayOwnerUid) {
+ throw new SecurityException(
+ "Only owner of the display can forward input events to it.");
+ }
+
+ return new InputForwarder(displayId);
+ }
+
// Native callback.
private void notifyConfigurationChanged(long whenNanos) {
mWindowManagerCallbacks.notifyConfigurationChanged();
diff --git a/services/core/java/com/android/server/job/JobPackageTracker.java b/services/core/java/com/android/server/job/JobPackageTracker.java
index ba92295..025ff0b 100644
--- a/services/core/java/com/android/server/job/JobPackageTracker.java
+++ b/services/core/java/com/android/server/job/JobPackageTracker.java
@@ -17,11 +17,13 @@
package com.android.server.job;
import android.app.job.JobInfo;
+import android.app.job.JobParameters;
import android.os.SystemClock;
import android.os.UserHandle;
import android.text.format.DateFormat;
import android.util.ArrayMap;
import android.util.SparseArray;
+import android.util.SparseIntArray;
import android.util.TimeUtils;
import com.android.internal.util.RingBufferIndices;
import com.android.server.job.controllers.JobStatus;
@@ -36,6 +38,9 @@
private static final int EVENT_BUFFER_SIZE = 100;
+ public static final int EVENT_CMD_MASK = 0xff;
+ public static final int EVENT_STOP_REASON_SHIFT = 8;
+ public static final int EVENT_STOP_REASON_MASK = 0xff << EVENT_STOP_REASON_SHIFT;
public static final int EVENT_NULL = 0;
public static final int EVENT_START_JOB = 1;
public static final int EVENT_STOP_JOB = 2;
@@ -49,9 +54,9 @@
private final String[] mEventTags = new String[EVENT_BUFFER_SIZE];
private final int[] mEventJobIds = new int[EVENT_BUFFER_SIZE];
- public void addEvent(int cmd, int uid, String tag, int jobId) {
+ public void addEvent(int cmd, int uid, String tag, int jobId, int stopReason) {
int index = mEventIndices.add();
- mEventCmds[index] = cmd;
+ mEventCmds[index] = cmd | ((stopReason<<EVENT_STOP_REASON_SHIFT) & EVENT_STOP_REASON_MASK);
mEventTimes[index] = SystemClock.elapsedRealtime();
mEventUids[index] = uid;
mEventTags[index] = tag;
@@ -77,6 +82,7 @@
int pendingNesting;
int pendingCount;
boolean hadPending;
+ final SparseIntArray stopReasons = new SparseIntArray();
public long getActiveTime(long now) {
long time = pastActiveTime;
@@ -179,12 +185,14 @@
pe.activeNesting++;
}
- void decActive(int uid, String pkg, long now) {
+ void decActive(int uid, String pkg, long now, int stopReason) {
PackageEntry pe = getOrCreateEntry(uid, pkg);
if (pe.activeNesting == 1) {
pe.pastActiveTime += now - pe.activeStartTime;
}
pe.activeNesting--;
+ int count = pe.stopReasons.get(stopReason, 0);
+ pe.stopReasons.put(stopReason, count+1);
}
void incActiveTop(int uid, String pkg, long now) {
@@ -196,12 +204,14 @@
pe.activeTopNesting++;
}
- void decActiveTop(int uid, String pkg, long now) {
+ void decActiveTop(int uid, String pkg, long now, int stopReason) {
PackageEntry pe = getOrCreateEntry(uid, pkg);
if (pe.activeTopNesting == 1) {
pe.pastActiveTopTime += now - pe.activeTopStartTime;
}
pe.activeTopNesting--;
+ int count = pe.stopReasons.get(stopReason, 0);
+ pe.stopReasons.put(stopReason, count+1);
}
void finish(DataSet next, long now) {
@@ -261,6 +271,11 @@
outPe.pastPendingTime += now - pe.pendingStartTime;
outPe.hadPending = true;
}
+ for (int k = pe.stopReasons.size()-1; k >= 0; k--) {
+ int type = pe.stopReasons.keyAt(k);
+ outPe.stopReasons.put(type, outPe.stopReasons.get(type, 0)
+ + pe.stopReasons.valueAt(k));
+ }
}
}
if (mMaxTotalActive > out.mMaxTotalActive) {
@@ -312,7 +327,8 @@
pw.print(prefix); pw.print(" ");
UserHandle.formatUid(pw, uid);
pw.print(" / "); pw.print(uidMap.keyAt(j));
- pw.print(":");
+ pw.println(":");
+ pw.print(prefix); pw.print(" ");
printDuration(pw, period, pe.getPendingTime(now), pe.pendingCount, "pending");
printDuration(pw, period, pe.getActiveTime(now), pe.activeCount, "active");
printDuration(pw, period, pe.getActiveTopTime(now), pe.activeTopCount,
@@ -327,6 +343,18 @@
pw.print(" (active-top)");
}
pw.println();
+ if (pe.stopReasons.size() > 0) {
+ pw.print(prefix); pw.print(" ");
+ for (int k = 0; k < pe.stopReasons.size(); k++) {
+ if (k > 0) {
+ pw.print(", ");
+ }
+ pw.print(pe.stopReasons.valueAt(k));
+ pw.print("x ");
+ pw.print(JobParameters.getReasonName(pe.stopReasons.keyAt(k)));
+ }
+ pw.println();
+ }
}
}
pw.print(prefix); pw.print(" Max concurrency: ");
@@ -370,19 +398,20 @@
mCurDataSet.incActive(job.getSourceUid(), job.getSourcePackageName(), now);
}
addEvent(job.getJob().isPeriodic() ? EVENT_START_PERIODIC_JOB : EVENT_START_JOB,
- job.getSourceUid(), job.getBatteryName(), job.getJobId());
+ job.getSourceUid(), job.getBatteryName(), job.getJobId(), 0);
}
- public void noteInactive(JobStatus job) {
+ public void noteInactive(JobStatus job, int stopReason) {
final long now = SystemClock.uptimeMillis();
if (job.lastEvaluatedPriority >= JobInfo.PRIORITY_TOP_APP) {
- mCurDataSet.decActiveTop(job.getSourceUid(), job.getSourcePackageName(), now);
+ mCurDataSet.decActiveTop(job.getSourceUid(), job.getSourcePackageName(), now,
+ stopReason);
} else {
- mCurDataSet.decActive(job.getSourceUid(), job.getSourcePackageName(), now);
+ mCurDataSet.decActive(job.getSourceUid(), job.getSourcePackageName(), now, stopReason);
}
rebatchIfNeeded(now);
addEvent(job.getJob().isPeriodic() ? EVENT_STOP_JOB : EVENT_STOP_PERIODIC_JOB,
- job.getSourceUid(), job.getBatteryName(), job.getJobId());
+ job.getSourceUid(), job.getBatteryName(), job.getJobId(), stopReason);
}
public void noteConcurrency(int totalActive, int fgActive) {
@@ -448,12 +477,12 @@
if (filterUid != -1 && filterUid != UserHandle.getAppId(uid)) {
continue;
}
- final int cmd = mEventCmds[index];
+ final int cmd = mEventCmds[index] & EVENT_CMD_MASK;
if (cmd == EVENT_NULL) {
continue;
}
final String label;
- switch (mEventCmds[index]) {
+ switch (cmd) {
case EVENT_START_JOB: label = " START"; break;
case EVENT_STOP_JOB: label = " STOP"; break;
case EVENT_START_PERIODIC_JOB: label = "START-P"; break;
@@ -469,7 +498,13 @@
pw.print("/");
pw.print(mEventJobIds[index]);
pw.print(" ");
- pw.println(mEventTags[index]);
+ pw.print(mEventTags[index]);
+ if (cmd == EVENT_STOP_JOB || cmd == EVENT_STOP_PERIODIC_JOB) {
+ pw.print(" ");
+ pw.print(JobParameters.getReasonName((mEventCmds[index] & EVENT_STOP_REASON_MASK)
+ >> EVENT_STOP_REASON_SHIFT));
+ }
+ pw.println();
}
return true;
}
diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java
index 7cacdb8..f885167 100644
--- a/services/core/java/com/android/server/job/JobSchedulerService.java
+++ b/services/core/java/com/android/server/job/JobSchedulerService.java
@@ -603,12 +603,11 @@
}
final private IUidObserver mUidObserver = new IUidObserver.Stub() {
- @Override public void onUidStateChanged(int uid, int procState,
- long procStateSeq) throws RemoteException {
+ @Override public void onUidStateChanged(int uid, int procState, long procStateSeq) {
updateUidState(uid, procState);
}
- @Override public void onUidGone(int uid, boolean disabled) throws RemoteException {
+ @Override public void onUidGone(int uid, boolean disabled) {
updateUidState(uid, ActivityManager.PROCESS_STATE_CACHED_EMPTY);
if (disabled) {
cancelJobsForUid(uid, "uid gone");
@@ -618,11 +617,14 @@
@Override public void onUidActive(int uid) throws RemoteException {
}
- @Override public void onUidIdle(int uid, boolean disabled) throws RemoteException {
+ @Override public void onUidIdle(int uid, boolean disabled) {
if (disabled) {
cancelJobsForUid(uid, "app uid idle");
}
}
+
+ @Override public void onUidCachedChanged(int uid, boolean cached) {
+ }
};
public Object getLock() {
@@ -2052,7 +2054,15 @@
synchronized (mLock) {
boolean foundSome = false;
for (int i=0; i<mActiveServices.size(); i++) {
- mActiveServices.get(i).timeoutIfExecutingLocked(pkgName, userId, hasJobId, jobId);
+ final JobServiceContext jc = mActiveServices.get(i);
+ final JobStatus js = jc.getRunningJobLocked();
+ if (jc.timeoutIfExecutingLocked(pkgName, userId, hasJobId, jobId)) {
+ foundSome = true;
+ pw.print("Timing out: ");
+ js.printUniqueId(pw);
+ pw.print(" ");
+ pw.println(js.getServiceComponent().flattenToShortString());
+ }
}
if (!foundSome) {
pw.println("No matching executing jobs found.");
diff --git a/services/core/java/com/android/server/job/JobServiceContext.java b/services/core/java/com/android/server/job/JobServiceContext.java
index 107475f..a34e251 100644
--- a/services/core/java/com/android/server/job/JobServiceContext.java
+++ b/services/core/java/com/android/server/job/JobServiceContext.java
@@ -681,6 +681,7 @@
return;
}
try {
+ applyStoppedReasonLocked(reason);
mVerb = VERB_STOPPING;
scheduleOpTimeOutLocked();
service.stopJob(mParams);
@@ -704,10 +705,10 @@
}
applyStoppedReasonLocked(reason);
completedJob = mRunningJob;
- mJobPackageTracker.noteInactive(completedJob);
+ mJobPackageTracker.noteInactive(completedJob, mParams.getStopReason());
try {
mBatteryStats.noteJobFinish(mRunningJob.getBatteryName(),
- mRunningJob.getSourceUid());
+ mRunningJob.getSourceUid(), mParams.getStopReason());
} catch (RemoteException e) {
// Whatever.
}
diff --git a/services/core/java/com/android/server/job/controllers/ConnectivityController.java b/services/core/java/com/android/server/job/controllers/ConnectivityController.java
index 17c8928..78367fe 100644
--- a/services/core/java/com/android/server/job/controllers/ConnectivityController.java
+++ b/services/core/java/com/android/server/job/controllers/ConnectivityController.java
@@ -85,7 +85,7 @@
@Override
public void maybeStartTrackingJobLocked(JobStatus jobStatus, JobStatus lastJob) {
if (jobStatus.hasConnectivityConstraint()) {
- updateConstraintsSatisfied(jobStatus, null);
+ updateConstraintsSatisfied(jobStatus);
mTrackedJobs.add(jobStatus);
jobStatus.setTrackingController(JobStatus.TRACKING_CONNECTIVITY);
}
@@ -99,23 +99,25 @@
}
}
- private boolean updateConstraintsSatisfied(JobStatus jobStatus,
- NetworkCapabilities capabilities) {
+ private boolean updateConstraintsSatisfied(JobStatus jobStatus) {
final int jobUid = jobStatus.getSourceUid();
final boolean ignoreBlocked = (jobStatus.getFlags() & JobInfo.FLAG_WILL_BE_FOREGROUND) != 0;
final NetworkInfo info = mConnManager.getActiveNetworkInfoForUid(jobUid, ignoreBlocked);
- if (capabilities == null) {
- final Network network = mConnManager.getActiveNetworkForUid(jobUid, ignoreBlocked);
- capabilities = mConnManager.getNetworkCapabilities(network);
- }
+ final Network network = mConnManager.getActiveNetworkForUid(jobUid, ignoreBlocked);
+ final NetworkCapabilities capabilities = (network != null)
+ ? mConnManager.getNetworkCapabilities(network) : null;
- final boolean validated = capabilities != null
+ final boolean validated = (capabilities != null)
&& capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
- final boolean connected = info != null && info.isConnected();
+ final boolean connected = (info != null) && info.isConnected();
final boolean connectionUsable = connected && validated;
- final boolean metered = connected && info.isMetered();
- final boolean unmetered = connected && !info.isMetered();
- final boolean notRoaming = connected && !info.isRoaming();
+
+ final boolean metered = connected && (capabilities != null)
+ && !capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
+ final boolean unmetered = connected && (capabilities != null)
+ && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
+ final boolean notRoaming = connected && (info != null)
+ && !info.isRoaming();
boolean changed = false;
changed |= jobStatus.setConnectivityConstraintSatisfied(connectionUsable);
@@ -148,13 +150,13 @@
* @param uid only update jobs belonging to this UID, or {@code -1} to
* update all tracked jobs.
*/
- private void updateTrackedJobs(int uid, NetworkCapabilities capabilities) {
+ private void updateTrackedJobs(int uid) {
synchronized (mLock) {
boolean changed = false;
for (int i = mTrackedJobs.size()-1; i >= 0; i--) {
final JobStatus js = mTrackedJobs.valueAt(i);
if (uid == -1 || uid == js.getSourceUid()) {
- changed |= updateConstraintsSatisfied(js, capabilities);
+ changed |= updateConstraintsSatisfied(js);
}
}
if (changed) {
@@ -187,7 +189,7 @@
if (DEBUG) {
Slog.v(TAG, "onCapabilitiesChanged() : " + networkCapabilities);
}
- updateTrackedJobs(-1, networkCapabilities);
+ updateTrackedJobs(-1);
}
@Override
@@ -195,7 +197,7 @@
if (DEBUG) {
Slog.v(TAG, "Network lost");
}
- updateTrackedJobs(-1, null);
+ updateTrackedJobs(-1);
}
};
@@ -205,7 +207,7 @@
if (DEBUG) {
Slog.v(TAG, "Uid rules changed for " + uid);
}
- updateTrackedJobs(uid, null);
+ updateTrackedJobs(uid);
}
@Override
@@ -218,7 +220,7 @@
if (DEBUG) {
Slog.v(TAG, "Background restriction change to " + restrictBackground);
}
- updateTrackedJobs(-1, null);
+ updateTrackedJobs(-1);
}
@Override
@@ -226,7 +228,7 @@
if (DEBUG) {
Slog.v(TAG, "Uid policy changed for " + uid);
}
- updateTrackedJobs(uid, null);
+ updateTrackedJobs(uid);
}
};
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java
index c1e820c..a105c84 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsService.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java
@@ -1132,12 +1132,6 @@
fixateNewestUserKeyAuth(userId);
synchronizeUnifiedWorkChallengeForProfiles(userId, null);
notifyActivePasswordMetricsAvailable(null, userId);
-
- if (mStorage.getPersistentDataBlock() != null
- && LockPatternUtils.userOwnsFrpCredential(mUserManager.getUserInfo(userId))) {
- // If owner, write to persistent storage for FRP
- mStorage.writePersistentDataBlock(PersistentData.TYPE_NONE, userId, 0, null);
- }
return;
}
if (credential == null) {
@@ -1190,12 +1184,6 @@
// Refresh the auth token
doVerifyCredential(credential, credentialType, true, 0, userId, null /* progressCallback */);
synchronizeUnifiedWorkChallengeForProfiles(userId, null);
- if (mStorage.getPersistentDataBlock() != null
- && LockPatternUtils.userOwnsFrpCredential(mUserManager.getUserInfo(userId))) {
- // If owner, write to persistent storage for FRP
- mStorage.writePersistentDataBlock(PersistentData.TYPE_GATEKEEPER, userId,
- requestedQuality, willStore.toBytes());
- }
} else {
throw new RemoteException("Failed to enroll " +
(credentialType == LockPatternUtils.CREDENTIAL_TYPE_PASSWORD ? "password"
@@ -1443,18 +1431,12 @@
return response;
}
- final CredentialHash storedHash;
if (userId == USER_FRP) {
- PersistentData data = mStorage.readPersistentDataBlock();
- if (data.type != PersistentData.TYPE_GATEKEEPER) {
- Slog.wtf(TAG, "Expected PersistentData.TYPE_GATEKEEPER, but was: " + data.type);
- return VerifyCredentialResponse.ERROR;
- }
- return verifyFrpCredential(credential, credentialType, data, progressCallback);
- } else {
- storedHash = mStorage.readCredentialHash(userId);
+ Slog.wtf(TAG, "Unexpected FRP credential type, should be SP based.");
+ return VerifyCredentialResponse.ERROR;
}
+ final CredentialHash storedHash = mStorage.readCredentialHash(userId);
if (storedHash.type != credentialType) {
Slog.wtf(TAG, "doVerifyCredential type mismatch with stored credential??"
+ " stored: " + storedHash.type + " passed in: " + credentialType);
@@ -1485,29 +1467,6 @@
return response;
}
- private VerifyCredentialResponse verifyFrpCredential(String credential, int credentialType,
- PersistentData data, ICheckCredentialProgressCallback progressCallback)
- throws RemoteException {
- CredentialHash storedHash = CredentialHash.fromBytes(data.payload);
- if (storedHash.type != credentialType) {
- Slog.wtf(TAG, "doVerifyCredential type mismatch with stored credential??"
- + " stored: " + storedHash.type + " passed in: " + credentialType);
- return VerifyCredentialResponse.ERROR;
- }
- if (ArrayUtils.isEmpty(storedHash.hash) || TextUtils.isEmpty(credential)) {
- Slog.e(TAG, "Stored hash or credential is empty");
- return VerifyCredentialResponse.ERROR;
- }
- VerifyCredentialResponse response = VerifyCredentialResponse.fromGateKeeperResponse(
- getGateKeeperService().verifyChallenge(data.userId, 0 /* challenge */,
- storedHash.hash, credential.getBytes()));
- if (progressCallback != null
- && response.getResponseCode() == VerifyCredentialResponse.RESPONSE_OK) {
- progressCallback.onCredentialVerified();
- }
- return response;
- }
-
@Override
public VerifyCredentialResponse verifyTiedProfileChallenge(String credential, int type,
long challenge, int userId) throws RemoteException {
@@ -1931,7 +1890,8 @@
* This is the untrusted credential reset, OR the user sets a new lockscreen password
* FOR THE FIRST TIME on a SP-enabled device. New credential and new SID will be created
*/
- private AuthenticationToken initializeSyntheticPasswordLocked(byte[] credentialHash,
+ @VisibleForTesting
+ protected AuthenticationToken initializeSyntheticPasswordLocked(byte[] credentialHash,
String credential, int credentialType, int requestedQuality,
int userId) throws RemoteException {
Slog.i(TAG, "Initialize SyntheticPassword for user: " + userId);
@@ -1982,7 +1942,8 @@
return enabled != 0 && handle != SyntheticPasswordManager.DEFAULT_HANDLE;
}
- private boolean shouldMigrateToSyntheticPasswordLocked(int userId) throws RemoteException {
+ @VisibleForTesting
+ protected boolean shouldMigrateToSyntheticPasswordLocked(int userId) throws RemoteException {
long handle = getSyntheticPasswordHandleLocked(userId);
// This is a global setting
long enabled = getLong(SYNTHETIC_PASSWORD_ENABLED_KEY,
@@ -2017,6 +1978,10 @@
authResult = mSpManager.unwrapPasswordBasedSyntheticPassword(
getGateKeeperService(), handle, userCredential, userId);
+ if (authResult.credentialType != credentialType) {
+ Slog.e(TAG, "Credential type mismatch.");
+ return VerifyCredentialResponse.ERROR;
+ }
response = authResult.gkResponse;
// credential has matched
if (response.getResponseCode() == VerifyCredentialResponse.RESPONSE_OK) {
@@ -2136,6 +2101,14 @@
getGateKeeperService(), handle, savedCredential, userId);
VerifyCredentialResponse response = authResult.gkResponse;
AuthenticationToken auth = authResult.authToken;
+
+ // If existing credential is provided, then it must match.
+ if (savedCredential != null && auth == null) {
+ throw new RemoteException("Failed to enroll " +
+ (credentialType == LockPatternUtils.CREDENTIAL_TYPE_PASSWORD ? "password"
+ : "pattern"));
+ }
+
if (auth != null) {
// We are performing a trusted credential change i.e. a correct existing credential
// is provided
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsShellCommand.java b/services/core/java/com/android/server/locksettings/LockSettingsShellCommand.java
index d730c56..d39679d 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsShellCommand.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsShellCommand.java
@@ -36,6 +36,7 @@
private static final String COMMAND_CLEAR = "clear";
private static final String COMMAND_SP = "sp";
private static final String COMMAND_SET_DISABLED = "set-disabled";
+ private static final String COMMAND_VERIFY = "verify";
private int mCurrentUserId;
private final LockPatternUtils mLockPatternUtils;
@@ -76,6 +77,9 @@
case COMMAND_SET_DISABLED:
runSetDisabled();
break;
+ case COMMAND_VERIFY:
+ runVerify();
+ break;
default:
getErrPrintWriter().println("Unknown command: " + cmd);
break;
@@ -88,6 +92,11 @@
}
}
+ private void runVerify() {
+ // The command is only run if the credential is correct.
+ getOutPrintWriter().println("Lock credential verified successfully");
+ }
+
@Override
public void onHelp() {
}
@@ -147,21 +156,31 @@
getOutPrintWriter().println("Lock screen disabled set to " + disabled);
}
- private boolean checkCredential() throws RemoteException, RequestThrottledException {
+ private boolean checkCredential() throws RemoteException {
final boolean havePassword = mLockPatternUtils.isLockPasswordEnabled(mCurrentUserId);
final boolean havePattern = mLockPatternUtils.isLockPatternEnabled(mCurrentUserId);
if (havePassword || havePattern) {
- boolean result;
- if (havePassword) {
- result = mLockPatternUtils.checkPassword(mOld, mCurrentUserId);
- } else {
- result = mLockPatternUtils.checkPattern(stringToPattern(mOld),
- mCurrentUserId);
+ if (mLockPatternUtils.isManagedProfileWithUnifiedChallenge(mCurrentUserId)) {
+ getOutPrintWriter().println("Profile uses unified challenge");
+ return false;
}
- if (result) {
- return true;
- } else {
- getOutPrintWriter().println("Old password '" + mOld + "' didn't match");
+
+ try {
+ final boolean result;
+ if (havePassword) {
+ result = mLockPatternUtils.checkPassword(mOld, mCurrentUserId);
+ } else {
+ result = mLockPatternUtils.checkPattern(stringToPattern(mOld), mCurrentUserId);
+ }
+ if (!result) {
+ if (!mLockPatternUtils.isManagedProfileWithUnifiedChallenge(mCurrentUserId)) {
+ mLockPatternUtils.reportFailedPasswordAttempt(mCurrentUserId);
+ }
+ getOutPrintWriter().println("Old password '" + mOld + "' didn't match");
+ }
+ return result;
+ } catch (RequestThrottledException e) {
+ getOutPrintWriter().println("Request throttled");
return false;
}
} else {
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsStorage.java b/services/core/java/com/android/server/locksettings/LockSettingsStorage.java
index 79372e48..b4c10ec 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsStorage.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsStorage.java
@@ -635,9 +635,8 @@
static final int VERSION_1_HEADER_SIZE = 1 + 1 + 4 + 4;
public static final int TYPE_NONE = 0;
- public static final int TYPE_GATEKEEPER = 1;
- public static final int TYPE_SP = 2;
- public static final int TYPE_SP_WEAVER = 3;
+ public static final int TYPE_SP = 1;
+ public static final int TYPE_SP_WEAVER = 2;
public static final PersistentData NONE = new PersistentData(TYPE_NONE,
UserHandle.USER_NULL, DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, null);
diff --git a/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java b/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java
index f45c208..603e46a 100644
--- a/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java
+++ b/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java
@@ -127,6 +127,7 @@
static class AuthenticationResult {
public AuthenticationToken authToken;
public VerifyCredentialResponse gkResponse;
+ public int credentialType;
}
static class AuthenticationToken {
@@ -754,6 +755,8 @@
* Decrypt a synthetic password by supplying the user credential and corresponding password
* blob handle generated previously. If the decryption is successful, initiate a GateKeeper
* verification to referesh the SID & Auth token maintained by the system.
+ * Note: the credential type is not validated here since there are call sites where the type is
+ * unknown. Caller might choose to validate it by examining AuthenticationResult.credentialType
*/
public AuthenticationResult unwrapPasswordBasedSyntheticPassword(IGateKeeperService gatekeeper,
long handle, String credential, int userId) throws RemoteException {
@@ -762,6 +765,7 @@
}
AuthenticationResult result = new AuthenticationResult();
PasswordData pwd = PasswordData.fromBytes(loadState(PASSWORD_DATA_NAME, handle, userId));
+ result.credentialType = pwd.passwordType;
byte[] pwdToken = computePasswordToken(credential, pwd);
final byte[] applicationId;
diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java
index adb50f0..b77ed91 100644
--- a/services/core/java/com/android/server/media/MediaSessionService.java
+++ b/services/core/java/com/android/server/media/MediaSessionService.java
@@ -16,10 +16,8 @@
package com.android.server.media;
-import android.Manifest;
-import android.annotation.NonNull;
-import android.app.Activity;
import android.app.ActivityManager;
+import android.app.INotificationManager;
import android.app.KeyguardManager;
import android.app.PendingIntent;
import android.app.PendingIntent.CanceledException;
@@ -57,13 +55,11 @@
import android.os.RemoteException;
import android.os.ResultReceiver;
import android.os.ServiceManager;
-import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
import android.speech.RecognizerIntent;
import android.text.TextUtils;
-import android.util.IntArray;
import android.util.Log;
import android.util.Slog;
import android.util.SparseArray;
@@ -80,7 +76,6 @@
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
/**
@@ -112,6 +107,8 @@
private AudioManagerInternal mAudioManagerInternal;
private ContentResolver mContentResolver;
private SettingsObserver mSettingsObserver;
+ private INotificationManager mNotificationManager;
+ private boolean mHasFeatureLeanback;
// The FullUserRecord of the current users. (i.e. The foreground user that isn't a profile)
// It's always not null after the MediaSessionService is started.
@@ -129,6 +126,8 @@
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
mMediaEventWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "handleMediaEvent");
mLongPressTimeout = ViewConfiguration.getLongPressTimeout();
+ mNotificationManager = INotificationManager.Stub.asInterface(
+ ServiceManager.getService(Context.NOTIFICATION_SERVICE));
}
@Override
@@ -156,6 +155,8 @@
mContentResolver = getContext().getContentResolver();
mSettingsObserver = new SettingsObserver();
mSettingsObserver.observe();
+ mHasFeatureLeanback = getContext().getPackageManager().hasSystemFeature(
+ PackageManager.FEATURE_LEANBACK);
updateUser();
}
@@ -472,28 +473,11 @@
Log.d(TAG, "Checking if enabled notification listener " + compName);
}
if (compName != null) {
- final String enabledNotifListeners = Settings.Secure.getStringForUser(mContentResolver,
- Settings.Secure.ENABLED_NOTIFICATION_LISTENERS,
- userId);
- if (enabledNotifListeners != null) {
- final String[] components = enabledNotifListeners.split(":");
- for (int i = 0; i < components.length; i++) {
- final ComponentName component =
- ComponentName.unflattenFromString(components[i]);
- if (component != null) {
- if (compName.equals(component)) {
- if (DEBUG) {
- Log.d(TAG, "ok to get sessions. " + component +
- " is authorized notification listener");
- }
- return true;
- }
- }
- }
- }
- if (DEBUG) {
- Log.d(TAG, "not ok to get sessions. " + compName +
- " is not in list of ENABLED_NOTIFICATION_LISTENERS for user " + userId);
+ try {
+ return mNotificationManager.isNotificationListenerAccessGrantedForUser(
+ compName, userId);
+ } catch(RemoteException e) {
+ Log.w(TAG, "Dead NotificationManager in isEnabledNotificationListener", e);
}
}
return false;
@@ -1528,7 +1512,7 @@
private boolean isVoiceKey(int keyCode) {
return keyCode == KeyEvent.KEYCODE_HEADSETHOOK
- || keyCode == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE;
+ || (!mHasFeatureLeanback && keyCode == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE);
}
private boolean isUserSetupComplete() {
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index b89d247..f70486a 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -18,7 +18,6 @@
import static android.Manifest.permission.ACCESS_NETWORK_STATE;
import static android.Manifest.permission.CONNECTIVITY_INTERNAL;
-import static android.Manifest.permission.DUMP;
import static android.Manifest.permission.MANAGE_NETWORK_POLICY;
import static android.Manifest.permission.READ_NETWORK_USAGE_HISTORY;
import static android.Manifest.permission.READ_PHONE_STATE;
@@ -33,9 +32,6 @@
import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_ENABLED;
import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_WHITELISTED;
import static android.net.ConnectivityManager.TYPE_MOBILE;
-import static android.net.ConnectivityManager.TYPE_WIMAX;
-import static android.net.ConnectivityManager.isNetworkTypeMobile;
-import static android.net.NetworkPolicy.CYCLE_NONE;
import static android.net.NetworkPolicy.LIMIT_DISABLED;
import static android.net.NetworkPolicy.SNOOZE_NEVER;
import static android.net.NetworkPolicy.WARNING_DISABLED;
@@ -46,20 +42,20 @@
import static android.net.NetworkPolicyManager.FIREWALL_RULE_ALLOW;
import static android.net.NetworkPolicyManager.FIREWALL_RULE_DEFAULT;
import static android.net.NetworkPolicyManager.FIREWALL_RULE_DENY;
+import static android.net.NetworkPolicyManager.MASK_ALL_NETWORKS;
+import static android.net.NetworkPolicyManager.MASK_METERED_NETWORKS;
import static android.net.NetworkPolicyManager.POLICY_ALLOW_METERED_BACKGROUND;
import static android.net.NetworkPolicyManager.POLICY_NONE;
import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND;
import static android.net.NetworkPolicyManager.RULE_ALLOW_ALL;
import static android.net.NetworkPolicyManager.RULE_ALLOW_METERED;
-import static android.net.NetworkPolicyManager.MASK_METERED_NETWORKS;
-import static android.net.NetworkPolicyManager.MASK_ALL_NETWORKS;
import static android.net.NetworkPolicyManager.RULE_NONE;
import static android.net.NetworkPolicyManager.RULE_REJECT_ALL;
import static android.net.NetworkPolicyManager.RULE_REJECT_METERED;
import static android.net.NetworkPolicyManager.RULE_TEMPORARY_ALLOW_METERED;
-import static android.net.NetworkPolicyManager.computeLastCycleBoundary;
import static android.net.NetworkPolicyManager.isProcStateAllowedWhileIdleOrPowerSaveMode;
import static android.net.NetworkPolicyManager.isProcStateAllowedWhileOnRestrictBackground;
+import static android.net.NetworkPolicyManager.resolveNetworkId;
import static android.net.NetworkPolicyManager.uidPoliciesToString;
import static android.net.NetworkPolicyManager.uidRulesToString;
import static android.net.NetworkTemplate.MATCH_MOBILE_3G_LOWER;
@@ -68,16 +64,9 @@
import static android.net.NetworkTemplate.MATCH_WIFI;
import static android.net.NetworkTemplate.buildTemplateMobileAll;
import static android.net.TrafficStats.MB_IN_BYTES;
-import static android.net.wifi.WifiManager.CHANGE_REASON_ADDED;
-import static android.net.wifi.WifiManager.CHANGE_REASON_REMOVED;
-import static android.net.wifi.WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION;
-import static android.net.wifi.WifiManager.EXTRA_CHANGE_REASON;
-import static android.net.wifi.WifiManager.EXTRA_NETWORK_INFO;
-import static android.net.wifi.WifiManager.EXTRA_WIFI_CONFIGURATION;
-import static android.net.wifi.WifiManager.EXTRA_WIFI_INFO;
import static android.telephony.CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED;
-import static android.telephony.CarrierConfigManager.DATA_CYCLE_USE_PLATFORM_DEFAULT;
import static android.telephony.CarrierConfigManager.DATA_CYCLE_THRESHOLD_DISABLED;
+import static android.telephony.CarrierConfigManager.DATA_CYCLE_USE_PLATFORM_DEFAULT;
import static android.text.format.DateUtils.DAY_IN_MILLIS;
import static com.android.internal.util.ArrayUtils.appendInt;
@@ -85,9 +74,11 @@
import static com.android.internal.util.XmlUtils.readBooleanAttribute;
import static com.android.internal.util.XmlUtils.readIntAttribute;
import static com.android.internal.util.XmlUtils.readLongAttribute;
+import static com.android.internal.util.XmlUtils.readStringAttribute;
import static com.android.internal.util.XmlUtils.writeBooleanAttribute;
import static com.android.internal.util.XmlUtils.writeIntAttribute;
import static com.android.internal.util.XmlUtils.writeLongAttribute;
+import static com.android.internal.util.XmlUtils.writeStringAttribute;
import static com.android.server.NetworkManagementService.LIMIT_GLOBAL_ALERT;
import static com.android.server.net.NetworkStatsService.ACTION_NETWORK_STATS_UPDATED;
@@ -127,15 +118,14 @@
import android.net.INetworkStatsService;
import android.net.LinkProperties;
import android.net.NetworkIdentity;
-import android.net.NetworkInfo;
import android.net.NetworkPolicy;
+import android.net.NetworkPolicyManager;
import android.net.NetworkQuotaInfo;
import android.net.NetworkState;
import android.net.NetworkTemplate;
+import android.net.TrafficStats;
import android.net.wifi.WifiConfiguration;
-import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
-import android.os.PowerSaveState;
import android.os.Binder;
import android.os.Environment;
import android.os.Handler;
@@ -147,29 +137,35 @@
import android.os.PersistableBundle;
import android.os.PowerManager;
import android.os.PowerManagerInternal;
+import android.os.PowerSaveState;
import android.os.Process;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.os.ResultReceiver;
import android.os.ServiceManager;
import android.os.ShellCallback;
+import android.os.SystemProperties;
import android.os.Trace;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
+import android.provider.Settings.Global;
import android.telephony.CarrierConfigManager;
+import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
+import android.telephony.SubscriptionPlan;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.text.format.Formatter;
-import android.text.format.Time;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.AtomicFile;
import android.util.Log;
import android.util.NtpTrustedTime;
import android.util.Pair;
+import android.util.RecurrenceRule;
import android.util.Slog;
+import android.util.SparseArray;
import android.util.SparseBooleanArray;
import android.util.SparseIntArray;
import android.util.TrustedTime;
@@ -185,19 +181,19 @@
import com.android.internal.util.DumpUtils;
import com.android.internal.util.FastXmlSerializer;
import com.android.internal.util.IndentingPrintWriter;
+import com.android.internal.util.Preconditions;
import com.android.server.DeviceIdleController;
import com.android.server.EventLogTags;
import com.android.server.LocalServices;
import com.android.server.ServiceThread;
import com.android.server.SystemConfig;
-
import com.android.server.power.BatterySaverPolicy.ServiceType;
+
import libcore.io.IoUtils;
import com.google.android.collect.Lists;
import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;
import java.io.File;
@@ -210,10 +206,12 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.nio.charset.StandardCharsets;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.List;
import java.util.Calendar;
+import java.util.List;
import java.util.Objects;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
@@ -261,7 +259,8 @@
private static final int VERSION_SWITCH_APP_ID = 8;
private static final int VERSION_ADDED_NETWORK_ID = 9;
private static final int VERSION_SWITCH_UID = 10;
- private static final int VERSION_LATEST = VERSION_SWITCH_UID;
+ private static final int VERSION_ADDED_CYCLE = 11;
+ private static final int VERSION_LATEST = VERSION_ADDED_CYCLE;
/**
* Max items written to {@link #ProcStateSeqHistory}.
@@ -279,6 +278,7 @@
private static final String TAG_POLICY_LIST = "policy-list";
private static final String TAG_NETWORK_POLICY = "network-policy";
+ private static final String TAG_SUBSCRIPTION_PLAN = "subscription-plan";
private static final String TAG_UID_POLICY = "uid-policy";
private static final String TAG_APP_POLICY = "app-policy";
private static final String TAG_WHITELIST = "whitelist";
@@ -290,8 +290,11 @@
private static final String ATTR_NETWORK_TEMPLATE = "networkTemplate";
private static final String ATTR_SUBSCRIBER_ID = "subscriberId";
private static final String ATTR_NETWORK_ID = "networkId";
- private static final String ATTR_CYCLE_DAY = "cycleDay";
- private static final String ATTR_CYCLE_TIMEZONE = "cycleTimezone";
+ @Deprecated private static final String ATTR_CYCLE_DAY = "cycleDay";
+ @Deprecated private static final String ATTR_CYCLE_TIMEZONE = "cycleTimezone";
+ private static final String ATTR_CYCLE_START = "cycleStart";
+ private static final String ATTR_CYCLE_END = "cycleEnd";
+ private static final String ATTR_CYCLE_PERIOD = "cyclePeriod";
private static final String ATTR_WARNING_BYTES = "warningBytes";
private static final String ATTR_LIMIT_BYTES = "limitBytes";
private static final String ATTR_LAST_SNOOZE = "lastSnooze";
@@ -302,6 +305,12 @@
private static final String ATTR_UID = "uid";
private static final String ATTR_APP_ID = "appId";
private static final String ATTR_POLICY = "policy";
+ private static final String ATTR_SUB_ID = "subId";
+ private static final String ATTR_TITLE = "title";
+ private static final String ATTR_SUMMARY = "summary";
+ private static final String ATTR_LIMIT_BEHAVIOR = "limitBehavior";
+ private static final String ATTR_USAGE_BYTES = "usageBytes";
+ private static final String ATTR_USAGE_TIME = "usageTime";
private static final String ACTION_ALLOW_BACKGROUND =
"com.android.server.net.action.ALLOW_BACKGROUND";
@@ -363,6 +372,9 @@
/** Currently active network rules for ifaces. */
final ArrayMap<NetworkPolicy, String[]> mNetworkRules = new ArrayMap<>();
+ /** Defined subscription plans. */
+ final SparseArray<SubscriptionPlan[]> mSubscriptionPlans = new SparseArray<>();
+
/** Defined UID policies. */
@GuardedBy("mUidRulesFirstLock") final SparseIntArray mUidPolicy = new SparseIntArray();
/** Currently derived rules for each UID. */
@@ -756,15 +768,10 @@
mContext.registerReceiver(mSnoozeWarningReceiver, snoozeWarningFilter,
MANAGE_NETWORK_POLICY, mHandler);
- // listen for configured wifi networks to be removed
- final IntentFilter wifiConfigFilter =
- new IntentFilter(CONFIGURED_NETWORKS_CHANGED_ACTION);
- mContext.registerReceiver(mWifiConfigReceiver, wifiConfigFilter, null, mHandler);
-
- // listen for wifi state changes to catch metered hint
- final IntentFilter wifiStateFilter = new IntentFilter(
- WifiManager.NETWORK_STATE_CHANGED_ACTION);
- mContext.registerReceiver(mWifiStateReceiver, wifiStateFilter, null, mHandler);
+ // listen for configured wifi networks to be loaded
+ final IntentFilter wifiFilter =
+ new IntentFilter(WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION);
+ mContext.registerReceiver(mWifiReceiver, wifiFilter, null, mHandler);
// listen for carrier config changes to update data cycle information
final IntentFilter carrierConfigFilter = new IntentFilter(
@@ -800,20 +807,22 @@
}
final private IUidObserver mUidObserver = new IUidObserver.Stub() {
- @Override public void onUidStateChanged(int uid, int procState,
- long procStateSeq) throws RemoteException {
+ @Override public void onUidStateChanged(int uid, int procState, long procStateSeq) {
mUidEventHandler.obtainMessage(UID_MSG_STATE_CHANGED,
uid, procState, procStateSeq).sendToTarget();
}
- @Override public void onUidGone(int uid, boolean disabled) throws RemoteException {
+ @Override public void onUidGone(int uid, boolean disabled) {
mUidEventHandler.obtainMessage(UID_MSG_GONE, uid, 0).sendToTarget();
}
- @Override public void onUidActive(int uid) throws RemoteException {
+ @Override public void onUidActive(int uid) {
}
- @Override public void onUidIdle(int uid, boolean disabled) throws RemoteException {
+ @Override public void onUidIdle(int uid, boolean disabled) {
+ }
+
+ @Override public void onUidCachedChanged(int uid, boolean cached) {
}
};
@@ -958,80 +967,22 @@
};
/**
- * Receiver that watches for {@link WifiConfiguration} to be changed.
+ * Receiver that watches for {@link WifiConfiguration} to be loaded so that
+ * we can perform upgrade logic.
*/
- final private BroadcastReceiver mWifiConfigReceiver = new BroadcastReceiver() {
+ final private BroadcastReceiver mWifiReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
- // on background handler thread, and verified CONNECTIVITY_INTERNAL
- // permission above.
-
- final int reason = intent.getIntExtra(EXTRA_CHANGE_REASON, CHANGE_REASON_ADDED);
- if (reason == CHANGE_REASON_REMOVED) {
- final WifiConfiguration config = intent.getParcelableExtra(
- EXTRA_WIFI_CONFIGURATION);
- if (config.SSID != null) {
- final NetworkTemplate template = NetworkTemplate.buildTemplateWifi(config.SSID);
- synchronized (mUidRulesFirstLock) {
- synchronized (mNetworkPoliciesSecondLock) {
- if (mNetworkPolicy.containsKey(template)) {
- mNetworkPolicy.remove(template);
- writePolicyAL();
- }
- }
- }
- }
- }
- }
- };
-
- /**
- * Receiver that watches {@link WifiInfo} state changes to infer metered
- * state. Ignores hints when policy is user-defined.
- */
- final private BroadcastReceiver mWifiStateReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- // on background handler thread, and verified CONNECTIVITY_INTERNAL
- // permission above.
-
- // ignore when not connected
- final NetworkInfo netInfo = intent.getParcelableExtra(EXTRA_NETWORK_INFO);
- if (!netInfo.isConnected()) return;
-
- final WifiInfo info = intent.getParcelableExtra(EXTRA_WIFI_INFO);
- final boolean meteredHint = info.getMeteredHint();
-
- final NetworkTemplate template = NetworkTemplate.buildTemplateWifi(info.getSSID());
synchronized (mUidRulesFirstLock) {
synchronized (mNetworkPoliciesSecondLock) {
- NetworkPolicy policy = mNetworkPolicy.get(template);
- if (policy == null && meteredHint) {
- // policy doesn't exist, and AP is hinting that it's
- // metered: create an inferred policy.
- policy = newWifiPolicy(template, meteredHint);
- addNetworkPolicyAL(policy);
-
- } else if (policy != null && policy.inferred) {
- // policy exists, and was inferred: update its current
- // metered state.
- policy.metered = meteredHint;
-
- // since this is inferred for each wifi session, just update
- // rules without persisting.
- updateNetworkRulesNL();
- }
+ upgradeWifiMeteredOverrideAL();
}
}
+ // Only need to perform upgrade logic once
+ mContext.unregisterReceiver(this);
}
};
- static NetworkPolicy newWifiPolicy(NetworkTemplate template, boolean metered) {
- return new NetworkPolicy(template, CYCLE_NONE, Time.TIMEZONE_UTC,
- WARNING_DISABLED, LIMIT_DISABLED, SNOOZE_NEVER, SNOOZE_NEVER,
- metered, true);
- }
-
/**
* Observer that watches for {@link INetworkManagementService} alerts.
*/
@@ -1063,15 +1014,16 @@
// cycle boundary to recompute notifications.
// examine stats for each active policy
- final long currentTime = currentTimeMillis();
for (int i = mNetworkPolicy.size()-1; i >= 0; i--) {
final NetworkPolicy policy = mNetworkPolicy.valueAt(i);
// ignore policies that aren't relevant to user
if (!isTemplateRelevant(policy.template)) continue;
if (!policy.hasCycle()) continue;
- final long start = computeLastCycleBoundary(currentTime, policy);
- final long end = currentTime;
+ final Pair<ZonedDateTime, ZonedDateTime> cycle = NetworkPolicyManager
+ .cycleIterator(policy).next();
+ final long start = cycle.first.toInstant().toEpochMilli();
+ final long end = cycle.second.toInstant().toEpochMilli();
final long totalBytes = getTotalBytes(policy.template, start, end);
if (policy.isOverLimit(totalBytes)) {
@@ -1336,20 +1288,27 @@
continue;
}
- final int cycleDay = getCycleDayFromCarrierConfig(config, policy.cycleDay);
+ final int currentCycleDay;
+ if (policy.cycleRule.isMonthly()) {
+ currentCycleDay = policy.cycleRule.start.getDayOfMonth();
+ } else {
+ currentCycleDay = NetworkPolicy.CYCLE_NONE;
+ }
+
+ final int cycleDay = getCycleDayFromCarrierConfig(config, currentCycleDay);
final long warningBytes = getWarningBytesFromCarrierConfig(config,
policy.warningBytes);
final long limitBytes = getLimitBytesFromCarrierConfig(config,
policy.limitBytes);
- if (policy.cycleDay == cycleDay &&
+ if (currentCycleDay == cycleDay &&
policy.warningBytes == warningBytes &&
policy.limitBytes == limitBytes) {
continue;
}
policyUpdated = true;
- policy.cycleDay = cycleDay;
+ policy.cycleRule = NetworkPolicy.buildRule(cycleDay, ZoneId.systemDefault());
policy.warningBytes = warningBytes;
policy.limitBytes = limitBytes;
@@ -1519,7 +1478,6 @@
// TODO: reset any policy-disabled networks when any policy is removed
// completely, which is currently rare case.
- final long currentTime = currentTimeMillis();
for (int i = mNetworkPolicy.size()-1; i >= 0; i--) {
final NetworkPolicy policy = mNetworkPolicy.valueAt(i);
// shortcut when policy has no limit
@@ -1528,8 +1486,10 @@
continue;
}
- final long start = computeLastCycleBoundary(currentTime, policy);
- final long end = currentTime;
+ final Pair<ZonedDateTime, ZonedDateTime> cycle = NetworkPolicyManager
+ .cycleIterator(policy).next();
+ final long start = cycle.first.toInstant().toEpochMilli();
+ final long end = cycle.second.toInstant().toEpochMilli();
final long totalBytes = getTotalBytes(policy.template, start, end);
// disable data connection when over limit and not snoozed
@@ -1634,20 +1594,15 @@
// apply each policy that we found ifaces for; compute remaining data
// based on current cycle and historical stats, and push to kernel.
- final long currentTime = currentTimeMillis();
for (int i = mNetworkRules.size()-1; i >= 0; i--) {
final NetworkPolicy policy = mNetworkRules.keyAt(i);
final String[] ifaces = mNetworkRules.valueAt(i);
- final long start;
- final long totalBytes;
- if (policy.hasCycle()) {
- start = computeLastCycleBoundary(currentTime, policy);
- totalBytes = getTotalBytes(policy.template, start, currentTime);
- } else {
- start = Long.MAX_VALUE;
- totalBytes = 0;
- }
+ final Pair<ZonedDateTime, ZonedDateTime> cycle = NetworkPolicyManager
+ .cycleIterator(policy).next();
+ final long start = cycle.first.toInstant().toEpochMilli();
+ final long end = cycle.second.toInstant().toEpochMilli();
+ final long totalBytes = getTotalBytes(policy.template, start, end);
if (LOGD) {
Slog.d(TAG, "applying policy " + policy + " to ifaces " + Arrays.toString(ifaces));
@@ -1786,20 +1741,16 @@
public NetworkPolicy buildDefaultMobilePolicy(int subId, String subscriberId) {
PersistableBundle config = mCarrierConfigManager.getConfigForSubId(subId);
- // assume usage cycle starts today
- final Time time = new Time();
- time.setToNow();
-
- final String cycleTimezone = time.timezone;
-
- final int cycleDay = getCycleDayFromCarrierConfig(config, time.monthDay);
+ final int cycleDay = getCycleDayFromCarrierConfig(config,
+ ZonedDateTime.now().getDayOfMonth());
final long warningBytes = getWarningBytesFromCarrierConfig(config,
getPlatformDefaultWarningBytes());
final long limitBytes = getLimitBytesFromCarrierConfig(config,
getPlatformDefaultLimitBytes());
final NetworkTemplate template = buildTemplateMobileAll(subscriberId);
- final NetworkPolicy policy = new NetworkPolicy(template, cycleDay, cycleTimezone,
+ final RecurrenceRule cycleRule = NetworkPolicy.buildRule(cycleDay, ZoneId.systemDefault());
+ final NetworkPolicy policy = new NetworkPolicy(template, cycleRule,
warningBytes, limitBytes, SNOOZE_NEVER, SNOOZE_NEVER, true, true);
return policy;
}
@@ -1809,6 +1760,7 @@
// clear any existing policy and read from disk
mNetworkPolicy.clear();
+ mSubscriptionPlans.clear();
mUidPolicy.clear();
FileInputStream fis = null;
@@ -1852,12 +1804,24 @@
} else {
networkId = null;
}
- final int cycleDay = readIntAttribute(in, ATTR_CYCLE_DAY);
- final String cycleTimezone;
- if (version >= VERSION_ADDED_TIMEZONE) {
- cycleTimezone = in.getAttributeValue(null, ATTR_CYCLE_TIMEZONE);
+ final RecurrenceRule cycleRule;
+ if (version >= VERSION_ADDED_CYCLE) {
+ final String start = readStringAttribute(in, ATTR_CYCLE_START);
+ final String end = readStringAttribute(in, ATTR_CYCLE_END);
+ final String period = readStringAttribute(in, ATTR_CYCLE_PERIOD);
+ cycleRule = new RecurrenceRule(
+ RecurrenceRule.convertZonedDateTime(start),
+ RecurrenceRule.convertZonedDateTime(end),
+ RecurrenceRule.convertPeriod(period));
} else {
- cycleTimezone = Time.TIMEZONE_UTC;
+ final int cycleDay = readIntAttribute(in, ATTR_CYCLE_DAY);
+ final String cycleTimezone;
+ if (version >= VERSION_ADDED_TIMEZONE) {
+ cycleTimezone = in.getAttributeValue(null, ATTR_CYCLE_TIMEZONE);
+ } else {
+ cycleTimezone = "UTC";
+ }
+ cycleRule = NetworkPolicy.buildRule(cycleDay, ZoneId.of(cycleTimezone));
}
final long warningBytes = readLongAttribute(in, ATTR_WARNING_BYTES);
final long limitBytes = readLongAttribute(in, ATTR_LIMIT_BYTES);
@@ -1899,11 +1863,45 @@
final NetworkTemplate template = new NetworkTemplate(networkTemplate,
subscriberId, networkId);
if (template.isPersistable()) {
- mNetworkPolicy.put(template, new NetworkPolicy(template, cycleDay,
- cycleTimezone, warningBytes, limitBytes, lastWarningSnooze,
+ mNetworkPolicy.put(template, new NetworkPolicy(template, cycleRule,
+ warningBytes, limitBytes, lastWarningSnooze,
lastLimitSnooze, metered, inferred));
}
+ } else if (TAG_SUBSCRIPTION_PLAN.equals(tag)) {
+ final String start = readStringAttribute(in, ATTR_CYCLE_START);
+ final String end = readStringAttribute(in, ATTR_CYCLE_END);
+ final String period = readStringAttribute(in, ATTR_CYCLE_PERIOD);
+ final SubscriptionPlan.Builder builder = new SubscriptionPlan.Builder(
+ RecurrenceRule.convertZonedDateTime(start),
+ RecurrenceRule.convertZonedDateTime(end),
+ RecurrenceRule.convertPeriod(period));
+ builder.setTitle(readStringAttribute(in, ATTR_TITLE));
+ builder.setSummary(readStringAttribute(in, ATTR_SUMMARY));
+
+ final long limitBytes = readLongAttribute(in, ATTR_LIMIT_BYTES,
+ SubscriptionPlan.BYTES_UNKNOWN);
+ final int limitBehavior = readIntAttribute(in, ATTR_LIMIT_BEHAVIOR,
+ SubscriptionPlan.LIMIT_BEHAVIOR_UNKNOWN);
+ if (limitBytes != SubscriptionPlan.BYTES_UNKNOWN
+ && limitBehavior != SubscriptionPlan.LIMIT_BEHAVIOR_UNKNOWN) {
+ builder.setDataLimit(limitBytes, limitBehavior);
+ }
+
+ final long usageBytes = readLongAttribute(in, ATTR_USAGE_BYTES,
+ SubscriptionPlan.BYTES_UNKNOWN);
+ final long usageTime = readLongAttribute(in, ATTR_USAGE_TIME,
+ SubscriptionPlan.TIME_UNKNOWN);
+ if (usageBytes != SubscriptionPlan.BYTES_UNKNOWN
+ && usageTime != SubscriptionPlan.TIME_UNKNOWN) {
+ builder.setDataUsage(usageBytes, usageTime);
+ }
+
+ final int subId = readIntAttribute(in, ATTR_SUB_ID);
+ final SubscriptionPlan plan = builder.build();
+ mSubscriptionPlans.put(subId, ArrayUtils.appendElement(
+ SubscriptionPlan.class, mSubscriptionPlans.get(subId), plan));
+
} else if (TAG_UID_POLICY.equals(tag)) {
final int uid = readIntAttribute(in, ATTR_UID);
final int policy = readIntAttribute(in, ATTR_POLICY);
@@ -1963,10 +1961,8 @@
} catch (FileNotFoundException e) {
// missing policy is okay, probably first boot
- upgradeLegacyBackgroundDataUL();
- } catch (IOException e) {
- Log.wtf(TAG, "problem reading network policy", e);
- } catch (XmlPullParserException e) {
+ upgradeDefaultBackgroundDataUL();
+ } catch (Exception e) {
Log.wtf(TAG, "problem reading network policy", e);
} finally {
IoUtils.closeQuietly(fis);
@@ -1977,15 +1973,55 @@
* Upgrade legacy background data flags, notifying listeners of one last
* change to always-true.
*/
- private void upgradeLegacyBackgroundDataUL() {
- mRestrictBackground = Settings.Secure.getInt(
- mContext.getContentResolver(), Settings.Secure.BACKGROUND_DATA, 1) != 1;
+ private void upgradeDefaultBackgroundDataUL() {
+ // This method is only called when we're unable to find the network policy flag, which
+ // usually happens on first boot of a new device and not one that has received an OTA.
- // kick off one last broadcast if restricted
- if (mRestrictBackground) {
- final Intent broadcast = new Intent(
- ConnectivityManager.ACTION_BACKGROUND_DATA_SETTING_CHANGED);
- mContext.sendBroadcastAsUser(broadcast, UserHandle.ALL);
+ // Seed from the default value configured for this device.
+ mRestrictBackground = Settings.Global.getInt(
+ mContext.getContentResolver(), Global.DEFAULT_RESTRICT_BACKGROUND_DATA, 0) == 1;
+
+ // NOTE: We used to read the legacy setting here :
+ //
+ // final int legacyFlagValue = Settings.Secure.getInt(
+ // mContext.getContentResolver(), Settings.Secure.BACKGROUND_DATA, ..);
+ //
+ // This is no longer necessary because we will never upgrade directly from Gingerbread
+ // to O+. Devices upgrading from ICS onwards to O will have a netpolicy.xml file that
+ // contains the correct value that we will continue to use.
+ }
+
+ /**
+ * Perform upgrade step of moving any user-defined meterness overrides over
+ * into {@link WifiConfiguration}.
+ */
+ private void upgradeWifiMeteredOverrideAL() {
+ boolean modified = false;
+ final WifiManager wm = mContext.getSystemService(WifiManager.class);
+ final List<WifiConfiguration> configs = wm.getConfiguredNetworks();
+ for (int i = 0; i < mNetworkPolicy.size(); ) {
+ final NetworkPolicy policy = mNetworkPolicy.valueAt(i);
+ if (policy.template.getMatchRule() == NetworkTemplate.MATCH_WIFI
+ && !policy.inferred) {
+ mNetworkPolicy.removeAt(i);
+ modified = true;
+
+ final String networkId = resolveNetworkId(policy.template.getNetworkId());
+ for (WifiConfiguration config : configs) {
+ if (Objects.equals(resolveNetworkId(config), networkId)) {
+ Slog.d(TAG, "Found network " + networkId + "; upgrading metered hint");
+ config.meteredOverride = policy.metered
+ ? WifiConfiguration.METERED_OVERRIDE_METERED
+ : WifiConfiguration.METERED_OVERRIDE_NOT_METERED;
+ wm.updateNetwork(config);
+ }
+ }
+ } else {
+ i++;
+ }
+ }
+ if (modified) {
+ writePolicyAL();
}
}
@@ -2020,8 +2056,12 @@
if (networkId != null) {
out.attribute(null, ATTR_NETWORK_ID, networkId);
}
- writeIntAttribute(out, ATTR_CYCLE_DAY, policy.cycleDay);
- out.attribute(null, ATTR_CYCLE_TIMEZONE, policy.cycleTimezone);
+ writeStringAttribute(out, ATTR_CYCLE_START,
+ RecurrenceRule.convertZonedDateTime(policy.cycleRule.start));
+ writeStringAttribute(out, ATTR_CYCLE_END,
+ RecurrenceRule.convertZonedDateTime(policy.cycleRule.end));
+ writeStringAttribute(out, ATTR_CYCLE_PERIOD,
+ RecurrenceRule.convertPeriod(policy.cycleRule.period));
writeLongAttribute(out, ATTR_WARNING_BYTES, policy.warningBytes);
writeLongAttribute(out, ATTR_LIMIT_BYTES, policy.limitBytes);
writeLongAttribute(out, ATTR_LAST_WARNING_SNOOZE, policy.lastWarningSnooze);
@@ -2031,6 +2071,32 @@
out.endTag(null, TAG_NETWORK_POLICY);
}
+ // write all known subscription plans
+ for (int i = 0; i < mSubscriptionPlans.size(); i++) {
+ final int subId = mSubscriptionPlans.keyAt(i);
+ final SubscriptionPlan[] plans = mSubscriptionPlans.valueAt(i);
+ if (ArrayUtils.isEmpty(plans)) continue;
+
+ for (SubscriptionPlan plan : plans) {
+ out.startTag(null, TAG_SUBSCRIPTION_PLAN);
+ writeIntAttribute(out, ATTR_SUB_ID, subId);
+ final RecurrenceRule cycleRule = plan.getCycleRule();
+ writeStringAttribute(out, ATTR_CYCLE_START,
+ RecurrenceRule.convertZonedDateTime(cycleRule.start));
+ writeStringAttribute(out, ATTR_CYCLE_END,
+ RecurrenceRule.convertZonedDateTime(cycleRule.end));
+ writeStringAttribute(out, ATTR_CYCLE_PERIOD,
+ RecurrenceRule.convertPeriod(cycleRule.period));
+ writeStringAttribute(out, ATTR_TITLE, plan.getTitle());
+ writeStringAttribute(out, ATTR_SUMMARY, plan.getSummary());
+ writeLongAttribute(out, ATTR_LIMIT_BYTES, plan.getDataLimitBytes());
+ writeIntAttribute(out, ATTR_LIMIT_BEHAVIOR, plan.getDataLimitBehavior());
+ writeLongAttribute(out, ATTR_USAGE_BYTES, plan.getDataUsageBytes());
+ writeLongAttribute(out, ATTR_USAGE_TIME, plan.getDataUsageTime());
+ out.endTag(null, TAG_SUBSCRIPTION_PLAN);
+ }
+ }
+
// write all known uid policies
for (int i = 0; i < mUidPolicy.size(); i++) {
final int uid = mUidPolicy.keyAt(i);
@@ -2493,80 +2559,182 @@
}
}
- private NetworkPolicy findPolicyForNetworkNL(NetworkIdentity ident) {
- for (int i = mNetworkPolicy.size()-1; i >= 0; i--) {
- NetworkPolicy policy = mNetworkPolicy.valueAt(i);
- if (policy.template.matches(ident)) {
- return policy;
- }
- }
- return null;
- }
-
@Override
- public NetworkQuotaInfo getNetworkQuotaInfo(NetworkState state) {
- mContext.enforceCallingOrSelfPermission(ACCESS_NETWORK_STATE, TAG);
-
- // only returns usage summary, so we don't require caller to have
- // READ_NETWORK_USAGE_HISTORY.
+ public void setWifiMeteredOverride(String networkId, int meteredOverride) {
+ mContext.enforceCallingOrSelfPermission(MANAGE_NETWORK_POLICY, TAG);
final long token = Binder.clearCallingIdentity();
try {
- return getNetworkQuotaInfoUnchecked(state);
+ final WifiManager wm = mContext.getSystemService(WifiManager.class);
+ final List<WifiConfiguration> configs = wm.getConfiguredNetworks();
+ for (WifiConfiguration config : configs) {
+ if (Objects.equals(resolveNetworkId(config), networkId)) {
+ config.meteredOverride = meteredOverride;
+ wm.updateNetwork(config);
+ }
+ }
} finally {
Binder.restoreCallingIdentity(token);
}
}
- private NetworkQuotaInfo getNetworkQuotaInfoUnchecked(NetworkState state) {
- final NetworkIdentity ident = NetworkIdentity.buildNetworkIdentity(mContext, state);
+ @Override
+ @Deprecated
+ public NetworkQuotaInfo getNetworkQuotaInfo(NetworkState state) {
+ Log.w(TAG, "Shame on UID " + Binder.getCallingUid()
+ + " for calling the hidden API getNetworkQuotaInfo(). Shame!");
+ return new NetworkQuotaInfo();
+ }
- final NetworkPolicy policy;
- synchronized (mNetworkPoliciesSecondLock) {
- policy = findPolicyForNetworkNL(ident);
+ private void enforceSubscriptionPlanAccess(int subId, int callingUid, String callingPackage) {
+ // Verify they're not lying about package name
+ mAppOps.checkPackage(callingUid, callingPackage);
+
+ // Verify they have phone permission from user
+ mContext.enforceCallingOrSelfPermission(READ_PHONE_STATE, TAG);
+ if (mAppOps.checkOp(AppOpsManager.OP_READ_PHONE_STATE, callingUid,
+ callingPackage) != AppOpsManager.MODE_ALLOWED) {
+ throw new SecurityException(
+ "Calling package " + callingPackage + " does not hold " + READ_PHONE_STATE);
}
- if (policy == null || !policy.hasCycle()) {
- // missing policy means we can't derive useful quota info
- return null;
+ final SubscriptionInfo si;
+ final PersistableBundle config;
+ final long token = Binder.clearCallingIdentity();
+ try {
+ si = mContext.getSystemService(SubscriptionManager.class)
+ .getActiveSubscriptionInfo(subId);
+ config = mCarrierConfigManager.getConfigForSubId(subId);
+ } finally {
+ Binder.restoreCallingIdentity(token);
}
- final long currentTime = currentTimeMillis();
+ // First check: is caller the CarrierService?
+ if (si.isEmbedded() && si.canManageSubscription(mContext, callingPackage)) {
+ return;
+ }
- // find total bytes used under policy
- final long start = computeLastCycleBoundary(currentTime, policy);
- final long end = currentTime;
- final long totalBytes = getTotalBytes(policy.template, start, end);
+ // Second check: has the CarrierService delegated access?
+ if (config != null) {
+ final String overridePackage = config
+ .getString(CarrierConfigManager.KEY_CONFIG_PLANS_PACKAGE_OVERRIDE_STRING, null);
+ if (!TextUtils.isEmpty(overridePackage)
+ && Objects.equals(overridePackage, callingPackage)) {
+ return;
+ }
+ }
- // report soft and hard limits under policy
- final long softLimitBytes = policy.warningBytes != WARNING_DISABLED ? policy.warningBytes
- : NetworkQuotaInfo.NO_LIMIT;
- final long hardLimitBytes = policy.limitBytes != LIMIT_DISABLED ? policy.limitBytes
- : NetworkQuotaInfo.NO_LIMIT;
+ // Third check: is caller the fallback/default CarrierService?
+ final String defaultPackage = mCarrierConfigManager.getDefaultCarrierServicePackageName();
+ if (!TextUtils.isEmpty(defaultPackage)
+ && Objects.equals(defaultPackage, callingPackage)) {
+ return;
+ }
- return new NetworkQuotaInfo(totalBytes, softLimitBytes, hardLimitBytes);
+ throw new SecurityException("Calling package " + callingPackage
+ + " has no access to subscription plans for " + subId);
}
@Override
- public boolean isNetworkMetered(NetworkState state) {
- if (state.networkInfo == null) {
- return false;
- }
+ public SubscriptionPlan[] getSubscriptionPlans(int subId, String callingPackage) {
+ enforceSubscriptionPlanAccess(subId, Binder.getCallingUid(), callingPackage);
- final NetworkIdentity ident = NetworkIdentity.buildNetworkIdentity(mContext, state);
-
- final NetworkPolicy policy;
- synchronized (mNetworkPoliciesSecondLock) {
- policy = findPolicyForNetworkNL(ident);
- }
-
- if (policy != null) {
- return policy.metered;
- } else {
- final int type = state.networkInfo.getType();
- if ((isNetworkTypeMobile(type) && ident.getMetered()) || type == TYPE_WIMAX) {
- return true;
+ final String fake = SystemProperties.get("fw.fake_plan");
+ if (!TextUtils.isEmpty(fake)) {
+ final List<SubscriptionPlan> plans = new ArrayList<>();
+ if ("month_hard".equals(fake)) {
+ plans.add(SubscriptionPlan.Builder
+ .createRecurringMonthly(ZonedDateTime.parse("2007-03-14T00:00:00.000Z"))
+ .setTitle("G-Mobile")
+ .setDataLimit(5 * TrafficStats.GB_IN_BYTES,
+ SubscriptionPlan.LIMIT_BEHAVIOR_BILLED)
+ .setDataUsage(1 * TrafficStats.GB_IN_BYTES,
+ ZonedDateTime.now().minusHours(36).toInstant().toEpochMilli())
+ .build());
+ } else if ("month_soft".equals(fake)) {
+ plans.add(SubscriptionPlan.Builder
+ .createRecurringMonthly(ZonedDateTime.parse("2007-03-14T00:00:00.000Z"))
+ .setTitle("G-Mobile is the carriers name who this plan belongs to")
+ .setSummary("Crazy unlimited bandwidth plan with incredibly long title "
+ + "that should be cut off to prevent UI from looking terrible")
+ .setDataLimit(5 * TrafficStats.GB_IN_BYTES,
+ SubscriptionPlan.LIMIT_BEHAVIOR_THROTTLED)
+ .setDataUsage(1 * TrafficStats.GB_IN_BYTES,
+ ZonedDateTime.now().minusHours(1).toInstant().toEpochMilli())
+ .build());
+ } else if ("month_none".equals(fake)) {
+ plans.add(SubscriptionPlan.Builder
+ .createRecurringMonthly(ZonedDateTime.parse("2007-03-14T00:00:00.000Z"))
+ .setTitle("G-Mobile")
+ .build());
+ } else if ("prepaid".equals(fake)) {
+ plans.add(SubscriptionPlan.Builder
+ .createNonrecurring(ZonedDateTime.now().minusDays(20),
+ ZonedDateTime.now().plusDays(10))
+ .setTitle("G-Mobile")
+ .setDataLimit(512 * TrafficStats.MB_IN_BYTES,
+ SubscriptionPlan.LIMIT_BEHAVIOR_DISABLED)
+ .setDataUsage(100 * TrafficStats.MB_IN_BYTES,
+ ZonedDateTime.now().minusHours(3).toInstant().toEpochMilli())
+ .build());
+ } else if ("prepaid_crazy".equals(fake)) {
+ plans.add(SubscriptionPlan.Builder
+ .createNonrecurring(ZonedDateTime.now().minusDays(20),
+ ZonedDateTime.now().plusDays(10))
+ .setTitle("G-Mobile Anytime")
+ .setDataLimit(512 * TrafficStats.MB_IN_BYTES,
+ SubscriptionPlan.LIMIT_BEHAVIOR_DISABLED)
+ .setDataUsage(100 * TrafficStats.MB_IN_BYTES,
+ ZonedDateTime.now().minusHours(3).toInstant().toEpochMilli())
+ .build());
+ plans.add(SubscriptionPlan.Builder
+ .createNonrecurring(ZonedDateTime.now().minusDays(10),
+ ZonedDateTime.now().plusDays(20))
+ .setTitle("G-Mobile Nickel Nights")
+ .setSummary("5¢/GB between 1-5AM")
+ .setDataUsage(15 * TrafficStats.MB_IN_BYTES,
+ ZonedDateTime.now().minusHours(30).toInstant().toEpochMilli())
+ .build());
+ plans.add(SubscriptionPlan.Builder
+ .createNonrecurring(ZonedDateTime.now().minusDays(10),
+ ZonedDateTime.now().plusDays(20))
+ .setTitle("G-Mobile Bonus 3G")
+ .setSummary("Unlimited 3G data")
+ .setDataLimit(5 * TrafficStats.GB_IN_BYTES,
+ SubscriptionPlan.LIMIT_BEHAVIOR_THROTTLED)
+ .setDataUsage(300 * TrafficStats.MB_IN_BYTES,
+ ZonedDateTime.now().minusHours(1).toInstant().toEpochMilli())
+ .build());
}
- return false;
+ return plans.toArray(new SubscriptionPlan[plans.size()]);
+ }
+
+ synchronized (mUidRulesFirstLock) {
+ synchronized (mNetworkPoliciesSecondLock) {
+ return mSubscriptionPlans.get(subId);
+ }
+ }
+ }
+
+ @Override
+ public void setSubscriptionPlans(int subId, SubscriptionPlan[] plans, String callingPackage) {
+ enforceSubscriptionPlanAccess(subId, Binder.getCallingUid(), callingPackage);
+
+ for (SubscriptionPlan plan : plans) {
+ Preconditions.checkNotNull(plan);
+ }
+
+ final long token = Binder.clearCallingIdentity();
+ try {
+ maybeRefreshTrustedTime();
+ synchronized (mUidRulesFirstLock) {
+ synchronized (mNetworkPoliciesSecondLock) {
+ mSubscriptionPlans.put(subId, plans);
+ // TODO: update any implicit details from newly defined plans
+ handleNetworkPoliciesUpdateAL(false);
+ }
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
}
}
@@ -4184,7 +4352,7 @@
}
public static String getString(int uid, long procStateSeq) {
- return "UID=" + uid + " procStateSeq=" + procStateSeq;
+ return "UID=" + uid + " Seq=" + procStateSeq;
}
private int increaseNext(int next, int increment) {
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerShellCommand.java b/services/core/java/com/android/server/net/NetworkPolicyManagerShellCommand.java
index 8ced1c2..b65b9d7 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerShellCommand.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerShellCommand.java
@@ -19,26 +19,17 @@
import static android.net.NetworkPolicyManager.POLICY_ALLOW_METERED_BACKGROUND;
import static android.net.NetworkPolicyManager.POLICY_NONE;
import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND;
-import static android.net.wifi.WifiInfo.removeDoubleQuotes;
-
-import static com.android.server.net.NetworkPolicyManagerService.newWifiPolicy;
-import static com.android.server.net.NetworkPolicyManagerService.TAG;
-
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
import android.content.Context;
import android.net.INetworkPolicyManager;
-import android.net.NetworkPolicy;
-import android.net.NetworkTemplate;
+import android.net.NetworkPolicyManager;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.os.RemoteException;
import android.os.ShellCommand;
-import android.util.Log;
+
+import java.io.PrintWriter;
+import java.util.List;
class NetworkPolicyManagerShellCommand extends ShellCommand {
@@ -90,7 +81,7 @@
pw.println(" Adds a UID to the blacklist for restrict background usage.");
pw.println(" get restrict-background");
pw.println(" Gets the global restrict background usage status.");
- pw.println(" list wifi-networks [BOOLEAN]");
+ pw.println(" list wifi-networks [true|false]");
pw.println(" Lists all saved wifi networks and whether they are metered or not.");
pw.println(" If a boolean argument is passed, filters just the metered (or unmetered)");
pw.println(" networks.");
@@ -102,7 +93,7 @@
pw.println(" Removes a UID from the whitelist for restrict background usage.");
pw.println(" remove restrict-background-blacklist UID");
pw.println(" Removes a UID from the blacklist for restrict background usage.");
- pw.println(" set metered-network ID BOOLEAN");
+ pw.println(" set metered-network ID [undefined|true|false]");
pw.println(" Toggles whether the given wi-fi network is metered.");
pw.println(" set restrict-background BOOLEAN");
pw.println(" Sets the global restrict background usage status.");
@@ -276,107 +267,60 @@
return resetUidPolicy("not blacklisted", POLICY_REJECT_METERED_BACKGROUND);
}
- private int listWifiNetworks() throws RemoteException {
+ private int listWifiNetworks() {
final PrintWriter pw = getOutPrintWriter();
final String arg = getNextArg();
- final Boolean filter = arg == null ? null : Boolean.valueOf(arg);
- for (NetworkPolicy policy : getWifiPolicies()) {
- if (filter != null && filter.booleanValue() != policy.metered) {
- continue;
+ final int match;
+ if (arg == null) {
+ match = WifiConfiguration.METERED_OVERRIDE_NONE;
+ } else if (Boolean.parseBoolean(arg)) {
+ match = WifiConfiguration.METERED_OVERRIDE_METERED;
+ } else {
+ match = WifiConfiguration.METERED_OVERRIDE_NOT_METERED;
+ }
+
+ final List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks();
+ for (WifiConfiguration config : configs) {
+ if (arg == null || config.meteredOverride == match) {
+ pw.print(NetworkPolicyManager.resolveNetworkId(config));
+ pw.print(';');
+ pw.println(overrideToString(config.meteredOverride));
}
- pw.print(getNetworkId(policy));
- pw.print(';');
- pw.println(policy.metered);
}
return 0;
}
private int setMeteredWifiNetwork() throws RemoteException {
final PrintWriter pw = getOutPrintWriter();
- final String id = getNextArg();
- if (id == null) {
- pw.println("Error: didn't specify ID");
+ final String networkId = getNextArg();
+ if (networkId == null) {
+ pw.println("Error: didn't specify networkId");
return -1;
}
final String arg = getNextArg();
if (arg == null) {
- pw.println("Error: didn't specify BOOLEAN");
+ pw.println("Error: didn't specify meteredOverride");
return -1;
}
- final boolean metered = Boolean.valueOf(arg);
- final NetworkPolicy[] policies = mInterface.getNetworkPolicies(null);
- boolean changed = false;
- // First try to find a policy with such id
- for (NetworkPolicy policy : policies) {
- if (policy.template.isMatchRuleMobile() || policy.metered == metered) {
- continue;
- }
- final String networkId = getNetworkId(policy);
- if (id.equals(networkId)) {
- Log.i(TAG, "Changing " + networkId + " metered status to " + metered);
- policy.metered = metered;
- changed = true;
- }
- }
- if (changed) {
- mInterface.setNetworkPolicies(policies);
- return 0;
- }
- // Policy not found: check if there is a saved wi-fi with such id.
- for (WifiConfiguration config : mWifiManager.getConfiguredNetworks()) {
- final String ssid = removeDoubleQuotes(config.SSID);
- if (id.equals(ssid)) {
- final NetworkPolicy policy = newPolicy(ssid);
- policy.metered = true;
- Log.i(TAG, "Creating new policy for " + ssid + ": " + policy);
- final NetworkPolicy[] newPolicies = new NetworkPolicy[policies.length + 1];
- System.arraycopy(policies, 0, newPolicies, 0, policies.length);
- newPolicies[newPolicies.length - 1] = policy;
- mInterface.setNetworkPolicies(newPolicies);
- return 0;
- }
- }
- pw.print("Error: didn't find network with SSID "); pw.println(id);
+ mInterface.setWifiMeteredOverride(NetworkPolicyManager.resolveNetworkId(networkId),
+ stringToOverride(arg));
return -1;
}
- private List<NetworkPolicy> getWifiPolicies() throws RemoteException {
- // First gets a list of saved wi-fi networks.
- final List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks();
- final int size = configs != null ? configs.size() : 0;
- final Set<String> ssids = new HashSet<>(size);
- if (configs != null) {
- for (WifiConfiguration config : configs) {
- ssids.add(removeDoubleQuotes(config.SSID));
- }
+ private static String overrideToString(int override) {
+ switch (override) {
+ case WifiConfiguration.METERED_OVERRIDE_METERED: return "true";
+ case WifiConfiguration.METERED_OVERRIDE_NOT_METERED: return "false";
+ default: return "none";
}
-
- // Then gets the saved policies.
- final NetworkPolicy[] policies = mInterface.getNetworkPolicies(null);
- final List<NetworkPolicy> wifiPolicies = new ArrayList<NetworkPolicy>(policies.length);
- for (NetworkPolicy policy: policies) {
- if (!policy.template.isMatchRuleMobile()) {
- wifiPolicies.add(policy);
- final String netId = getNetworkId(policy);
- ssids.remove(netId);
- }
- }
- // Finally, creates new default policies for saved WI-FIs not policied yet.
- for (String ssid : ssids) {
- final NetworkPolicy policy = newPolicy(ssid);
- wifiPolicies.add(policy);
- }
- return wifiPolicies;
}
- private NetworkPolicy newPolicy(String ssid) {
- final NetworkTemplate template = NetworkTemplate.buildTemplateWifi(ssid);
- final NetworkPolicy policy = newWifiPolicy(template, false);
- return policy;
- }
-
- private String getNetworkId(NetworkPolicy policy) {
- return removeDoubleQuotes(policy.template.getNetworkId());
+ private static int stringToOverride(String override) {
+ switch (override) {
+ case "true": return WifiConfiguration.METERED_OVERRIDE_METERED;
+ case "false": return WifiConfiguration.METERED_OVERRIDE_NOT_METERED;
+ default: return WifiConfiguration.METERED_OVERRIDE_NONE;
+ }
}
private int getNextBooleanArg() {
diff --git a/services/core/java/com/android/server/net/NetworkStatsService.java b/services/core/java/com/android/server/net/NetworkStatsService.java
index ab685ca..8209ade 100644
--- a/services/core/java/com/android/server/net/NetworkStatsService.java
+++ b/services/core/java/com/android/server/net/NetworkStatsService.java
@@ -18,7 +18,6 @@
import static android.Manifest.permission.ACCESS_NETWORK_STATE;
import static android.Manifest.permission.CONNECTIVITY_INTERNAL;
-import static android.Manifest.permission.MODIFY_NETWORK_ACCOUNTING;
import static android.Manifest.permission.READ_NETWORK_USAGE_HISTORY;
import static android.content.Intent.ACTION_SHUTDOWN;
import static android.content.Intent.ACTION_UID_REMOVED;
@@ -689,7 +688,8 @@
@Override
public void incrementOperationCount(int uid, int tag, int operationCount) {
if (Binder.getCallingUid() != uid) {
- mContext.enforceCallingOrSelfPermission(MODIFY_NETWORK_ACCOUNTING, TAG);
+ mContext.enforceCallingOrSelfPermission(
+ android.Manifest.permission.UPDATE_DEVICE_STATS, TAG);
}
if (operationCount < 0) {
@@ -710,7 +710,7 @@
@Override
public void setUidForeground(int uid, boolean uidForeground) {
- mContext.enforceCallingOrSelfPermission(MODIFY_NETWORK_ACCOUNTING, TAG);
+ mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
synchronized (mStatsLock) {
final int set = uidForeground ? SET_FOREGROUND : SET_DEFAULT;
@@ -750,7 +750,7 @@
@Override
public void advisePersistThreshold(long thresholdBytes) {
- mContext.enforceCallingOrSelfPermission(MODIFY_NETWORK_ACCOUNTING, TAG);
+ mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
assertBandwidthControlEnabled();
// clamp threshold into safe range
diff --git a/services/core/java/com/android/server/notification/AlertRateLimiter.java b/services/core/java/com/android/server/notification/AlertRateLimiter.java
index 4b168c5..2b01945 100644
--- a/services/core/java/com/android/server/notification/AlertRateLimiter.java
+++ b/services/core/java/com/android/server/notification/AlertRateLimiter.java
@@ -24,7 +24,7 @@
static final long ALLOWED_ALERT_INTERVAL = 1000;
private long mLastNotificationMillis = 0;
- boolean shouldRateLimitAlert(long now) {
+ boolean shouldRateLimitAlert(long now) {
final long millisSinceLast = now - mLastNotificationMillis;
if (millisSinceLast < 0 || millisSinceLast < ALLOWED_ALERT_INTERVAL) {
return true;
diff --git a/services/core/java/com/android/server/notification/BadgeExtractor.java b/services/core/java/com/android/server/notification/BadgeExtractor.java
index 1bd2085..184f8b2 100644
--- a/services/core/java/com/android/server/notification/BadgeExtractor.java
+++ b/services/core/java/com/android/server/notification/BadgeExtractor.java
@@ -47,9 +47,11 @@
if (!userWantsBadges || !appCanShowBadge) {
record.setShowBadge(false);
} else {
- record.setShowBadge(mConfig.getNotificationChannel(record.sbn.getPackageName(),
- record.sbn.getUid(), record.getChannel().getId(), false).canShowBadge()
- && appCanShowBadge);
+ if (record.getChannel() != null) {
+ record.setShowBadge(record.getChannel().canShowBadge() && appCanShowBadge);
+ } else {
+ record.setShowBadge(appCanShowBadge);
+ }
}
return null;
diff --git a/services/core/java/com/android/server/notification/ConditionProviders.java b/services/core/java/com/android/server/notification/ConditionProviders.java
index c28fb67..3444ef3 100644
--- a/services/core/java/com/android/server/notification/ConditionProviders.java
+++ b/services/core/java/com/android/server/notification/ConditionProviders.java
@@ -16,14 +16,12 @@
package com.android.server.notification;
-import android.annotation.NonNull;
import android.app.INotificationManager;
import android.app.NotificationManager;
import android.content.ComponentName;
-import android.content.ContentResolver;
import android.content.Context;
+import android.content.pm.IPackageManager;
import android.net.Uri;
-import android.os.Handler;
import android.os.IBinder;
import android.os.IInterface;
import android.os.RemoteException;
@@ -32,12 +30,12 @@
import android.service.notification.Condition;
import android.service.notification.ConditionProviderService;
import android.service.notification.IConditionProvider;
-import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Slog;
import com.android.internal.R;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.server.notification.NotificationManagerService.DumpFilter;
import java.io.PrintWriter;
@@ -45,6 +43,10 @@
import java.util.Arrays;
public class ConditionProviders extends ManagedServices {
+
+ @VisibleForTesting
+ static final String TAG_ENABLED_DND_APPS = "dnd_apps";
+
private final ArrayList<ConditionRecord> mRecords = new ArrayList<>();
private final ArraySet<String> mSystemConditionProviderNames;
private final ArraySet<SystemConditionProviderService> mSystemConditionProviders
@@ -52,11 +54,12 @@
private Callback mCallback;
- public ConditionProviders(Context context, Handler handler, UserProfiles userProfiles) {
- super(context, handler, new Object(), userProfiles);
+ public ConditionProviders(Context context, UserProfiles userProfiles, IPackageManager pm) {
+ super(context, new Object(), userProfiles, pm);
mSystemConditionProviderNames = safeSet(PropConfig.getStringArray(mContext,
"system.condition.providers",
R.array.config_system_condition_providers));
+ mApprovalLevel = APPROVAL_BY_PACKAGE;
}
public void setCallback(Callback callback) {
@@ -83,6 +86,7 @@
c.caption = "condition provider";
c.serviceInterface = ConditionProviderService.SERVICE_INTERFACE;
c.secureSettingName = Settings.Secure.ENABLED_NOTIFICATION_POLICY_ACCESS_PACKAGES;
+ c.xmlTag = TAG_ENABLED_DND_APPS;
c.secondarySettingName = Settings.Secure.ENABLED_NOTIFICATION_LISTENERS;
c.bindPermission = android.Manifest.permission.BIND_CONDITION_PROVIDER_SERVICE;
c.settingsAction = Settings.ACTION_CONDITION_PROVIDER_SETTINGS;
@@ -164,7 +168,7 @@
}
@Override
- public void onPackagesChanged(boolean removingPackage, String[] pkgList) {
+ public void onPackagesChanged(boolean removingPackage, String[] pkgList, int[] uid) {
if (removingPackage) {
INotificationManager inm = NotificationManager.getService();
@@ -179,7 +183,7 @@
}
}
}
- super.onPackagesChanged(removingPackage, pkgList);
+ super.onPackagesChanged(removingPackage, pkgList, uid);
}
public ManagedServiceInfo checkServiceToken(IConditionProvider provider) {
@@ -277,31 +281,6 @@
}
}
- @Override
- protected @NonNull ArraySet<ComponentName> loadComponentNamesFromSetting(String settingName,
- int userId) {
- final ContentResolver cr = mContext.getContentResolver();
- String settingValue = Settings.Secure.getStringForUser(
- cr,
- settingName,
- userId);
- if (TextUtils.isEmpty(settingValue))
- return new ArraySet<>();
- String[] packages = settingValue.split(ENABLED_SERVICES_SEPARATOR);
- ArraySet<ComponentName> result = new ArraySet<>(packages.length);
- for (int i = 0; i < packages.length; i++) {
- if (!TextUtils.isEmpty(packages[i])) {
- final ComponentName component = ComponentName.unflattenFromString(packages[i]);
- if (component != null) {
- result.addAll(queryPackageForServices(component.getPackageName(), userId));
- } else {
- result.addAll(queryPackageForServices(packages[i], userId));
- }
- }
- }
- return result;
- }
-
public boolean subscribeIfNecessary(ComponentName component, Uri conditionId) {
synchronized (mMutex) {
final ConditionRecord r = getRecordLocked(conditionId, component, false /*create*/);
diff --git a/services/core/java/com/android/server/notification/CountdownConditionProvider.java b/services/core/java/com/android/server/notification/CountdownConditionProvider.java
index c1a7ac6..c165fc1 100644
--- a/services/core/java/com/android/server/notification/CountdownConditionProvider.java
+++ b/services/core/java/com/android/server/notification/CountdownConditionProvider.java
@@ -52,6 +52,7 @@
private boolean mConnected;
private long mTime;
+ private boolean mIsAlarm;
public CountdownConditionProvider() {
if (DEBUG) Slog.d(TAG, "new CountdownConditionProvider()");
@@ -110,9 +111,11 @@
public void onSubscribe(Uri conditionId) {
if (DEBUG) Slog.d(TAG, "onSubscribe " + conditionId);
mTime = ZenModeConfig.tryParseCountdownConditionId(conditionId);
+ mIsAlarm = ZenModeConfig.isValidCountdownToAlarmConditionId(conditionId);
final AlarmManager alarms = (AlarmManager)
mContext.getSystemService(Context.ALARM_SERVICE);
- final Intent intent = new Intent(ACTION).putExtra(EXTRA_CONDITION_ID, conditionId)
+ final Intent intent = new Intent(ACTION)
+ .putExtra(EXTRA_CONDITION_ID, conditionId)
.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
final PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, REQUEST_CODE,
intent, PendingIntent.FLAG_UPDATE_CURRENT);
@@ -123,7 +126,7 @@
DateUtils.getRelativeTimeSpanString(mTime, now, DateUtils.MINUTE_IN_MILLIS);
if (mTime <= now) {
// in the past, already false
- notifyCondition(newCondition(mTime, Condition.STATE_FALSE));
+ notifyCondition(newCondition(mTime, mIsAlarm, Condition.STATE_FALSE));
} else {
// in the future, set an alarm
alarms.setExact(AlarmManager.RTC_WAKEUP, mTime, pendingIntent);
@@ -145,17 +148,18 @@
public void onReceive(Context context, Intent intent) {
if (ACTION.equals(intent.getAction())) {
final Uri conditionId = intent.getParcelableExtra(EXTRA_CONDITION_ID);
+ final boolean alarm = ZenModeConfig.isValidCountdownToAlarmConditionId(conditionId);
final long time = ZenModeConfig.tryParseCountdownConditionId(conditionId);
if (DEBUG) Slog.d(TAG, "Countdown condition fired: " + conditionId);
if (time > 0) {
- notifyCondition(newCondition(time, Condition.STATE_FALSE));
+ notifyCondition(newCondition(time, alarm, Condition.STATE_FALSE));
}
}
}
}
- private static final Condition newCondition(long time, int state) {
- return new Condition(ZenModeConfig.toCountdownConditionId(time),
+ private static final Condition newCondition(long time, boolean alarm, int state) {
+ return new Condition(ZenModeConfig.toCountdownConditionId(time, alarm),
"", "", "", 0, state,Condition.FLAG_RELEVANT_NOW);
}
diff --git a/services/core/java/com/android/server/notification/ManagedServices.java b/services/core/java/com/android/server/notification/ManagedServices.java
index 73a365b..8087813 100644
--- a/services/core/java/com/android/server/notification/ManagedServices.java
+++ b/services/core/java/com/android/server/notification/ManagedServices.java
@@ -25,12 +25,10 @@
import android.app.ActivityManager;
import android.app.PendingIntent;
import android.app.admin.DevicePolicyManager;
-import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
-import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager;
@@ -39,33 +37,36 @@
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.content.pm.UserInfo;
-import android.database.ContentObserver;
-import android.net.Uri;
import android.os.Binder;
import android.os.Build;
-import android.os.Handler;
import android.os.IBinder;
import android.os.IInterface;
import android.os.RemoteException;
-import android.os.ServiceManager;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
import android.text.TextUtils;
+import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
import android.util.Slog;
import android.util.SparseArray;
+import com.android.internal.util.XmlUtils;
import com.android.server.notification.NotificationManagerService.DumpFilter;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+import org.xmlpull.v1.XmlSerializer;
+
+import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
-import java.util.Objects;
import java.util.Set;
+import java.util.stream.Collectors;
/**
* Manages the lifecycle of application-provided services bound by system server.
@@ -83,66 +84,60 @@
protected static final String ENABLED_SERVICES_SEPARATOR = ":";
+ /**
+ * List of components and apps that can have running {@link ManagedServices}.
+ */
+ static final String TAG_MANAGED_SERVICES = "service_listing";
+ static final String ATT_APPROVED_LIST = "approved";
+ static final String ATT_USER_ID = "user";
+ static final String ATT_IS_PRIMARY = "primary";
+
+ static final int APPROVAL_BY_PACKAGE = 0;
+ static final int APPROVAL_BY_COMPONENT = 1;
+
protected final Context mContext;
protected final Object mMutex;
private final UserProfiles mUserProfiles;
- private final SettingsObserver mSettingsObserver;
private final IPackageManager mPm;
private final Config mConfig;
- private ArraySet<String> mRestored;
// contains connections to all connected services, including app services
// and system services
- private final ArrayList<ManagedServiceInfo> mServices = new ArrayList<ManagedServiceInfo>();
+ private final ArrayList<ManagedServiceInfo> mServices = new ArrayList<>();
// things that will be put into mServices as soon as they're ready
- private final ArrayList<String> mServicesBinding = new ArrayList<String>();
+ private final ArrayList<String> mServicesBinding = new ArrayList<>();
// lists the component names of all enabled (and therefore potentially connected)
// app services for current profiles.
private ArraySet<ComponentName> mEnabledServicesForCurrentProfiles
- = new ArraySet<ComponentName>();
+ = new ArraySet<>();
// Just the packages from mEnabledServicesForCurrentProfiles
- private ArraySet<String> mEnabledServicesPackageNames = new ArraySet<String>();
- // List of packages in restored setting across all mUserProfiles, for quick
- // filtering upon package updates.
- private ArraySet<String> mRestoredPackages = new ArraySet<>();
+ private ArraySet<String> mEnabledServicesPackageNames = new ArraySet<>();
// List of enabled packages that have nevertheless asked not to be run
private ArraySet<ComponentName> mSnoozingForCurrentProfiles = new ArraySet<>();
+ // List of approved packages or components (by user, then by primary/secondary) that are
+ // allowed to be bound as managed services. A package or component appearing in this list does
+ // not mean that we are currently bound to said package/component.
+ private ArrayMap<Integer, ArrayMap<Boolean, ArraySet<String>>> mApproved = new ArrayMap<>();
// Kept to de-dupe user change events (experienced after boot, when we receive a settings and a
// user change).
private int[] mLastSeenProfileIds;
- private final BroadcastReceiver mRestoreReceiver;
+ // True if approved services are stored in xml, not settings.
+ private boolean mUseXml;
- public ManagedServices(Context context, Handler handler, Object mutex,
- UserProfiles userProfiles) {
+ // Whether managed services are approved individually or package wide
+ protected int mApprovalLevel;
+
+ public ManagedServices(Context context, Object mutex, UserProfiles userProfiles,
+ IPackageManager pm) {
mContext = context;
mMutex = mutex;
mUserProfiles = userProfiles;
- mPm = IPackageManager.Stub.asInterface(ServiceManager.getService("package"));
+ mPm = pm;
mConfig = getConfig();
- mSettingsObserver = new SettingsObserver(handler);
-
- mRestoreReceiver = new SettingRestoredReceiver();
- IntentFilter filter = new IntentFilter(Intent.ACTION_SETTING_RESTORED);
- context.registerReceiver(mRestoreReceiver, filter);
- rebuildRestoredPackages();
- }
-
- class SettingRestoredReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (Intent.ACTION_SETTING_RESTORED.equals(intent.getAction())) {
- String element = intent.getStringExtra(Intent.EXTRA_SETTING_NAME);
- if (Objects.equals(element, mConfig.secureSettingName)
- || Objects.equals(element, mConfig.secondarySettingName)) {
- String prevValue = intent.getStringExtra(Intent.EXTRA_SETTING_PREVIOUS_VALUE);
- String newValue = intent.getStringExtra(Intent.EXTRA_SETTING_NEW_VALUE);
- settingRestored(element, prevValue, newValue, getSendingUserId());
- }
- }
- }
+ mApprovalLevel = APPROVAL_BY_COMPONENT;
}
abstract protected Config getConfig();
@@ -167,17 +162,33 @@
protected void onServiceRemovedLocked(ManagedServiceInfo removed) { }
private ManagedServiceInfo newServiceInfo(IInterface service,
- ComponentName component, int userid, boolean isSystem, ServiceConnection connection,
+ ComponentName component, int userId, boolean isSystem, ServiceConnection connection,
int targetSdkVersion) {
- return new ManagedServiceInfo(service, component, userid, isSystem, connection,
+ return new ManagedServiceInfo(service, component, userId, isSystem, connection,
targetSdkVersion);
}
- public void onBootPhaseAppsCanStart() {
- mSettingsObserver.observe();
- }
+ public void onBootPhaseAppsCanStart() {}
public void dump(PrintWriter pw, DumpFilter filter) {
+ pw.println(" Allowed " + getCaption() + "s:");
+ final int N = mApproved.size();
+ for (int i = 0 ; i < N; i++) {
+ final int userId = mApproved.keyAt(i);
+ final ArrayMap<Boolean, ArraySet<String>> approvedByType = mApproved.valueAt(i);
+ if (approvedByType != null) {
+ final int M = approvedByType.size();
+ for (int j = 0; j < M; j++) {
+ final boolean isPrimary = approvedByType.keyAt(j);
+ final ArraySet<String> approved = approvedByType.valueAt(j);
+ if (approvedByType != null && approvedByType.size() > 0) {
+ pw.println(" " + String.join(ENABLED_SERVICES_SEPARATOR, approved)
+ + " (user: " + userId + " isPrimary: " + isPrimary + ")");
+ }
+ }
+ }
+ }
+
pw.println(" All " + getCaption() + "s (" + mEnabledServicesForCurrentProfiles.size()
+ ") enabled for current profiles:");
for (ComponentName cmpt : mEnabledServicesForCurrentProfiles) {
@@ -201,67 +212,231 @@
}
}
- // By convention, restored settings are replicated to another settings
- // entry, named similarly but with a disambiguation suffix.
- public static String restoredSettingName(String setting) {
- return setting + ":restored";
- }
-
- // The OS has done a restore of this service's saved state. We clone it to the
- // 'restored' reserve, and then once we return and the actual write to settings is
- // performed, our observer will do the work of maintaining the restored vs live
- // settings data.
- public void settingRestored(String element, String oldValue, String newValue, int userid) {
- if (DEBUG) Slog.d(TAG, "Restored managed service setting: " + element
- + " ovalue=" + oldValue + " nvalue=" + newValue);
- if (mConfig.secureSettingName.equals(element) ||
- mConfig.secondarySettingName.equals(element)) {
- if (element != null) {
- Settings.Secure.putStringForUser(mContext.getContentResolver(),
- restoredSettingName(element),
- newValue,
- userid);
- if (mConfig.secureSettingName.equals(element)) {
- updateSettingsAccordingToInstalledServices(element, userid);
- }
- rebuildRestoredPackages();
+ protected void onSettingRestored(String element, String value, int userId) {
+ if (!mUseXml) {
+ Slog.d(TAG, "Restored managed service setting: " + element);
+ if (mConfig.secureSettingName.equals(element) ||
+ (mConfig.secondarySettingName != null
+ && mConfig.secondarySettingName.equals(element))) {
+ Settings.Secure.putStringForUser(
+ mContext.getContentResolver(), element, value, userId);
+ loadAllowedComponentsFromSettings();
+ rebindServices(false);
}
}
}
- public boolean isComponentEnabledForPackage(String pkg) {
+ public void writeXml(XmlSerializer out, boolean forBackup) throws IOException {
+ out.startTag(null, getConfig().xmlTag);
+
+ if (forBackup) {
+ trimApprovedListsAccordingToInstalledServices();
+ }
+
+ final int N = mApproved.size();
+ for (int i = 0 ; i < N; i++) {
+ final int userId = mApproved.keyAt(i);
+ final ArrayMap<Boolean, ArraySet<String>> approvedByType = mApproved.valueAt(i);
+ if (approvedByType != null) {
+ final int M = approvedByType.size();
+ for (int j = 0; j < M; j++) {
+ final boolean isPrimary = approvedByType.keyAt(j);
+ final Set<String> approved = approvedByType.valueAt(j);
+ if (approved != null) {
+ String allowedItems = String.join(ENABLED_SERVICES_SEPARATOR, approved);
+ out.startTag(null, TAG_MANAGED_SERVICES);
+ out.attribute(null, ATT_APPROVED_LIST, allowedItems);
+ out.attribute(null, ATT_USER_ID, Integer.toString(userId));
+ out.attribute(null, ATT_IS_PRIMARY, Boolean.toString(isPrimary));
+ out.endTag(null, TAG_MANAGED_SERVICES);
+
+ if (!forBackup && isPrimary) {
+ // Also write values to settings, for observers who haven't migrated yet
+ Settings.Secure.putStringForUser(mContext.getContentResolver(),
+ getConfig().secureSettingName, allowedItems, userId);
+ }
+
+ }
+ }
+ }
+ }
+
+ out.endTag(null, getConfig().xmlTag);
+ }
+
+ protected void migrateToXml() {
+ loadAllowedComponentsFromSettings();
+ }
+
+ public void readXml(XmlPullParser parser)
+ throws XmlPullParserException, IOException {
+ int type;
+ while ((type = parser.next()) != XmlPullParser.END_DOCUMENT) {
+ String tag = parser.getName();
+ if (type == XmlPullParser.END_TAG
+ && getConfig().xmlTag.equals(tag)) {
+ break;
+ }
+ if (type == XmlPullParser.START_TAG) {
+ if (TAG_MANAGED_SERVICES.equals(tag)) {
+ final String approved = XmlUtils.readStringAttribute(parser, ATT_APPROVED_LIST);
+ final int userId = XmlUtils.readIntAttribute(parser, ATT_USER_ID, 0);
+ final boolean isPrimary =
+ XmlUtils.readBooleanAttribute(parser, ATT_IS_PRIMARY, true);
+ addApprovedList(approved, userId, isPrimary);
+ mUseXml = true;
+ }
+ }
+ }
+ rebindServices(false);
+ }
+
+ private void loadAllowedComponentsFromSettings() {
+
+ UserManager userManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
+ for (UserInfo user : userManager.getUsers()) {
+ final ContentResolver cr = mContext.getContentResolver();
+ addApprovedList(Settings.Secure.getStringForUser(
+ cr,
+ getConfig().secureSettingName,
+ user.id), user.id, true);
+ if (!TextUtils.isEmpty(getConfig().secondarySettingName)) {
+ addApprovedList(Settings.Secure.getStringForUser(
+ cr,
+ getConfig().secondarySettingName,
+ user.id), user.id, false);
+ }
+ }
+ Slog.d(TAG, "Done loading approved values from settings");
+ }
+
+ private void addApprovedList(String approved, int userId, boolean isPrimary) {
+ if (TextUtils.isEmpty(approved)) {
+ approved = "";
+ }
+ ArrayMap<Boolean, ArraySet<String>> approvedByType = mApproved.get(userId);
+ if (approvedByType == null) {
+ approvedByType = new ArrayMap<>();
+ mApproved.put(userId, approvedByType);
+ }
+ String[] approvedArray = approved.split(ENABLED_SERVICES_SEPARATOR);
+ final ArraySet<String> approvedList = new ArraySet<>();
+ for (String pkgOrComponent : approvedArray) {
+ String approvedItem = getApprovedValue(pkgOrComponent);
+ if (approvedItem != null) {
+ approvedList.add(approvedItem);
+ }
+ }
+ approvedByType.put(isPrimary, approvedList);
+ }
+
+ protected boolean isComponentEnabledForPackage(String pkg) {
return mEnabledServicesPackageNames.contains(pkg);
}
- public void onPackagesChanged(boolean removingPackage, String[] pkgList) {
- if (DEBUG) Slog.d(TAG, "onPackagesChanged removingPackage=" + removingPackage
- + " pkgList=" + (pkgList == null ? null : Arrays.asList(pkgList))
- + " mEnabledServicesPackageNames=" + mEnabledServicesPackageNames);
- boolean anyServicesInvolved = false;
+ protected void setPackageOrComponentEnabled(String pkgOrComponent, int userId,
+ boolean isPrimary, boolean enabled) {
+ ArrayMap<Boolean, ArraySet<String>> allowedByType = mApproved.get(userId);
+ if (allowedByType == null) {
+ allowedByType = new ArrayMap<>();
+ mApproved.put(userId, allowedByType);
+ }
+ ArraySet<String> approved = allowedByType.get(isPrimary);
+ if (approved == null) {
+ approved = new ArraySet<>();
+ allowedByType.put(isPrimary, approved);
+ }
+ String approvedItem = getApprovedValue(pkgOrComponent);
- if (pkgList != null && (pkgList.length > 0)) {
- for (String pkgName : pkgList) {
- if (mEnabledServicesPackageNames.contains(pkgName) ||
- mRestoredPackages.contains(pkgName)) {
- anyServicesInvolved = true;
- }
+ if (approvedItem != null) {
+ if (enabled) {
+ approved.add(approvedItem);
+ } else {
+ approved.remove(approvedItem);
}
}
- if (anyServicesInvolved) {
- // if we're not replacing a package, clean up orphaned bits
- if (removingPackage) {
- updateSettingsAccordingToInstalledServices();
- rebuildRestoredPackages();
+ rebindServices(false);
+ }
+
+ private String getApprovedValue(String pkgOrComponent) {
+ if (mApprovalLevel == APPROVAL_BY_COMPONENT) {
+ if(ComponentName.unflattenFromString(pkgOrComponent) != null) {
+ return pkgOrComponent;
}
- // make sure we're still bound to any of our services who may have just upgraded
- rebindServices(false);
+ return null;
+ } else {
+ return getPackageName(pkgOrComponent);
+ }
+ }
+
+ protected List<ComponentName> getAllowedComponents(int userId) {
+ final List<ComponentName> allowedComponents = new ArrayList<>();
+ final ArrayMap<Boolean, ArraySet<String>> allowedByType =
+ mApproved.getOrDefault(userId, new ArrayMap<>());
+ for (int i = 0; i < allowedByType.size(); i++) {
+ final ArraySet<String> allowed = allowedByType.valueAt(i);
+ allowedComponents.addAll(allowed.stream().map(ComponentName::unflattenFromString)
+ .filter(out -> out != null).collect(Collectors.toList()));
+ }
+ return allowedComponents;
+ }
+
+ protected List<String> getAllowedPackages(int userId) {
+ final List<String> allowedPackages = new ArrayList<>();
+ final ArrayMap<Boolean, ArraySet<String>> allowedByType =
+ mApproved.getOrDefault(userId, new ArrayMap<>());
+ for (int i = 0; i < allowedByType.size(); i++) {
+ final ArraySet<String> allowed = allowedByType.valueAt(i);
+ allowedPackages.addAll(
+ allowed.stream().map(this::getPackageName).collect(Collectors.toList()));
+ }
+ return allowedPackages;
+ }
+
+ protected boolean isPackageOrComponentAllowed(String pkgOrComponent, int userId) {
+ ArrayMap<Boolean, ArraySet<String>> allowedByType =
+ mApproved.getOrDefault(userId, new ArrayMap<>());
+ for (int i = 0; i < allowedByType.size(); i++) {
+ ArraySet<String> allowed = allowedByType.valueAt(i);
+ if (allowed.contains(pkgOrComponent)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public void onPackagesChanged(boolean removingPackage, String[] pkgList, int[] uidList) {
+ if (DEBUG) Slog.d(TAG, "onPackagesChanged removingPackage=" + removingPackage
+ + " pkgList=" + (pkgList == null ? null : Arrays.asList(pkgList))
+ + " mEnabledServicesPackageNames=" + mEnabledServicesPackageNames);
+
+ if (pkgList != null && (pkgList.length > 0)) {
+ boolean anyServicesInvolved = false;
+ // Remove notification settings for uninstalled package
+ if (removingPackage) {
+ int size = Math.min(pkgList.length, uidList.length);
+ for (int i = 0; i < size; i++) {
+ final String pkg = pkgList[i];
+ final int userId = UserHandle.getUserId(uidList[i]);
+ anyServicesInvolved = removeUninstalledItemsFromApprovedLists(userId, pkg);
+ }
+ }
+ for (String pkgName : pkgList) {
+ if (mEnabledServicesPackageNames.contains(pkgName)) {
+ anyServicesInvolved = true;
+ }
+ }
+
+ if (anyServicesInvolved) {
+ // make sure we're still bound to any of our services who may have just upgraded
+ rebindServices(false);
+ }
}
}
public void onUserSwitched(int user) {
if (DEBUG) Slog.d(TAG, "onUserSwitched u=" + user);
- rebuildRestoredPackages();
if (Arrays.equals(mLastSeenProfileIds, mUserProfiles.getCurrentProfileIds())) {
if (DEBUG) Slog.d(TAG, "Current profile IDs didn't change, skipping rebindServices().");
return;
@@ -271,11 +446,10 @@
public void onUserUnlocked(int user) {
if (DEBUG) Slog.d(TAG, "onUserUnlocked u=" + user);
- rebuildRestoredPackages();
rebindServices(false);
}
- public ManagedServiceInfo getServiceFromTokenLocked(IInterface service) {
+ private ManagedServiceInfo getServiceFromTokenLocked(IInterface service) {
if (service == null) {
return null;
}
@@ -288,7 +462,7 @@
return null;
}
- public ManagedServiceInfo checkServiceTokenLocked(IInterface service) {
+ protected ManagedServiceInfo checkServiceTokenLocked(IInterface service) {
checkNotNull(service);
ManagedServiceInfo info = getServiceFromTokenLocked(service);
if (info != null) {
@@ -315,9 +489,9 @@
/**
* Add a service to our callbacks. The lifecycle of this service is managed externally,
- * but unlike a system service, it should not be considered privledged.
+ * but unlike a system service, it should not be considered privileged.
* */
- public void registerGuestService(ManagedServiceInfo guest) {
+ protected void registerGuestService(ManagedServiceInfo guest) {
checkNotNull(guest.service);
if (!checkType(guest.service)) {
throw new IllegalArgumentException();
@@ -327,7 +501,7 @@
}
}
- public void setComponentState(ComponentName component, boolean enabled) {
+ protected void setComponentState(ComponentName component, boolean enabled) {
boolean previous = !mSnoozingForCurrentProfiles.contains(component);
if (previous == enabled) {
return;
@@ -345,7 +519,6 @@
component.flattenToShortString());
}
-
synchronized (mMutex) {
final int[] userIds = mUserProfiles.getCurrentProfileIds();
@@ -359,84 +532,31 @@
}
}
- private void rebuildRestoredPackages() {
- mRestoredPackages.clear();
- String secureSettingName = restoredSettingName(mConfig.secureSettingName);
- String secondarySettingName = mConfig.secondarySettingName == null
- ? null : restoredSettingName(mConfig.secondarySettingName);
- int[] userIds = mUserProfiles.getCurrentProfileIds();
- final int N = userIds.length;
- for (int i = 0; i < N; ++i) {
- ArraySet<ComponentName> names =
- loadComponentNamesFromSetting(secureSettingName, userIds[i]);
- if (secondarySettingName != null) {
- names.addAll(loadComponentNamesFromSetting(secondarySettingName, userIds[i]));
- }
- for (ComponentName name : names) {
- mRestoredPackages.add(name.getPackageName());
- }
- }
- }
-
-
- protected @NonNull ArraySet<ComponentName> loadComponentNamesFromSetting(String settingName,
- int userId) {
- final ContentResolver cr = mContext.getContentResolver();
- String settingValue = Settings.Secure.getStringForUser(
- cr,
- settingName,
- userId);
- if (TextUtils.isEmpty(settingValue))
+ private @NonNull ArraySet<ComponentName> loadComponentNamesFromValues(
+ ArraySet<String> approved, int userId) {
+ if (approved == null || approved.size() == 0)
return new ArraySet<>();
- String[] restored = settingValue.split(ENABLED_SERVICES_SEPARATOR);
- ArraySet<ComponentName> result = new ArraySet<>(restored.length);
- for (int i = 0; i < restored.length; i++) {
- ComponentName value = ComponentName.unflattenFromString(restored[i]);
- if (null != value) {
- result.add(value);
+ ArraySet<ComponentName> result = new ArraySet<>(approved.size());
+ for (int i = 0; i < approved.size(); i++) {
+ final String packageOrComponent = approved.valueAt(i);
+ if (!TextUtils.isEmpty(packageOrComponent)) {
+ ComponentName component = ComponentName.unflattenFromString(packageOrComponent);
+ if (component != null) {
+ result.add(component);
+ } else {
+ result.addAll(queryPackageForServices(packageOrComponent, userId));
+ }
}
}
return result;
}
- private void storeComponentsToSetting(Set<ComponentName> components,
- String settingName,
- int userId) {
- String[] componentNames = null;
- if (null != components) {
- componentNames = new String[components.size()];
- int index = 0;
- for (ComponentName c: components) {
- componentNames[index++] = c.flattenToString();
- }
- }
- final String value = (componentNames == null) ? "" :
- TextUtils.join(ENABLED_SERVICES_SEPARATOR, componentNames);
- final ContentResolver cr = mContext.getContentResolver();
- Settings.Secure.putStringForUser(
- cr,
- settingName,
- value,
- userId);
- }
-
- /**
- * Remove access for any services that no longer exist.
- */
- private void updateSettingsAccordingToInstalledServices() {
- int[] userIds = mUserProfiles.getCurrentProfileIds();
- final int N = userIds.length;
- for (int i = 0; i < N; ++i) {
- updateSettingsAccordingToInstalledServices(mConfig.secureSettingName, userIds[i]);
- if (mConfig.secondarySettingName != null) {
- updateSettingsAccordingToInstalledServices(
- mConfig.secondarySettingName, userIds[i]);
- }
- }
- rebuildRestoredPackages();
- }
-
protected Set<ComponentName> queryPackageForServices(String packageName, int userId) {
+ return queryPackageForServices(packageName, 0, userId);
+ }
+
+ protected Set<ComponentName> queryPackageForServices(String packageName, int extraFlags,
+ int userId) {
Set<ComponentName> installed = new ArraySet<>();
final PackageManager pm = mContext.getPackageManager();
Intent queryIntent = new Intent(mConfig.serviceInterface);
@@ -445,7 +565,7 @@
}
List<ResolveInfo> installedServices = pm.queryIntentServicesAsUser(
queryIntent,
- PackageManager.GET_SERVICES | PackageManager.GET_META_DATA,
+ PackageManager.GET_SERVICES | PackageManager.GET_META_DATA | extraFlags,
userId);
if (DEBUG)
Slog.v(TAG, mConfig.serviceInterface + " services: " + installedServices);
@@ -468,50 +588,73 @@
return installed;
}
- private void updateSettingsAccordingToInstalledServices(String setting, int userId) {
- boolean restoredChanged = false;
- boolean currentChanged = false;
- Set<ComponentName> restored =
- loadComponentNamesFromSetting(restoredSettingName(setting), userId);
- Set<ComponentName> current =
- loadComponentNamesFromSetting(setting, userId);
- // Load all services for all packages.
- Set<ComponentName> installed = queryPackageForServices(null, userId);
-
- ArraySet<ComponentName> retained = new ArraySet<>();
-
- for (ComponentName component : installed) {
- if (null != restored) {
- boolean wasRestored = restored.remove(component);
- if (wasRestored) {
- // Freshly installed package has service that was mentioned in restored setting.
- if (DEBUG)
- Slog.v(TAG, "Restoring " + component + " for user " + userId);
- restoredChanged = true;
- currentChanged = true;
- retained.add(component);
- continue;
+ private void trimApprovedListsAccordingToInstalledServices() {
+ int N = mApproved.size();
+ for (int i = 0 ; i < N; i++) {
+ final int userId = mApproved.keyAt(i);
+ final ArrayMap<Boolean, ArraySet<String>> approvedByType = mApproved.valueAt(i);
+ int M = approvedByType.size();
+ for (int j = 0; j < M; j++) {
+ final ArraySet<String> approved = approvedByType.valueAt(j);
+ int P = approved.size();
+ for (int k = P - 1; k >= 0; k--) {
+ final String approvedPackageOrComponent = approved.valueAt(k);
+ if (!hasMatchingServices(approvedPackageOrComponent, userId)){
+ approved.removeAt(k);
+ if (DEBUG) {
+ Slog.v(TAG, "Removing " + approvedPackageOrComponent
+ + " from approved list; no matching services found");
+ }
+ } else {
+ if (DEBUG) {
+ Slog.v(TAG, "Keeping " + approvedPackageOrComponent
+ + " on approved list; matching services found");
+ }
+ }
}
}
+ }
+ }
- if (null != current) {
- if (current.contains(component))
- retained.add(component);
+ private boolean removeUninstalledItemsFromApprovedLists(int uninstalledUserId, String pkg) {
+ boolean removed = false;
+ final ArrayMap<Boolean, ArraySet<String>> approvedByType = mApproved.get(uninstalledUserId);
+ if (approvedByType != null) {
+ int M = approvedByType.size();
+ for (int j = 0; j < M; j++) {
+ final ArraySet<String> approved = approvedByType.valueAt(j);
+ int O = approved.size();
+ for (int k = O - 1; k >= 0; k--) {
+ final String packageOrComponent = approved.valueAt(k);
+ final String packageName = getPackageName(packageOrComponent);
+ if (TextUtils.equals(pkg, packageName)) {
+ approved.removeAt(k);
+ if (DEBUG) {
+ Slog.v(TAG, "Removing " + packageOrComponent
+ + " from approved list; uninstalled");
+ }
+ }
+ }
}
}
+ return removed;
+ }
- currentChanged |= ((current == null ? 0 : current.size()) != retained.size());
-
- if (currentChanged) {
- if (DEBUG) Slog.v(TAG, "List of " + getCaption() + " services was updated " + current);
- storeComponentsToSetting(retained, setting, userId);
+ protected String getPackageName(String packageOrComponent) {
+ final ComponentName component = ComponentName.unflattenFromString(packageOrComponent);
+ if (component != null) {
+ return component.getPackageName();
+ } else {
+ return packageOrComponent;
}
+ }
- if (restoredChanged) {
- if (DEBUG) Slog.v(TAG,
- "List of " + getCaption() + " restored services was updated " + restored);
- storeComponentsToSetting(restored, restoredSettingName(setting), userId);
+ private boolean hasMatchingServices(String packageOrComponent, int userId) {
+ if (!TextUtils.isEmpty(packageOrComponent)) {
+ final String packageName = getPackageName(packageOrComponent);
+ return queryPackageForServices(packageName, userId).size() > 0;
}
+ return false;
}
/**
@@ -526,11 +669,19 @@
final SparseArray<ArraySet<ComponentName>> componentsByUser = new SparseArray<>();
for (int i = 0; i < nUserIds; ++i) {
- componentsByUser.put(userIds[i],
- loadComponentNamesFromSetting(mConfig.secureSettingName, userIds[i]));
- if (mConfig.secondarySettingName != null) {
- componentsByUser.get(userIds[i]).addAll(
- loadComponentNamesFromSetting(mConfig.secondarySettingName, userIds[i]));
+ final int userId = userIds[i];
+ final ArrayMap<Boolean, ArraySet<String>> approvedLists = mApproved.get(userIds[i]);
+ if (approvedLists != null) {
+ final int N = approvedLists.size();
+ for (int j = 0; j < N; j++) {
+ ArraySet<ComponentName> approvedByUser = componentsByUser.get(userId);
+ if (approvedByUser == null) {
+ approvedByUser = new ArraySet<>();
+ componentsByUser.put(userId, approvedByUser);
+ }
+ approvedByUser.addAll(
+ loadComponentNamesFromValues(approvedLists.valueAt(j), userId));
+ }
}
}
@@ -552,7 +703,7 @@
// decode the list of components
final ArraySet<ComponentName> userComponents = componentsByUser.get(userIds[i]);
if (null == userComponents) {
- toAdd.put(userIds[i], new ArraySet<ComponentName>());
+ toAdd.put(userIds[i], new ArraySet<>());
continue;
}
@@ -595,7 +746,7 @@
PackageManager.MATCH_DIRECT_BOOT_AWARE
| PackageManager.MATCH_DIRECT_BOOT_UNAWARE, userIds[i]);
if (info == null || !mConfig.bindPermission.equals(info.permission)) {
- Slog.w(TAG, "Skipping " + getCaption() + " service " + component
+ Slog.w(TAG, "Not binding " + getCaption() + " service " + component
+ ": it does not require the permission " + mConfig.bindPermission);
continue;
}
@@ -719,7 +870,6 @@
}
} catch (SecurityException ex) {
Slog.e(TAG, "Unable to bind " + getCaption() + " service: " + intent, ex);
- return;
}
}
@@ -816,45 +966,6 @@
}
}
- private class SettingsObserver extends ContentObserver {
- private final Uri mSecureSettingsUri = Settings.Secure.getUriFor(mConfig.secureSettingName);
- private final Uri mSecondarySettingsUri;
-
- private SettingsObserver(Handler handler) {
- super(handler);
- if (mConfig.secondarySettingName != null) {
- mSecondarySettingsUri = Settings.Secure.getUriFor(mConfig.secondarySettingName);
- } else {
- mSecondarySettingsUri = null;
- }
- }
-
- private void observe() {
- ContentResolver resolver = mContext.getContentResolver();
- resolver.registerContentObserver(mSecureSettingsUri,
- false, this, UserHandle.USER_ALL);
- if (mSecondarySettingsUri != null) {
- resolver.registerContentObserver(mSecondarySettingsUri,
- false, this, UserHandle.USER_ALL);
- }
- update(null);
- }
-
- @Override
- public void onChange(boolean selfChange, Uri uri) {
- update(uri);
- }
-
- private void update(Uri uri) {
- if (uri == null || mSecureSettingsUri.equals(uri)
- || uri.equals(mSecondarySettingsUri)) {
- if (DEBUG) Slog.d(TAG, "Setting changed: uri=" + uri);
- rebindServices(false);
- rebuildRestoredPackages();
- }
- }
- }
-
public class ManagedServiceInfo implements IBinder.DeathRecipient {
public IInterface service;
public ComponentName component;
@@ -1000,6 +1111,7 @@
public String serviceInterface;
public String secureSettingName;
public String secondarySettingName;
+ public String xmlTag;
public String bindPermission;
public String settingsAction;
public int clientLabel;
diff --git a/services/core/java/com/android/server/notification/NotificationAdjustmentExtractor.java b/services/core/java/com/android/server/notification/NotificationAdjustmentExtractor.java
new file mode 100644
index 0000000..7c82845
--- /dev/null
+++ b/services/core/java/com/android/server/notification/NotificationAdjustmentExtractor.java
@@ -0,0 +1,48 @@
+/**
+* Copyright (C) 2017 The Android Open Source Project
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package com.android.server.notification;
+
+import android.content.Context;
+import android.util.Slog;
+
+/**
+ * Applies adjustments from the group helper and notification assistant
+ */
+public class NotificationAdjustmentExtractor implements NotificationSignalExtractor {
+ private static final String TAG = "BadgeExtractor";
+ private static final boolean DBG = false;
+
+
+ public void initialize(Context ctx, NotificationUsageStats usageStats) {
+ if (DBG) Slog.d(TAG, "Initializing " + getClass().getSimpleName() + ".");
+ }
+
+ public RankingReconsideration process(NotificationRecord record) {
+ if (record == null || record.getNotification() == null) {
+ if (DBG) Slog.d(TAG, "skipping empty notification");
+ return null;
+ }
+
+ record.applyAdjustments();
+
+ return null;
+ }
+
+ @Override
+ public void setConfig(RankingConfig config) {
+ // config is not used
+ }
+}
diff --git a/services/core/java/com/android/server/notification/NotificationChannelExtractor.java b/services/core/java/com/android/server/notification/NotificationChannelExtractor.java
new file mode 100644
index 0000000..46ab556
--- /dev/null
+++ b/services/core/java/com/android/server/notification/NotificationChannelExtractor.java
@@ -0,0 +1,55 @@
+/**
+* Copyright (C) 2017 The Android Open Source Project
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package com.android.server.notification;
+
+import android.content.Context;
+import android.util.Slog;
+
+/**
+ * Stores the latest notification channel information for this notification
+ */
+public class NotificationChannelExtractor implements NotificationSignalExtractor {
+ private static final String TAG = "BadgeExtractor";
+ private static final boolean DBG = false;
+
+ private RankingConfig mConfig;
+
+ public void initialize(Context ctx, NotificationUsageStats usageStats) {
+ if (DBG) Slog.d(TAG, "Initializing " + getClass().getSimpleName() + ".");
+ }
+
+ public RankingReconsideration process(NotificationRecord record) {
+ if (record == null || record.getNotification() == null) {
+ if (DBG) Slog.d(TAG, "skipping empty notification");
+ return null;
+ }
+
+ if (mConfig == null) {
+ if (DBG) Slog.d(TAG, "missing config");
+ return null;
+ }
+
+ record.updateNotificationChannel(mConfig.getNotificationChannel(record.sbn.getPackageName(),
+ record.sbn.getUid(), record.getChannel().getId(), false));
+
+ return null;
+ }
+
+ @Override
+ public void setConfig(RankingConfig config) {
+ mConfig = config;
+ }
+}
diff --git a/services/core/java/com/android/server/notification/NotificationIntrusivenessExtractor.java b/services/core/java/com/android/server/notification/NotificationIntrusivenessExtractor.java
index 4981d5c..91fee46 100644
--- a/services/core/java/com/android/server/notification/NotificationIntrusivenessExtractor.java
+++ b/services/core/java/com/android/server/notification/NotificationIntrusivenessExtractor.java
@@ -16,14 +16,14 @@
package com.android.server.notification;
-import android.app.Notification;
import android.app.NotificationManager;
import android.content.Context;
import android.net.Uri;
-import android.service.notification.NotificationListenerService;
import android.util.Log;
import android.util.Slog;
+import com.android.internal.annotations.VisibleForTesting;
+
/**
* This {@link com.android.server.notification.NotificationSignalExtractor} notices noisy
* notifications and marks them to get a temporary ranking bump.
@@ -34,7 +34,8 @@
/** Length of time (in milliseconds) that an intrusive or noisy notification will stay at
the top of the ranking order, before it falls back to its natural position. */
- private static final long HANG_TIME_MS = 10000;
+ @VisibleForTesting
+ static final long HANG_TIME_MS = 10000;
public void initialize(Context ctx, NotificationUsageStats usageStats) {
if (DBG) Slog.d(TAG, "Initializing " + getClass().getSimpleName() + ".");
@@ -46,7 +47,8 @@
return null;
}
- if (record.getImportance() >= NotificationManager.IMPORTANCE_DEFAULT) {
+ if (record.getFreshnessMs(System.currentTimeMillis()) < HANG_TIME_MS
+ && record.getImportance() >= NotificationManager.IMPORTANCE_DEFAULT) {
if (record.getSound() != null && record.getSound() != Uri.EMPTY) {
record.setRecentlyIntrusive(true);
}
@@ -58,6 +60,10 @@
}
}
+ if (!record.isRecentlyIntrusive()) {
+ return null;
+ }
+
return new RankingReconsideration(record.getKey(), HANG_TIME_MS) {
@Override
public void work() {
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 5a8ebc2..75b24a9 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -21,6 +21,7 @@
import static android.content.pm.PackageManager.FEATURE_LEANBACK;
import static android.content.pm.PackageManager.FEATURE_TELEVISION;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
+import static android.os.UserHandle.USER_NULL;
import static android.service.notification.NotificationListenerService
.NOTIFICATION_CHANNEL_OR_GROUP_ADDED;
import static android.service.notification.NotificationListenerService
@@ -55,7 +56,6 @@
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.WindowManager.LayoutParams.TYPE_TOAST;
-import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT;
import android.Manifest;
import android.annotation.NonNull;
@@ -88,7 +88,6 @@
import android.content.IntentFilter;
import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager;
-import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ParceledListSlice;
@@ -111,7 +110,10 @@
import android.os.Message;
import android.os.Process;
import android.os.RemoteException;
+import android.os.ResultReceiver;
import android.os.ServiceManager;
+import android.os.ShellCallback;
+import android.os.ShellCommand;
import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.UserHandle;
@@ -160,6 +162,7 @@
import com.android.internal.util.DumpUtils;
import com.android.internal.util.FastXmlSerializer;
import com.android.internal.util.Preconditions;
+import com.android.internal.util.XmlUtils;
import com.android.server.DeviceIdleController;
import com.android.server.EventLogTags;
import com.android.server.LocalServices;
@@ -196,9 +199,9 @@
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
-import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
+import java.util.Set;
import java.util.concurrent.TimeUnit;
/** {@hide} */
@@ -264,6 +267,7 @@
private static final String EXTRA_KEY = "key";
private IActivityManager mAm;
+ private ActivityManager mActivityManager;
private IPackageManager mPackageManager;
private PackageManager mPackageManagerClient;
AudioManager mAudioManager;
@@ -275,7 +279,7 @@
private ICompanionDeviceManager mCompanionManager;
final IBinder mForegroundToken = new Binder();
- private Handler mHandler;
+ private WorkerHandler mHandler;
private final HandlerThread mRankingThread = new HandlerThread("ranker",
Process.THREAD_PRIORITY_BACKGROUND);
@@ -292,8 +296,8 @@
private String mVibrateNotificationKey;
private final SparseArray<ArraySet<ManagedServiceInfo>> mListenersDisablingEffects =
- new SparseArray<ArraySet<ManagedServiceInfo>>();
- private List<ComponentName> mEffectsSuppressors = new ArrayList<ComponentName>();
+ new SparseArray<>();
+ private List<ComponentName> mEffectsSuppressors = new ArrayList<>();
private int mListenerHints; // right now, all hints are global
private int mInterruptionFilter = NotificationListenerService.INTERRUPTION_FILTER_UNKNOWN;
@@ -309,18 +313,15 @@
// used as a mutex for access to all active notifications & listeners
final Object mNotificationLock = new Object();
@GuardedBy("mNotificationLock")
- final ArrayList<NotificationRecord> mNotificationList =
- new ArrayList<NotificationRecord>();
+ final ArrayList<NotificationRecord> mNotificationList = new ArrayList<>();
@GuardedBy("mNotificationLock")
- final ArrayMap<String, NotificationRecord> mNotificationsByKey =
- new ArrayMap<String, NotificationRecord>();
+ final ArrayMap<String, NotificationRecord> mNotificationsByKey = new ArrayMap<>();
@GuardedBy("mNotificationLock")
final ArrayList<NotificationRecord> mEnqueuedNotifications = new ArrayList<>();
@GuardedBy("mNotificationLock")
final ArrayMap<Integer, ArrayMap<String, String>> mAutobundledSummaries = new ArrayMap<>();
- final ArrayList<ToastRecord> mToastQueue = new ArrayList<ToastRecord>();
+ final ArrayList<ToastRecord> mToastQueue = new ArrayList<>();
final ArrayMap<String, NotificationRecord> mSummaryByGroupKey = new ArrayMap<>();
- final PolicyAccess mPolicyAccess = new PolicyAccess();
// The last key in this list owns the hardware.
ArrayList<String> mLights = new ArrayList<>();
@@ -342,7 +343,7 @@
private final UserProfiles mUserProfiles = new UserProfiles();
private NotificationListeners mListeners;
- private NotificationAssistants mNotificationAssistants;
+ private NotificationAssistants mAssistants;
private ConditionProviders mConditionProviders;
private NotificationUsageStats mUsageStats;
@@ -405,14 +406,74 @@
}
- private void readPolicyXml(InputStream stream, boolean forRestore)
+ protected void readDefaultApprovedServices(int userId) {
+ String defaultListenerAccess = getContext().getResources().getString(
+ com.android.internal.R.string.config_defaultListenerAccessPackages);
+ if (defaultListenerAccess != null) {
+ for (String whitelisted :
+ defaultListenerAccess.split(ManagedServices.ENABLED_SERVICES_SEPARATOR)) {
+ // Gather all notification listener components for candidate pkgs.
+ Set<ComponentName> approvedListeners =
+ mListeners.queryPackageForServices(whitelisted,
+ PackageManager.MATCH_DIRECT_BOOT_AWARE
+ | PackageManager.MATCH_DIRECT_BOOT_UNAWARE, userId);
+ for (ComponentName cn : approvedListeners) {
+ try {
+ getBinderService().setNotificationListenerAccessGrantedForUser(cn,
+ userId, true);
+ } catch (RemoteException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+ String defaultDndAccess = getContext().getResources().getString(
+ com.android.internal.R.string.config_defaultDndAccessPackages);
+ if (defaultListenerAccess != null) {
+ for (String whitelisted :
+ defaultDndAccess.split(ManagedServices.ENABLED_SERVICES_SEPARATOR)) {
+ try {
+ getBinderService().setNotificationPolicyAccessGranted(whitelisted, true);
+ } catch (RemoteException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
+ void readPolicyXml(InputStream stream, boolean forRestore)
throws XmlPullParserException, NumberFormatException, IOException {
final XmlPullParser parser = Xml.newPullParser();
parser.setInput(stream, StandardCharsets.UTF_8.name());
+ XmlUtils.beginDocument(parser, TAG_NOTIFICATION_POLICY);
+ boolean migratedManagedServices = false;
+ int outerDepth = parser.getDepth();
+ while (XmlUtils.nextElementWithin(parser, outerDepth)) {
+ if (ZenModeConfig.ZEN_TAG.equals(parser.getName())) {
+ mZenModeHelper.readXml(parser, forRestore);
+ } else if (RankingHelper.TAG_RANKING.equals(parser.getName())){
+ mRankingHelper.readXml(parser, forRestore);
+ }
+ // No non-system managed services are allowed on low ram devices
+ if (!ActivityManager.isLowRamDeviceStatic()) {
+ if (mListeners.getConfig().xmlTag.equals(parser.getName())) {
+ mListeners.readXml(parser);
+ migratedManagedServices = true;
+ } else if (mAssistants.getConfig().xmlTag.equals(parser.getName())) {
+ mAssistants.readXml(parser);
+ migratedManagedServices = true;
+ } else if (mConditionProviders.getConfig().xmlTag.equals(parser.getName())) {
+ mConditionProviders.readXml(parser);
+ migratedManagedServices = true;
+ }
+ }
+ }
- while (parser.next() != END_DOCUMENT) {
- mZenModeHelper.readXml(parser, forRestore);
- mRankingHelper.readXml(parser, forRestore);
+ if (!migratedManagedServices) {
+ mListeners.migrateToXml();
+ mAssistants.migrateToXml();
+ mConditionProviders.migrateToXml();
+ savePolicyFile();
}
}
@@ -420,12 +481,14 @@
if (DBG) Slog.d(TAG, "loadPolicyFile");
synchronized (mPolicyFile) {
- FileInputStream infile = null;
+ InputStream infile = null;
try {
infile = mPolicyFile.openRead();
readPolicyXml(infile, false /*forRestore*/);
} catch (FileNotFoundException e) {
// No data yet
+ // Load default managed services approvals
+ readDefaultApprovedServices(UserHandle.USER_SYSTEM);
} catch (IOException e) {
Log.wtf(TAG, "Unable to read notification policy", e);
} catch (NumberFormatException e) {
@@ -473,6 +536,9 @@
out.attribute(null, ATTR_VERSION, Integer.toString(DB_VERSION));
mZenModeHelper.writeXml(out, forBackup);
mRankingHelper.writeXml(out, forBackup);
+ mListeners.writeXml(out, forBackup);
+ mAssistants.writeXml(out, forBackup);
+ mConditionProviders.writeXml(out, forBackup);
out.endTag(null, TAG_NOTIFICATION_POLICY);
out.endDocument();
}
@@ -728,6 +794,22 @@
updateLightsLocked();
}
+ private final BroadcastReceiver mRestoreReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (Intent.ACTION_SETTING_RESTORED.equals(intent.getAction())) {
+ try {
+ String element = intent.getStringExtra(Intent.EXTRA_SETTING_NAME);
+ String newValue = intent.getStringExtra(Intent.EXTRA_SETTING_NEW_VALUE);
+ mListeners.onSettingRestored(element, newValue, getSendingUserId());
+ mConditionProviders.onSettingRestored(element, newValue, getSendingUserId());
+ } catch (Exception e) {
+ Slog.wtf(TAG, "Cannot restore managed services from settings", e);
+ }
+ }
+ }
+ };
+
private final BroadcastReceiver mNotificationTimeoutReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
@@ -829,9 +911,9 @@
}
}
}
- mListeners.onPackagesChanged(removingPackage, pkgList);
- mNotificationAssistants.onPackagesChanged(removingPackage, pkgList);
- mConditionProviders.onPackagesChanged(removingPackage, pkgList);
+ mListeners.onPackagesChanged(removingPackage, pkgList, uidList);
+ mAssistants.onPackagesChanged(removingPackage, pkgList, uidList);
+ mConditionProviders.onPackagesChanged(removingPackage, pkgList, uidList);
mRankingHelper.onPackagesChanged(removingPackage, changeUserId, pkgList, uidList);
savePolicyFile();
}
@@ -895,27 +977,31 @@
// turn off LED when user passes through lock screen
mNotificationLight.turnOff();
} else if (action.equals(Intent.ACTION_USER_SWITCHED)) {
- final int user = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL);
+ final int user = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, USER_NULL);
// reload per-user settings
mSettingsObserver.update(null);
mUserProfiles.updateCache(context);
// Refresh managed services
mConditionProviders.onUserSwitched(user);
mListeners.onUserSwitched(user);
- mNotificationAssistants.onUserSwitched(user);
+ mAssistants.onUserSwitched(user);
mZenModeHelper.onUserSwitched(user);
} else if (action.equals(Intent.ACTION_USER_ADDED)) {
- mUserProfiles.updateCache(context);
+ final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, USER_NULL);
+ if (userId != USER_NULL) {
+ mUserProfiles.updateCache(context);
+ readDefaultApprovedServices(userId);
+ }
} else if (action.equals(Intent.ACTION_USER_REMOVED)) {
- final int user = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL);
+ final int user = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, USER_NULL);
mZenModeHelper.onUserRemoved(user);
mRankingHelper.onUserRemoved(user);
savePolicyFile();
} else if (action.equals(Intent.ACTION_USER_UNLOCKED)) {
- final int user = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL);
+ final int user = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, USER_NULL);
mConditionProviders.onUserUnlocked(user);
mListeners.onUserUnlocked(user);
- mNotificationAssistants.onUserUnlocked(user);
+ mAssistants.onUserUnlocked(user);
mZenModeHelper.onUserUnlocked(user);
}
}
@@ -1023,7 +1109,7 @@
count--;
}
if (posted.sbn.isGroup() && posted.getNotification().isGroupSummary()) {
- count --;
+ count--;
}
}
@@ -1031,6 +1117,13 @@
}
}
+ void clearNotifications() {
+ mEnqueuedNotifications.clear();
+ mNotificationList.clear();
+ mNotificationsByKey.clear();
+ mSummaryByGroupKey.clear();
+ }
+
@VisibleForTesting
void addNotification(NotificationRecord r) {
mNotificationList.add(r);
@@ -1051,7 +1144,7 @@
}
@VisibleForTesting
- void setHandler(Handler handler) {
+ void setHandler(WorkerHandler handler) {
mHandler = handler;
}
@@ -1071,6 +1164,11 @@
}
@VisibleForTesting
+ void setRankingHandler(RankingHandler rankingHandler) {
+ mRankingHandler = rankingHandler;
+ }
+
+ @VisibleForTesting
void setIsTelevision(boolean isTelevision) {
mIsTelevision = isTelevision;
}
@@ -1082,10 +1180,13 @@
// TODO: All tests should use this init instead of the one-off setters above.
@VisibleForTesting
- void init(Looper looper, IPackageManager packageManager, PackageManager packageManagerClient,
+ void init(Looper looper, IPackageManager packageManager,
+ PackageManager packageManagerClient,
LightsManager lightsManager, NotificationListeners notificationListeners,
+ NotificationAssistants notificationAssistants, ConditionProviders conditionProviders,
ICompanionDeviceManager companionManager, SnoozeHelper snoozeHelper,
- NotificationUsageStats usageStats) {
+ NotificationUsageStats usageStats, AtomicFile policyFile,
+ ActivityManager activityManager, GroupHelper groupHelper) {
Resources resources = getContext().getResources();
mMaxPackageEnqueueRate = Settings.Global.getFloat(getContext().getContentResolver(),
Settings.Global.MAX_NOTIFICATION_ENQUEUE_RATE,
@@ -1099,6 +1200,7 @@
mAppUsageStats = LocalServices.getService(UsageStatsManagerInternal.class);
mAlarmManager = (AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE);
mCompanionManager = companionManager;
+ mActivityManager = activityManager;
mHandler = new WorkerHandler(looper);
mRankingThread.start();
@@ -1115,7 +1217,7 @@
mRankingHandler,
mUsageStats,
extractorNames);
- mConditionProviders = new ConditionProviders(getContext(), mHandler, mUserProfiles);
+ mConditionProviders = conditionProviders;
mZenModeHelper = new ZenModeHelper(getContext(), mHandler.getLooper(), mConditionProviders);
mZenModeHelper.addCallback(new ZenModeHelper.Callback() {
@Override
@@ -1141,46 +1243,16 @@
}
});
mSnoozeHelper = snoozeHelper;
- mGroupHelper = new GroupHelper(new GroupHelper.Callback() {
- @Override
- public void addAutoGroup(String key) {
- synchronized (mNotificationLock) {
- addAutogroupKeyLocked(key);
- }
- mRankingHandler.requestSort(false);
- }
-
- @Override
- public void removeAutoGroup(String key) {
- synchronized (mNotificationLock) {
- removeAutogroupKeyLocked(key);
- }
- mRankingHandler.requestSort(false);
- }
-
- @Override
- public void addAutoGroupSummary(int userId, String pkg, String triggeringKey) {
- createAutoGroupSummary(userId, pkg, triggeringKey);
- }
-
- @Override
- public void removeAutoGroupSummary(int userId, String pkg) {
- synchronized (mNotificationLock) {
- clearAutogroupSummaryLocked(userId, pkg);
- }
- }
- });
-
- final File systemDir = new File(Environment.getDataDirectory(), "system");
- mPolicyFile = new AtomicFile(new File(systemDir, "notification_policy.xml"));
-
- loadPolicyFile();
+ mGroupHelper = groupHelper;
// This is a ManagedServices object that keeps track of the listeners.
mListeners = notificationListeners;
// This is a MangedServices object that keeps track of the assistant.
- mNotificationAssistants = new NotificationAssistants();
+ mAssistants = notificationAssistants;
+
+ mPolicyFile = policyFile;
+ loadPolicyFile();
mStatusBar = getLocalService(StatusBarManagerInternal.class);
if (mStatusBar != null) {
@@ -1238,9 +1310,18 @@
}
}, mUserProfiles);
- init(Looper.myLooper(), AppGlobals.getPackageManager(), getContext().getPackageManager(),
- getLocalService(LightsManager.class), new NotificationListeners(),
- null, snoozeHelper, new NotificationUsageStats(getContext()));
+ final File systemDir = new File(Environment.getDataDirectory(), "system");
+
+ init(Looper.myLooper(),
+ AppGlobals.getPackageManager(), getContext().getPackageManager(),
+ getLocalService(LightsManager.class),
+ new NotificationListeners(AppGlobals.getPackageManager()),
+ new NotificationAssistants(AppGlobals.getPackageManager()),
+ new ConditionProviders(getContext(), mUserProfiles, AppGlobals.getPackageManager()),
+ null, snoozeHelper, new NotificationUsageStats(getContext()),
+ new AtomicFile(new File(systemDir, "notification_policy.xml")),
+ (ActivityManager) getContext().getSystemService(Context.ACTIVITY_SERVICE),
+ getGroupHelper());
// register for various Intents
IntentFilter filter = new IntentFilter();
@@ -1279,10 +1360,43 @@
timeoutFilter.addDataScheme(SCHEME_TIMEOUT);
getContext().registerReceiver(mNotificationTimeoutReceiver, timeoutFilter);
+ IntentFilter settingsRestoredFilter = new IntentFilter(Intent.ACTION_SETTING_RESTORED);
+ getContext().registerReceiver(mRestoreReceiver, settingsRestoredFilter);
+
publishBinderService(Context.NOTIFICATION_SERVICE, mService);
publishLocalService(NotificationManagerInternal.class, mInternalService);
}
+ private GroupHelper getGroupHelper() {
+ return new GroupHelper(new GroupHelper.Callback() {
+ @Override
+ public void addAutoGroup(String key) {
+ synchronized (mNotificationLock) {
+ addAutogroupKeyLocked(key);
+ }
+ }
+
+ @Override
+ public void removeAutoGroup(String key) {
+ synchronized (mNotificationLock) {
+ removeAutogroupKeyLocked(key);
+ }
+ }
+
+ @Override
+ public void addAutoGroupSummary(int userId, String pkg, String triggeringKey) {
+ createAutoGroupSummary(userId, pkg, triggeringKey);
+ }
+
+ @Override
+ public void removeAutoGroupSummary(int userId, String pkg) {
+ synchronized (mNotificationLock) {
+ clearAutogroupSummaryLocked(userId, pkg);
+ }
+ }
+ });
+ }
+
private void sendRegisteredOnlyBroadcast(String action) {
getContext().sendBroadcastAsUser(new Intent(action)
.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY), UserHandle.ALL, null);
@@ -1304,7 +1418,7 @@
// bind to listener services.
mSettingsObserver.observe();
mListeners.onBootPhaseAppsCanStart();
- mNotificationAssistants.onBootPhaseAppsCanStart();
+ mAssistants.onBootPhaseAppsCanStart();
mConditionProviders.onBootPhaseAppsCanStart();
}
}
@@ -1339,28 +1453,14 @@
}
mRankingHelper.updateNotificationChannel(pkg, uid, channel);
- final NotificationChannel modifiedChannel =
- mRankingHelper.getNotificationChannel(pkg, uid, channel.getId(), false);
-
if (!fromListener) {
+ final NotificationChannel modifiedChannel =
+ mRankingHelper.getNotificationChannel(pkg, uid, channel.getId(), false);
mListeners.notifyNotificationChannelChanged(
pkg, UserHandle.getUserHandleForUid(uid),
modifiedChannel, NOTIFICATION_CHANNEL_OR_GROUP_UPDATED);
}
- synchronized (mNotificationLock) {
- final int N = mNotificationList.size();
- for (int i = N - 1; i >= 0; --i) {
- NotificationRecord r = mNotificationList.get(i);
- if (r.sbn.getPackageName().equals(pkg)
- && r.sbn.getUid() == uid
- && channel.getId() != null
- && channel.getId().equals(r.getChannel().getId())) {
- r.updateNotificationChannel(modifiedChannel);
- }
- }
- }
- mRankingHandler.requestSort(true);
savePolicyFile();
}
@@ -1487,7 +1587,6 @@
Slog.e(TAG, "Not doing toast. pkg=" + pkg + " callback=" + callback);
return ;
}
-
final boolean isSystemToast = isCallerSystemOrPhone() || ("android".equals(pkg));
final boolean isPackageSuspended =
isPackageSuspendedForUser(pkg, Binder.getCallingUid());
@@ -1841,17 +1940,20 @@
cancelAllNotificationsInt(MY_UID, MY_PID, packageName, null, 0, 0, true,
UserHandle.getUserId(Binder.getCallingUid()), REASON_CHANNEL_BANNED, null);
+ final String[] packages = new String[] {packageName};
+ final int[] uids = new int[] {uid};
+
// Listener & assistant
- mListeners.onPackagesChanged(true, new String[] {packageName});
- mNotificationAssistants.onPackagesChanged(true, new String[] {packageName});
+ mListeners.onPackagesChanged(true, packages, uids);
+ mAssistants.onPackagesChanged(true, packages, uids);
// Zen
- mConditionProviders.onPackagesChanged(true, new String[] {packageName});
+ mConditionProviders.onPackagesChanged(true, packages, uids);
// Reset notification preferences
if (!fromApp) {
- mRankingHelper.onPackagesChanged(true, UserHandle.getCallingUserId(),
- new String[]{packageName}, new int[]{uid});
+ mRankingHelper.onPackagesChanged(
+ true, UserHandle.getCallingUserId(), packages, uids);
}
savePolicyFile();
@@ -2049,8 +2151,8 @@
long identity = Binder.clearCallingIdentity();
try {
ManagedServices manager =
- mNotificationAssistants.isComponentEnabledForCurrentProfiles(component)
- ? mNotificationAssistants
+ mAssistants.isComponentEnabledForCurrentProfiles(component)
+ ? mAssistants
: mListeners;
manager.setComponentState(component, true);
} finally {
@@ -2170,7 +2272,7 @@
try {
synchronized (mNotificationLock) {
final ManagedServiceInfo info =
- mNotificationAssistants.checkServiceTokenLocked(token);
+ mAssistants.checkServiceTokenLocked(token);
unsnoozeNotificationInt(key, info);
}
} finally {
@@ -2495,7 +2597,8 @@
String[] packages = getContext().getPackageManager().getPackagesForUid(uid);
final int packageCount = packages.length;
for (int i = 0; i < packageCount; i++) {
- if (checkPolicyAccess(packages[i])) {
+ if (mConditionProviders.isPackageOrComponentAllowed(
+ packages[i], UserHandle.getUserId(uid))) {
accessAllowed = true;
}
}
@@ -2518,7 +2621,8 @@
}
private boolean checkPackagePolicyAccess(String pkg) {
- return mPolicyAccess.isPackageGranted(pkg);
+ return mConditionProviders.isPackageOrComponentAllowed(
+ pkg, getCallingUserHandle().getIdentifier());
}
private boolean checkPolicyAccess(String pkg) {
@@ -2629,28 +2733,20 @@
}
@Override
- public String[] getPackagesRequestingNotificationPolicyAccess()
- throws RemoteException {
- enforceSystemOrSystemUI("request policy access packages");
- final long identity = Binder.clearCallingIdentity();
- try {
- return mPolicyAccess.getRequestingPackages();
- } finally {
- Binder.restoreCallingIdentity(identity);
- }
- }
-
- @Override
public void setNotificationPolicyAccessGranted(String pkg, boolean granted)
throws RemoteException {
- enforceSystemOrSystemUI("grant notification policy access");
- final long identity = Binder.clearCallingIdentity();
- try {
- synchronized (mNotificationLock) {
- mPolicyAccess.put(pkg, granted);
- }
- } finally {
- Binder.restoreCallingIdentity(identity);
+ checkCallerIsSystemOrShell();
+ if (!mActivityManager.isLowRamDevice()) {
+ mConditionProviders.setPackageOrComponentEnabled(
+ pkg, getCallingUserHandle().getIdentifier(), true, granted);
+
+ getContext().sendBroadcastAsUser(new Intent(
+ NotificationManager.ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED)
+ .setPackage(pkg)
+ .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY),
+ getCallingUserHandle(), null);
+
+ savePolicyFile();
}
}
@@ -2677,12 +2773,105 @@
}
@Override
+ public List<String> getEnabledNotificationListenerPackages() {
+ checkCallerIsSystem();
+ return mListeners.getAllowedPackages(getCallingUserHandle().getIdentifier());
+ }
+
+ @Override
+ public List<ComponentName> getEnabledNotificationListeners(int userId) {
+ checkCallerIsSystem();
+ return mListeners.getAllowedComponents(userId);
+ }
+
+ @Override
+ public boolean isNotificationListenerAccessGranted(ComponentName listener) {
+ Preconditions.checkNotNull(listener);
+ checkCallerIsSystemOrSameApp(listener.getPackageName());
+ return mListeners.isPackageOrComponentAllowed(listener.flattenToString(),
+ getCallingUserHandle().getIdentifier());
+ }
+
+ @Override
+ public boolean isNotificationListenerAccessGrantedForUser(ComponentName listener,
+ int userId) {
+ Preconditions.checkNotNull(listener);
+ checkCallerIsSystem();
+ return mListeners.isPackageOrComponentAllowed(listener.flattenToString(),
+ userId);
+ }
+
+ @Override
+ public boolean isNotificationAssistantAccessGranted(ComponentName assistant) {
+ Preconditions.checkNotNull(assistant);
+ checkCallerIsSystemOrSameApp(assistant.getPackageName());
+ return mAssistants.isPackageOrComponentAllowed(assistant.flattenToString(),
+ getCallingUserHandle().getIdentifier());
+ }
+
+ @Override
+ public void setNotificationListenerAccessGranted(ComponentName listener,
+ boolean granted) throws RemoteException {
+ setNotificationListenerAccessGrantedForUser(
+ listener, getCallingUserHandle().getIdentifier(), granted);
+ }
+
+ @Override
+ public void setNotificationAssistantAccessGranted(ComponentName assistant,
+ boolean granted) throws RemoteException {
+ setNotificationAssistantAccessGrantedForUser(
+ assistant, getCallingUserHandle().getIdentifier(), granted);
+ }
+
+ @Override
+ public void setNotificationListenerAccessGrantedForUser(ComponentName listener, int userId,
+ boolean granted) throws RemoteException {
+ Preconditions.checkNotNull(listener);
+ enforceSystemOrSystemUI("grant notification listener access");
+ if (!mActivityManager.isLowRamDevice()) {
+ mConditionProviders.setPackageOrComponentEnabled(listener.flattenToString(),
+ userId, false, granted);
+ mListeners.setPackageOrComponentEnabled(listener.flattenToString(),
+ userId, true, granted);
+
+ getContext().sendBroadcastAsUser(new Intent(
+ NotificationManager.ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED)
+ .setPackage(listener.getPackageName())
+ .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY),
+ getCallingUserHandle(), null);
+
+ savePolicyFile();
+ }
+ }
+
+ @Override
+ public void setNotificationAssistantAccessGrantedForUser(ComponentName assistant,
+ int userId, boolean granted) throws RemoteException {
+ Preconditions.checkNotNull(assistant);
+ enforceSystemOrSystemUI("grant notification assistant access");
+ if (!mActivityManager.isLowRamDevice()) {
+ mConditionProviders.setPackageOrComponentEnabled(assistant.flattenToString(),
+ userId, false, granted);
+ mAssistants.setPackageOrComponentEnabled(assistant.flattenToString(),
+ userId, true, granted);
+
+ getContext().sendBroadcastAsUser(new Intent(
+ NotificationManager.ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED)
+ .setPackage(assistant.getPackageName())
+ .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY),
+ getCallingUserHandle(), null);
+
+ savePolicyFile();
+ }
+ }
+
+ @Override
public void applyEnqueuedAdjustmentFromAssistant(INotificationListener token,
Adjustment adjustment) throws RemoteException {
final long identity = Binder.clearCallingIdentity();
try {
synchronized (mNotificationLock) {
- mNotificationAssistants.checkServiceTokenLocked(token);
+ mAssistants.checkServiceTokenLocked(token);
int N = mEnqueuedNotifications.size();
for (int i = 0; i < N; i++) {
final NotificationRecord n = mEnqueuedNotifications.get(i);
@@ -2704,11 +2893,11 @@
final long identity = Binder.clearCallingIdentity();
try {
synchronized (mNotificationLock) {
- mNotificationAssistants.checkServiceTokenLocked(token);
+ mAssistants.checkServiceTokenLocked(token);
NotificationRecord n = mNotificationsByKey.get(adjustment.getKey());
applyAdjustment(n, adjustment);
}
- mRankingHandler.requestSort(true);
+ mRankingHandler.requestSort();
} finally {
Binder.restoreCallingIdentity(identity);
}
@@ -2721,13 +2910,13 @@
final long identity = Binder.clearCallingIdentity();
try {
synchronized (mNotificationLock) {
- mNotificationAssistants.checkServiceTokenLocked(token);
+ mAssistants.checkServiceTokenLocked(token);
for (Adjustment adjustment : adjustments) {
NotificationRecord n = mNotificationsByKey.get(adjustment.getKey());
applyAdjustment(n, adjustment);
}
}
- mRankingHandler.requestSort(true);
+ mRankingHandler.requestSort();
} finally {
Binder.restoreCallingIdentity(identity);
}
@@ -2792,41 +2981,57 @@
}
return uid;
}
+
+ @Override
+ public void onShellCommand(FileDescriptor in, FileDescriptor out, FileDescriptor err,
+ String[] args, ShellCallback callback, ResultReceiver resultReceiver)
+ throws RemoteException {
+ new ShellCmd().exec(this, in, out, err, args, callback, resultReceiver);
+ }
};
- private void applyAdjustment(NotificationRecord n, Adjustment adjustment) {
- if (n == null) {
+ private void applyAdjustment(NotificationRecord r, Adjustment adjustment) {
+ if (r == null) {
return;
}
if (adjustment.getSignals() != null) {
Bundle.setDefusable(adjustment.getSignals(), true);
- final ArrayList<String> people =
- adjustment.getSignals().getStringArrayList(Adjustment.KEY_PEOPLE);
- final ArrayList<SnoozeCriterion> snoozeCriterionList =
- adjustment.getSignals().getParcelableArrayList(Adjustment.KEY_SNOOZE_CRITERIA);
- n.setPeopleOverride(people);
- n.setSnoozeCriteria(snoozeCriterionList);
+ r.addAdjustment(adjustment);
}
}
@GuardedBy("mNotificationLock")
- private void addAutogroupKeyLocked(String key) {
- NotificationRecord n = mNotificationsByKey.get(key);
- if (n == null) {
+ void addAutogroupKeyLocked(String key) {
+ NotificationRecord r = mNotificationsByKey.get(key);
+ if (r == null) {
return;
}
- n.setOverrideGroupKey(GroupHelper.AUTOGROUP_KEY);
- EventLogTags.writeNotificationAutogrouped(key);
+ if (r.sbn.getOverrideGroupKey() == null) {
+ addAutoGroupAdjustment(r, GroupHelper.AUTOGROUP_KEY);
+ EventLogTags.writeNotificationAutogrouped(key);
+ mRankingHandler.requestSort();
+ }
}
@GuardedBy("mNotificationLock")
- private void removeAutogroupKeyLocked(String key) {
- NotificationRecord n = mNotificationsByKey.get(key);
- if (n == null) {
+ void removeAutogroupKeyLocked(String key) {
+ NotificationRecord r = mNotificationsByKey.get(key);
+ if (r == null) {
return;
}
- n.setOverrideGroupKey(null);
- EventLogTags.writeNotificationUnautogrouped(key);
+ if (r.sbn.getOverrideGroupKey() != null) {
+ addAutoGroupAdjustment(r, null);
+ EventLogTags.writeNotificationUnautogrouped(key);
+ mRankingHandler.requestSort();
+ }
+ }
+
+ private void addAutoGroupAdjustment(NotificationRecord r, String overrideGroupKey) {
+ Bundle signals = new Bundle();
+ signals.putString(Adjustment.KEY_GROUP_KEY, overrideGroupKey);
+ Adjustment adjustment =
+ new Adjustment(r.sbn.getPackageName(), r.getKey(), signals, "", r.sbn.getUserId());
+ r.addAdjustment(adjustment);
}
// Clears the 'fake' auto-group summary.
@@ -3089,7 +3294,7 @@
}
pw.println(')');
pw.println("\n Notification assistant services:");
- mNotificationAssistants.dump(pw, filter);
+ mAssistants.dump(pw, filter);
}
if (!filter.filtered || zenOnly) {
@@ -3101,9 +3306,6 @@
ZenLog.dump(pw, " ");
}
- pw.println("\n Policy access:");
- pw.print(" mPolicyAccess: "); pw.println(mPolicyAccess);
-
pw.println("\n Condition providers:");
mConditionProviders.dump(pw, filter);
@@ -3170,7 +3372,6 @@
(r.mOriginalFlags & ~Notification.FLAG_FOREGROUND_SERVICE);
mRankingHelper.sort(mNotificationList);
mListeners.notifyPostedLocked(sbn, sbn /* oldSbn */);
- mGroupHelper.onNotificationPosted(sbn);
}
};
@@ -3484,7 +3685,7 @@
cancelNotificationLocked(r, false, REASON_SNOOZED, wasPosted);
updateLightsLocked();
if (mSnoozeCriterionId != null) {
- mNotificationAssistants.notifyAssistantSnoozedLocked(r.sbn, mSnoozeCriterionId);
+ mAssistants.notifyAssistantSnoozedLocked(r.sbn, mSnoozeCriterionId);
mSnoozeHelper.snooze(r);
} else {
mSnoozeHelper.snooze(r, mDuration);
@@ -3548,8 +3749,8 @@
mRankingHelper.extractSignals(r);
// tell the assistant service about the notification
- if (mNotificationAssistants.isEnabled()) {
- mNotificationAssistants.onNotificationEnqueued(r);
+ if (mAssistants.isEnabled()) {
+ mAssistants.onNotificationEnqueued(r);
mHandler.postDelayed(new PostNotificationRunnable(r.getKey()),
DELAY_FOR_ASSISTANT_TIME);
} else {
@@ -3615,12 +3816,14 @@
if (notification.getSmallIcon() != null) {
StatusBarNotification oldSbn = (old != null) ? old.sbn : null;
mListeners.notifyPostedLocked(n, oldSbn);
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- mGroupHelper.onNotificationPosted(n);
- }
- });
+ if (oldSbn == null || !Objects.equals(oldSbn.getGroup(), n.getGroup())) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mGroupHelper.onNotificationPosted(n);
+ }
+ });
+ }
} else {
Slog.e(TAG, "Not posting notification without small icon: " + notification);
if (old != null && !old.isCanceled) {
@@ -3699,7 +3902,8 @@
// notification was a summary and the new one isn't, or when the old
// notification was a summary and its group key changed.
if (oldIsSummary && (!isSummary || !oldGroup.equals(group))) {
- cancelGroupChildrenLocked(old, callingUid, callingPid, null, false /* sendDelete */);
+ cancelGroupChildrenLocked(old, callingUid, callingPid, null, false /* sendDelete */,
+ null);
}
}
@@ -4086,39 +4290,44 @@
}
}
if (changed) {
- scheduleSendRankingUpdate();
+ mHandler.scheduleSendRankingUpdate();
}
}
- private void handleRankingSort(Message msg) {
- if (!(msg.obj instanceof Boolean)) return;
+ void handleRankingSort() {
if (mRankingHelper == null) return;
- boolean forceUpdate = ((Boolean) msg.obj == null) ? false : (boolean) msg.obj;
synchronized (mNotificationLock) {
final int N = mNotificationList.size();
- // Any field that can change via one of the extractors or by the assistant
- // needs to be added here.
- ArrayList<String> orderBefore = new ArrayList<String>(N);
- ArrayList<String> groupOverrideBefore = new ArrayList<>(N);
+ // Any field that can change via one of the extractors needs to be added here.
+ ArrayList<String> orderBefore = new ArrayList<>(N);
int[] visibilities = new int[N];
boolean[] showBadges = new boolean[N];
+ ArrayList<NotificationChannel> channelBefore = new ArrayList<>(N);
+ ArrayList<String> groupKeyBefore = new ArrayList<>(N);
+ ArrayList<ArrayList<String>> overridePeopleBefore = new ArrayList<>(N);
+ ArrayList<ArrayList<SnoozeCriterion>> snoozeCriteriaBefore = new ArrayList<>(N);
for (int i = 0; i < N; i++) {
final NotificationRecord r = mNotificationList.get(i);
orderBefore.add(r.getKey());
- groupOverrideBefore.add(r.sbn.getGroupKey());
visibilities[i] = r.getPackageVisibilityOverride();
showBadges[i] = r.canShowBadge();
+ channelBefore.add(r.getChannel());
+ groupKeyBefore.add(r.getGroupKey());
+ overridePeopleBefore.add(r.getPeopleOverride());
+ snoozeCriteriaBefore.add(r.getSnoozeCriteria());
mRankingHelper.extractSignals(r);
}
mRankingHelper.sort(mNotificationList);
for (int i = 0; i < N; i++) {
final NotificationRecord r = mNotificationList.get(i);
- if (forceUpdate
- || !orderBefore.get(i).equals(r.getKey())
+ if (!orderBefore.get(i).equals(r.getKey())
|| visibilities[i] != r.getPackageVisibilityOverride()
- || !groupOverrideBefore.get(i).equals(r.sbn.getGroupKey())
- || showBadges[i] != r.canShowBadge()) {
- scheduleSendRankingUpdate();
+ || showBadges[i] != r.canShowBadge()
+ || !Objects.equals(channelBefore.get(i), r.getChannel())
+ || !Objects.equals(groupKeyBefore.get(i), r.getGroupKey())
+ || !Objects.equals(overridePeopleBefore.get(i), r.getPeopleOverride())
+ || !Objects.equals(snoozeCriteriaBefore.get(i), r.getSnoozeCriteria())) {
+ mHandler.scheduleSendRankingUpdate();
return;
}
}
@@ -4152,13 +4361,6 @@
return mRankingHelper.indexOf(mNotificationList, target);
}
- private void scheduleSendRankingUpdate() {
- if (!mHandler.hasMessages(MESSAGE_SEND_RANKING_UPDATE)) {
- Message m = Message.obtain(mHandler, MESSAGE_SEND_RANKING_UPDATE);
- mHandler.sendMessage(m);
- }
- }
-
private void handleSendRankingUpdate() {
synchronized (mNotificationLock) {
mListeners.notifyRankingUpdateLocked();
@@ -4190,7 +4392,7 @@
}
}
- private final class WorkerHandler extends Handler
+ protected class WorkerHandler extends Handler
{
public WorkerHandler(Looper looper) {
super(looper);
@@ -4219,6 +4421,13 @@
}
}
+ protected void scheduleSendRankingUpdate() {
+ if (!hasMessages(MESSAGE_SEND_RANKING_UPDATE)) {
+ Message m = Message.obtain(this, MESSAGE_SEND_RANKING_UPDATE);
+ sendMessage(m);
+ }
+ }
+
}
private final class RankingHandlerWorker extends Handler implements RankingHandler
@@ -4234,16 +4443,15 @@
handleRankingReconsideration(msg);
break;
case MESSAGE_RANKING_SORT:
- handleRankingSort(msg);
+ handleRankingSort();
break;
}
}
- public void requestSort(boolean forceUpdate) {
+ public void requestSort() {
removeMessages(MESSAGE_RANKING_SORT);
Message msg = Message.obtain();
msg.what = MESSAGE_RANKING_SORT;
- msg.obj = forceUpdate;
sendMessage(msg);
}
@@ -4450,7 +4658,7 @@
boolean wasPosted = removeFromNotificationListsLocked(r);
cancelNotificationLocked(r, sendDelete, reason, wasPosted);
cancelGroupChildrenLocked(r, callingUid, callingPid, listenerName,
- sendDelete);
+ sendDelete, null);
updateLightsLocked();
} else {
// No notification was found, assume that it is snoozed and cancel it.
@@ -4521,7 +4729,6 @@
}
return true;
};
-
cancelAllNotificationsByListLocked(mNotificationList, callingUid, callingPid,
pkg, true /*nullPkgIndicatesUserSwitch*/, channelId, flagChecker,
false /*includeCurrentProfiles*/, userId, false /*sendDelete*/, reason,
@@ -4569,7 +4776,6 @@
if (channelId != null && !channelId.equals(r.getChannel().getId())) {
continue;
}
-
if (canceledNotifications == null) {
canceledNotifications = new ArrayList<>();
}
@@ -4582,7 +4788,7 @@
final int M = canceledNotifications.size();
for (int i = 0; i < M; i++) {
cancelGroupChildrenLocked(canceledNotifications.get(i), callingUid, callingPid,
- listenerName, false /* sendDelete */);
+ listenerName, false /* sendDelete */, flagChecker);
}
updateLightsLocked();
}
@@ -4649,7 +4855,7 @@
// Warning: The caller is responsible for invoking updateLightsLocked().
@GuardedBy("mNotificationLock")
private void cancelGroupChildrenLocked(NotificationRecord r, int callingUid, int callingPid,
- String listenerName, boolean sendDelete) {
+ String listenerName, boolean sendDelete, FlagChecker flagChecker) {
Notification n = r.getNotification();
if (!n.isGroupSummary()) {
return;
@@ -4663,15 +4869,15 @@
}
cancelGroupChildrenByListLocked(mNotificationList, r, callingUid, callingPid, listenerName,
- sendDelete, true);
+ sendDelete, true, flagChecker);
cancelGroupChildrenByListLocked(mEnqueuedNotifications, r, callingUid, callingPid,
- listenerName, sendDelete, false);
+ listenerName, sendDelete, false, flagChecker);
}
@GuardedBy("mNotificationLock")
private void cancelGroupChildrenByListLocked(ArrayList<NotificationRecord> notificationList,
NotificationRecord parentNotification, int callingUid, int callingPid,
- String listenerName, boolean sendDelete, boolean wasPosted) {
+ String listenerName, boolean sendDelete, boolean wasPosted, FlagChecker flagChecker) {
final String pkg = parentNotification.sbn.getPackageName();
final int userId = parentNotification.getUserId();
final int reason = REASON_GROUP_SUMMARY_CANCELED;
@@ -4680,7 +4886,8 @@
final StatusBarNotification childSbn = childR.sbn;
if ((childSbn.isGroup() && !childSbn.getNotification().isGroupSummary()) &&
childR.getGroupKey().equals(parentNotification.getGroupKey())
- && (childR.getFlags() & Notification.FLAG_FOREGROUND_SERVICE) == 0) {
+ && (childR.getFlags() & Notification.FLAG_FOREGROUND_SERVICE) == 0
+ && (flagChecker == null || flagChecker.apply(childR.getFlags()))) {
EventLogTags.writeNotificationCancel(callingUid, callingPid, pkg, childSbn.getId(),
childSbn.getTag(), userId, 0, 0, reason, listenerName);
notificationList.remove(i);
@@ -4829,6 +5036,13 @@
return isUidSystemOrPhone(Binder.getCallingUid());
}
+ private void checkCallerIsSystemOrShell() {
+ if (Binder.getCallingUid() == Process.SHELL_UID) {
+ return;
+ }
+ checkCallerIsSystem();
+ }
+
private void checkCallerIsSystem() {
if (isCallerSystemOrPhone()) {
return;
@@ -5034,9 +5248,10 @@
}
public class NotificationAssistants extends ManagedServices {
+ static final String TAG_ENABLED_NOTIFICATION_ASSISTANTS = "enabled_assistants";
- public NotificationAssistants() {
- super(getContext(), mHandler, mNotificationLock, mUserProfiles);
+ public NotificationAssistants(IPackageManager pm) {
+ super(getContext(), mNotificationLock, mUserProfiles, pm);
}
@Override
@@ -5044,6 +5259,7 @@
Config c = new Config();
c.caption = "notification assistant service";
c.serviceInterface = NotificationAssistantService.SERVICE_INTERFACE;
+ c.xmlTag = TAG_ENABLED_NOTIFICATION_ASSISTANTS;
c.secureSettingName = Settings.Secure.ENABLED_NOTIFICATION_ASSISTANT;
c.bindPermission = Manifest.permission.BIND_NOTIFICATION_ASSISTANT_SERVICE;
c.settingsAction = Settings.ACTION_MANAGE_DEFAULT_APPS_SETTINGS;
@@ -5141,11 +5357,13 @@
}
public class NotificationListeners extends ManagedServices {
+ static final String TAG_ENABLED_NOTIFICATION_LISTENERS = "enabled_listeners";
private final ArraySet<ManagedServiceInfo> mLightTrimListeners = new ArraySet<>();
- public NotificationListeners() {
- super(getContext(), mHandler, mNotificationLock, mUserProfiles);
+ public NotificationListeners(IPackageManager pm) {
+ super(getContext(), mNotificationLock, mUserProfiles, pm);
+
}
@Override
@@ -5153,6 +5371,7 @@
Config c = new Config();
c.caption = "notification listener";
c.serviceInterface = NotificationListenerService.SERVICE_INTERFACE;
+ c.xmlTag = TAG_ENABLED_NOTIFICATION_LISTENERS;
c.secureSettingName = Settings.Secure.ENABLED_NOTIFICATION_LISTENERS;
c.bindPermission = android.Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE;
c.settingsAction = Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS;
@@ -5545,78 +5764,84 @@
}
}
- private final class PolicyAccess {
- private static final String SEPARATOR = ":";
- private final String[] PERM = {
- android.Manifest.permission.ACCESS_NOTIFICATION_POLICY
- };
+ private class ShellCmd extends ShellCommand {
+ public static final String USAGE = "help\n"
+ + "allow_listener COMPONENT\n"
+ + "disallow_listener COMPONENT\n"
+ + "set_assistant COMPONENT\n"
+ + "remove_assistant COMPONENT\n"
+ + "allow_dnd PACKAGE\n"
+ + "disallow_dnd PACKAGE";
- public boolean isPackageGranted(String pkg) {
- return pkg != null && getGrantedPackages().contains(pkg);
- }
-
- public void put(String pkg, boolean granted) {
- if (pkg == null) return;
- final ArraySet<String> pkgs = getGrantedPackages();
- boolean changed;
- if (granted) {
- changed = pkgs.add(pkg);
- } else {
- changed = pkgs.remove(pkg);
+ @Override
+ public int onCommand(String cmd) {
+ if (cmd == null) {
+ return handleDefaultCommands(cmd);
}
- if (!changed) return;
- final String setting = TextUtils.join(SEPARATOR, pkgs);
- final int currentUser = ActivityManager.getCurrentUser();
- Settings.Secure.putStringForUser(getContext().getContentResolver(),
- Settings.Secure.ENABLED_NOTIFICATION_POLICY_ACCESS_PACKAGES,
- setting,
- currentUser);
- getContext().sendBroadcastAsUser(new Intent(NotificationManager
- .ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED)
- .setPackage(pkg)
- .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY), new UserHandle(currentUser), null);
- }
-
- public ArraySet<String> getGrantedPackages() {
- final ArraySet<String> pkgs = new ArraySet<>();
-
- long identity = Binder.clearCallingIdentity();
+ final PrintWriter pw = getOutPrintWriter();
try {
- final String setting = Settings.Secure.getStringForUser(
- getContext().getContentResolver(),
- Settings.Secure.ENABLED_NOTIFICATION_POLICY_ACCESS_PACKAGES,
- ActivityManager.getCurrentUser());
- if (setting != null) {
- final String[] tokens = setting.split(SEPARATOR);
- for (int i = 0; i < tokens.length; i++) {
- String token = tokens[i];
- if (token != null) {
- token = token.trim();
- }
- if (TextUtils.isEmpty(token)) {
- continue;
- }
- pkgs.add(token);
+ switch (cmd) {
+ case "allow_dnd": {
+ getBinderService().setNotificationPolicyAccessGranted(
+ getNextArgRequired(), true);
}
+ break;
+
+ case "disallow_dnd": {
+ getBinderService().setNotificationPolicyAccessGranted(
+ getNextArgRequired(), false);
+ }
+ break;
+ case "allow_listener": {
+ ComponentName cn = ComponentName.unflattenFromString(getNextArgRequired());
+ if (cn == null) {
+ pw.println("Invalid listener - must be a ComponentName");
+ return -1;
+ }
+ getBinderService().setNotificationListenerAccessGranted(cn, true);
+ }
+ break;
+ case "disallow_listener": {
+ ComponentName cn = ComponentName.unflattenFromString(getNextArgRequired());
+ if (cn == null) {
+ pw.println("Invalid listener - must be a ComponentName");
+ return -1;
+ }
+ getBinderService().setNotificationListenerAccessGranted(cn, false);
+ }
+ break;
+ case "allow_assistant": {
+ ComponentName cn = ComponentName.unflattenFromString(getNextArgRequired());
+ if (cn == null) {
+ pw.println("Invalid assistant - must be a ComponentName");
+ return -1;
+ }
+ getBinderService().setNotificationAssistantAccessGranted(cn, true);
+ }
+ break;
+ case "disallow_assistant": {
+ ComponentName cn = ComponentName.unflattenFromString(getNextArgRequired());
+ if (cn == null) {
+ pw.println("Invalid assistant - must be a ComponentName");
+ return -1;
+ }
+ getBinderService().setNotificationAssistantAccessGranted(cn, false);
+ }
+ break;
+
+ default:
+ return handleDefaultCommands(cmd);
}
- } finally {
- Binder.restoreCallingIdentity(identity);
+ } catch (Exception e) {
+ pw.println("Error occurred. Check logcat for details. " + e.getMessage());
+ Slog.e(TAG, "Error running shell command", e);
}
- return pkgs;
+ return 0;
}
- public String[] getRequestingPackages() throws RemoteException {
- final ParceledListSlice list = mPackageManager
- .getPackagesHoldingPermissions(PERM, 0 /*flags*/,
- ActivityManager.getCurrentUser());
- final List<PackageInfo> pkgs = list.getList();
- if (pkgs == null || pkgs.isEmpty()) return new String[0];
- final int N = pkgs.size();
- final String[] rt = new String[N];
- for (int i = 0; i < N; i++) {
- rt[i] = pkgs.get(i).packageName;
- }
- return rt;
+ @Override
+ public void onHelp() {
+ getOutPrintWriter().println(USAGE);
}
}
}
diff --git a/services/core/java/com/android/server/notification/NotificationRecord.java b/services/core/java/com/android/server/notification/NotificationRecord.java
index 1dee71c..77bf9e3 100644
--- a/services/core/java/com/android/server/notification/NotificationRecord.java
+++ b/services/core/java/com/android/server/notification/NotificationRecord.java
@@ -35,8 +35,10 @@
import android.metrics.LogMaker;
import android.net.Uri;
import android.os.Build;
+import android.os.Bundle;
import android.os.UserHandle;
import android.provider.Settings;
+import android.service.notification.Adjustment;
import android.service.notification.NotificationListenerService;
import android.service.notification.NotificationRecordProto;
import android.service.notification.SnoozeCriterion;
@@ -57,6 +59,7 @@
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.List;
import java.util.Objects;
/**
@@ -132,6 +135,8 @@
private String mGroupLogTag;
private String mChannelIdLogTag;
+ private final List<Adjustment> mAdjustments;
+
@VisibleForTesting
public NotificationRecord(Context context, StatusBarNotification sbn,
NotificationChannel channel)
@@ -150,6 +155,7 @@
mAttributes = calculateAttributes();
mImportance = calculateImportance();
mLight = calculateLights();
+ mAdjustments = new ArrayList<>();
}
private boolean isPreChannelsNotification() {
@@ -504,6 +510,7 @@
if (getSnoozeCriteria() != null) {
pw.println(prefix + "snoozeCriteria=" + TextUtils.join(",", getSnoozeCriteria()));
}
+ pw.println(prefix + "mAdjustments=" + mAdjustments);
}
@@ -539,6 +546,36 @@
this.sbn.getNotification());
}
+ public void addAdjustment(Adjustment adjustment) {
+ synchronized (mAdjustments) {
+ mAdjustments.add(adjustment);
+ }
+ }
+
+ public void applyAdjustments() {
+ synchronized (mAdjustments) {
+ for (Adjustment adjustment: mAdjustments) {
+ Bundle signals = adjustment.getSignals();
+ if (signals.containsKey(Adjustment.KEY_PEOPLE)) {
+ final ArrayList<String> people =
+ adjustment.getSignals().getStringArrayList(Adjustment.KEY_PEOPLE);
+ setPeopleOverride(people);
+ }
+ if (signals.containsKey(Adjustment.KEY_SNOOZE_CRITERIA)) {
+ final ArrayList<SnoozeCriterion> snoozeCriterionList =
+ adjustment.getSignals().getParcelableArrayList(
+ Adjustment.KEY_SNOOZE_CRITERIA);
+ setSnoozeCriteria(snoozeCriterionList);
+ }
+ if (signals.containsKey(Adjustment.KEY_GROUP_KEY)) {
+ final String groupOverrideKey =
+ adjustment.getSignals().getString(Adjustment.KEY_GROUP_KEY);
+ setOverrideGroupKey(groupOverrideKey);
+ }
+ }
+ }
+ }
+
public void setContactAffinity(float contactAffinity) {
mContactAffinity = contactAffinity;
if (mImportance < IMPORTANCE_DEFAULT &&
diff --git a/services/core/java/com/android/server/notification/NotificationUsageStats.java b/services/core/java/com/android/server/notification/NotificationUsageStats.java
index 3ed1d0b..c8f4d31 100644
--- a/services/core/java/com/android/server/notification/NotificationUsageStats.java
+++ b/services/core/java/com/android/server/notification/NotificationUsageStats.java
@@ -40,6 +40,7 @@
import org.json.JSONObject;
import java.io.PrintWriter;
+import java.lang.Math;
import java.util.ArrayDeque;
import java.util.Calendar;
import java.util.GregorianCalendar;
@@ -748,8 +749,8 @@
}
void increment(int imp) {
- imp = imp < 0 ? 0 : imp > NUM_IMPORTANCES ? NUM_IMPORTANCES : imp;
- mCount[imp] ++;
+ imp = Math.max(0, Math.min(imp, mCount.length - 1));
+ mCount[imp]++;
}
void maybeCount(ImportanceHistogram prev) {
diff --git a/services/core/java/com/android/server/notification/RankingHandler.java b/services/core/java/com/android/server/notification/RankingHandler.java
index 656d727..96324d8 100644
--- a/services/core/java/com/android/server/notification/RankingHandler.java
+++ b/services/core/java/com/android/server/notification/RankingHandler.java
@@ -16,6 +16,6 @@
package com.android.server.notification;
public interface RankingHandler {
- public void requestSort(boolean forceUpdate);
+ public void requestSort();
public void requestReconsideration(RankingReconsideration recon);
-}
+}
\ No newline at end of file
diff --git a/services/core/java/com/android/server/notification/RankingHelper.java b/services/core/java/com/android/server/notification/RankingHelper.java
index d7b36aa..9622a24 100644
--- a/services/core/java/com/android/server/notification/RankingHelper.java
+++ b/services/core/java/com/android/server/notification/RankingHelper.java
@@ -20,6 +20,7 @@
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto;
import com.android.internal.util.Preconditions;
+import com.android.internal.util.XmlUtils;
import android.app.Notification;
import android.app.NotificationChannel;
@@ -64,7 +65,7 @@
private static final int XML_VERSION = 1;
- private static final String TAG_RANKING = "ranking";
+ static final String TAG_RANKING = "ranking";
private static final String TAG_PACKAGE = "package";
private static final String TAG_CHANNEL = "channel";
private static final String TAG_GROUP = "channelGroup";
@@ -169,7 +170,7 @@
}
if (type == XmlPullParser.START_TAG) {
if (TAG_PACKAGE.equals(tag)) {
- int uid = safeInt(parser, ATT_UID, Record.UNKNOWN_UID);
+ int uid = XmlUtils.readIntAttribute(parser, ATT_UID, Record.UNKNOWN_UID);
String name = parser.getAttributeValue(null, ATT_NAME);
if (!TextUtils.isEmpty(name)) {
if (forRestore) {
@@ -182,14 +183,21 @@
}
Record r = getOrCreateRecord(name, uid,
- safeInt(parser, ATT_IMPORTANCE, DEFAULT_IMPORTANCE),
- safeInt(parser, ATT_PRIORITY, DEFAULT_PRIORITY),
- safeInt(parser, ATT_VISIBILITY, DEFAULT_VISIBILITY),
- safeBool(parser, ATT_SHOW_BADGE, DEFAULT_SHOW_BADGE));
- r.importance = safeInt(parser, ATT_IMPORTANCE, DEFAULT_IMPORTANCE);
- r.priority = safeInt(parser, ATT_PRIORITY, DEFAULT_PRIORITY);
- r.visibility = safeInt(parser, ATT_VISIBILITY, DEFAULT_VISIBILITY);
- r.showBadge = safeBool(parser, ATT_SHOW_BADGE, DEFAULT_SHOW_BADGE);
+ XmlUtils.readIntAttribute(
+ parser, ATT_IMPORTANCE, DEFAULT_IMPORTANCE),
+ XmlUtils.readIntAttribute(parser, ATT_PRIORITY, DEFAULT_PRIORITY),
+ XmlUtils.readIntAttribute(
+ parser, ATT_VISIBILITY, DEFAULT_VISIBILITY),
+ XmlUtils.readBooleanAttribute(
+ parser, ATT_SHOW_BADGE, DEFAULT_SHOW_BADGE));
+ r.importance = XmlUtils.readIntAttribute(
+ parser, ATT_IMPORTANCE, DEFAULT_IMPORTANCE);
+ r.priority = XmlUtils.readIntAttribute(
+ parser, ATT_PRIORITY, DEFAULT_PRIORITY);
+ r.visibility = XmlUtils.readIntAttribute(
+ parser, ATT_VISIBILITY, DEFAULT_VISIBILITY);
+ r.showBadge = XmlUtils.readBooleanAttribute(
+ parser, ATT_SHOW_BADGE, DEFAULT_SHOW_BADGE);
final int innerDepth = parser.getDepth();
while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
@@ -214,8 +222,8 @@
if (TAG_CHANNEL.equals(tagName)) {
String id = parser.getAttributeValue(null, ATT_ID);
String channelName = parser.getAttributeValue(null, ATT_NAME);
- int channelImportance =
- safeInt(parser, ATT_IMPORTANCE, DEFAULT_IMPORTANCE);
+ int channelImportance = XmlUtils.readIntAttribute(
+ parser, ATT_IMPORTANCE, DEFAULT_IMPORTANCE);
if (!TextUtils.isEmpty(id) && !TextUtils.isEmpty(channelName)) {
NotificationChannel channel = new NotificationChannel(id,
channelName, channelImportance);
@@ -399,7 +407,7 @@
for (int i = 0; i < N; i++) {
mSignalExtractors[i].setConfig(this);
}
- mRankingHandler.requestSort(false);
+ mRankingHandler.requestSort();
}
public void sort(ArrayList<NotificationRecord> notificationList) {
@@ -419,8 +427,7 @@
record.setAuthoritativeRank(i);
final String groupKey = record.getGroupKey();
NotificationRecord existingProxy = mProxyByGroupTmp.get(groupKey);
- if (existingProxy == null
- || record.getImportance() > existingProxy.getImportance()) {
+ if (existingProxy == null) {
mProxyByGroupTmp.put(groupKey, record);
}
}
@@ -467,26 +474,6 @@
return Collections.binarySearch(notificationList, target, mFinalComparator);
}
- private static boolean safeBool(XmlPullParser parser, String att, boolean defValue) {
- final String value = parser.getAttributeValue(null, att);
- if (TextUtils.isEmpty(value)) return defValue;
- return Boolean.parseBoolean(value);
- }
-
- private static int safeInt(XmlPullParser parser, String att, int defValue) {
- final String val = parser.getAttributeValue(null, att);
- return tryParseInt(val, defValue);
- }
-
- private static int tryParseInt(String value, int defValue) {
- if (TextUtils.isEmpty(value)) return defValue;
- try {
- return Integer.parseInt(value);
- } catch (NumberFormatException e) {
- return defValue;
- }
- }
-
/**
* Gets importance.
*/
@@ -531,7 +518,6 @@
MetricsLogger.action(getChannelGroupLog(group.getId(), pkg));
}
r.groups.put(group.getId(), group);
- updateConfig();
}
@Override
@@ -567,6 +553,13 @@
existing.setDescription(channel.getDescription());
existing.setBlockableSystem(channel.isBlockableSystem());
+ // Apps are allowed to downgrade channel importance if the user has not changed any
+ // fields on this channel yet.
+ if (existing.getUserLockedFields() == 0 &&
+ channel.getImportance() < existing.getImportance()) {
+ existing.setImportance(channel.getImportance());
+ }
+
updateConfig();
return;
}
@@ -589,7 +582,6 @@
r.channels.put(channel.getId(), channel);
MetricsLogger.action(getChannelLog(channel, pkg).setType(
MetricsProto.MetricsEvent.TYPE_OPEN));
- updateConfig();
}
void clearLockedFields(NotificationChannel channel) {
@@ -661,7 +653,6 @@
LogMaker lm = getChannelLog(channel, pkg);
lm.setType(MetricsProto.MetricsEvent.TYPE_CLOSE);
MetricsLogger.action(lm);
- updateConfig();
}
}
@@ -675,7 +666,6 @@
return;
}
r.channels.remove(channelId);
- updateConfig();
}
@Override
@@ -692,7 +682,6 @@
r.channels.remove(key);
}
}
- updateConfig();
}
public NotificationChannelGroup getNotificationChannelGroup(String groupId, String pkg,
@@ -755,7 +744,6 @@
deletedChannels.add(nc);
}
}
- updateConfig();
return deletedChannels;
}
@@ -1170,7 +1158,7 @@
changed |= oldValue != newValue;
}
if (changed) {
- mRankingHandler.requestSort(false);
+ mRankingHandler.requestSort();
}
}
diff --git a/services/core/java/com/android/server/notification/ZenModeFiltering.java b/services/core/java/com/android/server/notification/ZenModeFiltering.java
index cbaad46..a7a2743 100644
--- a/services/core/java/com/android/server/notification/ZenModeFiltering.java
+++ b/services/core/java/com/android/server/notification/ZenModeFiltering.java
@@ -104,9 +104,6 @@
}
public boolean shouldIntercept(int zen, ZenModeConfig config, NotificationRecord record) {
- if (isSystem(record)) {
- return false;
- }
switch (zen) {
case Global.ZEN_MODE_NO_INTERRUPTIONS:
// #notevenalarms
@@ -177,10 +174,6 @@
return false;
}
- private static boolean isSystem(NotificationRecord record) {
- return record.isCategory(Notification.CATEGORY_SYSTEM);
- }
-
private static boolean isAlarm(NotificationRecord record) {
return record.isCategory(Notification.CATEGORY_ALARM)
|| record.isAudioStream(AudioManager.STREAM_ALARM)
diff --git a/services/core/java/com/android/server/pm/BackgroundDexOptService.java b/services/core/java/com/android/server/pm/BackgroundDexOptService.java
index 6749afb..415c9a9 100644
--- a/services/core/java/com/android/server/pm/BackgroundDexOptService.java
+++ b/services/core/java/com/android/server/pm/BackgroundDexOptService.java
@@ -18,7 +18,6 @@
import static com.android.server.pm.PackageManagerService.DEBUG_DEXOPT;
-import android.app.AlarmManager;
import android.app.job.JobInfo;
import android.app.job.JobParameters;
import android.app.job.JobScheduler;
@@ -38,8 +37,10 @@
import com.android.server.pm.dex.DexManager;
import com.android.server.LocalServices;
import com.android.server.PinnerService;
+import com.android.server.pm.dex.DexoptOptions;
import java.io.File;
+import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.TimeUnit;
@@ -73,6 +74,9 @@
// Optimizations should be aborted. No space left on device.
private static final int OPTIMIZE_ABORT_NO_SPACE_LEFT = 3;
+ // Used for calculating space threshold for downgrading unused apps.
+ private static final int LOW_THRESHOLD_MULTIPLIER_FOR_DOWNGRADE = 2;
+
/**
* Set of failed packages remembered across job runs.
*/
@@ -92,7 +96,14 @@
private final File mDataDir = Environment.getDataDirectory();
+ private static final long mDowngradeUnusedAppsThresholdInMillis =
+ getDowngradeUnusedAppsThresholdInMillis();
+
public static void schedule(Context context) {
+ if (isBackgroundDexoptDisabled()) {
+ return;
+ }
+
JobScheduler js = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
// Schedule a one-off job which scans installed packages and updates
@@ -211,11 +222,10 @@
// Unfortunately this will also means that "pm.dexopt.boot=speed-profile" will
// behave differently than "pm.dexopt.bg-dexopt=speed-profile" but that's a
// trade-off worth doing to save boot time work.
- int result = pm.performDexOptWithStatus(pkg,
- /* checkProfiles */ false,
+ int result = pm.performDexOptWithStatus(new DexoptOptions(
+ pkg,
PackageManagerService.REASON_BOOT,
- /* force */ false,
- /* bootComplete */ true);
+ DexoptOptions.DEXOPT_BOOT_COMPLETE));
if (result == PackageDexOptimizer.DEX_OPT_PERFORMED) {
updatedPackages.add(pkg);
}
@@ -243,7 +253,8 @@
}
// Optimize the given packages and return the optimization result (one of the OPTIMIZE_* codes).
- private int idleOptimization(PackageManagerService pm, ArraySet<String> pkgs, Context context) {
+ private int idleOptimization(PackageManagerService pm, ArraySet<String> pkgs,
+ Context context) {
Log.i(TAG, "Performing idle optimizations");
// If post-boot update is still running, request that it exits early.
mExitPostBootUpdate.set(true);
@@ -274,9 +285,16 @@
long lowStorageThreshold, boolean is_for_primary_dex,
ArraySet<String> failedPackageNames) {
ArraySet<String> updatedPackages = new ArraySet<>();
+ Set<String> unusedPackages = pm.getUnusedPackages(mDowngradeUnusedAppsThresholdInMillis);
+ // Only downgrade apps when space is low on device.
+ // Threshold is selected above the lowStorageThreshold so that we can pro-actively clean
+ // up disk before user hits the actual lowStorageThreshold.
+ final long lowStorageThresholdForDowngrade = LOW_THRESHOLD_MULTIPLIER_FOR_DOWNGRADE *
+ lowStorageThreshold;
+ boolean shouldDowngrade = shouldDowngrade(lowStorageThresholdForDowngrade);
for (String pkg : pkgs) {
int abort_code = abortIdleOptimizations(lowStorageThreshold);
- if (abort_code != OPTIMIZE_CONTINUE) {
+ if (abort_code == OPTIMIZE_ABORT_BY_JOB_SCHEDULER) {
return abort_code;
}
@@ -284,30 +302,57 @@
if (failedPackageNames.contains(pkg)) {
// Skip previously failing package
continue;
- } else {
- // Conservatively add package to the list of failing ones in case performDexOpt
- // never returns.
- failedPackageNames.add(pkg);
}
}
+ int reason;
+ boolean downgrade;
+ // Downgrade unused packages.
+ if (unusedPackages.contains(pkg) && shouldDowngrade) {
+ // This applies for system apps or if packages location is not a directory, i.e.
+ // monolithic install.
+ if (is_for_primary_dex && !pm.canHaveOatDir(pkg)) {
+ // For apps that don't have the oat directory, instead of downgrading,
+ // remove their compiler artifacts from dalvik cache.
+ pm.deleteOatArtifactsOfPackage(pkg);
+ continue;
+ } else {
+ reason = PackageManagerService.REASON_INACTIVE_PACKAGE_DOWNGRADE;
+ downgrade = true;
+ }
+ } else if (abort_code != OPTIMIZE_ABORT_NO_SPACE_LEFT) {
+ reason = PackageManagerService.REASON_BACKGROUND_DEXOPT;
+ downgrade = false;
+ } else {
+ // can't dexopt because of low space.
+ continue;
+ }
+
+ synchronized (failedPackageNames) {
+ // Conservatively add package to the list of failing ones in case
+ // performDexOpt never returns.
+ failedPackageNames.add(pkg);
+ }
+
// Optimize package if needed. Note that there can be no race between
// concurrent jobs because PackageDexOptimizer.performDexOpt is synchronized.
boolean success;
+ int dexoptFlags =
+ DexoptOptions.DEXOPT_CHECK_FOR_PROFILES_UPDATES |
+ DexoptOptions.DEXOPT_BOOT_COMPLETE |
+ (downgrade ? DexoptOptions.DEXOPT_DOWNGRADE : 0);
if (is_for_primary_dex) {
- int result = pm.performDexOptWithStatus(pkg,
- /* checkProfiles */ true,
+ int result = pm.performDexOptWithStatus(new DexoptOptions(pkg,
PackageManagerService.REASON_BACKGROUND_DEXOPT,
- /* force */ false,
- /* bootComplete */ true);
+ dexoptFlags));
success = result != PackageDexOptimizer.DEX_OPT_FAILED;
if (result == PackageDexOptimizer.DEX_OPT_PERFORMED) {
updatedPackages.add(pkg);
}
} else {
- success = pm.performDexOptSecondary(pkg,
+ success = pm.performDexOpt(new DexoptOptions(pkg,
PackageManagerService.REASON_BACKGROUND_DEXOPT,
- /* force */ false);
+ dexoptFlags | DexoptOptions.DEXOPT_ONLY_SECONDARY_DEX));
}
if (success) {
// Dexopt succeeded, remove package from the list of failing ones.
@@ -347,6 +392,16 @@
return OPTIMIZE_CONTINUE;
}
+ // Evaluate whether apps should be downgraded.
+ private boolean shouldDowngrade(long lowStorageThresholdForDowngrade) {
+ long usableSpace = mDataDir.getUsableSpace();
+ if (usableSpace < lowStorageThresholdForDowngrade) {
+ return true;
+ }
+
+ return false;
+ }
+
/**
* Execute the idle optimizations immediately.
*/
@@ -415,4 +470,19 @@
pinnerService.update(updatedPackages);
}
}
+
+ private static long getDowngradeUnusedAppsThresholdInMillis() {
+ final String sysPropKey = "pm.dexopt.downgrade_after_inactive_days";
+ String sysPropValue = SystemProperties.get(sysPropKey);
+ if (sysPropValue == null || sysPropValue.isEmpty()) {
+ Log.w(TAG, "SysProp " + sysPropKey + " not set");
+ return Long.MAX_VALUE;
+ }
+ return TimeUnit.DAYS.toMillis(Long.parseLong(sysPropValue));
+ }
+
+ private static boolean isBackgroundDexoptDisabled() {
+ return SystemProperties.getBoolean("pm.dexopt.disable_bg_dexopt" /* key */,
+ false /* default */);
+ }
}
diff --git a/services/core/java/com/android/server/pm/EphemeralResolverConnection.java b/services/core/java/com/android/server/pm/EphemeralResolverConnection.java
index 562ab33..4600c32 100644
--- a/services/core/java/com/android/server/pm/EphemeralResolverConnection.java
+++ b/services/core/java/com/android/server/pm/EphemeralResolverConnection.java
@@ -56,9 +56,9 @@
private static final String TAG = "PackageManager";
// This is running in a critical section and the timeout must be sufficiently low
private static final long BIND_SERVICE_TIMEOUT_MS =
- ("eng".equals(Build.TYPE)) ? 500 : 300;
+ Build.IS_ENG ? 500 : 300;
private static final long CALL_SERVICE_TIMEOUT_MS =
- ("eng".equals(Build.TYPE)) ? 200 : 100;
+ Build.IS_ENG ? 200 : 100;
private static final boolean DEBUG_EPHEMERAL = Build.IS_DEBUGGABLE;
private final Object mLock = new Object();
diff --git a/services/core/java/com/android/server/pm/Installer.java b/services/core/java/com/android/server/pm/Installer.java
index 5c4c040..371b3ef 100644
--- a/services/core/java/com/android/server/pm/Installer.java
+++ b/services/core/java/com/android/server/pm/Installer.java
@@ -258,7 +258,7 @@
public long[] getExternalSize(String uuid, int userId, int flags, int[] appIds)
throws InstallerException {
- if (!checkBeforeRemote()) return new long[4];
+ if (!checkBeforeRemote()) return new long[6];
try {
return mInstalld.getExternalSize(uuid, userId, flags, appIds);
} catch (Exception e) {
@@ -279,13 +279,13 @@
public void dexopt(String apkPath, int uid, @Nullable String pkgName, String instructionSet,
int dexoptNeeded, @Nullable String outputPath, int dexFlags,
String compilerFilter, @Nullable String volumeUuid, @Nullable String sharedLibraries,
- @Nullable String seInfo)
+ @Nullable String seInfo, boolean downgrade)
throws InstallerException {
assertValidInstructionSet(instructionSet);
if (!checkBeforeRemote()) return;
try {
mInstalld.dexopt(apkPath, uid, pkgName, instructionSet, dexoptNeeded, outputPath,
- dexFlags, compilerFilter, volumeUuid, sharedLibraries, seInfo);
+ dexFlags, compilerFilter, volumeUuid, sharedLibraries, seInfo, downgrade);
} catch (Exception e) {
throw InstallerException.from(e);
}
diff --git a/services/core/java/com/android/server/pm/OtaDexoptService.java b/services/core/java/com/android/server/pm/OtaDexoptService.java
index 54ca6b9..241d76f 100644
--- a/services/core/java/com/android/server/pm/OtaDexoptService.java
+++ b/services/core/java/com/android/server/pm/OtaDexoptService.java
@@ -18,7 +18,6 @@
import static com.android.server.pm.InstructionSets.getAppDexInstructionSets;
import static com.android.server.pm.InstructionSets.getDexCodeInstructionSets;
-import static com.android.server.pm.PackageManagerServiceCompilerMapping.getCompilerFilterForReason;
import android.annotation.Nullable;
import android.content.Context;
@@ -30,17 +29,16 @@
import android.os.ServiceManager;
import android.os.ShellCallback;
import android.os.storage.StorageManager;
-import android.text.TextUtils;
import android.util.Log;
import android.util.Slog;
import com.android.internal.logging.MetricsLogger;
import com.android.server.pm.Installer.InstallerException;
+import com.android.server.pm.dex.DexoptOptions;
import java.io.File;
import java.io.FileDescriptor;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.TimeUnit;
@@ -152,7 +150,7 @@
Log.i(TAG, "Low on space, deleting oat files in an attempt to free up space: "
+ PackageManagerServiceUtils.packagesToString(others));
for (PackageParser.Package pkg : others) {
- deleteOatArtifactsOfPackage(pkg);
+ mPackageManagerService.deleteOatArtifactsOfPackage(pkg.packageName);
}
}
long spaceAvailableNow = getAvailableSpace();
@@ -242,30 +240,6 @@
return usableSpace - lowThreshold;
}
- private static String getOatDir(PackageParser.Package pkg) {
- if (!pkg.canHaveOatDir()) {
- return null;
- }
- File codePath = new File(pkg.codePath);
- if (codePath.isDirectory()) {
- return PackageDexOptimizer.getOatDir(codePath).getAbsolutePath();
- }
- return null;
- }
-
- private void deleteOatArtifactsOfPackage(PackageParser.Package pkg) {
- String[] instructionSets = getAppDexInstructionSets(pkg.applicationInfo);
- for (String codePath : pkg.getAllCodePaths()) {
- for (String isa : instructionSets) {
- try {
- mPackageManagerService.mInstaller.deleteOdex(codePath, isa, getOatDir(pkg));
- } catch (InstallerException e) {
- Log.e(TAG, "Failed deleting oat files for " + codePath, e);
- }
- }
- }
- }
-
/**
* Generate all dexopt commands for the given package.
*/
@@ -285,11 +259,12 @@
public void dexopt(String apkPath, int uid, @Nullable String pkgName,
String instructionSet, int dexoptNeeded, @Nullable String outputPath,
int dexFlags, String compilerFilter, @Nullable String volumeUuid,
- @Nullable String sharedLibraries, @Nullable String seInfo) throws InstallerException {
+ @Nullable String sharedLibraries, @Nullable String seInfo, boolean downgrade)
+ throws InstallerException {
final StringBuilder builder = new StringBuilder();
- // The version. Right now it's 2.
- builder.append("2 ");
+ // The version. Right now it's 3.
+ builder.append("3 ");
builder.append("dexopt");
@@ -304,6 +279,7 @@
encodeParameter(builder, volumeUuid);
encodeParameter(builder, sharedLibraries);
encodeParameter(builder, seInfo);
+ encodeParameter(builder, downgrade);
commands.add(builder.toString());
}
@@ -338,12 +314,18 @@
libraryDependencies = NO_LIBRARIES;
}
+
optimizer.performDexOpt(pkg, libraryDependencies,
- null /* ISAs */, false /* checkProfiles */,
- getCompilerFilterForReason(compilationReason),
+ null /* ISAs */,
null /* CompilerStats.PackageStats */,
mPackageManagerService.getDexManager().isUsedByOtherApps(pkg.packageName),
- true /* bootComplete */);
+ new DexoptOptions(pkg.packageName, compilationReason,
+ DexoptOptions.DEXOPT_BOOT_COMPLETE));
+
+ mPackageManagerService.getDexManager().dexoptSecondaryDex(
+ new DexoptOptions(pkg.packageName, compilationReason,
+ DexoptOptions.DEXOPT_ONLY_SECONDARY_DEX |
+ DexoptOptions.DEXOPT_BOOT_COMPLETE));
return commands;
}
diff --git a/services/core/java/com/android/server/pm/PackageDexOptimizer.java b/services/core/java/com/android/server/pm/PackageDexOptimizer.java
index 2b7bd34..41bc7f2 100644
--- a/services/core/java/com/android/server/pm/PackageDexOptimizer.java
+++ b/services/core/java/com/android/server/pm/PackageDexOptimizer.java
@@ -19,9 +19,7 @@
import android.annotation.Nullable;
import android.content.Context;
import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageInfo;
import android.content.pm.PackageParser;
-import android.os.Environment;
import android.os.FileUtils;
import android.os.PowerManager;
import android.os.SystemClock;
@@ -29,11 +27,12 @@
import android.os.WorkSource;
import android.util.Log;
import android.util.Slog;
-import android.util.SparseArray;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.pm.Installer.InstallerException;
+import com.android.server.pm.dex.DexoptOptions;
+import com.android.server.pm.dex.DexoptUtils;
import java.io.File;
import java.io.IOException;
@@ -112,17 +111,16 @@
* synchronized on {@link #mInstallLock}.
*/
int performDexOpt(PackageParser.Package pkg, String[] sharedLibraries,
- String[] instructionSets, boolean checkProfiles, String targetCompilationFilter,
- CompilerStats.PackageStats packageStats, boolean isUsedByOtherApps,
- boolean bootComplete) {
+ String[] instructionSets, CompilerStats.PackageStats packageStats,
+ boolean isUsedByOtherApps, DexoptOptions options) {
if (!canOptimizePackage(pkg)) {
return DEX_OPT_SKIPPED;
}
synchronized (mInstallLock) {
final long acquireTime = acquireWakeLockLI(pkg.applicationInfo.uid);
try {
- return performDexOptLI(pkg, sharedLibraries, instructionSets, checkProfiles,
- targetCompilationFilter, packageStats, isUsedByOtherApps, bootComplete);
+ return performDexOptLI(pkg, sharedLibraries, instructionSets,
+ packageStats, isUsedByOtherApps, options);
} finally {
releaseWakeLockLI(acquireTime);
}
@@ -135,9 +133,8 @@
*/
@GuardedBy("mInstallLock")
private int performDexOptLI(PackageParser.Package pkg, String[] sharedLibraries,
- String[] targetInstructionSets, boolean checkForProfileUpdates,
- String targetCompilerFilter, CompilerStats.PackageStats packageStats,
- boolean isUsedByOtherApps, boolean bootComplete) {
+ String[] targetInstructionSets, CompilerStats.PackageStats packageStats,
+ boolean isUsedByOtherApps, DexoptOptions options) {
final String[] instructionSets = targetInstructionSets != null ?
targetInstructionSets : getAppDexInstructionSets(pkg.applicationInfo);
final String[] dexCodeInstructionSets = getDexCodeInstructionSets(instructionSets);
@@ -145,16 +142,18 @@
final int sharedGid = UserHandle.getSharedAppGid(pkg.applicationInfo.uid);
final String compilerFilter = getRealCompilerFilter(pkg.applicationInfo,
- targetCompilerFilter, isUsedByOtherApps);
- final boolean profileUpdated = checkForProfileUpdates &&
+ options.getCompilerFilter(), isUsedByOtherApps);
+ final boolean profileUpdated = options.isCheckForProfileUpdates() &&
isProfileUpdated(pkg, sharedGid, compilerFilter);
- final String sharedLibrariesPath = getSharedLibrariesPath(sharedLibraries);
// Get the dexopt flags after getRealCompilerFilter to make sure we get the correct flags.
- final int dexoptFlags = getDexFlags(pkg, compilerFilter, bootComplete);
- // Get the dependencies of each split in the package. For each code path in the package,
- // this array contains the relative paths of each split it depends on, separated by colons.
- String[] splitDependencies = getSplitDependencies(pkg);
+ final int dexoptFlags = getDexFlags(pkg, compilerFilter, options.isBootComplete());
+
+ // Get the class loader context dependencies.
+ // For each code path in the package, this array contains the class loader context that
+ // needs to be passed to dexopt in order to ensure correct optimizations.
+ String[] classLoaderContexts = DexoptUtils.getClassLoaderContexts(
+ pkg.applicationInfo, sharedLibraries);
int result = DEX_OPT_SKIPPED;
for (int i = 0; i < paths.size(); i++) {
@@ -165,16 +164,18 @@
}
// Append shared libraries with split dependencies for this split.
String path = paths.get(i);
- String sharedLibrariesPathWithSplits;
- if (sharedLibrariesPath != null && splitDependencies[i] != null) {
- sharedLibrariesPathWithSplits = sharedLibrariesPath + ":" + splitDependencies[i];
- } else {
- sharedLibrariesPathWithSplits =
- splitDependencies[i] != null ? splitDependencies[i] : sharedLibrariesPath;
+ if (options.getSplitName() != null) {
+ // We are asked to compile only a specific split. Check that the current path is
+ // what we are looking for.
+ if (!options.getSplitName().equals(new File(path).getName())) {
+ continue;
+ }
}
+
for (String dexCodeIsa : dexCodeInstructionSets) {
- int newResult = dexOptPath(pkg, path, dexCodeIsa, compilerFilter, profileUpdated,
- sharedLibrariesPathWithSplits, dexoptFlags, sharedGid, packageStats);
+ int newResult = dexOptPath(pkg, path, dexCodeIsa, compilerFilter,
+ profileUpdated, classLoaderContexts[i], dexoptFlags, sharedGid,
+ packageStats, options.isDowngrade());
// The end result is:
// - FAILED if any path failed,
// - PERFORMED if at least one path needed compilation,
@@ -198,8 +199,8 @@
@GuardedBy("mInstallLock")
private int dexOptPath(PackageParser.Package pkg, String path, String isa,
String compilerFilter, boolean profileUpdated, String sharedLibrariesPath,
- int dexoptFlags, int uid, CompilerStats.PackageStats packageStats) {
- int dexoptNeeded = getDexoptNeeded(path, isa, compilerFilter, profileUpdated);
+ int dexoptFlags, int uid, CompilerStats.PackageStats packageStats, boolean downgrade) {
+ int dexoptNeeded = getDexoptNeeded(path, isa, compilerFilter, profileUpdated, downgrade);
if (Math.abs(dexoptNeeded) == DexFile.NO_DEXOPT_NEEDED) {
return DEX_OPT_SKIPPED;
}
@@ -218,8 +219,12 @@
try {
long startTime = System.currentTimeMillis();
+ // TODO: Consider adding 2 different APIs for primary and secondary dexopt.
+ // installd only uses downgrade flag for secondary dex files and ignores it for
+ // primary dex files.
mInstaller.dexopt(path, uid, pkg.packageName, isa, dexoptNeeded, oatDir, dexoptFlags,
- compilerFilter, pkg.volumeUuid, sharedLibrariesPath, pkg.applicationInfo.seInfo);
+ compilerFilter, pkg.volumeUuid, sharedLibrariesPath, pkg.applicationInfo.seInfo,
+ false /* downgrade*/);
if (packageStats != null) {
long endTime = System.currentTimeMillis();
@@ -247,12 +252,12 @@
* that seems wasteful.
*/
public int dexOptSecondaryDexPath(ApplicationInfo info, String path, Set<String> isas,
- String compilerFilter, boolean isUsedByOtherApps) {
+ String compilerFilter, boolean isUsedByOtherApps, boolean downgrade) {
synchronized (mInstallLock) {
final long acquireTime = acquireWakeLockLI(info.uid);
try {
return dexOptSecondaryDexPathLI(info, path, isas, compilerFilter,
- isUsedByOtherApps);
+ isUsedByOtherApps, downgrade);
} finally {
releaseWakeLockLI(acquireTime);
}
@@ -294,7 +299,7 @@
@GuardedBy("mInstallLock")
private int dexOptSecondaryDexPathLI(ApplicationInfo info, String path, Set<String> isas,
- String compilerFilter, boolean isUsedByOtherApps) {
+ String compilerFilter, boolean isUsedByOtherApps, boolean downgrade) {
compilerFilter = getRealCompilerFilter(info, compilerFilter, isUsedByOtherApps);
// Get the dexopt flags after getRealCompilerFilter to make sure we get the correct flags.
// Secondary dex files are currently not compiled at boot.
@@ -324,7 +329,8 @@
// TODO(calin): maybe add a separate call.
mInstaller.dexopt(path, info.uid, info.packageName, isa, /*dexoptNeeded*/ 0,
/*oatDir*/ null, dexoptFlags,
- compilerFilter, info.volumeUuid, SKIP_SHARED_LIBRARY_CHECK, info.seInfoUser);
+ compilerFilter, info.volumeUuid, SKIP_SHARED_LIBRARY_CHECK, info.seInfoUser,
+ downgrade);
}
return DEX_OPT_PERFORMED;
@@ -425,10 +431,11 @@
* configuration (isa, compiler filter, profile).
*/
private int getDexoptNeeded(String path, String isa, String compilerFilter,
- boolean newProfile) {
+ boolean newProfile, boolean downgrade) {
int dexoptNeeded;
try {
- dexoptNeeded = DexFile.getDexOptNeeded(path, isa, compilerFilter, newProfile);
+ dexoptNeeded = DexFile.getDexOptNeeded(path, isa, compilerFilter, newProfile,
+ downgrade);
} catch (IOException ioe) {
Slog.w(TAG, "IOException reading apk: " + path, ioe);
return DEX_OPT_FAILED;
@@ -437,86 +444,6 @@
}
/**
- * Computes the shared libraries path that should be passed to dexopt.
- */
- private String getSharedLibrariesPath(String[] sharedLibraries) {
- if (sharedLibraries == null || sharedLibraries.length == 0) {
- return null;
- }
- StringBuilder sb = new StringBuilder();
- for (String lib : sharedLibraries) {
- if (sb.length() != 0) {
- sb.append(":");
- }
- sb.append(lib);
- }
- return sb.toString();
- }
-
- /**
- * Walks dependency tree and gathers the dependencies for each split in a split apk.
- * The split paths are stored as relative paths, separated by colons.
- */
- private String[] getSplitDependencies(PackageParser.Package pkg) {
- // Convert all the code paths to relative paths.
- String baseCodePath = new File(pkg.baseCodePath).getParent();
- List<String> paths = pkg.getAllCodePaths();
- String[] splitDependencies = new String[paths.size()];
- for (int i = 0; i < paths.size(); i++) {
- File pathFile = new File(paths.get(i));
- String fileName = pathFile.getName();
- paths.set(i, fileName);
-
- // Sanity check that the base paths of the splits are all the same.
- String basePath = pathFile.getParent();
- if (!basePath.equals(baseCodePath)) {
- Slog.wtf(TAG, "Split paths have different base paths: " + basePath + " and " +
- baseCodePath);
- }
- }
-
- // If there are no other dependencies, fill in the implicit dependency on the base apk.
- SparseArray<int[]> dependencies = pkg.applicationInfo.splitDependencies;
- if (dependencies == null) {
- for (int i = 1; i < paths.size(); i++) {
- splitDependencies[i] = paths.get(0);
- }
- return splitDependencies;
- }
-
- // Fill in the dependencies, skipping the base apk which has no dependencies.
- for (int i = 1; i < dependencies.size(); i++) {
- getParentDependencies(dependencies.keyAt(i), paths, dependencies, splitDependencies);
- }
-
- return splitDependencies;
- }
-
- /**
- * Recursive method to generate dependencies for a particular split.
- * The index is a key from the package's splitDependencies.
- */
- private String getParentDependencies(int index, List<String> paths,
- SparseArray<int[]> dependencies, String[] splitDependencies) {
- // The base apk is always first, and has no dependencies.
- if (index == 0) {
- return null;
- }
- // Return the result if we've computed the dependencies for this index already.
- if (splitDependencies[index] != null) {
- return splitDependencies[index];
- }
- // Get the dependencies for the parent of this index and append its path to it.
- int parent = dependencies.get(index)[0];
- String parentDependencies =
- getParentDependencies(parent, paths, dependencies, splitDependencies);
- String path = parentDependencies == null ? paths.get(parent) :
- parentDependencies + ":" + paths.get(parent);
- splitDependencies[index] = path;
- return path;
- }
-
- /**
* Checks if there is an update on the profile information of the {@code pkg}.
* If the compiler filter is not profile guided the method returns false.
*
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index bf64f64..bab7011 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -615,6 +615,10 @@
params.installFlags &= ~PackageManager.INSTALL_FROM_ADB;
params.installFlags &= ~PackageManager.INSTALL_ALL_USERS;
params.installFlags |= PackageManager.INSTALL_REPLACE_EXISTING;
+ if ((params.installFlags & PackageManager.INSTALL_VIRTUAL_PRELOAD) != 0
+ && !mPm.isCallerVerifier(callingUid)) {
+ params.installFlags &= ~PackageManager.INSTALL_VIRTUAL_PRELOAD;
+ }
}
// Only system components can circumvent runtime permissions when installing.
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index 5c54ba8..5823771 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -927,7 +927,7 @@
// This is kind of hacky; we're creating a half-parsed package that is
// straddled between the inherited and staged APKs.
final PackageLite pkg = new PackageLite(null, baseApk, null, null, null, null,
- splitPaths.toArray(new String[splitPaths.size()]), null);
+ splitPaths.toArray(new String[splitPaths.size()]), null, null);
final boolean isForwardLocked =
(params.installFlags & PackageManager.INSTALL_FORWARD_LOCK) != 0;
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 5b24d8b..815d871 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -58,7 +58,6 @@
import static android.content.pm.PackageManager.INSTALL_FORWARD_LOCK;
import static android.content.pm.PackageManager.INSTALL_INTERNAL;
import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES;
-import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS;
import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK;
import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ASK;
@@ -78,6 +77,7 @@
import static android.content.pm.PackageManager.MOVE_FAILED_DEVICE_ADMIN;
import static android.content.pm.PackageManager.MOVE_FAILED_DOESNT_EXIST;
import static android.content.pm.PackageManager.MOVE_FAILED_INTERNAL_ERROR;
+import static android.content.pm.PackageManager.MOVE_FAILED_LOCKED_USER;
import static android.content.pm.PackageManager.MOVE_FAILED_OPERATION_PENDING;
import static android.content.pm.PackageManager.MOVE_FAILED_SYSTEM_PACKAGE;
import static android.content.pm.PackageManager.PERMISSION_DENIED;
@@ -87,6 +87,7 @@
import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER;
import static android.system.OsConstants.O_CREAT;
import static android.system.OsConstants.O_RDWR;
+
import static com.android.internal.app.IntentForwarderActivity.FORWARD_INTENT_TO_MANAGED_PROFILE;
import static com.android.internal.app.IntentForwarderActivity.FORWARD_INTENT_TO_PARENT;
import static com.android.internal.content.NativeLibraryHelper.LIB64_DIR_NAME;
@@ -102,6 +103,7 @@
import static com.android.server.pm.PermissionsState.PERMISSION_OPERATION_FAILURE;
import static com.android.server.pm.PermissionsState.PERMISSION_OPERATION_SUCCESS;
import static com.android.server.pm.PermissionsState.PERMISSION_OPERATION_SUCCESS_GIDS_CHANGED;
+
import static dalvik.system.DexFile.getNonProfileGuidedCompilerFilter;
import android.Manifest;
@@ -130,6 +132,7 @@
import android.content.pm.AppsQueryHelper;
import android.content.pm.AuxiliaryResolveInfo;
import android.content.pm.ChangedPackages;
+import android.content.pm.ComponentInfo;
import android.content.pm.FallbackCategoryProvider;
import android.content.pm.FeatureInfo;
import android.content.pm.IDexModuleRegisterCallback;
@@ -280,6 +283,8 @@
import com.android.server.pm.Settings.DatabaseVersion;
import com.android.server.pm.Settings.VersionInfo;
import com.android.server.pm.dex.DexManager;
+import com.android.server.pm.dex.DexoptOptions;
+import com.android.server.pm.dex.PackageDexUsage;
import com.android.server.storage.DeviceStorageMonitorInternal;
import dalvik.system.CloseGuard;
@@ -287,6 +292,7 @@
import dalvik.system.VMRuntime;
import libcore.io.IoUtils;
+import libcore.io.Streams;
import libcore.util.EmptyArray;
import org.xmlpull.v1.XmlPullParser;
@@ -304,6 +310,8 @@
import java.io.FileReader;
import java.io.FilenameFilter;
import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
import java.io.PrintWriter;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -335,6 +343,7 @@
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.zip.GZIPInputStream;
/**
* Keep track of all those APKs everywhere.
@@ -388,6 +397,7 @@
private static final boolean DEBUG_FILTERS = false;
private static final boolean DEBUG_PERMISSIONS = false;
private static final boolean DEBUG_SHARED_LIBRARIES = false;
+ private static final boolean DEBUG_COMPRESSION = Build.IS_DEBUGGABLE;
// Debug output for dexopting. This is shared between PackageManagerService, OtaDexoptService
// and PackageDexOptimizer. All these classes have their own flag to allow switching a single
@@ -442,6 +452,8 @@
static final int FLAGS_REMOVE_CHATTY = 1<<31;
private static final String STATIC_SHARED_LIB_DELIMITER = "_";
+ /** Extension of the compressed packages */
+ private final static String COMPRESSED_EXTENSION = ".gz";
private static final int[] EMPTY_INT_ARRAY = new int[0];
@@ -558,8 +570,9 @@
public static final int REASON_INSTALL = 2;
public static final int REASON_BACKGROUND_DEXOPT = 3;
public static final int REASON_AB_OTA = 4;
+ public static final int REASON_INACTIVE_PACKAGE_DOWNGRADE = 5;
- public static final int REASON_LAST = REASON_AB_OTA;
+ public static final int REASON_LAST = REASON_INACTIVE_PACKAGE_DOWNGRADE;
/** All dangerous permission names in the same order as the events in MetricsEvent */
private static final List<String> ALL_DANGEROUS_PERMISSIONS = Arrays.asList(
@@ -724,6 +737,9 @@
final ProtectedPackages mProtectedPackages;
+ @GuardedBy("mLoadedVolumes")
+ final ArraySet<String> mLoadedVolumes = new ArraySet<>();
+
boolean mFirstBoot;
PackageManagerInternal.ExternalSourcesPolicy mExternalSourcesPolicy;
@@ -922,7 +938,8 @@
final ArraySet<String> mTransferedPackages = new ArraySet<String>();
// Broadcast actions that are only available to the system.
- final ArraySet<String> mProtectedBroadcasts = new ArraySet<String>();
+ @GuardedBy("mProtectedBroadcasts")
+ final ArraySet<String> mProtectedBroadcasts = new ArraySet<>();
/** List of packages waiting for verification. */
final SparseArray<PackageVerificationState> mPendingVerification
@@ -1056,14 +1073,12 @@
scheduleWriteSettingsLocked();
}
}
- sendVerificationRequest(userId, verificationId, ivs);
+ sendVerificationRequest(verificationId, ivs);
}
mCurrentIntentFilterVerifications.clear();
}
- private void sendVerificationRequest(int userId, int verificationId,
- IntentFilterVerificationState ivs) {
-
+ private void sendVerificationRequest(int verificationId, IntentFilterVerificationState ivs) {
Intent verificationIntent = new Intent(Intent.ACTION_INTENT_FILTER_NEEDS_VERIFICATION);
verificationIntent.putExtra(
PackageManager.EXTRA_INTENT_FILTER_VERIFICATION_ID,
@@ -1083,10 +1098,9 @@
DeviceIdleController.LocalService idleController = getDeviceIdleController();
idleController.addPowerSaveTempWhitelistApp(Process.myUid(),
mIntentFilterVerifierComponent.getPackageName(), getVerificationTimeout(),
- userId, false, "intent filter verifier");
+ UserHandle.USER_SYSTEM, true, "intent filter verifier");
- UserHandle user = new UserHandle(userId);
- mContext.sendBroadcastAsUser(verificationIntent, user);
+ mContext.sendBroadcastAsUser(verificationIntent, UserHandle.SYSTEM);
if (DEBUG_DOMAIN_VERIFICATION) Slog.d(TAG,
"Sending IntentFilter verification broadcast");
}
@@ -1663,12 +1677,14 @@
& PackageManager.INSTALL_GRANT_RUNTIME_PERMISSIONS) != 0;
final boolean killApp = (args.installFlags
& PackageManager.INSTALL_DONT_KILL_APP) == 0;
+ final boolean virtualPreload = ((args.installFlags
+ & PackageManager.INSTALL_VIRTUAL_PRELOAD) != 0);
final String[] grantedPermissions = args.installGrantPermissions;
// Handle the parent package
handlePackagePostInstall(parentRes, grantPermissions, killApp,
- grantedPermissions, didRestore, args.installerPackageName,
- args.observer);
+ virtualPreload, grantedPermissions, didRestore,
+ args.installerPackageName, args.observer);
// Handle the child packages
final int childCount = (parentRes.addedChildPackages != null)
@@ -1676,8 +1692,8 @@
for (int i = 0; i < childCount; i++) {
PackageInstalledInfo childRes = parentRes.addedChildPackages.valueAt(i);
handlePackagePostInstall(childRes, grantPermissions, killApp,
- grantedPermissions, false, args.installerPackageName,
- args.observer);
+ virtualPreload, grantedPermissions, false /*didRestore*/,
+ args.installerPackageName, args.observer);
}
// Log tracing if needed
@@ -1888,7 +1904,7 @@
}
private void handlePackagePostInstall(PackageInstalledInfo res, boolean grantPermissions,
- boolean killApp, String[] grantedPermissions,
+ boolean killApp, boolean virtualPreload, String[] grantedPermissions,
boolean launchedForRestore, String installerPackage,
IPackageInstallObserver2 installObserver) {
if (res.returnCode == PackageManager.INSTALL_SUCCEEDED) {
@@ -1962,7 +1978,8 @@
// sendPackageAddedForNewUsers also deals with system apps
int appId = UserHandle.getAppId(res.uid);
boolean isSystem = res.pkg.applicationInfo.isSystemApp();
- sendPackageAddedForNewUsers(packageName, isSystem, appId, firstUsers);
+ sendPackageAddedForNewUsers(packageName, isSystem || virtualPreload,
+ virtualPreload /*startReceiver*/, appId, firstUsers);
// Send added for users that don't see the package for the first time
Bundle extras = new Bundle(1);
@@ -2624,9 +2641,21 @@
| PackageParser.PARSE_IS_SYSTEM_DIR, scanFlags, 0);
// Prune any system packages that no longer exist.
- final List<String> possiblyDeletedUpdatedSystemApps = new ArrayList<String>();
+ final List<String> possiblyDeletedUpdatedSystemApps = new ArrayList<>();
+ // Stub packages must either be replaced with full versions in the /data
+ // partition or be disabled.
+ final List<String> stubSystemApps = new ArrayList<>();
if (!mOnlyCore) {
- Iterator<PackageSetting> psit = mSettings.mPackages.values().iterator();
+ // do this first before mucking with mPackages for the "expecting better" case
+ final Iterator<PackageParser.Package> pkgIterator = mPackages.values().iterator();
+ while (pkgIterator.hasNext()) {
+ final PackageParser.Package pkg = pkgIterator.next();
+ if (pkg.isStub) {
+ stubSystemApps.add(pkg.packageName);
+ }
+ }
+
+ final Iterator<PackageSetting> psit = mSettings.mPackages.values().iterator();
while (psit.hasNext()) {
PackageSetting ps = psit.next();
@@ -2695,7 +2724,16 @@
// Remove any shared userIDs that have no associated packages
mSettings.pruneSharedUsersLPw();
-
+ final long systemScanTime = SystemClock.uptimeMillis() - startTime;
+ final int systemPackagesCount = mPackages.size();
+ Slog.i(TAG, "Finished scanning system apps. Time: " + systemScanTime
+ + " ms, packageCount: " + systemPackagesCount
+ + " ms, timePerPackage: "
+ + (systemPackagesCount == 0 ? 0 : systemScanTime / systemPackagesCount));
+ if (mIsUpgrade && systemPackagesCount > 0) {
+ MetricsLogger.histogram(null, "ota_package_manager_system_app_avg_scan_time",
+ ((int) systemScanTime) / systemPackagesCount);
+ }
if (!mOnlyCore) {
EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_DATA_SCAN_START,
SystemClock.uptimeMillis());
@@ -2705,36 +2743,37 @@
| PackageParser.PARSE_FORWARD_LOCK,
scanFlags | SCAN_REQUIRE_KNOWN, 0);
- /**
- * Remove disable package settings for any updated system
- * apps that were removed via an OTA. If they're not a
- * previously-updated app, remove them completely.
- * Otherwise, just revoke their system-level permissions.
- */
+ // Remove disable package settings for updated system apps that were
+ // removed via an OTA. If the update is no longer present, remove the
+ // app completely. Otherwise, revoke their system privileges.
for (String deletedAppName : possiblyDeletedUpdatedSystemApps) {
PackageParser.Package deletedPkg = mPackages.get(deletedAppName);
mSettings.removeDisabledSystemPackageLPw(deletedAppName);
- String msg;
+ final String msg;
if (deletedPkg == null) {
+ // should have found an update, but, we didn't; remove everything
msg = "Updated system package " + deletedAppName
- + " no longer exists; it's data will be wiped";
+ + " no longer exists; removing its data";
// Actual deletion of code and data will be handled by later
// reconciliation step
} else {
- msg = "Updated system app + " + deletedAppName
- + " no longer present; removing system privileges for "
- + deletedAppName;
+ // found an update; revoke system privileges
+ msg = "Updated system package + " + deletedAppName
+ + " no longer exists; revoking system privileges";
+ // Don't do anything if a stub is removed from the system image. If
+ // we were to remove the uncompressed version from the /data partition,
+ // this is where it'd be done.
+
+ final PackageSetting deletedPs = mSettings.mPackages.get(deletedAppName);
deletedPkg.applicationInfo.flags &= ~ApplicationInfo.FLAG_SYSTEM;
-
- PackageSetting deletedPs = mSettings.mPackages.get(deletedAppName);
deletedPs.pkgFlags &= ~ApplicationInfo.FLAG_SYSTEM;
}
logCriticalInfo(Log.WARN, msg);
}
- /**
+ /*
* Make sure all system apps that we expected to appear on
* the userdata partition actually showed up. If they never
* appeared, crawl back and revive the system version.
@@ -2776,6 +2815,21 @@
}
}
}
+
+ // Uncompress and install any stubbed system applications.
+ // This must be done last to ensure all stubs are replaced or disabled.
+ decompressSystemApplications(stubSystemApps, scanFlags);
+
+ final long dataScanTime = SystemClock.uptimeMillis() - systemScanTime - startTime;
+ final int dataPackagesCount = mPackages.size() - systemPackagesCount;
+ Slog.i(TAG, "Finished scanning non-system apps. Time: " + dataScanTime
+ + " ms, packageCount: " + dataPackagesCount
+ + " ms, timePerPackage: "
+ + (dataPackagesCount == 0 ? 0 : dataScanTime / dataPackagesCount));
+ if (mIsUpgrade && dataPackagesCount > 0) {
+ MetricsLogger.histogram(null, "ota_package_manager_data_app_avg_scan_time",
+ ((int) dataScanTime) / dataPackagesCount);
+ }
}
mExpectingBetter.clear();
@@ -3005,6 +3059,10 @@
userPackages.put(userId, getInstalledPackages(/*flags*/ 0, userId).getList());
}
mDexManager.load(userPackages);
+ if (mIsUpgrade) {
+ MetricsLogger.histogram(null, "ota_package_manager_init_time",
+ (int) (SystemClock.uptimeMillis() - startTime));
+ }
} // synchronized (mPackages)
} // synchronized (mInstallLock)
@@ -3029,6 +3087,174 @@
Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
}
+ /**
+ * Uncompress and install stub applications.
+ * <p>In order to save space on the system partition, some applications are shipped in a
+ * compressed form. In addition the compressed bits for the full application, the
+ * system image contains a tiny stub comprised of only the Android manifest.
+ * <p>During the first boot, attempt to uncompress and install the full application. If
+ * the application can't be installed for any reason, disable the stub and prevent
+ * uncompressing the full application during future boots.
+ * <p>In order to forcefully attempt an installation of a full application, go to app
+ * settings and enable the application.
+ */
+ private void decompressSystemApplications(@NonNull List<String> stubSystemApps, int scanFlags) {
+ for (int i = stubSystemApps.size() - 1; i >= 0; --i) {
+ final String pkgName = stubSystemApps.get(i);
+ // skip if the system package is already disabled
+ if (mSettings.isDisabledSystemPackageLPr(pkgName)) {
+ stubSystemApps.remove(i);
+ continue;
+ }
+ // skip if the package isn't installed (?!); this should never happen
+ final PackageParser.Package pkg = mPackages.get(pkgName);
+ if (pkg == null) {
+ stubSystemApps.remove(i);
+ continue;
+ }
+ // skip if the package has been disabled by the user
+ final PackageSetting ps = mSettings.mPackages.get(pkgName);
+ if (ps != null) {
+ final int enabledState = ps.getEnabled(UserHandle.USER_SYSTEM);
+ if (enabledState == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) {
+ stubSystemApps.remove(i);
+ continue;
+ }
+ }
+
+ if (DEBUG_COMPRESSION) {
+ Slog.i(TAG, "Uncompressing system stub; pkg: " + pkgName);
+ }
+
+ // uncompress the binary to its eventual destination on /data
+ final File scanFile = decompressPackage(pkg);
+ if (scanFile == null) {
+ continue;
+ }
+
+ // install the package to replace the stub on /system
+ try {
+ mSettings.disableSystemPackageLPw(pkgName, true /*replaced*/);
+ removePackageLI(pkg, true /*chatty*/);
+ scanPackageTracedLI(scanFile, 0 /*reparseFlags*/, scanFlags, 0, null);
+ ps.setEnabled(PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
+ UserHandle.USER_SYSTEM, "android");
+ stubSystemApps.remove(i);
+ continue;
+ } catch (PackageManagerException e) {
+ Slog.e(TAG, "Failed to parse uncompressed system package: " + e.getMessage());
+ }
+
+ // any failed attempt to install the package will be cleaned up later
+ }
+
+ // disable any stub still left; these failed to install the full application
+ for (int i = stubSystemApps.size() - 1; i >= 0; --i) {
+ final String pkgName = stubSystemApps.get(i);
+ final PackageSetting ps = mSettings.mPackages.get(pkgName);
+ ps.setEnabled(PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
+ UserHandle.USER_SYSTEM, "android");
+ logCriticalInfo(Log.ERROR, "Stub disabled; pkg: " + pkgName);
+ }
+ }
+
+ private int decompressFile(File srcFile, File dstFile) throws ErrnoException {
+ if (DEBUG_COMPRESSION) {
+ Slog.i(TAG, "Decompress file"
+ + "; src: " + srcFile.getAbsolutePath()
+ + ", dst: " + dstFile.getAbsolutePath());
+ }
+ try (
+ InputStream fileIn = new GZIPInputStream(new FileInputStream(srcFile));
+ OutputStream fileOut = new FileOutputStream(dstFile, false /*append*/);
+ ) {
+ Streams.copy(fileIn, fileOut);
+ Os.chmod(dstFile.getAbsolutePath(), 0644);
+ return PackageManager.INSTALL_SUCCEEDED;
+ } catch (IOException e) {
+ logCriticalInfo(Log.ERROR, "Failed to decompress file"
+ + "; src: " + srcFile.getAbsolutePath()
+ + ", dst: " + dstFile.getAbsolutePath());
+ }
+ return PackageManager.INSTALL_FAILED_INTERNAL_ERROR;
+ }
+
+ private File[] getCompressedFiles(String codePath) {
+ return new File(codePath).listFiles(new FilenameFilter() {
+ @Override
+ public boolean accept(File dir, String name) {
+ return name.toLowerCase().endsWith(COMPRESSED_EXTENSION);
+ }
+ });
+ }
+
+ private boolean compressedFileExists(String codePath) {
+ final File[] compressedFiles = getCompressedFiles(codePath);
+ return compressedFiles != null && compressedFiles.length > 0;
+ }
+
+ /**
+ * Decompresses the given package on the system image onto
+ * the /data partition.
+ * @return The directory the package was decompressed into. Otherwise, {@code null}.
+ */
+ private File decompressPackage(PackageParser.Package pkg) {
+ final File[] compressedFiles = getCompressedFiles(pkg.codePath);
+ if (compressedFiles == null || compressedFiles.length == 0) {
+ if (DEBUG_COMPRESSION) {
+ Slog.i(TAG, "No files to decompress");
+ }
+ return null;
+ }
+ final File dstCodePath =
+ getNextCodePath(Environment.getDataAppDirectory(null), pkg.packageName);
+ int ret = PackageManager.INSTALL_SUCCEEDED;
+ try {
+ Os.mkdir(dstCodePath.getAbsolutePath(), 0755);
+ Os.chmod(dstCodePath.getAbsolutePath(), 0755);
+ for (File srcFile : compressedFiles) {
+ final String srcFileName = srcFile.getName();
+ final String dstFileName = srcFileName.substring(
+ 0, srcFileName.length() - COMPRESSED_EXTENSION.length());
+ final File dstFile = new File(dstCodePath, dstFileName);
+ ret = decompressFile(srcFile, dstFile);
+ if (ret != PackageManager.INSTALL_SUCCEEDED) {
+ logCriticalInfo(Log.ERROR, "Failed to decompress"
+ + "; pkg: " + pkg.packageName
+ + ", file: " + dstFileName);
+ break;
+ }
+ }
+ } catch (ErrnoException e) {
+ logCriticalInfo(Log.ERROR, "Failed to decompress"
+ + "; pkg: " + pkg.packageName
+ + ", err: " + e.errno);
+ }
+ if (ret == PackageManager.INSTALL_SUCCEEDED) {
+ final File libraryRoot = new File(dstCodePath, LIB_DIR_NAME);
+ NativeLibraryHelper.Handle handle = null;
+ try {
+ handle = NativeLibraryHelper.Handle.create(dstCodePath);
+ ret = NativeLibraryHelper.copyNativeBinariesWithOverride(handle, libraryRoot,
+ null /*abiOverride*/);
+ } catch (IOException e) {
+ logCriticalInfo(Log.ERROR, "Failed to extract native libraries"
+ + "; pkg: " + pkg.packageName);
+ ret = PackageManager.INSTALL_FAILED_INTERNAL_ERROR;
+ } finally {
+ IoUtils.closeQuietly(handle);
+ }
+ }
+ if (ret != PackageManager.INSTALL_SUCCEEDED) {
+ if (dstCodePath == null || !dstCodePath.exists()) {
+ return null;
+ }
+ removeCodePathLI(dstCodePath);
+ return null;
+ }
+ return dstCodePath;
+ }
+
private void updateInstantAppInstallerLocked(String modifiedPackage) {
// we're only interested in updating the installer appliction when 1) it's not
// already set or 2) the modified package is the installer
@@ -3046,7 +3272,7 @@
}
// Disable package parsing on eng builds to allow for faster incremental development.
- if ("eng".equals(Build.TYPE)) {
+ if (Build.IS_ENG) {
return null;
}
@@ -3081,7 +3307,7 @@
// NOTE: When no BUILD_NUMBER is set by the build system, it defaults to a build
// that starts with "eng." to signify that this is an engineering build and not
// destined for release.
- if ("userdebug".equals(Build.TYPE) && Build.VERSION.INCREMENTAL.startsWith("eng.")) {
+ if (Build.IS_USERDEBUG && Build.VERSION.INCREMENTAL.startsWith("eng.")) {
Slog.w(TAG, "Wiping cache directory because the system partition changed.");
// Heuristic: If the /system directory has been modified recently due to an "adb sync"
@@ -5573,7 +5799,7 @@
if (eventIdIndex == -1) {
if (AppOpsManager.permissionToOpCode(name) == AppOpsManager.OP_NONE
- || "user".equals(Build.TYPE)) {
+ || Build.IS_USER) {
Log.i(TAG, "Unknown permission " + name);
return MetricsEvent.ACTION_PERMISSION_REQUEST_UNKNOWN;
@@ -5847,7 +6073,7 @@
@Override
public boolean isProtectedBroadcast(String actionName) {
// allow instant applications
- synchronized (mPackages) {
+ synchronized (mProtectedBroadcasts) {
if (mProtectedBroadcasts.contains(actionName)) {
return true;
} else if (actionName != null) {
@@ -7223,34 +7449,31 @@
String ephemeralPkgName) {
for (int i = resolveInfos.size() - 1; i >= 0; i--) {
final ResolveInfo info = resolveInfos.get(i);
- final boolean isEphemeralApp = info.activityInfo.applicationInfo.isInstantApp();
// TODO: When adding on-demand split support for non-instant apps, remove this check
// and always apply post filtering
// allow activities that are defined in the provided package
- if (isEphemeralApp) {
- if (info.activityInfo.splitName != null
- && !ArrayUtils.contains(info.activityInfo.applicationInfo.splitNames,
- info.activityInfo.splitName)) {
- // requested activity is defined in a split that hasn't been installed yet.
- // add the installer to the resolve list
- if (DEBUG_EPHEMERAL) {
- Slog.v(TAG, "Adding ephemeral installer to the ResolveInfo list");
- }
- final ResolveInfo installerInfo = new ResolveInfo(mInstantAppInstallerInfo);
- installerInfo.auxiliaryInfo = new AuxiliaryResolveInfo(
- info.activityInfo.packageName, info.activityInfo.splitName,
- info.activityInfo.applicationInfo.versionCode, null /*failureIntent*/);
- // make sure this resolver is the default
- installerInfo.isDefault = true;
- installerInfo.match = IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART
- | IntentFilter.MATCH_ADJUSTMENT_NORMAL;
- // add a non-generic filter
- installerInfo.filter = new IntentFilter();
- // load resources from the correct package
- installerInfo.resolvePackageName = info.getComponentInfo().packageName;
- resolveInfos.set(i, installerInfo);
- continue;
+ if (info.activityInfo.splitName != null
+ && !ArrayUtils.contains(info.activityInfo.applicationInfo.splitNames,
+ info.activityInfo.splitName)) {
+ // requested activity is defined in a split that hasn't been installed yet.
+ // add the installer to the resolve list
+ if (DEBUG_INSTALL) {
+ Slog.v(TAG, "Adding installer to the ResolveInfo list");
}
+ final ResolveInfo installerInfo = new ResolveInfo(mInstantAppInstallerInfo);
+ installerInfo.auxiliaryInfo = new AuxiliaryResolveInfo(
+ info.activityInfo.packageName, info.activityInfo.splitName,
+ info.activityInfo.applicationInfo.versionCode, null /*failureIntent*/);
+ // make sure this resolver is the default
+ installerInfo.isDefault = true;
+ installerInfo.match = IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART
+ | IntentFilter.MATCH_ADJUSTMENT_NORMAL;
+ // add a non-generic filter
+ installerInfo.filter = new IntentFilter();
+ // load resources from the correct package
+ installerInfo.resolvePackageName = info.getComponentInfo().packageName;
+ resolveInfos.set(i, installerInfo);
+ continue;
}
// caller is a full app, don't need to apply any other filtering
if (ephemeralPkgName == null) {
@@ -7260,6 +7483,7 @@
continue;
}
// allow activities that have been explicitly exposed to ephemeral apps
+ final boolean isEphemeralApp = info.activityInfo.applicationInfo.isInstantApp();
if (!isEphemeralApp
&& ((info.activityInfo.flags & ActivityInfo.FLAG_VISIBLE_TO_INSTANT_APP) != 0)) {
continue;
@@ -7763,6 +7987,9 @@
String resolvedType, int flags, int userId) {
if (!sUserManager.exists(userId)) return Collections.emptyList();
final int callingUid = Binder.getCallingUid();
+ enforceCrossUserPermission(callingUid, userId,
+ false /*requireFullPermission*/, false /*checkShell*/,
+ "query intent receivers");
final String instantAppPkgName = getInstantAppPackageName(callingUid);
flags = updateFlagsForResolve(flags, userId, intent, callingUid,
false /*includeInstantApps*/);
@@ -7869,6 +8096,9 @@
String resolvedType, int flags, int userId, int callingUid,
boolean includeInstantApps) {
if (!sUserManager.exists(userId)) return Collections.emptyList();
+ enforceCrossUserPermission(callingUid, userId,
+ false /*requireFullPermission*/, false /*checkShell*/,
+ "query intent receivers");
final String instantAppPkgName = getInstantAppPackageName(callingUid);
flags = updateFlagsForResolve(flags, userId, intent, callingUid, includeInstantApps);
ComponentName comp = intent.getComponent();
@@ -8296,8 +8526,10 @@
if (HIDE_EPHEMERAL_APIS || isEphemeralDisabled()) {
return null;
}
- mContext.enforceCallingOrSelfPermission(Manifest.permission.ACCESS_INSTANT_APPS,
- "getEphemeralApplications");
+ if (!canViewInstantApps(Binder.getCallingUid(), userId)) {
+ mContext.enforceCallingOrSelfPermission(Manifest.permission.ACCESS_INSTANT_APPS,
+ "getEphemeralApplications");
+ }
enforceCrossUserPermission(Binder.getCallingUid(), userId,
true /* requireFullPermission */, false /* checkShell */,
"getEphemeralApplications");
@@ -8319,12 +8551,12 @@
if (HIDE_EPHEMERAL_APIS || isEphemeralDisabled()) {
return false;
}
- int callingUid = Binder.getCallingUid();
- if (Process.isIsolated(callingUid)) {
- callingUid = mIsolatedOwners.get(callingUid);
- }
synchronized (mPackages) {
+ int callingUid = Binder.getCallingUid();
+ if (Process.isIsolated(callingUid)) {
+ callingUid = mIsolatedOwners.get(callingUid);
+ }
final PackageSetting ps = mSettings.mPackages.get(packageName);
PackageParser.Package pkg = mPackages.get(packageName);
final boolean returnAllowed =
@@ -8382,9 +8614,10 @@
return null;
}
- mContext.enforceCallingOrSelfPermission(Manifest.permission.ACCESS_INSTANT_APPS,
- "getInstantAppIcon");
-
+ if (!canViewInstantApps(Binder.getCallingUid(), userId)) {
+ mContext.enforceCallingOrSelfPermission(Manifest.permission.ACCESS_INSTANT_APPS,
+ "getInstantAppIcon");
+ }
enforceCrossUserPermission(Binder.getCallingUid(), userId,
true /* requireFullPermission */, false /* checkShell */,
"getInstantAppIcon");
@@ -8933,9 +9166,12 @@
}
}
- boolean updatedPkgBetter = false;
+ final boolean isUpdatedPkg = updatedPkg != null;
+ final boolean isUpdatedSystemPkg = isUpdatedPkg
+ && (policyFlags & PackageParser.PARSE_IS_SYSTEM) != 0;
+ boolean isUpdatedPkgBetter = false;
// First check if this is a system package that may involve an update
- if (updatedPkg != null && (policyFlags & PackageParser.PARSE_IS_SYSTEM) != 0) {
+ if (isUpdatedSystemPkg) {
// If new package is not located in "/system/priv-app" (e.g. due to an OTA),
// it needs to drop FLAG_PRIVILEGED.
if (locationIsPrivileged(scanFile)) {
@@ -8979,10 +9215,6 @@
updatedChildPkg.versionCode = pkg.mVersionCode;
}
}
-
- throw new PackageManagerException(Log.WARN, "Package " + ps.name + " at "
- + scanFile + " ignored: updated version " + ps.versionCode
- + " better than this " + pkg.mVersionCode);
} else {
// The current app on the system partition is better than
// what we have updated to on the data partition; switch
@@ -9009,12 +9241,44 @@
synchronized (mPackages) {
mSettings.enableSystemPackageLPw(ps.name);
}
- updatedPkgBetter = true;
+ isUpdatedPkgBetter = true;
}
}
}
- if (updatedPkg != null) {
+ String resourcePath = null;
+ String baseResourcePath = null;
+ if ((policyFlags & PackageParser.PARSE_FORWARD_LOCK) != 0 && !isUpdatedPkgBetter) {
+ if (ps != null && ps.resourcePathString != null) {
+ resourcePath = ps.resourcePathString;
+ baseResourcePath = ps.resourcePathString;
+ } else {
+ // Should not happen at all. Just log an error.
+ Slog.e(TAG, "Resource path not set for package " + pkg.packageName);
+ }
+ } else {
+ resourcePath = pkg.codePath;
+ baseResourcePath = pkg.baseCodePath;
+ }
+
+ // Set application objects path explicitly.
+ pkg.setApplicationVolumeUuid(pkg.volumeUuid);
+ pkg.setApplicationInfoCodePath(pkg.codePath);
+ pkg.setApplicationInfoBaseCodePath(pkg.baseCodePath);
+ pkg.setApplicationInfoSplitCodePaths(pkg.splitCodePaths);
+ pkg.setApplicationInfoResourcePath(resourcePath);
+ pkg.setApplicationInfoBaseResourcePath(baseResourcePath);
+ pkg.setApplicationInfoSplitResourcePaths(pkg.splitCodePaths);
+
+ // throw an exception if we have an update to a system application, but, it's not more
+ // recent than the package we've already scanned
+ if (isUpdatedSystemPkg && !isUpdatedPkgBetter) {
+ throw new PackageManagerException(Log.WARN, "Package " + ps.name + " at "
+ + scanFile + " ignored: updated version " + ps.versionCode
+ + " better than this " + pkg.mVersionCode);
+ }
+
+ if (isUpdatedPkg) {
// An updated system app will not have the PARSE_IS_SYSTEM flag set
// initially
policyFlags |= PackageParser.PARSE_IS_SYSTEM;
@@ -9034,7 +9298,7 @@
* same name installed earlier.
*/
boolean shouldHideSystemApp = false;
- if (updatedPkg == null && ps != null
+ if (!isUpdatedPkg && ps != null
&& (policyFlags & PackageParser.PARSE_IS_SYSTEM_DIR) != 0 && !isSystemApp(ps)) {
/*
* Check to make sure the signatures match first. If they don't,
@@ -9089,31 +9353,6 @@
}
}
- // TODO: extend to support forward-locked splits
- String resourcePath = null;
- String baseResourcePath = null;
- if ((policyFlags & PackageParser.PARSE_FORWARD_LOCK) != 0 && !updatedPkgBetter) {
- if (ps != null && ps.resourcePathString != null) {
- resourcePath = ps.resourcePathString;
- baseResourcePath = ps.resourcePathString;
- } else {
- // Should not happen at all. Just log an error.
- Slog.e(TAG, "Resource path not set for package " + pkg.packageName);
- }
- } else {
- resourcePath = pkg.codePath;
- baseResourcePath = pkg.baseCodePath;
- }
-
- // Set application objects path explicitly.
- pkg.setApplicationVolumeUuid(pkg.volumeUuid);
- pkg.setApplicationInfoCodePath(pkg.codePath);
- pkg.setApplicationInfoBaseCodePath(pkg.baseCodePath);
- pkg.setApplicationInfoSplitCodePaths(pkg.splitCodePaths);
- pkg.setApplicationInfoResourcePath(resourcePath);
- pkg.setApplicationInfoBaseResourcePath(baseResourcePath);
- pkg.setApplicationInfoSplitResourcePaths(pkg.splitCodePaths);
-
final int userId = ((user == null) ? 0 : user.getIdentifier());
if (ps != null && ps.getInstantApp(userId)) {
scanFlags |= SCAN_AS_INSTANT_APP;
@@ -9380,12 +9619,26 @@
// Unfortunately this will also means that "pm.dexopt.boot=speed-profile" will
// behave differently than "pm.dexopt.bg-dexopt=speed-profile" but that's a
// trade-off worth doing to save boot time work.
- int dexOptStatus = performDexOptTraced(pkg.packageName,
- false /* checkProfiles */,
+ int dexoptFlags = bootComplete ? DexoptOptions.DEXOPT_BOOT_COMPLETE : 0;
+ int primaryDexOptStaus = performDexOptTraced(new DexoptOptions(
+ pkg.packageName,
compilerFilter,
- false /* force */,
- bootComplete);
- switch (dexOptStatus) {
+ dexoptFlags));
+
+ if (pkg.isSystemApp()) {
+ // Only dexopt shared secondary dex files belonging to system apps to not slow down
+ // too much boot after an OTA.
+ int secondaryDexoptFlags = dexoptFlags |
+ DexoptOptions.DEXOPT_ONLY_SECONDARY_DEX |
+ DexoptOptions.DEXOPT_ONLY_SHARED_DEX;
+ mDexManager.dexoptSecondaryDex(new DexoptOptions(
+ pkg.packageName,
+ compilerFilter,
+ secondaryDexoptFlags));
+ }
+
+ // TODO(shubhamajmera): Record secondary dexopt stats.
+ switch (primaryDexOptStaus) {
case PackageDexOptimizer.DEX_OPT_PERFORMED:
numberOfPackagesOptimized++;
break;
@@ -9396,7 +9649,7 @@
numberOfPackagesFailed++;
break;
default:
- Log.e(TAG, "Unexpected dexopt return code " + dexOptStatus);
+ Log.e(TAG, "Unexpected dexopt return code " + primaryDexOptStaus);
break;
}
}
@@ -9464,17 +9717,53 @@
}
}
+ /**
+ * Ask the package manager to perform a dex-opt with the given compiler filter.
+ *
+ * Note: exposed only for the shell command to allow moving packages explicitly to a
+ * definite state.
+ */
@Override
- public boolean performDexOpt(String packageName,
- boolean checkProfiles, int compileReason, boolean force, boolean bootComplete) {
+ public boolean performDexOptMode(String packageName,
+ boolean checkProfiles, String targetCompilerFilter, boolean force,
+ boolean bootComplete, String splitName) {
+ int flags = (checkProfiles ? DexoptOptions.DEXOPT_CHECK_FOR_PROFILES_UPDATES : 0) |
+ (force ? DexoptOptions.DEXOPT_FORCE : 0) |
+ (bootComplete ? DexoptOptions.DEXOPT_BOOT_COMPLETE : 0);
+ return performDexOpt(new DexoptOptions(packageName, targetCompilerFilter,
+ splitName, flags));
+ }
+
+ /**
+ * Ask the package manager to perform a dex-opt with the given compiler filter on the
+ * secondary dex files belonging to the given package.
+ *
+ * Note: exposed only for the shell command to allow moving packages explicitly to a
+ * definite state.
+ */
+ @Override
+ public boolean performDexOptSecondary(String packageName, String compilerFilter,
+ boolean force) {
+ int flags = DexoptOptions.DEXOPT_ONLY_SECONDARY_DEX |
+ DexoptOptions.DEXOPT_CHECK_FOR_PROFILES_UPDATES |
+ DexoptOptions.DEXOPT_BOOT_COMPLETE |
+ (force ? DexoptOptions.DEXOPT_FORCE : 0);
+ return performDexOpt(new DexoptOptions(packageName, compilerFilter, flags));
+ }
+
+ /*package*/ boolean performDexOpt(DexoptOptions options) {
if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
return false;
- } else if (isInstantApp(packageName, UserHandle.getCallingUserId())) {
+ } else if (isInstantApp(options.getPackageName(), UserHandle.getCallingUserId())) {
return false;
}
- int dexoptStatus = performDexOptWithStatus(
- packageName, checkProfiles, compileReason, force, bootComplete);
- return dexoptStatus != PackageDexOptimizer.DEX_OPT_FAILED;
+
+ if (options.isDexoptOnlySecondaryDex()) {
+ return mDexManager.dexoptSecondaryDex(options);
+ } else {
+ int dexoptStatus = performDexOptWithStatus(options);
+ return dexoptStatus != PackageDexOptimizer.DEX_OPT_FAILED;
+ }
}
/**
@@ -9483,33 +9772,14 @@
* {@link PackageDexOptimizer#DEX_OPT_PERFORMED}
* {@link PackageDexOptimizer#DEX_OPT_FAILED}
*/
- /* package */ int performDexOptWithStatus(String packageName,
- boolean checkProfiles, int compileReason, boolean force, boolean bootComplete) {
- return performDexOptTraced(packageName, checkProfiles,
- getCompilerFilterForReason(compileReason), force, bootComplete);
+ /* package */ int performDexOptWithStatus(DexoptOptions options) {
+ return performDexOptTraced(options);
}
- @Override
- public boolean performDexOptMode(String packageName,
- boolean checkProfiles, String targetCompilerFilter, boolean force,
- boolean bootComplete) {
- if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
- return false;
- } else if (isInstantApp(packageName, UserHandle.getCallingUserId())) {
- return false;
- }
- int dexOptStatus = performDexOptTraced(packageName, checkProfiles,
- targetCompilerFilter, force, bootComplete);
- return dexOptStatus != PackageDexOptimizer.DEX_OPT_FAILED;
- }
-
- private int performDexOptTraced(String packageName,
- boolean checkProfiles, String targetCompilerFilter, boolean force,
- boolean bootComplete) {
+ private int performDexOptTraced(DexoptOptions options) {
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "dexopt");
try {
- return performDexOptInternal(packageName, checkProfiles,
- targetCompilerFilter, force, bootComplete);
+ return performDexOptInternal(options);
} finally {
Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
}
@@ -9517,12 +9787,10 @@
// Run dexopt on a given package. Returns true if dexopt did not fail, i.e.
// if the package can now be considered up to date for the given filter.
- private int performDexOptInternal(String packageName,
- boolean checkProfiles, String targetCompilerFilter, boolean force,
- boolean bootComplete) {
+ private int performDexOptInternal(DexoptOptions options) {
PackageParser.Package p;
synchronized (mPackages) {
- p = mPackages.get(packageName);
+ p = mPackages.get(options.getPackageName());
if (p == null) {
// Package could not be found. Report failure.
return PackageDexOptimizer.DEX_OPT_FAILED;
@@ -9533,8 +9801,7 @@
long callingId = Binder.clearCallingIdentity();
try {
synchronized (mInstallLock) {
- return performDexOptInternalWithDependenciesLI(p, checkProfiles,
- targetCompilerFilter, force, bootComplete);
+ return performDexOptInternalWithDependenciesLI(p, options);
}
} finally {
Binder.restoreCallingIdentity(callingId);
@@ -9554,12 +9821,11 @@
}
private int performDexOptInternalWithDependenciesLI(PackageParser.Package p,
- boolean checkProfiles, String targetCompilerFilter,
- boolean force, boolean bootComplete) {
+ DexoptOptions options) {
// Select the dex optimizer based on the force parameter.
// Note: The force option is rarely used (cmdline input for testing, mostly), so it's OK to
// allocate an object here.
- PackageDexOptimizer pdo = force
+ PackageDexOptimizer pdo = options.isForce()
? new PackageDexOptimizer.ForcedUpdatePackageDexOptimizer(mPackageDexOptimizer)
: mPackageDexOptimizer;
@@ -9576,36 +9842,14 @@
for (PackageParser.Package depPackage : deps) {
// TODO: Analyze and investigate if we (should) profile libraries.
pdo.performDexOpt(depPackage, null /* sharedLibraries */, instructionSets,
- false /* checkProfiles */,
- targetCompilerFilter,
getOrCreateCompilerPackageStats(depPackage),
true /* isUsedByOtherApps */,
- bootComplete);
+ options);
}
}
- return pdo.performDexOpt(p, p.usesLibraryFiles, instructionSets, checkProfiles,
- targetCompilerFilter, getOrCreateCompilerPackageStats(p),
- mDexManager.isUsedByOtherApps(p.packageName), bootComplete);
- }
-
- // Performs dexopt on the used secondary dex files belonging to the given package.
- // Returns true if all dex files were process successfully (which could mean either dexopt or
- // skip). Returns false if any of the files caused errors.
- @Override
- public boolean performDexOptSecondary(String packageName, String compilerFilter,
- boolean force) {
- if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
- return false;
- } else if (isInstantApp(packageName, UserHandle.getCallingUserId())) {
- return false;
- }
- mDexManager.reconcileSecondaryDexFiles(packageName);
- return mDexManager.dexoptSecondaryDex(packageName, compilerFilter, force);
- }
-
- public boolean performDexOptSecondary(String packageName, int compileReason,
- boolean force) {
- return mDexManager.dexoptSecondaryDex(packageName, compileReason, force);
+ return pdo.performDexOpt(p, p.usesLibraryFiles, instructionSets,
+ getOrCreateCompilerPackageStats(p),
+ mDexManager.isUsedByOtherApps(p.packageName), options);
}
/**
@@ -9781,10 +10025,11 @@
// Whoever is calling forceDexOpt wants a compiled package.
// Don't use profiles since that may cause compilation to be skipped.
- final int res = performDexOptInternalWithDependenciesLI(pkg,
- false /* checkProfiles */, getDefaultCompilerFilter(),
- true /* force */,
- true /* bootComplete */);
+ final int res = performDexOptInternalWithDependenciesLI(
+ pkg,
+ new DexoptOptions(packageName,
+ getDefaultCompilerFilter(),
+ DexoptOptions.DEXOPT_FORCE | DexoptOptions.DEXOPT_BOOT_COMPLETE));
Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
if (res != PackageDexOptimizer.DEX_OPT_PERFORMED) {
@@ -10708,6 +10953,9 @@
r.info.encryptionAware = r.info.directBootAware = true;
}
}
+ if (compressedFileExists(pkg.baseCodePath)) {
+ pkg.isStub = true;
+ }
} else {
// Only allow system apps to be flagged as core apps.
pkg.coreApp = false;
@@ -11494,8 +11742,10 @@
if (pkg.protectedBroadcasts != null) {
N = pkg.protectedBroadcasts.size();
- for (i=0; i<N; i++) {
- mProtectedBroadcasts.add(pkg.protectedBroadcasts.get(i));
+ synchronized (mProtectedBroadcasts) {
+ for (i = 0; i < N; i++) {
+ mProtectedBroadcasts.add(pkg.protectedBroadcasts.get(i));
+ }
}
}
}
@@ -14350,7 +14600,8 @@
private void sendPackageAddedForUser(String packageName, PackageSetting pkgSetting,
int userId) {
final boolean isSystem = isSystemApp(pkgSetting) || isUpdatedSystemApp(pkgSetting);
- sendPackageAddedForNewUsers(packageName, isSystem, pkgSetting.appId, userId);
+ sendPackageAddedForNewUsers(packageName, isSystem /*sendBootCompleted*/,
+ false /*startReceiver*/, pkgSetting.appId, userId);
// Send a session commit broadcast
final PackageInstaller.SessionInfo info = new PackageInstaller.SessionInfo();
@@ -14359,7 +14610,8 @@
sendSessionCommitBroadcast(info, userId);
}
- public void sendPackageAddedForNewUsers(String packageName, boolean isSystem, int appId, int... userIds) {
+ public void sendPackageAddedForNewUsers(String packageName, boolean sendBootCompleted,
+ boolean includeStopped, int appId, int... userIds) {
if (ArrayUtils.isEmpty(userIds)) {
return;
}
@@ -14369,10 +14621,11 @@
sendPackageBroadcast(Intent.ACTION_PACKAGE_ADDED,
packageName, extras, 0, null, null, userIds);
- if (isSystem) {
+ if (sendBootCompleted) {
mHandler.post(() -> {
for (int userId : userIds) {
- sendBootCompletedBroadcastToSystemApp(packageName, userId);
+ sendBootCompletedBroadcastToSystemApp(
+ packageName, includeStopped, userId);
}
}
);
@@ -14384,7 +14637,8 @@
* automatically without needing an explicit launch.
* Send it a LOCKED_BOOT_COMPLETED/BOOT_COMPLETED if it would ordinarily have gotten ones.
*/
- private void sendBootCompletedBroadcastToSystemApp(String packageName, int userId) {
+ private void sendBootCompletedBroadcastToSystemApp(String packageName, boolean includeStopped,
+ int userId) {
// If user is not running, the app didn't miss any broadcast
if (!mUserManagerInternal.isUserRunning(userId)) {
return;
@@ -14394,6 +14648,9 @@
// Deliver LOCKED_BOOT_COMPLETED first
Intent lockedBcIntent = new Intent(Intent.ACTION_LOCKED_BOOT_COMPLETED)
.setPackage(packageName);
+ if (includeStopped) {
+ lockedBcIntent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
+ }
final String[] requiredPermissions = {Manifest.permission.RECEIVE_BOOT_COMPLETED};
am.broadcastIntent(null, lockedBcIntent, null, null, 0, null, null, requiredPermissions,
android.app.AppOpsManager.OP_NONE, null, false, false, userId);
@@ -14401,6 +14658,9 @@
// Deliver BOOT_COMPLETED only if user is unlocked
if (mUserManagerInternal.isUserUnlockingOrUnlocked(userId)) {
Intent bcIntent = new Intent(Intent.ACTION_BOOT_COMPLETED).setPackage(packageName);
+ if (includeStopped) {
+ bcIntent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
+ }
am.broadcastIntent(null, bcIntent, null, null, 0, null, null, requiredPermissions,
android.app.AppOpsManager.OP_NONE, null, false, false, userId);
}
@@ -15066,6 +15326,11 @@
@Override
public int getIntentVerificationStatus(String packageName, int userId) {
final int callingUid = Binder.getCallingUid();
+ if (UserHandle.getUserId(callingUid) != userId) {
+ mContext.enforceCallingOrSelfPermission(
+ android.Manifest.permission.INTERACT_ACROSS_USERS_FULL,
+ "getIntentVerificationStatus" + userId);
+ }
if (getInstantAppPackageName(callingUid) != null) {
return INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED;
}
@@ -15149,6 +15414,10 @@
public boolean setDefaultBrowserPackageName(String packageName, int userId) {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.SET_PREFERRED_APPLICATIONS, null);
+ if (UserHandle.getCallingUserId() != userId) {
+ mContext.enforceCallingOrSelfPermission(
+ android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, null);
+ }
synchronized (mPackages) {
boolean result = mSettings.setDefaultBrowserPackageNameLPw(packageName, userId);
@@ -15162,6 +15431,10 @@
@Override
public String getDefaultBrowserPackageName(int userId) {
+ if (UserHandle.getCallingUserId() != userId) {
+ mContext.enforceCallingOrSelfPermission(
+ android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, null);
+ }
if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
return null;
}
@@ -16203,7 +16476,7 @@
}
}
- private void removeDexFiles(List<String> allCodePaths, String[] instructionSets) {
+ void removeDexFiles(List<String> allCodePaths, String[] instructionSets) {
if (!allCodePaths.isEmpty()) {
if (instructionSets == null) {
throw new IllegalStateException("instructionSet == null");
@@ -16971,12 +17244,20 @@
public void setError(String msg, PackageParserException e) {
setReturnCode(e.error);
setReturnMessage(ExceptionUtils.getCompleteMessage(msg, e));
+ final int childCount = (addedChildPackages != null) ? addedChildPackages.size() : 0;
+ for (int i = 0; i < childCount; i++) {
+ addedChildPackages.valueAt(i).setError(msg, e);
+ }
Slog.w(TAG, msg, e);
}
public void setError(String msg, PackageManagerException e) {
returnCode = e.error;
setReturnMessage(ExceptionUtils.getCompleteMessage(msg, e));
+ final int childCount = (addedChildPackages != null) ? addedChildPackages.size() : 0;
+ for (int i = 0; i < childCount; i++) {
+ addedChildPackages.valueAt(i).setError(msg, e);
+ }
Slog.w(TAG, msg, e);
}
@@ -18236,12 +18517,14 @@
// method because `pkg` may not be in `mPackages` yet.
//
// Also, don't fail application installs if the dexopt step fails.
+ DexoptOptions dexoptOptions = new DexoptOptions(pkg.packageName,
+ REASON_INSTALL,
+ DexoptOptions.DEXOPT_BOOT_COMPLETE);
mPackageDexOptimizer.performDexOpt(pkg, pkg.usesLibraryFiles,
- null /* instructionSets */, false /* checkProfiles */,
- getCompilerFilterForReason(REASON_INSTALL),
+ null /* instructionSets */,
getOrCreateCompilerPackageStats(pkg),
mDexManager.isUsedByOtherApps(pkg.packageName),
- true /* bootComplete */);
+ dexoptOptions);
Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
}
@@ -18714,6 +18997,12 @@
return packageName;
}
+ boolean isCallerVerifier(int callingUid) {
+ final int callingUserId = UserHandle.getUserId(callingUid);
+ return mRequiredVerifierPackage != null &&
+ callingUid == getPackageUid(mRequiredVerifierPackage, 0, callingUserId);
+ }
+
private boolean isCallerAllowedToSilentlyUninstall(int callingUid, String pkgName) {
if (callingUid == Process.SHELL_UID || callingUid == Process.ROOT_UID
|| UserHandle.getAppId(callingUid) == Process.SYSTEM_UID) {
@@ -18987,8 +19276,8 @@
for (int i = 0; i < packageCount; i++) {
PackageInstalledInfo installedInfo = appearedChildPackages.valueAt(i);
packageSender.sendPackageAddedForNewUsers(installedInfo.name,
- true, UserHandle.getAppId(installedInfo.uid),
- installedInfo.newUsers);
+ true /*sendBootCompleted*/, false /*startReceiver*/,
+ UserHandle.getAppId(installedInfo.uid), installedInfo.newUsers);
}
}
@@ -21720,6 +22009,7 @@
public static final int DUMP_DEXOPT = 1 << 20;
public static final int DUMP_COMPILER_STATS = 1 << 21;
public static final int DUMP_CHANGES = 1 << 22;
+ public static final int DUMP_VOLUMES = 1 << 23;
public static final int OPTION_SHOW_FILTERS = 1 << 0;
@@ -21959,6 +22249,8 @@
dumpState.setDump(DumpState.DUMP_INSTALLS);
} else if ("frozen".equals(cmd)) {
dumpState.setDump(DumpState.DUMP_FROZEN);
+ } else if ("volumes".equals(cmd)) {
+ dumpState.setDump(DumpState.DUMP_VOLUMES);
} else if ("dexopt".equals(cmd)) {
dumpState.setDump(DumpState.DUMP_DEXOPT);
} else if ("compiler-stats".equals(cmd)) {
@@ -22343,6 +22635,23 @@
ipw.decreaseIndent();
}
+ if (!checkin && dumpState.isDumping(DumpState.DUMP_VOLUMES) && packageName == null) {
+ if (dumpState.onTitlePrinted()) pw.println();
+
+ final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ", 120);
+ ipw.println();
+ ipw.println("Loaded volumes:");
+ ipw.increaseIndent();
+ if (mLoadedVolumes.size() == 0) {
+ ipw.println("(none)");
+ } else {
+ for (int i = 0; i < mLoadedVolumes.size(); i++) {
+ ipw.println(mLoadedVolumes.valueAt(i));
+ }
+ }
+ ipw.decreaseIndent();
+ }
+
if (!checkin && dumpState.isDumping(DumpState.DUMP_DEXOPT)) {
if (dumpState.onTitlePrinted()) pw.println();
dumpDexoptStateLPr(pw, packageName);
@@ -23059,6 +23368,7 @@
if (DEBUG_INSTALL) Slog.d(TAG, "Loaded packages " + loaded);
sendResourcesChangedBroadcast(true, false, loaded, null);
+ mLoadedVolumes.add(vol.getId());
}
private void unloadPrivatePackages(final VolumeInfo vol) {
@@ -23110,6 +23420,7 @@
if (DEBUG_INSTALL) Slog.d(TAG, "Unloaded packages " + unloaded);
sendResourcesChangedBroadcast(false, false, unloaded, null);
+ mLoadedVolumes.remove(vol.getId());
// Try very hard to release any references to this path so we don't risk
// the system server being killed due to open FDs
@@ -23653,8 +23964,7 @@
movePackageInternal(packageName, volumeUuid, moveId, callingUid, user);
} catch (PackageManagerException e) {
Slog.w(TAG, "Failed to move " + packageName, e);
- mMoveCallbacks.notifyStatusChanged(moveId,
- PackageManager.MOVE_FAILED_INTERNAL_ERROR);
+ mMoveCallbacks.notifyStatusChanged(moveId, e.error);
}
}
});
@@ -23777,6 +24087,17 @@
measurePath = Environment.getDataAppDirectory(volumeUuid);
}
+ // If we're moving app data around, we need all the users unlocked
+ if (moveCompleteApp) {
+ for (int userId : installedUserIds) {
+ if (StorageManager.isFileEncryptedNativeOrEmulated()
+ && !StorageManager.isUserKeyUnlocked(userId)) {
+ throw new PackageManagerException(MOVE_FAILED_LOCKED_USER,
+ "User " + userId + " must be unlocked");
+ }
+ }
+ }
+
final PackageStats stats = new PackageStats(null, -1);
synchronized (mInstaller) {
for (int userId : installedUserIds) {
@@ -24971,12 +25292,79 @@
return mInstantAppRegistry.getInstantAppAndroidIdLPw(packageName, userId);
}
}
+
+ boolean canHaveOatDir(String packageName) {
+ synchronized (mPackages) {
+ PackageParser.Package p = mPackages.get(packageName);
+ if (p == null) {
+ return false;
+ }
+ return p.canHaveOatDir();
+ }
+ }
+
+ private String getOatDir(PackageParser.Package pkg) {
+ if (!pkg.canHaveOatDir()) {
+ return null;
+ }
+ File codePath = new File(pkg.codePath);
+ if (codePath.isDirectory()) {
+ return PackageDexOptimizer.getOatDir(codePath).getAbsolutePath();
+ }
+ return null;
+ }
+
+ void deleteOatArtifactsOfPackage(String packageName) {
+ final String[] instructionSets;
+ final List<String> codePaths;
+ final String oatDir;
+ final PackageParser.Package pkg;
+ synchronized (mPackages) {
+ pkg = mPackages.get(packageName);
+ }
+ instructionSets = getAppDexInstructionSets(pkg.applicationInfo);
+ codePaths = pkg.getAllCodePaths();
+ oatDir = getOatDir(pkg);
+
+ for (String codePath : codePaths) {
+ for (String isa : instructionSets) {
+ try {
+ mInstaller.deleteOdex(codePath, isa, oatDir);
+ } catch (InstallerException e) {
+ Log.e(TAG, "Failed deleting oat files for " + codePath, e);
+ }
+ }
+ }
+ }
+
+ Set<String> getUnusedPackages(long downgradeTimeThresholdMillis) {
+ Set<String> unusedPackages = new HashSet<>();
+ long currentTimeInMillis = System.currentTimeMillis();
+ synchronized (mPackages) {
+ for (PackageParser.Package pkg : mPackages.values()) {
+ PackageSetting ps = mSettings.mPackages.get(pkg.packageName);
+ if (ps == null) {
+ continue;
+ }
+ PackageDexUsage.PackageUseInfo packageUseInfo = getDexManager().getPackageUseInfo(
+ pkg.packageName);
+ if (PackageManagerServiceUtils
+ .isUnusedSinceTimeInMillis(ps.firstInstallTime, currentTimeInMillis,
+ downgradeTimeThresholdMillis, packageUseInfo,
+ pkg.getLatestPackageUseTimeInMills(),
+ pkg.getLatestForegroundPackageUseTimeInMills())) {
+ unusedPackages.add(pkg.packageName);
+ }
+ }
+ }
+ return unusedPackages;
+ }
}
interface PackageSender {
void sendPackageBroadcast(final String action, final String pkg,
final Bundle extras, final int flags, final String targetPkg,
final IIntentReceiver finishedReceiver, final int[] userIds);
- void sendPackageAddedForNewUsers(String packageName, boolean isSystem,
- int appId, int... userIds);
+ void sendPackageAddedForNewUsers(String packageName, boolean sendBootCompleted,
+ boolean includeStopped, int appId, int... userIds);
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceCompilerMapping.java b/services/core/java/com/android/server/pm/PackageManagerServiceCompilerMapping.java
index ec248f5..1a97a72 100644
--- a/services/core/java/com/android/server/pm/PackageManagerServiceCompilerMapping.java
+++ b/services/core/java/com/android/server/pm/PackageManagerServiceCompilerMapping.java
@@ -26,7 +26,7 @@
public class PackageManagerServiceCompilerMapping {
// Names for compilation reasons.
static final String REASON_STRINGS[] = {
- "first-boot", "boot", "install", "bg-dexopt", "ab-ota"
+ "first-boot", "boot", "install", "bg-dexopt", "ab-ota", "inactive"
};
// Static block to ensure the strings array is of the right length.
diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
index 9feee8c..a7031c9 100644
--- a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
+++ b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
@@ -16,12 +16,16 @@
package com.android.server.pm;
+import com.android.server.pm.dex.DexManager;
+import com.android.server.pm.dex.PackageDexUsage;
+
import static com.android.server.pm.PackageManagerService.DEBUG_DEXOPT;
import static com.android.server.pm.PackageManagerService.TAG;
import android.annotation.NonNull;
import android.app.AppGlobals;
import android.content.Intent;
+import android.content.pm.PackageInfo;
import android.content.pm.PackageParser;
import android.content.pm.ResolveInfo;
import android.os.Build;
@@ -179,6 +183,43 @@
}
/**
+ * Checks if the package was inactive during since <code>thresholdTimeinMillis</code>.
+ * Package is considered active, if:
+ * 1) It was active in foreground.
+ * 2) It was active in background and also used by other apps.
+ *
+ * If it doesn't have sufficient information about the package, it return <code>false</code>.
+ */
+ static boolean isUnusedSinceTimeInMillis(long firstInstallTime, long currentTimeInMillis,
+ long thresholdTimeinMillis, PackageDexUsage.PackageUseInfo packageUseInfo,
+ long latestPackageUseTimeInMillis, long latestForegroundPackageUseTimeInMillis) {
+
+ if (currentTimeInMillis - firstInstallTime < thresholdTimeinMillis) {
+ return false;
+ }
+
+ // If the app was active in foreground during the threshold period.
+ boolean isActiveInForeground = (currentTimeInMillis
+ - latestForegroundPackageUseTimeInMillis)
+ < thresholdTimeinMillis;
+
+ if (isActiveInForeground) {
+ return false;
+ }
+
+ // If the app was active in background during the threshold period and was used
+ // by other packages.
+ // If packageUseInfo is null, it can be said that the package was not used by other
+ // packages.
+ boolean isActiveInBackgroundAndUsedByOtherPackages = ((currentTimeInMillis
+ - latestPackageUseTimeInMillis)
+ < thresholdTimeinMillis)
+ && (packageUseInfo != null && packageUseInfo.isUsedByOtherApps());
+
+ return !isActiveInBackgroundAndUsedByOtherPackages;
+ }
+
+ /**
* Returns the canonicalized path of {@code path} as per {@code realpath(3)}
* semantics.
*/
diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
index 20d7b28..faeb05b 100644
--- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
+++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
@@ -175,7 +175,7 @@
try {
ApkLite baseApk = PackageParser.parseApkLite(file, 0);
PackageLite pkgLite = new PackageLite(null, baseApk, null, null, null, null,
- null, null);
+ null, null, null);
params.sessionParams.setSize(PackageHelper.calculateInstalledSize(
pkgLite, false, params.sessionParams.abiOverride));
} catch (PackageParserException | IOException e) {
@@ -365,6 +365,7 @@
String compilationReason = null;
String checkProfilesRaw = null;
boolean secondaryDex = false;
+ String split = null;
String opt;
while ((opt = getNextOption()) != null) {
@@ -395,6 +396,9 @@
case "--secondary-dex":
secondaryDex = true;
break;
+ case "--split":
+ split = getNextArgRequired();
+ break;
default:
pw.println("Error: Unknown option: " + opt);
return 1;
@@ -423,6 +427,16 @@
return 1;
}
+ if (allPackages && split != null) {
+ pw.println("-a cannot be specified together with --split");
+ return 1;
+ }
+
+ if (secondaryDex && split != null) {
+ pw.println("--secondary-dex cannot be specified together with --split");
+ return 1;
+ }
+
String targetCompilerFilter;
if (compilerFilter != null) {
if (!DexFile.isValidCompilerFilter(compilerFilter)) {
@@ -472,7 +486,7 @@
targetCompilerFilter, forceCompilation)
: mInterface.performDexOptMode(packageName,
checkProfiles, targetCompilerFilter, forceCompilation,
- true /* bootComplete */);
+ true /* bootComplete */, split);
if (!result) {
failedPackages.add(packageName);
}
@@ -1207,6 +1221,9 @@
case "--full":
sessionParams.setInstallAsInstantApp(false /*isInstantApp*/);
break;
+ case "--preload":
+ sessionParams.setInstallAsVirtualPreload();
+ break;
case "--user":
params.userId = UserHandle.parseUserArg(getNextArgRequired());
break;
@@ -1609,7 +1626,7 @@
pw.println(" help");
pw.println(" Print this help text.");
pw.println("");
- pw.println(" compile [-m MODE | -r REASON] [-f] [-c]");
+ pw.println(" compile [-m MODE | -r REASON] [-f] [-c] [--split SPLIT_NAME]");
pw.println(" [--reset] [--check-prof (true | false)] (-a | TARGET-PACKAGE)");
pw.println(" Trigger compilation of TARGET-PACKAGE or all packages if \"-a\".");
pw.println(" Options:");
@@ -1635,6 +1652,7 @@
pw.println(" --reset: restore package to its post-install state");
pw.println(" --check-prof (true | false): look at profiles when doing dexopt?");
pw.println(" --secondary-dex: compile app secondary dex files");
+ pw.println(" --split SPLIT: compile only the given split name");
pw.println(" bg-dexopt-job");
pw.println(" Execute the background optimizations immediately.");
pw.println(" Note that the command only runs the background optimizer logic. It may");
diff --git a/services/core/java/com/android/server/pm/PermissionsState.java b/services/core/java/com/android/server/pm/PermissionsState.java
index 8a427cd..f4d2ad2 100644
--- a/services/core/java/com/android/server/pm/PermissionsState.java
+++ b/services/core/java/com/android/server/pm/PermissionsState.java
@@ -427,7 +427,7 @@
mPermissionReviewRequired.put(userId, true);
} else if ((oldFlags & PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED) != 0
&& (newFlags & PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED) == 0) {
- if (mPermissionReviewRequired != null) {
+ if (mPermissionReviewRequired != null && !hasPermissionRequiringReview(userId)) {
mPermissionReviewRequired.delete(userId);
if (mPermissionReviewRequired.size() <= 0) {
mPermissionReviewRequired = null;
@@ -438,6 +438,18 @@
return updated;
}
+ private boolean hasPermissionRequiringReview(int userId) {
+ final int permissionCount = mPermissions.size();
+ for (int i = 0; i < permissionCount; i++) {
+ final PermissionData permission = mPermissions.valueAt(i);
+ if ((permission.getFlags(userId)
+ & PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED) != 0) {
+ return true;
+ }
+ }
+ return false;
+ }
+
public boolean updatePermissionFlagsForAllPermissions(
int userId, int flagMask, int flagValues) {
enforceValidUserId(userId);
diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java
index 7911972..0e572d8 100644
--- a/services/core/java/com/android/server/pm/ShortcutService.java
+++ b/services/core/java/com/android/server/pm/ShortcutService.java
@@ -483,22 +483,24 @@
final private IUidObserver mUidObserver = new IUidObserver.Stub() {
@Override
- public void onUidStateChanged(int uid, int procState, long procStateSeq)
- throws RemoteException {
+ public void onUidStateChanged(int uid, int procState, long procStateSeq) {
handleOnUidStateChanged(uid, procState);
}
@Override
- public void onUidGone(int uid, boolean disabled) throws RemoteException {
+ public void onUidGone(int uid, boolean disabled) {
handleOnUidStateChanged(uid, ActivityManager.PROCESS_STATE_NONEXISTENT);
}
@Override
- public void onUidActive(int uid) throws RemoteException {
+ public void onUidActive(int uid) {
}
@Override
- public void onUidIdle(int uid, boolean disabled) throws RemoteException {
+ public void onUidIdle(int uid, boolean disabled) {
+ }
+
+ @Override public void onUidCachedChanged(int uid, boolean cached) {
}
};
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index a64ab43..2d645c0 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -949,7 +949,7 @@
@Override
public boolean isUserUnlocked(int userId) {
checkManageOrInteractPermIfCallerInOtherProfileGroup(userId, "isUserUnlocked");
- return mLocalService.isUserUnlockingOrUnlocked(userId);
+ return mLocalService.isUserUnlocked(userId);
}
@Override
@@ -2680,11 +2680,6 @@
addRemovingUserIdLocked(userHandle);
}
- try {
- mAppOpsService.removeUser(userHandle);
- } catch (RemoteException e) {
- Log.w(LOG_TAG, "Unable to notify AppOpsService of removing user", e);
- }
// Set this to a partially created user, so that the user will be purged
// on next startup, in case the runtime stops now before stopping and
// removing the user completely.
@@ -2694,6 +2689,11 @@
userData.info.flags |= UserInfo.FLAG_DISABLED;
writeUserLP(userData);
}
+ try {
+ mAppOpsService.removeUser(userHandle);
+ } catch (RemoteException e) {
+ Log.w(LOG_TAG, "Unable to notify AppOpsService of removing user", e);
+ }
if (userData.info.profileGroupId != UserInfo.NO_PROFILE_GROUP_ID
&& userData.info.isManagedProfile()) {
@@ -3692,19 +3692,29 @@
@Override
public boolean isUserUnlockingOrUnlocked(int userId) {
+ int state;
synchronized (mUserStates) {
- int state = mUserStates.get(userId, -1);
- return (state == UserState.STATE_RUNNING_UNLOCKING)
- || (state == UserState.STATE_RUNNING_UNLOCKED);
+ state = mUserStates.get(userId, -1);
}
+ // Special case, in the stopping/shutdown state user key can still be unlocked
+ if (state == UserState.STATE_STOPPING || state == UserState.STATE_SHUTDOWN) {
+ return StorageManager.isUserKeyUnlocked(userId);
+ }
+ return (state == UserState.STATE_RUNNING_UNLOCKING)
+ || (state == UserState.STATE_RUNNING_UNLOCKED);
}
@Override
public boolean isUserUnlocked(int userId) {
+ int state;
synchronized (mUserStates) {
- int state = mUserStates.get(userId, -1);
- return state == UserState.STATE_RUNNING_UNLOCKED;
+ state = mUserStates.get(userId, -1);
}
+ // Special case, in the stopping/shutdown state user key can still be unlocked
+ if (state == UserState.STATE_STOPPING || state == UserState.STATE_SHUTDOWN) {
+ return StorageManager.isUserKeyUnlocked(userId);
+ }
+ return state == UserState.STATE_RUNNING_UNLOCKED;
}
}
diff --git a/services/core/java/com/android/server/pm/dex/DexManager.java b/services/core/java/com/android/server/pm/dex/DexManager.java
index be50eee..3d2d483 100644
--- a/services/core/java/com/android/server/pm/dex/DexManager.java
+++ b/services/core/java/com/android/server/pm/dex/DexManager.java
@@ -148,7 +148,8 @@
// or UsedBytOtherApps), record will return true and we trigger an async write
// to disk to make sure we don't loose the data in case of a reboot.
if (mPackageDexUsage.record(searchResult.mOwningPackageName,
- dexPath, loaderUserId, loaderIsa, isUsedByOtherApps, primaryOrSplit)) {
+ dexPath, loaderUserId, loaderIsa, isUsedByOtherApps, primaryOrSplit,
+ loadingAppInfo.packageName)) {
mPackageDexUsage.maybeWriteAsync();
}
} else {
@@ -300,31 +301,21 @@
}
/**
- * Perform dexopt on the package {@code packageName} secondary dex files.
+ * Perform dexopt on with the given {@code options} on the secondary dex files.
* @return true if all secondary dex files were processed successfully (compiled or skipped
* because they don't need to be compiled)..
*/
- public boolean dexoptSecondaryDex(String packageName, int compilerReason, boolean force) {
- return dexoptSecondaryDex(packageName,
- PackageManagerServiceCompilerMapping.getCompilerFilterForReason(compilerReason),
- force);
- }
-
- /**
- * Perform dexopt on the package {@code packageName} secondary dex files.
- * @return true if all secondary dex files were processed successfully (compiled or skipped
- * because they don't need to be compiled)..
- */
- public boolean dexoptSecondaryDex(String packageName, String compilerFilter, boolean force) {
+ public boolean dexoptSecondaryDex(DexoptOptions options) {
// Select the dex optimizer based on the force parameter.
// Forced compilation is done through ForcedUpdatePackageDexOptimizer which will adjust
// the necessary dexopt flags to make sure that compilation is not skipped. This avoid
// passing the force flag through the multitude of layers.
// Note: The force option is rarely used (cmdline input for testing, mostly), so it's OK to
// allocate an object here.
- PackageDexOptimizer pdo = force
+ PackageDexOptimizer pdo = options.isForce()
? new PackageDexOptimizer.ForcedUpdatePackageDexOptimizer(mPackageDexOptimizer)
: mPackageDexOptimizer;
+ String packageName = options.getPackageName();
PackageUseInfo useInfo = getPackageUseInfo(packageName);
if (useInfo == null || useInfo.getDexUseInfoMap().isEmpty()) {
if (DEBUG) {
@@ -337,6 +328,9 @@
for (Map.Entry<String, DexUseInfo> entry : useInfo.getDexUseInfoMap().entrySet()) {
String dexPath = entry.getKey();
DexUseInfo dexUseInfo = entry.getValue();
+ if (options.isDexoptOnlySharedDex() && !dexUseInfo.isUsedByOtherApps()) {
+ continue;
+ }
PackageInfo pkg = null;
try {
pkg = mPackageManager.getPackageInfo(packageName, /*flags*/0,
@@ -356,7 +350,8 @@
}
int result = pdo.dexOptSecondaryDexPath(pkg.applicationInfo, dexPath,
- dexUseInfo.getLoaderIsas(), compilerFilter, dexUseInfo.isUsedByOtherApps());
+ dexUseInfo.getLoaderIsas(), options.getCompilerFilter(),
+ dexUseInfo.isUsedByOtherApps(), options.isDowngrade());
success = success && (result != PackageDexOptimizer.DEX_OPT_FAILED);
}
return success;
@@ -461,7 +456,8 @@
for (String isa : getAppDexInstructionSets(info)) {
isas.add(isa);
boolean newUpdate = mPackageDexUsage.record(searchResult.mOwningPackageName,
- dexPath, userId, isa, isUsedByOtherApps, /*primaryOrSplit*/ false);
+ dexPath, userId, isa, isUsedByOtherApps, /*primaryOrSplit*/ false,
+ searchResult.mOwningPackageName);
update |= newUpdate;
}
if (update) {
@@ -472,7 +468,7 @@
String compilerFilter = PackageManagerServiceCompilerMapping.getCompilerFilterForReason(
PackageManagerService.REASON_INSTALL);
int result = mPackageDexOptimizer.dexOptSecondaryDexPath(info, dexPath, isas,
- compilerFilter, isUsedByOtherApps);
+ compilerFilter, isUsedByOtherApps, /* downgrade */ false);
// If we fail to optimize the package log an error but don't propagate the error
// back to the app. The app cannot do much about it and the background job
diff --git a/services/core/java/com/android/server/pm/dex/DexoptOptions.java b/services/core/java/com/android/server/pm/dex/DexoptOptions.java
new file mode 100644
index 0000000..f57cf5e
--- /dev/null
+++ b/services/core/java/com/android/server/pm/dex/DexoptOptions.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.pm.dex;
+
+import static com.android.server.pm.PackageManagerServiceCompilerMapping.getCompilerFilterForReason;
+
+import android.annotation.Nullable;
+
+/**
+ * Options used for dexopt invocations.
+ */
+public final class DexoptOptions {
+ // When set, the profiles will be checked for updates before calling dexopt. If
+ // the apps profiles didn't update in a meaningful way (decided by the compiler), dexopt
+ // will be skipped.
+ // Currently this only affects the optimization of primary apks. Secondary dex files
+ // will always check the profiles for updates.
+ public static final int DEXOPT_CHECK_FOR_PROFILES_UPDATES = 1 << 0;
+
+ // When set, dexopt will execute unconditionally (even if not needed).
+ public static final int DEXOPT_FORCE = 1 << 1;
+
+ // Whether or not the invocation of dexopt is done after the boot is completed. This is used
+ // in order to adjust the priority of the compilation thread.
+ public static final int DEXOPT_BOOT_COMPLETE = 1 << 2;
+
+ // When set, the dexopt invocation will optimize only the secondary dex files. If false, dexopt
+ // will only consider the primary apk.
+ public static final int DEXOPT_ONLY_SECONDARY_DEX = 1 << 3;
+
+ // When set, dexopt will optimize only dex files that are used by other apps.
+ // Currently, this flag is ignored for primary apks.
+ public static final int DEXOPT_ONLY_SHARED_DEX = 1 << 4;
+
+ // When set, dexopt will attempt to scale down the optimizations previously applied in order
+ // save disk space.
+ public static final int DEXOPT_DOWNGRADE = 1 << 5;
+
+ // The name of package to optimize.
+ private final String mPackageName;
+
+ // The intended target compiler filter. Note that dexopt might adjust the filter before the
+ // execution based on factors like: vmSafeMode and packageUsedByOtherApps.
+ private final String mCompilerFilter;
+
+ // The set of flags for the dexopt options. It's a mix of the DEXOPT_* flags.
+ private final int mFlags;
+
+ // When not null, dexopt will optimize only the split identified by this name.
+ // It only applies for primary apk and it's always null if mOnlySecondaryDex is true.
+ private final String mSplitName;
+
+ public DexoptOptions(String packageName, String compilerFilter, int flags) {
+ this(packageName, compilerFilter, /*splitName*/ null, flags);
+ }
+
+ public DexoptOptions(String packageName, int compilerReason, int flags) {
+ this(packageName, getCompilerFilterForReason(compilerReason), flags);
+ }
+
+ public DexoptOptions(String packageName, String compilerFilter, String splitName, int flags) {
+ int validityMask =
+ DEXOPT_CHECK_FOR_PROFILES_UPDATES |
+ DEXOPT_FORCE |
+ DEXOPT_BOOT_COMPLETE |
+ DEXOPT_ONLY_SECONDARY_DEX |
+ DEXOPT_ONLY_SHARED_DEX |
+ DEXOPT_DOWNGRADE;
+ if ((flags & (~validityMask)) != 0) {
+ throw new IllegalArgumentException("Invalid flags : " + Integer.toHexString(flags));
+ }
+
+ mPackageName = packageName;
+ mCompilerFilter = compilerFilter;
+ mFlags = flags;
+ mSplitName = splitName;
+ }
+
+ public String getPackageName() {
+ return mPackageName;
+ }
+
+ public boolean isCheckForProfileUpdates() {
+ return (mFlags & DEXOPT_CHECK_FOR_PROFILES_UPDATES) != 0;
+ }
+
+ public String getCompilerFilter() {
+ return mCompilerFilter;
+ }
+
+ public boolean isForce() {
+ return (mFlags & DEXOPT_FORCE) != 0;
+ }
+
+ public boolean isBootComplete() {
+ return (mFlags & DEXOPT_BOOT_COMPLETE) != 0;
+ }
+
+ public boolean isDexoptOnlySecondaryDex() {
+ return (mFlags & DEXOPT_ONLY_SECONDARY_DEX) != 0;
+ }
+
+ public boolean isDexoptOnlySharedDex() {
+ return (mFlags & DEXOPT_ONLY_SHARED_DEX) != 0;
+ }
+
+ public boolean isDowngrade() {
+ return (mFlags & DEXOPT_DOWNGRADE) != 0;
+ }
+
+ public String getSplitName() {
+ return mSplitName;
+ }
+}
diff --git a/services/core/java/com/android/server/pm/dex/DexoptUtils.java b/services/core/java/com/android/server/pm/dex/DexoptUtils.java
new file mode 100644
index 0000000..18e91df
--- /dev/null
+++ b/services/core/java/com/android/server/pm/dex/DexoptUtils.java
@@ -0,0 +1,255 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.pm.dex;
+
+import android.content.pm.ApplicationInfo;
+import android.util.Slog;
+import android.util.SparseArray;
+
+import com.android.internal.os.ClassLoaderFactory;
+
+import java.io.File;
+import java.util.List;
+
+public final class DexoptUtils {
+ private static final String TAG = "DexoptUtils";
+
+ private DexoptUtils() {}
+
+ /**
+ * Creates the class loader context dependencies for each of the application code paths.
+ * The returned array contains the class loader contexts that needs to be passed to dexopt in
+ * order to ensure correct optimizations.
+ *
+ * A class loader context describes how the class loader chain should be built by dex2oat
+ * in order to ensure that classes are resolved during compilation as they would be resolved
+ * at runtime. The context will be encoded in the compiled code. If at runtime the dex file is
+ * loaded in a different context (with a different set of class loaders or a different
+ * classpath), the compiled code will be rejected.
+ *
+ * Note that the class loader context only includes dependencies and not the code path itself.
+ * The contexts are created based on the application split dependency list and
+ * the provided shared libraries.
+ *
+ * All the code paths encoded in the context will be relative to the base directory. This
+ * enables stage compilation where compiler artifacts may be moved around.
+ *
+ * The result is indexed as follows:
+ * - index 0 contains the context for the base apk
+ * - index 1 to n contain the context for the splits in the order determined by
+ * {@code info.getSplitCodePaths()}
+ *
+ * IMPORTANT: keep this logic in sync with the loading code in {@link android.app.LoadedApk}
+ * and pay attention to the way the classpath is created for the non isolated mode in:
+ * {@link android.app.LoadedApk#makePaths(
+ * android.app.ActivityThread, boolean, ApplicationInfo, List, List)}.
+ */
+ public static String[] getClassLoaderContexts(ApplicationInfo info, String[] sharedLibraries) {
+ // The base class loader context contains only the shared library.
+ String sharedLibrariesClassPath = encodeClasspath(sharedLibraries);
+ String baseApkContextClassLoader = encodeClassLoader(
+ sharedLibrariesClassPath, info.classLoaderName);
+
+ if (info.getSplitCodePaths() == null) {
+ // The application has no splits.
+ return new String[] {baseApkContextClassLoader};
+ }
+
+ // The application has splits. Compute their class loader contexts.
+
+ // First, cache the relative paths of the splits and do some sanity checks
+ String[] splitRelativeCodePaths = getSplitRelativeCodePaths(info);
+
+ // The splits have an implicit dependency on the base apk.
+ // This means that we have to add the base apk file in addition to the shared libraries.
+ String baseApkName = new File(info.getBaseCodePath()).getName();
+ String sharedLibrariesAndBaseClassPath =
+ encodeClasspath(sharedLibrariesClassPath, baseApkName);
+
+ // The result is stored in classLoaderContexts.
+ // Index 0 is the class loaded context for the base apk.
+ // Index `i` is the class loader context encoding for split `i`.
+ String[] classLoaderContexts = new String[/*base apk*/ 1 + splitRelativeCodePaths.length];
+ classLoaderContexts[0] = baseApkContextClassLoader;
+
+ if (!info.requestsIsolatedSplitLoading() || info.splitDependencies == null) {
+ // If the app didn't request for the splits to be loaded in isolation or if it does not
+ // declare inter-split dependencies, then all the splits will be loaded in the base
+ // apk class loader (in the order of their definition).
+ String classpath = sharedLibrariesAndBaseClassPath;
+ for (int i = 1; i < classLoaderContexts.length; i++) {
+ classLoaderContexts[i] = encodeClassLoader(classpath, info.classLoaderName);
+ classpath = encodeClasspath(classpath, splitRelativeCodePaths[i - 1]);
+ }
+ } else {
+ // In case of inter-split dependencies, we need to walk the dependency chain of each
+ // split. We do this recursively and store intermediate results in classLoaderContexts.
+
+ // First, look at the split class loaders and cache their individual contexts (i.e.
+ // the class loader + the name of the split). This is an optimization to avoid
+ // re-computing them during the recursive call.
+ // The cache is stored in splitClassLoaderEncodingCache. The difference between this and
+ // classLoaderContexts is that the later contains the full chain of class loaders for
+ // a given split while splitClassLoaderEncodingCache only contains a single class loader
+ // encoding.
+ String[] splitClassLoaderEncodingCache = new String[splitRelativeCodePaths.length];
+ for (int i = 0; i < splitRelativeCodePaths.length; i++) {
+ splitClassLoaderEncodingCache[i] = encodeClassLoader(splitRelativeCodePaths[i],
+ info.splitClassLoaderNames[i]);
+ }
+ String splitDependencyOnBase = encodeClassLoader(
+ sharedLibrariesAndBaseClassPath, info.classLoaderName);
+ SparseArray<int[]> splitDependencies = info.splitDependencies;
+ for (int i = 1; i < splitDependencies.size(); i++) {
+ getParentDependencies(splitDependencies.keyAt(i), splitClassLoaderEncodingCache,
+ splitDependencies, classLoaderContexts, splitDependencyOnBase);
+ }
+
+ // At this point classLoaderContexts contains only the parent dependencies.
+ // We also need to add the class loader of the current split which should
+ // come first in the context.
+ for (int i = 1; i < classLoaderContexts.length; i++) {
+ String splitClassLoader = encodeClassLoader("", info.splitClassLoaderNames[i - 1]);
+ classLoaderContexts[i] = encodeClassLoaderChain(
+ splitClassLoader, classLoaderContexts[i]);
+ }
+ }
+
+ return classLoaderContexts;
+ }
+
+ /**
+ * Recursive method to generate the class loader context dependencies for the split with the
+ * given index. {@param classLoaderContexts} acts as an accumulator. Upton return
+ * {@code classLoaderContexts[index]} will contain the split dependency.
+ * During computation, the method may resolve the dependencies of other splits as it traverses
+ * the entire parent chain. The result will also be stored in {@param classLoaderContexts}.
+ *
+ * Note that {@code index 0} denotes the base apk and it is special handled. When the
+ * recursive call hits {@code index 0} the method returns {@code splitDependencyOnBase}.
+ * {@code classLoaderContexts[0]} is not modified in this method.
+ *
+ * @param index the index of the split (Note that index 0 denotes the base apk)
+ * @param splitClassLoaderEncodingCache the class loader encoding for the individual splits.
+ * It contains only the split class loader and not the the base. The split
+ * with {@code index} has its context at {@code splitClassLoaderEncodingCache[index - 1]}.
+ * @param splitDependencies the dependencies for all splits. Note that in this array index 0
+ * is the base and splits start from index 1.
+ * @param classLoaderContexts the result accumulator. index 0 is the base and never set. Splits
+ * start at index 1.
+ * @param splitDependencyOnBase the encoding of the implicit split dependency on base.
+ */
+ private static String getParentDependencies(int index, String[] splitClassLoaderEncodingCache,
+ SparseArray<int[]> splitDependencies, String[] classLoaderContexts,
+ String splitDependencyOnBase) {
+ // If we hit the base apk return its custom dependency list which is
+ // sharedLibraries + base.apk
+ if (index == 0) {
+ return splitDependencyOnBase;
+ }
+ // Return the result if we've computed the splitDependencies for this index already.
+ if (classLoaderContexts[index] != null) {
+ return classLoaderContexts[index];
+ }
+ // Get the splitDependencies for the parent of this index and append its path to it.
+ int parent = splitDependencies.get(index)[0];
+ String parentDependencies = getParentDependencies(parent, splitClassLoaderEncodingCache,
+ splitDependencies, classLoaderContexts, splitDependencyOnBase);
+
+ // The split context is: `parent context + parent dependencies context`.
+ String splitContext = (parent == 0) ?
+ parentDependencies :
+ encodeClassLoaderChain(splitClassLoaderEncodingCache[parent - 1], parentDependencies);
+ classLoaderContexts[index] = splitContext;
+ return splitContext;
+ }
+
+ /**
+ * Encodes the shared libraries classpathElements in a format accepted by dexopt.
+ * NOTE: Keep this in sync with the dexopt expectations! Right now that is
+ * a list separated by ':'.
+ */
+ private static String encodeClasspath(String[] classpathElements) {
+ if (classpathElements == null || classpathElements.length == 0) {
+ return "";
+ }
+ StringBuilder sb = new StringBuilder();
+ for (String element : classpathElements) {
+ if (sb.length() != 0) {
+ sb.append(":");
+ }
+ sb.append(element);
+ }
+ return sb.toString();
+ }
+
+ /**
+ * Adds an element to the encoding of an existing classpath.
+ * {@see PackageDexOptimizer.encodeClasspath(String[])}
+ */
+ private static String encodeClasspath(String classpath, String newElement) {
+ return classpath.isEmpty() ? newElement : (classpath + ":" + newElement);
+ }
+
+ /**
+ * Encodes a single class loader dependency starting from {@param path} and
+ * {@param classLoaderName}.
+ * NOTE: Keep this in sync with the dexopt expectations! Right now that is either "PCL[path]"
+ * for a PathClassLoader or "DLC[path]" for a DelegateLastClassLoader.
+ */
+ private static String encodeClassLoader(String classpath, String classLoaderName) {
+ String classLoaderDexoptEncoding = classLoaderName;
+ if (ClassLoaderFactory.isPathClassLoaderName(classLoaderName)) {
+ classLoaderDexoptEncoding = "PCL";
+ } else if (ClassLoaderFactory.isDelegateLastClassLoaderName(classLoaderName)) {
+ classLoaderDexoptEncoding = "DLC";
+ } else {
+ Slog.wtf(TAG, "Unsupported classLoaderName: " + classLoaderName);
+ }
+ return classLoaderDexoptEncoding + "[" + classpath + "]";
+ }
+
+ /**
+ * Links to dependencies together in a format accepted by dexopt.
+ * NOTE: Keep this in sync with the dexopt expectations! Right now that is a list of split
+ * dependencies {@see encodeClassLoader} separated by ';'.
+ */
+ private static String encodeClassLoaderChain(String cl1, String cl2) {
+ return cl1.isEmpty() ? cl2 : (cl1 + ";" + cl2);
+ }
+
+ /**
+ * Returns the relative paths of the splits declared by the application {@code info}.
+ * Assumes that the application declares a non-null array of splits.
+ */
+ private static String[] getSplitRelativeCodePaths(ApplicationInfo info) {
+ String baseCodePath = new File(info.getBaseCodePath()).getParent();
+ String[] splitCodePaths = info.getSplitCodePaths();
+ String[] splitRelativeCodePaths = new String[splitCodePaths.length];
+ for (int i = 0; i < splitCodePaths.length; i++) {
+ File pathFile = new File(splitCodePaths[i]);
+ splitRelativeCodePaths[i] = pathFile.getName();
+ // Sanity check that the base paths of the splits are all the same.
+ String basePath = pathFile.getParent();
+ if (!basePath.equals(baseCodePath)) {
+ Slog.wtf(TAG, "Split paths have different base paths: " + basePath + " and " +
+ baseCodePath);
+ }
+ }
+ return splitRelativeCodePaths;
+ }
+}
diff --git a/services/core/java/com/android/server/pm/dex/PackageDexUsage.java b/services/core/java/com/android/server/pm/dex/PackageDexUsage.java
index 8a66f12..f7dd174 100644
--- a/services/core/java/com/android/server/pm/dex/PackageDexUsage.java
+++ b/services/core/java/com/android/server/pm/dex/PackageDexUsage.java
@@ -35,14 +35,19 @@
import java.io.Reader;
import java.io.StringWriter;
import java.io.Writer;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
import java.util.Iterator;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import dalvik.system.VMRuntime;
import libcore.io.IoUtils;
+import libcore.util.Objects;
/**
* Stat file which store usage information about dex files.
@@ -50,19 +55,23 @@
public class PackageDexUsage extends AbstractStatsBase<Void> {
private final static String TAG = "PackageDexUsage";
- private final static int PACKAGE_DEX_USAGE_VERSION = 1;
+ // The last version update: add the list of packages that load the dex files.
+ private final static int PACKAGE_DEX_USAGE_VERSION = 2;
+ // We support VERSION 1 to ensure that the usage list remains valid cross OTAs.
+ private final static int PACKAGE_DEX_USAGE_SUPPORTED_VERSION_1 = 1;
+
private final static String PACKAGE_DEX_USAGE_VERSION_HEADER =
"PACKAGE_MANAGER__PACKAGE_DEX_USAGE__";
private final static String SPLIT_CHAR = ",";
private final static String DEX_LINE_CHAR = "#";
-
+ private final static String LOADING_PACKAGE_CHAR = "@";
// Map which structures the information we have on a package.
// Maps package name to package data (which stores info about UsedByOtherApps and
// secondary dex files.).
// Access to this map needs synchronized.
@GuardedBy("mPackageUseInfoMap")
- private Map<String, PackageUseInfo> mPackageUseInfoMap;
+ private final Map<String, PackageUseInfo> mPackageUseInfoMap;
public PackageDexUsage() {
super("package-dex-usage.list", "PackageDexUsage_DiskWriter", /*lock*/ false);
@@ -75,18 +84,21 @@
* Note this is called when apps load dex files and as such it should return
* as fast as possible.
*
- * @param loadingPackage the package performing the load
+ * @param owningPackageName the package owning the dex path
* @param dexPath the path of the dex files being loaded
* @param ownerUserId the user id which runs the code loading the dex files
* @param loaderIsa the ISA of the app loading the dex files
* @param isUsedByOtherApps whether or not this dex file was not loaded by its owning package
* @param primaryOrSplit whether or not the dex file is a primary/split dex. True indicates
* the file is either primary or a split. False indicates the file is secondary dex.
+ * @param loadingPackageName the package performing the load. Recorded only if it is different
+ * than {@param owningPackageName}.
* @return true if the dex load constitutes new information, or false if this information
* has been seen before.
*/
public boolean record(String owningPackageName, String dexPath, int ownerUserId,
- String loaderIsa, boolean isUsedByOtherApps, boolean primaryOrSplit) {
+ String loaderIsa, boolean isUsedByOtherApps, boolean primaryOrSplit,
+ String loadingPackageName) {
if (!PackageManagerServiceUtils.checkISA(loaderIsa)) {
throw new IllegalArgumentException("loaderIsa " + loaderIsa + " is unsupported");
}
@@ -100,11 +112,15 @@
// We do not need to record the loaderIsa or the owner because we compile
// primaries for all users and all ISAs.
packageUseInfo.mIsUsedByOtherApps = isUsedByOtherApps;
+ maybeAddLoadingPackage(owningPackageName, loadingPackageName,
+ packageUseInfo.mLoadingPackages);
} else {
// For secondary dex files record the loaderISA and the owner. We'll need
// to know under which user to compile and for what ISA.
- packageUseInfo.mDexUseInfoMap.put(
- dexPath, new DexUseInfo(isUsedByOtherApps, ownerUserId, loaderIsa));
+ DexUseInfo newData = new DexUseInfo(isUsedByOtherApps, ownerUserId, loaderIsa);
+ packageUseInfo.mDexUseInfoMap.put(dexPath, newData);
+ maybeAddLoadingPackage(owningPackageName, loadingPackageName,
+ newData.mLoadingPackages);
}
mPackageUseInfoMap.put(owningPackageName, packageUseInfo);
return true;
@@ -113,10 +129,15 @@
if (primaryOrSplit) {
// We have a possible update on the primary apk usage. Merge
// isUsedByOtherApps information and return if there was an update.
- return packageUseInfo.merge(isUsedByOtherApps);
+ boolean updateLoadingPackages = maybeAddLoadingPackage(owningPackageName,
+ loadingPackageName, packageUseInfo.mLoadingPackages);
+ return packageUseInfo.merge(isUsedByOtherApps) || updateLoadingPackages;
} else {
DexUseInfo newData = new DexUseInfo(
isUsedByOtherApps, ownerUserId, loaderIsa);
+ boolean updateLoadingPackages = maybeAddLoadingPackage(owningPackageName,
+ loadingPackageName, newData.mLoadingPackages);
+
DexUseInfo existingData = packageUseInfo.mDexUseInfoMap.get(dexPath);
if (existingData == null) {
// It's the first time we see this dex file.
@@ -138,7 +159,7 @@
}
// Merge the information into the existing data.
// Returns true if there was an update.
- return existingData.merge(newData);
+ return existingData.merge(newData) || updateLoadingPackages;
}
}
}
@@ -185,15 +206,21 @@
*
* file_magic_version
* package_name_1
+ * @ loading_package_1_1, loading_package_1_2...
* #dex_file_path_1_1
+ * @ loading_package_1_1_1, loading_package_1_1_2...
* user_1_1, used_by_other_app_1_1, user_isa_1_1_1, user_isa_1_1_2
* #dex_file_path_1_2
+ * @ loading_package_1_2_1, loading_package_1_2_2...
* user_1_2, used_by_other_app_1_2, user_isa_1_2_1, user_isa_1_2_2
* ...
* package_name_2
+ * @ loading_package_2_1, loading_package_2_1_2...
* #dex_file_path_2_1
+ * @ loading_package_2_1_1, loading_package_2_1_2...
* user_2_1, used_by_other_app_2_1, user_isa_2_1_1, user_isa_2_1_2
* #dex_file_path_2_2,
+ * @ loading_package_2_2_1, loading_package_2_2_2...
* user_2_2, used_by_other_app_2_2, user_isa_2_2_1, user_isa_2_2_2
* ...
*/
@@ -214,12 +241,17 @@
fpw.println(String.join(SPLIT_CHAR, packageName,
writeBoolean(packageUseInfo.mIsUsedByOtherApps)));
+ fpw.println(LOADING_PACKAGE_CHAR +
+ String.join(SPLIT_CHAR, packageUseInfo.mLoadingPackages));
// Write dex file lines.
for (Map.Entry<String, DexUseInfo> dEntry : packageUseInfo.mDexUseInfoMap.entrySet()) {
String dexPath = dEntry.getKey();
DexUseInfo dexUseInfo = dEntry.getValue();
fpw.println(DEX_LINE_CHAR + dexPath);
+ fpw.println(LOADING_PACKAGE_CHAR +
+ String.join(SPLIT_CHAR, dexUseInfo.mLoadingPackages));
+
fpw.print(String.join(SPLIT_CHAR, Integer.toString(dexUseInfo.mOwnerUserId),
writeBoolean(dexUseInfo.mIsUsedByOtherApps)));
for (String isa : dexUseInfo.mLoaderIsas) {
@@ -252,6 +284,7 @@
BufferedReader in = new BufferedReader(reader);
// Read header, do version check.
String versionLine = in.readLine();
+ int version;
if (versionLine == null) {
throw new IllegalStateException("No version line found.");
} else {
@@ -259,16 +292,16 @@
// TODO(calin): the caller is responsible to clear the file.
throw new IllegalStateException("Invalid version line: " + versionLine);
}
- int version = Integer.parseInt(
+ version = Integer.parseInt(
versionLine.substring(PACKAGE_DEX_USAGE_VERSION_HEADER.length()));
- if (version != PACKAGE_DEX_USAGE_VERSION) {
+ if (!isSupportedVersion(version)) {
throw new IllegalStateException("Unexpected version: " + version);
}
}
- String s = null;
- String currentPakage = null;
- PackageUseInfo currentPakageData = null;
+ String s;
+ String currentPackage = null;
+ PackageUseInfo currentPackageData = null;
Set<String> supportedIsas = new HashSet<>();
for (String abi : Build.SUPPORTED_ABIS) {
@@ -280,17 +313,21 @@
// We expect two lines for each dex entry:
// #dexPaths
// onwerUserId,isUsedByOtherApps,isa1,isa2
- if (currentPakage == null) {
+ if (currentPackage == null) {
throw new IllegalStateException(
"Malformed PackageDexUsage file. Expected package line before dex line.");
}
// First line is the dex path.
String dexPath = s.substring(DEX_LINE_CHAR.length());
+
+ // In version 2 the second line contains the list of packages that loaded the file.
+ List<String> loadingPackages = maybeReadLoadingPackages(in, version);
+
// Next line is the dex data.
s = in.readLine();
if (s == null) {
- throw new IllegalStateException("Could not fine dexUseInfo for line: " + s);
+ throw new IllegalStateException("Could not find dexUseInfo for line: " + s);
}
// We expect at least 3 elements (isUsedByOtherApps, userId, isa).
@@ -301,6 +338,8 @@
int ownerUserId = Integer.parseInt(elems[0]);
boolean isUsedByOtherApps = readBoolean(elems[1]);
DexUseInfo dexUseInfo = new DexUseInfo(isUsedByOtherApps, ownerUserId);
+ dexUseInfo.mLoadingPackages.addAll(loadingPackages);
+
for (int i = 2; i < elems.length; i++) {
String isa = elems[i];
if (supportedIsas.contains(isa)) {
@@ -317,7 +356,7 @@
"unsupported isas. dexPath=" + dexPath);
continue;
}
- currentPakageData.mDexUseInfoMap.put(dexPath, dexUseInfo);
+ currentPackageData.mDexUseInfoMap.put(dexPath, dexUseInfo);
} else {
// This is a package line.
// We expect it to be: `packageName,isUsedByOtherApps`.
@@ -325,10 +364,11 @@
if (elems.length != 2) {
throw new IllegalStateException("Invalid PackageDexUsage line: " + s);
}
- currentPakage = elems[0];
- currentPakageData = new PackageUseInfo();
- currentPakageData.mIsUsedByOtherApps = readBoolean(elems[1]);
- data.put(currentPakage, currentPakageData);
+ currentPackage = elems[0];
+ currentPackageData = new PackageUseInfo();
+ currentPackageData.mIsUsedByOtherApps = readBoolean(elems[1]);
+ currentPackageData.mLoadingPackages.addAll(maybeReadLoadingPackages(in, version));
+ data.put(currentPackage, currentPackageData);
}
}
@@ -339,6 +379,43 @@
}
/**
+ * Reads the list of loading packages from the buffer {@parm in} if
+ * {@code version} is at least {PACKAGE_DEX_USAGE_VERSION}.
+ */
+ private List<String> maybeReadLoadingPackages(BufferedReader in, int version)
+ throws IOException {
+ if (version == PACKAGE_DEX_USAGE_VERSION) {
+ String line = in.readLine();
+ if (line == null) {
+ throw new IllegalStateException("Could not find the loadingPackages line.");
+ }
+ // We expect that most of the times the list of loading packages will be empty.
+ if (line.length() == LOADING_PACKAGE_CHAR.length()) {
+ return Collections.emptyList();
+ } else {
+ return Arrays.asList(
+ line.substring(LOADING_PACKAGE_CHAR.length()).split(SPLIT_CHAR));
+ }
+ } else {
+ return Collections.emptyList();
+ }
+ }
+
+ /**
+ * Utility method which adds {@param loadingPackage} to {@param loadingPackages} only if it's
+ * not equal to {@param owningPackage}
+ */
+ private boolean maybeAddLoadingPackage(String owningPackage, String loadingPackage,
+ Set<String> loadingPackages) {
+ return !owningPackage.equals(loadingPackage) && loadingPackages.add(loadingPackage);
+ }
+
+ private boolean isSupportedVersion(int version) {
+ return version == PACKAGE_DEX_USAGE_VERSION ||
+ version == PACKAGE_DEX_USAGE_SUPPORTED_VERSION_1;
+ }
+
+ /**
* Syncs the existing data with the set of available packages by removing obsolete entries.
*/
public void syncData(Map<String, Set<Integer>> packageToUsersMap) {
@@ -539,10 +616,13 @@
private boolean mIsUsedByOtherApps;
// Map dex paths to their data (isUsedByOtherApps, owner id, loader isa).
private final Map<String, DexUseInfo> mDexUseInfoMap;
+ // Packages who load this dex file.
+ private final Set<String> mLoadingPackages;
public PackageUseInfo() {
mIsUsedByOtherApps = false;
mDexUseInfoMap = new HashMap<>();
+ mLoadingPackages = new HashSet<>();
}
// Creates a deep copy of the `other`.
@@ -552,6 +632,7 @@
for (Map.Entry<String, DexUseInfo> e : other.mDexUseInfoMap.entrySet()) {
mDexUseInfoMap.put(e.getKey(), new DexUseInfo(e.getValue()));
}
+ mLoadingPackages = new HashSet<>(other.mLoadingPackages);
}
private boolean merge(boolean isUsedByOtherApps) {
@@ -567,6 +648,10 @@
public Map<String, DexUseInfo> getDexUseInfoMap() {
return mDexUseInfoMap;
}
+
+ public Set<String> getLoadingPackages() {
+ return mLoadingPackages;
+ }
}
/**
@@ -576,6 +661,8 @@
private boolean mIsUsedByOtherApps;
private final int mOwnerUserId;
private final Set<String> mLoaderIsas;
+ // Packages who load this dex file.
+ private final Set<String> mLoadingPackages;
public DexUseInfo(boolean isUsedByOtherApps, int ownerUserId) {
this(isUsedByOtherApps, ownerUserId, null);
@@ -588,6 +675,7 @@
if (loaderIsa != null) {
mLoaderIsas.add(loaderIsa);
}
+ mLoadingPackages = new HashSet<>();
}
// Creates a deep copy of the `other`.
@@ -595,13 +683,16 @@
mIsUsedByOtherApps = other.mIsUsedByOtherApps;
mOwnerUserId = other.mOwnerUserId;
mLoaderIsas = new HashSet<>(other.mLoaderIsas);
+ mLoadingPackages = new HashSet<>(other.mLoadingPackages);
}
private boolean merge(DexUseInfo dexUseInfo) {
boolean oldIsUsedByOtherApps = mIsUsedByOtherApps;
mIsUsedByOtherApps = mIsUsedByOtherApps || dexUseInfo.mIsUsedByOtherApps;
boolean updateIsas = mLoaderIsas.addAll(dexUseInfo.mLoaderIsas);
- return updateIsas || (oldIsUsedByOtherApps != mIsUsedByOtherApps);
+ boolean updateLoadingPackages = mLoadingPackages.addAll(dexUseInfo.mLoadingPackages);
+ return updateIsas || (oldIsUsedByOtherApps != mIsUsedByOtherApps) ||
+ updateLoadingPackages;
}
public boolean isUsedByOtherApps() {
@@ -615,5 +706,9 @@
public Set<String> getLoaderIsas() {
return mLoaderIsas;
}
+
+ public Set<String> getLoadingPackages() {
+ return mLoadingPackages;
+ }
}
}
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index 50f4f24..0c72326 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -2961,8 +2961,15 @@
boolean disabled = false;
final int appid = UserHandle.getAppId(wakeLock.mOwnerUid);
if (appid >= Process.FIRST_APPLICATION_UID) {
+ // Cached inactive processes are never allowed to hold wake locks.
+ if (mConstants.NO_CACHED_WAKE_LOCKS) {
+ disabled = !wakeLock.mUidState.mActive &&
+ wakeLock.mUidState.mProcState
+ != ActivityManager.PROCESS_STATE_NONEXISTENT &&
+ wakeLock.mUidState.mProcState > ActivityManager.PROCESS_STATE_RECEIVER;
+ }
if (mDeviceIdleMode) {
- // If we are in idle mode, we will ignore all partial wake locks that are
+ // If we are in idle mode, we will also ignore all partial wake locks that are
// for application uids that are not whitelisted.
final UidState state = wakeLock.mUidState;
if (Arrays.binarySearch(mDeviceIdleWhitelist, appid) < 0 &&
@@ -2971,11 +2978,6 @@
state.mProcState > ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE) {
disabled = true;
}
- } else if (mConstants.NO_CACHED_WAKE_LOCKS) {
- disabled = !wakeLock.mUidState.mActive &&
- wakeLock.mUidState.mProcState
- != ActivityManager.PROCESS_STATE_NONEXISTENT &&
- wakeLock.mUidState.mProcState > ActivityManager.PROCESS_STATE_RECEIVER;
}
}
if (wakeLock.mDisabled != disabled) {
diff --git a/services/core/java/com/android/server/radio/RadioService.java b/services/core/java/com/android/server/radio/RadioService.java
deleted file mode 100644
index 34bbffd..0000000
--- a/services/core/java/com/android/server/radio/RadioService.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/**
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.radio;
-
-import android.content.Context;
-import android.hardware.radio.IRadioService;
-import android.hardware.radio.ITuner;
-import android.hardware.radio.ITunerCallback;
-import android.hardware.radio.RadioManager;
-import android.util.Slog;
-
-import com.android.server.SystemService;
-
-public class RadioService extends SystemService {
- // TODO(b/36863239): rename to RadioService when native service goes away
- private static final String TAG = "RadioServiceJava";
-
- private final RadioServiceImpl mServiceImpl = new RadioServiceImpl();
-
- /**
- * This field is used by native code, do not access or modify.
- */
- private final long mNativeContext = nativeInit();
-
- private final Object mLock = new Object();
-
- public RadioService(Context context) {
- super(context);
- }
-
- @Override
- protected void finalize() throws Throwable {
- nativeFinalize(mNativeContext);
- super.finalize();
- }
-
- private native long nativeInit();
- private native void nativeFinalize(long nativeContext);
- private native Tuner nativeOpenTuner(long nativeContext, int moduleId,
- RadioManager.BandConfig config, boolean withAudio, ITunerCallback callback);
-
- @Override
- public void onStart() {
- publishBinderService(Context.RADIO_SERVICE, mServiceImpl);
- Slog.v(TAG, "RadioService started");
- }
-
- private class RadioServiceImpl extends IRadioService.Stub {
- @Override
- public ITuner openTuner(int moduleId, RadioManager.BandConfig bandConfig,
- boolean withAudio, ITunerCallback callback) {
- if (callback == null) {
- throw new IllegalArgumentException("Callback must not be empty");
- }
- synchronized (mLock) {
- // TODO(b/36863239): add death monitoring for binder
- return nativeOpenTuner(mNativeContext, moduleId, bandConfig, withAudio, callback);
- }
- }
- }
-}
diff --git a/services/core/java/com/android/server/radio/Tuner.java b/services/core/java/com/android/server/radio/Tuner.java
deleted file mode 100644
index 9915c34..0000000
--- a/services/core/java/com/android/server/radio/Tuner.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/**
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.radio;
-
-import android.annotation.NonNull;
-import android.hardware.radio.ITuner;
-import android.hardware.radio.ITunerCallback;
-import android.hardware.radio.RadioManager;
-import android.util.Slog;
-
-import java.util.List;
-
-class Tuner extends ITuner.Stub {
- // TODO(b/36863239): rename to RadioService.Tuner when native service goes away
- private static final String TAG = "RadioServiceJava.Tuner";
-
- /**
- * This field is used by native code, do not access or modify.
- */
- private final long mNativeContext;
-
- @NonNull private final TunerCallback mTunerCallback;
- private final Object mLock = new Object();
- private boolean mIsClosed = false;
- private boolean mIsMuted = false;
- private int mRegion; // TODO(b/36863239): find better solution to manage regions
- private final boolean mWithAudio;
-
- Tuner(@NonNull ITunerCallback clientCallback, int halRev, int region, boolean withAudio) {
- mTunerCallback = new TunerCallback(this, clientCallback, halRev);
- mRegion = region;
- mWithAudio = withAudio;
- mNativeContext = nativeInit(halRev);
- }
-
- @Override
- protected void finalize() throws Throwable {
- nativeFinalize(mNativeContext);
- super.finalize();
- }
-
- private native long nativeInit(int halRev);
- private native void nativeFinalize(long nativeContext);
- private native void nativeClose(long nativeContext);
-
- private native void nativeSetConfiguration(long nativeContext,
- @NonNull RadioManager.BandConfig config);
- private native RadioManager.BandConfig nativeGetConfiguration(long nativeContext, int region);
-
- private native void nativeStep(long nativeContext, boolean directionDown, boolean skipSubChannel);
- private native void nativeScan(long nativeContext, boolean directionDown, boolean skipSubChannel);
- private native void nativeTune(long nativeContext, int channel, int subChannel);
- private native void nativeCancel(long nativeContext);
-
- private native RadioManager.ProgramInfo nativeGetProgramInformation(long nativeContext);
- private native boolean nativeStartBackgroundScan(long nativeContext);
- private native List<RadioManager.ProgramInfo> nativeGetProgramList(long nativeContext,
- String filter);
-
- private native boolean nativeIsAnalogForced(long nativeContext);
- private native void nativeSetAnalogForced(long nativeContext, boolean isForced);
-
- private native boolean nativeIsAntennaConnected(long nativeContext);
-
- @Override
- public void close() {
- synchronized (mLock) {
- if (mIsClosed) return;
- mTunerCallback.detach();
- nativeClose(mNativeContext);
- mIsClosed = true;
- }
- }
-
- private void checkNotClosedLocked() {
- if (mIsClosed) {
- throw new IllegalStateException("Tuner is closed, no further operations are allowed");
- }
- }
-
- @Override
- public void setConfiguration(RadioManager.BandConfig config) {
- if (config == null) {
- throw new IllegalArgumentException("The argument must not be a null pointer");
- }
- synchronized (mLock) {
- checkNotClosedLocked();
- nativeSetConfiguration(mNativeContext, config);
- mRegion = config.getRegion();
- }
- }
-
- @Override
- public RadioManager.BandConfig getConfiguration() {
- synchronized (mLock) {
- checkNotClosedLocked();
- return nativeGetConfiguration(mNativeContext, mRegion);
- }
- }
-
- @Override
- public void setMuted(boolean mute) {
- if (!mWithAudio) {
- throw new IllegalStateException("Can't operate on mute - no audio requested");
- }
- synchronized (mLock) {
- checkNotClosedLocked();
- if (mIsMuted == mute) return;
- mIsMuted = mute;
-
- // TODO(b/34348946): notifify audio policy manager of media activity on radio audio
- // device. This task is pulled directly from previous implementation of native service.
- }
- }
-
- @Override
- public boolean isMuted() {
- if (!mWithAudio) {
- Slog.w(TAG, "Tuner did not request audio, pretending it was muted");
- return true;
- }
- synchronized (mLock) {
- checkNotClosedLocked();
- return mIsMuted;
- }
- }
-
- @Override
- public void step(boolean directionDown, boolean skipSubChannel) {
- synchronized (mLock) {
- checkNotClosedLocked();
- nativeStep(mNativeContext, directionDown, skipSubChannel);
- }
- }
-
- @Override
- public void scan(boolean directionDown, boolean skipSubChannel) {
- synchronized (mLock) {
- checkNotClosedLocked();
- nativeScan(mNativeContext, directionDown, skipSubChannel);
- }
- }
-
- @Override
- public void tune(int channel, int subChannel) {
- synchronized (mLock) {
- checkNotClosedLocked();
- nativeTune(mNativeContext, channel, subChannel);
- }
- }
-
- @Override
- public void cancel() {
- synchronized (mLock) {
- checkNotClosedLocked();
- nativeCancel(mNativeContext);
- }
- }
-
- @Override
- public RadioManager.ProgramInfo getProgramInformation() {
- synchronized (mLock) {
- checkNotClosedLocked();
- return nativeGetProgramInformation(mNativeContext);
- }
- }
-
- @Override
- public boolean startBackgroundScan() {
- synchronized (mLock) {
- checkNotClosedLocked();
- return nativeStartBackgroundScan(mNativeContext);
- }
- }
-
- @Override
- public List<RadioManager.ProgramInfo> getProgramList(String filter) {
- synchronized (mLock) {
- checkNotClosedLocked();
- List<RadioManager.ProgramInfo> list = nativeGetProgramList(mNativeContext, filter);
- if (list == null) {
- throw new IllegalStateException("Program list is not ready");
- }
- return list;
- }
- }
-
- @Override
- public boolean isAnalogForced() {
- synchronized (mLock) {
- checkNotClosedLocked();
- return nativeIsAnalogForced(mNativeContext);
- }
- }
-
- @Override
- public void setAnalogForced(boolean isForced) {
- synchronized (mLock) {
- checkNotClosedLocked();
- nativeSetAnalogForced(mNativeContext, isForced);
- }
- }
-
- @Override
- public boolean isAntennaConnected() {
- synchronized (mLock) {
- checkNotClosedLocked();
- return nativeIsAntennaConnected(mNativeContext);
- }
- }
-}
diff --git a/services/core/java/com/android/server/radio/TunerCallback.java b/services/core/java/com/android/server/radio/TunerCallback.java
deleted file mode 100644
index fcc874b..0000000
--- a/services/core/java/com/android/server/radio/TunerCallback.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/**
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.radio;
-
-import android.annotation.NonNull;
-import android.hardware.radio.ITuner;
-import android.hardware.radio.ITunerCallback;
-import android.hardware.radio.RadioManager;
-import android.hardware.radio.RadioTuner;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.util.Slog;
-
-class TunerCallback implements ITunerCallback {
- // TODO(b/36863239): rename to RadioService.TunerCallback when native service goes away
- private static final String TAG = "RadioServiceJava.TunerCallback";
-
- /**
- * This field is used by native code, do not access or modify.
- */
- private final long mNativeContext;
-
- @NonNull private final Tuner mTuner;
- @NonNull private final ITunerCallback mClientCallback;
-
- TunerCallback(@NonNull Tuner tuner, @NonNull ITunerCallback clientCallback, int halRev) {
- mTuner = tuner;
- mClientCallback = clientCallback;
- mNativeContext = nativeInit(tuner, halRev);
- }
-
- @Override
- protected void finalize() throws Throwable {
- nativeFinalize(mNativeContext);
- super.finalize();
- }
-
- private native long nativeInit(@NonNull Tuner tuner, int halRev);
- private native void nativeFinalize(long nativeContext);
- private native void nativeDetach(long nativeContext);
-
- public void detach() {
- nativeDetach(mNativeContext);
- }
-
- // called from native side
- private void handleHwFailure() {
- onError(RadioTuner.ERROR_HARDWARE_FAILURE);
- mTuner.close();
- }
-
- @Override
- public void onError(int status) {
- try {
- mClientCallback.onError(status);
- } catch (RemoteException e) {
- Slog.e(TAG, "client died", e);
- }
- }
-
- @Override
- public void onConfigurationChanged(RadioManager.BandConfig config) {
- try {
- mClientCallback.onConfigurationChanged(config);
- } catch (RemoteException e) {
- Slog.e(TAG, "client died", e);
- }
- }
-
- @Override
- public void onProgramInfoChanged(RadioManager.ProgramInfo info) {
- try {
- mClientCallback.onProgramInfoChanged(info);
- } catch (RemoteException e) {
- Slog.e(TAG, "client died", e);
- }
- }
-
- @Override
- public IBinder asBinder() {
- throw new RuntimeException("Not a binder");
- }
-}
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
index 2df0f10..ae04b83 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
@@ -359,6 +359,18 @@
}
@Override
+ public void togglePanel() {
+ enforceExpandStatusBar();
+
+ if (mBar != null) {
+ try {
+ mBar.togglePanel();
+ } catch (RemoteException ex) {
+ }
+ }
+ }
+
+ @Override
public void expandSettingsPanel(String subPanel) {
enforceExpandStatusBar();
diff --git a/services/core/java/com/android/server/timezone/FileDescriptorHelper.java b/services/core/java/com/android/server/timezone/FileDescriptorHelper.java
deleted file mode 100644
index c3b1101..0000000
--- a/services/core/java/com/android/server/timezone/FileDescriptorHelper.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.timezone;
-
-import android.os.ParcelFileDescriptor;
-
-import java.io.IOException;
-
-/**
- * An easy-to-mock interface around use of {@link ParcelFileDescriptor} for use by
- * {@link RulesManagerService}.
- */
-interface FileDescriptorHelper {
-
- byte[] readFully(ParcelFileDescriptor parcelFileDescriptor) throws IOException;
-}
diff --git a/services/core/java/com/android/server/timezone/IntentHelperImpl.java b/services/core/java/com/android/server/timezone/IntentHelperImpl.java
index 3ffbb2d..11928b9 100644
--- a/services/core/java/com/android/server/timezone/IntentHelperImpl.java
+++ b/services/core/java/com/android/server/timezone/IntentHelperImpl.java
@@ -16,6 +16,8 @@
package com.android.server.timezone;
+import com.android.server.EventLogTags;
+
import android.app.timezone.RulesUpdaterContract;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -24,8 +26,6 @@
import android.os.PatternMatcher;
import android.util.Slog;
-import java.util.regex.Pattern;
-
/**
* The bona fide implementation of {@link IntentHelper}.
*/
@@ -75,6 +75,7 @@
public void sendTriggerUpdateCheck(CheckToken checkToken) {
RulesUpdaterContract.sendBroadcast(
mContext, mUpdaterAppPackageName, checkToken.toByteArray());
+ EventLogTags.writeTimezoneTriggerCheck(checkToken.toString());
}
@Override
diff --git a/services/core/java/com/android/server/timezone/PackageStatusStorage.java b/services/core/java/com/android/server/timezone/PackageStatusStorage.java
index 31f0e31..cac7f7b 100644
--- a/services/core/java/com/android/server/timezone/PackageStatusStorage.java
+++ b/services/core/java/com/android/server/timezone/PackageStatusStorage.java
@@ -16,73 +16,85 @@
package com.android.server.timezone;
-import android.content.ContentValues;
-import android.content.Context;
-import android.database.Cursor;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteOpenHelper;
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.util.FastXmlSerializer;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+import org.xmlpull.v1.XmlSerializer;
+
+import android.util.AtomicFile;
import android.util.Slog;
+import android.util.Xml;
import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.text.ParseException;
+import java.io.PrintWriter;
import static com.android.server.timezone.PackageStatus.CHECK_COMPLETED_FAILURE;
import static com.android.server.timezone.PackageStatus.CHECK_COMPLETED_SUCCESS;
import static com.android.server.timezone.PackageStatus.CHECK_STARTED;
+import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT;
+import static org.xmlpull.v1.XmlPullParser.START_TAG;
/**
* Storage logic for accessing/mutating the Android system's persistent state related to time zone
- * update checking. There is expected to be a single instance and all methods synchronized on
- * {@code this} for thread safety.
+ * update checking. There is expected to be a single instance. All non-private methods are thread
+ * safe.
*/
final class PackageStatusStorage {
- private static final String TAG = "timezone.PackageStatusStorage";
+ private static final String LOG_TAG = "timezone.PackageStatusStorage";
- private static final String DATABASE_NAME = "timezonepackagestatus.db";
- private static final int DATABASE_VERSION = 1;
-
- /** The table name. It will have a single row with _id == {@link #SINGLETON_ID} */
- private static final String TABLE = "status";
- private static final String COLUMN_ID = "_id";
+ private static final String TAG_PACKAGE_STATUS = "PackageStatus";
/**
- * Column that stores a monotonically increasing lock ID, used to detect concurrent update
+ * Attribute that stores a monotonically increasing lock ID, used to detect concurrent update
* issues without on-line locks. Incremented on every write.
*/
- private static final String COLUMN_OPTIMISTIC_LOCK_ID = "optimistic_lock_id";
+ private static final String ATTRIBUTE_OPTIMISTIC_LOCK_ID = "optimisticLockId";
/**
- * Column that stores the current "check status" of the time zone update application packages.
+ * Attribute that stores the current "check status" of the time zone update application
+ * packages.
*/
- private static final String COLUMN_CHECK_STATUS = "check_status";
+ private static final String ATTRIBUTE_CHECK_STATUS = "checkStatus";
/**
- * Column that stores the version of the time zone rules update application being checked / last
- * checked.
+ * Attribute that stores the version of the time zone rules update application being checked
+ * / last checked.
*/
- private static final String COLUMN_UPDATE_APP_VERSION = "update_app_package_version";
+ private static final String ATTRIBUTE_UPDATE_APP_VERSION = "updateAppPackageVersion";
/**
- * Column that stores the version of the time zone rules data application being checked / last
- * checked.
+ * Attribute that stores the version of the time zone rules data application being checked
+ * / last checked.
*/
- private static final String COLUMN_DATA_APP_VERSION = "data_app_package_version";
-
- /**
- * The ID of the one row.
- */
- private static final int SINGLETON_ID = 1;
+ private static final String ATTRIBUTE_DATA_APP_VERSION = "dataAppPackageVersion";
private static final int UNKNOWN_PACKAGE_VERSION = -1;
- private final DatabaseHelper mDatabaseHelper;
+ private final AtomicFile mPackageStatusFile;
- PackageStatusStorage(Context context) {
- mDatabaseHelper = new DatabaseHelper(context);
+ PackageStatusStorage(File storageDir) {
+ mPackageStatusFile = new AtomicFile(new File(storageDir, "package-status.xml"));
+ if (!mPackageStatusFile.getBaseFile().exists()) {
+ try {
+ insertInitialPackageStatus();
+ } catch (IOException e) {
+ throw new IllegalStateException(e);
+ }
+ }
}
- void deleteDatabaseForTests() {
- SQLiteDatabase.deleteDatabase(mDatabaseHelper.getDatabaseFile());
+ void deleteFileForTests() {
+ synchronized(this) {
+ mPackageStatusFile.delete();
+ }
}
/**
@@ -92,49 +104,62 @@
PackageStatus getPackageStatus() {
synchronized (this) {
try {
- return getPackageStatusInternal();
- } catch (IllegalArgumentException e) {
- // This means that data exists in the table but it was bad.
- Slog.e(TAG, "Package status invalid, resetting and retrying", e);
+ return getPackageStatusLocked();
+ } catch (ParseException e) {
+ // This means that data exists in the file but it was bad.
+ Slog.e(LOG_TAG, "Package status invalid, resetting and retrying", e);
// Reset the storage so it is in a good state again.
- mDatabaseHelper.recoverFromBadData();
- return getPackageStatusInternal();
+ recoverFromBadData(e);
+ try {
+ return getPackageStatusLocked();
+ } catch (ParseException e2) {
+ throw new IllegalStateException("Recovery from bad file failed", e2);
+ }
}
}
}
- private PackageStatus getPackageStatusInternal() {
- String[] columns = {
- COLUMN_CHECK_STATUS, COLUMN_UPDATE_APP_VERSION, COLUMN_DATA_APP_VERSION
- };
- Cursor cursor = mDatabaseHelper.getReadableDatabase()
- .query(TABLE, columns, COLUMN_ID + " = ?",
- new String[] { Integer.toString(SINGLETON_ID) },
- null /* groupBy */, null /* having */, null /* orderBy */);
- if (cursor.getCount() != 1) {
- Slog.e(TAG, "Unable to find package status from package status row. Rows returned: "
- + cursor.getCount());
- return null;
+ @GuardedBy("this")
+ private PackageStatus getPackageStatusLocked() throws ParseException {
+ try (FileInputStream fis = mPackageStatusFile.openRead()) {
+ XmlPullParser parser = parseToPackageStatusTag(fis);
+ Integer checkStatus = getNullableIntAttribute(parser, ATTRIBUTE_CHECK_STATUS);
+ if (checkStatus == null) {
+ return null;
+ }
+ int updateAppVersion = getIntAttribute(parser, ATTRIBUTE_UPDATE_APP_VERSION);
+ int dataAppVersion = getIntAttribute(parser, ATTRIBUTE_DATA_APP_VERSION);
+ return new PackageStatus(checkStatus,
+ new PackageVersions(updateAppVersion, dataAppVersion));
+ } catch (IOException e) {
+ ParseException e2 = new ParseException("Error reading package status", 0);
+ e2.initCause(e);
+ throw e2;
}
- cursor.moveToFirst();
+ }
- // Determine check status.
- if (cursor.isNull(0)) {
- // This is normal the first time getPackageStatus() is called, or after
- // resetCheckState().
- return null;
+ @GuardedBy("this")
+ private int recoverFromBadData(Exception cause) {
+ mPackageStatusFile.delete();
+ try {
+ return insertInitialPackageStatus();
+ } catch (IOException e) {
+ IllegalStateException fatal = new IllegalStateException(e);
+ fatal.addSuppressed(cause);
+ throw fatal;
}
- int checkStatus = cursor.getInt(0);
+ }
- // Determine package version.
- if (cursor.isNull(1) || cursor.isNull(2)) {
- Slog.e(TAG, "Package version information unexpectedly null");
- return null;
- }
- PackageVersions packageVersions = new PackageVersions(cursor.getInt(1), cursor.getInt(2));
+ /** Insert the initial data, returning the optimistic lock ID */
+ private int insertInitialPackageStatus() throws IOException {
+ // Doesn't matter what it is, but we avoid the obvious starting value each time the data
+ // is reset to ensure that old tokens are unlikely to work.
+ final int initialOptimisticLockId = (int) System.currentTimeMillis();
- return new PackageStatus(checkStatus, packageVersions);
+ writePackageStatusLocked(null /* status */, initialOptimisticLockId,
+ null /* packageVersions */);
+ return initialOptimisticLockId;
}
/**
@@ -147,23 +172,29 @@
}
synchronized (this) {
- Integer optimisticLockId = getCurrentOptimisticLockId();
- if (optimisticLockId == null) {
- Slog.w(TAG, "Unable to find optimistic lock ID from package status row");
+ int optimisticLockId;
+ try {
+ optimisticLockId = getCurrentOptimisticLockId();
+ } catch (ParseException e) {
+ Slog.w(LOG_TAG, "Unable to find optimistic lock ID from package status");
// Recover.
- optimisticLockId = mDatabaseHelper.recoverFromBadData();
+ optimisticLockId = recoverFromBadData(e);
}
int newOptimisticLockId = optimisticLockId + 1;
- boolean statusRowUpdated = writeStatusRow(
- optimisticLockId, newOptimisticLockId, CHECK_STARTED, currentInstalledVersions);
- if (!statusRowUpdated) {
- Slog.e(TAG, "Unable to update status to CHECK_STARTED in package status row."
- + " synchronization failure?");
- return null;
+ try {
+ boolean statusUpdated = writePackageStatusWithOptimisticLockCheck(
+ optimisticLockId, newOptimisticLockId, CHECK_STARTED,
+ currentInstalledVersions);
+ if (!statusUpdated) {
+ throw new IllegalStateException("Unable to update status to CHECK_STARTED."
+ + " synchronization failure?");
+ }
+ return new CheckToken(newOptimisticLockId, currentInstalledVersions);
+ } catch (IOException e) {
+ throw new IllegalStateException(e);
}
- return new CheckToken(newOptimisticLockId, currentInstalledVersions);
}
}
@@ -172,19 +203,25 @@
*/
void resetCheckState() {
synchronized(this) {
- Integer optimisticLockId = getCurrentOptimisticLockId();
- if (optimisticLockId == null) {
- Slog.w(TAG, "resetCheckState: Unable to find optimistic lock ID from package"
- + " status row");
+ int optimisticLockId;
+ try {
+ optimisticLockId = getCurrentOptimisticLockId();
+ } catch (ParseException e) {
+ Slog.w(LOG_TAG, "resetCheckState: Unable to find optimistic lock ID from package"
+ + " status");
// Attempt to recover the storage state.
- optimisticLockId = mDatabaseHelper.recoverFromBadData();
+ optimisticLockId = recoverFromBadData(e);
}
int newOptimisticLockId = optimisticLockId + 1;
- if (!writeStatusRow(optimisticLockId, newOptimisticLockId,
- null /* status */, null /* packageVersions */)) {
- Slog.e(TAG, "resetCheckState: Unable to reset package status row,"
- + " newOptimisticLockId=" + newOptimisticLockId);
+ try {
+ if (!writePackageStatusWithOptimisticLockCheck(optimisticLockId,
+ newOptimisticLockId, null /* status */, null /* packageVersions */)) {
+ throw new IllegalStateException("resetCheckState: Unable to reset package"
+ + " status, newOptimisticLockId=" + newOptimisticLockId);
+ }
+ } catch (IOException e) {
+ throw new IllegalStateException(e);
}
}
}
@@ -199,138 +236,150 @@
int optimisticLockId = checkToken.mOptimisticLockId;
int newOptimisticLockId = optimisticLockId + 1;
int status = succeeded ? CHECK_COMPLETED_SUCCESS : CHECK_COMPLETED_FAILURE;
- return writeStatusRow(optimisticLockId, newOptimisticLockId,
- status, checkToken.mPackageVersions);
- }
- }
-
- // Caller should be synchronized(this)
- private Integer getCurrentOptimisticLockId() {
- final String[] columns = { COLUMN_OPTIMISTIC_LOCK_ID };
- final String querySelection = COLUMN_ID + " = ?";
- final String[] querySelectionArgs = { Integer.toString(SINGLETON_ID) };
-
- SQLiteDatabase database = mDatabaseHelper.getReadableDatabase();
- try (Cursor cursor = database.query(TABLE, columns, querySelection, querySelectionArgs,
- null /* groupBy */, null /* having */, null /* orderBy */)) {
- if (cursor.getCount() != 1) {
- Slog.w(TAG, cursor.getCount() + " rows returned, expected exactly one.");
- return null;
+ try {
+ return writePackageStatusWithOptimisticLockCheck(optimisticLockId,
+ newOptimisticLockId, status, checkToken.mPackageVersions);
+ } catch (IOException e) {
+ throw new IllegalStateException(e);
}
- cursor.moveToFirst();
- return cursor.getInt(0);
}
}
- // Caller should be synchronized(this)
- private boolean writeStatusRow(int optimisticLockId, int newOptimisticLockId, Integer status,
- PackageVersions packageVersions) {
+ @GuardedBy("this")
+ private int getCurrentOptimisticLockId() throws ParseException {
+ try (FileInputStream fis = mPackageStatusFile.openRead()) {
+ XmlPullParser parser = parseToPackageStatusTag(fis);
+ return getIntAttribute(parser, ATTRIBUTE_OPTIMISTIC_LOCK_ID);
+ } catch (IOException e) {
+ ParseException e2 = new ParseException("Unable to read file", 0);
+ e2.initCause(e);
+ throw e2;
+ }
+ }
+
+ /** Returns a parser or throws ParseException, never returns null. */
+ private static XmlPullParser parseToPackageStatusTag(FileInputStream fis)
+ throws ParseException {
+ try {
+ XmlPullParser parser = Xml.newPullParser();
+ parser.setInput(fis, StandardCharsets.UTF_8.name());
+ int type;
+ while ((type = parser.next()) != END_DOCUMENT) {
+ final String tag = parser.getName();
+ if (type == START_TAG && TAG_PACKAGE_STATUS.equals(tag)) {
+ return parser;
+ }
+ }
+ throw new ParseException("Unable to find " + TAG_PACKAGE_STATUS + " tag", 0);
+ } catch (XmlPullParserException e) {
+ throw new IllegalStateException("Unable to configure parser", e);
+ } catch (IOException e) {
+ ParseException e2 = new ParseException("Error reading XML", 0);
+ e.initCause(e);
+ throw e2;
+ }
+ }
+
+ @GuardedBy("this")
+ private boolean writePackageStatusWithOptimisticLockCheck(int optimisticLockId,
+ int newOptimisticLockId, Integer status, PackageVersions packageVersions)
+ throws IOException {
+
+ int currentOptimisticLockId;
+ try {
+ currentOptimisticLockId = getCurrentOptimisticLockId();
+ if (currentOptimisticLockId != optimisticLockId) {
+ return false;
+ }
+ } catch (ParseException e) {
+ recoverFromBadData(e);
+ return false;
+ }
+
+ writePackageStatusLocked(status, newOptimisticLockId, packageVersions);
+ return true;
+ }
+
+ @GuardedBy("this")
+ private void writePackageStatusLocked(Integer status, int optimisticLockId,
+ PackageVersions packageVersions) throws IOException {
if ((status == null) != (packageVersions == null)) {
throw new IllegalArgumentException(
"Provide both status and packageVersions, or neither.");
}
- SQLiteDatabase database = mDatabaseHelper.getWritableDatabase();
- ContentValues values = new ContentValues();
- values.put(COLUMN_OPTIMISTIC_LOCK_ID, newOptimisticLockId);
- if (status == null) {
- values.putNull(COLUMN_CHECK_STATUS);
- values.put(COLUMN_UPDATE_APP_VERSION, UNKNOWN_PACKAGE_VERSION);
- values.put(COLUMN_DATA_APP_VERSION, UNKNOWN_PACKAGE_VERSION);
- } else {
- values.put(COLUMN_CHECK_STATUS, status);
- values.put(COLUMN_UPDATE_APP_VERSION, packageVersions.mUpdateAppVersion);
- values.put(COLUMN_DATA_APP_VERSION, packageVersions.mDataAppVersion);
+ FileOutputStream fos = null;
+ try {
+ fos = mPackageStatusFile.startWrite();
+ XmlSerializer serializer = new FastXmlSerializer();
+ serializer.setOutput(fos, StandardCharsets.UTF_8.name());
+ serializer.startDocument(null /* encoding */, true /* standalone */);
+ final String namespace = null;
+ serializer.startTag(namespace, TAG_PACKAGE_STATUS);
+ String statusAttributeValue = status == null ? "" : Integer.toString(status);
+ serializer.attribute(namespace, ATTRIBUTE_CHECK_STATUS, statusAttributeValue);
+ serializer.attribute(namespace, ATTRIBUTE_OPTIMISTIC_LOCK_ID,
+ Integer.toString(optimisticLockId));
+ int updateAppVersion = status == null
+ ? UNKNOWN_PACKAGE_VERSION : packageVersions.mUpdateAppVersion;
+ serializer.attribute(namespace, ATTRIBUTE_UPDATE_APP_VERSION,
+ Integer.toString(updateAppVersion));
+ int dataAppVersion = status == null
+ ? UNKNOWN_PACKAGE_VERSION : packageVersions.mDataAppVersion;
+ serializer.attribute(namespace, ATTRIBUTE_DATA_APP_VERSION,
+ Integer.toString(dataAppVersion));
+ serializer.endTag(namespace, TAG_PACKAGE_STATUS);
+ serializer.endDocument();
+ serializer.flush();
+ mPackageStatusFile.finishWrite(fos);
+ } catch (IOException e) {
+ if (fos != null) {
+ mPackageStatusFile.failWrite(fos);
+ }
+ throw e;
}
- String updateSelection = COLUMN_ID + " = ? AND " + COLUMN_OPTIMISTIC_LOCK_ID + " = ?";
- String[] updateSelectionArgs = {
- Integer.toString(SINGLETON_ID), Integer.toString(optimisticLockId)
- };
- int count = database.update(TABLE, values, updateSelection, updateSelectionArgs);
- if (count > 1) {
- // This has to be because of corruption: there should only ever be one row.
- Slog.w(TAG, "writeStatusRow: " + count + " rows updated, expected exactly one.");
- // Reset the table.
- mDatabaseHelper.recoverFromBadData();
- }
-
- // 1 is the success case. 0 rows updated means the row is missing or the optimistic lock ID
- // was not as expected, this could be because of corruption but is most likely due to an
- // optimistic lock failure. Callers can decide on a case-by-case basis.
- return count == 1;
- }
-
- /** Only used during tests to force an empty table. */
- void deleteRowForTests() {
- mDatabaseHelper.getWritableDatabase().delete(TABLE, null, null);
}
/** Only used during tests to force a known table state. */
public void forceCheckStateForTests(int checkStatus, PackageVersions packageVersions) {
- int optimisticLockId = getCurrentOptimisticLockId();
- writeStatusRow(optimisticLockId, optimisticLockId, checkStatus, packageVersions);
+ synchronized (this) {
+ try {
+ int optimisticLockId = getCurrentOptimisticLockId();
+ writePackageStatusWithOptimisticLockCheck(optimisticLockId, optimisticLockId,
+ checkStatus, packageVersions);
+ } catch (IOException | ParseException e) {
+ throw new IllegalStateException(e);
+ }
+ }
}
- static class DatabaseHelper extends SQLiteOpenHelper {
-
- private final Context mContext;
-
- public DatabaseHelper(Context context) {
- super(context, DATABASE_NAME, null, DATABASE_VERSION);
- mContext = context;
- }
-
- @Override
- public void onCreate(SQLiteDatabase db) {
- db.execSQL("CREATE TABLE " + TABLE + " (" +
- "_id INTEGER PRIMARY KEY," +
- COLUMN_OPTIMISTIC_LOCK_ID + " INTEGER NOT NULL," +
- COLUMN_CHECK_STATUS + " INTEGER," +
- COLUMN_UPDATE_APP_VERSION + " INTEGER NOT NULL," +
- COLUMN_DATA_APP_VERSION + " INTEGER NOT NULL" +
- ");");
- insertInitialRowState(db);
- }
-
- @Override
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int currentVersion) {
- // no-op: nothing to upgrade
- }
-
- /** Recover the initial data row state, returning the new current optimistic lock ID */
- int recoverFromBadData() {
- // Delete the table content.
- SQLiteDatabase writableDatabase = getWritableDatabase();
- writableDatabase.delete(TABLE, null /* whereClause */, null /* whereArgs */);
-
- // Insert the initial content.
- return insertInitialRowState(writableDatabase);
- }
-
- /** Insert the initial data row, returning the optimistic lock ID */
- private static int insertInitialRowState(SQLiteDatabase db) {
- // Doesn't matter what it is, but we avoid the obvious starting value each time the row
- // is reset to ensure that old tokens are unlikely to work.
- final int initialOptimisticLockId = (int) System.currentTimeMillis();
-
- // Insert the one row.
- ContentValues values = new ContentValues();
- values.put(COLUMN_ID, SINGLETON_ID);
- values.put(COLUMN_OPTIMISTIC_LOCK_ID, initialOptimisticLockId);
- values.putNull(COLUMN_CHECK_STATUS);
- values.put(COLUMN_UPDATE_APP_VERSION, UNKNOWN_PACKAGE_VERSION);
- values.put(COLUMN_DATA_APP_VERSION, UNKNOWN_PACKAGE_VERSION);
- long id = db.insert(TABLE, null, values);
- if (id == -1) {
- Slog.w(TAG, "insertInitialRow: could not insert initial row, id=" + id);
- return -1;
+ private static Integer getNullableIntAttribute(XmlPullParser parser, String attributeName)
+ throws ParseException {
+ String attributeValue = parser.getAttributeValue(null, attributeName);
+ try {
+ if (attributeValue == null) {
+ throw new ParseException("Attribute " + attributeName + " missing", 0);
+ } else if (attributeValue.isEmpty()) {
+ return null;
}
- return initialOptimisticLockId;
+ return Integer.parseInt(attributeValue);
+ } catch (NumberFormatException e) {
+ throw new ParseException(
+ "Bad integer for attributeName=" + attributeName + ": " + attributeValue, 0);
}
+ }
- File getDatabaseFile() {
- return mContext.getDatabasePath(DATABASE_NAME);
+ private static int getIntAttribute(XmlPullParser parser, String attributeName)
+ throws ParseException {
+ Integer value = getNullableIntAttribute(parser, attributeName);
+ if (value == null) {
+ throw new ParseException("Missing attribute " + attributeName, 0);
}
+ return value;
+ }
+
+ public void dump(PrintWriter printWriter) {
+ printWriter.println("Package status: " + getPackageStatus());
}
}
diff --git a/services/core/java/com/android/server/timezone/PackageTracker.java b/services/core/java/com/android/server/timezone/PackageTracker.java
index 8abf7df..9b49996 100644
--- a/services/core/java/com/android/server/timezone/PackageTracker.java
+++ b/services/core/java/com/android/server/timezone/PackageTracker.java
@@ -21,9 +21,13 @@
import android.app.timezone.RulesUpdaterContract;
import android.content.Context;
import android.content.pm.PackageManager;
+import android.os.Environment;
import android.provider.TimeZoneRulesDataContract;
import android.util.Slog;
+import java.io.File;
+import java.io.PrintWriter;
+
/**
* Monitors the installed applications associated with time zone updates. If the app packages are
* updated it indicates there <em>might</em> be a time zone rules update to apply so a targeted
@@ -81,11 +85,17 @@
/** Creates the {@link PackageTracker} for normal use. */
static PackageTracker create(Context context) {
PackageTrackerHelperImpl helperImpl = new PackageTrackerHelperImpl(context);
+ // TODO(nfuller): Switch to FileUtils.createDir() when available. http://b/31008728
+ File storageDir = new File(Environment.getDataSystemDirectory(), "timezone");
+ if (!storageDir.exists()) {
+ storageDir.mkdir();
+ }
+
return new PackageTracker(
helperImpl /* clock */,
helperImpl /* configHelper */,
helperImpl /* packageManagerHelper */,
- new PackageStatusStorage(context),
+ new PackageStatusStorage(storageDir),
new IntentHelperImpl(context));
}
@@ -154,33 +164,29 @@
}
// Validate the updater application package.
- // TODO(nfuller) Uncomment or remove the code below. Currently an app stops being a priv-app
- // after it is replaced by one in data so this check fails. http://b/35995024
- // try {
- // if (!mPackageManagerHelper.isPrivilegedApp(mUpdateAppPackageName)) {
- // throw failWithException(
- // "Update app " + mUpdateAppPackageName + " must be a priv-app.", null);
- // }
- // } catch (PackageManager.NameNotFoundException e) {
- // throw failWithException("Could not determine update app package details for "
- // + mUpdateAppPackageName, e);
- // }
+ try {
+ if (!mPackageManagerHelper.isPrivilegedApp(mUpdateAppPackageName)) {
+ throw logAndThrowRuntimeException(
+ "Update app " + mUpdateAppPackageName + " must be a priv-app.", null);
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ throw logAndThrowRuntimeException("Could not determine update app package details for "
+ + mUpdateAppPackageName, e);
+ }
// TODO(nfuller) Consider permission checks. While an updated system app retains permissions
// obtained by the system version it's not clear how to check them.
Slog.d(TAG, "Update app " + mUpdateAppPackageName + " is valid.");
// Validate the data application package.
- // TODO(nfuller) Uncomment or remove the code below. Currently an app stops being a priv-app
- // after it is replaced by one in data. http://b/35995024
- // try {
- // if (!mPackageManagerHelper.isPrivilegedApp(mDataAppPackageName)) {
- // throw failWithException(
- // "Data app " + mDataAppPackageName + " must be a priv-app.", null);
- // }
- // } catch (PackageManager.NameNotFoundException e) {
- // throw failWithException("Could not determine data app package details for "
- // + mDataAppPackageName, e);
- // }
+ try {
+ if (!mPackageManagerHelper.isPrivilegedApp(mDataAppPackageName)) {
+ throw logAndThrowRuntimeException(
+ "Data app " + mDataAppPackageName + " must be a priv-app.", null);
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ throw logAndThrowRuntimeException("Could not determine data app package details for "
+ + mDataAppPackageName, e);
+ }
// TODO(nfuller) Consider permission checks. While an updated system app retains permissions
// obtained by the system version it's not clear how to check them.
Slog.d(TAG, "Data app " + mDataAppPackageName + " is valid.");
@@ -501,4 +507,23 @@
Slog.wtf(TAG, message, cause);
throw new RuntimeException(message, cause);
}
+
+ public void dump(PrintWriter fout) {
+ fout.println("PackageTrackerState: " + toString());
+ mPackageStatusStorage.dump(fout);
+ }
+
+ @Override
+ public String toString() {
+ return "PackageTracker{" +
+ "mTrackingEnabled=" + mTrackingEnabled +
+ ", mUpdateAppPackageName='" + mUpdateAppPackageName + '\'' +
+ ", mDataAppPackageName='" + mDataAppPackageName + '\'' +
+ ", mCheckTimeAllowedMillis=" + mCheckTimeAllowedMillis +
+ ", mFailedCheckRetryCount=" + mFailedCheckRetryCount +
+ ", mLastTriggerTimestamp=" + mLastTriggerTimestamp +
+ ", mCheckTriggered=" + mCheckTriggered +
+ ", mCheckFailureCount=" + mCheckFailureCount +
+ '}';
+ }
}
diff --git a/services/core/java/com/android/server/timezone/PermissionHelper.java b/services/core/java/com/android/server/timezone/PermissionHelper.java
index ba91c7f..2ec31e2 100644
--- a/services/core/java/com/android/server/timezone/PermissionHelper.java
+++ b/services/core/java/com/android/server/timezone/PermissionHelper.java
@@ -16,10 +16,14 @@
package com.android.server.timezone;
+import java.io.PrintWriter;
+
/**
* An easy-to-mock interface around permission checks for use by {@link RulesManagerService}.
*/
public interface PermissionHelper {
void enforceCallerHasPermission(String requiredPermission) throws SecurityException;
+
+ boolean checkDumpPermission(String tag, PrintWriter printWriter);
}
diff --git a/services/core/java/com/android/server/timezone/RulesManagerService.java b/services/core/java/com/android/server/timezone/RulesManagerService.java
index 82bd356..50f27ed 100644
--- a/services/core/java/com/android/server/timezone/RulesManagerService.java
+++ b/services/core/java/com/android/server/timezone/RulesManagerService.java
@@ -17,7 +17,13 @@
package com.android.server.timezone;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.EventLogTags;
import com.android.server.SystemService;
+import com.android.timezone.distro.DistroException;
+import com.android.timezone.distro.DistroVersion;
+import com.android.timezone.distro.StagedDistroOperation;
+import com.android.timezone.distro.TimeZoneDistro;
+import com.android.timezone.distro.installer.TimeZoneDistroInstaller;
import android.app.timezone.Callback;
import android.app.timezone.DistroFormatVersion;
@@ -32,18 +38,25 @@
import android.util.Slog;
import java.io.File;
+import java.io.FileDescriptor;
+import java.io.FileInputStream;
import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintWriter;
import java.util.Arrays;
import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicBoolean;
-import libcore.tzdata.shared2.DistroException;
-import libcore.tzdata.shared2.DistroVersion;
-import libcore.tzdata.shared2.StagedDistroOperation;
-import libcore.tzdata.update2.TimeZoneDistroInstaller;
+import libcore.icu.ICU;
+import libcore.util.ZoneInfoDB;
-// TODO(nfuller) Add EventLog calls where useful in the system server.
-// TODO(nfuller) Check logging best practices in the system server.
-// TODO(nfuller) Check error handling best practices in the system server.
+import static android.app.timezone.RulesState.DISTRO_STATUS_INSTALLED;
+import static android.app.timezone.RulesState.DISTRO_STATUS_NONE;
+import static android.app.timezone.RulesState.DISTRO_STATUS_UNKNOWN;
+import static android.app.timezone.RulesState.STAGED_OPERATION_INSTALL;
+import static android.app.timezone.RulesState.STAGED_OPERATION_NONE;
+import static android.app.timezone.RulesState.STAGED_OPERATION_UNINSTALL;
+import static android.app.timezone.RulesState.STAGED_OPERATION_UNKNOWN;
+
public final class RulesManagerService extends IRulesManager.Stub {
private static final String TAG = "timezone.RulesManagerService";
@@ -82,26 +95,22 @@
private final PackageTracker mPackageTracker;
private final Executor mExecutor;
private final TimeZoneDistroInstaller mInstaller;
- private final FileDescriptorHelper mFileDescriptorHelper;
private static RulesManagerService create(Context context) {
RulesManagerServiceHelperImpl helper = new RulesManagerServiceHelperImpl(context);
return new RulesManagerService(
helper /* permissionHelper */,
helper /* executor */,
- helper /* fileDescriptorHelper */,
PackageTracker.create(context),
new TimeZoneDistroInstaller(TAG, SYSTEM_TZ_DATA_FILE, TZ_DATA_DIR));
}
// A constructor that can be used by tests to supply mocked / faked dependencies.
RulesManagerService(PermissionHelper permissionHelper,
- Executor executor,
- FileDescriptorHelper fileDescriptorHelper, PackageTracker packageTracker,
+ Executor executor, PackageTracker packageTracker,
TimeZoneDistroInstaller timeZoneDistroInstaller) {
mPermissionHelper = permissionHelper;
mExecutor = executor;
- mFileDescriptorHelper = fileDescriptorHelper;
mPackageTracker = packageTracker;
mInstaller = timeZoneDistroInstaller;
}
@@ -114,6 +123,11 @@
public RulesState getRulesState() {
mPermissionHelper.enforceCallerHasPermission(REQUIRED_UPDATER_PERMISSION);
+ return getRulesStateInternal();
+ }
+
+ /** Like {@link #getRulesState()} without the permission check. */
+ private RulesState getRulesStateInternal() {
synchronized(this) {
String systemRulesVersion;
try {
@@ -127,18 +141,18 @@
// Determine the staged operation status, if possible.
DistroRulesVersion stagedDistroRulesVersion = null;
- int stagedOperationStatus = RulesState.STAGED_OPERATION_UNKNOWN;
+ int stagedOperationStatus = STAGED_OPERATION_UNKNOWN;
if (!operationInProgress) {
StagedDistroOperation stagedDistroOperation;
try {
stagedDistroOperation = mInstaller.getStagedDistroOperation();
if (stagedDistroOperation == null) {
- stagedOperationStatus = RulesState.STAGED_OPERATION_NONE;
+ stagedOperationStatus = STAGED_OPERATION_NONE;
} else if (stagedDistroOperation.isUninstall) {
- stagedOperationStatus = RulesState.STAGED_OPERATION_UNINSTALL;
+ stagedOperationStatus = STAGED_OPERATION_UNINSTALL;
} else {
// Must be an install.
- stagedOperationStatus = RulesState.STAGED_OPERATION_INSTALL;
+ stagedOperationStatus = STAGED_OPERATION_INSTALL;
DistroVersion stagedDistroVersion = stagedDistroOperation.distroVersion;
stagedDistroRulesVersion = new DistroRulesVersion(
stagedDistroVersion.rulesVersion,
@@ -151,16 +165,16 @@
// Determine the installed distro state, if possible.
DistroVersion installedDistroVersion;
- int distroStatus = RulesState.DISTRO_STATUS_UNKNOWN;
+ int distroStatus = DISTRO_STATUS_UNKNOWN;
DistroRulesVersion installedDistroRulesVersion = null;
if (!operationInProgress) {
try {
installedDistroVersion = mInstaller.getInstalledDistroVersion();
if (installedDistroVersion == null) {
- distroStatus = RulesState.DISTRO_STATUS_NONE;
+ distroStatus = DISTRO_STATUS_NONE;
installedDistroRulesVersion = null;
} else {
- distroStatus = RulesState.DISTRO_STATUS_INSTALLED;
+ distroStatus = DISTRO_STATUS_INSTALLED;
installedDistroRulesVersion = new DistroRulesVersion(
installedDistroVersion.rulesVersion,
installedDistroVersion.revision);
@@ -176,56 +190,84 @@
}
@Override
- public int requestInstall(
- ParcelFileDescriptor timeZoneDistro, byte[] checkTokenBytes, ICallback callback) {
- mPermissionHelper.enforceCallerHasPermission(REQUIRED_UPDATER_PERMISSION);
+ public int requestInstall(ParcelFileDescriptor distroParcelFileDescriptor,
+ byte[] checkTokenBytes, ICallback callback) {
- CheckToken checkToken = null;
- if (checkTokenBytes != null) {
- checkToken = createCheckTokenOrThrow(checkTokenBytes);
- }
- synchronized (this) {
- if (timeZoneDistro == null) {
- throw new NullPointerException("timeZoneDistro == null");
- }
- if (callback == null) {
- throw new NullPointerException("observer == null");
- }
- if (mOperationInProgress.get()) {
- return RulesManager.ERROR_OPERATION_IN_PROGRESS;
- }
- mOperationInProgress.set(true);
+ boolean closeParcelFileDescriptorOnExit = true;
+ try {
+ mPermissionHelper.enforceCallerHasPermission(REQUIRED_UPDATER_PERMISSION);
- // Execute the install asynchronously.
- mExecutor.execute(new InstallRunnable(timeZoneDistro, checkToken, callback));
+ CheckToken checkToken = null;
+ if (checkTokenBytes != null) {
+ checkToken = createCheckTokenOrThrow(checkTokenBytes);
+ }
+ EventLogTags.writeTimezoneRequestInstall(toStringOrNull(checkToken));
- return RulesManager.SUCCESS;
+ synchronized (this) {
+ if (distroParcelFileDescriptor == null) {
+ throw new NullPointerException("distroParcelFileDescriptor == null");
+ }
+ if (callback == null) {
+ throw new NullPointerException("observer == null");
+ }
+ if (mOperationInProgress.get()) {
+ return RulesManager.ERROR_OPERATION_IN_PROGRESS;
+ }
+ mOperationInProgress.set(true);
+
+ // Execute the install asynchronously.
+ mExecutor.execute(
+ new InstallRunnable(distroParcelFileDescriptor, checkToken, callback));
+
+ // The InstallRunnable now owns the ParcelFileDescriptor, so it will close it after
+ // it executes (and we do not have to).
+ closeParcelFileDescriptorOnExit = false;
+
+ return RulesManager.SUCCESS;
+ }
+ } finally {
+ // We should close() the local ParcelFileDescriptor we were passed if it hasn't been
+ // passed to another thread to handle.
+ if (distroParcelFileDescriptor != null && closeParcelFileDescriptorOnExit) {
+ try {
+ distroParcelFileDescriptor.close();
+ } catch (IOException e) {
+ Slog.w(TAG, "Failed to close distroParcelFileDescriptor", e);
+ }
+ }
}
}
private class InstallRunnable implements Runnable {
- private final ParcelFileDescriptor mTimeZoneDistro;
+ private final ParcelFileDescriptor mDistroParcelFileDescriptor;
private final CheckToken mCheckToken;
private final ICallback mCallback;
- InstallRunnable(
- ParcelFileDescriptor timeZoneDistro, CheckToken checkToken, ICallback callback) {
- mTimeZoneDistro = timeZoneDistro;
+ InstallRunnable(ParcelFileDescriptor distroParcelFileDescriptor, CheckToken checkToken,
+ ICallback callback) {
+ mDistroParcelFileDescriptor = distroParcelFileDescriptor;
mCheckToken = checkToken;
mCallback = callback;
}
@Override
public void run() {
+ EventLogTags.writeTimezoneInstallStarted(toStringOrNull(mCheckToken));
+
+ boolean success = false;
// Adopt the ParcelFileDescriptor into this try-with-resources so it is closed
// when we are done.
- boolean success = false;
- try {
- byte[] distroBytes =
- RulesManagerService.this.mFileDescriptorHelper.readFully(mTimeZoneDistro);
- int installerResult = mInstaller.stageInstallWithErrorCode(distroBytes);
+ try (ParcelFileDescriptor pfd = mDistroParcelFileDescriptor) {
+ // The ParcelFileDescriptor owns the underlying FileDescriptor and we'll close
+ // it at the end of the try-with-resources.
+ final boolean isFdOwner = false;
+ InputStream is = new FileInputStream(pfd.getFileDescriptor(), isFdOwner);
+
+ TimeZoneDistro distro = new TimeZoneDistro(is);
+ int installerResult = mInstaller.stageInstallWithErrorCode(distro);
int resultCode = mapInstallerResultToApiCode(installerResult);
+ EventLogTags.writeTimezoneInstallComplete(toStringOrNull(mCheckToken), resultCode);
sendFinishedStatus(mCallback, resultCode);
// All the installer failure modes are currently non-recoverable and won't be
@@ -233,6 +275,8 @@
success = true;
} catch (Exception e) {
Slog.w(TAG, "Failed to install distro.", e);
+ EventLogTags.writeTimezoneInstallComplete(
+ toStringOrNull(mCheckToken), Callback.ERROR_UNKNOWN_FAILURE);
sendFinishedStatus(mCallback, Callback.ERROR_UNKNOWN_FAILURE);
} finally {
// Notify the package tracker that the operation is now complete.
@@ -268,6 +312,7 @@
if (checkTokenBytes != null) {
checkToken = createCheckTokenOrThrow(checkTokenBytes);
}
+ EventLogTags.writeTimezoneRequestUninstall(toStringOrNull(checkToken));
synchronized(this) {
if (callback == null) {
throw new NullPointerException("callback == null");
@@ -290,13 +335,14 @@
private final CheckToken mCheckToken;
private final ICallback mCallback;
- public UninstallRunnable(CheckToken checkToken, ICallback callback) {
+ UninstallRunnable(CheckToken checkToken, ICallback callback) {
mCheckToken = checkToken;
mCallback = callback;
}
@Override
public void run() {
+ EventLogTags.writeTimezoneUninstallStarted(toStringOrNull(mCheckToken));
boolean success = false;
try {
success = mInstaller.stageUninstall();
@@ -304,8 +350,12 @@
// against SUCCESS. More granular failures may be added in future.
int resultCode = success ? Callback.SUCCESS
: Callback.ERROR_UNKNOWN_FAILURE;
+ EventLogTags.writeTimezoneUninstallComplete(
+ toStringOrNull(mCheckToken), resultCode);
sendFinishedStatus(mCallback, resultCode);
} catch (Exception e) {
+ EventLogTags.writeTimezoneUninstallComplete(
+ toStringOrNull(mCheckToken), Callback.ERROR_UNKNOWN_FAILURE);
Slog.w(TAG, "Failed to uninstall distro.", e);
sendFinishedStatus(mCallback, Callback.ERROR_UNKNOWN_FAILURE);
} finally {
@@ -332,7 +382,121 @@
if (checkTokenBytes != null) {
checkToken = createCheckTokenOrThrow(checkTokenBytes);
}
+ EventLogTags.writeTimezoneRequestNothing(toStringOrNull(checkToken));
mPackageTracker.recordCheckResult(checkToken, success);
+ EventLogTags.writeTimezoneNothingComplete(toStringOrNull(checkToken));
+ }
+
+ @Override
+ protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ if (!mPermissionHelper.checkDumpPermission(TAG, pw)) {
+ return;
+ }
+
+ RulesState rulesState = getRulesStateInternal();
+ if (args != null && args.length == 2) {
+ // Formatting options used for automated tests. The format is less free-form than
+ // the -format options, which are intended to be easier to parse.
+ if ("-format_state".equals(args[0]) && args[1] != null) {
+ for (char c : args[1].toCharArray()) {
+ switch (c) {
+ case 'p': {
+ // Report operation in progress
+ String value = "Unknown";
+ if (rulesState != null) {
+ value = Boolean.toString(rulesState.isOperationInProgress());
+ }
+ pw.println("Operation in progress: " + value);
+ break;
+ }
+ case 's': {
+ // Report system image rules version
+ String value = "Unknown";
+ if (rulesState != null) {
+ value = rulesState.getSystemRulesVersion();
+ }
+ pw.println("System rules version: " + value);
+ break;
+ }
+ case 'c': {
+ // Report current installation state
+ String value = "Unknown";
+ if (rulesState != null) {
+ value = distroStatusToString(rulesState.getDistroStatus());
+ }
+ pw.println("Current install state: " + value);
+ break;
+ }
+ case 'i': {
+ // Report currently installed version
+ String value = "Unknown";
+ if (rulesState != null) {
+ DistroRulesVersion installedRulesVersion =
+ rulesState.getInstalledDistroRulesVersion();
+ if (installedRulesVersion == null) {
+ value = "<None>";
+ } else {
+ value = installedRulesVersion.toDumpString();
+ }
+ }
+ pw.println("Installed rules version: " + value);
+ break;
+ }
+ case 'o': {
+ // Report staged operation type
+ String value = "Unknown";
+ if (rulesState != null) {
+ int stagedOperationType = rulesState.getStagedOperationType();
+ value = stagedOperationToString(stagedOperationType);
+ }
+ pw.println("Staged operation: " + value);
+ break;
+ }
+ case 't': {
+ // Report staged version (i.e. the one that will be installed next boot
+ // if the staged operation is an install).
+ String value = "Unknown";
+ if (rulesState != null) {
+ DistroRulesVersion stagedDistroRulesVersion =
+ rulesState.getStagedDistroRulesVersion();
+ if (stagedDistroRulesVersion == null) {
+ value = "<None>";
+ } else {
+ value = stagedDistroRulesVersion.toDumpString();
+ }
+ }
+ pw.println("Staged rules version: " + value);
+ break;
+ }
+ case 'a': {
+ // Report the active rules version (i.e. the rules in use by the current
+ // process).
+ pw.println("Active rules version (ICU, libcore): "
+ + ICU.getTZDataVersion() + ","
+ + ZoneInfoDB.getInstance().getVersion());
+ break;
+ }
+ default: {
+ pw.println("Unknown option: " + c);
+ }
+ }
+ }
+ return;
+ }
+ }
+
+ pw.println("RulesManagerService state: " + toString());
+ pw.println("Active rules version (ICU, libcore): " + ICU.getTZDataVersion() + ","
+ + ZoneInfoDB.getInstance().getVersion());
+ pw.println("Distro state: " + rulesState.toString());
+ mPackageTracker.dump(pw);
+ }
+
+ @Override
+ public String toString() {
+ return "RulesManagerService{" +
+ "mOperationInProgress=" + mOperationInProgress +
+ '}';
}
private static CheckToken createCheckTokenOrThrow(byte[] checkTokenBytes) {
@@ -345,4 +509,34 @@
}
return checkToken;
}
+
+ private static String distroStatusToString(int distroStatus) {
+ switch(distroStatus) {
+ case DISTRO_STATUS_NONE:
+ return "None";
+ case DISTRO_STATUS_INSTALLED:
+ return "Installed";
+ case DISTRO_STATUS_UNKNOWN:
+ default:
+ return "Unknown";
+ }
+ }
+
+ private static String stagedOperationToString(int stagedOperationType) {
+ switch(stagedOperationType) {
+ case STAGED_OPERATION_NONE:
+ return "None";
+ case STAGED_OPERATION_UNINSTALL:
+ return "Uninstall";
+ case STAGED_OPERATION_INSTALL:
+ return "Install";
+ case STAGED_OPERATION_UNKNOWN:
+ default:
+ return "Unknown";
+ }
+ }
+
+ private static String toStringOrNull(Object obj) {
+ return obj == null ? null : obj.toString();
+ }
}
diff --git a/services/core/java/com/android/server/timezone/RulesManagerServiceHelperImpl.java b/services/core/java/com/android/server/timezone/RulesManagerServiceHelperImpl.java
index 15a571d..0cf61c0 100644
--- a/services/core/java/com/android/server/timezone/RulesManagerServiceHelperImpl.java
+++ b/services/core/java/com/android/server/timezone/RulesManagerServiceHelperImpl.java
@@ -17,18 +17,21 @@
package com.android.server.timezone;
import android.content.Context;
+import android.content.pm.PackageManager;
+import android.os.AsyncTask;
+import android.os.Binder;
import android.os.ParcelFileDescriptor;
import java.io.FileInputStream;
import java.io.IOException;
+import java.io.PrintWriter;
import java.util.concurrent.Executor;
import libcore.io.Streams;
/**
* A single class that implements multiple helper interfaces for use by {@link RulesManagerService}.
*/
-final class RulesManagerServiceHelperImpl
- implements PermissionHelper, Executor, FileDescriptorHelper {
+final class RulesManagerServiceHelperImpl implements PermissionHelper, Executor {
private final Context mContext;
@@ -41,19 +44,21 @@
mContext.enforceCallingPermission(requiredPermission, null /* message */);
}
- // TODO Wake lock required?
@Override
- public void execute(Runnable runnable) {
- // TODO Is there a better way?
- new Thread(runnable).start();
+ public boolean checkDumpPermission(String tag, PrintWriter pw) {
+ // TODO(nfuller): Switch to DumpUtils.checkDumpPermission() when it is available in AOSP.
+ if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
+ != PackageManager.PERMISSION_GRANTED) {
+ pw.println("Permission Denial: can't dump LocationManagerService from from pid="
+ + Binder.getCallingPid()
+ + ", uid=" + Binder.getCallingUid());
+ return false;
+ }
+ return true;
}
@Override
- public byte[] readFully(ParcelFileDescriptor parcelFileDescriptor) throws IOException {
- try (ParcelFileDescriptor pfd = parcelFileDescriptor) {
- // Read bytes
- FileInputStream in = new FileInputStream(pfd.getFileDescriptor(), false /* isOwner */);
- return Streams.readFully(in);
- }
+ public void execute(Runnable runnable) {
+ AsyncTask.execute(runnable);
}
}
diff --git a/services/core/java/com/android/server/trust/TrustManagerService.java b/services/core/java/com/android/server/trust/TrustManagerService.java
index 8ce59ed..a7cd962 100644
--- a/services/core/java/com/android/server/trust/TrustManagerService.java
+++ b/services/core/java/com/android/server/trust/TrustManagerService.java
@@ -344,7 +344,7 @@
+ "of user " + userInfo.id + "can unlock user profile.");
}
- if (!StorageManager.isUserKeyUnlocked(userInfo.id)
+ if (!mUserManager.isUserUnlockingOrUnlocked(userInfo.id)
&& !directUnlock) {
if (DEBUG) Slog.d(TAG, "refreshAgentList: skipping user " + userInfo.id
+ "'s trust agent " + name + ": FBE still locked and "
diff --git a/services/core/java/com/android/server/tv/TvInputManagerService.java b/services/core/java/com/android/server/tv/TvInputManagerService.java
index 25a0772..1afde55 100644
--- a/services/core/java/com/android/server/tv/TvInputManagerService.java
+++ b/services/core/java/com/android/server/tv/TvInputManagerService.java
@@ -1218,6 +1218,12 @@
@Override
public void setMainSession(IBinder sessionToken, int userId) {
+ if (mContext.checkCallingPermission(
+ android.Manifest.permission.CHANGE_HDMI_CEC_ACTIVE_SOURCE)
+ != PackageManager.PERMISSION_GRANTED) {
+ throw new SecurityException(
+ "The caller does not have CHANGE_HDMI_CEC_ACTIVE_SOURCE permission");
+ }
if (DEBUG) {
Slog.d(TAG, "setMainSession(sessionToken=" + sessionToken + ")");
}
diff --git a/services/core/java/com/android/server/updates/TzDataInstallReceiver.java b/services/core/java/com/android/server/updates/TzDataInstallReceiver.java
index 3c73c88..cabce18 100644
--- a/services/core/java/com/android/server/updates/TzDataInstallReceiver.java
+++ b/services/core/java/com/android/server/updates/TzDataInstallReceiver.java
@@ -16,11 +16,13 @@
package com.android.server.updates;
+import com.android.timezone.distro.TimeZoneDistro;
+import com.android.timezone.distro.installer.TimeZoneDistroInstaller;
+
import android.util.Slog;
import java.io.File;
import java.io.IOException;
-import libcore.tzdata.update2.TimeZoneDistroInstaller;
/**
* An install receiver responsible for installing timezone data updates.
@@ -46,7 +48,8 @@
@Override
protected void install(byte[] content, int version) throws IOException {
- boolean valid = installer.install(content);
+ TimeZoneDistro distro = new TimeZoneDistro(content);
+ boolean valid = installer.install(distro);
Slog.i(TAG, "Timezone data install valid for this device: " + valid);
// Even if !valid, we call super.install(). Only in the event of an exception should we
// not. If we didn't do this we could attempt to install repeatedly.
diff --git a/services/core/java/com/android/server/vr/VrManagerService.java b/services/core/java/com/android/server/vr/VrManagerService.java
index 447d639..74c1b24 100644
--- a/services/core/java/com/android/server/vr/VrManagerService.java
+++ b/services/core/java/com/android/server/vr/VrManagerService.java
@@ -21,6 +21,7 @@
import android.app.ActivityManagerInternal;
import android.app.ActivityManager;
import android.app.AppOpsManager;
+import android.app.INotificationManager;
import android.app.Vr2dDisplayProperties;
import android.app.NotificationManager;
import android.annotation.NonNull;
@@ -42,6 +43,7 @@
import android.os.Message;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
+import android.os.ServiceManager;
import android.os.SystemProperties;
import android.os.UserHandle;
import android.provider.Settings;
@@ -75,6 +77,7 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
+import java.util.List;
import java.util.Objects;
/**
@@ -144,6 +147,7 @@
private VrState mPendingState;
private final ArrayDeque<VrState> mLoggingDeque = new ArrayDeque<>(EVENT_LOG_SIZE);
private final NotificationAccessManager mNotifAccessManager = new NotificationAccessManager();
+ private INotificationManager mNotificationManager;
/** Tracks the state of the screen and keyguard UI.*/
private int mSystemSleepFlags = FLAG_AWAKE;
/**
@@ -603,6 +607,8 @@
@Override
public void onBootPhase(int phase) {
if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) {
+ mNotificationManager = INotificationManager.Stub.asInterface(
+ ServiceManager.getService(Context.NOTIFICATION_SERVICE));
synchronized (mLock) {
Looper looper = Looper.getMainLooper();
Handler handler = new Handler(looper);
@@ -853,50 +859,28 @@
}
private void grantNotificationListenerAccess(String pkg, int userId) {
+ NotificationManager nm = mContext.getSystemService(NotificationManager.class);
PackageManager pm = mContext.getPackageManager();
ArraySet<ComponentName> possibleServices = EnabledComponentsObserver.loadComponentNames(pm,
userId, NotificationListenerService.SERVICE_INTERFACE,
android.Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE);
- ContentResolver resolver = mContext.getContentResolver();
-
- ArraySet<String> current = getNotificationListeners(resolver, userId);
for (ComponentName c : possibleServices) {
- String flatName = c.flattenToString();
- if (Objects.equals(c.getPackageName(), pkg)
- && !current.contains(flatName)) {
- current.add(flatName);
+ if (Objects.equals(c.getPackageName(), pkg)) {
+ nm.setNotificationListenerAccessGrantedForUser(c, userId, true);
}
}
-
- if (current.size() > 0) {
- String flatSettings = formatSettings(current);
- Settings.Secure.putStringForUser(resolver,
- Settings.Secure.ENABLED_NOTIFICATION_LISTENERS,
- flatSettings, userId);
- }
}
private void revokeNotificationListenerAccess(String pkg, int userId) {
- ContentResolver resolver = mContext.getContentResolver();
+ NotificationManager nm = mContext.getSystemService(NotificationManager.class);
+ List<ComponentName> current = nm.getEnabledNotificationListeners(userId);
- ArraySet<String> current = getNotificationListeners(resolver, userId);
-
- ArrayList<String> toRemove = new ArrayList<>();
-
- for (String c : current) {
- ComponentName component = ComponentName.unflattenFromString(c);
+ for (ComponentName component : current) {
if (component != null && component.getPackageName().equals(pkg)) {
- toRemove.add(c);
+ nm.setNotificationListenerAccessGrantedForUser(component, userId, false);
}
}
-
- current.removeAll(toRemove);
-
- String flatSettings = formatSettings(current);
- Settings.Secure.putStringForUser(resolver,
- Settings.Secure.ENABLED_NOTIFICATION_LISTENERS,
- flatSettings, userId);
}
private void grantCoarseLocationPermissionIfNeeded(String pkg, int userId) {
diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
index 2aa524c..802054e 100644
--- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
+++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
@@ -1540,9 +1540,26 @@
}
}
+ private void enforceCallingOrSelfPermissionAndAppOp(String permission, final String callingPkg,
+ final int callingUid, String message) {
+ mContext.enforceCallingOrSelfPermission(permission, message);
+
+ final String opName = AppOpsManager.permissionToOp(permission);
+ if (opName != null) {
+ final int appOpMode = mAppOpsManager.noteOp(opName, callingUid, callingPkg);
+ if (appOpMode != AppOpsManager.MODE_ALLOWED) {
+ throw new SecurityException(
+ message + ": " + callingPkg + " is not allowed to " + permission);
+ }
+ }
+ }
+
@Override
- public ParcelFileDescriptor getWallpaper(IWallpaperManagerCallback cb, final int which,
- Bundle outParams, int wallpaperUserId) {
+ public ParcelFileDescriptor getWallpaper(String callingPkg, IWallpaperManagerCallback cb,
+ final int which, Bundle outParams, int wallpaperUserId) {
+ enforceCallingOrSelfPermissionAndAppOp(android.Manifest.permission.READ_EXTERNAL_STORAGE,
+ callingPkg, Binder.getCallingUid(), "read wallpaper");
+
wallpaperUserId = ActivityManager.handleIncomingUser(Binder.getCallingPid(),
Binder.getCallingUid(), wallpaperUserId, false, true, "getWallpaper", null);
@@ -2611,6 +2628,7 @@
pw.print(" mCropHint="); pw.println(wallpaper.cropHint);
pw.print(" mPadding="); pw.println(wallpaper.padding);
pw.print(" mName="); pw.println(wallpaper.name);
+ pw.print(" mAllowBackup="); pw.println(wallpaper.allowBackup);
pw.print(" mWallpaperComponent="); pw.println(wallpaper.wallpaperComponent);
if (wallpaper.connection != null) {
WallpaperConnection conn = wallpaper.connection;
@@ -2641,6 +2659,7 @@
pw.print(" mCropHint="); pw.println(wallpaper.cropHint);
pw.print(" mPadding="); pw.println(wallpaper.padding);
pw.print(" mName="); pw.println(wallpaper.name);
+ pw.print(" mAllowBackup="); pw.println(wallpaper.allowBackup);
}
}
diff --git a/services/core/java/com/android/server/webkit/SystemImpl.java b/services/core/java/com/android/server/webkit/SystemImpl.java
index a0381f7..bf769ed 100644
--- a/services/core/java/com/android/server/webkit/SystemImpl.java
+++ b/services/core/java/com/android/server/webkit/SystemImpl.java
@@ -296,7 +296,10 @@
@Override
public boolean isMultiProcessDefaultEnabled() {
- return true;
+ // Multiprocess is enabled for all 64-bit devices, since the ability to run the renderer
+ // process in 32-bit when it's a separate process typically results in a net memory saving.
+ // Multiprocess is also enabled for 32-bit devices unless they report they are "low ram".
+ return Build.SUPPORTED_64_BIT_ABIS.length > 0 || !ActivityManager.isLowRamDeviceStatic();
}
// flags declaring we want extra info from the package manager for webview providers
diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java
index b1ed358..cda3efd 100644
--- a/services/core/java/com/android/server/wm/AppTransition.java
+++ b/services/core/java/com/android/server/wm/AppTransition.java
@@ -49,6 +49,7 @@
import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_AFTER_ANIM;
import android.annotation.Nullable;
+import android.app.ActivityManager;
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Bitmap;
@@ -255,6 +256,7 @@
private boolean mProlongedAnimationsEnded;
private final boolean mGridLayoutRecentsEnabled;
+ private final boolean mLowRamRecentsEnabled;
AppTransition(Context context, WindowManagerService service) {
mContext = context;
@@ -295,6 +297,7 @@
mClipRevealTranslationY = (int) (CLIP_REVEAL_TRANSLATION_Y_DP
* mContext.getResources().getDisplayMetrics().density);
mGridLayoutRecentsEnabled = SystemProperties.getBoolean("ro.recents.grid", false);
+ mLowRamRecentsEnabled = ActivityManager.isLowRamDeviceStatic();
}
boolean isTransitionSet() {
@@ -1121,7 +1124,8 @@
*/
Animation createAspectScaledThumbnailEnterExitAnimationLocked(int thumbTransitState,
int uiMode, int orientation, int transit, Rect containingFrame, Rect contentInsets,
- @Nullable Rect surfaceInsets, boolean freeform, int taskId) {
+ @Nullable Rect surfaceInsets, @Nullable Rect stableInsets, boolean freeform,
+ int taskId) {
Animation a;
final int appWidth = containingFrame.width();
final int appHeight = containingFrame.height();
@@ -1179,8 +1183,15 @@
final float x = containingFrame.width() / 2f
- containingFrame.width() / 2f * scale;
final float targetY = (mTmpRect.top - containingFrame.top);
- final float y = containingFrame.height() / 2f
+ float y = containingFrame.height() / 2f
- containingFrame.height() / 2f * scale;
+
+ // During transition may require clipping offset from any top stable insets
+ // such as the statusbar height when statusbar is hidden
+ if (mLowRamRecentsEnabled && contentInsets.top == 0 && scaleUp) {
+ mTmpFromClipRect.top += stableInsets.top;
+ y += stableInsets.top;
+ }
final float startX = targetX - x;
final float startY = targetY - y;
Animation clipAnim = scaleUp
@@ -1497,8 +1508,8 @@
*/
Animation loadAnimation(WindowManager.LayoutParams lp, int transit, boolean enter, int uiMode,
int orientation, Rect frame, Rect displayFrame, Rect insets,
- @Nullable Rect surfaceInsets, boolean isVoiceInteraction, boolean freeform,
- int taskId) {
+ @Nullable Rect surfaceInsets, @Nullable Rect stableInsets, boolean isVoiceInteraction,
+ boolean freeform, int taskId) {
Animation a;
if (isKeyguardGoingAwayTransit(transit) && enter) {
a = loadKeyguardExitAnimation(transit);
@@ -1582,7 +1593,7 @@
(mNextAppTransitionType == NEXT_TRANSIT_TYPE_THUMBNAIL_ASPECT_SCALE_UP);
a = createAspectScaledThumbnailEnterExitAnimationLocked(
getThumbnailTransitionState(enter), uiMode, orientation, transit, frame,
- insets, surfaceInsets, freeform, taskId);
+ insets, surfaceInsets, stableInsets, freeform, taskId);
if (DEBUG_APP_TRANSITIONS || DEBUG_ANIM) {
String animName = mNextAppTransitionScaleUp ?
"ANIM_THUMBNAIL_ASPECT_SCALE_UP" : "ANIM_THUMBNAIL_ASPECT_SCALE_DOWN";
diff --git a/services/core/java/com/android/server/wm/Session.java b/services/core/java/com/android/server/wm/Session.java
index 22b0f5b..7a8c2f9 100644
--- a/services/core/java/com/android/server/wm/Session.java
+++ b/services/core/java/com/android/server/wm/Session.java
@@ -16,6 +16,7 @@
package com.android.server.wm;
+import static android.Manifest.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
import static android.Manifest.permission.INTERNAL_SYSTEM_WINDOW;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
@@ -82,6 +83,7 @@
// Set of visible alert window surfaces connected to this session.
private final Set<WindowSurfaceController> mAlertWindowSurfaces = new HashSet<>();
final boolean mCanAddInternalSystemWindow;
+ final boolean mCanHideNonSystemOverlayWindows;
private AlertWindowNotification mAlertWindowNotification;
private boolean mShowingAlertWindowNotificationAllowed;
private boolean mClientDead = false;
@@ -99,6 +101,8 @@
mLastReportedAnimatorScale = service.getCurrentAnimatorScale();
mCanAddInternalSystemWindow = service.mContext.checkCallingOrSelfPermission(
INTERNAL_SYSTEM_WINDOW) == PERMISSION_GRANTED;
+ mCanHideNonSystemOverlayWindows = service.mContext.checkCallingOrSelfPermission(
+ HIDE_NON_SYSTEM_OVERLAY_WINDOWS) == PERMISSION_GRANTED;
mShowingAlertWindowNotificationAllowed = mService.mShowAlertWindowNotifications;
StringBuilder sb = new StringBuilder();
sb.append("Session{");
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotController.java b/services/core/java/com/android/server/wm/TaskSnapshotController.java
index b8b9b9a..940ad33 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotController.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotController.java
@@ -97,11 +97,18 @@
*/
private final boolean mIsRunningOnTv;
+ /**
+ * Flag indicating whether we are running on an IoT device.
+ */
+ private final boolean mIsRunningOnIoT;
+
TaskSnapshotController(WindowManagerService service) {
mService = service;
mCache = new TaskSnapshotCache(mService, mLoader);
mIsRunningOnTv = mService.mContext.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_LEANBACK);
+ mIsRunningOnIoT = mService.mContext.getPackageManager().hasSystemFeature(
+ PackageManager.FEATURE_EMBEDDED);
}
void systemReady() {
@@ -206,7 +213,8 @@
}
private boolean shouldDisableSnapshots() {
- return !ENABLE_TASK_SNAPSHOTS || ActivityManager.isLowRamDeviceStatic() || mIsRunningOnTv;
+ return !ENABLE_TASK_SNAPSHOTS || ActivityManager.isLowRamDeviceStatic()
+ || mIsRunningOnTv || mIsRunningOnIoT;
}
private Rect minRect(Rect rect1, Rect rect2) {
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
index d7f0496..1bece69 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
@@ -33,7 +33,6 @@
import static android.view.WindowManager.LayoutParams.FLAG_SPLIT_TOUCH;
import static android.view.WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_DRAW_STATUS_BAR_BACKGROUND;
-import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_TASK_SNAPSHOT;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
import static com.android.internal.policy.DecorView.NAVIGATION_BAR_COLOR_VIEW_ATTRIBUTES;
import static com.android.internal.policy.DecorView.STATUS_BAR_COLOR_VIEW_ATTRIBUTES;
@@ -179,8 +178,7 @@
layoutParams.flags = (windowFlags & ~FLAG_INHERIT_EXCLUDES)
| FLAG_NOT_FOCUSABLE
| FLAG_NOT_TOUCHABLE;
- layoutParams.privateFlags = PRIVATE_FLAG_TASK_SNAPSHOT
- | (windowPrivateFlags & PRIVATE_FLAG_INHERITS);
+ layoutParams.privateFlags = windowPrivateFlags & PRIVATE_FLAG_INHERITS;
layoutParams.token = token.token;
layoutParams.width = LayoutParams.MATCH_PARENT;
layoutParams.height = LayoutParams.MATCH_PARENT;
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 2caac7a..5db691e 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -495,12 +495,15 @@
*/
Runnable mWaitingForDrawnCallback;
+ /** List of window currently causing non-system overlay windows to be hidden. */
+ private ArrayList<WindowState> mHidingNonSystemOverlayWindows = new ArrayList<>();
+
/**
* Stores for each user whether screencapture is disabled
* This array is essentially a cache for all userId for
* {@link android.app.admin.DevicePolicyManager#getScreenCaptureDisabled}
*/
- SparseArray<Boolean> mScreenCaptureDisabled = new SparseArray<>();
+ private SparseArray<Boolean> mScreenCaptureDisabled = new SparseArray<>();
IInputMethodManager mInputMethodManager;
@@ -1442,6 +1445,9 @@
}
}
+ final boolean hideSystemAlertWindows = !mHidingNonSystemOverlayWindows.isEmpty();
+ win.setForceHideNonSystemOverlayWindowIfNeeded(hideSystemAlertWindows);
+
final AppWindowToken aToken = token.asAppWindowToken();
if (type == TYPE_APPLICATION_STARTING && aToken != null) {
aToken.startingWindow = win;
@@ -1715,6 +1721,7 @@
}
mPendingRemove.remove(win);
mResizingWindows.remove(win);
+ updateNonSystemOverlayWindowsVisibilityIfNeeded(win, false /* surfaceShown */);
mWindowsChanged = true;
if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG_WM, "Final remove of window: " + win);
@@ -2336,6 +2343,7 @@
final Rect displayFrame = new Rect(0, 0,
displayInfo.logicalWidth, displayInfo.logicalHeight);
final Rect insets = new Rect();
+ final Rect stableInsets = new Rect();
Rect surfaceInsets = null;
final boolean freeform = win != null && win.inFreeformWorkspace();
if (win != null) {
@@ -2350,6 +2358,7 @@
}
surfaceInsets = win.getAttrs().surfaceInsets;
insets.set(win.mContentInsets);
+ stableInsets.set(win.mStableInsets);
}
if (atoken.mLaunchTaskBehind) {
@@ -2364,7 +2373,7 @@
final Configuration displayConfig = displayContent.getConfiguration();
Animation a = mAppTransition.loadAnimation(lp, transit, enter, displayConfig.uiMode,
displayConfig.orientation, frame, displayFrame, insets, surfaceInsets,
- isVoiceInteraction, freeform, atoken.getTask().mTaskId);
+ stableInsets, isVoiceInteraction, freeform, atoken.getTask().mTaskId);
if (a != null) {
if (DEBUG_ANIM) logWithStack(TAG, "Loaded animation " + a + " for " + atoken);
final int containingWidth = frame.width();
@@ -3577,7 +3586,6 @@
}
private void updateCircularDisplayMaskIfNeeded() {
- // we're fullscreen and not hosted in an ActivityView
if (mContext.getResources().getConfiguration().isScreenRound()
&& mContext.getResources().getBoolean(
com.android.internal.R.bool.config_windowShowCircularMask)) {
@@ -6504,6 +6512,21 @@
ArrayList<WindowState> windows) {
mRoot.dumpWindowsNoHeader(pw, dumpAll, windows);
+ if (!mHidingNonSystemOverlayWindows.isEmpty()) {
+ pw.println();
+ pw.println(" Hiding System Alert Windows:");
+ for (int i = mHidingNonSystemOverlayWindows.size() - 1; i >= 0; i--) {
+ final WindowState w = mHidingNonSystemOverlayWindows.get(i);
+ pw.print(" #"); pw.print(i); pw.print(' ');
+ pw.print(w);
+ if (dumpAll) {
+ pw.println(":");
+ w.dump(pw, " ", true);
+ } else {
+ pw.println();
+ }
+ }
+ }
if (mPendingRemove.size() > 0) {
pw.println();
pw.println(" Remove pending for:");
@@ -7618,4 +7641,28 @@
boolean hasWideColorGamutSupport() {
return mHasWideColorGamutSupport;
}
+
+ void updateNonSystemOverlayWindowsVisibilityIfNeeded(WindowState win, boolean surfaceShown) {
+ if (!win.hideNonSystemOverlayWindowsWhenVisible()) {
+ return;
+ }
+ final boolean systemAlertWindowsHidden = !mHidingNonSystemOverlayWindows.isEmpty();
+ if (surfaceShown) {
+ if (!mHidingNonSystemOverlayWindows.contains(win)) {
+ mHidingNonSystemOverlayWindows.add(win);
+ }
+ } else {
+ mHidingNonSystemOverlayWindows.remove(win);
+ }
+
+ final boolean hideSystemAlertWindows = !mHidingNonSystemOverlayWindows.isEmpty();
+
+ if (systemAlertWindowsHidden == hideSystemAlertWindows) {
+ return;
+ }
+
+ mRoot.forAllWindows((w) -> {
+ w.setForceHideNonSystemOverlayWindowIfNeeded(hideSystemAlertWindows);
+ }, false /* traverseTopToBottom */);
+ }
}
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 34ff9e8..7decb11 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -46,6 +46,7 @@
import static android.view.WindowManager.LayoutParams.LAST_SUB_WINDOW;
import static android.view.WindowManager.LayoutParams.MATCH_PARENT;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW;
+import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_LAYOUT_CHILD_WINDOW_IN_PARENT_FRAME;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_WILL_NOT_REPLACE_ON_RELAUNCH;
@@ -59,7 +60,9 @@
import static android.view.WindowManager.LayoutParams.TYPE_DRAWN_APPLICATION;
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG;
+import static android.view.WindowManager.LayoutParams.TYPE_TOAST;
import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
+import static android.view.WindowManager.LayoutParams.isSystemAlertWindowType;
import static android.view.WindowManagerGlobal.RELAYOUT_RES_DRAG_RESIZING_DOCKED;
import static android.view.WindowManagerGlobal.RELAYOUT_RES_DRAG_RESIZING_FREEFORM;
import static android.view.WindowManagerGlobal.RELAYOUT_RES_FIRST_TIME;
@@ -208,6 +211,8 @@
boolean mPolicyVisibilityAfterAnim = true;
private boolean mAppOpVisibility = true;
boolean mPermanentlyHidden; // the window should never be shown again
+ // This is a non-system overlay window that is currently force hidden.
+ private boolean mForceHideNonSystemOverlayWindow;
boolean mAppFreezing;
boolean mHidden; // Used to determine if to show child windows.
boolean mWallpaperVisible; // for wallpaper, what was last vis report?
@@ -2421,6 +2426,10 @@
// to handle their windows being removed from under them.
return false;
}
+ if (mForceHideNonSystemOverlayWindow) {
+ // This is an alert window that is currently force hidden.
+ return false;
+ }
if (mPolicyVisibility && mPolicyVisibilityAfterAnim) {
// Already showing.
return false;
@@ -2497,6 +2506,22 @@
return true;
}
+ void setForceHideNonSystemOverlayWindowIfNeeded(boolean forceHide) {
+ if (mOwnerCanAddInternalSystemWindow
+ || (!isSystemAlertWindowType(mAttrs.type) && mAttrs.type != TYPE_TOAST)) {
+ return;
+ }
+ if (mForceHideNonSystemOverlayWindow == forceHide) {
+ return;
+ }
+ mForceHideNonSystemOverlayWindow = forceHide;
+ if (forceHide) {
+ hideLw(true /* doAnimation */, true /* requestAnim */);
+ } else {
+ showLw(true /* doAnimation */, true /* requestAnim */);
+ }
+ }
+
public void setAppOpVisibilityLw(boolean state) {
if (mAppOpVisibility != state) {
mAppOpVisibility = state;
@@ -3382,7 +3407,7 @@
pw.println(Integer.toHexString(mSystemUiVisibility));
}
if (!mPolicyVisibility || !mPolicyVisibilityAfterAnim || !mAppOpVisibility
- || isParentWindowHidden()|| mPermanentlyHidden) {
+ || isParentWindowHidden()|| mPermanentlyHidden || mForceHideNonSystemOverlayWindow) {
pw.print(prefix); pw.print("mPolicyVisibility=");
pw.print(mPolicyVisibility);
pw.print(" mPolicyVisibilityAfterAnim=");
@@ -3390,7 +3415,9 @@
pw.print(" mAppOpVisibility=");
pw.print(mAppOpVisibility);
pw.print(" parentHidden="); pw.print(isParentWindowHidden());
- pw.print(" mPermanentlyHidden="); pw.println(mPermanentlyHidden);
+ pw.print(" mPermanentlyHidden="); pw.print(mPermanentlyHidden);
+ pw.print(" mForceHideNonSystemOverlayWindow="); pw.println(
+ mForceHideNonSystemOverlayWindow);
}
if (!mRelayoutCalled || mLayoutNeeded) {
pw.print(prefix); pw.print("mRelayoutCalled="); pw.print(mRelayoutCalled);
@@ -3650,6 +3677,17 @@
&& (mAttrs.privateFlags & PRIVATE_FLAG_LAYOUT_CHILD_WINDOW_IN_PARENT_FRAME) != 0;
}
+ /**
+ * Returns true if any window added by an application process that if of type
+ * {@link android.view.WindowManager.LayoutParams#TYPE_TOAST} or that requires that requires
+ * {@link android.app.AppOpsManager#OP_SYSTEM_ALERT_WINDOW} permission should be hidden when
+ * this window is visible.
+ */
+ boolean hideNonSystemOverlayWindowsWhenVisible() {
+ return (mAttrs.privateFlags & PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS) != 0
+ && mSession.mCanHideNonSystemOverlayWindows;
+ }
+
/** Returns the parent window if this is a child of another window, else null. */
WindowState getParentWindow() {
// NOTE: We are not calling getParent() directly as the WindowState might be a child of a
diff --git a/services/core/java/com/android/server/wm/WindowSurfaceController.java b/services/core/java/com/android/server/wm/WindowSurfaceController.java
index 27927e6..1728cfb 100644
--- a/services/core/java/com/android/server/wm/WindowSurfaceController.java
+++ b/services/core/java/com/android/server/wm/WindowSurfaceController.java
@@ -24,10 +24,8 @@
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
-import static android.view.Surface.SCALING_MODE_FREEZE;
import static android.view.Surface.SCALING_MODE_SCALE_TO_WINDOW;
-import android.graphics.PixelFormat;
import android.graphics.Point;
import android.graphics.PointF;
import android.graphics.Rect;
@@ -514,6 +512,8 @@
void setShown(boolean surfaceShown) {
mSurfaceShown = surfaceShown;
+ mService.updateNonSystemOverlayWindowsVisibilityIfNeeded(mAnimator.mWin, surfaceShown);
+
if (mWindowSession != null) {
mWindowSession.onWindowSurfaceVisibilityChanged(this, mSurfaceShown, mWindowType);
}
diff --git a/services/core/jni/Android.mk b/services/core/jni/Android.mk
index e2a82b7..651cc7d 100644
--- a/services/core/jni/Android.mk
+++ b/services/core/jni/Android.mk
@@ -5,8 +5,12 @@
LOCAL_CFLAGS += -Wall -Werror -Wno-unused-parameter
LOCAL_SRC_FILES += \
- $(LOCAL_REL_DIR)/JavaRef.cpp \
- $(LOCAL_REL_DIR)/NativeCallbackThread.cpp \
+ $(LOCAL_REL_DIR)/BroadcastRadio/JavaRef.cpp \
+ $(LOCAL_REL_DIR)/BroadcastRadio/NativeCallbackThread.cpp \
+ $(LOCAL_REL_DIR)/BroadcastRadio/BroadcastRadioService.cpp \
+ $(LOCAL_REL_DIR)/BroadcastRadio/Tuner.cpp \
+ $(LOCAL_REL_DIR)/BroadcastRadio/TunerCallback.cpp \
+ $(LOCAL_REL_DIR)/BroadcastRadio/convert.cpp \
$(LOCAL_REL_DIR)/com_android_server_AlarmManagerService.cpp \
$(LOCAL_REL_DIR)/com_android_server_am_BatteryStatsService.cpp \
$(LOCAL_REL_DIR)/com_android_server_connectivity_Vpn.cpp \
@@ -22,10 +26,6 @@
$(LOCAL_REL_DIR)/com_android_server_location_GnssLocationProvider.cpp \
$(LOCAL_REL_DIR)/com_android_server_locksettings_SyntheticPasswordManager.cpp \
$(LOCAL_REL_DIR)/com_android_server_power_PowerManagerService.cpp \
- $(LOCAL_REL_DIR)/com_android_server_radio_RadioService.cpp \
- $(LOCAL_REL_DIR)/com_android_server_radio_Tuner.cpp \
- $(LOCAL_REL_DIR)/com_android_server_radio_Tuner_TunerCallback.cpp \
- $(LOCAL_REL_DIR)/com_android_server_radio_convert.cpp \
$(LOCAL_REL_DIR)/com_android_server_SerialService.cpp \
$(LOCAL_REL_DIR)/com_android_server_storage_AppFuseBridge.cpp \
$(LOCAL_REL_DIR)/com_android_server_SystemServer.cpp \
@@ -57,6 +57,7 @@
LOCAL_SHARED_LIBRARIES += \
libandroid_runtime \
libandroidfw \
+ libaudioclient \
libbase \
libappfuse \
libbinder \
@@ -107,4 +108,6 @@
android.frameworks.schedulerservice@1.0 \
android.frameworks.sensorservice@1.0 \
-LOCAL_STATIC_LIBRARIES += libscrypt_static
+LOCAL_STATIC_LIBRARIES += \
+ android.hardware.broadcastradio@1.1-utils-lib \
+ libscrypt_static \
diff --git a/services/core/jni/BroadcastRadio/BroadcastRadioService.cpp b/services/core/jni/BroadcastRadio/BroadcastRadioService.cpp
new file mode 100644
index 0000000..b3817db
--- /dev/null
+++ b/services/core/jni/BroadcastRadio/BroadcastRadioService.cpp
@@ -0,0 +1,277 @@
+/**
+ * Copyright (C) 2017 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.
+ */
+
+#define LOG_TAG "BroadcastRadioService.jni"
+#define LOG_NDEBUG 0
+
+#include "BroadcastRadioService.h"
+
+#include "Tuner.h"
+#include "convert.h"
+
+#include <android/hardware/broadcastradio/1.1/IBroadcastRadio.h>
+#include <android/hardware/broadcastradio/1.1/IBroadcastRadioFactory.h>
+#include <android/hidl/manager/1.0/IServiceManager.h>
+#include <core_jni_helpers.h>
+#include <hidl/ServiceManagement.h>
+#include <nativehelper/JNIHelp.h>
+#include <utils/Log.h>
+
+namespace android {
+namespace server {
+namespace BroadcastRadio {
+namespace BroadcastRadioService {
+
+using std::lock_guard;
+using std::mutex;
+
+using hardware::Return;
+using hardware::hidl_string;
+using hardware::hidl_vec;
+
+namespace V1_0 = hardware::broadcastradio::V1_0;
+namespace V1_1 = hardware::broadcastradio::V1_1;
+
+using V1_0::Class;
+using V1_0::Result;
+
+using V1_0::BandConfig;
+using V1_0::ProgramInfo;
+using V1_0::MetaData;
+using V1_0::ITuner;
+
+static mutex gContextMutex;
+
+static struct {
+ struct {
+ jclass clazz;
+ jmethodID cstor;
+ jmethodID add;
+ } ArrayList;
+ struct {
+ jclass clazz;
+ jmethodID cstor;
+ } Tuner;
+} gjni;
+
+struct ServiceContext {
+ ServiceContext() {}
+
+ std::vector<sp<V1_0::IBroadcastRadio>> mModules;
+
+private:
+ DISALLOW_COPY_AND_ASSIGN(ServiceContext);
+};
+
+const std::vector<Class> gAllClasses = {
+ Class::AM_FM,
+ Class::SAT,
+ Class::DT,
+};
+
+
+/**
+ * Always lock gContextMutex when using native context.
+ */
+static ServiceContext& getNativeContext(jlong nativeContextHandle) {
+ auto nativeContext = reinterpret_cast<ServiceContext*>(nativeContextHandle);
+ LOG_ALWAYS_FATAL_IF(nativeContext == nullptr, "Native context not initialized");
+ return *nativeContext;
+}
+
+static jlong nativeInit(JNIEnv *env, jobject obj) {
+ ALOGV("%s", __func__);
+ lock_guard<mutex> lk(gContextMutex);
+
+ auto nativeContext = new ServiceContext();
+ static_assert(sizeof(jlong) >= sizeof(nativeContext), "jlong is smaller than a pointer");
+ return reinterpret_cast<jlong>(nativeContext);
+}
+
+static void nativeFinalize(JNIEnv *env, jobject obj, jlong nativeContext) {
+ ALOGV("%s", __func__);
+ lock_guard<mutex> lk(gContextMutex);
+
+ auto ctx = reinterpret_cast<ServiceContext*>(nativeContext);
+ delete ctx;
+}
+
+static jobject nativeLoadModules(JNIEnv *env, jobject obj, jlong nativeContext) {
+ ALOGV("%s", __func__);
+ lock_guard<mutex> lk(gContextMutex);
+ auto& ctx = getNativeContext(nativeContext);
+
+ // Get list of registered HIDL HAL implementations.
+ auto manager = hardware::defaultServiceManager();
+ hidl_vec<hidl_string> services;
+ if (manager == nullptr) {
+ ALOGE("Can't reach service manager, using default service implementation only");
+ services = std::vector<hidl_string>({ "default" });
+ } else {
+ manager->listByInterface(V1_0::IBroadcastRadioFactory::descriptor,
+ [&services](const hidl_vec<hidl_string> ®istered) {
+ services = registered;
+ });
+ }
+
+ // Scan provided list for actually implemented modules.
+ ctx.mModules.clear();
+ auto jModules = make_javaref(env, env->NewObject(gjni.ArrayList.clazz, gjni.ArrayList.cstor));
+ for (auto&& serviceName : services) {
+ ALOGV("checking service: %s", serviceName.c_str());
+
+ auto factory = V1_0::IBroadcastRadioFactory::getService(serviceName);
+ if (factory == nullptr) {
+ ALOGE("can't load service %s", serviceName.c_str());
+ continue;
+ }
+
+ // Second level of scanning - that's unfortunate.
+ for (auto&& clazz : gAllClasses) {
+ sp<V1_0::IBroadcastRadio> module10 = nullptr;
+ sp<V1_1::IBroadcastRadio> module11 = nullptr;
+ factory->connectModule(clazz, [&](Result res, const sp<V1_0::IBroadcastRadio>& module) {
+ if (res == Result::OK) {
+ module10 = module;
+ module11 = V1_1::IBroadcastRadio::castFrom(module).withDefault(nullptr);
+ } else if (res != Result::INVALID_ARGUMENTS) {
+ ALOGE("couldn't load %s:%s module",
+ serviceName.c_str(), V1_0::toString(clazz).c_str());
+ }
+ });
+ if (module10 == nullptr) continue;
+
+ auto idx = ctx.mModules.size();
+ ctx.mModules.push_back(module10);
+ ALOGI("loaded broadcast radio module %zu: %s:%s",
+ idx, serviceName.c_str(), V1_0::toString(clazz).c_str());
+
+ JavaRef<jobject> jModule = nullptr;
+ Result halResult = Result::OK;
+ Return<void> hidlResult;
+ if (module11 != nullptr) {
+ hidlResult = module11->getProperties_1_1([&](const V1_1::Properties& properties) {
+ jModule = convert::ModulePropertiesFromHal(env, properties, idx, serviceName);
+ });
+ } else {
+ hidlResult = module10->getProperties([&](Result result,
+ const V1_0::Properties& properties) {
+ halResult = result;
+ if (result != Result::OK) return;
+ jModule = convert::ModulePropertiesFromHal(env, properties, idx, serviceName);
+ });
+ }
+ if (convert::ThrowIfFailed(env, hidlResult, halResult)) return nullptr;
+
+ env->CallBooleanMethod(jModules.get(), gjni.ArrayList.add, jModule.get());
+ }
+ }
+
+ return jModules.release();
+}
+
+static jobject nativeOpenTuner(JNIEnv *env, jobject obj, long nativeContext, jint moduleId,
+ jobject bandConfig, bool withAudio, jobject callback) {
+ ALOGV("%s", __func__);
+ lock_guard<mutex> lk(gContextMutex);
+ auto& ctx = getNativeContext(nativeContext);
+
+ if (callback == nullptr) {
+ ALOGE("Callback is empty");
+ return nullptr;
+ }
+
+ if (moduleId < 0 || static_cast<size_t>(moduleId) >= ctx.mModules.size()) {
+ ALOGE("Invalid module ID: %d", moduleId);
+ return nullptr;
+ }
+ auto module = ctx.mModules[moduleId];
+
+ HalRevision halRev;
+ if (V1_1::IBroadcastRadio::castFrom(module).withDefault(nullptr) != nullptr) {
+ ALOGI("Opening tuner %d with broadcast radio HAL 1.1", moduleId);
+ halRev = HalRevision::V1_1;
+ } else {
+ ALOGI("Opening tuner %d with broadcast radio HAL 1.0", moduleId);
+ halRev = HalRevision::V1_0;
+ }
+
+ Region region;
+ BandConfig bandConfigHal = convert::BandConfigToHal(env, bandConfig, region);
+
+ auto tuner = make_javaref(env, env->NewObject(gjni.Tuner.clazz, gjni.Tuner.cstor,
+ callback, halRev, region, withAudio, bandConfigHal.type));
+ if (tuner == nullptr) {
+ ALOGE("Unable to create new tuner object.");
+ return nullptr;
+ }
+
+ auto tunerCb = Tuner::getNativeCallback(env, tuner);
+ Result halResult;
+ sp<ITuner> halTuner = nullptr;
+
+ auto hidlResult = module->openTuner(bandConfigHal, withAudio, tunerCb,
+ [&](Result result, const sp<ITuner>& tuner) {
+ halResult = result;
+ halTuner = tuner;
+ });
+ if (!hidlResult.isOk() || halResult != Result::OK || halTuner == nullptr) {
+ ALOGE("Couldn't open tuner");
+ ALOGE_IF(hidlResult.isOk(), "halResult = %d", halResult);
+ ALOGE_IF(!hidlResult.isOk(), "hidlResult = %s", hidlResult.description().c_str());
+ return nullptr;
+ }
+
+ Tuner::assignHalInterfaces(env, tuner, module, halTuner);
+ ALOGD("Opened tuner %p", halTuner.get());
+ return tuner.release();
+}
+
+static const JNINativeMethod gRadioServiceMethods[] = {
+ { "nativeInit", "()J", (void*)nativeInit },
+ { "nativeFinalize", "(J)V", (void*)nativeFinalize },
+ { "nativeLoadModules", "(J)Ljava/util/List;", (void*)nativeLoadModules },
+ { "nativeOpenTuner", "(JILandroid/hardware/radio/RadioManager$BandConfig;Z"
+ "Landroid/hardware/radio/ITunerCallback;)Lcom/android/server/broadcastradio/Tuner;",
+ (void*)nativeOpenTuner },
+};
+
+} // namespace BroadcastRadioService
+} // namespace BroadcastRadio
+} // namespace server
+
+void register_android_server_broadcastradio_BroadcastRadioService(JNIEnv *env) {
+ using namespace server::BroadcastRadio::BroadcastRadioService;
+
+ register_android_server_broadcastradio_convert(env);
+
+ auto tunerClass = FindClassOrDie(env, "com/android/server/broadcastradio/Tuner");
+ gjni.Tuner.clazz = MakeGlobalRefOrDie(env, tunerClass);
+ gjni.Tuner.cstor = GetMethodIDOrDie(env, tunerClass, "<init>",
+ "(Landroid/hardware/radio/ITunerCallback;IIZI)V");
+
+ auto arrayListClass = FindClassOrDie(env, "java/util/ArrayList");
+ gjni.ArrayList.clazz = MakeGlobalRefOrDie(env, arrayListClass);
+ gjni.ArrayList.cstor = GetMethodIDOrDie(env, arrayListClass, "<init>", "()V");
+ gjni.ArrayList.add = GetMethodIDOrDie(env, arrayListClass, "add", "(Ljava/lang/Object;)Z");
+
+ auto res = jniRegisterNativeMethods(env,
+ "com/android/server/broadcastradio/BroadcastRadioService",
+ gRadioServiceMethods, NELEM(gRadioServiceMethods));
+ LOG_ALWAYS_FATAL_IF(res < 0, "Unable to register native methods.");
+}
+
+} // namespace android
diff --git a/services/core/jni/BroadcastRadio/BroadcastRadioService.h b/services/core/jni/BroadcastRadio/BroadcastRadioService.h
new file mode 100644
index 0000000..df7af89
--- /dev/null
+++ b/services/core/jni/BroadcastRadio/BroadcastRadioService.h
@@ -0,0 +1,28 @@
+/**
+ * Copyright (C) 2017 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.
+ */
+
+#ifndef _ANDROID_SERVER_BROADCASTRADIO_BROADCASTRADIOSERVICE_H
+#define _ANDROID_SERVER_BROADCASTRADIO_BROADCASTRADIOSERVICE_H
+
+#include <jni.h>
+
+namespace android {
+
+void register_android_server_broadcastradio_BroadcastRadioService(JNIEnv *env);
+
+} // namespace android
+
+#endif // _ANDROID_SERVER_BROADCASTRADIO_BROADCASTRADIOSERVICE_H
diff --git a/services/core/jni/BroadcastRadio/JavaRef.cpp b/services/core/jni/BroadcastRadio/JavaRef.cpp
new file mode 100644
index 0000000..655ffc7
--- /dev/null
+++ b/services/core/jni/BroadcastRadio/JavaRef.cpp
@@ -0,0 +1,27 @@
+/**
+ * Copyright (C) 2017 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.
+ */
+
+#include "JavaRef.h"
+
+#include <string>
+
+namespace android {
+
+JavaRef<jstring> make_javastr(JNIEnv *env, const std::string &str) {
+ return make_javaref(env, env->NewStringUTF(str.c_str()));
+}
+
+} // namespace android
diff --git a/services/core/jni/BroadcastRadio/JavaRef.h b/services/core/jni/BroadcastRadio/JavaRef.h
new file mode 100644
index 0000000..1bf146b
--- /dev/null
+++ b/services/core/jni/BroadcastRadio/JavaRef.h
@@ -0,0 +1,44 @@
+/**
+ * Copyright (C) 2017 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.
+ */
+
+#ifndef _ANDROID_JAVA_REF_H
+#define _ANDROID_JAVA_REF_H
+
+#include <android-base/macros.h>
+#include <functional>
+#include <jni.h>
+#include <memory>
+#include <type_traits>
+
+namespace android {
+
+template <typename T>
+using JavaRef = std::unique_ptr<typename std::remove_pointer<T>::type, std::function<void(T)>>;
+
+template <typename T>
+JavaRef<T> make_javaref(JNIEnv *env, T ref) {
+ return JavaRef<T>(ref, [env](T ref) {
+ if (env && ref) {
+ env->DeleteLocalRef(ref);
+ }
+ });
+}
+
+JavaRef<jstring> make_javastr(JNIEnv *env, const std::string &str);
+
+} // namespace android
+
+#endif // _ANDROID_JAVA_REF_H
diff --git a/services/core/jni/BroadcastRadio/NativeCallbackThread.cpp b/services/core/jni/BroadcastRadio/NativeCallbackThread.cpp
new file mode 100644
index 0000000..85ec9e0
--- /dev/null
+++ b/services/core/jni/BroadcastRadio/NativeCallbackThread.cpp
@@ -0,0 +1,113 @@
+/**
+ * Copyright (C) 2017 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.
+ */
+
+#define LOG_TAG "NativeCallbackThread"
+//#define LOG_NDEBUG 0
+
+#include "NativeCallbackThread.h"
+
+#include <utils/Log.h>
+
+namespace android {
+
+using std::lock_guard;
+using std::mutex;
+using std::unique_lock;
+
+NativeCallbackThread::NativeCallbackThread(JavaVM *vm) : mvm(vm), mExiting(false),
+ mThread(&NativeCallbackThread::threadLoop, this) {
+ ALOGD("Started native callback thread %p", this);
+}
+
+NativeCallbackThread::~NativeCallbackThread() {
+ ALOGV("%s %p", __func__, this);
+ stop();
+}
+
+void NativeCallbackThread::threadLoop() {
+ ALOGV("%s", __func__);
+
+ JNIEnv *env = nullptr;
+ JavaVMAttachArgs aargs = {JNI_VERSION_1_4, "NativeCallbackThread", nullptr};
+ if (mvm->AttachCurrentThread(&env, &aargs) != JNI_OK || env == nullptr) {
+ ALOGE("Couldn't attach thread");
+ mExiting = true;
+ return;
+ }
+
+ while (!mExiting) {
+ ALOGV("Waiting for task...");
+ Task task;
+ {
+ unique_lock<mutex> lk(mQueueMutex);
+ mQueueCond.wait(lk);
+ if (mExiting) break;
+
+ if (mQueue.empty()) continue;
+ task = mQueue.front();
+ mQueue.pop();
+ }
+
+ ALOGV("Executing task...");
+ task(env);
+ if (env->ExceptionCheck()) {
+ ALOGE("Unexpected exception:");
+ env->ExceptionDescribe();
+ env->ExceptionClear();
+ }
+ }
+
+ auto res = mvm->DetachCurrentThread();
+ ALOGE_IF(res != JNI_OK, "Couldn't detach thread");
+
+ ALOGV("Native callback thread %p finished", this);
+}
+
+void NativeCallbackThread::enqueue(const Task &task) {
+ lock_guard<mutex> lk(mQueueMutex);
+
+ if (mExiting) {
+ ALOGW("Callback thread %p is not serving calls", this);
+ return;
+ }
+
+ mQueue.push(task);
+ mQueueCond.notify_one();
+}
+
+void NativeCallbackThread::stop() {
+ ALOGV("%s %p", __func__, this);
+
+ {
+ lock_guard<mutex> lk(mQueueMutex);
+
+ if (mExiting) return;
+
+ mExiting = true;
+ mQueueCond.notify_one();
+ }
+
+ if (mThread.get_id() == std::thread::id()) {
+ // you can't self-join a thread, but it's ok when calling from our sub-task
+ ALOGD("About to stop native callback thread %p", this);
+ mThread.detach();
+ } else {
+ mThread.join();
+ ALOGD("Stopped native callback thread %p", this);
+ }
+}
+
+} // namespace android
diff --git a/services/core/jni/BroadcastRadio/NativeCallbackThread.h b/services/core/jni/BroadcastRadio/NativeCallbackThread.h
new file mode 100644
index 0000000..53990be
--- /dev/null
+++ b/services/core/jni/BroadcastRadio/NativeCallbackThread.h
@@ -0,0 +1,53 @@
+/**
+ * Copyright (C) 2017 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.
+ */
+
+#ifndef _ANDROID_NATIVE_CALLBACK_THREAD_H
+#define _ANDROID_NATIVE_CALLBACK_THREAD_H
+
+#include <android-base/macros.h>
+#include <functional>
+#include <jni.h>
+#include <queue>
+#include <thread>
+
+namespace android {
+
+class NativeCallbackThread {
+ typedef std::function<void(JNIEnv*)> Task;
+
+ JavaVM *mvm;
+ std::queue<Task> mQueue;
+
+ std::mutex mQueueMutex;
+ std::condition_variable mQueueCond;
+ std::atomic<bool> mExiting;
+ std::thread mThread;
+
+ void threadLoop();
+
+ DISALLOW_COPY_AND_ASSIGN(NativeCallbackThread);
+
+public:
+ NativeCallbackThread(JavaVM *vm);
+ virtual ~NativeCallbackThread();
+
+ void enqueue(const Task &task);
+ void stop();
+};
+
+} // namespace android
+
+#endif // _ANDROID_NATIVE_CALLBACK_THREAD_H
diff --git a/services/core/jni/BroadcastRadio/Tuner.cpp b/services/core/jni/BroadcastRadio/Tuner.cpp
new file mode 100644
index 0000000..f5a85c1
--- /dev/null
+++ b/services/core/jni/BroadcastRadio/Tuner.cpp
@@ -0,0 +1,541 @@
+/**
+ * Copyright (C) 2017 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.
+ */
+
+#define LOG_TAG "BroadcastRadioService.Tuner.jni"
+#define LOG_NDEBUG 0
+
+#include "Tuner.h"
+
+#include "convert.h"
+#include "TunerCallback.h"
+
+#include <android/hardware/broadcastradio/1.1/IBroadcastRadioFactory.h>
+#include <binder/IPCThreadState.h>
+#include <broadcastradio-utils/Utils.h>
+#include <core_jni_helpers.h>
+#include <media/AudioSystem.h>
+#include <nativehelper/JNIHelp.h>
+#include <utils/Log.h>
+
+namespace android {
+namespace server {
+namespace BroadcastRadio {
+namespace Tuner {
+
+using std::lock_guard;
+using std::mutex;
+
+using hardware::Return;
+using hardware::hidl_death_recipient;
+using hardware::hidl_vec;
+
+namespace V1_0 = hardware::broadcastradio::V1_0;
+namespace V1_1 = hardware::broadcastradio::V1_1;
+
+using V1_0::Band;
+using V1_0::BandConfig;
+using V1_0::MetaData;
+using V1_0::Result;
+using V1_1::ITunerCallback;
+using V1_1::ProgramListResult;
+
+static mutex gContextMutex;
+
+static struct {
+ struct {
+ jclass clazz;
+ jmethodID cstor;
+ jmethodID add;
+ } ArrayList;
+ struct {
+ jfieldID nativeContext;
+ jfieldID region;
+ jfieldID tunerCallback;
+ } Tuner;
+} gjni;
+
+static const char* const kAudioDeviceName = "Radio tuner source";
+
+class HalDeathRecipient : public hidl_death_recipient {
+ wp<V1_1::ITunerCallback> mTunerCallback;
+
+public:
+ HalDeathRecipient(wp<V1_1::ITunerCallback> tunerCallback):mTunerCallback(tunerCallback) {}
+
+ virtual void serviceDied(uint64_t cookie, const wp<hidl::base::V1_0::IBase>& who);
+};
+
+struct TunerContext {
+ TunerContext() {}
+
+ bool mIsClosed = false;
+ HalRevision mHalRev;
+ bool mWithAudio;
+ Band mBand;
+ wp<V1_0::IBroadcastRadio> mHalModule;
+ wp<V1_1::IBroadcastRadio> mHalModule11;
+ sp<V1_0::ITuner> mHalTuner;
+ sp<V1_1::ITuner> mHalTuner11;
+ sp<HalDeathRecipient> mHalDeathRecipient;
+
+private:
+ DISALLOW_COPY_AND_ASSIGN(TunerContext);
+};
+
+static TunerContext& getNativeContext(jlong nativeContextHandle) {
+ auto nativeContext = reinterpret_cast<TunerContext*>(nativeContextHandle);
+ LOG_ALWAYS_FATAL_IF(nativeContext == nullptr, "Native context not initialized");
+ return *nativeContext;
+}
+
+/**
+ * Always lock gContextMutex when using native context.
+ */
+static TunerContext& getNativeContext(JNIEnv *env, JavaRef<jobject> const &jTuner) {
+ return getNativeContext(env->GetLongField(jTuner.get(), gjni.Tuner.nativeContext));
+}
+
+static jlong nativeInit(JNIEnv *env, jobject obj, jint halRev, bool withAudio, jint band) {
+ ALOGV("%s", __func__);
+ lock_guard<mutex> lk(gContextMutex);
+
+ auto ctx = new TunerContext();
+ ctx->mHalRev = static_cast<HalRevision>(halRev);
+ ctx->mWithAudio = withAudio;
+ ctx->mBand = static_cast<Band>(band);
+
+ static_assert(sizeof(jlong) >= sizeof(ctx), "jlong is smaller than a pointer");
+ return reinterpret_cast<jlong>(ctx);
+}
+
+static void nativeFinalize(JNIEnv *env, jobject obj, jlong nativeContext) {
+ ALOGV("%s", __func__);
+ lock_guard<mutex> lk(gContextMutex);
+
+ auto ctx = reinterpret_cast<TunerContext*>(nativeContext);
+ delete ctx;
+}
+
+void HalDeathRecipient::serviceDied(uint64_t cookie __unused,
+ const wp<hidl::base::V1_0::IBase>& who __unused) {
+ ALOGW("HAL Tuner died unexpectedly");
+
+ auto tunerCallback = mTunerCallback.promote();
+ if (tunerCallback == nullptr) return;
+
+ tunerCallback->hardwareFailure();
+}
+
+// TODO(b/62713378): implement support for multiple tuners open at the same time
+static void notifyAudioService(TunerContext& ctx, bool connected) {
+ if (!ctx.mWithAudio) return;
+
+ ALOGD("Notifying AudioService about new state: %d", connected);
+ auto token = IPCThreadState::self()->clearCallingIdentity();
+ AudioSystem::setDeviceConnectionState(AUDIO_DEVICE_IN_FM_TUNER,
+ connected ? AUDIO_POLICY_DEVICE_STATE_AVAILABLE : AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
+ nullptr, kAudioDeviceName);
+ IPCThreadState::self()->restoreCallingIdentity(token);
+}
+
+void assignHalInterfaces(JNIEnv *env, JavaRef<jobject> const &jTuner,
+ sp<V1_0::IBroadcastRadio> halModule, sp<V1_0::ITuner> halTuner) {
+ ALOGV("%s(%p)", __func__, halTuner.get());
+ ALOGE_IF(halTuner == nullptr, "HAL tuner is a nullptr");
+ lock_guard<mutex> lk(gContextMutex);
+ auto& ctx = getNativeContext(env, jTuner);
+
+ if (ctx.mIsClosed) {
+ ALOGD("Tuner was closed during initialization");
+ // dropping the last reference will close HAL tuner
+ return;
+ }
+ if (ctx.mHalTuner != nullptr) {
+ ALOGE("HAL tuner is already set.");
+ return;
+ }
+
+ ctx.mHalModule = halModule;
+ ctx.mHalModule11 = V1_1::IBroadcastRadio::castFrom(halModule).withDefault(nullptr);
+
+ ctx.mHalTuner = halTuner;
+ ctx.mHalTuner11 = V1_1::ITuner::castFrom(halTuner).withDefault(nullptr);
+ ALOGW_IF(ctx.mHalRev >= HalRevision::V1_1 && ctx.mHalTuner11 == nullptr,
+ "Provided tuner does not implement 1.1 HAL");
+
+ ctx.mHalDeathRecipient = new HalDeathRecipient(getNativeCallback(env, jTuner));
+ halTuner->linkToDeath(ctx.mHalDeathRecipient, 0);
+
+ notifyAudioService(ctx, true);
+}
+
+static sp<V1_0::ITuner> getHalTuner(const TunerContext& ctx) {
+ auto tuner = ctx.mHalTuner;
+ LOG_ALWAYS_FATAL_IF(tuner == nullptr, "HAL tuner is not open");
+ return tuner;
+}
+
+sp<V1_0::ITuner> getHalTuner(jlong nativeContext) {
+ lock_guard<mutex> lk(gContextMutex);
+ return getHalTuner(getNativeContext(nativeContext));
+}
+
+sp<V1_1::ITuner> getHalTuner11(jlong nativeContext) {
+ lock_guard<mutex> lk(gContextMutex);
+ return getNativeContext(nativeContext).mHalTuner11;
+}
+
+sp<ITunerCallback> getNativeCallback(JNIEnv *env, JavaRef<jobject> const &tuner) {
+ return TunerCallback::getNativeCallback(env,
+ env->GetObjectField(tuner.get(), gjni.Tuner.tunerCallback));
+}
+
+Region getRegion(JNIEnv *env, jobject obj) {
+ return static_cast<Region>(env->GetIntField(obj, gjni.Tuner.region));
+}
+
+static void nativeClose(JNIEnv *env, jobject obj, jlong nativeContext) {
+ lock_guard<mutex> lk(gContextMutex);
+ auto& ctx = getNativeContext(nativeContext);
+
+ if (ctx.mIsClosed) return;
+ ctx.mIsClosed = true;
+
+ if (ctx.mHalTuner == nullptr) {
+ ALOGI("Tuner closed during initialization");
+ return;
+ }
+
+ ALOGI("Closing tuner %p", ctx.mHalTuner.get());
+
+ notifyAudioService(ctx, false);
+
+ ctx.mHalTuner->unlinkToDeath(ctx.mHalDeathRecipient);
+ ctx.mHalDeathRecipient = nullptr;
+
+ ctx.mHalTuner11 = nullptr;
+ ctx.mHalTuner = nullptr;
+}
+
+static void nativeSetConfiguration(JNIEnv *env, jobject obj, jlong nativeContext, jobject config) {
+ ALOGV("%s", __func__);
+ lock_guard<mutex> lk(gContextMutex);
+ auto& ctx = getNativeContext(nativeContext);
+
+ auto halTuner = getHalTuner(ctx);
+ if (halTuner == nullptr) return;
+
+ Region region_unused;
+ BandConfig bandConfigHal = convert::BandConfigToHal(env, config, region_unused);
+
+ if (convert::ThrowIfFailed(env, halTuner->setConfiguration(bandConfigHal))) return;
+
+ ctx.mBand = bandConfigHal.type;
+}
+
+static jobject nativeGetConfiguration(JNIEnv *env, jobject obj, jlong nativeContext,
+ Region region) {
+ ALOGV("%s", __func__);
+ auto halTuner = getHalTuner(nativeContext);
+ if (halTuner == nullptr) return nullptr;
+
+ BandConfig halConfig;
+ Result halResult;
+ auto hidlResult = halTuner->getConfiguration([&](Result result, const BandConfig& config) {
+ halResult = result;
+ halConfig = config;
+ });
+ if (convert::ThrowIfFailed(env, hidlResult, halResult)) {
+ return nullptr;
+ }
+
+ return convert::BandConfigFromHal(env, halConfig, region).release();
+}
+
+static void nativeStep(JNIEnv *env, jobject obj, jlong nativeContext,
+ bool directionDown, bool skipSubChannel) {
+ ALOGV("%s", __func__);
+ auto halTuner = getHalTuner(nativeContext);
+ if (halTuner == nullptr) return;
+
+ auto dir = convert::DirectionToHal(directionDown);
+ convert::ThrowIfFailed(env, halTuner->step(dir, skipSubChannel));
+}
+
+static void nativeScan(JNIEnv *env, jobject obj, jlong nativeContext,
+ bool directionDown, bool skipSubChannel) {
+ ALOGV("%s", __func__);
+ auto halTuner = getHalTuner(nativeContext);
+ if (halTuner == nullptr) return;
+
+ auto dir = convert::DirectionToHal(directionDown);
+ convert::ThrowIfFailed(env, halTuner->scan(dir, skipSubChannel));
+}
+
+static void nativeTune(JNIEnv *env, jobject obj, jlong nativeContext, jobject jSelector) {
+ ALOGV("%s", __func__);
+ lock_guard<mutex> lk(gContextMutex);
+ auto& ctx = getNativeContext(nativeContext);
+
+ auto halTuner10 = getHalTuner(ctx);
+ auto halTuner11 = ctx.mHalTuner11;
+ if (halTuner10 == nullptr) return;
+
+ auto selector = convert::ProgramSelectorToHal(env, jSelector);
+ if (halTuner11 != nullptr) {
+ convert::ThrowIfFailed(env, halTuner11->tune_1_1(selector));
+ } else {
+ uint32_t channel, subChannel;
+ if (!V1_1::utils::getLegacyChannel(selector, &channel, &subChannel)) {
+ jniThrowException(env, "java/lang/IllegalArgumentException",
+ "Can't tune to non-AM/FM channel with HAL<1.1");
+ return;
+ }
+ convert::ThrowIfFailed(env, halTuner10->tune(channel, subChannel));
+ }
+}
+
+static void nativeCancel(JNIEnv *env, jobject obj, jlong nativeContext) {
+ ALOGV("%s", __func__);
+ auto halTuner = getHalTuner(nativeContext);
+ if (halTuner == nullptr) return;
+
+ convert::ThrowIfFailed(env, halTuner->cancel());
+}
+
+static void nativeCancelAnnouncement(JNIEnv *env, jobject obj, jlong nativeContext) {
+ ALOGV("%s", __func__);
+ auto halTuner = getHalTuner11(nativeContext);
+ if (halTuner == nullptr) {
+ ALOGI("cancelling announcements is not supported with HAL < 1.1");
+ return;
+ }
+
+ convert::ThrowIfFailed(env, halTuner->cancelAnnouncement());
+}
+
+static jobject nativeGetProgramInformation(JNIEnv *env, jobject obj, jlong nativeContext) {
+ ALOGV("%s", __func__);
+ lock_guard<mutex> lk(gContextMutex);
+ auto& ctx = getNativeContext(nativeContext);
+
+ auto halTuner10 = getHalTuner(ctx);
+ auto halTuner11 = ctx.mHalTuner11;
+ if (halTuner10 == nullptr) return nullptr;
+
+ JavaRef<jobject> jInfo;
+ Result halResult;
+ Return<void> hidlResult;
+ if (halTuner11 != nullptr) {
+ hidlResult = halTuner11->getProgramInformation_1_1([&](Result result,
+ const V1_1::ProgramInfo& info) {
+ halResult = result;
+ if (result != Result::OK) return;
+ jInfo = convert::ProgramInfoFromHal(env, info);
+ });
+ } else {
+ hidlResult = halTuner10->getProgramInformation([&](Result result,
+ const V1_0::ProgramInfo& info) {
+ halResult = result;
+ if (result != Result::OK) return;
+ jInfo = convert::ProgramInfoFromHal(env, info, ctx.mBand);
+ });
+ }
+
+ if (jInfo != nullptr) return jInfo.release();
+ convert::ThrowIfFailed(env, hidlResult, halResult);
+ return nullptr;
+}
+
+static bool nativeStartBackgroundScan(JNIEnv *env, jobject obj, jlong nativeContext) {
+ ALOGV("%s", __func__);
+ auto halTuner = getHalTuner11(nativeContext);
+ if (halTuner == nullptr) {
+ ALOGI("Background scan is not supported with HAL < 1.1");
+ return false;
+ }
+
+ auto halResult = halTuner->startBackgroundScan();
+
+ if (halResult.isOk() && halResult == ProgramListResult::UNAVAILABLE) return false;
+ return !convert::ThrowIfFailed(env, halResult);
+}
+
+static jobject nativeGetProgramList(JNIEnv *env, jobject obj, jlong nativeContext, jstring jFilter) {
+ ALOGV("%s", __func__);
+ auto halTuner = getHalTuner11(nativeContext);
+ if (halTuner == nullptr) {
+ ALOGI("Program list is not supported with HAL < 1.1");
+ return nullptr;
+ }
+
+ JavaRef<jobject> jList;
+ ProgramListResult halResult = ProgramListResult::NOT_INITIALIZED;
+ auto filter = env->GetStringUTFChars(jFilter, nullptr);
+ auto hidlResult = halTuner->getProgramList(filter,
+ [&](ProgramListResult result, const hidl_vec<V1_1::ProgramInfo>& programList) {
+ halResult = result;
+ if (halResult != ProgramListResult::OK) return;
+
+ jList = make_javaref(env, env->NewObject(gjni.ArrayList.clazz, gjni.ArrayList.cstor));
+ for (auto& program : programList) {
+ auto jProgram = convert::ProgramInfoFromHal(env, program);
+ env->CallBooleanMethod(jList.get(), gjni.ArrayList.add, jProgram.get());
+ }
+ });
+
+ if (convert::ThrowIfFailed(env, hidlResult, halResult)) return nullptr;
+
+ return jList.release();
+}
+
+static jbyteArray nativeGetImage(JNIEnv *env, jobject obj, jlong nativeContext, jint id) {
+ ALOGV("%s(%x)", __func__, id);
+ lock_guard<mutex> lk(gContextMutex);
+ auto& ctx = getNativeContext(nativeContext);
+
+ if (ctx.mHalModule11 == nullptr) {
+ jniThrowException(env, "java/lang/IllegalStateException",
+ "Out-of-band images are not supported with HAL < 1.1");
+ return nullptr;
+ }
+
+ auto halModule = ctx.mHalModule11.promote();
+ if (halModule == nullptr) {
+ ALOGE("HAL module is gone");
+ return nullptr;
+ }
+
+ JavaRef<jbyteArray> jRawImage = nullptr;
+
+ auto hidlResult = halModule->getImage(id, [&](hidl_vec<uint8_t> rawImage) {
+ auto len = rawImage.size();
+ if (len == 0) return;
+
+ jRawImage = make_javaref(env, env->NewByteArray(len));
+ if (jRawImage == nullptr) {
+ ALOGE("Failed to allocate byte array of len %zu", len);
+ return;
+ }
+
+ env->SetByteArrayRegion(jRawImage.get(), 0, len,
+ reinterpret_cast<const jbyte*>(rawImage.data()));
+ });
+
+ if (convert::ThrowIfFailed(env, hidlResult)) return nullptr;
+
+ return jRawImage.get();
+}
+
+static bool nativeIsAnalogForced(JNIEnv *env, jobject obj, jlong nativeContext) {
+ ALOGV("%s", __func__);
+ auto halTuner = getHalTuner11(nativeContext);
+ if (halTuner == nullptr) {
+ jniThrowException(env, "java/lang/IllegalStateException",
+ "Forced analog switch is not supported with HAL < 1.1");
+ return false;
+ }
+
+ bool isForced;
+ Result halResult;
+ auto hidlResult = halTuner->isAnalogForced([&](Result result, bool isForcedRet) {
+ halResult = result;
+ isForced = isForcedRet;
+ });
+
+ if (convert::ThrowIfFailed(env, hidlResult, halResult)) return false;
+
+ return isForced;
+}
+
+static void nativeSetAnalogForced(JNIEnv *env, jobject obj, jlong nativeContext, bool isForced) {
+ ALOGV("%s(%d)", __func__, isForced);
+ auto halTuner = getHalTuner11(nativeContext);
+ if (halTuner == nullptr) {
+ jniThrowException(env, "java/lang/IllegalStateException",
+ "Forced analog switch is not supported with HAL < 1.1");
+ return;
+ }
+
+ auto halResult = halTuner->setAnalogForced(isForced);
+ convert::ThrowIfFailed(env, halResult);
+}
+
+static bool nativeIsAntennaConnected(JNIEnv *env, jobject obj, jlong nativeContext) {
+ ALOGV("%s", __func__);
+ auto halTuner = getHalTuner(nativeContext);
+ if (halTuner == nullptr) return false;
+
+ bool isConnected = false;
+ Result halResult;
+ auto hidlResult = halTuner->getConfiguration([&](Result result, const BandConfig& config) {
+ halResult = result;
+ isConnected = config.antennaConnected;
+ });
+ convert::ThrowIfFailed(env, hidlResult, halResult);
+ return isConnected;
+}
+
+static const JNINativeMethod gTunerMethods[] = {
+ { "nativeInit", "(IZI)J", (void*)nativeInit },
+ { "nativeFinalize", "(J)V", (void*)nativeFinalize },
+ { "nativeClose", "(J)V", (void*)nativeClose },
+ { "nativeSetConfiguration", "(JLandroid/hardware/radio/RadioManager$BandConfig;)V",
+ (void*)nativeSetConfiguration },
+ { "nativeGetConfiguration", "(JI)Landroid/hardware/radio/RadioManager$BandConfig;",
+ (void*)nativeGetConfiguration },
+ { "nativeStep", "(JZZ)V", (void*)nativeStep },
+ { "nativeScan", "(JZZ)V", (void*)nativeScan },
+ { "nativeTune", "(JLandroid/hardware/radio/ProgramSelector;)V", (void*)nativeTune },
+ { "nativeCancel", "(J)V", (void*)nativeCancel },
+ { "nativeCancelAnnouncement", "(J)V", (void*)nativeCancelAnnouncement },
+ { "nativeGetProgramInformation", "(J)Landroid/hardware/radio/RadioManager$ProgramInfo;",
+ (void*)nativeGetProgramInformation },
+ { "nativeStartBackgroundScan", "(J)Z", (void*)nativeStartBackgroundScan },
+ { "nativeGetProgramList", "(JLjava/lang/String;)Ljava/util/List;",
+ (void*)nativeGetProgramList },
+ { "nativeGetImage", "(JI)[B", (void*)nativeGetImage},
+ { "nativeIsAnalogForced", "(J)Z", (void*)nativeIsAnalogForced },
+ { "nativeSetAnalogForced", "(JZ)V", (void*)nativeSetAnalogForced },
+ { "nativeIsAntennaConnected", "(J)Z", (void*)nativeIsAntennaConnected },
+};
+
+} // namespace Tuner
+} // namespace BroadcastRadio
+} // namespace server
+
+void register_android_server_broadcastradio_Tuner(JavaVM *vm, JNIEnv *env) {
+ using namespace server::BroadcastRadio::Tuner;
+
+ register_android_server_broadcastradio_TunerCallback(vm, env);
+
+ auto tunerClass = FindClassOrDie(env, "com/android/server/broadcastradio/Tuner");
+ gjni.Tuner.nativeContext = GetFieldIDOrDie(env, tunerClass, "mNativeContext", "J");
+ gjni.Tuner.region = GetFieldIDOrDie(env, tunerClass, "mRegion", "I");
+ gjni.Tuner.tunerCallback = GetFieldIDOrDie(env, tunerClass, "mTunerCallback",
+ "Lcom/android/server/broadcastradio/TunerCallback;");
+
+ auto arrayListClass = FindClassOrDie(env, "java/util/ArrayList");
+ gjni.ArrayList.clazz = MakeGlobalRefOrDie(env, arrayListClass);
+ gjni.ArrayList.cstor = GetMethodIDOrDie(env, arrayListClass, "<init>", "()V");
+ gjni.ArrayList.add = GetMethodIDOrDie(env, arrayListClass, "add", "(Ljava/lang/Object;)Z");
+
+ auto res = jniRegisterNativeMethods(env, "com/android/server/broadcastradio/Tuner",
+ gTunerMethods, NELEM(gTunerMethods));
+ LOG_ALWAYS_FATAL_IF(res < 0, "Unable to register native methods.");
+}
+
+} // namespace android
diff --git a/services/core/jni/BroadcastRadio/Tuner.h b/services/core/jni/BroadcastRadio/Tuner.h
new file mode 100644
index 0000000..818597b
--- /dev/null
+++ b/services/core/jni/BroadcastRadio/Tuner.h
@@ -0,0 +1,52 @@
+/**
+ * Copyright (C) 2017 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.
+ */
+
+#ifndef _ANDROID_SERVER_BROADCASTRADIORADIO_TUNER_H
+#define _ANDROID_SERVER_BROADCASTRADIORADIO_TUNER_H
+
+#include "types.h"
+
+#include "JavaRef.h"
+
+#include <android/hardware/broadcastradio/1.1/IBroadcastRadio.h>
+#include <android/hardware/broadcastradio/1.1/ITuner.h>
+#include <android/hardware/broadcastradio/1.1/ITunerCallback.h>
+#include <jni.h>
+#include <utils/StrongPointer.h>
+
+namespace android {
+
+void register_android_server_broadcastradio_Tuner(JavaVM *vm, JNIEnv *env);
+
+namespace server {
+namespace BroadcastRadio {
+namespace Tuner {
+
+void assignHalInterfaces(JNIEnv *env, JavaRef<jobject> const &jTuner,
+ sp<hardware::broadcastradio::V1_0::IBroadcastRadio> halModule,
+ sp<hardware::broadcastradio::V1_0::ITuner> halTuner);
+
+sp<hardware::broadcastradio::V1_1::ITunerCallback>
+getNativeCallback(JNIEnv *env, JavaRef<jobject> const &tuner);
+
+Region getRegion(JNIEnv *env, jobject obj);
+
+} // namespace Tuner
+} // namespace BroadcastRadio
+} // namespace server
+} // namespace android
+
+#endif // _ANDROID_SERVER_BROADCASTRADIORADIO_TUNER_H
diff --git a/services/core/jni/BroadcastRadio/TunerCallback.cpp b/services/core/jni/BroadcastRadio/TunerCallback.cpp
new file mode 100644
index 0000000..04bdddf
--- /dev/null
+++ b/services/core/jni/BroadcastRadio/TunerCallback.cpp
@@ -0,0 +1,402 @@
+/**
+ * Copyright (C) 2017 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.
+ */
+
+#define LOG_TAG "BroadcastRadioService.TunerCallback.jni"
+#define LOG_NDEBUG 0
+
+#include "TunerCallback.h"
+
+#include "Tuner.h"
+#include "convert.h"
+
+#include <broadcastradio-utils/Utils.h>
+#include <core_jni_helpers.h>
+#include <nativehelper/JNIHelp.h>
+#include <utils/Log.h>
+
+namespace android {
+namespace server {
+namespace BroadcastRadio {
+namespace TunerCallback {
+
+using std::lock_guard;
+using std::mutex;
+
+using hardware::Return;
+using hardware::hidl_vec;
+
+namespace V1_0 = hardware::broadcastradio::V1_0;
+namespace V1_1 = hardware::broadcastradio::V1_1;
+
+using V1_0::Band;
+using V1_0::BandConfig;
+using V1_0::MetaData;
+using V1_0::Result;
+using V1_1::ITunerCallback;
+using V1_1::ProgramListResult;
+using V1_1::ProgramSelector;
+
+static JavaVM *gvm = nullptr;
+
+static struct {
+ struct {
+ jclass clazz;
+ jfieldID nativeContext;
+ jmethodID handleHwFailure;
+ jmethodID onError;
+ jmethodID onConfigurationChanged;
+ jmethodID onProgramInfoChanged;
+ jmethodID onTrafficAnnouncement;
+ jmethodID onEmergencyAnnouncement;
+ jmethodID onAntennaState;
+ jmethodID onBackgroundScanAvailabilityChange;
+ jmethodID onBackgroundScanComplete;
+ jmethodID onProgramListChanged;
+ } TunerCallback;
+} gjni;
+
+// from frameworks/base/core/java/android/hardware/radio/RadioTuner.java
+enum class TunerError : jint {
+ HARDWARE_FAILURE = 0,
+ SERVER_DIED = 1,
+ CANCELLED = 2,
+ SCAN_TIMEOUT = 3,
+ CONFIG = 4,
+ BACKGROUND_SCAN_UNAVAILABLE = 5,
+ BACKGROUND_SCAN_FAILED = 6,
+};
+
+static mutex gContextMutex;
+
+class NativeCallback : public ITunerCallback {
+ jobject mJTuner;
+ jobject mJCallback;
+ NativeCallbackThread mCallbackThread;
+ HalRevision mHalRev;
+
+ Band mBand;
+
+ DISALLOW_COPY_AND_ASSIGN(NativeCallback);
+
+public:
+ NativeCallback(JNIEnv *env, jobject jTuner, jobject jCallback, HalRevision halRev);
+ virtual ~NativeCallback();
+
+ void detach();
+
+ virtual Return<void> hardwareFailure();
+ virtual Return<void> configChange(Result result, const BandConfig& config);
+ virtual Return<void> tuneComplete(Result result, const V1_0::ProgramInfo& info);
+ virtual Return<void> afSwitch(const V1_0::ProgramInfo& info);
+ virtual Return<void> antennaStateChange(bool connected);
+ virtual Return<void> trafficAnnouncement(bool active);
+ virtual Return<void> emergencyAnnouncement(bool active);
+ virtual Return<void> newMetadata(uint32_t channel, uint32_t subChannel,
+ const hidl_vec<MetaData>& metadata);
+ virtual Return<void> tuneComplete_1_1(Result result, const ProgramSelector& selector);
+ virtual Return<void> afSwitch_1_1(const ProgramSelector& selector);
+ virtual Return<void> backgroundScanAvailable(bool isAvailable);
+ virtual Return<void> backgroundScanComplete(ProgramListResult result);
+ virtual Return<void> programListChanged();
+ virtual Return<void> programInfoChanged();
+};
+
+struct TunerCallbackContext {
+ TunerCallbackContext() {}
+
+ sp<NativeCallback> mNativeCallback;
+
+private:
+ DISALLOW_COPY_AND_ASSIGN(TunerCallbackContext);
+};
+
+NativeCallback::NativeCallback(JNIEnv *env, jobject jTuner, jobject jCallback, HalRevision halRev)
+ : mCallbackThread(gvm), mHalRev(halRev) {
+ ALOGV("%s", __func__);
+ mJTuner = env->NewGlobalRef(jTuner);
+ mJCallback = env->NewGlobalRef(jCallback);
+}
+
+NativeCallback::~NativeCallback() {
+ ALOGV("%s", __func__);
+
+ // stop callback thread before dereferencing client callback
+ mCallbackThread.stop();
+
+ JNIEnv *env = nullptr;
+ gvm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_4);
+ if (env != nullptr) {
+ env->DeleteGlobalRef(mJTuner);
+ env->DeleteGlobalRef(mJCallback);
+ }
+}
+
+void NativeCallback::detach() {
+ // stop callback thread to ignore further calls
+ mCallbackThread.stop();
+}
+
+Return<void> NativeCallback::hardwareFailure() {
+ mCallbackThread.enqueue([this](JNIEnv *env) {
+ env->CallVoidMethod(mJCallback, gjni.TunerCallback.handleHwFailure);
+ });
+
+ return Return<void>();
+}
+
+Return<void> NativeCallback::configChange(Result result, const BandConfig& config) {
+ ALOGV("%s(%d)", __func__, result);
+
+ mCallbackThread.enqueue([result, config, this](JNIEnv *env) {
+ if (result == Result::OK) {
+ auto region = Tuner::getRegion(env, mJTuner);
+ auto jConfig = convert::BandConfigFromHal(env, config, region);
+ if (jConfig == nullptr) return;
+ env->CallVoidMethod(mJCallback, gjni.TunerCallback.onConfigurationChanged,
+ jConfig.get());
+ } else {
+ env->CallVoidMethod(mJCallback, gjni.TunerCallback.onError, TunerError::CONFIG);
+ }
+ });
+
+ return Return<void>();
+}
+
+Return<void> NativeCallback::tuneComplete(Result result, const V1_0::ProgramInfo& info) {
+ ALOGV("%s(%d)", __func__, result);
+
+ if (mHalRev > HalRevision::V1_0) {
+ ALOGW("1.0 callback was ignored");
+ return Return<void>();
+ }
+
+ auto selector = V1_1::utils::make_selector(mBand, info.channel, info.subChannel);
+ return tuneComplete_1_1(result, selector);
+}
+
+Return<void> NativeCallback::tuneComplete_1_1(Result result, const ProgramSelector& selector) {
+ ALOGV("%s(%d)", __func__, result);
+
+ mCallbackThread.enqueue([result, this](JNIEnv *env) {
+ if (result == Result::OK) {
+ env->CallVoidMethod(mJCallback, gjni.TunerCallback.onProgramInfoChanged);
+ } else {
+ TunerError cause = TunerError::CANCELLED;
+ if (result == Result::TIMEOUT) cause = TunerError::SCAN_TIMEOUT;
+ env->CallVoidMethod(mJCallback, gjni.TunerCallback.onError, cause);
+ }
+ });
+
+ return Return<void>();
+}
+
+Return<void> NativeCallback::afSwitch(const V1_0::ProgramInfo& info) {
+ ALOGV("%s", __func__);
+ return tuneComplete(Result::OK, info);
+}
+
+Return<void> NativeCallback::afSwitch_1_1(const ProgramSelector& selector) {
+ ALOGV("%s", __func__);
+ return tuneComplete_1_1(Result::OK, selector);
+}
+
+Return<void> NativeCallback::antennaStateChange(bool connected) {
+ ALOGV("%s(%d)", __func__, connected);
+
+ mCallbackThread.enqueue([this, connected](JNIEnv *env) {
+ env->CallVoidMethod(mJCallback, gjni.TunerCallback.onAntennaState, connected);
+ });
+
+ return Return<void>();
+}
+
+Return<void> NativeCallback::trafficAnnouncement(bool active) {
+ ALOGV("%s(%d)", __func__, active);
+
+ mCallbackThread.enqueue([this, active](JNIEnv *env) {
+ env->CallVoidMethod(mJCallback, gjni.TunerCallback.onTrafficAnnouncement, active);
+ });
+
+ return Return<void>();
+}
+
+Return<void> NativeCallback::emergencyAnnouncement(bool active) {
+ ALOGV("%s(%d)", __func__, active);
+
+ mCallbackThread.enqueue([this, active](JNIEnv *env) {
+ env->CallVoidMethod(mJCallback, gjni.TunerCallback.onEmergencyAnnouncement, active);
+ });
+
+ return Return<void>();
+}
+
+Return<void> NativeCallback::newMetadata(uint32_t channel, uint32_t subChannel,
+ const hidl_vec<MetaData>& metadata) {
+ // channel and subChannel are not used
+ ALOGV("%s(%d, %d)", __func__, channel, subChannel);
+
+ if (mHalRev > HalRevision::V1_0) {
+ ALOGW("1.0 callback was ignored");
+ return Return<void>();
+ }
+
+ mCallbackThread.enqueue([this, metadata](JNIEnv *env) {
+ env->CallVoidMethod(mJCallback, gjni.TunerCallback.onProgramInfoChanged);
+ });
+
+ return Return<void>();
+}
+
+Return<void> NativeCallback::backgroundScanAvailable(bool isAvailable) {
+ ALOGV("%s(%d)", __func__, isAvailable);
+
+ mCallbackThread.enqueue([this, isAvailable](JNIEnv *env) {
+ env->CallVoidMethod(mJCallback,
+ gjni.TunerCallback.onBackgroundScanAvailabilityChange, isAvailable);
+ });
+
+ return Return<void>();
+}
+
+Return<void> NativeCallback::backgroundScanComplete(ProgramListResult result) {
+ ALOGV("%s(%d)", __func__, result);
+
+ mCallbackThread.enqueue([this, result](JNIEnv *env) {
+ if (result == ProgramListResult::OK) {
+ env->CallVoidMethod(mJCallback, gjni.TunerCallback.onBackgroundScanComplete);
+ } else {
+ auto cause = (result == ProgramListResult::UNAVAILABLE) ?
+ TunerError::BACKGROUND_SCAN_UNAVAILABLE : TunerError::BACKGROUND_SCAN_FAILED;
+ env->CallVoidMethod(mJCallback, gjni.TunerCallback.onError, cause);
+ }
+ });
+
+ return Return<void>();
+}
+
+Return<void> NativeCallback::programListChanged() {
+ ALOGV("%s", __func__);
+
+ mCallbackThread.enqueue([this](JNIEnv *env) {
+ env->CallVoidMethod(mJCallback, gjni.TunerCallback.onProgramListChanged);
+ });
+
+ return Return<void>();
+}
+
+Return<void> NativeCallback::programInfoChanged() {
+ ALOGV("%s", __func__);
+
+ mCallbackThread.enqueue([this](JNIEnv *env) {
+ env->CallVoidMethod(mJCallback, gjni.TunerCallback.onProgramInfoChanged);
+ });
+
+ return Return<void>();
+}
+
+static TunerCallbackContext& getNativeContext(jlong nativeContextHandle) {
+ auto nativeContext = reinterpret_cast<TunerCallbackContext*>(nativeContextHandle);
+ LOG_ALWAYS_FATAL_IF(nativeContext == nullptr, "Native context not initialized");
+ return *nativeContext;
+}
+
+/**
+ * Always lock gContextMutex when using native context.
+ */
+static TunerCallbackContext& getNativeContext(JNIEnv *env, jobject jTunerCb) {
+ return getNativeContext(env->GetLongField(jTunerCb, gjni.TunerCallback.nativeContext));
+}
+
+static jlong nativeInit(JNIEnv *env, jobject obj, jobject jTuner, jint jHalRev) {
+ ALOGV("%s", __func__);
+ lock_guard<mutex> lk(gContextMutex);
+
+ auto halRev = static_cast<HalRevision>(jHalRev);
+
+ auto ctx = new TunerCallbackContext();
+ ctx->mNativeCallback = new NativeCallback(env, jTuner, obj, halRev);
+
+ static_assert(sizeof(jlong) >= sizeof(ctx), "jlong is smaller than a pointer");
+ return reinterpret_cast<jlong>(ctx);
+}
+
+static void nativeFinalize(JNIEnv *env, jobject obj, jlong nativeContext) {
+ ALOGV("%s", __func__);
+ lock_guard<mutex> lk(gContextMutex);
+
+ auto ctx = reinterpret_cast<TunerCallbackContext*>(nativeContext);
+ delete ctx;
+}
+
+static void nativeDetach(JNIEnv *env, jobject obj, jlong nativeContext) {
+ ALOGV("%s", __func__);
+ lock_guard<mutex> lk(gContextMutex);
+ auto& ctx = getNativeContext(nativeContext);
+
+ if (ctx.mNativeCallback == nullptr) return;
+ ctx.mNativeCallback->detach();
+ ctx.mNativeCallback = nullptr;
+}
+
+sp<ITunerCallback> getNativeCallback(JNIEnv *env, jobject jTunerCallback) {
+ lock_guard<mutex> lk(gContextMutex);
+ auto& ctx = getNativeContext(env, jTunerCallback);
+ return ctx.mNativeCallback;
+}
+
+static const JNINativeMethod gTunerCallbackMethods[] = {
+ { "nativeInit", "(Lcom/android/server/broadcastradio/Tuner;I)J", (void*)nativeInit },
+ { "nativeFinalize", "(J)V", (void*)nativeFinalize },
+ { "nativeDetach", "(J)V", (void*)nativeDetach },
+};
+
+} // namespace TunerCallback
+} // namespace BroadcastRadio
+} // namespace server
+
+void register_android_server_broadcastradio_TunerCallback(JavaVM *vm, JNIEnv *env) {
+ using namespace server::BroadcastRadio::TunerCallback;
+
+ gvm = vm;
+
+ auto tunerCbClass = FindClassOrDie(env, "com/android/server/broadcastradio/TunerCallback");
+ gjni.TunerCallback.clazz = MakeGlobalRefOrDie(env, tunerCbClass);
+ gjni.TunerCallback.nativeContext = GetFieldIDOrDie(env, tunerCbClass, "mNativeContext", "J");
+ gjni.TunerCallback.handleHwFailure = GetMethodIDOrDie(env, tunerCbClass, "handleHwFailure", "()V");
+ gjni.TunerCallback.onError = GetMethodIDOrDie(env, tunerCbClass, "onError", "(I)V");
+ gjni.TunerCallback.onConfigurationChanged = GetMethodIDOrDie(env, tunerCbClass,
+ "onConfigurationChanged", "(Landroid/hardware/radio/RadioManager$BandConfig;)V");
+ gjni.TunerCallback.onProgramInfoChanged = GetMethodIDOrDie(env, tunerCbClass,
+ "onProgramInfoChanged", "()V");
+ gjni.TunerCallback.onTrafficAnnouncement = GetMethodIDOrDie(env, tunerCbClass,
+ "onTrafficAnnouncement", "(Z)V");
+ gjni.TunerCallback.onEmergencyAnnouncement = GetMethodIDOrDie(env, tunerCbClass,
+ "onEmergencyAnnouncement", "(Z)V");
+ gjni.TunerCallback.onAntennaState = GetMethodIDOrDie(env, tunerCbClass,
+ "onAntennaState", "(Z)V");
+ gjni.TunerCallback.onBackgroundScanAvailabilityChange = GetMethodIDOrDie(env, tunerCbClass,
+ "onBackgroundScanAvailabilityChange", "(Z)V");
+ gjni.TunerCallback.onBackgroundScanComplete = GetMethodIDOrDie(env, tunerCbClass,
+ "onBackgroundScanComplete", "()V");
+ gjni.TunerCallback.onProgramListChanged = GetMethodIDOrDie(env, tunerCbClass,
+ "onProgramListChanged", "()V");
+
+ auto res = jniRegisterNativeMethods(env, "com/android/server/broadcastradio/TunerCallback",
+ gTunerCallbackMethods, NELEM(gTunerCallbackMethods));
+ LOG_ALWAYS_FATAL_IF(res < 0, "Unable to register native methods.");
+}
+
+} // namespace android
diff --git a/services/core/jni/BroadcastRadio/TunerCallback.h b/services/core/jni/BroadcastRadio/TunerCallback.h
new file mode 100644
index 0000000..af12d21
--- /dev/null
+++ b/services/core/jni/BroadcastRadio/TunerCallback.h
@@ -0,0 +1,43 @@
+/**
+ * Copyright (C) 2017 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.
+ */
+
+#ifndef _ANDROID_SERVER_BROADCASTRADIO_TUNERCALLBACK_H
+#define _ANDROID_SERVER_BROADCASTRADIO_TUNERCALLBACK_H
+
+#include "JavaRef.h"
+#include "NativeCallbackThread.h"
+#include "types.h"
+
+#include <android/hardware/broadcastradio/1.1/ITunerCallback.h>
+#include <jni.h>
+
+namespace android {
+
+void register_android_server_broadcastradio_TunerCallback(JavaVM *vm, JNIEnv *env);
+
+namespace server {
+namespace BroadcastRadio {
+namespace TunerCallback {
+
+sp<hardware::broadcastradio::V1_1::ITunerCallback>
+getNativeCallback(JNIEnv *env, jobject jTunerCallback);
+
+} // namespace TunerCallback
+} // namespace BroadcastRadio
+} // namespace server
+} // namespace android
+
+#endif // _ANDROID_SERVER_BROADCASTRADIO_TUNERCALLBACK_H
diff --git a/services/core/jni/BroadcastRadio/convert.cpp b/services/core/jni/BroadcastRadio/convert.cpp
new file mode 100644
index 0000000..ba1395f73
--- /dev/null
+++ b/services/core/jni/BroadcastRadio/convert.cpp
@@ -0,0 +1,642 @@
+/**
+ * Copyright (C) 2017 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.
+ */
+
+#define LOG_TAG "BroadcastRadioService.convert.jni"
+#define LOG_NDEBUG 0
+
+#include "convert.h"
+
+#include <broadcastradio-utils/Utils.h>
+#include <core_jni_helpers.h>
+#include <nativehelper/JNIHelp.h>
+#include <utils/Log.h>
+
+namespace android {
+namespace server {
+namespace BroadcastRadio {
+namespace convert {
+
+using hardware::Return;
+using hardware::hidl_vec;
+
+using V1_0::Band;
+using V1_0::Deemphasis;
+using V1_0::Direction;
+using V1_0::MetadataType;
+using V1_0::Result;
+using V1_0::Rds;
+using V1_1::ProgramIdentifier;
+using V1_1::ProgramListResult;
+using V1_1::ProgramSelector;
+
+static JavaRef<jobject> BandDescriptorFromHal(JNIEnv *env, const V1_0::BandConfig &config, Region region);
+
+static struct {
+ struct {
+ jfieldID descriptor;
+ } BandConfig;
+ struct {
+ jclass clazz;
+ jmethodID cstor;
+ jfieldID stereo;
+ jfieldID rds;
+ jfieldID ta;
+ jfieldID af;
+ jfieldID ea;
+ } FmBandConfig;
+ struct {
+ jclass clazz;
+ jmethodID cstor;
+ jfieldID stereo;
+ } AmBandConfig;
+
+ struct {
+ jclass clazz;
+ jfieldID region;
+ jfieldID type;
+ jfieldID lowerLimit;
+ jfieldID upperLimit;
+ jfieldID spacing;
+ } BandDescriptor;
+ struct {
+ jclass clazz;
+ jmethodID cstor;
+ } FmBandDescriptor;
+ struct {
+ jclass clazz;
+ jmethodID cstor;
+ } AmBandDescriptor;
+
+ struct {
+ jclass clazz;
+ jmethodID cstor;
+ } ModuleProperties;
+
+ struct {
+ jclass clazz;
+ jmethodID cstor;
+ } ProgramInfo;
+
+ struct {
+ jclass clazz;
+ jmethodID cstor;
+ jfieldID programType;
+ jfieldID primaryId;
+ jfieldID secondaryIds;
+ jfieldID vendorIds;
+
+ struct {
+ jclass clazz;
+ jmethodID cstor;
+ jfieldID type;
+ jfieldID value;
+ } Identifier;
+ } ProgramSelector;
+
+ struct {
+ jclass clazz;
+ jmethodID cstor;
+ jmethodID putIntFromNative;
+ jmethodID putStringFromNative;
+ jmethodID putBitmapFromNative;
+ jmethodID putClockFromNative;
+ } RadioMetadata;
+
+ struct {
+ jclass clazz;
+ jmethodID cstor;
+ } RuntimeException;
+
+ struct {
+ jclass clazz;
+ jmethodID cstor;
+ } ParcelableException;
+} gjni;
+
+template <>
+bool ThrowIfFailed(JNIEnv *env, const hardware::Return<void> &hidlResult) {
+ return __ThrowIfFailedHidl(env, hidlResult);
+}
+
+bool __ThrowIfFailedHidl(JNIEnv *env, const hardware::details::return_status &hidlResult) {
+ if (hidlResult.isOk()) return false;
+
+ ThrowParcelableRuntimeException(env, "HIDL call failed: " + hidlResult.description());
+ return true;
+}
+
+bool __ThrowIfFailed(JNIEnv *env, const Result halResult) {
+ switch (halResult) {
+ case Result::OK:
+ return false;
+ case Result::NOT_INITIALIZED:
+ ThrowParcelableRuntimeException(env, "Result::NOT_INITIALIZED");
+ return true;
+ case Result::INVALID_ARGUMENTS:
+ jniThrowException(env, "java/lang/IllegalArgumentException",
+ "Result::INVALID_ARGUMENTS");
+ return true;
+ case Result::INVALID_STATE:
+ jniThrowException(env, "java/lang/IllegalStateException", "Result::INVALID_STATE");
+ return true;
+ case Result::TIMEOUT:
+ ThrowParcelableRuntimeException(env, "Result::TIMEOUT (unexpected here)");
+ return true;
+ default:
+ ThrowParcelableRuntimeException(env, "Unknown failure, result: "
+ + std::to_string(static_cast<int32_t>(halResult)));
+ return true;
+ }
+}
+
+bool __ThrowIfFailed(JNIEnv *env, const ProgramListResult halResult) {
+ switch (halResult) {
+ case ProgramListResult::NOT_READY:
+ jniThrowException(env, "java/lang/IllegalStateException", "Scan is in progress");
+ return true;
+ case ProgramListResult::NOT_STARTED:
+ jniThrowException(env, "java/lang/IllegalStateException", "Scan has not been started");
+ return true;
+ case ProgramListResult::UNAVAILABLE:
+ ThrowParcelableRuntimeException(env,
+ "ProgramListResult::UNAVAILABLE (unexpected here)");
+ return true;
+ default:
+ return __ThrowIfFailed(env, static_cast<Result>(halResult));
+ }
+}
+
+void ThrowParcelableRuntimeException(JNIEnv *env, const std::string& msg) {
+ auto jMsg = make_javastr(env, msg);
+ auto runtimeExc = make_javaref(env, env->NewObject(gjni.RuntimeException.clazz,
+ gjni.RuntimeException.cstor, jMsg.get()));
+ auto parcelableExc = make_javaref(env, env->NewObject(gjni.ParcelableException.clazz,
+ gjni.ParcelableException.cstor, runtimeExc.get()));
+
+ auto res = env->Throw(static_cast<jthrowable>(parcelableExc.get()));
+ ALOGE_IF(res != JNI_OK, "Couldn't throw parcelable runtime exception");
+}
+
+static JavaRef<jintArray> ArrayFromHal(JNIEnv *env, const hidl_vec<uint32_t>& vec) {
+ auto jArr = make_javaref(env, env->NewIntArray(vec.size()));
+ auto jArrElements = env->GetIntArrayElements(jArr.get(), nullptr);
+ for (size_t i = 0; i < vec.size(); i++) {
+ jArrElements[i] = vec[i];
+ }
+ env->ReleaseIntArrayElements(jArr.get(), jArrElements, 0);
+ return jArr;
+}
+
+static JavaRef<jlongArray> ArrayFromHal(JNIEnv *env, const hidl_vec<uint64_t>& vec) {
+ auto jArr = make_javaref(env, env->NewLongArray(vec.size()));
+ auto jArrElements = env->GetLongArrayElements(jArr.get(), nullptr);
+ for (size_t i = 0; i < vec.size(); i++) {
+ jArrElements[i] = vec[i];
+ }
+ env->ReleaseLongArrayElements(jArr.get(), jArrElements, 0);
+ return jArr;
+}
+
+template <typename T>
+static JavaRef<jobjectArray> ArrayFromHal(JNIEnv *env, const hidl_vec<T>& vec,
+ jclass jElementClass, std::function<JavaRef<jobject>(JNIEnv*, const T&)> converter) {
+ auto jArr = make_javaref(env, env->NewObjectArray(vec.size(), jElementClass, nullptr));
+ for (size_t i = 0; i < vec.size(); i++) {
+ auto jElement = converter(env, vec[i]);
+ env->SetObjectArrayElement(jArr.get(), i, jElement.get());
+ }
+ return jArr;
+}
+
+template <typename T>
+static JavaRef<jobjectArray> ArrayFromHal(JNIEnv *env, const hidl_vec<T>& vec,
+ jclass jElementClass, JavaRef<jobject>(*converter)(JNIEnv*, const T&)) {
+ return ArrayFromHal(env, vec, jElementClass,
+ std::function<JavaRef<jobject>(JNIEnv*, const T&)>(converter));
+}
+
+static Rds RdsForRegion(bool rds, Region region) {
+ if (!rds) return Rds::NONE;
+
+ switch(region) {
+ case Region::ITU_1:
+ case Region::OIRT:
+ case Region::JAPAN:
+ case Region::KOREA:
+ return Rds::WORLD;
+ case Region::ITU_2:
+ return Rds::US;
+ default:
+ ALOGE("Unexpected region: %d", region);
+ return Rds::NONE;
+ }
+}
+
+static Deemphasis DeemphasisForRegion(Region region) {
+ switch(region) {
+ case Region::KOREA:
+ case Region::ITU_2:
+ return Deemphasis::D75;
+ case Region::ITU_1:
+ case Region::OIRT:
+ case Region::JAPAN:
+ return Deemphasis::D50;
+ default:
+ ALOGE("Unexpected region: %d", region);
+ return Deemphasis::D50;
+ }
+}
+
+static JavaRef<jobject> ModulePropertiesFromHal(JNIEnv *env, const V1_0::Properties &prop10,
+ const V1_1::Properties *prop11, jint moduleId, const std::string& serviceName) {
+ ALOGV("%s", __func__);
+ using namespace std::placeholders;
+
+ auto jServiceName = make_javastr(env, serviceName);
+ auto jImplementor = make_javastr(env, prop10.implementor);
+ auto jProduct = make_javastr(env, prop10.product);
+ auto jVersion = make_javastr(env, prop10.version);
+ auto jSerial = make_javastr(env, prop10.serial);
+ bool isBgScanSupported = prop11 ? prop11->supportsBackgroundScanning : false;
+ auto jVendorInfo = prop11 ? make_javastr(env, prop11->vendorInfo) : nullptr;
+ // ITU_1 is the default region just because its index is 0.
+ auto jBands = ArrayFromHal<V1_0::BandConfig>(env, prop10.bands, gjni.BandDescriptor.clazz,
+ std::bind(BandDescriptorFromHal, _1, _2, Region::ITU_1));
+ auto jSupportedProgramTypes =
+ prop11 ? ArrayFromHal(env, prop11->supportedProgramTypes) : nullptr;
+ auto jSupportedIdentifierTypes =
+ prop11 ? ArrayFromHal(env, prop11->supportedIdentifierTypes) : nullptr;
+
+ return make_javaref(env, env->NewObject(gjni.ModuleProperties.clazz,
+ gjni.ModuleProperties.cstor, moduleId, jServiceName.get(), prop10.classId,
+ jImplementor.get(), jProduct.get(), jVersion.get(), jSerial.get(), prop10.numTuners,
+ prop10.numAudioSources, prop10.supportsCapture, jBands.get(), isBgScanSupported,
+ jSupportedProgramTypes.get(), jSupportedIdentifierTypes.get(), jVendorInfo.get()));
+}
+
+JavaRef<jobject> ModulePropertiesFromHal(JNIEnv *env, const V1_0::Properties &properties,
+ jint moduleId, const std::string& serviceName) {
+ return ModulePropertiesFromHal(env, properties, nullptr, moduleId, serviceName);
+}
+
+JavaRef<jobject> ModulePropertiesFromHal(JNIEnv *env, const V1_1::Properties &properties,
+ jint moduleId, const std::string& serviceName) {
+ return ModulePropertiesFromHal(env, properties.base, &properties, moduleId, serviceName);
+}
+
+static JavaRef<jobject> BandDescriptorFromHal(JNIEnv *env, const V1_0::BandConfig &config, Region region) {
+ ALOGV("%s", __func__);
+
+ jint spacing = config.spacings.size() > 0 ? config.spacings[0] : 0;
+ ALOGW_IF(config.spacings.size() == 0, "No channel spacing specified");
+
+ switch (config.type) {
+ case Band::FM:
+ case Band::FM_HD: {
+ auto& fm = config.ext.fm;
+ return make_javaref(env, env->NewObject(
+ gjni.FmBandDescriptor.clazz, gjni.FmBandDescriptor.cstor,
+ region, config.type, config.lowerLimit, config.upperLimit, spacing,
+ fm.stereo, fm.rds != Rds::NONE, fm.ta, fm.af, fm.ea));
+ }
+ case Band::AM:
+ case Band::AM_HD: {
+ auto& am = config.ext.am;
+ return make_javaref(env, env->NewObject(
+ gjni.AmBandDescriptor.clazz, gjni.AmBandDescriptor.cstor,
+ region, config.type, config.lowerLimit, config.upperLimit, spacing,
+ am.stereo));
+ }
+ default:
+ ALOGE("Unsupported band type: %d", config.type);
+ return nullptr;
+ }
+}
+
+JavaRef<jobject> BandConfigFromHal(JNIEnv *env, const V1_0::BandConfig &config, Region region) {
+ ALOGV("%s", __func__);
+
+ auto descriptor = BandDescriptorFromHal(env, config, region);
+ if (descriptor == nullptr) return nullptr;
+
+ switch (config.type) {
+ case Band::FM:
+ case Band::FM_HD: {
+ return make_javaref(env, env->NewObject(
+ gjni.FmBandConfig.clazz, gjni.FmBandConfig.cstor, descriptor.get()));
+ }
+ case Band::AM:
+ case Band::AM_HD: {
+ return make_javaref(env, env->NewObject(
+ gjni.AmBandConfig.clazz, gjni.AmBandConfig.cstor, descriptor.get()));
+ }
+ default:
+ ALOGE("Unsupported band type: %d", config.type);
+ return nullptr;
+ }
+}
+
+V1_0::BandConfig BandConfigToHal(JNIEnv *env, jobject jConfig, Region ®ion) {
+ ALOGV("%s", __func__);
+ auto jDescriptor = env->GetObjectField(jConfig, gjni.BandConfig.descriptor);
+ if (jDescriptor == nullptr) {
+ ALOGE("Descriptor is missing");
+ return {};
+ }
+
+ region = static_cast<Region>(env->GetIntField(jDescriptor, gjni.BandDescriptor.region));
+
+ V1_0::BandConfig config = {};
+ config.type = static_cast<Band>(env->GetIntField(jDescriptor, gjni.BandDescriptor.type));
+ config.antennaConnected = false; // just don't set it
+ config.lowerLimit = env->GetIntField(jDescriptor, gjni.BandDescriptor.lowerLimit);
+ config.upperLimit = env->GetIntField(jDescriptor, gjni.BandDescriptor.upperLimit);
+ config.spacings = hidl_vec<uint32_t>({
+ static_cast<uint32_t>(env->GetIntField(jDescriptor, gjni.BandDescriptor.spacing))
+ });
+
+ if (env->IsInstanceOf(jConfig, gjni.FmBandConfig.clazz)) {
+ auto& fm = config.ext.fm;
+ fm.deemphasis = DeemphasisForRegion(region);
+ fm.stereo = env->GetBooleanField(jConfig, gjni.FmBandConfig.stereo);
+ fm.rds = RdsForRegion(env->GetBooleanField(jConfig, gjni.FmBandConfig.rds), region);
+ fm.ta = env->GetBooleanField(jConfig, gjni.FmBandConfig.ta);
+ fm.af = env->GetBooleanField(jConfig, gjni.FmBandConfig.af);
+ fm.ea = env->GetBooleanField(jConfig, gjni.FmBandConfig.ea);
+ } else if (env->IsInstanceOf(jConfig, gjni.AmBandConfig.clazz)) {
+ auto& am = config.ext.am;
+ am.stereo = env->GetBooleanField(jConfig, gjni.AmBandConfig.stereo);
+ } else {
+ ALOGE("Unexpected band config type");
+ return {};
+ }
+
+ return config;
+}
+
+Direction DirectionToHal(bool directionDown) {
+ return directionDown ? Direction::DOWN : Direction::UP;
+}
+
+JavaRef<jobject> MetadataFromHal(JNIEnv *env, const hidl_vec<V1_0::MetaData> &metadata) {
+ ALOGV("%s", __func__);
+ if (metadata.size() == 0) return nullptr;
+
+ auto jMetadata = make_javaref(env, env->NewObject(
+ gjni.RadioMetadata.clazz, gjni.RadioMetadata.cstor));
+
+ for (auto& item : metadata) {
+ jint key = static_cast<jint>(item.key);
+ jint status = 0;
+ switch (item.type) {
+ case MetadataType::INT:
+ ALOGV("metadata INT %d", key);
+ status = env->CallIntMethod(jMetadata.get(), gjni.RadioMetadata.putIntFromNative,
+ key, item.intValue);
+ break;
+ case MetadataType::TEXT: {
+ ALOGV("metadata TEXT %d", key);
+ auto value = make_javastr(env, item.stringValue);
+ status = env->CallIntMethod(jMetadata.get(), gjni.RadioMetadata.putStringFromNative,
+ key, value.get());
+ break;
+ }
+ case MetadataType::RAW: {
+ ALOGV("metadata RAW %d", key);
+ auto len = item.rawValue.size();
+ if (len == 0) break;
+ auto value = make_javaref(env, env->NewByteArray(len));
+ if (value == nullptr) {
+ ALOGE("Failed to allocate byte array of len %zu", len);
+ break;
+ }
+ env->SetByteArrayRegion(value.get(), 0, len,
+ reinterpret_cast<const jbyte*>(item.rawValue.data()));
+ status = env->CallIntMethod(jMetadata.get(), gjni.RadioMetadata.putBitmapFromNative,
+ key, value.get());
+ break;
+ }
+ case MetadataType::CLOCK:
+ ALOGV("metadata CLOCK %d", key);
+ status = env->CallIntMethod(jMetadata.get(), gjni.RadioMetadata.putClockFromNative,
+ key, item.clockValue.utcSecondsSinceEpoch,
+ item.clockValue.timezoneOffsetInMinutes);
+ break;
+ default:
+ ALOGW("invalid metadata type %d", item.type);
+ }
+ ALOGE_IF(status != 0, "Failed inserting metadata %d (of type %d)", key, item.type);
+ }
+
+ return jMetadata;
+}
+
+static JavaRef<jobject> ProgramIdentifierFromHal(JNIEnv *env, const ProgramIdentifier &id) {
+ ALOGV("%s", __func__);
+ return make_javaref(env, env->NewObject(gjni.ProgramSelector.Identifier.clazz,
+ gjni.ProgramSelector.Identifier.cstor, id.type, id.value));
+}
+
+static JavaRef<jobject> ProgramSelectorFromHal(JNIEnv *env, const ProgramSelector &selector) {
+ ALOGV("%s", __func__);
+ auto jPrimary = ProgramIdentifierFromHal(env, selector.primaryId);
+ auto jSecondary = ArrayFromHal(env, selector.secondaryIds,
+ gjni.ProgramSelector.Identifier.clazz, ProgramIdentifierFromHal);
+ auto jVendor = ArrayFromHal(env, selector.vendorIds);
+
+ return make_javaref(env, env->NewObject(gjni.ProgramSelector.clazz, gjni.ProgramSelector.cstor,
+ selector.programType, jPrimary.get(), jSecondary.get(), jVendor.get()));
+}
+
+static ProgramIdentifier ProgramIdentifierToHal(JNIEnv *env, jobject jId) {
+ ALOGV("%s", __func__);
+
+ ProgramIdentifier id = {};
+ id.type = env->GetIntField(jId, gjni.ProgramSelector.Identifier.type);
+ id.value = env->GetLongField(jId, gjni.ProgramSelector.Identifier.value);
+ return id;
+}
+
+ProgramSelector ProgramSelectorToHal(JNIEnv *env, jobject jSelector) {
+ ALOGV("%s", __func__);
+
+ ProgramSelector selector = {};
+
+ selector.programType = env->GetIntField(jSelector, gjni.ProgramSelector.programType);
+
+ auto jPrimary = env->GetObjectField(jSelector, gjni.ProgramSelector.primaryId);
+ auto jSecondary = reinterpret_cast<jobjectArray>(
+ env->GetObjectField(jSelector, gjni.ProgramSelector.secondaryIds));
+ auto jVendor = reinterpret_cast<jlongArray>(
+ env->GetObjectField(jSelector, gjni.ProgramSelector.vendorIds));
+
+ if (jPrimary == nullptr || jSecondary == nullptr || jVendor == nullptr) {
+ ALOGE("ProgramSelector object is incomplete");
+ return {};
+ }
+
+ selector.primaryId = ProgramIdentifierToHal(env, jPrimary);
+ auto count = env->GetArrayLength(jSecondary);
+ selector.secondaryIds.resize(count);
+ for (jsize i = 0; i < count; i++) {
+ auto jId = env->GetObjectArrayElement(jSecondary, i);
+ selector.secondaryIds[i] = ProgramIdentifierToHal(env, jId);
+ }
+
+ count = env->GetArrayLength(jVendor);
+ selector.vendorIds.resize(count);
+ auto jVendorElements = env->GetLongArrayElements(jVendor, nullptr);
+ for (jint i = 0; i < count; i++) {
+ selector.vendorIds[i] = jVendorElements[i];
+ }
+ env->ReleaseLongArrayElements(jVendor, jVendorElements, 0);
+
+ return selector;
+}
+
+static JavaRef<jobject> ProgramInfoFromHal(JNIEnv *env, const V1_0::ProgramInfo &info10,
+ const V1_1::ProgramInfo *info11, const ProgramSelector &selector) {
+ ALOGV("%s", __func__);
+
+ auto jMetadata = MetadataFromHal(env, info10.metadata);
+ auto jVendorInfo = info11 ? make_javastr(env, info11->vendorInfo) : nullptr;
+ auto jSelector = ProgramSelectorFromHal(env, selector);
+
+ return make_javaref(env, env->NewObject(gjni.ProgramInfo.clazz, gjni.ProgramInfo.cstor,
+ jSelector.get(), info10.tuned, info10.stereo, info10.digital, info10.signalStrength,
+ jMetadata.get(), info11 ? info11->flags : 0, jVendorInfo.get()));
+}
+
+JavaRef<jobject> ProgramInfoFromHal(JNIEnv *env, const V1_0::ProgramInfo &info, V1_0::Band band) {
+ auto selector = V1_1::utils::make_selector(band, info.channel, info.subChannel);
+ return ProgramInfoFromHal(env, info, nullptr, selector);
+}
+
+JavaRef<jobject> ProgramInfoFromHal(JNIEnv *env, const V1_1::ProgramInfo &info) {
+ return ProgramInfoFromHal(env, info.base, &info, info.selector);
+}
+
+} // namespace convert
+} // namespace BroadcastRadio
+} // namespace server
+
+void register_android_server_broadcastradio_convert(JNIEnv *env) {
+ using namespace server::BroadcastRadio::convert;
+
+ auto bandConfigClass = FindClassOrDie(env, "android/hardware/radio/RadioManager$BandConfig");
+ gjni.BandConfig.descriptor = GetFieldIDOrDie(env, bandConfigClass,
+ "mDescriptor", "Landroid/hardware/radio/RadioManager$BandDescriptor;");
+
+ auto fmBandConfigClass = FindClassOrDie(env,
+ "android/hardware/radio/RadioManager$FmBandConfig");
+ gjni.FmBandConfig.clazz = MakeGlobalRefOrDie(env, fmBandConfigClass);
+ gjni.FmBandConfig.cstor = GetMethodIDOrDie(env, fmBandConfigClass,
+ "<init>", "(Landroid/hardware/radio/RadioManager$FmBandDescriptor;)V");
+ gjni.FmBandConfig.stereo = GetFieldIDOrDie(env, fmBandConfigClass, "mStereo", "Z");
+ gjni.FmBandConfig.rds = GetFieldIDOrDie(env, fmBandConfigClass, "mRds", "Z");
+ gjni.FmBandConfig.ta = GetFieldIDOrDie(env, fmBandConfigClass, "mTa", "Z");
+ gjni.FmBandConfig.af = GetFieldIDOrDie(env, fmBandConfigClass, "mAf", "Z");
+ gjni.FmBandConfig.ea = GetFieldIDOrDie(env, fmBandConfigClass, "mEa", "Z");
+
+ auto amBandConfigClass = FindClassOrDie(env,
+ "android/hardware/radio/RadioManager$AmBandConfig");
+ gjni.AmBandConfig.clazz = MakeGlobalRefOrDie(env, amBandConfigClass);
+ gjni.AmBandConfig.cstor = GetMethodIDOrDie(env, amBandConfigClass,
+ "<init>", "(Landroid/hardware/radio/RadioManager$AmBandDescriptor;)V");
+ gjni.AmBandConfig.stereo = GetFieldIDOrDie(env, amBandConfigClass, "mStereo", "Z");
+
+ auto bandDescriptorClass = FindClassOrDie(env,
+ "android/hardware/radio/RadioManager$BandDescriptor");
+ gjni.BandDescriptor.clazz = MakeGlobalRefOrDie(env, bandDescriptorClass);
+ gjni.BandDescriptor.region = GetFieldIDOrDie(env, bandDescriptorClass, "mRegion", "I");
+ gjni.BandDescriptor.type = GetFieldIDOrDie(env, bandDescriptorClass, "mType", "I");
+ gjni.BandDescriptor.lowerLimit = GetFieldIDOrDie(env, bandDescriptorClass, "mLowerLimit", "I");
+ gjni.BandDescriptor.upperLimit = GetFieldIDOrDie(env, bandDescriptorClass, "mUpperLimit", "I");
+ gjni.BandDescriptor.spacing = GetFieldIDOrDie(env, bandDescriptorClass, "mSpacing", "I");
+
+ auto fmBandDescriptorClass = FindClassOrDie(env,
+ "android/hardware/radio/RadioManager$FmBandDescriptor");
+ gjni.FmBandDescriptor.clazz = MakeGlobalRefOrDie(env, fmBandDescriptorClass);
+ gjni.FmBandDescriptor.cstor = GetMethodIDOrDie(env, fmBandDescriptorClass,
+ "<init>", "(IIIIIZZZZZ)V");
+
+ auto amBandDescriptorClass = FindClassOrDie(env,
+ "android/hardware/radio/RadioManager$AmBandDescriptor");
+ gjni.AmBandDescriptor.clazz = MakeGlobalRefOrDie(env, amBandDescriptorClass);
+ gjni.AmBandDescriptor.cstor = GetMethodIDOrDie(env, amBandDescriptorClass,
+ "<init>", "(IIIIIZ)V");
+
+ auto modulePropertiesClass = FindClassOrDie(env,
+ "android/hardware/radio/RadioManager$ModuleProperties");
+ gjni.ModuleProperties.clazz = MakeGlobalRefOrDie(env, modulePropertiesClass);
+ gjni.ModuleProperties.cstor = GetMethodIDOrDie(env, modulePropertiesClass, "<init>",
+ "(ILjava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;"
+ "Ljava/lang/String;IIZ[Landroid/hardware/radio/RadioManager$BandDescriptor;Z"
+ "[I[ILjava/lang/String;)V");
+
+ auto programInfoClass = FindClassOrDie(env, "android/hardware/radio/RadioManager$ProgramInfo");
+ gjni.ProgramInfo.clazz = MakeGlobalRefOrDie(env, programInfoClass);
+ gjni.ProgramInfo.cstor = GetMethodIDOrDie(env, programInfoClass, "<init>",
+ "(Landroid/hardware/radio/ProgramSelector;ZZZILandroid/hardware/radio/RadioMetadata;I"
+ "Ljava/lang/String;)V");
+
+ auto programSelectorClass = FindClassOrDie(env, "android/hardware/radio/ProgramSelector");
+ gjni.ProgramSelector.clazz = MakeGlobalRefOrDie(env, programSelectorClass);
+ gjni.ProgramSelector.cstor = GetMethodIDOrDie(env, programSelectorClass, "<init>",
+ "(ILandroid/hardware/radio/ProgramSelector$Identifier;"
+ "[Landroid/hardware/radio/ProgramSelector$Identifier;[J)V");
+ gjni.ProgramSelector.programType = GetFieldIDOrDie(env, programSelectorClass,
+ "mProgramType", "I");
+ gjni.ProgramSelector.primaryId = GetFieldIDOrDie(env, programSelectorClass,
+ "mPrimaryId", "Landroid/hardware/radio/ProgramSelector$Identifier;");
+ gjni.ProgramSelector.secondaryIds = GetFieldIDOrDie(env, programSelectorClass,
+ "mSecondaryIds", "[Landroid/hardware/radio/ProgramSelector$Identifier;");
+ gjni.ProgramSelector.vendorIds = GetFieldIDOrDie(env, programSelectorClass,
+ "mVendorIds", "[J");
+
+ auto progSelIdClass = FindClassOrDie(env, "android/hardware/radio/ProgramSelector$Identifier");
+ gjni.ProgramSelector.Identifier.clazz = MakeGlobalRefOrDie(env, progSelIdClass);
+ gjni.ProgramSelector.Identifier.cstor = GetMethodIDOrDie(env, progSelIdClass,
+ "<init>", "(IJ)V");
+ gjni.ProgramSelector.Identifier.type = GetFieldIDOrDie(env, progSelIdClass,
+ "mType", "I");
+ gjni.ProgramSelector.Identifier.value = GetFieldIDOrDie(env, progSelIdClass,
+ "mValue", "J");
+
+ auto radioMetadataClass = FindClassOrDie(env, "android/hardware/radio/RadioMetadata");
+ gjni.RadioMetadata.clazz = MakeGlobalRefOrDie(env, radioMetadataClass);
+ gjni.RadioMetadata.cstor = GetMethodIDOrDie(env, radioMetadataClass, "<init>", "()V");
+ gjni.RadioMetadata.putIntFromNative = GetMethodIDOrDie(env, radioMetadataClass,
+ "putIntFromNative", "(II)I");
+ gjni.RadioMetadata.putStringFromNative = GetMethodIDOrDie(env, radioMetadataClass,
+ "putStringFromNative", "(ILjava/lang/String;)I");
+ gjni.RadioMetadata.putBitmapFromNative = GetMethodIDOrDie(env, radioMetadataClass,
+ "putBitmapFromNative", "(I[B)I");
+ gjni.RadioMetadata.putClockFromNative = GetMethodIDOrDie(env, radioMetadataClass,
+ "putClockFromNative", "(IJI)I");
+
+ auto runtimeExcClass = FindClassOrDie(env, "java/lang/RuntimeException");
+ gjni.RuntimeException.clazz = MakeGlobalRefOrDie(env, runtimeExcClass);
+ gjni.RuntimeException.cstor = GetMethodIDOrDie(env, runtimeExcClass, "<init>",
+ "(Ljava/lang/String;)V");
+
+ auto parcelableExcClass = FindClassOrDie(env, "android/os/ParcelableException");
+ gjni.ParcelableException.clazz = MakeGlobalRefOrDie(env, parcelableExcClass);
+ gjni.ParcelableException.cstor = GetMethodIDOrDie(env, parcelableExcClass, "<init>",
+ "(Ljava/lang/Throwable;)V");
+}
+
+} // namespace android
diff --git a/services/core/jni/BroadcastRadio/convert.h b/services/core/jni/BroadcastRadio/convert.h
new file mode 100644
index 0000000..198e594
--- /dev/null
+++ b/services/core/jni/BroadcastRadio/convert.h
@@ -0,0 +1,80 @@
+/**
+ * Copyright (C) 2017 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.
+ */
+
+#ifndef _ANDROID_SERVER_BROADCASTRADIO_CONVERT_H
+#define _ANDROID_SERVER_BROADCASTRADIO_CONVERT_H
+
+#include "types.h"
+
+#include "JavaRef.h"
+
+#include <android/hardware/broadcastradio/1.1/types.h>
+#include <jni.h>
+
+namespace android {
+
+void register_android_server_broadcastradio_convert(JNIEnv *env);
+
+namespace server {
+namespace BroadcastRadio {
+namespace convert {
+
+namespace V1_0 = hardware::broadcastradio::V1_0;
+namespace V1_1 = hardware::broadcastradio::V1_1;
+
+JavaRef<jobject> ModulePropertiesFromHal(JNIEnv *env, const V1_0::Properties &properties,
+ jint moduleId, const std::string& serviceName);
+JavaRef<jobject> ModulePropertiesFromHal(JNIEnv *env, const V1_1::Properties &properties,
+ jint moduleId, const std::string& serviceName);
+
+JavaRef<jobject> BandConfigFromHal(JNIEnv *env, const V1_0::BandConfig &config, Region region);
+V1_0::BandConfig BandConfigToHal(JNIEnv *env, jobject jConfig, Region ®ion);
+
+V1_0::Direction DirectionToHal(bool directionDown);
+
+JavaRef<jobject> MetadataFromHal(JNIEnv *env, const hardware::hidl_vec<V1_0::MetaData> &metadata);
+JavaRef<jobject> ProgramInfoFromHal(JNIEnv *env, const V1_0::ProgramInfo &info, V1_0::Band band);
+JavaRef<jobject> ProgramInfoFromHal(JNIEnv *env, const V1_1::ProgramInfo &info);
+
+V1_1::ProgramSelector ProgramSelectorToHal(JNIEnv *env, jobject jSelector);
+
+void ThrowParcelableRuntimeException(JNIEnv *env, const std::string& msg);
+
+// These three are only for internal use by template functions below.
+bool __ThrowIfFailedHidl(JNIEnv *env,
+ const hardware::details::return_status &hidlResult);
+bool __ThrowIfFailed(JNIEnv *env, const V1_0::Result halResult);
+bool __ThrowIfFailed(JNIEnv *env, const V1_1::ProgramListResult halResult);
+
+template <typename T>
+bool ThrowIfFailed(JNIEnv *env, const hardware::Return<void> &hidlResult, const T halResult) {
+ return __ThrowIfFailedHidl(env, hidlResult) || __ThrowIfFailed(env, halResult);
+}
+
+template <typename T>
+bool ThrowIfFailed(JNIEnv *env, const hardware::Return<T> &hidlResult) {
+ return __ThrowIfFailedHidl(env, hidlResult) || __ThrowIfFailed(env, static_cast<T>(hidlResult));
+}
+
+template <>
+bool ThrowIfFailed(JNIEnv *env, const hardware::Return<void> &hidlResult);
+
+} // namespace convert
+} // namespace BroadcastRadio
+} // namespace server
+} // namespace android
+
+#endif // _ANDROID_SERVER_BROADCASTRADIO_CONVERT_H
diff --git a/services/core/jni/BroadcastRadio/types.h b/services/core/jni/BroadcastRadio/types.h
new file mode 100644
index 0000000..f726af3
--- /dev/null
+++ b/services/core/jni/BroadcastRadio/types.h
@@ -0,0 +1,60 @@
+/**
+ * Copyright (C) 2017 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.
+ */
+
+#ifndef _ANDROID_SERVER_BROADCASTRADIO_TYPES_H
+#define _ANDROID_SERVER_BROADCASTRADIO_TYPES_H
+
+#include <jni.h>
+
+namespace android {
+namespace server {
+namespace BroadcastRadio {
+
+/* Most of these enums are dereived from Java code, based at
+ * frameworks/base/core/java/android/hardware/radio/RadioManager.java.
+ */
+
+enum class HalRevision : jint {
+ V1_0,
+ V1_1,
+};
+
+// Keep in sync with STATUS_* constants from RadioManager.java.
+enum class Status : jint {
+ OK = 0,
+ ERROR = -0x80000000ll, // Integer.MIN_VALUE
+ PERMISSION_DENIED = -1, // -EPERM
+ NO_INIT = -19, // -ENODEV
+ BAD_VALUE = -22, // -EINVAL
+ DEAD_OBJECT = -32, // -EPIPE
+ INVALID_OPERATION = -38, // -ENOSYS
+ TIMED_OUT = -110, // -ETIMEDOUT
+};
+
+// Keep in sync with REGION_* constants from RadioManager.java.
+enum class Region : jint {
+ ITU_1 = 0,
+ ITU_2 = 1,
+ OIRT = 2,
+ JAPAN = 3,
+ KOREA = 4,
+};
+
+} // namespace BroadcastRadio
+} // namespace server
+} // namespace android
+
+#endif // _ANDROID_SERVER_RADIO_TYPES_H
diff --git a/services/core/jni/JavaRef.cpp b/services/core/jni/JavaRef.cpp
deleted file mode 100644
index ad07afa..0000000
--- a/services/core/jni/JavaRef.cpp
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * Copyright (C) 2017 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.
- */
-
-#define LOG_TAG "JavaRef"
-//#define LOG_NDEBUG 0
-
-#include "JavaRef.h"
-
-#include <utils/Log.h>
-
-namespace android {
-
-EnvWrapper::EnvWrapper(JNIEnv *env) : mEnv(env) {
- ALOGE_IF(env == nullptr, "Environment is a nullptr");
-}
-
-} // namespace android
diff --git a/services/core/jni/JavaRef.h b/services/core/jni/JavaRef.h
deleted file mode 100644
index 8a572e2..0000000
--- a/services/core/jni/JavaRef.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * Copyright (C) 2017 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.
- */
-
-#ifndef _ANDROID_JAVA_REF_H
-#define _ANDROID_JAVA_REF_H
-
-#include <android-base/macros.h>
-#include <functional>
-#include <jni.h>
-#include <memory>
-#include <type_traits>
-
-namespace android {
-
-template <typename T>
-using JavaRef = std::unique_ptr<typename std::remove_pointer<T>::type, std::function<void(T)>>;
-
-template <typename T>
-JavaRef<T> make_javaref(JNIEnv *env, T ref) {
- return JavaRef<T>(ref, [env](T ref) {
- if (env && ref) {
- env->DeleteLocalRef(ref);
- }
- });
-}
-
-class EnvWrapper {
-public:
- EnvWrapper(JNIEnv *env);
-
- template <typename T>
- JavaRef<T> operator() (T ref) const {
- return make_javaref(mEnv, ref);
- }
-
-private:
- JNIEnv *mEnv;
-
- DISALLOW_COPY_AND_ASSIGN(EnvWrapper);
-};
-
-} // namespace android
-
-#endif // _ANDROID_JAVA_REF_H
diff --git a/services/core/jni/NativeCallbackThread.cpp b/services/core/jni/NativeCallbackThread.cpp
deleted file mode 100644
index 7d668e3..0000000
--- a/services/core/jni/NativeCallbackThread.cpp
+++ /dev/null
@@ -1,116 +0,0 @@
-/**
- * Copyright (C) 2017 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.
- */
-
-#define LOG_TAG "NativeCallbackThread"
-//#define LOG_NDEBUG 0
-
-#include "NativeCallbackThread.h"
-
-#include <utils/Log.h>
-
-namespace android {
-
-NativeCallbackThread::NativeCallbackThread(JavaVM *vm) : mExitting(false), mvm(vm) {
- auto res = pthread_create(&mThread, nullptr, main, this);
- if (res != 0) {
- ALOGE("Couldn't start NativeCallbackThread");
- mThread = 0;
- return;
- }
- ALOGD("Started native callback thread %p", this);
-}
-
-NativeCallbackThread::~NativeCallbackThread() {
- ALOGV("~NativeCallbackThread %p", this);
- stop();
-}
-
-void* NativeCallbackThread::main(void *args) {
- auto self = reinterpret_cast<NativeCallbackThread*>(args);
- self->main();
- return nullptr;
-}
-
-void NativeCallbackThread::main() {
- ALOGV("NativeCallbackThread::main()");
-
- JNIEnv *env = nullptr;
- JavaVMAttachArgs aargs = {JNI_VERSION_1_4, "NativeCallbackThread", nullptr};
- if (mvm->AttachCurrentThread(&env, &aargs) != JNI_OK || env == nullptr) {
- ALOGE("Couldn't attach thread");
- return;
- }
-
- while (!mExitting) {
- ALOGV("Waiting for task...");
- Task task;
- {
- AutoMutex _l(mQueueMutex);
- auto res = mQueueCond.wait(mQueueMutex);
- ALOGE_IF(res != 0, "Wait failed: %d", res);
- if (mExitting || res != 0) break;
-
- if (mQueue.empty()) continue;
- task = mQueue.front();
- mQueue.pop();
- }
-
- ALOGV("Executing task...");
- task(env);
- if (env->ExceptionCheck()) {
- ALOGE("Unexpected exception:");
- env->ExceptionDescribe();
- env->ExceptionClear();
- }
- }
-
- auto res = mvm->DetachCurrentThread();
- ALOGE_IF(res != JNI_OK, "Couldn't detach thread");
-
- ALOGV("Native callback thread %p finished", this);
-}
-
-void NativeCallbackThread::enqueue(const Task &task) {
- AutoMutex _l(mQueueMutex);
-
- if (mThread == 0 || mExitting) {
- ALOGW("Callback thread %p is not serving calls", this);
- return;
- }
-
- mQueue.push(task);
- mQueueCond.signal();
-}
-
-void NativeCallbackThread::stop() {
- ALOGV("stop() %p", this);
-
- {
- AutoMutex _l(mQueueMutex);
-
- if (mThread == 0 || mExitting) return;
-
- mExitting = true;
- mQueueCond.signal();
- }
-
- auto ret = pthread_join(mThread, nullptr);
- ALOGE_IF(ret != 0, "Couldn't join thread: %d", ret);
-
- ALOGD("Stopped native callback thread %p", this);
-}
-
-} // namespace android
diff --git a/services/core/jni/NativeCallbackThread.h b/services/core/jni/NativeCallbackThread.h
deleted file mode 100644
index 4e03b11..0000000
--- a/services/core/jni/NativeCallbackThread.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/**
- * Copyright (C) 2017 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.
- */
-
-#ifndef _ANDROID_NATIVE_CALLBACK_THREAD_H
-#define _ANDROID_NATIVE_CALLBACK_THREAD_H
-
-#include <android-base/macros.h>
-#include <functional>
-#include <jni.h>
-#include <pthread.h>
-#include <queue>
-#include <utils/Condition.h>
-#include <utils/Mutex.h>
-
-namespace android {
-
-class NativeCallbackThread {
- typedef std::function<void(JNIEnv*)> Task;
-
- pthread_t mThread;
- Mutex mQueueMutex;
- Condition mQueueCond;
- std::atomic<bool> mExitting;
-
- JavaVM *mvm;
- std::queue<Task> mQueue;
-
- static void* main(void *args);
- void main();
-
- DISALLOW_COPY_AND_ASSIGN(NativeCallbackThread);
-
-public:
- NativeCallbackThread(JavaVM *vm);
- virtual ~NativeCallbackThread();
-
- void enqueue(const Task &task);
- void stop();
-};
-
-} // namespace android
-
-#endif // _ANDROID_NATIVE_CALLBACK_THREAD_H
diff --git a/services/core/jni/com_android_server_AlarmManagerService.cpp b/services/core/jni/com_android_server_AlarmManagerService.cpp
index 3a0273d..bcb0b4f 100644
--- a/services/core/jni/com_android_server_AlarmManagerService.cpp
+++ b/services/core/jni/com_android_server_AlarmManagerService.cpp
@@ -17,7 +17,7 @@
#define LOG_TAG "AlarmManagerService"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "jni.h"
#include <utils/Log.h>
#include <utils/misc.h>
diff --git a/services/core/jni/com_android_server_HardwarePropertiesManagerService.cpp b/services/core/jni/com_android_server_HardwarePropertiesManagerService.cpp
index ba3be67..5f67ac1 100644
--- a/services/core/jni/com_android_server_HardwarePropertiesManagerService.cpp
+++ b/services/core/jni/com_android_server_HardwarePropertiesManagerService.cpp
@@ -16,7 +16,7 @@
#define LOG_TAG "HardwarePropertiesManagerService-JNI"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "jni.h"
#include <math.h>
diff --git a/services/core/jni/com_android_server_PersistentDataBlockService.cpp b/services/core/jni/com_android_server_PersistentDataBlockService.cpp
index f94e5d9..97e69fb 100644
--- a/services/core/jni/com_android_server_PersistentDataBlockService.cpp
+++ b/services/core/jni/com_android_server_PersistentDataBlockService.cpp
@@ -15,9 +15,9 @@
*/
#include <android_runtime/AndroidRuntime.h>
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include <jni.h>
-#include <ScopedUtfChars.h>
+#include <nativehelper/ScopedUtfChars.h>
#include <utils/misc.h>
#include <sys/ioctl.h>
diff --git a/services/core/jni/com_android_server_SerialService.cpp b/services/core/jni/com_android_server_SerialService.cpp
index 1bd7a59..aef0b25 100644
--- a/services/core/jni/com_android_server_SerialService.cpp
+++ b/services/core/jni/com_android_server_SerialService.cpp
@@ -18,7 +18,7 @@
#include "utils/Log.h"
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "android_runtime/AndroidRuntime.h"
#include <sys/types.h>
diff --git a/services/core/jni/com_android_server_SystemServer.cpp b/services/core/jni/com_android_server_SystemServer.cpp
index 470cc57..3901ceb 100644
--- a/services/core/jni/com_android_server_SystemServer.cpp
+++ b/services/core/jni/com_android_server_SystemServer.cpp
@@ -15,7 +15,7 @@
*/
#include <jni.h>
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include <hidl/HidlTransportSupport.h>
diff --git a/services/core/jni/com_android_server_UsbDeviceManager.cpp b/services/core/jni/com_android_server_UsbDeviceManager.cpp
index 3733a55..f37f870 100644
--- a/services/core/jni/com_android_server_UsbDeviceManager.cpp
+++ b/services/core/jni/com_android_server_UsbDeviceManager.cpp
@@ -18,7 +18,7 @@
#include "utils/Log.h"
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "android_runtime/AndroidRuntime.h"
#include "android_runtime/Log.h"
diff --git a/services/core/jni/com_android_server_UsbHostManager.cpp b/services/core/jni/com_android_server_UsbHostManager.cpp
index a2b79ff..88ae824 100644
--- a/services/core/jni/com_android_server_UsbHostManager.cpp
+++ b/services/core/jni/com_android_server_UsbHostManager.cpp
@@ -18,7 +18,7 @@
#include "utils/Log.h"
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "android_runtime/AndroidRuntime.h"
#include "android_runtime/Log.h"
diff --git a/services/core/jni/com_android_server_UsbMidiDevice.cpp b/services/core/jni/com_android_server_UsbMidiDevice.cpp
index e12a016..79d935f 100644
--- a/services/core/jni/com_android_server_UsbMidiDevice.cpp
+++ b/services/core/jni/com_android_server_UsbMidiDevice.cpp
@@ -19,7 +19,7 @@
#include "utils/Log.h"
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "android_runtime/AndroidRuntime.h"
#include "android_runtime/Log.h"
diff --git a/services/core/jni/com_android_server_VibratorService.cpp b/services/core/jni/com_android_server_VibratorService.cpp
index 45e9cc7..0370490 100644
--- a/services/core/jni/com_android_server_VibratorService.cpp
+++ b/services/core/jni/com_android_server_VibratorService.cpp
@@ -21,7 +21,7 @@
#include <android/hardware/vibrator/1.1/IVibrator.h>
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "android_runtime/AndroidRuntime.h"
#include <utils/misc.h>
diff --git a/services/core/jni/com_android_server_am_BatteryStatsService.cpp b/services/core/jni/com_android_server_am_BatteryStatsService.cpp
index 413f430..2dc388a 100644
--- a/services/core/jni/com_android_server_am_BatteryStatsService.cpp
+++ b/services/core/jni/com_android_server_am_BatteryStatsService.cpp
@@ -33,8 +33,8 @@
#include <android_runtime/AndroidRuntime.h>
#include <jni.h>
-#include <ScopedLocalRef.h>
-#include <ScopedPrimitiveArray.h>
+#include <nativehelper/ScopedLocalRef.h>
+#include <nativehelper/ScopedPrimitiveArray.h>
#include <log/log.h>
#include <utils/misc.h>
diff --git a/services/core/jni/com_android_server_connectivity_Vpn.cpp b/services/core/jni/com_android_server_connectivity_Vpn.cpp
index 4d85d9a..b6bea11 100644
--- a/services/core/jni/com_android_server_connectivity_Vpn.cpp
+++ b/services/core/jni/com_android_server_connectivity_Vpn.cpp
@@ -38,7 +38,7 @@
#include "netutils/ifc.h"
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
namespace android
{
diff --git a/services/core/jni/com_android_server_connectivity_tethering_OffloadHardwareInterface.cpp b/services/core/jni/com_android_server_connectivity_tethering_OffloadHardwareInterface.cpp
index 4e5c27f..87312f8 100644
--- a/services/core/jni/com_android_server_connectivity_tethering_OffloadHardwareInterface.cpp
+++ b/services/core/jni/com_android_server_connectivity_tethering_OffloadHardwareInterface.cpp
@@ -18,7 +18,7 @@
#include <error.h>
#include <hidl/HidlSupport.h>
#include <jni.h>
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include <linux/netfilter/nfnetlink.h>
#include <linux/netlink.h>
#include <sys/socket.h>
diff --git a/services/core/jni/com_android_server_fingerprint_FingerprintService.cpp b/services/core/jni/com_android_server_fingerprint_FingerprintService.cpp
index 39474ec..503f0cf 100644
--- a/services/core/jni/com_android_server_fingerprint_FingerprintService.cpp
+++ b/services/core/jni/com_android_server_fingerprint_FingerprintService.cpp
@@ -16,7 +16,7 @@
#define LOG_TAG "Fingerprint-JNI"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include <inttypes.h>
#include <android_runtime/AndroidRuntime.h>
diff --git a/services/core/jni/com_android_server_hdmi_HdmiCecController.cpp b/services/core/jni/com_android_server_hdmi_HdmiCecController.cpp
index 4df7256..c22109c 100644
--- a/services/core/jni/com_android_server_hdmi_HdmiCecController.cpp
+++ b/services/core/jni/com_android_server_hdmi_HdmiCecController.cpp
@@ -18,8 +18,8 @@
#define LOG_NDEBUG 1
-#include <JNIHelp.h>
-#include <ScopedPrimitiveArray.h>
+#include <nativehelper/JNIHelp.h>
+#include <nativehelper/ScopedPrimitiveArray.h>
#include <android/hardware/tv/cec/1.0/IHdmiCec.h>
#include <android/hardware/tv/cec/1.0/IHdmiCecCallback.h>
diff --git a/services/core/jni/com_android_server_input_InputApplicationHandle.cpp b/services/core/jni/com_android_server_input_InputApplicationHandle.cpp
index e927b60..232b2c2 100644
--- a/services/core/jni/com_android_server_input_InputApplicationHandle.cpp
+++ b/services/core/jni/com_android_server_input_InputApplicationHandle.cpp
@@ -16,7 +16,7 @@
#define LOG_TAG "InputApplicationHandle"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "jni.h"
#include <android_runtime/AndroidRuntime.h>
#include <utils/threads.h>
diff --git a/services/core/jni/com_android_server_input_InputApplicationHandle.h b/services/core/jni/com_android_server_input_InputApplicationHandle.h
index e6f25cc..c9af711 100644
--- a/services/core/jni/com_android_server_input_InputApplicationHandle.h
+++ b/services/core/jni/com_android_server_input_InputApplicationHandle.h
@@ -19,7 +19,7 @@
#include <inputflinger/InputApplication.h>
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "jni.h"
namespace android {
diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp
index 41f86c9..21300ed 100644
--- a/services/core/jni/com_android_server_input_InputManagerService.cpp
+++ b/services/core/jni/com_android_server_input_InputManagerService.cpp
@@ -16,6 +16,8 @@
#define LOG_TAG "InputManager-JNI"
+#define ATRACE_TAG ATRACE_TAG_INPUT
+
//#define LOG_NDEBUG 0
// Log debug messages about InputReaderPolicy
@@ -25,7 +27,7 @@
#define DEBUG_INPUT_DISPATCHER_POLICY 0
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "jni.h"
#include <atomic>
#include <cinttypes>
@@ -36,6 +38,7 @@
#include <utils/Log.h>
#include <utils/Looper.h>
#include <utils/threads.h>
+#include <utils/Trace.h>
#include <utils/SortedVector.h>
#include <input/PointerController.h>
@@ -51,9 +54,9 @@
#include <android_view_PointerIcon.h>
#include <android/graphics/GraphicsJNI.h>
-#include <ScopedLocalRef.h>
-#include <ScopedPrimitiveArray.h>
-#include <ScopedUtfChars.h>
+#include <nativehelper/ScopedLocalRef.h>
+#include <nativehelper/ScopedPrimitiveArray.h>
+#include <nativehelper/ScopedUtfChars.h>
#include "com_android_server_power_PowerManagerService.h"
#include "com_android_server_input_InputApplicationHandle.h"
@@ -445,16 +448,19 @@
status_t NativeInputManager::registerInputChannel(JNIEnv* /* env */,
const sp<InputChannel>& inputChannel,
const sp<InputWindowHandle>& inputWindowHandle, bool monitor) {
+ ATRACE_CALL();
return mInputManager->getDispatcher()->registerInputChannel(
inputChannel, inputWindowHandle, monitor);
}
status_t NativeInputManager::unregisterInputChannel(JNIEnv* /* env */,
const sp<InputChannel>& inputChannel) {
+ ATRACE_CALL();
return mInputManager->getDispatcher()->unregisterInputChannel(inputChannel);
}
void NativeInputManager::getReaderConfiguration(InputReaderConfiguration* outConfig) {
+ ATRACE_CALL();
JNIEnv* env = jniEnv();
jint virtualKeyQuietTime = env->CallIntMethod(mServiceObj,
@@ -528,6 +534,7 @@
}
sp<PointerControllerInterface> NativeInputManager::obtainPointerController(int32_t /* deviceId */) {
+ ATRACE_CALL();
AutoMutex _l(mLock);
sp<PointerController> controller = mLocked.pointerController.promote();
@@ -560,6 +567,7 @@
}
void NativeInputManager::notifyInputDevicesChanged(const Vector<InputDeviceInfo>& inputDevices) {
+ ATRACE_CALL();
JNIEnv* env = jniEnv();
size_t count = inputDevices.size();
@@ -591,6 +599,7 @@
sp<KeyCharacterMap> NativeInputManager::getKeyboardLayoutOverlay(
const InputDeviceIdentifier& identifier) {
+ ATRACE_CALL();
JNIEnv* env = jniEnv();
sp<KeyCharacterMap> result;
@@ -616,6 +625,7 @@
}
String8 NativeInputManager::getDeviceAlias(const InputDeviceIdentifier& identifier) {
+ ATRACE_CALL();
JNIEnv* env = jniEnv();
ScopedLocalRef<jstring> uniqueIdObj(env, env->NewStringUTF(identifier.uniqueId.string()));
@@ -636,6 +646,7 @@
ALOGD("notifySwitch - when=%lld, switchValues=0x%08x, switchMask=0x%08x, policyFlags=0x%x",
when, switchValues, switchMask, policyFlags);
#endif
+ ATRACE_CALL();
JNIEnv* env = jniEnv();
@@ -648,6 +659,7 @@
#if DEBUG_INPUT_DISPATCHER_POLICY
ALOGD("notifyConfigurationChanged - when=%lld", when);
#endif
+ ATRACE_CALL();
JNIEnv* env = jniEnv();
@@ -660,6 +672,7 @@
#if DEBUG_INPUT_DISPATCHER_POLICY
ALOGD("notifyANR");
#endif
+ ATRACE_CALL();
JNIEnv* env = jniEnv();
@@ -688,6 +701,7 @@
#if DEBUG_INPUT_DISPATCHER_POLICY
ALOGD("notifyInputChannelBroken");
#endif
+ ATRACE_CALL();
JNIEnv* env = jniEnv();
@@ -703,6 +717,7 @@
}
void NativeInputManager::getDispatcherConfiguration(InputDispatcherConfiguration* outConfig) {
+ ATRACE_CALL();
JNIEnv* env = jniEnv();
jint keyRepeatTimeout = env->CallIntMethod(mServiceObj,
@@ -898,6 +913,7 @@
TouchAffineTransformation NativeInputManager::getTouchAffineTransformation(
JNIEnv *env, jfloatArray matrixArr) {
+ ATRACE_CALL();
ScopedFloatArrayRO matrix(env, matrixArr);
assert(matrix.size() == 6);
@@ -934,6 +950,7 @@
}
bool NativeInputManager::filterInputEvent(const InputEvent* inputEvent, uint32_t policyFlags) {
+ ATRACE_CALL();
jobject inputEventObj;
JNIEnv* env = jniEnv();
@@ -967,6 +984,7 @@
void NativeInputManager::interceptKeyBeforeQueueing(const KeyEvent* keyEvent,
uint32_t& policyFlags) {
+ ATRACE_CALL();
// Policy:
// - Ignore untrusted events and pass them along.
// - Ask the window manager what to do with normal events and trusted injected events.
@@ -1003,6 +1021,7 @@
}
void NativeInputManager::interceptMotionBeforeQueueing(nsecs_t when, uint32_t& policyFlags) {
+ ATRACE_CALL();
// Policy:
// - Ignore untrusted events and pass them along.
// - No special filtering for injected events required at this time.
@@ -1048,6 +1067,7 @@
nsecs_t NativeInputManager::interceptKeyBeforeDispatching(
const sp<InputWindowHandle>& inputWindowHandle,
const KeyEvent* keyEvent, uint32_t policyFlags) {
+ ATRACE_CALL();
// Policy:
// - Ignore untrusted events and pass them along.
// - Filter normal events and trusted injected events through the window manager policy to
@@ -1083,6 +1103,7 @@
bool NativeInputManager::dispatchUnhandledKey(const sp<InputWindowHandle>& inputWindowHandle,
const KeyEvent* keyEvent, uint32_t policyFlags, KeyEvent* outFallbackKeyEvent) {
+ ATRACE_CALL();
// Policy:
// - Ignore untrusted events and do not perform default handling.
bool result = false;
@@ -1120,12 +1141,14 @@
}
void NativeInputManager::pokeUserActivity(nsecs_t eventTime, int32_t eventType) {
+ ATRACE_CALL();
android_server_PowerManagerService_userActivity(eventTime, eventType);
}
bool NativeInputManager::checkInjectEventsPermissionNonReentrant(
int32_t injectorPid, int32_t injectorUid) {
+ ATRACE_CALL();
JNIEnv* env = jniEnv();
jboolean result = env->CallBooleanMethod(mServiceObj,
gServiceClassInfo.checkInjectEventsPermission, injectorPid, injectorUid);
@@ -1136,6 +1159,7 @@
}
void NativeInputManager::loadPointerIcon(SpriteIcon* icon) {
+ ATRACE_CALL();
JNIEnv* env = jniEnv();
ScopedLocalRef<jobject> pointerIconObj(env, env->CallObjectMethod(
@@ -1155,6 +1179,7 @@
}
void NativeInputManager::loadPointerResources(PointerResources* outResources) {
+ ATRACE_CALL();
JNIEnv* env = jniEnv();
loadSystemIconAsSprite(env, mContextObj, POINTER_ICON_STYLE_SPOT_HOVER,
@@ -1167,6 +1192,7 @@
void NativeInputManager::loadAdditionalMouseResources(std::map<int32_t, SpriteIcon>* outResources,
std::map<int32_t, PointerAnimation>* outAnimationResources) {
+ ATRACE_CALL();
JNIEnv* env = jniEnv();
for (int iconId = POINTER_ICON_STYLE_CONTEXT_MENU; iconId <= POINTER_ICON_STYLE_GRABBING;
diff --git a/services/core/jni/com_android_server_input_InputWindowHandle.cpp b/services/core/jni/com_android_server_input_InputWindowHandle.cpp
index 197d056..2b2a6fa 100644
--- a/services/core/jni/com_android_server_input_InputWindowHandle.cpp
+++ b/services/core/jni/com_android_server_input_InputWindowHandle.cpp
@@ -16,7 +16,7 @@
#define LOG_TAG "InputWindowHandle"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "jni.h"
#include <android_runtime/AndroidRuntime.h>
#include <utils/threads.h>
diff --git a/services/core/jni/com_android_server_input_InputWindowHandle.h b/services/core/jni/com_android_server_input_InputWindowHandle.h
index 8d9e7d7..44d4620 100644
--- a/services/core/jni/com_android_server_input_InputWindowHandle.h
+++ b/services/core/jni/com_android_server_input_InputWindowHandle.h
@@ -19,7 +19,7 @@
#include <inputflinger/InputWindow.h>
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "jni.h"
namespace android {
diff --git a/services/core/jni/com_android_server_lights_LightsService.cpp b/services/core/jni/com_android_server_lights_LightsService.cpp
index 514e996..c90113f 100644
--- a/services/core/jni/com_android_server_lights_LightsService.cpp
+++ b/services/core/jni/com_android_server_lights_LightsService.cpp
@@ -17,11 +17,12 @@
#define LOG_TAG "LightsService"
#include "jni.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "android_runtime/AndroidRuntime.h"
#include <android/hardware/light/2.0/ILight.h>
#include <android/hardware/light/2.0/types.h>
+#include <android-base/chrono_utils.h>
#include <utils/misc.h>
#include <utils/Log.h>
#include <map>
@@ -178,9 +179,10 @@
colorARGB, flashMode, onMS, offMS, brightnessMode);
{
- ALOGD_IF_SLOW(50, "Excessive delay setting light");
+ android::base::Timer t;
Return<Status> ret = hal->setLight(type, state);
processReturn(ret, type, state);
+ if (t.duration() > 50ms) ALOGD("Excessive delay setting light");
}
}
diff --git a/services/core/jni/com_android_server_power_PowerManagerService.cpp b/services/core/jni/com_android_server_power_PowerManagerService.cpp
index 3ce9916..2db7dbe 100644
--- a/services/core/jni/com_android_server_power_PowerManagerService.cpp
+++ b/services/core/jni/com_android_server_power_PowerManagerService.cpp
@@ -26,6 +26,7 @@
#include <limits.h>
+#include <android-base/chrono_utils.h>
#include <android_runtime/AndroidRuntime.h>
#include <android_runtime/Log.h>
#include <utils/Timers.h>
@@ -166,22 +167,29 @@
static void nativeSetInteractive(JNIEnv* /* env */, jclass /* clazz */, jboolean enable) {
std::lock_guard<std::mutex> lock(gPowerHalMutex);
if (getPowerHal()) {
- String8 err = String8::format(
- "Excessive delay in setInteractive(%s) while turning screen %s",
- enable ? "true" : "false", enable ? "on" : "off");
- ALOGD_IF_SLOW(20, err);
+ android::base::Timer t;
Return<void> ret = gPowerHalV1_0->setInteractive(enable);
processReturn(ret, "setInteractive");
+ if (t.duration() > 20ms) {
+ ALOGD("Excessive delay in setInteractive(%s) while turning screen %s",
+ enable ? "true" : "false", enable ? "on" : "off");
+ }
}
}
static void nativeSetAutoSuspend(JNIEnv* /* env */, jclass /* clazz */, jboolean enable) {
if (enable) {
- ALOGD_IF_SLOW(100, "Excessive delay in autosuspend_enable() while turning screen off");
+ android::base::Timer t;
autosuspend_enable();
+ if (t.duration() > 100ms) {
+ ALOGD("Excessive delay in autosuspend_enable() while turning screen off");
+ }
} else {
- ALOGD_IF_SLOW(100, "Excessive delay in autosuspend_disable() while turning screen on");
+ android::base::Timer t;
autosuspend_disable();
+ if (t.duration() > 100ms) {
+ ALOGD("Excessive delay in autosuspend_disable() while turning screen on");
+ }
}
}
diff --git a/services/core/jni/com_android_server_power_PowerManagerService.h b/services/core/jni/com_android_server_power_PowerManagerService.h
index f5fd3d6..a17fd65 100644
--- a/services/core/jni/com_android_server_power_PowerManagerService.h
+++ b/services/core/jni/com_android_server_power_PowerManagerService.h
@@ -17,7 +17,7 @@
#ifndef _ANDROID_SERVER_POWER_MANAGER_SERVICE_H
#define _ANDROID_SERVER_POWER_MANAGER_SERVICE_H
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "jni.h"
#include <powermanager/PowerManager.h>
diff --git a/services/core/jni/com_android_server_radio_RadioService.cpp b/services/core/jni/com_android_server_radio_RadioService.cpp
deleted file mode 100644
index 73887bb..0000000
--- a/services/core/jni/com_android_server_radio_RadioService.cpp
+++ /dev/null
@@ -1,208 +0,0 @@
-/**
- * Copyright (C) 2017 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.
- */
-
-#define LOG_TAG "radio.RadioService.jni"
-#define LOG_NDEBUG 0
-
-#include "com_android_server_radio_RadioService.h"
-
-#include "com_android_server_radio_Tuner.h"
-#include "com_android_server_radio_convert.h"
-
-#include <android/hardware/broadcastradio/1.1/IBroadcastRadio.h>
-#include <android/hardware/broadcastradio/1.1/IBroadcastRadioFactory.h>
-#include <core_jni_helpers.h>
-#include <utils/Log.h>
-#include <JNIHelp.h>
-
-namespace android {
-namespace server {
-namespace radio {
-namespace RadioService {
-
-using hardware::Return;
-using hardware::hidl_vec;
-
-namespace V1_0 = hardware::broadcastradio::V1_0;
-namespace V1_1 = hardware::broadcastradio::V1_1;
-
-using V1_0::Class;
-using V1_0::Result;
-
-using V1_0::BandConfig;
-using V1_0::ProgramInfo;
-using V1_0::MetaData;
-using V1_0::ITuner;
-
-static Mutex gContextMutex;
-
-static struct {
- struct {
- jclass clazz;
- jmethodID cstor;
- } Tuner;
-} gjni;
-
-struct ServiceContext {
- ServiceContext() {}
-
- sp<V1_0::IBroadcastRadio> mModule;
-
-private:
- DISALLOW_COPY_AND_ASSIGN(ServiceContext);
-};
-
-
-/**
- * Always lock gContextMutex when using native context.
- */
-static ServiceContext& getNativeContext(jlong nativeContextHandle) {
- auto nativeContext = reinterpret_cast<ServiceContext*>(nativeContextHandle);
- LOG_ALWAYS_FATAL_IF(nativeContext == nullptr, "Native context not initialized");
- return *nativeContext;
-}
-
-static jlong nativeInit(JNIEnv *env, jobject obj) {
- ALOGV("nativeInit()");
- AutoMutex _l(gContextMutex);
-
- auto nativeContext = new ServiceContext();
- static_assert(sizeof(jlong) >= sizeof(nativeContext), "jlong is smaller than a pointer");
- return reinterpret_cast<jlong>(nativeContext);
-}
-
-static void nativeFinalize(JNIEnv *env, jobject obj, jlong nativeContext) {
- ALOGV("nativeFinalize()");
- AutoMutex _l(gContextMutex);
-
- auto ctx = reinterpret_cast<ServiceContext*>(nativeContext);
- delete ctx;
-}
-
-static sp<V1_0::IBroadcastRadio> getModule(jlong nativeContext) {
- ALOGV("getModule()");
- AutoMutex _l(gContextMutex);
- auto& ctx = getNativeContext(nativeContext);
-
- if (ctx.mModule != nullptr) {
- return ctx.mModule;
- }
-
- // TODO(b/36863239): what about other HAL implementations?
- auto factory = V1_0::IBroadcastRadioFactory::getService();
- if (factory == nullptr) {
- ALOGE("Can't retrieve radio HAL implementation");
- return nullptr;
- }
-
- sp<V1_0::IBroadcastRadio> module = nullptr;
- // TODO(b/36863239): not only AM/FM
- factory->connectModule(Class::AM_FM, [&](Result retval,
- const sp<V1_0::IBroadcastRadio>& result) {
- if (retval == Result::OK) {
- module = result;
- }
- });
-
- ALOGE_IF(module == nullptr, "Couldn't connect module");
- ctx.mModule = module;
- return module;
-}
-
-static jobject nativeOpenTuner(JNIEnv *env, jobject obj, long nativeContext, jint moduleId,
- jobject bandConfig, bool withAudio, jobject callback) {
- ALOGV("nativeOpenTuner()");
- EnvWrapper wrap(env);
-
- if (callback == nullptr) {
- ALOGE("Callback is empty");
- return nullptr;
- }
-
- // TODO(b/36863239): use moduleId
- auto module = getModule(nativeContext);
- if (module == nullptr) {
- return nullptr;
- }
-
- HalRevision halRev;
- if (V1_1::IBroadcastRadio::castFrom(module).withDefault(nullptr) != nullptr) {
- ALOGI("Opening tuner with broadcast radio HAL 1.1");
- halRev = HalRevision::V1_1;
- } else {
- ALOGI("Opening tuner with broadcast radio HAL 1.0");
- halRev = HalRevision::V1_0;
- }
-
- Region region;
- BandConfig bandConfigHal = convert::BandConfigToHal(env, bandConfig, region);
-
- auto tuner = wrap(env->NewObject(gjni.Tuner.clazz, gjni.Tuner.cstor,
- callback, halRev, region, withAudio));
- if (tuner == nullptr) {
- ALOGE("Unable to create new tuner object.");
- return nullptr;
- }
-
- auto tunerCb = Tuner::getNativeCallback(env, tuner);
- Result halResult;
- sp<ITuner> halTuner = nullptr;
-
- auto hidlResult = module->openTuner(bandConfigHal, withAudio, tunerCb,
- [&](Result result, const sp<ITuner>& tuner) {
- halResult = result;
- halTuner = tuner;
- });
- if (!hidlResult.isOk() || halResult != Result::OK || halTuner == nullptr) {
- ALOGE("Couldn't open tuner");
- ALOGE_IF(hidlResult.isOk(), "halResult = %d", halResult);
- ALOGE_IF(!hidlResult.isOk(), "hidlResult = %s", hidlResult.description().c_str());
- return nullptr;
- }
-
- Tuner::setHalTuner(env, tuner, halTuner);
- ALOGI("Opened tuner %p", halTuner.get());
- return tuner.release();
-}
-
-static const JNINativeMethod gRadioServiceMethods[] = {
- { "nativeInit", "()J", (void*)nativeInit },
- { "nativeFinalize", "(J)V", (void*)nativeFinalize },
- { "nativeOpenTuner", "(JILandroid/hardware/radio/RadioManager$BandConfig;Z"
- "Landroid/hardware/radio/ITunerCallback;)Lcom/android/server/radio/Tuner;",
- (void*)nativeOpenTuner },
-};
-
-} // namespace RadioService
-} // namespace radio
-} // namespace server
-
-void register_android_server_radio_RadioService(JNIEnv *env) {
- using namespace server::radio::RadioService;
-
- register_android_server_radio_convert(env);
-
- auto tunerClass = FindClassOrDie(env, "com/android/server/radio/Tuner");
- gjni.Tuner.clazz = MakeGlobalRefOrDie(env, tunerClass);
- gjni.Tuner.cstor = GetMethodIDOrDie(env, tunerClass, "<init>",
- "(Landroid/hardware/radio/ITunerCallback;IIZ)V");
-
- auto res = jniRegisterNativeMethods(env, "com/android/server/radio/RadioService",
- gRadioServiceMethods, NELEM(gRadioServiceMethods));
- LOG_ALWAYS_FATAL_IF(res < 0, "Unable to register native methods.");
-}
-
-} // namespace android
diff --git a/services/core/jni/com_android_server_radio_RadioService.h b/services/core/jni/com_android_server_radio_RadioService.h
deleted file mode 100644
index 91e119c..0000000
--- a/services/core/jni/com_android_server_radio_RadioService.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/**
- * Copyright (C) 2017 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.
- */
-
-#ifndef _ANDROID_SERVER_RADIO_RADIOSERVICE_H
-#define _ANDROID_SERVER_RADIO_RADIOSERVICE_H
-
-#include <jni.h>
-
-namespace android {
-
-void register_android_server_radio_RadioService(JNIEnv *env);
-
-} // namespace android
-
-#endif // _ANDROID_SERVER_RADIO_RADIOSERVICE_H
diff --git a/services/core/jni/com_android_server_radio_Tuner.cpp b/services/core/jni/com_android_server_radio_Tuner.cpp
deleted file mode 100644
index b92136a..0000000
--- a/services/core/jni/com_android_server_radio_Tuner.cpp
+++ /dev/null
@@ -1,384 +0,0 @@
-/**
- * Copyright (C) 2017 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.
- */
-
-#define LOG_TAG "radio.Tuner.jni"
-#define LOG_NDEBUG 0
-
-#include "com_android_server_radio_Tuner.h"
-
-#include "com_android_server_radio_convert.h"
-#include "com_android_server_radio_Tuner_TunerCallback.h"
-
-#include <android/hardware/broadcastradio/1.1/IBroadcastRadioFactory.h>
-#include <core_jni_helpers.h>
-#include <utils/Log.h>
-#include <JNIHelp.h>
-
-namespace android {
-namespace server {
-namespace radio {
-namespace Tuner {
-
-using hardware::Return;
-using hardware::hidl_vec;
-
-namespace V1_0 = hardware::broadcastradio::V1_0;
-namespace V1_1 = hardware::broadcastradio::V1_1;
-
-using V1_0::BandConfig;
-using V1_0::MetaData;
-using V1_0::Result;
-using V1_1::ITunerCallback;
-using V1_1::ProgramListResult;
-
-static Mutex gContextMutex;
-
-static struct {
- struct {
- jclass clazz;
- jmethodID cstor;
- jmethodID add;
- } ArrayList;
- struct {
- jfieldID nativeContext;
- jfieldID region;
- jfieldID tunerCallback;
- } Tuner;
-} gjni;
-
-struct TunerContext {
- TunerContext() {}
-
- HalRevision mHalRev;
- sp<V1_0::ITuner> mHalTuner;
- sp<V1_1::ITuner> mHalTuner11;
-
-private:
- DISALLOW_COPY_AND_ASSIGN(TunerContext);
-};
-
-static TunerContext& getNativeContext(jlong nativeContextHandle) {
- auto nativeContext = reinterpret_cast<TunerContext*>(nativeContextHandle);
- LOG_ALWAYS_FATAL_IF(nativeContext == nullptr, "Native context not initialized");
- return *nativeContext;
-}
-
-/**
- * Always lock gContextMutex when using native context.
- */
-static TunerContext& getNativeContext(JNIEnv *env, JavaRef<jobject> const &jTuner) {
- return getNativeContext(env->GetLongField(jTuner.get(), gjni.Tuner.nativeContext));
-}
-
-static jlong nativeInit(JNIEnv *env, jobject obj, jint halRev) {
- ALOGV("nativeInit()");
- AutoMutex _l(gContextMutex);
-
- auto ctx = new TunerContext();
- ctx->mHalRev = static_cast<HalRevision>(halRev);
-
- static_assert(sizeof(jlong) >= sizeof(ctx), "jlong is smaller than a pointer");
- return reinterpret_cast<jlong>(ctx);
-}
-
-static void nativeFinalize(JNIEnv *env, jobject obj, jlong nativeContext) {
- ALOGV("nativeFinalize()");
- AutoMutex _l(gContextMutex);
-
- auto ctx = reinterpret_cast<TunerContext*>(nativeContext);
- delete ctx;
-}
-
-void setHalTuner(JNIEnv *env, JavaRef<jobject> const &jTuner, sp<V1_0::ITuner> halTuner) {
- ALOGV("setHalTuner(%p)", halTuner.get());
- ALOGE_IF(halTuner == nullptr, "HAL tuner is a nullptr");
-
- AutoMutex _l(gContextMutex);
- auto& ctx = getNativeContext(env, jTuner);
-
- ctx.mHalTuner = halTuner;
- ctx.mHalTuner11 = V1_1::ITuner::castFrom(halTuner).withDefault(nullptr);
- ALOGW_IF(ctx.mHalRev >= HalRevision::V1_1 && ctx.mHalTuner11 == nullptr,
- "Provided tuner does not implement 1.1 HAL");
-}
-
-sp<V1_0::ITuner> getHalTuner(jlong nativeContext) {
- AutoMutex _l(gContextMutex);
- auto tuner = getNativeContext(nativeContext).mHalTuner;
- LOG_ALWAYS_FATAL_IF(tuner == nullptr, "HAL tuner is not open");
- return tuner;
-}
-
-sp<V1_1::ITuner> getHalTuner11(jlong nativeContext) {
- AutoMutex _l(gContextMutex);
- return getNativeContext(nativeContext).mHalTuner11;
-}
-
-sp<ITunerCallback> getNativeCallback(JNIEnv *env, JavaRef<jobject> const &tuner) {
- return TunerCallback::getNativeCallback(env,
- env->GetObjectField(tuner.get(), gjni.Tuner.tunerCallback));
-}
-
-Region getRegion(JNIEnv *env, jobject obj) {
- return static_cast<Region>(env->GetIntField(obj, gjni.Tuner.region));
-}
-
-static void nativeClose(JNIEnv *env, jobject obj, jlong nativeContext) {
- AutoMutex _l(gContextMutex);
- auto& ctx = getNativeContext(nativeContext);
- if (ctx.mHalTuner == nullptr) return;
- ALOGI("Closing tuner %p", ctx.mHalTuner.get());
- ctx.mHalTuner11 = nullptr;
- ctx.mHalTuner = nullptr;
-}
-
-static void nativeSetConfiguration(JNIEnv *env, jobject obj, jlong nativeContext, jobject config) {
- ALOGV("nativeSetConfiguration()");
- auto halTuner = getHalTuner(nativeContext);
- if (halTuner == nullptr) return;
-
- Region region_unused;
- BandConfig bandConfigHal = convert::BandConfigToHal(env, config, region_unused);
-
- convert::ThrowIfFailed(env, halTuner->setConfiguration(bandConfigHal));
-}
-
-static jobject nativeGetConfiguration(JNIEnv *env, jobject obj, jlong nativeContext,
- Region region) {
- ALOGV("nativeSetConfiguration()");
- auto halTuner = getHalTuner(nativeContext);
- if (halTuner == nullptr) return nullptr;
-
- BandConfig halConfig;
- Result halResult;
- auto hidlResult = halTuner->getConfiguration([&](Result result, const BandConfig& config) {
- halResult = result;
- halConfig = config;
- });
- if (convert::ThrowIfFailed(env, hidlResult, halResult)) {
- return nullptr;
- }
-
- return convert::BandConfigFromHal(env, halConfig, region).release();
-}
-
-static void nativeStep(JNIEnv *env, jobject obj, jlong nativeContext,
- bool directionDown, bool skipSubChannel) {
- ALOGV("nativeStep()");
- auto halTuner = getHalTuner(nativeContext);
- if (halTuner == nullptr) return;
-
- auto dir = convert::DirectionToHal(directionDown);
- convert::ThrowIfFailed(env, halTuner->step(dir, skipSubChannel));
-}
-
-static void nativeScan(JNIEnv *env, jobject obj, jlong nativeContext,
- bool directionDown, bool skipSubChannel) {
- ALOGV("nativeScan()");
- auto halTuner = getHalTuner(nativeContext);
- if (halTuner == nullptr) return;
-
- auto dir = convert::DirectionToHal(directionDown);
- convert::ThrowIfFailed(env, halTuner->scan(dir, skipSubChannel));
-}
-
-static void nativeTune(JNIEnv *env, jobject obj, jlong nativeContext,
- jint channel, jint subChannel) {
- ALOGV("nativeTune(%d, %d)", channel, subChannel);
- auto halTuner = getHalTuner(nativeContext);
- if (halTuner == nullptr) return;
-
- convert::ThrowIfFailed(env, halTuner->tune(channel, subChannel));
-}
-
-static void nativeCancel(JNIEnv *env, jobject obj, jlong nativeContext) {
- ALOGV("nativeCancel()");
- auto halTuner = getHalTuner(nativeContext);
- if (halTuner == nullptr) return;
-
- convert::ThrowIfFailed(env, halTuner->cancel());
-}
-
-static jobject nativeGetProgramInformation(JNIEnv *env, jobject obj, jlong nativeContext) {
- ALOGV("nativeGetProgramInformation()");
- auto halTuner10 = getHalTuner(nativeContext);
- auto halTuner11 = getHalTuner11(nativeContext);
- if (halTuner10 == nullptr) return nullptr;
-
- JavaRef<jobject> jInfo;
- Result halResult;
- Return<void> hidlResult;
- if (halTuner11 != nullptr) {
- hidlResult = halTuner11->getProgramInformation_1_1([&](Result result,
- const V1_1::ProgramInfo& info) {
- halResult = result;
- if (result != Result::OK) return;
- jInfo = convert::ProgramInfoFromHal(env, info);
- });
- } else {
- hidlResult = halTuner10->getProgramInformation([&](Result result,
- const V1_0::ProgramInfo& info) {
- halResult = result;
- if (result != Result::OK) return;
- jInfo = convert::ProgramInfoFromHal(env, info);
- });
- }
-
- if (jInfo != nullptr) return jInfo.release();
- convert::ThrowIfFailed(env, hidlResult, halResult);
- return nullptr;
-}
-
-static bool nativeStartBackgroundScan(JNIEnv *env, jobject obj, jlong nativeContext) {
- ALOGV("nativeStartBackgroundScan()");
- auto halTuner = getHalTuner11(nativeContext);
- if (halTuner == nullptr) {
- ALOGI("Background scan is not supported with HAL < 1.1");
- return false;
- }
-
- auto halResult = halTuner->startBackgroundScan();
-
- if (halResult.isOk() && halResult == ProgramListResult::UNAVAILABLE) return false;
- return !convert::ThrowIfFailed(env, halResult);
-}
-
-static jobject nativeGetProgramList(JNIEnv *env, jobject obj, jlong nativeContext, jstring jFilter) {
- ALOGV("nativeGetProgramList()");
- EnvWrapper wrap(env);
- auto halTuner = getHalTuner11(nativeContext);
- if (halTuner == nullptr) {
- ALOGI("Program list is not supported with HAL < 1.1");
- return nullptr;
- }
-
- JavaRef<jobject> jList;
- ProgramListResult halResult = ProgramListResult::NOT_INITIALIZED;
- auto filter = env->GetStringUTFChars(jFilter, nullptr);
- auto hidlResult = halTuner->getProgramList(filter,
- [&](ProgramListResult result, const hidl_vec<V1_1::ProgramInfo>& programList) {
- halResult = result;
- if (halResult != ProgramListResult::OK) return;
-
- jList = wrap(env->NewObject(gjni.ArrayList.clazz, gjni.ArrayList.cstor));
- for (auto& program : programList) {
- auto jProgram = convert::ProgramInfoFromHal(env, program);
- env->CallBooleanMethod(jList.get(), gjni.ArrayList.add, jProgram.get());
- }
- });
-
- if (convert::ThrowIfFailed(env, hidlResult, halResult)) return nullptr;
-
- return jList.release();
-}
-
-static bool nativeIsAnalogForced(JNIEnv *env, jobject obj, jlong nativeContext) {
- ALOGV("nativeIsAnalogForced()");
- auto halTuner = getHalTuner11(nativeContext);
- if (halTuner == nullptr) {
- jniThrowException(env, "java/lang/IllegalStateException",
- "Forced analog switch is not supported with HAL < 1.1");
- return false;
- }
-
- bool isForced;
- Result halResult;
- auto hidlResult = halTuner->isAnalogForced([&](Result result, bool isForcedRet) {
- halResult = result;
- isForced = isForcedRet;
- });
-
- if (convert::ThrowIfFailed(env, hidlResult, halResult)) return false;
-
- return isForced;
-}
-
-static void nativeSetAnalogForced(JNIEnv *env, jobject obj, jlong nativeContext, bool isForced) {
- ALOGV("nativeSetAnalogForced()");
- auto halTuner = getHalTuner11(nativeContext);
- if (halTuner == nullptr) {
- jniThrowException(env, "java/lang/IllegalStateException",
- "Forced analog switch is not supported with HAL < 1.1");
- return;
- }
-
- auto halResult = halTuner->setAnalogForced(isForced);
- convert::ThrowIfFailed(env, halResult);
-}
-
-static bool nativeIsAntennaConnected(JNIEnv *env, jobject obj, jlong nativeContext) {
- ALOGV("nativeIsAntennaConnected()");
- auto halTuner = getHalTuner(nativeContext);
- if (halTuner == nullptr) return false;
-
- bool isConnected = false;
- Result halResult;
- auto hidlResult = halTuner->getConfiguration([&](Result result, const BandConfig& config) {
- halResult = result;
- isConnected = config.antennaConnected;
- });
- convert::ThrowIfFailed(env, hidlResult, halResult);
- return isConnected;
-}
-
-static const JNINativeMethod gTunerMethods[] = {
- { "nativeInit", "(I)J", (void*)nativeInit },
- { "nativeFinalize", "(J)V", (void*)nativeFinalize },
- { "nativeClose", "(J)V", (void*)nativeClose },
- { "nativeSetConfiguration", "(JLandroid/hardware/radio/RadioManager$BandConfig;)V",
- (void*)nativeSetConfiguration },
- { "nativeGetConfiguration", "(JI)Landroid/hardware/radio/RadioManager$BandConfig;",
- (void*)nativeGetConfiguration },
- { "nativeStep", "(JZZ)V", (void*)nativeStep },
- { "nativeScan", "(JZZ)V", (void*)nativeScan },
- { "nativeTune", "(JII)V", (void*)nativeTune },
- { "nativeCancel", "(J)V", (void*)nativeCancel },
- { "nativeGetProgramInformation", "(J)Landroid/hardware/radio/RadioManager$ProgramInfo;",
- (void*)nativeGetProgramInformation },
- { "nativeStartBackgroundScan", "(J)Z", (void*)nativeStartBackgroundScan },
- { "nativeGetProgramList", "(JLjava/lang/String;)Ljava/util/List;",
- (void*)nativeGetProgramList },
- { "nativeIsAnalogForced", "(J)Z", (void*)nativeIsAnalogForced },
- { "nativeSetAnalogForced", "(JZ)V", (void*)nativeSetAnalogForced },
- { "nativeIsAntennaConnected", "(J)Z", (void*)nativeIsAntennaConnected },
-};
-
-} // namespace Tuner
-} // namespace radio
-} // namespace server
-
-void register_android_server_radio_Tuner(JavaVM *vm, JNIEnv *env) {
- using namespace server::radio::Tuner;
-
- register_android_server_radio_TunerCallback(vm, env);
-
- auto tunerClass = FindClassOrDie(env, "com/android/server/radio/Tuner");
- gjni.Tuner.nativeContext = GetFieldIDOrDie(env, tunerClass, "mNativeContext", "J");
- gjni.Tuner.region = GetFieldIDOrDie(env, tunerClass, "mRegion", "I");
- gjni.Tuner.tunerCallback = GetFieldIDOrDie(env, tunerClass, "mTunerCallback",
- "Lcom/android/server/radio/TunerCallback;");
-
- auto arrayListClass = FindClassOrDie(env, "java/util/ArrayList");
- gjni.ArrayList.clazz = MakeGlobalRefOrDie(env, arrayListClass);
- gjni.ArrayList.cstor = GetMethodIDOrDie(env, arrayListClass, "<init>", "()V");
- gjni.ArrayList.add = GetMethodIDOrDie(env, arrayListClass, "add", "(Ljava/lang/Object;)Z");
-
- auto res = jniRegisterNativeMethods(env, "com/android/server/radio/Tuner",
- gTunerMethods, NELEM(gTunerMethods));
- LOG_ALWAYS_FATAL_IF(res < 0, "Unable to register native methods.");
-}
-
-} // namespace android
diff --git a/services/core/jni/com_android_server_radio_Tuner.h b/services/core/jni/com_android_server_radio_Tuner.h
deleted file mode 100644
index f653832..0000000
--- a/services/core/jni/com_android_server_radio_Tuner.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * Copyright (C) 2017 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.
- */
-
-#ifndef _ANDROID_SERVER_RADIO_TUNER_H
-#define _ANDROID_SERVER_RADIO_TUNER_H
-
-#include "com_android_server_radio_types.h"
-
-#include "JavaRef.h"
-
-#include <android/hardware/broadcastradio/1.1/ITuner.h>
-#include <android/hardware/broadcastradio/1.1/ITunerCallback.h>
-#include <jni.h>
-#include <utils/StrongPointer.h>
-
-namespace android {
-
-void register_android_server_radio_Tuner(JavaVM *vm, JNIEnv *env);
-
-namespace server {
-namespace radio {
-namespace Tuner {
-
-void setHalTuner(JNIEnv *env, JavaRef<jobject> const &jTuner,
- sp<hardware::broadcastradio::V1_0::ITuner> halTuner);
-
-sp<hardware::broadcastradio::V1_1::ITunerCallback>
-getNativeCallback(JNIEnv *env, JavaRef<jobject> const &tuner);
-
-Region getRegion(JNIEnv *env, jobject obj);
-
-} // namespace Tuner
-} // namespace radio
-} // namespace server
-} // namespace android
-
-#endif // _ANDROID_SERVER_RADIO_TUNER_H
diff --git a/services/core/jni/com_android_server_radio_Tuner_TunerCallback.cpp b/services/core/jni/com_android_server_radio_Tuner_TunerCallback.cpp
deleted file mode 100644
index 1290c7a..0000000
--- a/services/core/jni/com_android_server_radio_Tuner_TunerCallback.cpp
+++ /dev/null
@@ -1,319 +0,0 @@
-/**
- * Copyright (C) 2017 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.
- */
-
-#define LOG_TAG "radio.TunerCallback.jni"
-#define LOG_NDEBUG 0
-
-#include "com_android_server_radio_Tuner_TunerCallback.h"
-
-#include "com_android_server_radio_convert.h"
-#include "com_android_server_radio_Tuner.h"
-
-#include <core_jni_helpers.h>
-#include <utils/Log.h>
-#include <JNIHelp.h>
-
-namespace android {
-namespace server {
-namespace radio {
-namespace TunerCallback {
-
-using hardware::Return;
-using hardware::hidl_vec;
-
-namespace V1_0 = hardware::broadcastradio::V1_0;
-namespace V1_1 = hardware::broadcastradio::V1_1;
-
-using V1_0::BandConfig;
-using V1_0::MetaData;
-using V1_0::Result;
-using V1_1::ITunerCallback;
-using V1_1::ProgramListResult;
-
-static JavaVM *gvm = nullptr;
-
-static struct {
- struct {
- jclass clazz;
- jfieldID nativeContext;
- jmethodID handleHwFailure;
- jmethodID onError;
- jmethodID onConfigurationChanged;
- jmethodID onProgramInfoChanged;
- } TunerCallback;
-} gjni;
-
-// from frameworks/base/core/java/android/hardware/radio/RadioTuner.java
-enum class TunerError : jint {
- HARDWARE_FAILURE = 0,
- SERVER_DIED = 1,
- CANCELLED = 2,
- SCAN_TIMEOUT = 3,
- CONFIG = 4,
-};
-
-static Mutex gContextMutex;
-
-class NativeCallback : public ITunerCallback {
- jobject mJTuner;
- jobject mJCallback;
- NativeCallbackThread mCallbackThread;
- HalRevision mHalRev;
-
- DISALLOW_COPY_AND_ASSIGN(NativeCallback);
-
-public:
- NativeCallback(JNIEnv *env, jobject jTuner, jobject jCallback, HalRevision halRev);
- virtual ~NativeCallback();
-
- void detach();
-
- virtual Return<void> hardwareFailure();
- virtual Return<void> configChange(Result result, const BandConfig& config);
- virtual Return<void> tuneComplete(Result result, const V1_0::ProgramInfo& info);
- virtual Return<void> afSwitch(const V1_0::ProgramInfo& info);
- virtual Return<void> antennaStateChange(bool connected);
- virtual Return<void> trafficAnnouncement(bool active);
- virtual Return<void> emergencyAnnouncement(bool active);
- virtual Return<void> newMetadata(uint32_t channel, uint32_t subChannel,
- const hidl_vec<MetaData>& metadata);
- virtual Return<void> tuneComplete_1_1(Result result, const V1_1::ProgramInfo& info);
- virtual Return<void> afSwitch_1_1(const V1_1::ProgramInfo& info);
- virtual Return<void> backgroundScanAvailable(bool isAvailable);
- virtual Return<void> backgroundScanComplete(ProgramListResult result);
- virtual Return<void> programListChanged();
-};
-
-struct TunerCallbackContext {
- TunerCallbackContext() {}
-
- sp<NativeCallback> mNativeCallback;
-
-private:
- DISALLOW_COPY_AND_ASSIGN(TunerCallbackContext);
-};
-
-NativeCallback::NativeCallback(JNIEnv *env, jobject jTuner, jobject jCallback, HalRevision halRev)
- : mCallbackThread(gvm), mHalRev(halRev) {
- ALOGV("NativeCallback()");
- mJTuner = env->NewGlobalRef(jTuner);
- mJCallback = env->NewGlobalRef(jCallback);
-}
-
-NativeCallback::~NativeCallback() {
- ALOGV("~NativeCallback()");
-
- // stop callback thread before dereferencing client callback
- mCallbackThread.stop();
-
- JNIEnv *env = nullptr;
- gvm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_4);
- if (env != nullptr) {
- env->DeleteGlobalRef(mJTuner);
- env->DeleteGlobalRef(mJCallback);
- }
-}
-
-void NativeCallback::detach() {
- // stop callback thread to ignore further calls
- mCallbackThread.stop();
-}
-
-Return<void> NativeCallback::hardwareFailure() {
- mCallbackThread.enqueue([this](JNIEnv *env) {
- env->CallVoidMethod(mJCallback, gjni.TunerCallback.handleHwFailure);
- });
-
- return Return<void>();
-}
-
-Return<void> NativeCallback::configChange(Result result, const BandConfig& config) {
- ALOGV("configChange(%d)", result);
-
- mCallbackThread.enqueue([result, config, this](JNIEnv *env) {
- if (result == Result::OK) {
- auto region = Tuner::getRegion(env, mJTuner);
- auto jConfig = convert::BandConfigFromHal(env, config, region);
- if (jConfig == nullptr) return;
- env->CallVoidMethod(mJCallback, gjni.TunerCallback.onConfigurationChanged,
- jConfig.get());
- } else {
- env->CallVoidMethod(mJCallback, gjni.TunerCallback.onError, TunerError::CONFIG);
- }
- });
-
- return Return<void>();
-}
-
-Return<void> NativeCallback::tuneComplete(Result result, const V1_0::ProgramInfo& info) {
- ALOGV("tuneComplete(%d)", result);
-
- if (mHalRev > HalRevision::V1_0) {
- ALOGD("1.0 callback was ignored");
- return Return<void>();
- }
-
- V1_1::ProgramInfo info_1_1 {
- .base = info,
- };
- return tuneComplete_1_1(result, info_1_1);
-}
-
-Return<void> NativeCallback::tuneComplete_1_1(Result result, const V1_1::ProgramInfo& info) {
- ALOGV("tuneComplete_1_1(%d)", result);
-
- mCallbackThread.enqueue([result, info, this](JNIEnv *env) {
- if (result == Result::OK) {
- auto jInfo = convert::ProgramInfoFromHal(env, info);
- if (jInfo == nullptr) return;
- env->CallVoidMethod(mJCallback, gjni.TunerCallback.onProgramInfoChanged, jInfo.get());
- } else {
- TunerError cause = TunerError::CANCELLED;
- if (result == Result::TIMEOUT) cause = TunerError::SCAN_TIMEOUT;
- env->CallVoidMethod(mJCallback, gjni.TunerCallback.onError, cause);
- }
- });
-
- return Return<void>();
-}
-
-Return<void> NativeCallback::afSwitch(const V1_0::ProgramInfo& info) {
- ALOGE("Not implemented: afSwitch");
- return Return<void>();
-}
-
-Return<void> NativeCallback::afSwitch_1_1(const V1_1::ProgramInfo& info) {
- ALOGE("Not implemented: afSwitch_1_1");
- return Return<void>();
-}
-
-Return<void> NativeCallback::antennaStateChange(bool connected) {
- ALOGE("Not implemented: antennaStateChange");
- return Return<void>();
-}
-
-Return<void> NativeCallback::trafficAnnouncement(bool active) {
- ALOGE("Not implemented: trafficAnnouncement");
- return Return<void>();
-}
-
-Return<void> NativeCallback::emergencyAnnouncement(bool active) {
- ALOGE("Not implemented: emergencyAnnouncement");
- return Return<void>();
-}
-
-Return<void> NativeCallback::newMetadata(uint32_t channel, uint32_t subChannel,
- const hidl_vec<MetaData>& metadata) {
- ALOGE("Not implemented: newMetadata");
- return Return<void>();
-}
-
-Return<void> NativeCallback::backgroundScanAvailable(bool isAvailable) {
- ALOGE("Not implemented: backgroundScanAvailable");
- return Return<void>();
-}
-
-Return<void> NativeCallback::backgroundScanComplete(ProgramListResult result) {
- ALOGE("Not implemented: backgroundScanComplete");
- return Return<void>();
-}
-
-Return<void> NativeCallback::programListChanged() {
- ALOGE("Not implemented: programListChanged");
- return Return<void>();
-}
-
-static TunerCallbackContext& getNativeContext(jlong nativeContextHandle) {
- auto nativeContext = reinterpret_cast<TunerCallbackContext*>(nativeContextHandle);
- LOG_ALWAYS_FATAL_IF(nativeContext == nullptr, "Native context not initialized");
- return *nativeContext;
-}
-
-/**
- * Always lock gContextMutex when using native context.
- */
-static TunerCallbackContext& getNativeContext(JNIEnv *env, jobject jTunerCb) {
- return getNativeContext(env->GetLongField(jTunerCb, gjni.TunerCallback.nativeContext));
-}
-
-static jlong nativeInit(JNIEnv *env, jobject obj, jobject jTuner, jint jHalRev) {
- ALOGV("nativeInit()");
- AutoMutex _l(gContextMutex);
-
- auto halRev = static_cast<HalRevision>(jHalRev);
-
- auto ctx = new TunerCallbackContext();
- ctx->mNativeCallback = new NativeCallback(env, jTuner, obj, halRev);
-
- static_assert(sizeof(jlong) >= sizeof(ctx), "jlong is smaller than a pointer");
- return reinterpret_cast<jlong>(ctx);
-}
-
-static void nativeFinalize(JNIEnv *env, jobject obj, jlong nativeContext) {
- ALOGV("nativeFinalize()");
- AutoMutex _l(gContextMutex);
-
- auto ctx = reinterpret_cast<TunerCallbackContext*>(nativeContext);
- delete ctx;
-}
-
-static void nativeDetach(JNIEnv *env, jobject obj, jlong nativeContext) {
- ALOGV("nativeDetach()");
- AutoMutex _l(gContextMutex);
- auto& ctx = getNativeContext(nativeContext);
-
- if (ctx.mNativeCallback == nullptr) return;
- ctx.mNativeCallback->detach();
- ctx.mNativeCallback = nullptr;
-}
-
-sp<ITunerCallback> getNativeCallback(JNIEnv *env, jobject jTunerCallback) {
- AutoMutex _l(gContextMutex);
- auto& ctx = getNativeContext(env, jTunerCallback);
- return ctx.mNativeCallback;
-}
-
-static const JNINativeMethod gTunerCallbackMethods[] = {
- { "nativeInit", "(Lcom/android/server/radio/Tuner;I)J", (void*)nativeInit },
- { "nativeFinalize", "(J)V", (void*)nativeFinalize },
- { "nativeDetach", "(J)V", (void*)nativeDetach },
-};
-
-} // namespace TunerCallback
-} // namespace radio
-} // namespace server
-
-void register_android_server_radio_TunerCallback(JavaVM *vm, JNIEnv *env) {
- using namespace server::radio::TunerCallback;
-
- gvm = vm;
-
- auto tunerCbClass = FindClassOrDie(env, "com/android/server/radio/TunerCallback");
- gjni.TunerCallback.clazz = MakeGlobalRefOrDie(env, tunerCbClass);
- gjni.TunerCallback.nativeContext = GetFieldIDOrDie(env, tunerCbClass, "mNativeContext", "J");
- gjni.TunerCallback.handleHwFailure = GetMethodIDOrDie(env, tunerCbClass, "handleHwFailure", "()V");
- gjni.TunerCallback.onError = GetMethodIDOrDie(env, tunerCbClass, "onError", "(I)V");
- gjni.TunerCallback.onConfigurationChanged = GetMethodIDOrDie(env, tunerCbClass,
- "onConfigurationChanged", "(Landroid/hardware/radio/RadioManager$BandConfig;)V");
- gjni.TunerCallback.onProgramInfoChanged = GetMethodIDOrDie(env, tunerCbClass,
- "onProgramInfoChanged", "(Landroid/hardware/radio/RadioManager$ProgramInfo;)V");
-
- auto res = jniRegisterNativeMethods(env, "com/android/server/radio/TunerCallback",
- gTunerCallbackMethods, NELEM(gTunerCallbackMethods));
- LOG_ALWAYS_FATAL_IF(res < 0, "Unable to register native methods.");
-}
-
-} // namespace android
diff --git a/services/core/jni/com_android_server_radio_Tuner_TunerCallback.h b/services/core/jni/com_android_server_radio_Tuner_TunerCallback.h
deleted file mode 100644
index 35a4d69..0000000
--- a/services/core/jni/com_android_server_radio_Tuner_TunerCallback.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * Copyright (C) 2017 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.
- */
-
-// TODO(b/36863239): rename s/_Tuner_TunerCallback/_TunerCallback/, as this
-// module is no longer a part of Tuner - it's an independent java class.
-#ifndef _ANDROID_SERVER_RADIO_TUNERCALLBACK_H
-#define _ANDROID_SERVER_RADIO_TUNERCALLBACK_H
-
-#include "JavaRef.h"
-#include "NativeCallbackThread.h"
-#include "com_android_server_radio_types.h"
-
-#include <android/hardware/broadcastradio/1.1/ITunerCallback.h>
-#include <jni.h>
-
-namespace android {
-
-void register_android_server_radio_TunerCallback(JavaVM *vm, JNIEnv *env);
-
-namespace server {
-namespace radio {
-namespace TunerCallback {
-
-sp<hardware::broadcastradio::V1_1::ITunerCallback>
-getNativeCallback(JNIEnv *env, jobject jTunerCallback);
-
-} // namespace TunerCallback
-} // namespace radio
-} // namespace server
-} // namespace android
-
-#endif // _ANDROID_SERVER_RADIO_TUNERCALLBACK_H
diff --git a/services/core/jni/com_android_server_radio_convert.cpp b/services/core/jni/com_android_server_radio_convert.cpp
deleted file mode 100644
index 19abf8a..0000000
--- a/services/core/jni/com_android_server_radio_convert.cpp
+++ /dev/null
@@ -1,397 +0,0 @@
-/**
- * Copyright (C) 2017 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.
- */
-
-#define LOG_TAG "radio.convert.jni"
-#define LOG_NDEBUG 0
-
-#include "com_android_server_radio_convert.h"
-
-#include <core_jni_helpers.h>
-#include <utils/Log.h>
-#include <JNIHelp.h>
-
-namespace android {
-namespace server {
-namespace radio {
-namespace convert {
-
-using hardware::Return;
-using hardware::hidl_vec;
-
-using V1_0::Band;
-using V1_0::Deemphasis;
-using V1_0::Direction;
-using V1_0::MetadataType;
-using V1_0::Result;
-using V1_0::Rds;
-using V1_1::ProgramListResult;
-
-static struct {
- struct {
- jfieldID descriptor;
- } BandConfig;
- struct {
- jclass clazz;
- jmethodID cstor;
- jfieldID stereo;
- jfieldID rds;
- jfieldID ta;
- jfieldID af;
- jfieldID ea;
- } FmBandConfig;
- struct {
- jclass clazz;
- jmethodID cstor;
- jfieldID stereo;
- } AmBandConfig;
-
- struct {
- jfieldID region;
- jfieldID type;
- jfieldID lowerLimit;
- jfieldID upperLimit;
- jfieldID spacing;
- } BandDescriptor;
-
- struct {
- jclass clazz;
- jmethodID cstor;
- } ProgramInfo;
-
- struct {
- jclass clazz;
- jmethodID cstor;
- jmethodID putIntFromNative;
- jmethodID putStringFromNative;
- jmethodID putBitmapFromNative;
- jmethodID putClockFromNative;
- } RadioMetadata;
-
- struct {
- jclass clazz;
- jmethodID cstor;
- } RuntimeException;
-
- struct {
- jclass clazz;
- jmethodID cstor;
- } ParcelableException;
-} gjni;
-
-bool __ThrowIfFailedHidl(JNIEnv *env, const hardware::details::return_status &hidlResult) {
- if (hidlResult.isOk()) return false;
-
- ThrowParcelableRuntimeException(env, "HIDL call failed: " + hidlResult.description());
- return true;
-}
-
-bool __ThrowIfFailed(JNIEnv *env, const Result halResult) {
- switch (halResult) {
- case Result::OK:
- return false;
- case Result::NOT_INITIALIZED:
- ThrowParcelableRuntimeException(env, "Result::NOT_INITIALIZED");
- return true;
- case Result::INVALID_ARGUMENTS:
- jniThrowException(env, "java/lang/IllegalArgumentException",
- "Result::INVALID_ARGUMENTS");
- return true;
- case Result::INVALID_STATE:
- jniThrowException(env, "java/lang/IllegalStateException", "Result::INVALID_STATE");
- return true;
- case Result::TIMEOUT:
- ThrowParcelableRuntimeException(env, "Result::TIMEOUT (unexpected here)");
- return true;
- default:
- ThrowParcelableRuntimeException(env, "Unknown failure, result: "
- + std::to_string(static_cast<int32_t>(halResult)));
- return true;
- }
-}
-
-bool __ThrowIfFailed(JNIEnv *env, const ProgramListResult halResult) {
- switch (halResult) {
- case ProgramListResult::NOT_READY:
- jniThrowException(env, "java/lang/IllegalStateException", "Scan is in progress");
- return true;
- case ProgramListResult::NOT_STARTED:
- jniThrowException(env, "java/lang/IllegalStateException", "Scan has not been started");
- return true;
- case ProgramListResult::UNAVAILABLE:
- ThrowParcelableRuntimeException(env,
- "ProgramListResult::UNAVAILABLE (unexpected here)");
- return true;
- default:
- return __ThrowIfFailed(env, static_cast<Result>(halResult));
- }
-}
-
-void ThrowParcelableRuntimeException(JNIEnv *env, const std::string& msg) {
- EnvWrapper wrap(env);
-
- auto jMsg = wrap(env->NewStringUTF(msg.c_str()));
- auto runtimeExc = wrap(env->NewObject(gjni.RuntimeException.clazz,
- gjni.RuntimeException.cstor, jMsg.get()));
- auto parcelableExc = wrap(env->NewObject(gjni.ParcelableException.clazz,
- gjni.ParcelableException.cstor, runtimeExc.get()));
-
- auto res = env->Throw(static_cast<jthrowable>(parcelableExc.get()));
- ALOGE_IF(res != JNI_OK, "Couldn't throw parcelable runtime exception");
-}
-
-static Rds RdsForRegion(bool rds, Region region) {
- if (!rds) return Rds::NONE;
-
- switch(region) {
- case Region::ITU_1:
- case Region::OIRT:
- case Region::JAPAN:
- case Region::KOREA:
- return Rds::WORLD;
- case Region::ITU_2:
- return Rds::US;
- default:
- ALOGE("Unexpected region: %d", region);
- return Rds::NONE;
- }
-}
-
-static Deemphasis DeemphasisForRegion(Region region) {
- switch(region) {
- case Region::KOREA:
- case Region::ITU_2:
- return Deemphasis::D75;
- case Region::ITU_1:
- case Region::OIRT:
- case Region::JAPAN:
- return Deemphasis::D50;
- default:
- ALOGE("Unexpected region: %d", region);
- return Deemphasis::D50;
- }
-}
-
-JavaRef<jobject> BandConfigFromHal(JNIEnv *env, const V1_0::BandConfig &config, Region region) {
- ALOGV("BandConfigFromHal()");
- EnvWrapper wrap(env);
-
- jint spacing = config.spacings.size() > 0 ? config.spacings[0] : 0;
- ALOGW_IF(config.spacings.size() == 0, "No channel spacing specified");
-
- switch (config.type) {
- case Band::FM:
- case Band::FM_HD: {
- auto& fm = config.ext.fm;
- return wrap(env->NewObject(gjni.FmBandConfig.clazz, gjni.FmBandConfig.cstor,
- region, config.type, config.lowerLimit, config.upperLimit, spacing,
- fm.stereo, fm.rds != Rds::NONE, fm.ta, fm.af, fm.ea));
- }
- case Band::AM:
- case Band::AM_HD: {
- auto& am = config.ext.am;
- return wrap(env->NewObject(gjni.AmBandConfig.clazz, gjni.AmBandConfig.cstor,
- region, config.type, config.lowerLimit, config.upperLimit, spacing,
- am.stereo));
- }
- default:
- ALOGE("Unsupported band type: %d", config.type);
- return nullptr;
- }
-}
-
-V1_0::BandConfig BandConfigToHal(JNIEnv *env, jobject jConfig, Region ®ion) {
- ALOGV("BandConfigToHal()");
- auto jDescriptor = env->GetObjectField(jConfig, gjni.BandConfig.descriptor);
- if (jDescriptor == nullptr) {
- ALOGE("Descriptor is missing");
- return {};
- }
-
- region = static_cast<Region>(env->GetIntField(jDescriptor, gjni.BandDescriptor.region));
-
- V1_0::BandConfig config = {};
- config.type = static_cast<Band>(env->GetIntField(jDescriptor, gjni.BandDescriptor.type));
- config.antennaConnected = false; // just don't set it
- config.lowerLimit = env->GetIntField(jDescriptor, gjni.BandDescriptor.lowerLimit);
- config.upperLimit = env->GetIntField(jDescriptor, gjni.BandDescriptor.upperLimit);
- config.spacings = hidl_vec<uint32_t>({
- static_cast<uint32_t>(env->GetIntField(jDescriptor, gjni.BandDescriptor.spacing))
- });
-
- if (env->IsInstanceOf(jConfig, gjni.FmBandConfig.clazz)) {
- auto& fm = config.ext.fm;
- fm.deemphasis = DeemphasisForRegion(region);
- fm.stereo = env->GetBooleanField(jConfig, gjni.FmBandConfig.stereo);
- fm.rds = RdsForRegion(env->GetBooleanField(jConfig, gjni.FmBandConfig.rds), region);
- fm.ta = env->GetBooleanField(jConfig, gjni.FmBandConfig.ta);
- fm.af = env->GetBooleanField(jConfig, gjni.FmBandConfig.af);
- fm.ea = env->GetBooleanField(jConfig, gjni.FmBandConfig.ea);
- } else if (env->IsInstanceOf(jConfig, gjni.AmBandConfig.clazz)) {
- auto& am = config.ext.am;
- am.stereo = env->GetBooleanField(jConfig, gjni.AmBandConfig.stereo);
- } else {
- ALOGE("Unexpected band config type");
- return {};
- }
-
- return config;
-}
-
-Direction DirectionToHal(bool directionDown) {
- return directionDown ? Direction::DOWN : Direction::UP;
-}
-
-static JavaRef<jobject> MetadataFromHal(JNIEnv *env, const hidl_vec<V1_0::MetaData> metadata) {
- ALOGV("MetadataFromHal()");
- EnvWrapper wrap(env);
-
- if (metadata.size() == 0) return nullptr;
-
- auto jMetadata = wrap(env->NewObject(gjni.RadioMetadata.clazz, gjni.RadioMetadata.cstor));
-
- for (auto& item : metadata) {
- jint key = static_cast<jint>(item.key);
- jint status = 0;
- switch (item.type) {
- case MetadataType::INT:
- ALOGV("metadata INT %d", key);
- status = env->CallIntMethod(jMetadata.get(), gjni.RadioMetadata.putIntFromNative,
- key, item.intValue);
- break;
- case MetadataType::TEXT: {
- ALOGV("metadata TEXT %d", key);
- auto value = wrap(env->NewStringUTF(item.stringValue.c_str()));
- status = env->CallIntMethod(jMetadata.get(), gjni.RadioMetadata.putStringFromNative,
- key, value.get());
- break;
- }
- case MetadataType::RAW: {
- ALOGV("metadata RAW %d", key);
- auto len = item.rawValue.size();
- if (len == 0) break;
- auto value = wrap(env->NewByteArray(len));
- if (value == nullptr) {
- ALOGE("Failed to allocate byte array of len %zu", len);
- break;
- }
- env->SetByteArrayRegion(value.get(), 0, len,
- reinterpret_cast<const jbyte*>(item.rawValue.data()));
- status = env->CallIntMethod(jMetadata.get(), gjni.RadioMetadata.putBitmapFromNative,
- key, value.get());
- break;
- }
- case MetadataType::CLOCK:
- ALOGV("metadata CLOCK %d", key);
- status = env->CallIntMethod(jMetadata.get(), gjni.RadioMetadata.putClockFromNative,
- key, item.clockValue.utcSecondsSinceEpoch,
- item.clockValue.timezoneOffsetInMinutes);
- break;
- default:
- ALOGW("invalid metadata type %d", item.type);
- }
- ALOGE_IF(status != 0, "Failed inserting metadata %d (of type %d)", key, item.type);
- }
-
- return jMetadata;
-}
-
-static JavaRef<jobject> ProgramInfoFromHal(JNIEnv *env, const V1_0::ProgramInfo &info10,
- const V1_1::ProgramInfo *info11) {
- ALOGV("ProgramInfoFromHal()");
- EnvWrapper wrap(env);
-
- auto jMetadata = MetadataFromHal(env, info10.metadata);
- auto jVendorExtension = info11 ?
- wrap(env->NewStringUTF(info11->vendorExension.c_str())) : nullptr;
-
- return wrap(env->NewObject(gjni.ProgramInfo.clazz, gjni.ProgramInfo.cstor, info10.channel,
- info10.subChannel, info10.tuned, info10.stereo, info10.digital, info10.signalStrength,
- jMetadata.get(), info11 ? info11->flags : 0, jVendorExtension.get()));
-}
-
-JavaRef<jobject> ProgramInfoFromHal(JNIEnv *env, const V1_0::ProgramInfo &info) {
- return ProgramInfoFromHal(env, info, nullptr);
-}
-
-JavaRef<jobject> ProgramInfoFromHal(JNIEnv *env, const V1_1::ProgramInfo &info) {
- return ProgramInfoFromHal(env, info.base, &info);
-}
-
-} // namespace convert
-} // namespace radio
-} // namespace server
-
-void register_android_server_radio_convert(JNIEnv *env) {
- using namespace server::radio::convert;
-
- auto bandConfigClass = FindClassOrDie(env, "android/hardware/radio/RadioManager$BandConfig");
- gjni.BandConfig.descriptor = GetFieldIDOrDie(env, bandConfigClass,
- "mDescriptor", "Landroid/hardware/radio/RadioManager$BandDescriptor;");
-
- auto fmBandConfigClass = FindClassOrDie(env,
- "android/hardware/radio/RadioManager$FmBandConfig");
- gjni.FmBandConfig.clazz = MakeGlobalRefOrDie(env, fmBandConfigClass);
- gjni.FmBandConfig.cstor = GetMethodIDOrDie(env, fmBandConfigClass,
- "<init>", "(IIIIIZZZZZ)V");
- gjni.FmBandConfig.stereo = GetFieldIDOrDie(env, fmBandConfigClass, "mStereo", "Z");
- gjni.FmBandConfig.rds = GetFieldIDOrDie(env, fmBandConfigClass, "mRds", "Z");
- gjni.FmBandConfig.ta = GetFieldIDOrDie(env, fmBandConfigClass, "mTa", "Z");
- gjni.FmBandConfig.af = GetFieldIDOrDie(env, fmBandConfigClass, "mAf", "Z");
- gjni.FmBandConfig.ea = GetFieldIDOrDie(env, fmBandConfigClass, "mEa", "Z");
-
- auto amBandConfigClass = FindClassOrDie(env,
- "android/hardware/radio/RadioManager$AmBandConfig");
- gjni.AmBandConfig.clazz = MakeGlobalRefOrDie(env, amBandConfigClass);
- gjni.AmBandConfig.cstor = GetMethodIDOrDie(env, amBandConfigClass, "<init>", "(IIIIIZ)V");
- gjni.AmBandConfig.stereo = GetFieldIDOrDie(env, amBandConfigClass, "mStereo", "Z");
-
- auto bandDescriptorClass = FindClassOrDie(env,
- "android/hardware/radio/RadioManager$BandDescriptor");
- gjni.BandDescriptor.region = GetFieldIDOrDie(env, bandDescriptorClass, "mRegion", "I");
- gjni.BandDescriptor.type = GetFieldIDOrDie(env, bandDescriptorClass, "mType", "I");
- gjni.BandDescriptor.lowerLimit = GetFieldIDOrDie(env, bandDescriptorClass, "mLowerLimit", "I");
- gjni.BandDescriptor.upperLimit = GetFieldIDOrDie(env, bandDescriptorClass, "mUpperLimit", "I");
- gjni.BandDescriptor.spacing = GetFieldIDOrDie(env, bandDescriptorClass, "mSpacing", "I");
-
- auto programInfoClass = FindClassOrDie(env, "android/hardware/radio/RadioManager$ProgramInfo");
- gjni.ProgramInfo.clazz = MakeGlobalRefOrDie(env, programInfoClass);
- gjni.ProgramInfo.cstor = GetMethodIDOrDie(env, programInfoClass, "<init>",
- "(IIZZZILandroid/hardware/radio/RadioMetadata;ILjava/lang/String;)V");
-
- auto radioMetadataClass = FindClassOrDie(env, "android/hardware/radio/RadioMetadata");
- gjni.RadioMetadata.clazz = MakeGlobalRefOrDie(env, radioMetadataClass);
- gjni.RadioMetadata.cstor = GetMethodIDOrDie(env, radioMetadataClass, "<init>", "()V");
- gjni.RadioMetadata.putIntFromNative = GetMethodIDOrDie(env, radioMetadataClass,
- "putIntFromNative", "(II)I");
- gjni.RadioMetadata.putStringFromNative = GetMethodIDOrDie(env, radioMetadataClass,
- "putStringFromNative", "(ILjava/lang/String;)I");
- gjni.RadioMetadata.putBitmapFromNative = GetMethodIDOrDie(env, radioMetadataClass,
- "putBitmapFromNative", "(I[B)I");
- gjni.RadioMetadata.putClockFromNative = GetMethodIDOrDie(env, radioMetadataClass,
- "putClockFromNative", "(IJI)I");
-
- auto runtimeExcClass = FindClassOrDie(env, "java/lang/RuntimeException");
- gjni.RuntimeException.clazz = MakeGlobalRefOrDie(env, runtimeExcClass);
- gjni.RuntimeException.cstor = GetMethodIDOrDie(env, runtimeExcClass, "<init>",
- "(Ljava/lang/String;)V");
-
- auto parcelableExcClass = FindClassOrDie(env, "android/os/ParcelableException");
- gjni.ParcelableException.clazz = MakeGlobalRefOrDie(env, parcelableExcClass);
- gjni.ParcelableException.cstor = GetMethodIDOrDie(env, parcelableExcClass, "<init>",
- "(Ljava/lang/Throwable;)V");
-}
-
-} // namespace android
diff --git a/services/core/jni/com_android_server_radio_convert.h b/services/core/jni/com_android_server_radio_convert.h
deleted file mode 100644
index 6f6774b..0000000
--- a/services/core/jni/com_android_server_radio_convert.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/**
- * Copyright (C) 2017 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.
- */
-
-#ifndef _ANDROID_SERVER_RADIO_CONVERT_H
-#define _ANDROID_SERVER_RADIO_CONVERT_H
-
-#include "JavaRef.h"
-#include "com_android_server_radio_types.h"
-
-#include <android/hardware/broadcastradio/1.1/types.h>
-#include <jni.h>
-
-namespace android {
-
-void register_android_server_radio_convert(JNIEnv *env);
-
-namespace server {
-namespace radio {
-namespace convert {
-
-namespace V1_0 = hardware::broadcastradio::V1_0;
-namespace V1_1 = hardware::broadcastradio::V1_1;
-
-JavaRef<jobject> BandConfigFromHal(JNIEnv *env, const V1_0::BandConfig &config, Region region);
-V1_0::BandConfig BandConfigToHal(JNIEnv *env, jobject jConfig, Region ®ion);
-
-V1_0::Direction DirectionToHal(bool directionDown);
-
-JavaRef<jobject> ProgramInfoFromHal(JNIEnv *env, const V1_0::ProgramInfo &info);
-JavaRef<jobject> ProgramInfoFromHal(JNIEnv *env, const V1_1::ProgramInfo &info);
-
-
-void ThrowParcelableRuntimeException(JNIEnv *env, const std::string& msg);
-
-// These three are only for internal use by template functions below.
-bool __ThrowIfFailedHidl(JNIEnv *env,
- const hardware::details::return_status &hidlResult);
-bool __ThrowIfFailed(JNIEnv *env, const V1_0::Result halResult);
-bool __ThrowIfFailed(JNIEnv *env, const V1_1::ProgramListResult halResult);
-
-template <typename T>
-bool ThrowIfFailed(JNIEnv *env, const hardware::Return<void> &hidlResult, const T halResult) {
- return __ThrowIfFailedHidl(env, hidlResult) || __ThrowIfFailed(env, halResult);
-}
-
-template <typename T>
-bool ThrowIfFailed(JNIEnv *env, const hardware::Return<T> &hidlResult) {
- return __ThrowIfFailedHidl(env, hidlResult) || __ThrowIfFailed(env, static_cast<T>(hidlResult));
-}
-
-} // namespace convert
-} // namespace radio
-} // namespace server
-} // namespace android
-
-#endif // _ANDROID_SERVER_RADIO_CONVERT_H
diff --git a/services/core/jni/com_android_server_radio_types.h b/services/core/jni/com_android_server_radio_types.h
deleted file mode 100644
index 36f7643..0000000
--- a/services/core/jni/com_android_server_radio_types.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/**
- * Copyright (C) 2017 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.
- */
-
-#ifndef _ANDROID_SERVER_RADIO_TYPES_H
-#define _ANDROID_SERVER_RADIO_TYPES_H
-
-#include <jni.h>
-
-namespace android {
-namespace server {
-namespace radio {
-
-/* Most of these enums are dereived from Java code, based at
- * frameworks/base/core/java/android/hardware/radio/RadioManager.java.
- */
-
-enum class HalRevision : jint {
- V1_0,
- V1_1,
-};
-
-// Keep in sync with STATUS_* constants from RadioManager.java.
-enum class Status : jint {
- OK = 0,
- ERROR = -0x80000000ll, // Integer.MIN_VALUE
- PERMISSION_DENIED = -1, // -EPERM
- NO_INIT = -19, // -ENODEV
- BAD_VALUE = -22, // -EINVAL
- DEAD_OBJECT = -32, // -EPIPE
- INVALID_OPERATION = -38, // -ENOSYS
- TIMED_OUT = -110, // -ETIMEDOUT
-};
-
-// Keep in sync with REGION_* constants from RadioManager.java.
-enum class Region : jint {
- ITU_1 = 0,
- ITU_2 = 1,
- OIRT = 2,
- JAPAN = 3,
- KOREA = 4,
-};
-
-} // namespace radio
-} // namespace server
-} // namespace android
-
-#endif // _ANDROID_SERVER_RADIO_TYPES_H
diff --git a/services/core/jni/com_android_server_tv_TvInputHal.cpp b/services/core/jni/com_android_server_tv_TvInputHal.cpp
index 78c0fa7..93c4829 100644
--- a/services/core/jni/com_android_server_tv_TvInputHal.cpp
+++ b/services/core/jni/com_android_server_tv_TvInputHal.cpp
@@ -21,7 +21,7 @@
#include "android_os_MessageQueue.h"
#include "android_runtime/AndroidRuntime.h"
#include "android_runtime/android_view_Surface.h"
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "jni.h"
#include <android/hardware/tv/input/1.0/ITvInputCallback.h>
diff --git a/services/core/jni/com_android_server_tv_TvUinputBridge.cpp b/services/core/jni/com_android_server_tv_TvUinputBridge.cpp
index de115c8..980922a 100644
--- a/services/core/jni/com_android_server_tv_TvUinputBridge.cpp
+++ b/services/core/jni/com_android_server_tv_TvUinputBridge.cpp
@@ -20,7 +20,7 @@
#include "jni.h"
#include <android_runtime/AndroidRuntime.h>
-#include <ScopedUtfChars.h>
+#include <nativehelper/ScopedUtfChars.h>
#include <android/keycodes.h>
#include <utils/BitSet.h>
diff --git a/services/core/jni/com_android_server_vr_VrManagerService.cpp b/services/core/jni/com_android_server_vr_VrManagerService.cpp
index 9052697..c675080 100644
--- a/services/core/jni/com_android_server_vr_VrManagerService.cpp
+++ b/services/core/jni/com_android_server_vr_VrManagerService.cpp
@@ -18,7 +18,7 @@
#include <android_runtime/AndroidRuntime.h>
#include <jni.h>
-#include <JNIHelp.h>
+#include <nativehelper/JNIHelp.h>
#include <android/hardware/vr/1.0/IVr.h>
#include <utils/Errors.h>
diff --git a/services/core/jni/onload.cpp b/services/core/jni/onload.cpp
index c3617e0..e8ef168 100644
--- a/services/core/jni/onload.cpp
+++ b/services/core/jni/onload.cpp
@@ -14,13 +14,13 @@
* limitations under the License.
*/
-#include "JNIHelp.h"
+#include <nativehelper/JNIHelp.h>
#include "jni.h"
#include "utils/Log.h"
#include "utils/misc.h"
-#include "com_android_server_radio_RadioService.h"
-#include "com_android_server_radio_Tuner.h"
+#include "BroadcastRadio/BroadcastRadioService.h"
+#include "BroadcastRadio/Tuner.h"
namespace android {
int register_android_server_AlarmManagerService(JNIEnv* env);
@@ -67,8 +67,8 @@
}
ALOG_ASSERT(env, "Could not retrieve the env!");
- register_android_server_radio_RadioService(env);
- register_android_server_radio_Tuner(vm, env);
+ register_android_server_broadcastradio_BroadcastRadioService(env);
+ register_android_server_broadcastradio_Tuner(vm, env);
register_android_server_PowerManagerService(env);
register_android_server_SerialService(env);
register_android_server_InputApplicationHandle(env);
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 73bb13a..72a832a 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -2020,12 +2020,10 @@
private void setDeviceOwnerSystemPropertyLocked() {
final boolean deviceProvisioned =
mInjector.settingsGlobalGetInt(Settings.Global.DEVICE_PROVISIONED, 0) != 0;
+ final boolean hasDeviceOwner = mOwners.hasDeviceOwner();
// If the device is not provisioned and there is currently no device owner, do not set the
- // read-only system property yet, since Device owner may still be provisioned. For Wear
- // devices, if there is already a device owner then it's OK to set the property to true now,
- // regardless the provision state.
- final boolean isWatchWithDeviceOwner = mIsWatch && mOwners.hasDeviceOwner();
- if (!isWatchWithDeviceOwner && !deviceProvisioned) {
+ // read-only system property yet, since Device owner may still be provisioned.
+ if (!hasDeviceOwner && !deviceProvisioned) {
return;
}
// Still at the first stage of CryptKeeper double bounce, mOwners.hasDeviceOwner is
@@ -2034,20 +2032,16 @@
return;
}
- if (!TextUtils.isEmpty(mInjector.systemPropertiesGet(PROPERTY_DEVICE_OWNER_PRESENT))) {
+ if (!mInjector.systemPropertiesGet(PROPERTY_DEVICE_OWNER_PRESENT, "").isEmpty()) {
Slog.w(LOG_TAG, "Trying to set ro.device_owner, but it has already been set?");
} else {
- if (mOwners.hasDeviceOwner()) {
- mInjector.systemPropertiesSet(PROPERTY_DEVICE_OWNER_PRESENT, "true");
- Slog.i(LOG_TAG, "Set ro.device_owner property to true");
+ final String value = Boolean.toString(hasDeviceOwner);
+ mInjector.systemPropertiesSet(PROPERTY_DEVICE_OWNER_PRESENT, value);
+ Slog.i(LOG_TAG, "Set ro.device_owner property to " + value);
- if (mInjector.securityLogGetLoggingEnabledProperty()) {
- mSecurityLogMonitor.start();
- maybePauseDeviceWideLoggingLocked();
- }
- } else {
- mInjector.systemPropertiesSet(PROPERTY_DEVICE_OWNER_PRESENT, "false");
- Slog.i(LOG_TAG, "Set ro.device_owner property to false");
+ if (hasDeviceOwner && mInjector.securityLogGetLoggingEnabledProperty()) {
+ mSecurityLogMonitor.start();
+ maybePauseDeviceWideLoggingLocked();
}
}
}
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index a902a19..61267ef 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -55,7 +55,6 @@
import com.android.internal.logging.MetricsLogger;
import com.android.internal.notification.SystemNotificationChannels;
import com.android.internal.os.BinderInternal;
-import com.android.internal.os.SamplingProfilerIntegration;
import com.android.internal.util.EmergencyAffordanceManager;
import com.android.internal.util.ConcurrentUtils;
import com.android.internal.widget.ILockSettings;
@@ -98,7 +97,7 @@
import com.android.server.policy.PhoneWindowManager;
import com.android.server.power.PowerManagerService;
import com.android.server.power.ShutdownThread;
-import com.android.server.radio.RadioService;
+import com.android.server.broadcastradio.BroadcastRadioService;
import com.android.server.restrictions.RestrictionsManagerService;
import com.android.server.security.KeyAttestationApplicationIdProviderService;
import com.android.server.security.KeyChainSystemService;
@@ -171,6 +170,8 @@
"com.android.server.wifi.aware.WifiAwareService";
private static final String WIFI_P2P_SERVICE_CLASS =
"com.android.server.wifi.p2p.WifiP2pService";
+ private static final String LOWPAN_SERVICE_CLASS =
+ "com.android.server.lowpan.LowpanService";
private static final String ETHERNET_SERVICE_CLASS =
"com.android.server.ethernet.EthernetService";
private static final String JOB_SCHEDULER_SERVICE_CLASS =
@@ -189,6 +190,8 @@
"com.google.android.clockwork.connectivity.WearConnectivityService";
private static final String WEAR_DISPLAY_SERVICE_CLASS =
"com.google.android.clockwork.display.WearDisplayService";
+ private static final String WEAR_LEFTY_SERVICE_CLASS =
+ "com.google.android.clockwork.lefty.WearLeftyService";
private static final String WEAR_TIME_SERVICE_CLASS =
"com.google.android.clockwork.time.WearTimeService";
private static final String ACCOUNT_SERVICE_CLASS =
@@ -329,18 +332,6 @@
// the property. http://b/11463182
SystemProperties.set("persist.sys.dalvik.vm.lib.2", VMRuntime.getRuntime().vmLibrary());
- // Enable the sampling profiler.
- if (SamplingProfilerIntegration.isEnabled()) {
- SamplingProfilerIntegration.start();
- mProfilerSnapshotTimer = new Timer();
- mProfilerSnapshotTimer.schedule(new TimerTask() {
- @Override
- public void run() {
- SamplingProfilerIntegration.writeSnapshot("system_server", null);
- }
- }, SNAPSHOT_INTERVAL, SNAPSHOT_INTERVAL);
- }
-
// Mmmmmm... more memory!
VMRuntime.getRuntime().clearGrowthLimit();
@@ -709,14 +700,11 @@
false);
boolean disableTextServices = SystemProperties.getBoolean("config.disable_textservices",
false);
- boolean disableSamplingProfiler = SystemProperties.getBoolean("config.disable_samplingprof",
- false);
boolean disableConsumerIr = SystemProperties.getBoolean("config.disable_consumerir", false);
boolean disableVrManager = SystemProperties.getBoolean("config.disable_vrmanager", false);
boolean disableCameraService = SystemProperties.getBoolean("config.disable_cameraservice",
false);
- // TODO(b/36863239): Remove when transitioned from native service.
- boolean enableRadioService = SystemProperties.getBoolean("config.enable_java_radio", false);
+ boolean enableLeftyService = SystemProperties.getBoolean("config.enable_lefty", false);
boolean isEmulator = SystemProperties.get("ro.kernel.qemu").equals("1");
@@ -1095,6 +1083,13 @@
traceEnd();
}
+ if (context.getPackageManager().hasSystemFeature(
+ PackageManager.FEATURE_LOWPAN)) {
+ traceBeginAndSlog("StartLowpan");
+ mSystemServiceManager.startService(LOWPAN_SERVICE_CLASS);
+ traceEnd();
+ }
+
if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_ETHERNET) ||
mPackageManager.hasSystemFeature(PackageManager.FEATURE_USB_HOST)) {
traceBeginAndSlog("StartEthernet");
@@ -1199,8 +1194,13 @@
traceEnd();
}
- if (!disableNonCoreServices && context.getResources().getBoolean(
- R.bool.config_enableUpdateableTimeZoneRules)) {
+ // timezone.RulesManagerService will prevent a device starting up if the chain of trust
+ // required for safe time zone updates might be broken. RuleManagerService cannot do
+ // this check when mOnlyCore == true, so we don't enable the service in this case.
+ final boolean startRulesManagerService =
+ !mOnlyCore && context.getResources().getBoolean(
+ R.bool.config_enableUpdateableTimeZoneRules);
+ if (startRulesManagerService) {
traceBeginAndSlog("StartTimeZoneRulesManagerService");
mSystemServiceManager.startService(TIME_ZONE_RULES_MANAGER_SERVICE_CLASS);
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
@@ -1210,10 +1210,9 @@
mSystemServiceManager.startService(AudioService.Lifecycle.class);
traceEnd();
- if (enableRadioService &&
- mPackageManager.hasSystemFeature(PackageManager.FEATURE_RADIO)) {
- traceBeginAndSlog("StartRadioService");
- mSystemServiceManager.startService(RadioService.class);
+ if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_BROADCAST_RADIO)) {
+ traceBeginAndSlog("StartBroadcastRadioService");
+ mSystemServiceManager.startService(BroadcastRadioService.class);
traceEnd();
}
@@ -1345,21 +1344,6 @@
}
traceEnd();
- if (!disableSamplingProfiler) {
- traceBeginAndSlog("StartSamplingProfilerService");
- try {
- // need to add this service even if SamplingProfilerIntegration.isEnabled()
- // is false, because it is this service that detects system property change and
- // turns on SamplingProfilerIntegration. Plus, when sampling profiler doesn't work,
- // there is little overhead for running this service.
- ServiceManager.addService("samplingprofiler",
- new SamplingProfilerService(context));
- } catch (Throwable e) {
- reportWtf("starting SamplingProfiler Service", e);
- }
- traceEnd();
- }
-
if (!disableNetwork && !disableNetworkTime) {
traceBeginAndSlog("StartNetworkTimeUpdateService");
try {
@@ -1520,6 +1504,12 @@
mSystemServiceManager.startService(WEAR_DISPLAY_SERVICE_CLASS);
mSystemServiceManager.startService(WEAR_TIME_SERVICE_CLASS);
traceEnd();
+
+ if (enableLeftyService) {
+ traceBeginAndSlog("StartWearLeftyService");
+ mSystemServiceManager.startService(WEAR_LEFTY_SERVICE_CLASS);
+ traceEnd();
+ }
}
}
diff --git a/services/net/OWNERS b/services/net/OWNERS
new file mode 100644
index 0000000..fa26997
--- /dev/null
+++ b/services/net/OWNERS
@@ -0,0 +1,7 @@
+set noparent
+
+per-file Android.mk = build.master@android.com
+
+ek@google.com
+hugobenichi@google.com
+lorenzo@google.com
diff --git a/services/net/java/android/net/ip/IpManager.java b/services/net/java/android/net/ip/IpManager.java
index 0231991..46c1292 100644
--- a/services/net/java/android/net/ip/IpManager.java
+++ b/services/net/java/android/net/ip/IpManager.java
@@ -23,6 +23,7 @@
import android.net.DhcpResults;
import android.net.INetd;
import android.net.InterfaceConfiguration;
+import android.net.IpPrefix;
import android.net.LinkAddress;
import android.net.LinkProperties.ProvisioningChange;
import android.net.LinkProperties;
@@ -35,6 +36,7 @@
import android.net.metrics.IpConnectivityLog;
import android.net.metrics.IpManagerEvent;
import android.net.util.MultinetworkPolicyTracker;
+import android.net.util.NetworkConstants;
import android.net.util.SharedLog;
import android.os.INetworkManagementService;
import android.os.Message;
@@ -52,17 +54,25 @@
import com.android.internal.R;
import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.IState;
+import com.android.internal.util.Preconditions;
import com.android.internal.util.State;
import com.android.internal.util.StateMachine;
import com.android.server.net.NetlinkTracker;
import java.io.FileDescriptor;
import java.io.PrintWriter;
+import java.net.Inet4Address;
+import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
+import java.util.Collection;
+import java.util.HashSet;
import java.util.Objects;
+import java.util.Set;
import java.util.StringJoiner;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
/**
@@ -309,6 +319,11 @@
return this;
}
+ public Builder withInitialConfiguration(InitialConfiguration initialConfig) {
+ mConfig.mInitialConfig = initialConfig;
+ return this;
+ }
+
public Builder withStaticConfiguration(StaticIpConfiguration staticConfig) {
mConfig.mStaticIpConfig = staticConfig;
return this;
@@ -343,18 +358,20 @@
/* package */ boolean mEnableIPv6 = true;
/* package */ boolean mUsingIpReachabilityMonitor = true;
/* package */ int mRequestedPreDhcpActionMs;
+ /* package */ InitialConfiguration mInitialConfig;
/* package */ StaticIpConfiguration mStaticIpConfig;
/* package */ ApfCapabilities mApfCapabilities;
/* package */ int mProvisioningTimeoutMs = DEFAULT_TIMEOUT_MS;
/* package */ int mIPv6AddrGenMode = INetd.IPV6_ADDR_GEN_MODE_STABLE_PRIVACY;
- public ProvisioningConfiguration() {}
+ public ProvisioningConfiguration() {} // used by Builder
public ProvisioningConfiguration(ProvisioningConfiguration other) {
mEnableIPv4 = other.mEnableIPv4;
mEnableIPv6 = other.mEnableIPv6;
mUsingIpReachabilityMonitor = other.mUsingIpReachabilityMonitor;
mRequestedPreDhcpActionMs = other.mRequestedPreDhcpActionMs;
+ mInitialConfig = InitialConfiguration.copy(other.mInitialConfig);
mStaticIpConfig = other.mStaticIpConfig;
mApfCapabilities = other.mApfCapabilities;
mProvisioningTimeoutMs = other.mProvisioningTimeoutMs;
@@ -367,12 +384,124 @@
.add("mEnableIPv6: " + mEnableIPv6)
.add("mUsingIpReachabilityMonitor: " + mUsingIpReachabilityMonitor)
.add("mRequestedPreDhcpActionMs: " + mRequestedPreDhcpActionMs)
+ .add("mInitialConfig: " + mInitialConfig)
.add("mStaticIpConfig: " + mStaticIpConfig)
.add("mApfCapabilities: " + mApfCapabilities)
.add("mProvisioningTimeoutMs: " + mProvisioningTimeoutMs)
.add("mIPv6AddrGenMode: " + mIPv6AddrGenMode)
.toString();
}
+
+ public boolean isValid() {
+ return (mInitialConfig == null) || mInitialConfig.isValid();
+ }
+ }
+
+ public static class InitialConfiguration {
+ public final Set<LinkAddress> ipAddresses = new HashSet<>();
+ public final Set<IpPrefix> directlyConnectedRoutes = new HashSet<>();
+ public final Set<InetAddress> dnsServers = new HashSet<>();
+ public Inet4Address gateway; // WiFi legacy behavior with static ipv4 config
+
+ public static InitialConfiguration copy(InitialConfiguration config) {
+ if (config == null) {
+ return null;
+ }
+ InitialConfiguration configCopy = new InitialConfiguration();
+ configCopy.ipAddresses.addAll(config.ipAddresses);
+ configCopy.directlyConnectedRoutes.addAll(config.directlyConnectedRoutes);
+ configCopy.dnsServers.addAll(config.dnsServers);
+ return configCopy;
+ }
+
+ @Override
+ public String toString() {
+ return String.format(
+ "InitialConfiguration(IPs: {%s}, prefixes: {%s}, DNS: {%s}, v4 gateway: %s)",
+ join(", ", ipAddresses), join(", ", directlyConnectedRoutes),
+ join(", ", dnsServers), gateway);
+ }
+
+ public boolean isValid() {
+ // For every IP address, there must be at least one prefix containing that address.
+ for (LinkAddress addr : ipAddresses) {
+ if (!any(directlyConnectedRoutes, (p) -> p.contains(addr.getAddress()))) {
+ return false;
+ }
+ }
+ // For every dns server, there must be at least one prefix containing that address.
+ for (InetAddress addr : dnsServers) {
+ if (!any(directlyConnectedRoutes, (p) -> p.contains(addr))) {
+ return false;
+ }
+ }
+ // All IPv6 LinkAddresses have an RFC7421-suitable prefix length
+ // (read: compliant with RFC4291#section2.5.4).
+ if (any(ipAddresses, not(InitialConfiguration::isPrefixLengthCompliant))) {
+ return false;
+ }
+ // If directlyConnectedRoutes contains an IPv6 default route
+ // then ipAddresses MUST contain at least one non-ULA GUA.
+ if (any(directlyConnectedRoutes, InitialConfiguration::isIPv6DefaultRoute)
+ && all(ipAddresses, not(InitialConfiguration::isIPv6GUA))) {
+ return false;
+ }
+ // The prefix length of routes in directlyConnectedRoutes be within reasonable
+ // bounds for IPv6: /48-/64 just as we’d accept in RIOs.
+ if (any(directlyConnectedRoutes, not(InitialConfiguration::isPrefixLengthCompliant))) {
+ return false;
+ }
+ // There no more than one IPv4 address
+ if (ipAddresses.stream().filter(Inet4Address.class::isInstance).count() > 1) {
+ return false;
+ }
+
+ return true;
+ }
+
+ private static boolean isPrefixLengthCompliant(LinkAddress addr) {
+ return (addr.getAddress() instanceof Inet4Address)
+ || isCompliantIPv6PrefixLength(addr.getPrefixLength());
+ }
+
+ private static boolean isPrefixLengthCompliant(IpPrefix prefix) {
+ return (prefix.getAddress() instanceof Inet4Address)
+ || isCompliantIPv6PrefixLength(prefix.getPrefixLength());
+ }
+
+ private static boolean isCompliantIPv6PrefixLength(int prefixLength) {
+ return (NetworkConstants.RFC6177_MIN_PREFIX_LENGTH <= prefixLength)
+ && (prefixLength <= NetworkConstants.RFC7421_PREFIX_LENGTH);
+ }
+
+ private static boolean isIPv6DefaultRoute(IpPrefix prefix) {
+ return prefix.getAddress().equals(Inet6Address.ANY);
+ }
+
+ private static boolean isIPv6GUA(LinkAddress addr) {
+ return (addr.getAddress() instanceof Inet6Address) && addr.isGlobalPreferred();
+ }
+
+ private static <T> boolean any(Iterable<T> coll, Predicate<T> fn) {
+ for (T t : coll) {
+ if (fn.test(t)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private static <T> boolean all(Iterable<T> coll, Predicate<T> fn) {
+ return !any(coll, not(fn));
+ }
+
+ private static <T> Predicate<T> not(Predicate<T> fn) {
+ return (t) -> !fn.test(t);
+ }
+
+ private static <T> String join(String delimiter, Collection<T> coll) {
+ return coll.stream().map(Object::toString).collect(Collectors.joining(delimiter));
+ }
}
public static final String DUMP_ARG = "ipmanager";
@@ -437,8 +566,7 @@
private boolean mMulticastFiltering;
private long mStartTimeMillis;
- public IpManager(Context context, String ifName, Callback callback)
- throws IllegalArgumentException {
+ public IpManager(Context context, String ifName, Callback callback) {
this(context, ifName, callback, INetworkManagementService.Stub.asInterface(
ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE)));
}
@@ -447,7 +575,7 @@
* An expanded constructor, useful for dependency injection.
*/
public IpManager(Context context, String ifName, Callback callback,
- INetworkManagementService nwService) throws IllegalArgumentException {
+ INetworkManagementService nwService) {
super(IpManager.class.getSimpleName() + "." + ifName);
mTag = getName();
@@ -564,6 +692,11 @@
}
public void startProvisioning(ProvisioningConfiguration req) {
+ if (!req.isValid()) {
+ doImmediateProvisioningFailure(IpManagerEvent.ERROR_INVALID_PROVISIONING);
+ return;
+ }
+
getNetworkInterface();
mCallback.setNeighborDiscoveryOffload(true);
@@ -716,7 +849,6 @@
return shouldLog;
}
- // TODO: Migrate all Log.e(...) to logError(...).
private void logError(String fmt, Object... args) {
final String msg = "ERROR " + String.format(fmt, args);
Log.e(mTag, msg);
@@ -1037,7 +1169,7 @@
}
private void doImmediateProvisioningFailure(int failureType) {
- if (DBG) { Log.e(mTag, "onProvisioningFailure(): " + failureType); }
+ logError("onProvisioningFailure(): %s", failureType);
recordMetric(failureType);
mCallback.onProvisioningFailure(new LinkProperties(mLinkProperties));
}
@@ -1173,7 +1305,7 @@
case DhcpClient.CMD_ON_QUIT:
// Everything is already stopped.
- Log.e(mTag, "Unexpected CMD_ON_QUIT (already stopped).");
+ logError("Unexpected CMD_ON_QUIT (already stopped).");
break;
default:
@@ -1383,7 +1515,7 @@
break;
case CMD_START:
- Log.e(mTag, "ALERT: START received in StartedState. Please fix caller.");
+ logError("ALERT: START received in StartedState. Please fix caller.");
break;
case CMD_CONFIRM:
@@ -1482,13 +1614,13 @@
handleIPv4Failure();
break;
default:
- Log.e(mTag, "Unknown CMD_POST_DHCP_ACTION status:" + msg.arg1);
+ logError("Unknown CMD_POST_DHCP_ACTION status: %s", msg.arg1);
}
break;
case DhcpClient.CMD_ON_QUIT:
// DHCPv4 quit early for some reason.
- Log.e(mTag, "Unexpected CMD_ON_QUIT.");
+ logError("Unexpected CMD_ON_QUIT.");
mDhcpClient = null;
break;
diff --git a/services/net/java/android/net/util/NetworkConstants.java b/services/net/java/android/net/util/NetworkConstants.java
index a012e0c..9b3bc3f 100644
--- a/services/net/java/android/net/util/NetworkConstants.java
+++ b/services/net/java/android/net/util/NetworkConstants.java
@@ -102,6 +102,7 @@
public static final int IPV6_ADDR_LEN = 16;
public static final int IPV6_MIN_MTU = 1280;
public static final int RFC7421_PREFIX_LENGTH = 64;
+ public static final int RFC6177_MIN_PREFIX_LENGTH = 48;
/**
* ICMPv6 constants.
diff --git a/services/print/java/com/android/server/print/PrintManagerService.java b/services/print/java/com/android/server/print/PrintManagerService.java
index 3ec8380..6c417a9 100644
--- a/services/print/java/com/android/server/print/PrintManagerService.java
+++ b/services/print/java/com/android/server/print/PrintManagerService.java
@@ -263,6 +263,8 @@
Preconditions.checkFlagsArgument(selectionFlags,
PrintManager.DISABLED_SERVICES | PrintManager.ENABLED_SERVICES);
+ mContext.enforceCallingOrSelfPermission(
+ android.Manifest.permission.READ_PRINT_SERVICES, null);
final int resolvedUserId = resolveCallingUserEnforcingPermissions(userId);
final UserState userState;
synchronized (mLock) {
@@ -316,6 +318,8 @@
@Override
public List<RecommendationInfo> getPrintServiceRecommendations(int userId) {
+ mContext.enforceCallingOrSelfPermission(
+ android.Manifest.permission.READ_PRINT_SERVICE_RECOMMENDATIONS, null);
final int resolvedUserId = resolveCallingUserEnforcingPermissions(userId);
final UserState userState;
synchronized (mLock) {
@@ -538,6 +542,8 @@
int userId) throws RemoteException {
listener = Preconditions.checkNotNull(listener);
+ mContext.enforceCallingOrSelfPermission(android.Manifest.permission.READ_PRINT_SERVICES,
+ null);
final int resolvedUserId = resolveCallingUserEnforcingPermissions(userId);
final UserState userState;
synchronized (mLock) {
@@ -560,6 +566,8 @@
int userId) {
listener = Preconditions.checkNotNull(listener);
+ mContext.enforceCallingOrSelfPermission(android.Manifest.permission.READ_PRINT_SERVICES,
+ null);
final int resolvedUserId = resolveCallingUserEnforcingPermissions(userId);
final UserState userState;
synchronized (mLock) {
@@ -583,6 +591,8 @@
throws RemoteException {
listener = Preconditions.checkNotNull(listener);
+ mContext.enforceCallingOrSelfPermission(
+ android.Manifest.permission.READ_PRINT_SERVICE_RECOMMENDATIONS, null);
final int resolvedUserId = resolveCallingUserEnforcingPermissions(userId);
final UserState userState;
synchronized (mLock) {
@@ -605,6 +615,8 @@
IRecommendationsChangeListener listener, int userId) {
listener = Preconditions.checkNotNull(listener);
+ mContext.enforceCallingOrSelfPermission(
+ android.Manifest.permission.READ_PRINT_SERVICE_RECOMMENDATIONS, null);
final int resolvedUserId = resolveCallingUserEnforcingPermissions(userId);
final UserState userState;
synchronized (mLock) {
@@ -888,12 +900,12 @@
private int resolveCallingAppEnforcingPermissions(int appId) {
final int callingUid = Binder.getCallingUid();
- if (callingUid == 0 || callingUid == Process.SYSTEM_UID
- || callingUid == Process.SHELL_UID) {
+ if (callingUid == 0) {
return appId;
}
final int callingAppId = UserHandle.getAppId(callingUid);
- if (appId == callingAppId) {
+ if (appId == callingAppId || callingAppId == Process.SHELL_UID
+ || callingAppId == Process.SYSTEM_UID) {
return appId;
}
if (mContext.checkCallingPermission(
diff --git a/services/print/java/com/android/server/print/RemotePrintSpooler.java b/services/print/java/com/android/server/print/RemotePrintSpooler.java
index f4c9c86..abd2244 100644
--- a/services/print/java/com/android/server/print/RemotePrintSpooler.java
+++ b/services/print/java/com/android/server/print/RemotePrintSpooler.java
@@ -72,7 +72,7 @@
private static final boolean DEBUG = false;
private static final long BIND_SPOOLER_SERVICE_TIMEOUT =
- ("eng".equals(Build.TYPE)) ? 120000 : 10000;
+ (Build.IS_ENG) ? 120000 : 10000;
private final Object mLock = new Object();
diff --git a/services/profile-classes b/services/profile-classes
deleted file mode 100644
index a2189bc..0000000
--- a/services/profile-classes
+++ /dev/null
@@ -1,7261 +0,0 @@
-Landroid/accessibilityservice/AccessibilityServiceInfo;
-Landroid/accessibilityservice/AccessibilityServiceInfo$1;
-Landroid/accessibilityservice/IAccessibilityServiceClient;
-Landroid/accessibilityservice/IAccessibilityServiceConnection;
-Landroid/accessibilityservice/IAccessibilityServiceConnection$Stub;
-Landroid/accounts/Account;
-Landroid/accounts/Account$1;
-Landroid/accounts/AccountAndUser;
-Landroid/accounts/AccountManager;
-Landroid/accounts/AccountManager$1;
-Landroid/accounts/AccountManagerInternal;
-Landroid/accounts/AccountManagerInternal$OnAppPermissionChangeListener;
-Landroid/accounts/AuthenticatorDescription;
-Landroid/accounts/AuthenticatorDescription$1;
-Landroid/accounts/IAccountAuthenticator;
-Landroid/accounts/IAccountAuthenticatorResponse;
-Landroid/accounts/IAccountAuthenticatorResponse$Stub;
-Landroid/accounts/IAccountAuthenticator$Stub;
-Landroid/accounts/IAccountAuthenticator$Stub$Proxy;
-Landroid/accounts/IAccountManager;
-Landroid/accounts/IAccountManagerResponse;
-Landroid/accounts/IAccountManagerResponse$Stub;
-Landroid/accounts/IAccountManagerResponse$Stub$Proxy;
-Landroid/accounts/IAccountManager$Stub;
-Landroid/animation/AnimationHandler;
-Landroid/animation/AnimationHandler$1;
-Landroid/animation/AnimationHandler$AnimationFrameCallback;
-Landroid/animation/AnimationHandler$AnimationFrameCallbackProvider;
-Landroid/animation/AnimationHandler$MyFrameCallbackProvider;
-Landroid/animation/Animator;
-Landroid/animation/Animator$AnimatorListener;
-Landroid/animation/Animator$AnimatorPauseListener;
-Landroid/animation/AnimatorListenerAdapter;
-Landroid/animation/ArgbEvaluator;
-Landroid/animation/FloatEvaluator;
-Landroid/animation/FloatKeyframeSet;
-Landroid/animation/IntEvaluator;
-Landroid/animation/Keyframe;
-Landroid/animation/Keyframe$FloatKeyframe;
-Landroid/animation/Keyframe$ObjectKeyframe;
-Landroid/animation/Keyframes;
-Landroid/animation/KeyframeSet;
-Landroid/animation/Keyframes$FloatKeyframes;
-Landroid/animation/LayoutTransition$TransitionListener;
-Landroid/animation/ObjectAnimator;
-Landroid/animation/PropertyValuesHolder;
-Landroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;
-Landroid/animation/PropertyValuesHolder$PropertyValues;
-Landroid/animation/RectEvaluator;
-Landroid/animation/TimeInterpolator;
-Landroid/animation/TypeEvaluator;
-Landroid/animation/ValueAnimator;
-Landroid/animation/ValueAnimator$AnimatorUpdateListener;
-Landroid/app/ActionBar$LayoutParams;
-Landroid/app/Activity;
-Landroid/app/ActivityManager;
-Landroid/app/ActivityManager$1;
-Landroid/app/ActivityManagerInternal;
-Landroid/app/ActivityManagerInternal$SleepToken;
-Landroid/app/ActivityManager$MemoryInfo;
-Landroid/app/ActivityManager$MemoryInfo$1;
-Landroid/app/ActivityManager$OnUidImportanceListener;
-Landroid/app/ActivityManager$RecentTaskInfo;
-Landroid/app/ActivityManager$RecentTaskInfo$1;
-Landroid/app/ActivityManager$RunningAppProcessInfo;
-Landroid/app/ActivityManager$RunningAppProcessInfo$1;
-Landroid/app/ActivityManager$RunningServiceInfo;
-Landroid/app/ActivityManager$RunningServiceInfo$1;
-Landroid/app/ActivityManager$RunningTaskInfo;
-Landroid/app/ActivityManager$RunningTaskInfo$1;
-Landroid/app/ActivityManager$StackId;
-Landroid/app/ActivityManager$StackInfo;
-Landroid/app/ActivityManager$StackInfo$1;
-Landroid/app/ActivityManager$TaskDescription;
-Landroid/app/ActivityManager$TaskDescription$1;
-Landroid/app/ActivityManager$TaskSnapshot;
-Landroid/app/ActivityManager$TaskSnapshot$1;
-Landroid/app/ActivityManager$TaskThumbnail;
-Landroid/app/ActivityManager$TaskThumbnailInfo;
-Landroid/app/ActivityManager$TaskThumbnailInfo$1;
-Landroid/app/ActivityManager$UidObserver;
-Landroid/app/ActivityOptions;
-Landroid/app/ActivityThread;
-Landroid/app/ActivityThread$3;
-Landroid/app/ActivityThread$ApplicationThread;
-Landroid/app/ActivityThread$BindServiceData;
-Landroid/app/ActivityThread$ContextCleanupInfo;
-Landroid/app/ActivityThread$CreateServiceData;
-Landroid/app/ActivityThread$DropBoxReporter;
-Landroid/app/ActivityThread$DumpComponentInfo;
-Landroid/app/ActivityThread$GcIdler;
-Landroid/app/ActivityThread$H;
-Landroid/app/ActivityThread$Profiler;
-Landroid/app/ActivityThread$ProviderClientRecord;
-Landroid/app/ActivityThread$ProviderKey;
-Landroid/app/ActivityThread$ProviderRefCount;
-Landroid/app/ActivityThread$ReceiverData;
-Landroid/app/ActivityThread$ServiceArgsData;
-Landroid/app/admin/DevicePolicyManager;
-Landroid/app/admin/DevicePolicyManagerInternal;
-Landroid/app/admin/DevicePolicyManagerInternal$OnCrossProfileWidgetProvidersChangeListener;
-Landroid/app/admin/IDevicePolicyManager;
-Landroid/app/admin/IDevicePolicyManager$Stub;
-Landroid/app/admin/PasswordMetrics;
-Landroid/app/admin/PasswordMetrics$1;
-Landroid/app/admin/SecurityLog;
-Landroid/app/admin/SecurityLog$SecurityEvent;
-Landroid/app/admin/SecurityLog$SecurityEvent$1;
-Landroid/app/admin/SystemUpdateInfo;
-Landroid/app/admin/SystemUpdatePolicy;
-Landroid/app/AlarmManager;
-Landroid/app/AlarmManager$AlarmClockInfo;
-Landroid/app/AlarmManager$ListenerWrapper;
-Landroid/app/AlarmManager$OnAlarmListener;
-Landroid/app/AppGlobals;
-Landroid/app/Application;
-Landroid/app/ApplicationErrorReport$CrashInfo;
-Landroid/app/ApplicationErrorReport$ParcelableCrashInfo;
-Landroid/app/ApplicationLoaders;
-Landroid/app/ApplicationPackageManager;
-Landroid/app/ApplicationPackageManager$OnPermissionsChangeListenerDelegate;
-Landroid/app/ApplicationPackageManager$ResourceName;
-Landroid/app/AppOpsManager;
-Landroid/app/AppOpsManager$1;
-Landroid/app/AppOpsManager$OnOpChangedInternalListener;
-Landroid/app/AppOpsManager$OnOpChangedListener;
-Landroid/app/AppOpsManager$OpEntry;
-Landroid/app/AppOpsManager$OpEntry$1;
-Landroid/app/AppOpsManager$PackageOps;
-Landroid/app/AppOpsManager$PackageOps$1;
-Landroid/app/assist/AssistContent;
-Landroid/app/assist/AssistContent$1;
-Landroid/app/assist/AssistStructure;
-Landroid/app/assist/AssistStructure$1;
-Landroid/app/AutomaticZenRule;
-Landroid/app/backup/BackupAgent;
-Landroid/app/backup/BackupDataInput;
-Landroid/app/backup/BackupDataInput$EntityHeader;
-Landroid/app/backup/BackupDataOutput;
-Landroid/app/backup/BackupHelper;
-Landroid/app/backup/BackupHelperDispatcher;
-Landroid/app/backup/BackupHelperDispatcher$Header;
-Landroid/app/backup/BackupManager;
-Landroid/app/backup/BackupTransport;
-Landroid/app/backup/BackupTransport$TransportImpl;
-Landroid/app/backup/FileBackupHelperBase;
-Landroid/app/backup/FullBackup;
-Landroid/app/backup/FullBackupDataOutput;
-Landroid/app/backup/IBackupManager;
-Landroid/app/backup/IBackupManager$Stub;
-Landroid/app/backup/IBackupObserver;
-Landroid/app/backup/IFullBackupRestoreObserver;
-Landroid/app/backup/IRestoreSession;
-Landroid/app/backup/ISelectBackupTransportCallback;
-Landroid/app/BroadcastOptions;
-Landroid/app/ContentProviderHolder;
-Landroid/app/ContentProviderHolder$1;
-Landroid/app/ContextImpl;
-Landroid/app/ContextImpl$ApplicationContentResolver;
-Landroid/app/DownloadManager;
-Landroid/app/IActivityContainer;
-Landroid/app/IActivityContainerCallback;
-Landroid/app/IActivityContainer$Stub;
-Landroid/app/IActivityController;
-Landroid/app/IActivityManager;
-Landroid/app/IActivityManager$Stub;
-Landroid/app/IAlarmCompleteListener;
-Landroid/app/IAlarmCompleteListener$Stub;
-Landroid/app/IAlarmListener;
-Landroid/app/IAlarmListener$Stub;
-Landroid/app/IAlarmManager;
-Landroid/app/IAlarmManager$Stub;
-Landroid/app/IApplicationThread;
-Landroid/app/IApplicationThread$Stub;
-Landroid/app/IApplicationThread$Stub$Proxy;
-Landroid/app/IAppTask;
-Landroid/app/IAppTask$Stub;
-Landroid/app/IInstrumentationWatcher;
-Landroid/app/INotificationManager;
-Landroid/app/INotificationManager$Stub;
-Landroid/app/Instrumentation;
-Landroid/app/IntentReceiverLeaked;
-Landroid/app/IProcessObserver;
-Landroid/app/IProcessObserver$Stub;
-Landroid/app/IProcessObserver$Stub$Proxy;
-Landroid/app/ISearchManager;
-Landroid/app/ISearchManager$Stub;
-Landroid/app/IServiceConnection;
-Landroid/app/IServiceConnection$Stub;
-Landroid/app/IServiceConnection$Stub$Proxy;
-Landroid/app/IStopUserCallback;
-Landroid/app/ITaskStackListener;
-Landroid/app/ITaskStackListener$Stub;
-Landroid/app/ITaskStackListener$Stub$Proxy;
-Landroid/app/ITransientNotification;
-Landroid/app/ITransientNotification$Stub;
-Landroid/app/ITransientNotification$Stub$Proxy;
-Landroid/app/IUiAutomationConnection;
-Landroid/app/IUidObserver;
-Landroid/app/IUidObserver$Stub;
-Landroid/app/IUiModeManager;
-Landroid/app/IUiModeManager$Stub;
-Landroid/app/IUserSwitchObserver;
-Landroid/app/IUserSwitchObserver$Stub;
-Landroid/app/IUserSwitchObserver$Stub$Proxy;
-Landroid/app/IWallpaperManager;
-Landroid/app/IWallpaperManagerCallback;
-Landroid/app/IWallpaperManagerCallback$Stub;
-Landroid/app/IWallpaperManagerCallback$Stub$Proxy;
-Landroid/app/IWallpaperManager$Stub;
-Landroid/app/job/IJobCallback;
-Landroid/app/job/IJobCallback$Stub;
-Landroid/app/job/IJobScheduler;
-Landroid/app/job/IJobScheduler$Stub;
-Landroid/app/job/IJobService;
-Landroid/app/job/IJobService$Stub;
-Landroid/app/job/IJobService$Stub$Proxy;
-Landroid/app/job/JobInfo;
-Landroid/app/job/JobInfo$1;
-Landroid/app/job/JobInfo$Builder;
-Landroid/app/job/JobInfo$TriggerContentUri;
-Landroid/app/job/JobInfo$TriggerContentUri$1;
-Landroid/app/job/JobParameters;
-Landroid/app/job/JobParameters$1;
-Landroid/app/job/JobScheduler;
-Landroid/app/job/JobService;
-Landroid/app/job/JobService$JobHandler;
-Landroid/app/job/JobService$JobInterface;
-Landroid/app/JobSchedulerImpl;
-Landroid/app/KeyguardManager;
-Landroid/app/LoadedApk;
-Landroid/app/LoadedApk$ReceiverDispatcher;
-Landroid/app/LoadedApk$ReceiverDispatcher$Args;
-Landroid/app/LoadedApk$ReceiverDispatcher$InnerReceiver;
-Landroid/app/LoadedApk$ServiceDispatcher;
-Landroid/app/LoadedApk$ServiceDispatcher$ConnectionInfo;
-Landroid/app/LoadedApk$ServiceDispatcher$DeathMonitor;
-Landroid/app/LoadedApk$ServiceDispatcher$InnerConnection;
-Landroid/app/LoadedApk$ServiceDispatcher$RunConnection;
-Landroid/app/LoadedApk$WarningContextClassLoader;
-Landroid/app/NativeActivity;
-Landroid/app/Notification;
-Landroid/app/Notification$1;
-Landroid/app/Notification$Action;
-Landroid/app/Notification$Action$1;
-Landroid/app/Notification$BigPictureStyle;
-Landroid/app/Notification$BigTextStyle;
-Landroid/app/Notification$Builder;
-Landroid/app/Notification$BuilderRemoteViews;
-Landroid/app/NotificationChannel;
-Landroid/app/NotificationChannel$1;
-Landroid/app/Notification$DecoratedCustomViewStyle;
-Landroid/app/Notification$DecoratedMediaCustomViewStyle;
-Landroid/app/Notification$InboxStyle;
-Landroid/app/NotificationManager;
-Landroid/app/NotificationManager$Policy;
-Landroid/app/NotificationManager$Policy$1;
-Landroid/app/Notification$MediaStyle;
-Landroid/app/Notification$MessagingStyle;
-Landroid/app/Notification$StandardTemplateParams;
-Landroid/app/Notification$Style;
-Landroid/app/PendingIntent;
-Landroid/app/PendingIntent$1;
-Landroid/app/PendingIntent$CanceledException;
-Landroid/app/PendingIntent$FinishedDispatcher;
-Landroid/app/PendingIntent$OnFinished;
-Landroid/app/PendingIntent$OnMarshaledListener;
-Landroid/app/PictureInPictureArgs;
-Landroid/app/PictureInPictureArgs$1;
-Landroid/app/ProfilerInfo;
-Landroid/app/QueuedWork;
-Landroid/app/QueuedWork$QueuedWorkHandler;
-Landroid/app/ReceiverRestrictedContext;
-Landroid/app/RemoteInput;
-Landroid/app/RemoteInput$1;
-Landroid/app/ResourcesManager;
-Landroid/app/ResourcesManager$1;
-Landroid/app/ResultInfo;
-Landroid/app/ResultInfo$1;
-Landroid/app/SearchableInfo;
-Landroid/app/SearchableInfo$1;
-Landroid/app/SearchManager;
-Landroid/app/Service;
-Landroid/app/ServiceConnectionLeaked;
-Landroid/app/StatusBarManager;
-Landroid/app/SynchronousUserSwitchObserver;
-Landroid/app/SystemServiceRegistry;
-Landroid/app/SystemServiceRegistry$1;
-Landroid/app/SystemServiceRegistry$10;
-Landroid/app/SystemServiceRegistry$11;
-Landroid/app/SystemServiceRegistry$12;
-Landroid/app/SystemServiceRegistry$13;
-Landroid/app/SystemServiceRegistry$14;
-Landroid/app/SystemServiceRegistry$15;
-Landroid/app/SystemServiceRegistry$16;
-Landroid/app/SystemServiceRegistry$17;
-Landroid/app/SystemServiceRegistry$18;
-Landroid/app/SystemServiceRegistry$19;
-Landroid/app/SystemServiceRegistry$2;
-Landroid/app/SystemServiceRegistry$20;
-Landroid/app/SystemServiceRegistry$21;
-Landroid/app/SystemServiceRegistry$22;
-Landroid/app/SystemServiceRegistry$23;
-Landroid/app/SystemServiceRegistry$24;
-Landroid/app/SystemServiceRegistry$25;
-Landroid/app/SystemServiceRegistry$26;
-Landroid/app/SystemServiceRegistry$27;
-Landroid/app/SystemServiceRegistry$28;
-Landroid/app/SystemServiceRegistry$29;
-Landroid/app/SystemServiceRegistry$3;
-Landroid/app/SystemServiceRegistry$30;
-Landroid/app/SystemServiceRegistry$31;
-Landroid/app/SystemServiceRegistry$32;
-Landroid/app/SystemServiceRegistry$33;
-Landroid/app/SystemServiceRegistry$34;
-Landroid/app/SystemServiceRegistry$35;
-Landroid/app/SystemServiceRegistry$36;
-Landroid/app/SystemServiceRegistry$37;
-Landroid/app/SystemServiceRegistry$38;
-Landroid/app/SystemServiceRegistry$39;
-Landroid/app/SystemServiceRegistry$4;
-Landroid/app/SystemServiceRegistry$40;
-Landroid/app/SystemServiceRegistry$41;
-Landroid/app/SystemServiceRegistry$42;
-Landroid/app/SystemServiceRegistry$43;
-Landroid/app/SystemServiceRegistry$44;
-Landroid/app/SystemServiceRegistry$45;
-Landroid/app/SystemServiceRegistry$46;
-Landroid/app/SystemServiceRegistry$47;
-Landroid/app/SystemServiceRegistry$48;
-Landroid/app/SystemServiceRegistry$49;
-Landroid/app/SystemServiceRegistry$5;
-Landroid/app/SystemServiceRegistry$50;
-Landroid/app/SystemServiceRegistry$51;
-Landroid/app/SystemServiceRegistry$52;
-Landroid/app/SystemServiceRegistry$53;
-Landroid/app/SystemServiceRegistry$54;
-Landroid/app/SystemServiceRegistry$55;
-Landroid/app/SystemServiceRegistry$56;
-Landroid/app/SystemServiceRegistry$57;
-Landroid/app/SystemServiceRegistry$58;
-Landroid/app/SystemServiceRegistry$59;
-Landroid/app/SystemServiceRegistry$6;
-Landroid/app/SystemServiceRegistry$60;
-Landroid/app/SystemServiceRegistry$61;
-Landroid/app/SystemServiceRegistry$62;
-Landroid/app/SystemServiceRegistry$63;
-Landroid/app/SystemServiceRegistry$64;
-Landroid/app/SystemServiceRegistry$65;
-Landroid/app/SystemServiceRegistry$66;
-Landroid/app/SystemServiceRegistry$67;
-Landroid/app/SystemServiceRegistry$68;
-Landroid/app/SystemServiceRegistry$69;
-Landroid/app/SystemServiceRegistry$7;
-Landroid/app/SystemServiceRegistry$70;
-Landroid/app/SystemServiceRegistry$71;
-Landroid/app/SystemServiceRegistry$72;
-Landroid/app/SystemServiceRegistry$73;
-Landroid/app/SystemServiceRegistry$74;
-Landroid/app/SystemServiceRegistry$75;
-Landroid/app/SystemServiceRegistry$76;
-Landroid/app/SystemServiceRegistry$77;
-Landroid/app/SystemServiceRegistry$78;
-Landroid/app/SystemServiceRegistry$79;
-Landroid/app/SystemServiceRegistry$8;
-Landroid/app/SystemServiceRegistry$9;
-Landroid/app/SystemServiceRegistry$CachedServiceFetcher;
-Landroid/app/SystemServiceRegistry$ServiceFetcher;
-Landroid/app/SystemServiceRegistry$StaticApplicationContextServiceFetcher;
-Landroid/app/SystemServiceRegistry$StaticServiceFetcher;
-Landroid/app/trust/IStrongAuthTracker;
-Landroid/app/trust/IStrongAuthTracker$Stub;
-Landroid/app/trust/IStrongAuthTracker$Stub$Proxy;
-Landroid/app/trust/ITrustListener;
-Landroid/app/trust/ITrustListener$Stub;
-Landroid/app/trust/ITrustListener$Stub$Proxy;
-Landroid/app/trust/ITrustManager;
-Landroid/app/trust/ITrustManager$Stub;
-Landroid/app/trust/TrustManager;
-Landroid/app/UiModeManager;
-Landroid/app/usage/ConfigurationStats;
-Landroid/app/usage/ConfigurationStats$1;
-Landroid/app/usage/ExternalStorageStats;
-Landroid/app/usage/IStorageStatsManager;
-Landroid/app/usage/IStorageStatsManager$Stub;
-Landroid/app/usage/IUsageStatsManager;
-Landroid/app/usage/IUsageStatsManager$Stub;
-Landroid/app/usage/NetworkStatsManager;
-Landroid/app/usage/StorageStats;
-Landroid/app/usage/StorageStatsManager;
-Landroid/app/usage/TimeSparseArray;
-Landroid/app/usage/UsageEvents;
-Landroid/app/usage/UsageEvents$1;
-Landroid/app/usage/UsageEvents$Event;
-Landroid/app/usage/UsageStats;
-Landroid/app/usage/UsageStats$1;
-Landroid/app/usage/UsageStatsManager;
-Landroid/app/usage/UsageStatsManagerInternal;
-Landroid/app/usage/UsageStatsManagerInternal$AppIdleStateChangeListener;
-Landroid/app/UserSwitchObserver;
-Landroid/app/WaitResult;
-Landroid/app/WallpaperInfo;
-Landroid/app/WallpaperInfo$1;
-Landroid/app/WallpaperManager;
-Landroid/appwidget/AppWidgetManager;
-Landroid/appwidget/AppWidgetProviderInfo;
-Landroid/appwidget/AppWidgetProviderInfo$1;
-Landroid/bluetooth/BluetoothA2dp;
-Landroid/bluetooth/BluetoothA2dp$1;
-Landroid/bluetooth/BluetoothA2dp$2;
-Landroid/bluetooth/BluetoothActivityEnergyInfo;
-Landroid/bluetooth/BluetoothActivityEnergyInfo$1;
-Landroid/bluetooth/BluetoothAdapter;
-Landroid/bluetooth/BluetoothAdapter$1;
-Landroid/bluetooth/BluetoothDevice;
-Landroid/bluetooth/BluetoothHeadset;
-Landroid/bluetooth/BluetoothHeadset$1;
-Landroid/bluetooth/BluetoothHeadset$2;
-Landroid/bluetooth/BluetoothHeadset$3;
-Landroid/bluetooth/BluetoothManager;
-Landroid/bluetooth/BluetoothProfile;
-Landroid/bluetooth/BluetoothProfile$ServiceListener;
-Landroid/bluetooth/IBluetooth;
-Landroid/bluetooth/IBluetoothA2dp;
-Landroid/bluetooth/IBluetoothA2dp$Stub;
-Landroid/bluetooth/IBluetoothA2dp$Stub$Proxy;
-Landroid/bluetooth/IBluetoothCallback;
-Landroid/bluetooth/IBluetoothCallback$Stub;
-Landroid/bluetooth/IBluetoothGatt;
-Landroid/bluetooth/IBluetoothGatt$Stub;
-Landroid/bluetooth/IBluetoothGatt$Stub$Proxy;
-Landroid/bluetooth/IBluetoothHeadset;
-Landroid/bluetooth/IBluetoothHeadsetPhone;
-Landroid/bluetooth/IBluetoothHeadsetPhone$Stub;
-Landroid/bluetooth/IBluetoothHeadset$Stub;
-Landroid/bluetooth/IBluetoothHeadset$Stub$Proxy;
-Landroid/bluetooth/IBluetoothManager;
-Landroid/bluetooth/IBluetoothManagerCallback;
-Landroid/bluetooth/IBluetoothManagerCallback$Stub;
-Landroid/bluetooth/IBluetoothManagerCallback$Stub$Proxy;
-Landroid/bluetooth/IBluetoothManager$Stub;
-Landroid/bluetooth/IBluetoothProfileServiceConnection;
-Landroid/bluetooth/IBluetoothProfileServiceConnection$Stub;
-Landroid/bluetooth/IBluetoothProfileServiceConnection$Stub$Proxy;
-Landroid/bluetooth/IBluetoothStateChangeCallback;
-Landroid/bluetooth/IBluetoothStateChangeCallback$Stub;
-Landroid/bluetooth/IBluetoothStateChangeCallback$Stub$Proxy;
-Landroid/bluetooth/IBluetooth$Stub;
-Landroid/bluetooth/IBluetooth$Stub$Proxy;
-Landroid/bluetooth/UidTraffic;
-Landroid/bluetooth/UidTraffic$1;
-Landroid/content/ActivityNotFoundException;
-Landroid/content/AsyncQueryHandler;
-Landroid/content/AsyncQueryHandler$WorkerArgs;
-Landroid/content/AsyncQueryHandler$WorkerHandler;
-Landroid/content/BroadcastReceiver;
-Landroid/content/BroadcastReceiver$PendingResult;
-Landroid/content/ClipboardManager;
-Landroid/content/ClipData;
-Landroid/content/ClipDescription;
-Landroid/content/ComponentCallbacks;
-Landroid/content/ComponentCallbacks2;
-Landroid/content/ComponentName;
-Landroid/content/ComponentName$1;
-Landroid/content/ContentProvider;
-Landroid/content/ContentProviderNative;
-Landroid/content/ContentProviderProxy;
-Landroid/content/ContentProvider$Transport;
-Landroid/content/ContentResolver;
-Landroid/content/ContentResolver$CursorWrapperInner;
-Landroid/content/ContentUris;
-Landroid/content/ContentValues;
-Landroid/content/ContentValues$1;
-Landroid/content/Context;
-Landroid/content/ContextWrapper;
-Landroid/content/DialogInterface$OnCancelListener;
-Landroid/content/DialogInterface$OnDismissListener;
-Landroid/content/IClipboard;
-Landroid/content/IClipboard$Stub;
-Landroid/content/IContentProvider;
-Landroid/content/IContentService;
-Landroid/content/IContentService$Stub;
-Landroid/content/IIntentReceiver;
-Landroid/content/IIntentReceiver$Stub;
-Landroid/content/IIntentReceiver$Stub$Proxy;
-Landroid/content/IIntentSender;
-Landroid/content/IIntentSender$Stub;
-Landroid/content/Intent;
-Landroid/content/Intent$1;
-Landroid/content/IntentFilter;
-Landroid/content/IntentFilter$1;
-Landroid/content/IntentFilter$AuthorityEntry;
-Landroid/content/Intent$FilterComparison;
-Landroid/content/IntentFilter$MalformedMimeTypeException;
-Landroid/content/IntentSender;
-Landroid/content/IntentSender$SendIntentException;
-Landroid/content/IOnPrimaryClipChangedListener;
-Landroid/content/IOnPrimaryClipChangedListener$Stub;
-Landroid/content/IOnPrimaryClipChangedListener$Stub$Proxy;
-Landroid/content/IRestrictionsManager;
-Landroid/content/IRestrictionsManager$Stub;
-Landroid/content/ISyncAdapter;
-Landroid/content/ISyncAdapter$Stub;
-Landroid/content/ISyncAdapter$Stub$Proxy;
-Landroid/content/ISyncContext;
-Landroid/content/ISyncContext$Stub;
-Landroid/content/ISyncStatusObserver;
-Landroid/content/ISyncStatusObserver$Stub;
-Landroid/content/ISyncStatusObserver$Stub$Proxy;
-Landroid/content/PeriodicSync;
-Landroid/content/PeriodicSync$1;
-Landroid/content/pm/ActivityInfo;
-Landroid/content/pm/ActivityInfo$1;
-Landroid/content/pm/ActivityInfo$WindowLayout;
-Landroid/content/pm/ApplicationInfo;
-Landroid/content/pm/ApplicationInfo$1;
-Landroid/content/pm/ComponentInfo;
-Landroid/content/pm/ConfigurationInfo;
-Landroid/content/pm/ConfigurationInfo$1;
-Landroid/content/pm/EphemeralResponse;
-Landroid/content/pm/FallbackCategoryProvider;
-Landroid/content/pm/FeatureInfo;
-Landroid/content/pm/FeatureInfo$1;
-Landroid/content/pm/ILauncherApps;
-Landroid/content/pm/ILauncherApps$Stub;
-Landroid/content/pm/InstrumentationInfo;
-Landroid/content/pm/IntentFilterVerificationInfo;
-Landroid/content/pm/IntentFilterVerificationInfo$1;
-Landroid/content/pm/IOnAppsChangedListener;
-Landroid/content/pm/IOnAppsChangedListener$Stub;
-Landroid/content/pm/IOnAppsChangedListener$Stub$Proxy;
-Landroid/content/pm/IOnPermissionsChangeListener;
-Landroid/content/pm/IOnPermissionsChangeListener$Stub;
-Landroid/content/pm/IOnPermissionsChangeListener$Stub$Proxy;
-Landroid/content/pm/IOtaDexopt;
-Landroid/content/pm/IOtaDexopt$Stub;
-Landroid/content/pm/IPackageDataObserver;
-Landroid/content/pm/IPackageDeleteObserver;
-Landroid/content/pm/IPackageDeleteObserver2;
-Landroid/content/pm/IPackageInstaller;
-Landroid/content/pm/IPackageInstallerCallback;
-Landroid/content/pm/IPackageInstallerCallback$Stub;
-Landroid/content/pm/IPackageInstallerCallback$Stub$Proxy;
-Landroid/content/pm/IPackageInstallerSession;
-Landroid/content/pm/IPackageInstaller$Stub;
-Landroid/content/pm/IPackageInstallObserver2;
-Landroid/content/pm/IPackageManager;
-Landroid/content/pm/IPackageManager$Stub;
-Landroid/content/pm/IPackageMoveObserver;
-Landroid/content/pm/IPackageMoveObserver$Stub;
-Landroid/content/pm/IPackageMoveObserver$Stub$Proxy;
-Landroid/content/pm/IPackageStatsObserver;
-Landroid/content/pm/IPackageStatsObserver$Stub;
-Landroid/content/pm/IPackageStatsObserver$Stub$Proxy;
-Landroid/content/pm/IShortcutService;
-Landroid/content/pm/IShortcutService$Stub;
-Landroid/content/pm/KeySet;
-Landroid/content/pm/LauncherApps;
-Landroid/content/pm/PackageCleanItem;
-Landroid/content/pm/PackageInfo;
-Landroid/content/pm/PackageInfo$1;
-Landroid/content/pm/PackageInstaller$SessionInfo;
-Landroid/content/pm/PackageInstaller$SessionParams;
-Landroid/content/pm/PackageItemInfo;
-Landroid/content/pm/PackageManager;
-Landroid/content/pm/PackageManagerInternal;
-Landroid/content/pm/PackageManagerInternal$ExternalSourcesPolicy;
-Landroid/content/pm/PackageManagerInternal$PackagesProvider;
-Landroid/content/pm/PackageManagerInternal$SyncAdapterPackagesProvider;
-Landroid/content/pm/PackageManager$NameNotFoundException;
-Landroid/content/pm/PackageManager$OnPermissionsChangedListener;
-Landroid/content/pm/PackageParser;
-Landroid/content/pm/PackageParser$Activity;
-Landroid/content/pm/PackageParser$Activity$1;
-Landroid/content/pm/PackageParser$ActivityIntentInfo;
-Landroid/content/pm/PackageParser$ApkLite;
-Landroid/content/pm/PackageParser$Component;
-Landroid/content/pm/PackageParser$IntentInfo;
-Landroid/content/pm/PackageParser$NewPermissionInfo;
-Landroid/content/pm/PackageParser$Package;
-Landroid/content/pm/PackageParser$Package$1;
-Landroid/content/pm/PackageParser$PackageParserException;
-Landroid/content/pm/PackageParser$Permission;
-Landroid/content/pm/PackageParser$Permission$1;
-Landroid/content/pm/PackageParser$PermissionGroup;
-Landroid/content/pm/PackageParser$PermissionGroup$1;
-Landroid/content/pm/PackageParser$Provider;
-Landroid/content/pm/PackageParser$Provider$1;
-Landroid/content/pm/PackageParser$ProviderIntentInfo;
-Landroid/content/pm/PackageParser$Service;
-Landroid/content/pm/PackageParser$Service$1;
-Landroid/content/pm/PackageParser$ServiceIntentInfo;
-Landroid/content/pm/PackageParser$SplitNameComparator;
-Landroid/content/pm/PackageParser$SplitPermissionInfo;
-Landroid/content/pm/PackageStats;
-Landroid/content/pm/PackageStats$1;
-Landroid/content/pm/PackageUserState;
-Landroid/content/pm/ParceledListSlice;
-Landroid/content/pm/ParceledListSlice$1;
-Landroid/content/pm/ParceledListSlice$2;
-Landroid/content/pm/PathPermission;
-Landroid/content/pm/PathPermission$1;
-Landroid/content/pm/PermissionGroupInfo;
-Landroid/content/pm/PermissionGroupInfo$1;
-Landroid/content/pm/PermissionInfo;
-Landroid/content/pm/PermissionInfo$1;
-Landroid/content/pm/ProviderInfo;
-Landroid/content/pm/ProviderInfo$1;
-Landroid/content/pm/RegisteredServicesCache;
-Landroid/content/pm/RegisteredServicesCache$1;
-Landroid/content/pm/RegisteredServicesCache$2;
-Landroid/content/pm/RegisteredServicesCache$3;
-Landroid/content/pm/RegisteredServicesCacheListener;
-Landroid/content/pm/RegisteredServicesCache$ServiceInfo;
-Landroid/content/pm/RegisteredServicesCache$UserServices;
-Landroid/content/pm/ResolveInfo;
-Landroid/content/pm/ResolveInfo$1;
-Landroid/content/pm/ServiceInfo;
-Landroid/content/pm/ServiceInfo$1;
-Landroid/content/pm/SharedLibraryInfo;
-Landroid/content/pm/SharedLibraryInfo$1;
-Landroid/content/pm/ShortcutInfo;
-Landroid/content/pm/ShortcutInfo$1;
-Landroid/content/pm/ShortcutManager;
-Landroid/content/pm/ShortcutServiceInternal;
-Landroid/content/pm/ShortcutServiceInternal$ShortcutChangeListener;
-Landroid/content/pm/Signature;
-Landroid/content/pm/Signature$1;
-Landroid/content/pm/UserInfo;
-Landroid/content/pm/UserInfo$1;
-Landroid/content/pm/VerifierDeviceIdentity;
-Landroid/content/pm/VersionedPackage;
-Landroid/content/pm/VersionedPackage$1;
-Landroid/content/pm/XmlSerializerAndParser;
-Landroid/content/res/AssetFileDescriptor;
-Landroid/content/res/AssetFileDescriptor$1;
-Landroid/content/res/AssetManager;
-Landroid/content/res/AssetManager$AssetInputStream;
-Landroid/content/res/ColorStateList;
-Landroid/content/res/ColorStateList$1;
-Landroid/content/res/ColorStateList$ColorStateListFactory;
-Landroid/content/res/CompatibilityInfo;
-Landroid/content/res/CompatibilityInfo$1;
-Landroid/content/res/CompatibilityInfo$2;
-Landroid/content/res/ComplexColor;
-Landroid/content/res/Configuration;
-Landroid/content/res/Configuration$1;
-Landroid/content/res/ConfigurationBoundResourceCache;
-Landroid/content/res/ConstantState;
-Landroid/content/res/DrawableCache;
-Landroid/content/res/GradientColor;
-Landroid/content/res/ObbInfo;
-Landroid/content/res/ObbInfo$1;
-Landroid/content/res/ObbScanner;
-Landroid/content/res/Resources;
-Landroid/content/res/ResourcesImpl;
-Landroid/content/res/ResourcesImpl$ThemeImpl;
-Landroid/content/res/ResourcesKey;
-Landroid/content/res/Resources$NotFoundException;
-Landroid/content/res/Resources$Theme;
-Landroid/content/res/Resources$ThemeKey;
-Landroid/content/res/StringBlock;
-Landroid/content/res/ThemedResourceCache;
-Landroid/content/RestrictionsManager;
-Landroid/content/res/TypedArray;
-Landroid/content/res/XmlBlock;
-Landroid/content/res/XmlBlock$Parser;
-Landroid/content/res/XmlResourceParser;
-Landroid/content/ServiceConnection;
-Landroid/content/SyncAdaptersCache;
-Landroid/content/SyncAdaptersCache$MySerializer;
-Landroid/content/SyncAdapterType;
-Landroid/content/SyncAdapterType$1;
-Landroid/content/SyncInfo;
-Landroid/content/SyncInfo$1;
-Landroid/content/SyncRequest;
-Landroid/content/SyncRequest$1;
-Landroid/content/SyncResult;
-Landroid/content/SyncResult$1;
-Landroid/content/SyncStats;
-Landroid/content/SyncStats$1;
-Landroid/content/SyncStatusInfo;
-Landroid/content/SyncStatusInfo$1;
-Landroid/database/AbstractCursor;
-Landroid/database/AbstractCursor$SelfContentObserver;
-Landroid/database/AbstractWindowedCursor;
-Landroid/database/BulkCursorDescriptor;
-Landroid/database/BulkCursorDescriptor$1;
-Landroid/database/BulkCursorNative;
-Landroid/database/BulkCursorProxy;
-Landroid/database/BulkCursorToCursorAdaptor;
-Landroid/database/CharArrayBuffer;
-Landroid/database/ContentObservable;
-Landroid/database/ContentObserver;
-Landroid/database/ContentObserver$NotificationRunnable;
-Landroid/database/ContentObserver$Transport;
-Landroid/database/CrossProcessCursor;
-Landroid/database/CrossProcessCursorWrapper;
-Landroid/database/Cursor;
-Landroid/database/CursorWindow;
-Landroid/database/CursorWindow$1;
-Landroid/database/CursorWrapper;
-Landroid/database/DatabaseErrorHandler;
-Landroid/database/DatabaseUtils;
-Landroid/database/DataSetObservable;
-Landroid/database/DefaultDatabaseErrorHandler;
-Landroid/database/IBulkCursor;
-Landroid/database/IContentObserver;
-Landroid/database/IContentObserver$Stub;
-Landroid/database/IContentObserver$Stub$Proxy;
-Landroid/database/Observable;
-Landroid/database/SQLException;
-Landroid/database/sqlite/DatabaseObjectNotClosedException;
-Landroid/database/sqlite/SQLiteClosable;
-Landroid/database/sqlite/SQLiteConnection;
-Landroid/database/sqlite/SQLiteConnection$Operation;
-Landroid/database/sqlite/SQLiteConnection$OperationLog;
-Landroid/database/sqlite/SQLiteConnectionPool;
-Landroid/database/sqlite/SQLiteConnectionPool$AcquiredConnectionStatus;
-Landroid/database/sqlite/SQLiteConnection$PreparedStatement;
-Landroid/database/sqlite/SQLiteConnection$PreparedStatementCache;
-Landroid/database/sqlite/SQLiteCursor;
-Landroid/database/sqlite/SQLiteCursorDriver;
-Landroid/database/sqlite/SQLiteCustomFunction;
-Landroid/database/sqlite/SQLiteDatabase;
-Landroid/database/sqlite/SQLiteDatabase$1;
-Landroid/database/sqlite/SQLiteDatabaseConfiguration;
-Landroid/database/sqlite/SQLiteDatabaseCorruptException;
-Landroid/database/sqlite/SQLiteDatabaseLockedException;
-Landroid/database/sqlite/SQLiteDebug;
-Landroid/database/sqlite/SQLiteDebug$PagerStats;
-Landroid/database/sqlite/SQLiteDirectCursorDriver;
-Landroid/database/sqlite/SQLiteException;
-Landroid/database/sqlite/SQLiteGlobal;
-Landroid/database/sqlite/SQLiteOpenHelper;
-Landroid/database/sqlite/SQLiteProgram;
-Landroid/database/sqlite/SQLiteQuery;
-Landroid/database/sqlite/SQLiteQueryBuilder;
-Landroid/database/sqlite/SQLiteSession;
-Landroid/database/sqlite/SQLiteSession$Transaction;
-Landroid/database/sqlite/SQLiteStatement;
-Landroid/database/sqlite/SQLiteStatementInfo;
-Landroid/ddm/DdmHandleAppName;
-Landroid/ddm/DdmHandleExit;
-Landroid/ddm/DdmHandleHeap;
-Landroid/ddm/DdmHandleHello;
-Landroid/ddm/DdmHandleNativeHeap;
-Landroid/ddm/DdmHandleProfiling;
-Landroid/ddm/DdmHandleThread;
-Landroid/ddm/DdmHandleViewDebug;
-Landroid/ddm/DdmRegister;
-Landroid/graphics/BaseCanvas;
-Landroid/graphics/Bitmap;
-Landroid/graphics/Bitmap$1;
-Landroid/graphics/Bitmap$CompressFormat;
-Landroid/graphics/Bitmap$Config;
-Landroid/graphics/BitmapFactory;
-Landroid/graphics/BitmapFactory$Options;
-Landroid/graphics/BitmapRegionDecoder;
-Landroid/graphics/BitmapShader;
-Landroid/graphics/BlurMaskFilter;
-Landroid/graphics/BlurMaskFilter$Blur;
-Landroid/graphics/Camera;
-Landroid/graphics/Canvas;
-Landroid/graphics/Canvas$EdgeType;
-Landroid/graphics/Canvas$NoImagePreloadHolder;
-Landroid/graphics/CanvasProperty;
-Landroid/graphics/Color;
-Landroid/graphics/ColorFilter;
-Landroid/graphics/ColorMatrix;
-Landroid/graphics/ColorMatrixColorFilter;
-Landroid/graphics/ComposePathEffect;
-Landroid/graphics/ComposeShader;
-Landroid/graphics/CornerPathEffect;
-Landroid/graphics/DashPathEffect;
-Landroid/graphics/DiscretePathEffect;
-Landroid/graphics/drawable/Animatable;
-Landroid/graphics/drawable/Animatable2;
-Landroid/graphics/drawable/AnimatedStateListDrawable;
-Landroid/graphics/drawable/AnimatedStateListDrawable$AnimatedStateListState;
-Landroid/graphics/drawable/AnimatedVectorDrawable;
-Landroid/graphics/drawable/AnimatedVectorDrawable$1;
-Landroid/graphics/drawable/AnimatedVectorDrawable$AnimatedVectorDrawableState;
-Landroid/graphics/drawable/AnimatedVectorDrawable$AnimatedVectorDrawableState$PendingAnimator;
-Landroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimator;
-Landroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT;
-Landroid/graphics/drawable/AnimationDrawable;
-Landroid/graphics/drawable/AnimationDrawable$AnimationState;
-Landroid/graphics/drawable/BitmapDrawable;
-Landroid/graphics/drawable/BitmapDrawable$BitmapState;
-Landroid/graphics/drawable/ColorDrawable;
-Landroid/graphics/drawable/ColorDrawable$ColorState;
-Landroid/graphics/drawable/Drawable;
-Landroid/graphics/drawable/Drawable$Callback;
-Landroid/graphics/drawable/Drawable$ConstantState;
-Landroid/graphics/drawable/DrawableContainer;
-Landroid/graphics/drawable/DrawableContainer$BlockInvalidateCallback;
-Landroid/graphics/drawable/DrawableContainer$DrawableContainerState;
-Landroid/graphics/drawable/DrawableInflater;
-Landroid/graphics/drawable/DrawableWrapper;
-Landroid/graphics/drawable/DrawableWrapper$DrawableWrapperState;
-Landroid/graphics/drawable/GradientDrawable;
-Landroid/graphics/drawable/GradientDrawable$GradientState;
-Landroid/graphics/drawable/GradientDrawable$Orientation;
-Landroid/graphics/drawable/Icon;
-Landroid/graphics/drawable/Icon$1;
-Landroid/graphics/drawable/InsetDrawable;
-Landroid/graphics/drawable/InsetDrawable$InsetState;
-Landroid/graphics/drawable/LayerDrawable;
-Landroid/graphics/drawable/LayerDrawable$ChildDrawable;
-Landroid/graphics/drawable/LayerDrawable$LayerState;
-Landroid/graphics/drawable/NinePatchDrawable;
-Landroid/graphics/drawable/NinePatchDrawable$NinePatchState;
-Landroid/graphics/drawable/RippleBackground;
-Landroid/graphics/drawable/RippleBackground$1;
-Landroid/graphics/drawable/RippleBackground$BackgroundProperty;
-Landroid/graphics/drawable/RippleComponent;
-Landroid/graphics/drawable/RippleDrawable;
-Landroid/graphics/drawable/RippleDrawable$RippleState;
-Landroid/graphics/drawable/RippleForeground;
-Landroid/graphics/drawable/RippleForeground$1;
-Landroid/graphics/drawable/RippleForeground$2;
-Landroid/graphics/drawable/RippleForeground$3;
-Landroid/graphics/drawable/RippleForeground$4;
-Landroid/graphics/drawable/RippleForeground$LogDecelerateInterpolator;
-Landroid/graphics/drawable/ScaleDrawable;
-Landroid/graphics/drawable/ScaleDrawable$ScaleState;
-Landroid/graphics/drawable/StateListDrawable;
-Landroid/graphics/drawable/StateListDrawable$StateListState;
-Landroid/graphics/drawable/VectorDrawable;
-Landroid/graphics/drawable/VectorDrawable$VectorDrawableState;
-Landroid/graphics/drawable/VectorDrawable$VectorDrawableState$1;
-Landroid/graphics/drawable/VectorDrawable$VFullPath;
-Landroid/graphics/drawable/VectorDrawable$VFullPath$1;
-Landroid/graphics/drawable/VectorDrawable$VFullPath$10;
-Landroid/graphics/drawable/VectorDrawable$VFullPath$2;
-Landroid/graphics/drawable/VectorDrawable$VFullPath$3;
-Landroid/graphics/drawable/VectorDrawable$VFullPath$4;
-Landroid/graphics/drawable/VectorDrawable$VFullPath$5;
-Landroid/graphics/drawable/VectorDrawable$VFullPath$6;
-Landroid/graphics/drawable/VectorDrawable$VFullPath$7;
-Landroid/graphics/drawable/VectorDrawable$VFullPath$8;
-Landroid/graphics/drawable/VectorDrawable$VFullPath$9;
-Landroid/graphics/drawable/VectorDrawable$VGroup;
-Landroid/graphics/drawable/VectorDrawable$VGroup$1;
-Landroid/graphics/drawable/VectorDrawable$VGroup$2;
-Landroid/graphics/drawable/VectorDrawable$VGroup$3;
-Landroid/graphics/drawable/VectorDrawable$VGroup$4;
-Landroid/graphics/drawable/VectorDrawable$VGroup$5;
-Landroid/graphics/drawable/VectorDrawable$VGroup$6;
-Landroid/graphics/drawable/VectorDrawable$VGroup$7;
-Landroid/graphics/drawable/VectorDrawable$VGroup$8;
-Landroid/graphics/drawable/VectorDrawable$VGroup$9;
-Landroid/graphics/drawable/VectorDrawable$VObject;
-Landroid/graphics/drawable/VectorDrawable$VPath;
-Landroid/graphics/drawable/VectorDrawable$VPath$1;
-Landroid/graphics/DrawFilter;
-Landroid/graphics/EmbossMaskFilter;
-Landroid/graphics/FontFamily;
-Landroid/graphics/FontListParser;
-Landroid/graphics/GraphicBuffer;
-Landroid/graphics/GraphicBuffer$1;
-Landroid/graphics/Insets;
-Landroid/graphics/Interpolator;
-Landroid/graphics/LightingColorFilter;
-Landroid/graphics/LinearGradient;
-Landroid/graphics/MaskFilter;
-Landroid/graphics/Matrix;
-Landroid/graphics/Matrix$1;
-Landroid/graphics/Matrix$NoImagePreloadHolder;
-Landroid/graphics/Matrix$ScaleToFit;
-Landroid/graphics/Movie;
-Landroid/graphics/NinePatch;
-Landroid/graphics/NinePatch$InsetStruct;
-Landroid/graphics/Outline;
-Landroid/graphics/Paint;
-Landroid/graphics/Paint$Align;
-Landroid/graphics/Paint$Cap;
-Landroid/graphics/PaintFlagsDrawFilter;
-Landroid/graphics/Paint$FontMetrics;
-Landroid/graphics/Paint$FontMetricsInt;
-Landroid/graphics/Paint$Join;
-Landroid/graphics/Paint$NoImagePreloadHolder;
-Landroid/graphics/Paint$Style;
-Landroid/graphics/Path;
-Landroid/graphics/PathDashPathEffect;
-Landroid/graphics/PathEffect;
-Landroid/graphics/Path$FillType;
-Landroid/graphics/PathMeasure;
-Landroid/graphics/pdf/PdfDocument;
-Landroid/graphics/pdf/PdfEditor;
-Landroid/graphics/pdf/PdfRenderer;
-Landroid/graphics/Picture;
-Landroid/graphics/PixelFormat;
-Landroid/graphics/Point;
-Landroid/graphics/Point$1;
-Landroid/graphics/PointF;
-Landroid/graphics/PointF$1;
-Landroid/graphics/PorterDuff;
-Landroid/graphics/PorterDuffColorFilter;
-Landroid/graphics/PorterDuff$Mode;
-Landroid/graphics/RadialGradient;
-Landroid/graphics/Rect;
-Landroid/graphics/Rect$1;
-Landroid/graphics/RectF;
-Landroid/graphics/RectF$1;
-Landroid/graphics/Region;
-Landroid/graphics/Region$1;
-Landroid/graphics/RegionIterator;
-Landroid/graphics/Region$Op;
-Landroid/graphics/Shader;
-Landroid/graphics/Shader$TileMode;
-Landroid/graphics/SumPathEffect;
-Landroid/graphics/SurfaceTexture;
-Landroid/graphics/SweepGradient;
-Landroid/graphics/TableMaskFilter;
-Landroid/graphics/TemporaryBuffer;
-Landroid/graphics/Typeface;
-Landroid/graphics/YuvImage;
-Landroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;
-Landroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;
-Landroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback$Stub;
-Landroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint$Proxy;
-Landroid/hardware/Camera;
-Landroid/hardware/camera2/CameraAccessException;
-Landroid/hardware/camera2/CameraCharacteristics$Key;
-Landroid/hardware/camera2/CameraManager;
-Landroid/hardware/camera2/CaptureRequest$Key;
-Landroid/hardware/camera2/CaptureResult$Key;
-Landroid/hardware/camera2/DngCreator;
-Landroid/hardware/camera2/impl/CameraMetadataNative;
-Landroid/hardware/camera2/legacy/LegacyCameraDevice;
-Landroid/hardware/camera2/legacy/PerfMeasurement;
-Landroid/hardware/Camera$CameraInfo;
-Landroid/hardware/Camera$Face;
-Landroid/hardware/ConsumerIrManager;
-Landroid/hardware/display/DisplayManager;
-Landroid/hardware/display/DisplayManager$DisplayListener;
-Landroid/hardware/display/DisplayManagerGlobal;
-Landroid/hardware/display/DisplayManagerGlobal$DisplayListenerDelegate;
-Landroid/hardware/display/DisplayManagerGlobal$DisplayManagerCallback;
-Landroid/hardware/display/DisplayManagerInternal;
-Landroid/hardware/display/DisplayManagerInternal$DisplayPowerCallbacks;
-Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;
-Landroid/hardware/display/DisplayManagerInternal$DisplayTransactionListener;
-Landroid/hardware/display/DisplayViewport;
-Landroid/hardware/display/IDisplayManager;
-Landroid/hardware/display/IDisplayManagerCallback;
-Landroid/hardware/display/IDisplayManagerCallback$Stub;
-Landroid/hardware/display/IDisplayManagerCallback$Stub$Proxy;
-Landroid/hardware/display/IDisplayManager$Stub;
-Landroid/hardware/display/IVirtualDisplayCallback;
-Landroid/hardware/display/WifiDisplay;
-Landroid/hardware/display/WifiDisplay$1;
-Landroid/hardware/display/WifiDisplaySessionInfo;
-Landroid/hardware/display/WifiDisplaySessionInfo$1;
-Landroid/hardware/display/WifiDisplayStatus;
-Landroid/hardware/display/WifiDisplayStatus$1;
-Landroid/hardware/fingerprint/FingerprintManager;
-Landroid/hardware/fingerprint/IFingerprintClientActiveCallback;
-Landroid/hardware/fingerprint/IFingerprintService;
-Landroid/hardware/fingerprint/IFingerprintServiceLockoutResetCallback;
-Landroid/hardware/fingerprint/IFingerprintServiceLockoutResetCallback$Stub;
-Landroid/hardware/fingerprint/IFingerprintServiceLockoutResetCallback$Stub$Proxy;
-Landroid/hardware/fingerprint/IFingerprintServiceReceiver;
-Landroid/hardware/fingerprint/IFingerprintService$Stub;
-Landroid/hardware/HardwareBuffer;
-Landroid/hardware/HardwareBuffer$1;
-Landroid/hardware/hdmi/HdmiControlManager;
-Landroid/hardware/hdmi/HdmiPlaybackClient$DisplayStatusCallback;
-Landroid/hardware/ICameraService;
-Landroid/hardware/ICameraServiceProxy;
-Landroid/hardware/ICameraServiceProxy$Stub;
-Landroid/hardware/ICameraService$Stub;
-Landroid/hardware/ICameraService$Stub$Proxy;
-Landroid/hardware/IConsumerIrService;
-Landroid/hardware/IConsumerIrService$Stub;
-Landroid/hardware/input/IInputDevicesChangedListener;
-Landroid/hardware/input/IInputDevicesChangedListener$Stub;
-Landroid/hardware/input/IInputDevicesChangedListener$Stub$Proxy;
-Landroid/hardware/input/IInputManager;
-Landroid/hardware/input/IInputManager$Stub;
-Landroid/hardware/input/InputDeviceIdentifier;
-Landroid/hardware/input/InputDeviceIdentifier$1;
-Landroid/hardware/input/InputManager;
-Landroid/hardware/input/InputManager$InputDeviceListener;
-Landroid/hardware/input/InputManagerInternal;
-Landroid/hardware/input/ITabletModeChangedListener;
-Landroid/hardware/input/KeyboardLayout;
-Landroid/hardware/input/KeyboardLayout$1;
-Landroid/hardware/input/TouchCalibration;
-Landroid/hardware/input/TouchCalibration$1;
-Landroid/hardware/ISerialManager;
-Landroid/hardware/ISerialManager$Stub;
-Landroid/hardware/location/ActivityRecognitionHardware;
-Landroid/hardware/location/ContextHubInfo;
-Landroid/hardware/location/ContextHubInfo$1;
-Landroid/hardware/location/ContextHubManager;
-Landroid/hardware/location/ContextHubMessage;
-Landroid/hardware/location/ContextHubMessage$1;
-Landroid/hardware/location/GeofenceHardwareImpl;
-Landroid/hardware/location/GeofenceHardwareImpl$1;
-Landroid/hardware/location/GeofenceHardwareImpl$2;
-Landroid/hardware/location/GeofenceHardwareImpl$3;
-Landroid/hardware/location/GeofenceHardwareImpl$Reaper;
-Landroid/hardware/location/GeofenceHardwareService;
-Landroid/hardware/location/GeofenceHardwareService$1;
-Landroid/hardware/location/IActivityRecognitionHardware;
-Landroid/hardware/location/IActivityRecognitionHardwareClient;
-Landroid/hardware/location/IActivityRecognitionHardwareClient$Stub;
-Landroid/hardware/location/IActivityRecognitionHardwareClient$Stub$Proxy;
-Landroid/hardware/location/IActivityRecognitionHardware$Stub;
-Landroid/hardware/location/IActivityRecognitionHardwareWatcher;
-Landroid/hardware/location/IContextHubCallback;
-Landroid/hardware/location/IContextHubCallback$Stub;
-Landroid/hardware/location/IContextHubCallback$Stub$Proxy;
-Landroid/hardware/location/IContextHubService;
-Landroid/hardware/location/IContextHubService$Stub;
-Landroid/hardware/location/IGeofenceHardware;
-Landroid/hardware/location/IGeofenceHardwareMonitorCallback;
-Landroid/hardware/location/IGeofenceHardwareMonitorCallback$Stub;
-Landroid/hardware/location/IGeofenceHardwareMonitorCallback$Stub$Proxy;
-Landroid/hardware/location/IGeofenceHardware$Stub;
-Landroid/hardware/location/MemoryRegion;
-Landroid/hardware/location/NanoApp;
-Landroid/hardware/location/NanoAppFilter;
-Landroid/hardware/location/NanoAppFilter$1;
-Landroid/hardware/location/NanoAppInstanceInfo;
-Landroid/hardware/location/NanoAppInstanceInfo$1;
-Landroid/hardware/radio/RadioManager;
-Landroid/hardware/radio/RadioManager$AmBandConfig;
-Landroid/hardware/radio/RadioManager$AmBandConfig$1;
-Landroid/hardware/radio/RadioManager$AmBandDescriptor;
-Landroid/hardware/radio/RadioManager$AmBandDescriptor$1;
-Landroid/hardware/radio/RadioManager$BandConfig;
-Landroid/hardware/radio/RadioManager$BandConfig$1;
-Landroid/hardware/radio/RadioManager$BandDescriptor;
-Landroid/hardware/radio/RadioManager$BandDescriptor$1;
-Landroid/hardware/radio/RadioManager$FmBandConfig;
-Landroid/hardware/radio/RadioManager$FmBandConfig$1;
-Landroid/hardware/radio/RadioManager$FmBandDescriptor;
-Landroid/hardware/radio/RadioManager$FmBandDescriptor$1;
-Landroid/hardware/radio/RadioManager$ModuleProperties;
-Landroid/hardware/radio/RadioManager$ModuleProperties$1;
-Landroid/hardware/radio/RadioManager$ProgramInfo;
-Landroid/hardware/radio/RadioManager$ProgramInfo$1;
-Landroid/hardware/radio/RadioMetadata;
-Landroid/hardware/radio/RadioMetadata$1;
-Landroid/hardware/radio/RadioModule;
-Landroid/hardware/radio/RadioTuner;
-Landroid/hardware/Sensor;
-Landroid/hardware/SensorEvent;
-Landroid/hardware/SensorEventListener;
-Landroid/hardware/SensorManager;
-Landroid/hardware/SerialManager;
-Landroid/hardware/SerialPort;
-Landroid/hardware/soundtrigger/IRecognitionStatusCallback;
-Landroid/hardware/soundtrigger/SoundTrigger;
-Landroid/hardware/soundtrigger/SoundTrigger$ConfidenceLevel;
-Landroid/hardware/soundtrigger/SoundTrigger$ConfidenceLevel$1;
-Landroid/hardware/soundtrigger/SoundTrigger$GenericRecognitionEvent;
-Landroid/hardware/soundtrigger/SoundTrigger$GenericRecognitionEvent$1;
-Landroid/hardware/soundtrigger/SoundTrigger$GenericSoundModel;
-Landroid/hardware/soundtrigger/SoundTrigger$Keyphrase;
-Landroid/hardware/soundtrigger/SoundTrigger$Keyphrase$1;
-Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionEvent;
-Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionEvent$1;
-Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionExtra;
-Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionExtra$1;
-Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseSoundModel;
-Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseSoundModel$1;
-Landroid/hardware/soundtrigger/SoundTriggerModule;
-Landroid/hardware/soundtrigger/SoundTrigger$ModuleProperties;
-Landroid/hardware/soundtrigger/SoundTrigger$ModuleProperties$1;
-Landroid/hardware/soundtrigger/SoundTrigger$RecognitionConfig;
-Landroid/hardware/soundtrigger/SoundTrigger$RecognitionConfig$1;
-Landroid/hardware/soundtrigger/SoundTrigger$RecognitionEvent;
-Landroid/hardware/soundtrigger/SoundTrigger$RecognitionEvent$1;
-Landroid/hardware/soundtrigger/SoundTrigger$SoundModel;
-Landroid/hardware/soundtrigger/SoundTrigger$SoundModelEvent;
-Landroid/hardware/soundtrigger/SoundTrigger$SoundModelEvent$1;
-Landroid/hardware/soundtrigger/SoundTrigger$StatusListener;
-Landroid/hardware/SystemSensorManager;
-Landroid/hardware/SystemSensorManager$BaseEventQueue;
-Landroid/hardware/SystemSensorManager$SensorEventQueue;
-Landroid/hardware/TriggerEvent;
-Landroid/hardware/TriggerEventListener;
-Landroid/hardware/usb/IUsbManager;
-Landroid/hardware/usb/IUsbManager$Stub;
-Landroid/hardware/usb/UsbAccessory;
-Landroid/hardware/usb/UsbDevice;
-Landroid/hardware/usb/UsbDeviceConnection;
-Landroid/hardware/usb/UsbManager;
-Landroid/hardware/usb/UsbPort;
-Landroid/hardware/usb/UsbPort$1;
-Landroid/hardware/usb/UsbPortStatus;
-Landroid/hardware/usb/UsbPortStatus$1;
-Landroid/hardware/usb/UsbRequest;
-Landroid/hardware/usb/V1_0/IUsb;
-Landroid/hardware/usb/V1_0/IUsbCallback;
-Landroid/hardware/usb/V1_0/IUsbCallback$Stub;
-Landroid/hardware/usb/V1_0/IUsb$Proxy;
-Landroid/hardware/usb/V1_0/PortStatus;
-Landroid/hardware/wifi/V1_0/IWifiEventCallback;
-Landroid/hardware/wifi/V1_0/IWifiEventCallback$Stub;
-Landroid/hidl/base/V1_0/IBase;
-Landroid/hidl/manager/V1_0/IServiceManager;
-Landroid/hidl/manager/V1_0/IServiceManager$Proxy;
-Landroid/hidl/manager/V1_0/IServiceNotification;
-Landroid/hidl/manager/V1_0/IServiceNotification$Stub;
-Landroid/icu/impl/BMPSet;
-Landroid/icu/impl/CacheBase;
-Landroid/icu/impl/CacheValue;
-Landroid/icu/impl/CacheValue$NullValue;
-Landroid/icu/impl/CacheValue$SoftValue;
-Landroid/icu/impl/CacheValue$Strength;
-Landroid/icu/impl/CharTrie;
-Landroid/icu/impl/ClassLoaderUtil;
-Landroid/icu/impl/CurrencyData;
-Landroid/icu/impl/CurrencyData$CurrencyDisplayInfo;
-Landroid/icu/impl/CurrencyData$CurrencyDisplayInfoProvider;
-Landroid/icu/impl/CurrencyData$CurrencySpacingInfo;
-Landroid/icu/impl/CurrencyData$CurrencySpacingInfo$SpacingPattern;
-Landroid/icu/impl/CurrencyData$CurrencySpacingInfo$SpacingType;
-Landroid/icu/impl/ICUBinary;
-Landroid/icu/impl/ICUBinary$Authenticate;
-Landroid/icu/impl/ICUBinary$DataFile;
-Landroid/icu/impl/ICUBinary$DatPackageReader;
-Landroid/icu/impl/ICUBinary$DatPackageReader$IsAcceptable;
-Landroid/icu/impl/ICUBinary$PackageDataFile;
-Landroid/icu/impl/ICUCache;
-Landroid/icu/impl/ICUConfig;
-Landroid/icu/impl/ICUCurrencyDisplayInfoProvider;
-Landroid/icu/impl/ICUCurrencyDisplayInfoProvider$ICUCurrencyDisplayInfo;
-Landroid/icu/impl/ICUCurrencyDisplayInfoProvider$ICUCurrencyDisplayInfo$SpacingInfoSink;
-Landroid/icu/impl/ICUCurrencyMetaInfo;
-Landroid/icu/impl/ICUCurrencyMetaInfo$Collector;
-Landroid/icu/impl/ICUCurrencyMetaInfo$CurrencyCollector;
-Landroid/icu/impl/ICUCurrencyMetaInfo$UniqueList;
-Landroid/icu/impl/ICUData;
-Landroid/icu/impl/ICUDebug;
-Landroid/icu/impl/ICULangDataTables;
-Landroid/icu/impl/ICURegionDataTables;
-Landroid/icu/impl/ICUResourceBundle;
-Landroid/icu/impl/ICUResourceBundle$1;
-Landroid/icu/impl/ICUResourceBundle$2;
-Landroid/icu/impl/ICUResourceBundle$4;
-Landroid/icu/impl/ICUResourceBundleImpl;
-Landroid/icu/impl/ICUResourceBundleImpl$ResourceArray;
-Landroid/icu/impl/ICUResourceBundleImpl$ResourceContainer;
-Landroid/icu/impl/ICUResourceBundleImpl$ResourceInt;
-Landroid/icu/impl/ICUResourceBundleImpl$ResourceString;
-Landroid/icu/impl/ICUResourceBundleImpl$ResourceTable;
-Landroid/icu/impl/ICUResourceBundle$Loader;
-Landroid/icu/impl/ICUResourceBundle$OpenType;
-Landroid/icu/impl/ICUResourceBundleReader;
-Landroid/icu/impl/ICUResourceBundleReader$Array;
-Landroid/icu/impl/ICUResourceBundleReader$Array16;
-Landroid/icu/impl/ICUResourceBundleReader$Array32;
-Landroid/icu/impl/ICUResourceBundleReader$Container;
-Landroid/icu/impl/ICUResourceBundleReader$IsAcceptable;
-Landroid/icu/impl/ICUResourceBundleReader$ReaderCache;
-Landroid/icu/impl/ICUResourceBundleReader$ReaderCacheKey;
-Landroid/icu/impl/ICUResourceBundleReader$ReaderValue;
-Landroid/icu/impl/ICUResourceBundleReader$ResourceCache;
-Landroid/icu/impl/ICUResourceBundleReader$ResourceCache$Level;
-Landroid/icu/impl/ICUResourceBundleReader$Table;
-Landroid/icu/impl/ICUResourceBundleReader$Table16;
-Landroid/icu/impl/ICUResourceBundleReader$Table1632;
-Landroid/icu/impl/ICUResourceBundle$WholeBundle;
-Landroid/icu/impl/ICUResourceTableAccess;
-Landroid/icu/impl/IDNA2003;
-Landroid/icu/impl/locale/AsciiUtil;
-Landroid/icu/impl/locale/BaseLocale;
-Landroid/icu/impl/locale/BaseLocale$Cache;
-Landroid/icu/impl/locale/BaseLocale$Key;
-Landroid/icu/impl/LocaleDisplayNamesImpl;
-Landroid/icu/impl/LocaleDisplayNamesImpl$Cache;
-Landroid/icu/impl/LocaleDisplayNamesImpl$CapitalizationContextUsage;
-Landroid/icu/impl/LocaleDisplayNamesImpl$DataTable;
-Landroid/icu/impl/LocaleDisplayNamesImpl$DataTables;
-Landroid/icu/impl/LocaleDisplayNamesImpl$ICUDataTable;
-Landroid/icu/impl/LocaleDisplayNamesImpl$ICUDataTables;
-Landroid/icu/impl/LocaleDisplayNamesImpl$LangDataTables;
-Landroid/icu/impl/LocaleDisplayNamesImpl$RegionDataTables;
-Landroid/icu/impl/LocaleIDParser;
-Landroid/icu/impl/LocaleIDs;
-Landroid/icu/impl/locale/LocaleObjectCache;
-Landroid/icu/impl/locale/LocaleObjectCache$CacheEntry;
-Landroid/icu/impl/locale/LocaleSyntaxException;
-Landroid/icu/impl/Norm2AllModes;
-Landroid/icu/impl/Norm2AllModes$1;
-Landroid/icu/impl/Norm2AllModes$ComposeNormalizer2;
-Landroid/icu/impl/Norm2AllModes$DecomposeNormalizer2;
-Landroid/icu/impl/Norm2AllModes$FCDNormalizer2;
-Landroid/icu/impl/Norm2AllModes$NFKCSingleton;
-Landroid/icu/impl/Norm2AllModes$NoopNormalizer2;
-Landroid/icu/impl/Norm2AllModes$Norm2AllModesSingleton;
-Landroid/icu/impl/Norm2AllModes$Normalizer2WithImpl;
-Landroid/icu/impl/Normalizer2Impl;
-Landroid/icu/impl/Normalizer2Impl$1;
-Landroid/icu/impl/Normalizer2Impl$IsAcceptable;
-Landroid/icu/impl/Pair;
-Landroid/icu/impl/ReplaceableUCharacterIterator;
-Landroid/icu/impl/SimpleCache;
-Landroid/icu/impl/SimpleFormatterImpl;
-Landroid/icu/impl/SoftCache;
-Landroid/icu/impl/StringPrepDataReader;
-Landroid/icu/impl/Trie;
-Landroid/icu/impl/Trie2;
-Landroid/icu/impl/Trie2$1;
-Landroid/icu/impl/Trie2_16;
-Landroid/icu/impl/Trie2$UTrie2Header;
-Landroid/icu/impl/Trie2$ValueMapper;
-Landroid/icu/impl/Trie2$ValueWidth;
-Landroid/icu/impl/Trie$DataManipulate;
-Landroid/icu/impl/Trie$DefaultGetFoldingOffset;
-Landroid/icu/impl/UBiDiProps;
-Landroid/icu/impl/UBiDiProps$IsAcceptable;
-Landroid/icu/impl/UCharacterProperty;
-Landroid/icu/impl/UCharacterProperty$1;
-Landroid/icu/impl/UCharacterProperty$10;
-Landroid/icu/impl/UCharacterProperty$11;
-Landroid/icu/impl/UCharacterProperty$12;
-Landroid/icu/impl/UCharacterProperty$13;
-Landroid/icu/impl/UCharacterProperty$14;
-Landroid/icu/impl/UCharacterProperty$15;
-Landroid/icu/impl/UCharacterProperty$16;
-Landroid/icu/impl/UCharacterProperty$17;
-Landroid/icu/impl/UCharacterProperty$18;
-Landroid/icu/impl/UCharacterProperty$19;
-Landroid/icu/impl/UCharacterProperty$2;
-Landroid/icu/impl/UCharacterProperty$20;
-Landroid/icu/impl/UCharacterProperty$21;
-Landroid/icu/impl/UCharacterProperty$22;
-Landroid/icu/impl/UCharacterProperty$23;
-Landroid/icu/impl/UCharacterProperty$3;
-Landroid/icu/impl/UCharacterProperty$4;
-Landroid/icu/impl/UCharacterProperty$5;
-Landroid/icu/impl/UCharacterProperty$6;
-Landroid/icu/impl/UCharacterProperty$7;
-Landroid/icu/impl/UCharacterProperty$8;
-Landroid/icu/impl/UCharacterProperty$9;
-Landroid/icu/impl/UCharacterProperty$BiDiIntProperty;
-Landroid/icu/impl/UCharacterProperty$BinaryProperty;
-Landroid/icu/impl/UCharacterProperty$CaseBinaryProperty;
-Landroid/icu/impl/UCharacterProperty$CombiningClassIntProperty;
-Landroid/icu/impl/UCharacterProperty$IntProperty;
-Landroid/icu/impl/UCharacterProperty$IsAcceptable;
-Landroid/icu/impl/UCharacterProperty$NormInertBinaryProperty;
-Landroid/icu/impl/UCharacterProperty$NormQuickCheckIntProperty;
-Landroid/icu/impl/UResource$Array;
-Landroid/icu/impl/UResource$Key;
-Landroid/icu/impl/UResource$Sink;
-Landroid/icu/impl/UResource$Table;
-Landroid/icu/impl/UResource$Value;
-Landroid/icu/impl/Utility;
-Landroid/icu/lang/UCharacter;
-Landroid/icu/lang/UCharacterEnums$ECharacterCategory;
-Landroid/icu/lang/UCharacterEnums$ECharacterDirection;
-Landroid/icu/math/BigDecimal;
-Landroid/icu/math/MathContext;
-Landroid/icu/text/CurrencyDisplayNames;
-Landroid/icu/text/CurrencyMetaInfo;
-Landroid/icu/text/CurrencyMetaInfo$CurrencyDigits;
-Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;
-Landroid/icu/text/DecimalFormat;
-Landroid/icu/text/DecimalFormatSymbols;
-Landroid/icu/text/DecimalFormatSymbols$1;
-Landroid/icu/text/DecimalFormatSymbols$CacheData;
-Landroid/icu/text/DecimalFormatSymbols$DecFmtDataSink;
-Landroid/icu/text/DecimalFormat$Unit;
-Landroid/icu/text/DigitList;
-Landroid/icu/text/DisplayContext;
-Landroid/icu/text/DisplayContext$Type;
-Landroid/icu/text/IDNA;
-Landroid/icu/text/LocaleDisplayNames;
-Landroid/icu/text/LocaleDisplayNames$DialectHandling;
-Landroid/icu/text/Normalizer;
-Landroid/icu/text/Normalizer2;
-Landroid/icu/text/Normalizer$FCDMode;
-Landroid/icu/text/Normalizer$Mode;
-Landroid/icu/text/Normalizer$ModeImpl;
-Landroid/icu/text/Normalizer$NFCMode;
-Landroid/icu/text/Normalizer$NFDMode;
-Landroid/icu/text/Normalizer$NFKCMode;
-Landroid/icu/text/Normalizer$NFKDMode;
-Landroid/icu/text/Normalizer$NFKDModeImpl;
-Landroid/icu/text/Normalizer$NONEMode;
-Landroid/icu/text/Normalizer$QuickCheckResult;
-Landroid/icu/text/NumberFormat;
-Landroid/icu/text/NumberFormat$Field;
-Landroid/icu/text/NumberingSystem;
-Landroid/icu/text/NumberingSystem$1;
-Landroid/icu/text/NumberingSystem$2;
-Landroid/icu/text/NumberingSystem$LocaleLookupData;
-Landroid/icu/text/Replaceable;
-Landroid/icu/text/ReplaceableString;
-Landroid/icu/text/StringPrep;
-Landroid/icu/text/StringPrepParseException;
-Landroid/icu/text/TimeZoneNames$NameType;
-Landroid/icu/text/UCharacterIterator;
-Landroid/icu/text/UFieldPosition;
-Landroid/icu/text/UFormat;
-Landroid/icu/text/UForwardCharacterIterator;
-Landroid/icu/text/UnicodeFilter;
-Landroid/icu/text/UnicodeMatcher;
-Landroid/icu/text/UnicodeSet;
-Landroid/icu/text/UTF16;
-Landroid/icu/util/Currency;
-Landroid/icu/util/Currency$1;
-Landroid/icu/util/Currency$CurrencyUsage;
-Landroid/icu/util/Currency$EquivalenceRelation;
-Landroid/icu/util/Freezable;
-Landroid/icu/util/MeasureUnit;
-Landroid/icu/util/MeasureUnit$1;
-Landroid/icu/util/MeasureUnit$2;
-Landroid/icu/util/MeasureUnit$3;
-Landroid/icu/util/MeasureUnit$Factory;
-Landroid/icu/util/TimeUnit;
-Landroid/icu/util/TimeZone;
-Landroid/icu/util/TimeZone$ConstantZone;
-Landroid/icu/util/ULocale;
-Landroid/icu/util/ULocale$1;
-Landroid/icu/util/ULocale$2;
-Landroid/icu/util/ULocale$Category;
-Landroid/icu/util/ULocale$JDKLocaleHelper;
-Landroid/icu/util/ULocale$Type;
-Landroid/icu/util/UResourceBundle;
-Landroid/icu/util/UResourceBundle$RootType;
-Landroid/icu/util/UResourceTypeMismatchException;
-Landroid/icu/util/VersionInfo;
-Landroid/location/Address;
-Landroid/location/Address$1;
-Landroid/location/Country;
-Landroid/location/Country$1;
-Landroid/location/CountryDetector;
-Landroid/location/CountryDetector$ListenerTransport;
-Landroid/location/CountryListener;
-Landroid/location/Criteria;
-Landroid/location/Geocoder;
-Landroid/location/GeocoderParams;
-Landroid/location/GeocoderParams$1;
-Landroid/location/Geofence;
-Landroid/location/GnssMeasurementCallbackTransport;
-Landroid/location/GnssMeasurementCallbackTransport$ListenerTransport;
-Landroid/location/GnssNavigationMessageCallbackTransport;
-Landroid/location/GnssNavigationMessageCallbackTransport$ListenerTransport;
-Landroid/location/ICountryDetector;
-Landroid/location/ICountryDetector$Stub;
-Landroid/location/ICountryListener;
-Landroid/location/ICountryListener$Stub;
-Landroid/location/ICountryListener$Stub$Proxy;
-Landroid/location/IGeocodeProvider;
-Landroid/location/IGeocodeProvider$Stub;
-Landroid/location/IGeocodeProvider$Stub$Proxy;
-Landroid/location/IGeofenceProvider;
-Landroid/location/IGeofenceProvider$Stub;
-Landroid/location/IGeofenceProvider$Stub$Proxy;
-Landroid/location/IGnssMeasurementsListener;
-Landroid/location/IGnssMeasurementsListener$Stub;
-Landroid/location/IGnssNavigationMessageListener;
-Landroid/location/IGnssNavigationMessageListener$Stub;
-Landroid/location/IGnssStatusListener;
-Landroid/location/IGnssStatusListener$Stub;
-Landroid/location/IGnssStatusListener$Stub$Proxy;
-Landroid/location/IGnssStatusProvider;
-Landroid/location/IGnssStatusProvider$Stub;
-Landroid/location/IGpsGeofenceHardware;
-Landroid/location/IGpsGeofenceHardware$Stub;
-Landroid/location/ILocationListener;
-Landroid/location/ILocationListener$Stub;
-Landroid/location/ILocationListener$Stub$Proxy;
-Landroid/location/ILocationManager;
-Landroid/location/ILocationManager$Stub;
-Landroid/location/INetInitiatedListener;
-Landroid/location/INetInitiatedListener$Stub;
-Landroid/location/LocalListenerHelper;
-Landroid/location/Location;
-Landroid/location/Location$1;
-Landroid/location/Location$2;
-Landroid/location/LocationListener;
-Landroid/location/LocationManager;
-Landroid/location/LocationManager$ListenerTransport;
-Landroid/location/LocationManager$ListenerTransport$1;
-Landroid/location/LocationManager$ListenerTransport$2;
-Landroid/location/LocationRequest;
-Landroid/location/LocationRequest$1;
-Landroid/media/AudioAttributes;
-Landroid/media/AudioAttributes$1;
-Landroid/media/AudioAttributes$Builder;
-Landroid/media/AudioDeviceCallback;
-Landroid/media/AudioDeviceInfo;
-Landroid/media/AudioDevicePort;
-Landroid/media/AudioDevicePortConfig;
-Landroid/media/AudioFocusInfo;
-Landroid/media/AudioFocusInfo$1;
-Landroid/media/AudioFormat;
-Landroid/media/AudioFormat$1;
-Landroid/media/AudioFormat$Builder;
-Landroid/media/AudioGain;
-Landroid/media/AudioGainConfig;
-Landroid/media/AudioHandle;
-Landroid/media/AudioManager;
-Landroid/media/AudioManager$1;
-Landroid/media/AudioManager$2;
-Landroid/media/AudioManager$3;
-Landroid/media/AudioManagerInternal;
-Landroid/media/AudioManagerInternal$RingerModeDelegate;
-Landroid/media/AudioManager$NativeEventHandlerDelegate;
-Landroid/media/AudioManager$NativeEventHandlerDelegate$1;
-Landroid/media/AudioManager$OnAmPortUpdateListener;
-Landroid/media/AudioManager$OnAudioPortUpdateListener;
-Landroid/media/AudioManager$ServiceEventHandlerDelegate;
-Landroid/media/AudioManager$ServiceEventHandlerDelegate$1;
-Landroid/media/AudioMixPort;
-Landroid/media/AudioMixPortConfig;
-Landroid/media/AudioPatch;
-Landroid/media/AudioPlaybackConfiguration;
-Landroid/media/AudioPlaybackConfiguration$1;
-Landroid/media/AudioPlaybackConfiguration$IPlayerShell;
-Landroid/media/AudioPlaybackConfiguration$PlayerDeathMonitor;
-Landroid/media/audiopolicy/AudioMix;
-Landroid/media/audiopolicy/AudioMixingRule;
-Landroid/media/audiopolicy/AudioMixingRule$AudioMixMatchCriterion;
-Landroid/media/audiopolicy/AudioPolicyConfig;
-Landroid/media/audiopolicy/IAudioPolicyCallback;
-Landroid/media/audiopolicy/IAudioPolicyCallback$Stub;
-Landroid/media/AudioPort;
-Landroid/media/AudioPortConfig;
-Landroid/media/AudioPortEventHandler;
-Landroid/media/AudioPortEventHandler$1;
-Landroid/media/AudioRecord;
-Landroid/media/AudioRecordingConfiguration;
-Landroid/media/AudioRecordingConfiguration$1;
-Landroid/media/AudioRoutesInfo;
-Landroid/media/AudioRoutesInfo$1;
-Landroid/media/AudioRouting;
-Landroid/media/AudioSystem;
-Landroid/media/AudioSystem$AudioRecordingCallback;
-Landroid/media/AudioSystem$DynamicPolicyCallback;
-Landroid/media/AudioSystem$ErrorCallback;
-Landroid/media/AudioTimestamp;
-Landroid/media/AudioTrack;
-Landroid/media/CamcorderProfile;
-Landroid/media/CameraProfile;
-Landroid/media/DecoderCapabilities;
-Landroid/media/EncoderCapabilities;
-Landroid/media/IAudioFocusDispatcher;
-Landroid/media/IAudioFocusDispatcher$Stub;
-Landroid/media/IAudioFocusDispatcher$Stub$Proxy;
-Landroid/media/IAudioRoutesObserver;
-Landroid/media/IAudioRoutesObserver$Stub;
-Landroid/media/IAudioRoutesObserver$Stub$Proxy;
-Landroid/media/IAudioService;
-Landroid/media/IAudioService$Stub;
-Landroid/media/Image;
-Landroid/media/ImageReader;
-Landroid/media/ImageReader$SurfaceImage;
-Landroid/media/ImageWriter;
-Landroid/media/ImageWriter$WriterSurfaceImage;
-Landroid/media/IMediaHTTPConnection;
-Landroid/media/IMediaHTTPConnection$Stub;
-Landroid/media/IMediaResourceMonitor;
-Landroid/media/IMediaResourceMonitor$Stub;
-Landroid/media/IMediaRouterClient;
-Landroid/media/IMediaRouterClient$Stub;
-Landroid/media/IMediaRouterClient$Stub$Proxy;
-Landroid/media/IMediaRouterService;
-Landroid/media/IMediaRouterService$Stub;
-Landroid/media/IPlaybackConfigDispatcher;
-Landroid/media/IPlaybackConfigDispatcher$Stub;
-Landroid/media/IPlayer;
-Landroid/media/IPlayer$Stub;
-Landroid/media/IPlayer$Stub$Proxy;
-Landroid/media/IRecordingConfigDispatcher;
-Landroid/media/IRecordingConfigDispatcher$Stub;
-Landroid/media/IRemoteVolumeController;
-Landroid/media/IRemoteVolumeController$Stub;
-Landroid/media/IRemoteVolumeController$Stub$Proxy;
-Landroid/media/IRemoteVolumeObserver;
-Landroid/media/IRemoteVolumeObserver$Stub;
-Landroid/media/IRingtonePlayer;
-Landroid/media/IRingtonePlayer$Stub;
-Landroid/media/IRingtonePlayer$Stub$Proxy;
-Landroid/media/IVolumeController;
-Landroid/media/IVolumeController$Stub;
-Landroid/media/IVolumeController$Stub$Proxy;
-Landroid/media/JetPlayer;
-Landroid/media/MediaCodec;
-Landroid/media/MediaCodecList;
-Landroid/media/MediaCrypto;
-Landroid/media/MediaDescription;
-Landroid/media/MediaDescription$1;
-Landroid/media/MediaDrm;
-Landroid/media/MediaExtractor;
-Landroid/media/MediaHTTPConnection;
-Landroid/media/MediaMetadata;
-Landroid/media/MediaMetadata$1;
-Landroid/media/MediaMetadata$Builder;
-Landroid/media/MediaMetadataRetriever;
-Landroid/media/MediaMuxer;
-Landroid/media/MediaPlayer;
-Landroid/media/MediaRecorder;
-Landroid/media/MediaRouter;
-Landroid/media/MediaRouter$Callback;
-Landroid/media/MediaRouter$CallbackInfo;
-Landroid/media/MediaRouterClientState;
-Landroid/media/MediaRouterClientState$1;
-Landroid/media/MediaRouter$RouteCategory;
-Landroid/media/MediaRouter$RouteInfo;
-Landroid/media/MediaRouter$RouteInfo$1;
-Landroid/media/MediaRouter$SimpleCallback;
-Landroid/media/MediaRouter$Static;
-Landroid/media/MediaRouter$Static$1;
-Landroid/media/MediaRouter$Static$Client;
-Landroid/media/MediaRouter$Static$Client$1;
-Landroid/media/MediaRouter$VolumeChangeReceiver;
-Landroid/media/MediaRouter$WifiDisplayStatusChangedReceiver;
-Landroid/media/MediaScanner;
-Landroid/media/MediaSync;
-Landroid/media/midi/IMidiDeviceListener;
-Landroid/media/midi/IMidiDeviceOpenCallback;
-Landroid/media/midi/IMidiDeviceServer;
-Landroid/media/midi/IMidiManager;
-Landroid/media/midi/IMidiManager$Stub;
-Landroid/media/midi/MidiDeviceInfo;
-Landroid/media/midi/MidiDeviceStatus;
-Landroid/media/midi/MidiManager;
-Landroid/media/PlaybackParams;
-Landroid/media/PlaybackParams$1;
-Landroid/media/PlayerBase;
-Landroid/media/PlayerBase$1;
-Landroid/media/PlayerBase$2;
-Landroid/media/PlayerBase$PlayerIdCard;
-Landroid/media/PlayerBase$PlayerIdCard$1;
-Landroid/media/projection/IMediaProjection;
-Landroid/media/projection/IMediaProjectionManager;
-Landroid/media/projection/IMediaProjectionManager$Stub;
-Landroid/media/projection/IMediaProjectionWatcherCallback;
-Landroid/media/projection/IMediaProjectionWatcherCallback$Stub;
-Landroid/media/projection/IMediaProjectionWatcherCallback$Stub$Proxy;
-Landroid/media/projection/MediaProjectionInfo;
-Landroid/media/projection/MediaProjectionManager;
-Landroid/media/Rating;
-Landroid/media/Rating$1;
-Landroid/media/RemoteDisplay;
-Landroid/media/ResampleInputStream;
-Landroid/media/session/IActiveSessionsListener;
-Landroid/media/session/IActiveSessionsListener$Stub;
-Landroid/media/session/IActiveSessionsListener$Stub$Proxy;
-Landroid/media/session/IOnMediaKeyListener;
-Landroid/media/session/IOnVolumeKeyLongPressListener;
-Landroid/media/session/ISession;
-Landroid/media/session/ISessionCallback;
-Landroid/media/session/ISessionCallback$Stub;
-Landroid/media/session/ISessionCallback$Stub$Proxy;
-Landroid/media/session/ISessionController;
-Landroid/media/session/ISessionControllerCallback;
-Landroid/media/session/ISessionControllerCallback$Stub;
-Landroid/media/session/ISessionControllerCallback$Stub$Proxy;
-Landroid/media/session/ISessionController$Stub;
-Landroid/media/session/ISessionManager;
-Landroid/media/session/ISessionManager$Stub;
-Landroid/media/session/ISession$Stub;
-Landroid/media/session/MediaController;
-Landroid/media/session/MediaController$CallbackStub;
-Landroid/media/session/MediaController$TransportControls;
-Landroid/media/session/MediaSession;
-Landroid/media/session/MediaSession$Callback;
-Landroid/media/session/MediaSession$CallbackMessageHandler;
-Landroid/media/session/MediaSession$CallbackStub;
-Landroid/media/session/MediaSessionManager;
-Landroid/media/session/MediaSession$QueueItem;
-Landroid/media/session/MediaSession$QueueItem$1;
-Landroid/media/session/MediaSession$Token;
-Landroid/media/session/MediaSession$Token$1;
-Landroid/media/session/ParcelableVolumeInfo;
-Landroid/media/session/ParcelableVolumeInfo$1;
-Landroid/media/session/PlaybackState;
-Landroid/media/session/PlaybackState$1;
-Landroid/media/session/PlaybackState$Builder;
-Landroid/media/session/PlaybackState$CustomAction;
-Landroid/media/session/PlaybackState$CustomAction$1;
-Landroid/media/SoundPool;
-Landroid/media/SoundPool$Builder;
-Landroid/media/SoundPool$EventHandler;
-Landroid/media/SoundPool$OnLoadCompleteListener;
-Landroid/media/soundtrigger/SoundTriggerManager;
-Landroid/media/SubtitleController$Listener;
-Landroid/media/ToneGenerator;
-Landroid/media/tv/TvInputHardwareInfo$Builder;
-Landroid/media/tv/TvInputManager;
-Landroid/media/tv/TvStreamConfig;
-Landroid/media/tv/TvStreamConfig$Builder;
-Landroid/media/VolumePolicy;
-Landroid/media/VolumePolicy$1;
-Landroid/metrics/LogMaker;
-Landroid/mtp/MtpDatabase;
-Landroid/mtp/MtpDevice;
-Landroid/mtp/MtpDeviceInfo;
-Landroid/mtp/MtpEvent;
-Landroid/mtp/MtpObjectInfo;
-Landroid/mtp/MtpPropertyGroup;
-Landroid/mtp/MtpPropertyList;
-Landroid/mtp/MtpServer;
-Landroid/mtp/MtpStorage;
-Landroid/mtp/MtpStorageInfo;
-Landroid/net/apf/ApfCapabilities;
-Landroid/net/apf/ApfFilter;
-Landroid/net/apf/ApfFilter$ProcessRaResult;
-Landroid/net/apf/ApfFilter$Ra;
-Landroid/net/apf/ApfFilter$ReceiveThread;
-Landroid/net/apf/ApfGenerator;
-Landroid/net/apf/ApfGenerator$ExtendedOpcodes;
-Landroid/net/apf/ApfGenerator$IllegalInstructionException;
-Landroid/net/apf/ApfGenerator$Instruction;
-Landroid/net/apf/ApfGenerator$Opcodes;
-Landroid/net/apf/ApfGenerator$Register;
-Landroid/net/ConnectivityManager;
-Landroid/net/ConnectivityManager$CallbackHandler;
-Landroid/net/ConnectivityManager$NetworkCallback;
-Landroid/net/ConnectivityManager$OnNetworkActiveListener;
-Landroid/net/ConnectivityMetricsEvent;
-Landroid/net/ConnectivityMetricsEvent$1;
-Landroid/net/ConnectivityMetricsEvent$Reference;
-Landroid/net/ConnectivityThread;
-Landroid/net/ConnectivityThread$Singleton;
-Landroid/net/Credentials;
-Landroid/net/DataUsageRequest;
-Landroid/net/dhcp/DhcpAckPacket;
-Landroid/net/dhcp/DhcpClient;
-Landroid/net/dhcp/DhcpClient$ConfiguringInterfaceState;
-Landroid/net/dhcp/DhcpClient$DhcpBoundState;
-Landroid/net/dhcp/DhcpClient$DhcpHaveLeaseState;
-Landroid/net/dhcp/DhcpClient$DhcpInitRebootState;
-Landroid/net/dhcp/DhcpClient$DhcpInitState;
-Landroid/net/dhcp/DhcpClient$DhcpReacquiringState;
-Landroid/net/dhcp/DhcpClient$DhcpRebindingState;
-Landroid/net/dhcp/DhcpClient$DhcpRebootingState;
-Landroid/net/dhcp/DhcpClient$DhcpRenewingState;
-Landroid/net/dhcp/DhcpClient$DhcpRequestingState;
-Landroid/net/dhcp/DhcpClient$DhcpSelectingState;
-Landroid/net/dhcp/DhcpClient$DhcpState;
-Landroid/net/dhcp/DhcpClient$LoggingState;
-Landroid/net/dhcp/DhcpClient$PacketRetransmittingState;
-Landroid/net/dhcp/DhcpClient$ReceiveThread;
-Landroid/net/dhcp/DhcpClient$StoppedState;
-Landroid/net/dhcp/DhcpClient$WaitBeforeOtherState;
-Landroid/net/dhcp/DhcpClient$WaitBeforeRenewalState;
-Landroid/net/dhcp/DhcpClient$WaitBeforeStartState;
-Landroid/net/dhcp/DhcpDiscoverPacket;
-Landroid/net/dhcp/DhcpOfferPacket;
-Landroid/net/dhcp/DhcpPacket;
-Landroid/net/dhcp/DhcpPacket$ParseException;
-Landroid/net/dhcp/DhcpRequestPacket;
-Landroid/net/DhcpInfo;
-Landroid/net/DhcpInfo$1;
-Landroid/net/DhcpResults;
-Landroid/net/DhcpResults$1;
-Landroid/net/EthernetManager;
-Landroid/net/EthernetManager$1;
-Landroid/net/EthernetManager$2;
-Landroid/net/EventLogTags;
-Landroid/net/IConnectivityManager;
-Landroid/net/IConnectivityManager$Stub;
-Landroid/net/IConnectivityMetricsLogger;
-Landroid/net/IConnectivityMetricsLogger$Stub;
-Landroid/net/IEthernetManager;
-Landroid/net/IEthernetManager$Stub;
-Landroid/net/IEthernetServiceListener;
-Landroid/net/IEthernetServiceListener$Stub;
-Landroid/net/IIpConnectivityMetrics;
-Landroid/net/IIpConnectivityMetrics$Stub;
-Landroid/net/INetd;
-Landroid/net/INetdEventCallback;
-Landroid/net/INetd$Stub;
-Landroid/net/INetd$Stub$Proxy;
-Landroid/net/INetworkManagementEventObserver;
-Landroid/net/INetworkManagementEventObserver$Stub;
-Landroid/net/INetworkPolicyListener;
-Landroid/net/INetworkPolicyListener$Stub;
-Landroid/net/INetworkPolicyListener$Stub$Proxy;
-Landroid/net/INetworkPolicyManager;
-Landroid/net/INetworkPolicyManager$Stub;
-Landroid/net/INetworkScoreCache;
-Landroid/net/INetworkScoreCache$Stub;
-Landroid/net/INetworkScoreCache$Stub$Proxy;
-Landroid/net/INetworkScoreService;
-Landroid/net/INetworkScoreService$Stub;
-Landroid/net/INetworkStatsService;
-Landroid/net/INetworkStatsService$Stub;
-Landroid/net/INetworkStatsSession;
-Landroid/net/INetworkStatsSession$Stub;
-Landroid/net/InterfaceConfiguration;
-Landroid/net/InterfaceConfiguration$1;
-Landroid/net/IpConfiguration;
-Landroid/net/IpConfiguration$1;
-Landroid/net/IpConfiguration$IpAssignment;
-Landroid/net/IpConfiguration$ProxySettings;
-Landroid/net/ip/ConnectivityPacketTracker;
-Landroid/net/ip/ConnectivityPacketTracker$PacketListener;
-Landroid/net/ip/IpManager;
-Landroid/net/ip/IpManager$1;
-Landroid/net/ip/IpManager$2;
-Landroid/net/ip/IpManager$3;
-Landroid/net/ip/IpManager$Callback;
-Landroid/net/ip/IpManager$LoggingCallbackWrapper;
-Landroid/net/ip/IpManager$MessageHandlingLogger;
-Landroid/net/ip/IpManager$ProvisioningConfiguration;
-Landroid/net/ip/IpManager$ProvisioningConfiguration$Builder;
-Landroid/net/ip/IpManager$RunningState;
-Landroid/net/ip/IpManager$StartedState;
-Landroid/net/ip/IpManager$StoppedState;
-Landroid/net/ip/IpManager$StoppingState;
-Landroid/net/ip/IpReachabilityMonitor;
-Landroid/net/ip/IpReachabilityMonitor$Callback;
-Landroid/net/ip/IpReachabilityMonitor$NetlinkSocketObserver;
-Landroid/net/IpPrefix;
-Landroid/net/IpPrefix$1;
-Landroid/net/LinkAddress;
-Landroid/net/LinkAddress$1;
-Landroid/net/LinkProperties;
-Landroid/net/LinkProperties$1;
-Landroid/net/LinkProperties$CompareResult;
-Landroid/net/LinkProperties$ProvisioningChange;
-Landroid/net/LocalServerSocket;
-Landroid/net/LocalSocket;
-Landroid/net/LocalSocketAddress;
-Landroid/net/LocalSocketAddress$Namespace;
-Landroid/net/LocalSocketImpl;
-Landroid/net/LocalSocketImpl$SocketInputStream;
-Landroid/net/LocalSocketImpl$SocketOutputStream;
-Landroid/net/metrics/ApfProgramEvent;
-Landroid/net/metrics/ApfProgramEvent$1;
-Landroid/net/metrics/ConnectStats;
-Landroid/net/metrics/DefaultNetworkEvent;
-Landroid/net/metrics/DefaultNetworkEvent$1;
-Landroid/net/metrics/DhcpClientEvent;
-Landroid/net/metrics/DhcpClientEvent$1;
-Landroid/net/metrics/DnsEvent;
-Landroid/net/metrics/DnsEvent$1;
-Landroid/net/metrics/INetdEventListener;
-Landroid/net/metrics/INetdEventListener$Stub;
-Landroid/net/metrics/IpConnectivityLog;
-Landroid/net/metrics/IpManagerEvent;
-Landroid/net/metrics/IpManagerEvent$1;
-Landroid/net/metrics/NetworkEvent;
-Landroid/net/metrics/NetworkEvent$1;
-Landroid/net/metrics/RaEvent;
-Landroid/net/metrics/RaEvent$1;
-Landroid/net/metrics/RaEvent$Builder;
-Landroid/net/metrics/ValidationProbeEvent;
-Landroid/net/metrics/ValidationProbeEvent$1;
-Landroid/net/metrics/ValidationProbeEvent$Decoder;
-Landroid/net/netlink/NetlinkConstants;
-Landroid/net/netlink/NetlinkErrorMessage;
-Landroid/net/netlink/NetlinkMessage;
-Landroid/net/netlink/NetlinkSocket;
-Landroid/net/netlink/RtNetlinkNeighborMessage;
-Landroid/net/netlink/StructNdaCacheInfo;
-Landroid/net/netlink/StructNdMsg;
-Landroid/net/netlink/StructNlAttr;
-Landroid/net/netlink/StructNlMsgHdr;
-Landroid/net/Network;
-Landroid/net/Network$1;
-Landroid/net/Network$2;
-Landroid/net/NetworkAgent;
-Landroid/net/NetworkCapabilities;
-Landroid/net/NetworkCapabilities$1;
-Landroid/net/NetworkConfig;
-Landroid/net/NetworkFactory;
-Landroid/net/NetworkFactory$NetworkRequestInfo;
-Landroid/net/NetworkIdentity;
-Landroid/net/NetworkInfo;
-Landroid/net/NetworkInfo$1;
-Landroid/net/NetworkInfo$DetailedState;
-Landroid/net/NetworkInfo$State;
-Landroid/net/NetworkKey;
-Landroid/net/NetworkKey$1;
-Landroid/net/NetworkMisc;
-Landroid/net/NetworkMisc$1;
-Landroid/net/Network$NetworkBoundSocketFactory;
-Landroid/net/NetworkPolicy;
-Landroid/net/NetworkPolicyManager;
-Landroid/net/NetworkQuotaInfo;
-Landroid/net/NetworkRequest;
-Landroid/net/NetworkRequest$1;
-Landroid/net/NetworkRequest$Builder;
-Landroid/net/NetworkRequest$Type;
-Landroid/net/NetworkScoreManager;
-Landroid/net/NetworkScorerAppManager;
-Landroid/net/NetworkState;
-Landroid/net/NetworkState$1;
-Landroid/net/NetworkStats;
-Landroid/net/NetworkStats$1;
-Landroid/net/NetworkStats$Entry;
-Landroid/net/NetworkStatsHistory;
-Landroid/net/NetworkStatsHistory$1;
-Landroid/net/NetworkStatsHistory$DataStreamUtils;
-Landroid/net/NetworkStatsHistory$Entry;
-Landroid/net/NetworkStatsHistory$ParcelUtils;
-Landroid/net/NetworkStats$NonMonotonicObserver;
-Landroid/net/NetworkTemplate;
-Landroid/net/NetworkTemplate$1;
-Landroid/net/NetworkUtils;
-Landroid/net/nsd/INsdManager;
-Landroid/net/nsd/INsdManager$Stub;
-Landroid/net/nsd/NsdManager;
-Landroid/net/ProxyInfo;
-Landroid/net/RecommendationRequest;
-Landroid/net/RecommendationResult;
-Landroid/net/RouteInfo;
-Landroid/net/RouteInfo$1;
-Landroid/net/ScoredNetwork;
-Landroid/net/SntpClient;
-Landroid/net/StaticIpConfiguration;
-Landroid/net/StaticIpConfiguration$1;
-Landroid/net/TrafficStats;
-Landroid/net/UidRange;
-Landroid/net/Uri;
-Landroid/net/Uri$1;
-Landroid/net/Uri$AbstractHierarchicalUri;
-Landroid/net/Uri$AbstractPart;
-Landroid/net/Uri$Builder;
-Landroid/net/Uri$HierarchicalUri;
-Landroid/net/Uri$OpaqueUri;
-Landroid/net/Uri$Part;
-Landroid/net/Uri$Part$EmptyPart;
-Landroid/net/Uri$PathPart;
-Landroid/net/Uri$PathSegments;
-Landroid/net/Uri$PathSegmentsBuilder;
-Landroid/net/Uri$StringUri;
-Landroid/net/util/BlockingSocketReader;
-Landroid/net/util/ConnectivityPacketSummary;
-Landroid/net/util/MultinetworkPolicyTracker;
-Landroid/net/util/MultinetworkPolicyTracker$1;
-Landroid/net/util/MultinetworkPolicyTracker$SettingObserver;
-Landroid/net/util/NetworkConstants;
-Landroid/net/util/Stopwatch;
-Landroid/net/wifi/aware/WifiAwareManager;
-Landroid/net/wifi/hotspot2/PasspointConfiguration;
-Landroid/net/wifi/IApInterface;
-Landroid/net/wifi/IClientInterface;
-Landroid/net/wifi/IClientInterface$Stub;
-Landroid/net/wifi/IClientInterface$Stub$Proxy;
-Landroid/net/wifi/IInterfaceEventCallback;
-Landroid/net/wifi/IInterfaceEventCallback$Stub;
-Landroid/net/wifi/IRttManager;
-Landroid/net/wifi/IRttManager$Stub;
-Landroid/net/wifi/IWificond;
-Landroid/net/wifi/IWificond$Stub;
-Landroid/net/wifi/IWificond$Stub$Proxy;
-Landroid/net/wifi/IWifiManager;
-Landroid/net/wifi/IWifiManager$Stub;
-Landroid/net/wifi/IWifiScanner;
-Landroid/net/wifi/IWifiScanner$Stub;
-Landroid/net/WifiKey;
-Landroid/net/WifiKey$1;
-Landroid/net/wifi/p2p/IWifiP2pManager;
-Landroid/net/wifi/p2p/IWifiP2pManager$Stub;
-Landroid/net/wifi/p2p/WifiP2pConfig;
-Landroid/net/wifi/p2p/WifiP2pConfig$1;
-Landroid/net/wifi/p2p/WifiP2pDevice;
-Landroid/net/wifi/p2p/WifiP2pDevice$1;
-Landroid/net/wifi/p2p/WifiP2pDeviceList;
-Landroid/net/wifi/p2p/WifiP2pDeviceList$1;
-Landroid/net/wifi/p2p/WifiP2pGroup;
-Landroid/net/wifi/p2p/WifiP2pGroup$1;
-Landroid/net/wifi/p2p/WifiP2pGroupList;
-Landroid/net/wifi/p2p/WifiP2pGroupList$1;
-Landroid/net/wifi/p2p/WifiP2pGroupList$2;
-Landroid/net/wifi/p2p/WifiP2pGroupList$GroupDeleteListener;
-Landroid/net/wifi/p2p/WifiP2pInfo;
-Landroid/net/wifi/p2p/WifiP2pInfo$1;
-Landroid/net/wifi/p2p/WifiP2pManager;
-Landroid/net/wifi/p2p/WifiP2pWfdInfo;
-Landroid/net/wifi/p2p/WifiP2pWfdInfo$1;
-Landroid/net/wifi/ParcelUtil;
-Landroid/net/wifi/RssiPacketCountInfo;
-Landroid/net/wifi/RttManager;
-Landroid/net/wifi/RttManager$RttCapabilities;
-Landroid/net/wifi/ScanResult;
-Landroid/net/wifi/ScanResult$1;
-Landroid/net/wifi/ScanResult$InformationElement;
-Landroid/net/wifi/ScanSettings;
-Landroid/net/wifi/SupplicantState;
-Landroid/net/wifi/SupplicantState$1;
-Landroid/net/wifi/WifiActivityEnergyInfo;
-Landroid/net/wifi/WifiActivityEnergyInfo$1;
-Landroid/net/wifi/WifiChannel;
-Landroid/net/wifi/WifiConfiguration;
-Landroid/net/wifi/WifiConfiguration$1;
-Landroid/net/wifi/WifiConfiguration$AuthAlgorithm;
-Landroid/net/wifi/WifiConfiguration$GroupCipher;
-Landroid/net/wifi/WifiConfiguration$KeyMgmt;
-Landroid/net/wifi/WifiConfiguration$NetworkSelectionStatus;
-Landroid/net/wifi/WifiConfiguration$PairwiseCipher;
-Landroid/net/wifi/WifiConfiguration$Protocol;
-Landroid/net/wifi/WifiConfiguration$Visibility;
-Landroid/net/wifi/WifiConnectionStatistics;
-Landroid/net/wifi/WifiConnectionStatistics$1;
-Landroid/net/wifi/WifiEnterpriseConfig;
-Landroid/net/wifi/WifiEnterpriseConfig$1;
-Landroid/net/wifi/WifiInfo;
-Landroid/net/wifi/WifiInfo$1;
-Landroid/net/wifi/WifiLinkLayerStats;
-Landroid/net/wifi/WifiLinkLayerStats$1;
-Landroid/net/wifi/WifiManager;
-Landroid/net/wifi/WifiNetworkScoreCache;
-Landroid/net/wifi/WifiScanner;
-Landroid/net/wifi/WifiScanner$ActionListener;
-Landroid/net/wifi/WifiScanner$ChannelSpec;
-Landroid/net/wifi/WifiScanner$ParcelableScanData;
-Landroid/net/wifi/WifiScanner$ParcelableScanData$1;
-Landroid/net/wifi/WifiScanner$ParcelableScanResults;
-Landroid/net/wifi/WifiScanner$ParcelableScanResults$1;
-Landroid/net/wifi/WifiScanner$PnoScanListener;
-Landroid/net/wifi/WifiScanner$ScanData;
-Landroid/net/wifi/WifiScanner$ScanData$1;
-Landroid/net/wifi/WifiScanner$ScanListener;
-Landroid/net/wifi/WifiScanner$ScanSettings;
-Landroid/net/wifi/WifiScanner$ScanSettings$1;
-Landroid/net/wifi/WifiScanner$ScanSettings$HiddenNetwork;
-Landroid/net/wifi/WifiScanner$ServiceHandler;
-Landroid/net/wifi/WifiSsid;
-Landroid/net/wifi/WifiSsid$1;
-Landroid/net/wifi/WifiWakeReasonAndCounts;
-Landroid/net/wifi/WpsInfo;
-Landroid/net/wifi/WpsInfo$1;
-Landroid/nfc/INfcAdapter;
-Landroid/nfc/INfcAdapter$Stub;
-Landroid/nfc/INfcAdapter$Stub$Proxy;
-Landroid/nfc/NfcManager;
-Landroid/opengl/EGL14;
-Landroid/opengl/EGLConfig;
-Landroid/opengl/EGLContext;
-Landroid/opengl/EGLDisplay;
-Landroid/opengl/EGLExt;
-Landroid/opengl/EGLObjectHandle;
-Landroid/opengl/EGLSurface;
-Landroid/opengl/ETC1;
-Landroid/opengl/GLES10;
-Landroid/opengl/GLES10Ext;
-Landroid/opengl/GLES11;
-Landroid/opengl/GLES11Ext;
-Landroid/opengl/GLES20;
-Landroid/opengl/GLES30;
-Landroid/opengl/GLES31;
-Landroid/opengl/GLES31Ext;
-Landroid/opengl/GLES32;
-Landroid/opengl/GLUtils;
-Landroid/opengl/Matrix;
-Landroid/opengl/Visibility;
-Landroid/os/AsyncTask;
-Landroid/os/AsyncTask$1;
-Landroid/os/AsyncTask$2;
-Landroid/os/AsyncTask$3;
-Landroid/os/AsyncTask$AsyncTaskResult;
-Landroid/os/AsyncTask$InternalHandler;
-Landroid/os/AsyncTask$SerialExecutor;
-Landroid/os/AsyncTask$SerialExecutor$1;
-Landroid/os/AsyncTask$Status;
-Landroid/os/AsyncTask$WorkerRunnable;
-Landroid/os/BadParcelableException;
-Landroid/os/BaseBundle;
-Landroid/os/BaseBundle$NoImagePreloadHolder;
-Landroid/os/BatteryManager;
-Landroid/os/BatteryManagerInternal;
-Landroid/os/BatteryProperties;
-Landroid/os/BatteryProperties$1;
-Landroid/os/BatteryStats;
-Landroid/os/BatteryStats$BitDescription;
-Landroid/os/BatteryStats$ControllerActivityCounter;
-Landroid/os/BatteryStats$Counter;
-Landroid/os/BatteryStats$DailyItem;
-Landroid/os/BatteryStats$HistoryEventTracker;
-Landroid/os/BatteryStats$HistoryItem;
-Landroid/os/BatteryStats$HistoryPrinter;
-Landroid/os/BatteryStats$HistoryStepDetails;
-Landroid/os/BatteryStats$HistoryTag;
-Landroid/os/BatteryStats$IntToString;
-Landroid/os/BatteryStats$LevelStepTracker;
-Landroid/os/BatteryStats$LongCounter;
-Landroid/os/BatteryStats$PackageChange;
-Landroid/os/BatteryStats$Timer;
-Landroid/os/BatteryStats$Uid;
-Landroid/os/BatteryStats$Uid$Pid;
-Landroid/os/BatteryStats$Uid$Pkg;
-Landroid/os/BatteryStats$Uid$Pkg$Serv;
-Landroid/os/BatteryStats$Uid$Proc;
-Landroid/os/BatteryStats$Uid$Sensor;
-Landroid/os/BatteryStats$Uid$Wakelock;
-Landroid/os/Binder;
-Landroid/os/BinderProxy;
-Landroid/os/Build;
-Landroid/os/Build$VERSION;
-Landroid/os/Bundle;
-Landroid/os/Bundle$1;
-Landroid/os/CancellationSignal;
-Landroid/os/CancellationSignal$OnCancelListener;
-Landroid/os/CancellationSignal$Transport;
-Landroid/os/CommonTimeConfig$OnServerDiedListener;
-Landroid/os/CpuUsageInfo;
-Landroid/os/CpuUsageInfo$1;
-Landroid/os/DeadObjectException;
-Landroid/os/DeadSystemException;
-Landroid/os/Debug;
-Landroid/os/Debug$MemoryInfo;
-Landroid/os/Debug$MemoryInfo$1;
-Landroid/os/DropBoxManager;
-Landroid/os/DropBoxManager$Entry;
-Landroid/os/DropBoxManager$Entry$1;
-Landroid/os/Environment;
-Landroid/os/Environment$UserEnvironment;
-Landroid/os/FactoryTest;
-Landroid/os/FileObserver;
-Landroid/os/FileObserver$ObserverThread;
-Landroid/os/FileUtils;
-Landroid/os/GraphicsEnvironment;
-Landroid/os/Handler;
-Landroid/os/Handler$BlockingRunnable;
-Landroid/os/Handler$Callback;
-Landroid/os/Handler$MessengerImpl;
-Landroid/os/HandlerThread;
-Landroid/os/HardwarePropertiesManager;
-Landroid/os/health/HealthStatsParceler;
-Landroid/os/health/SystemHealthManager;
-Landroid/os/HwBinder;
-Landroid/os/HwBlob;
-Landroid/os/HwParcel;
-Landroid/os/HwRemoteBinder;
-Landroid/os/IBatteryPropertiesListener;
-Landroid/os/IBatteryPropertiesListener$Stub;
-Landroid/os/IBatteryPropertiesRegistrar;
-Landroid/os/IBatteryPropertiesRegistrar$Stub;
-Landroid/os/IBatteryPropertiesRegistrar$Stub$Proxy;
-Landroid/os/IBinder;
-Landroid/os/IBinder$DeathRecipient;
-Landroid/os/ICancellationSignal;
-Landroid/os/ICancellationSignal$Stub;
-Landroid/os/IDeviceIdentifiersPolicyService;
-Landroid/os/IDeviceIdentifiersPolicyService$Stub;
-Landroid/os/IDeviceIdleController;
-Landroid/os/IDeviceIdleController$Stub;
-Landroid/os/IHardwarePropertiesManager;
-Landroid/os/IHardwarePropertiesManager$Stub;
-Landroid/os/IHwBinder;
-Landroid/os/IHwBinder$DeathRecipient;
-Landroid/os/IHwInterface;
-Landroid/os/IIncidentManager;
-Landroid/os/IIncidentManager$Stub;
-Landroid/os/IInstalld;
-Landroid/os/IInstalld$Stub;
-Landroid/os/IInstalld$Stub$Proxy;
-Landroid/os/IInterface;
-Landroid/os/IMaintenanceActivityListener;
-Landroid/os/IMessenger;
-Landroid/os/IMessenger$Stub;
-Landroid/os/IMessenger$Stub$Proxy;
-Landroid/os/IncidentManager;
-Landroid/os/INetworkActivityListener;
-Landroid/os/INetworkManagementService;
-Landroid/os/INetworkManagementService$Stub;
-Landroid/os/IPermissionController;
-Landroid/os/IPermissionController$Stub;
-Landroid/os/IPowerManager;
-Landroid/os/IPowerManager$Stub;
-Landroid/os/IProcessInfoService;
-Landroid/os/IProcessInfoService$Stub;
-Landroid/os/IProgressListener;
-Landroid/os/IRecoverySystem;
-Landroid/os/IRecoverySystemProgressListener;
-Landroid/os/IRecoverySystem$Stub;
-Landroid/os/IRemoteCallback;
-Landroid/os/IRemoteCallback$Stub;
-Landroid/os/IRemoteCallback$Stub$Proxy;
-Landroid/os/ISchedulingPolicyService;
-Landroid/os/ISchedulingPolicyService$Stub;
-Landroid/os/IServiceManager;
-Landroid/os/IUpdateLock;
-Landroid/os/IUpdateLock$Stub;
-Landroid/os/IUserManager;
-Landroid/os/IUserManager$Stub;
-Landroid/os/IVibratorService;
-Landroid/os/IVibratorService$Stub;
-Landroid/os/LocaleList;
-Landroid/os/LocaleList$1;
-Landroid/os/Looper;
-Landroid/os/MemoryFile;
-Landroid/os/Message;
-Landroid/os/Message$1;
-Landroid/os/MessageQueue;
-Landroid/os/MessageQueue$IdleHandler;
-Landroid/os/Messenger;
-Landroid/os/Messenger$1;
-Landroid/os/OperationCanceledException;
-Landroid/os/Parcel;
-Landroid/os/Parcel$1;
-Landroid/os/Parcelable;
-Landroid/os/Parcelable$ClassLoaderCreator;
-Landroid/os/Parcelable$Creator;
-Landroid/os/ParcelFileDescriptor;
-Landroid/os/ParcelFileDescriptor$1;
-Landroid/os/ParcelFileDescriptor$AutoCloseInputStream;
-Landroid/os/ParcelFileDescriptor$AutoCloseOutputStream;
-Landroid/os/ParcelFormatException;
-Landroid/os/ParcelUuid;
-Landroid/os/PatternMatcher;
-Landroid/os/PatternMatcher$1;
-Landroid/os/PersistableBundle;
-Landroid/os/PersistableBundle$1;
-Landroid/os/PersistableBundle$MyReadMapCallback;
-Landroid/os/PowerManager;
-Landroid/os/PowerManagerInternal;
-Landroid/os/PowerManagerInternal$LowPowerModeListener;
-Landroid/os/PowerManager$WakeLock;
-Landroid/os/PowerManager$WakeLock$1;
-Landroid/os/Process;
-Landroid/os/Process$ProcessStartResult;
-Landroid/os/RecoverySystem;
-Landroid/os/RemoteCallback;
-Landroid/os/RemoteCallbackList;
-Landroid/os/RemoteCallbackList$Callback;
-Landroid/os/RemoteException;
-Landroid/os/ResultReceiver;
-Landroid/os/ResultReceiver$1;
-Landroid/os/ResultReceiver$MyResultReceiver;
-Landroid/os/SELinux;
-Landroid/os/ServiceManager;
-Landroid/os/ServiceManagerNative;
-Landroid/os/ServiceManagerProxy;
-Landroid/os/ServiceManager$ServiceNotFoundException;
-Landroid/os/ServiceSpecificException;
-Landroid/os/ShellCallback;
-Landroid/os/ShellCallback$1;
-Landroid/os/ShellCommand;
-Landroid/os/StatFs;
-Landroid/os/storage/DiskInfo;
-Landroid/os/storage/IObbActionListener;
-Landroid/os/storage/IObbActionListener$Stub;
-Landroid/os/storage/IStorageEventListener;
-Landroid/os/storage/IStorageEventListener$Stub;
-Landroid/os/storage/IStorageEventListener$Stub$Proxy;
-Landroid/os/storage/IStorageManager;
-Landroid/os/storage/IStorageManager$Stub;
-Landroid/os/storage/IStorageShutdownObserver;
-Landroid/os/storage/StorageEventListener;
-Landroid/os/storage/StorageManager;
-Landroid/os/storage/StorageManagerInternal;
-Landroid/os/storage/StorageManagerInternal$ExternalStorageMountPolicy;
-Landroid/os/storage/StorageManager$ObbActionListener;
-Landroid/os/storage/StorageManager$StorageEventListenerDelegate;
-Landroid/os/storage/StorageVolume;
-Landroid/os/storage/StorageVolume$1;
-Landroid/os/storage/VolumeInfo;
-Landroid/os/storage/VolumeInfo$1;
-Landroid/os/storage/VolumeInfo$2;
-Landroid/os/storage/VolumeRecord;
-Landroid/os/StrictMode;
-Landroid/os/StrictMode$1;
-Landroid/os/StrictMode$2;
-Landroid/os/StrictMode$3;
-Landroid/os/StrictMode$4;
-Landroid/os/StrictMode$5;
-Landroid/os/StrictMode$6;
-Landroid/os/StrictMode$7;
-Landroid/os/StrictMode$8;
-Landroid/os/StrictMode$9;
-Landroid/os/StrictMode$AndroidBlockGuardPolicy;
-Landroid/os/StrictMode$AndroidBlockGuardPolicy$1;
-Landroid/os/StrictMode$AndroidCloseGuardReporter;
-Landroid/os/StrictMode$InstanceCountViolation;
-Landroid/os/StrictMode$Span;
-Landroid/os/StrictMode$StrictModeDiskReadViolation;
-Landroid/os/StrictMode$StrictModeDiskWriteViolation;
-Landroid/os/StrictMode$StrictModeViolation;
-Landroid/os/StrictMode$ThreadPolicy;
-Landroid/os/StrictMode$ThreadSpanState;
-Landroid/os/StrictMode$ViolationInfo;
-Landroid/os/StrictMode$ViolationInfo$1;
-Landroid/os/StrictMode$VmPolicy;
-Landroid/os/StrictMode$VmPolicy$Builder;
-Landroid/os/SynchronousResultReceiver;
-Landroid/os/SynchronousResultReceiver$Result;
-Landroid/os/SystemClock;
-Landroid/os/SystemProperties;
-Landroid/os/SystemService;
-Landroid/os/SystemService$1;
-Landroid/os/SystemService$State;
-Landroid/os/SystemVibrator;
-Landroid/os/TokenWatcher;
-Landroid/os/TokenWatcher$1;
-Landroid/os/Trace;
-Landroid/os/Trace$1;
-Landroid/os/TransactionTooLargeException;
-Landroid/os/UEventObserver;
-Landroid/os/UEventObserver$UEvent;
-Landroid/os/UEventObserver$UEventThread;
-Landroid/os/UpdateLock;
-Landroid/os/UserHandle;
-Landroid/os/UserHandle$1;
-Landroid/os/UserManager;
-Landroid/os/UserManagerInternal;
-Landroid/os/UserManagerInternal$UserRestrictionsListener;
-Landroid/os/Vibrator;
-Landroid/os/WorkSource;
-Landroid/os/WorkSource$1;
-Landroid/os/ZygoteProcess;
-Landroid/os/ZygoteProcess$ZygoteState;
-Landroid/os/ZygoteStartFailedEx;
-Landroid/print/IPrintDocumentAdapter;
-Landroid/print/IPrinterDiscoveryObserver;
-Landroid/print/IPrintJobStateChangeListener;
-Landroid/print/IPrintManager;
-Landroid/print/IPrintManager$Stub;
-Landroid/print/IPrintServicesChangeListener;
-Landroid/print/IPrintServicesChangeListener$Stub;
-Landroid/print/IPrintServicesChangeListener$Stub$Proxy;
-Landroid/print/IPrintSpooler;
-Landroid/print/IPrintSpoolerCallbacks;
-Landroid/print/IPrintSpoolerCallbacks$Stub;
-Landroid/print/IPrintSpoolerClient;
-Landroid/print/IPrintSpoolerClient$Stub;
-Landroid/print/IPrintSpooler$Stub;
-Landroid/print/IPrintSpooler$Stub$Proxy;
-Landroid/print/PrintAttributes;
-Landroid/print/PrinterId;
-Landroid/print/PrintJobId;
-Landroid/print/PrintJobInfo;
-Landroid/print/PrintManager;
-Landroid/printservice/IPrintServiceClient;
-Landroid/printservice/IPrintServiceClient$Stub;
-Landroid/printservice/PrintServiceInfo;
-Landroid/printservice/PrintServiceInfo$1;
-Landroid/printservice/recommendation/IRecommendationsChangeListener;
-Landroid/provider/BaseColumns;
-Landroid/provider/CalendarContract$Attendees;
-Landroid/provider/CalendarContract$AttendeesColumns;
-Landroid/provider/CalendarContract$CalendarColumns;
-Landroid/provider/CalendarContract$Calendars;
-Landroid/provider/CalendarContract$CalendarSyncColumns;
-Landroid/provider/CalendarContract$Events;
-Landroid/provider/CalendarContract$EventsColumns;
-Landroid/provider/CalendarContract$Instances;
-Landroid/provider/CalendarContract$SyncColumns;
-Landroid/provider/CallLog$Calls;
-Landroid/provider/ContactsContract;
-Landroid/provider/ContactsContract$CommonDataKinds$BaseTypes;
-Landroid/provider/ContactsContract$CommonDataKinds$Callable;
-Landroid/provider/ContactsContract$CommonDataKinds$CommonColumns;
-Landroid/provider/ContactsContract$CommonDataKinds$Phone;
-Landroid/provider/ContactsContract$ContactCounts;
-Landroid/provider/ContactsContract$ContactNameColumns;
-Landroid/provider/ContactsContract$ContactOptionsColumns;
-Landroid/provider/ContactsContract$Contacts;
-Landroid/provider/ContactsContract$ContactsColumns;
-Landroid/provider/ContactsContract$ContactStatusColumns;
-Landroid/provider/ContactsContract$Data;
-Landroid/provider/ContactsContract$DataColumns;
-Landroid/provider/ContactsContract$DataColumnsWithJoins;
-Landroid/provider/ContactsContract$DataUsageFeedback;
-Landroid/provider/ContactsContract$DataUsageStatColumns;
-Landroid/provider/ContactsContract$PhoneLookup;
-Landroid/provider/ContactsContract$PhoneLookupColumns;
-Landroid/provider/ContactsContract$RawContactsColumns;
-Landroid/provider/ContactsContract$StatusColumns;
-Landroid/provider/Downloads;
-Landroid/provider/Downloads$Impl;
-Landroid/provider/Settings;
-Landroid/provider/Settings$ContentProviderHolder;
-Landroid/provider/Settings$GenerationTracker;
-Landroid/provider/Settings$Global;
-Landroid/provider/Settings$NameValueCache;
-Landroid/provider/Settings$NameValueTable;
-Landroid/provider/Settings$Secure;
-Landroid/provider/Settings$SettingNotFoundException;
-Landroid/provider/Settings$System;
-Landroid/provider/Settings$System$1;
-Landroid/provider/Settings$System$2;
-Landroid/provider/Settings$System$3;
-Landroid/provider/Settings$System$4;
-Landroid/provider/Settings$System$5;
-Landroid/provider/Settings$System$6;
-Landroid/provider/Settings$System$7;
-Landroid/provider/Settings$System$8;
-Landroid/provider/Settings$System$9;
-Landroid/provider/Settings$System$DiscreteValueValidator;
-Landroid/provider/Settings$System$InclusiveFloatRangeValidator;
-Landroid/provider/Settings$System$InclusiveIntegerRangeValidator;
-Landroid/provider/Settings$System$Validator;
-Landroid/R$styleable;
-Landroid/security/IKeyChainService;
-Landroid/security/IKeyChainService$Stub;
-Landroid/security/IKeyChainService$Stub$Proxy;
-Landroid/security/IKeystoreService;
-Landroid/security/IKeystoreService$Stub;
-Landroid/security/IKeystoreService$Stub$Proxy;
-Landroid/security/KeyChain;
-Landroid/security/KeyChain$1;
-Landroid/security/KeyChain$KeyChainConnection;
-Landroid/security/keymaster/IKeyAttestationApplicationIdProvider;
-Landroid/security/keymaster/IKeyAttestationApplicationIdProvider$Stub;
-Landroid/security/keymaster/KeyAttestationApplicationId;
-Landroid/security/KeyStore;
-Landroid/security/keystore/AndroidKeyStoreBCWorkaroundProvider;
-Landroid/security/keystore/AndroidKeyStoreProvider;
-Landroid/security/keystore/AndroidKeyStoreSpi;
-Landroid/service/autofill/IAutoFillManagerService;
-Landroid/service/autofill/IAutoFillManagerService$Stub;
-Landroid/service/dreams/DreamManagerInternal;
-Landroid/service/dreams/IDreamManager;
-Landroid/service/dreams/IDreamManager$Stub;
-Landroid/service/dreams/IDreamService;
-Landroid/service/dreams/IDreamService$Stub;
-Landroid/service/dreams/IDreamService$Stub$Proxy;
-Landroid/service/gatekeeper/IGateKeeperService;
-Landroid/service/gatekeeper/IGateKeeperService$Stub;
-Landroid/service/gatekeeper/IGateKeeperService$Stub$Proxy;
-Landroid/service/notification/Adjustment;
-Landroid/service/notification/Condition;
-Landroid/service/notification/Condition$1;
-Landroid/service/notification/ConditionProviderService;
-Landroid/service/notification/ConditionProviderService$H;
-Landroid/service/notification/ConditionProviderService$Provider;
-Landroid/service/notification/IConditionProvider;
-Landroid/service/notification/IConditionProvider$Stub;
-Landroid/service/notification/IConditionProvider$Stub$Proxy;
-Landroid/service/notification/INotificationListener;
-Landroid/service/notification/INotificationListener$Stub;
-Landroid/service/notification/INotificationListener$Stub$Proxy;
-Landroid/service/notification/IStatusBarNotificationHolder;
-Landroid/service/notification/IStatusBarNotificationHolder$Stub;
-Landroid/service/notification/NotificationListenerService$Ranking;
-Landroid/service/notification/NotificationRankingUpdate;
-Landroid/service/notification/NotificationRankingUpdate$1;
-Landroid/service/notification/StatusBarNotification;
-Landroid/service/notification/StatusBarNotification$1;
-Landroid/service/notification/ZenModeConfig;
-Landroid/service/notification/ZenModeConfig$1;
-Landroid/service/notification/ZenModeConfig$Diff;
-Landroid/service/notification/ZenModeConfig$EventInfo;
-Landroid/service/notification/ZenModeConfig$ScheduleInfo;
-Landroid/service/notification/ZenModeConfig$ZenRule;
-Landroid/service/notification/ZenModeConfig$ZenRule$1;
-Landroid/service/persistentdata/IPersistentDataBlockService;
-Landroid/service/persistentdata/IPersistentDataBlockService$Stub;
-Landroid/service/persistentdata/PersistentDataBlockManager;
-Landroid/service/voice/IVoiceInteractionService;
-Landroid/service/voice/IVoiceInteractionService$Stub;
-Landroid/service/voice/IVoiceInteractionService$Stub$Proxy;
-Landroid/service/voice/IVoiceInteractionSession;
-Landroid/service/voice/IVoiceInteractionSessionService;
-Landroid/service/voice/IVoiceInteractionSessionService$Stub;
-Landroid/service/voice/IVoiceInteractionSessionService$Stub$Proxy;
-Landroid/service/voice/IVoiceInteractionSession$Stub;
-Landroid/service/voice/IVoiceInteractionSession$Stub$Proxy;
-Landroid/service/voice/VoiceInteractionManagerInternal;
-Landroid/service/voice/VoiceInteractionServiceInfo;
-Landroid/service/vr/IVrManager;
-Landroid/service/vr/IVrManager$Stub;
-Landroid/service/vr/IVrStateCallbacks;
-Landroid/service/vr/IVrStateCallbacks$Stub;
-Landroid/service/vr/IVrStateCallbacks$Stub$Proxy;
-Landroid/service/wallpaper/IWallpaperConnection;
-Landroid/service/wallpaper/IWallpaperConnection$Stub;
-Landroid/service/wallpaper/IWallpaperEngine;
-Landroid/service/wallpaper/IWallpaperEngine$Stub;
-Landroid/service/wallpaper/IWallpaperEngine$Stub$Proxy;
-Landroid/service/wallpaper/IWallpaperService;
-Landroid/service/wallpaper/IWallpaperService$Stub;
-Landroid/service/wallpaper/IWallpaperService$Stub$Proxy;
-Landroid/system/ErrnoException;
-Landroid/system/GaiException;
-Landroid/system/NetlinkSocketAddress;
-Landroid/system/Os;
-Landroid/system/OsConstants;
-Landroid/system/PacketSocketAddress;
-Landroid/system/StructAddrinfo;
-Landroid/system/StructFlock;
-Landroid/system/StructGroupReq;
-Landroid/system/StructGroupSourceReq;
-Landroid/system/StructIfaddrs;
-Landroid/system/StructLinger;
-Landroid/system/StructPasswd;
-Landroid/system/StructPollfd;
-Landroid/system/StructStat;
-Landroid/system/StructStatVfs;
-Landroid/system/StructTimeval;
-Landroid/system/StructUcred;
-Landroid/system/StructUtsname;
-Landroid/system/UnixSocketAddress;
-Landroid/telecom/CallAudioState;
-Landroid/telecom/CallAudioState$1;
-Landroid/telecom/Conferenceable;
-Landroid/telecom/Connection;
-Landroid/telecom/ConnectionRequest;
-Landroid/telecom/ConnectionRequest$1;
-Landroid/telecom/DefaultDialerManager;
-Landroid/telecom/DisconnectCause;
-Landroid/telecom/DisconnectCause$1;
-Landroid/telecom/Log;
-Landroid/telecom/Log$1;
-Landroid/telecom/Logging/EventManager;
-Landroid/telecom/Logging/EventManager$Event;
-Landroid/telecom/Logging/EventManager$EventListener;
-Landroid/telecom/Logging/EventManager$EventRecord;
-Landroid/telecom/Logging/EventManager$Loggable;
-Landroid/telecom/Logging/EventManager$TimedEventPair;
-Landroid/telecom/Logging/Runnable;
-Landroid/telecom/Logging/Runnable$1;
-Landroid/telecom/Logging/Session;
-Landroid/telecom/Logging/Session$Info;
-Landroid/telecom/Logging/Session$Info$1;
-Landroid/telecom/Logging/SessionManager;
-Landroid/telecom/Logging/SessionManager$ICurrentThreadId;
-Landroid/telecom/Logging/SessionManager$ISessionCleanupTimeoutMs;
-Landroid/telecom/Logging/SessionManager$ISessionIdQueryHandler;
-Landroid/telecom/Logging/SessionManager$ISessionListener;
-Landroid/telecom/ParcelableCall;
-Landroid/telecom/ParcelableCall$1;
-Landroid/telecom/ParcelableConference;
-Landroid/telecom/ParcelableConnection;
-Landroid/telecom/ParcelableConnection$1;
-Landroid/telecom/PhoneAccount;
-Landroid/telecom/PhoneAccount$1;
-Landroid/telecom/PhoneAccount$Builder;
-Landroid/telecom/PhoneAccountHandle;
-Landroid/telecom/PhoneAccountHandle$1;
-Landroid/telecom/StatusHints;
-Landroid/telecom/TelecomAnalytics;
-Landroid/telecom/TelecomAnalytics$SessionTiming;
-Landroid/telecom/TelecomAnalytics$SessionTiming$1;
-Landroid/telecom/TelecomManager;
-Landroid/telecom/TimedEvent;
-Landroid/telecom/VideoProfile;
-Landroid/telecom/VideoProfile$1;
-Landroid/telephony/CarrierConfigManager;
-Landroid/telephony/CellLocation;
-Landroid/telephony/gsm/GsmCellLocation;
-Landroid/telephony/ModemActivityInfo;
-Landroid/telephony/ModemActivityInfo$1;
-Landroid/telephony/PhoneNumberUtils;
-Landroid/telephony/PhoneStateListener;
-Landroid/telephony/PhoneStateListener$1;
-Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub;
-Landroid/telephony/PreciseCallState;
-Landroid/telephony/PreciseCallState$1;
-Landroid/telephony/PreciseDataConnectionState;
-Landroid/telephony/PreciseDataConnectionState$1;
-Landroid/telephony/Rlog;
-Landroid/telephony/ServiceState;
-Landroid/telephony/ServiceState$1;
-Landroid/telephony/SignalStrength;
-Landroid/telephony/SignalStrength$1;
-Landroid/telephony/SubscriptionInfo;
-Landroid/telephony/SubscriptionInfo$1;
-Landroid/telephony/SubscriptionManager;
-Landroid/telephony/SubscriptionManager$OnSubscriptionsChangedListener;
-Landroid/telephony/SubscriptionManager$OnSubscriptionsChangedListener$1;
-Landroid/telephony/SubscriptionManager$OnSubscriptionsChangedListener$2;
-Landroid/telephony/TelephonyManager;
-Landroid/telephony/TelephonyManager$MultiSimVariants;
-Landroid/telephony/VoLteServiceState;
-Landroid/telephony/VoLteServiceState$1;
-Landroid/text/AndroidBidi;
-Landroid/text/AndroidCharacter;
-Landroid/text/BoringLayout;
-Landroid/text/BoringLayout$Metrics;
-Landroid/text/ClipboardManager;
-Landroid/text/Editable;
-Landroid/text/Editable$Factory;
-Landroid/text/FontConfig;
-Landroid/text/FontConfig$1;
-Landroid/text/FontConfig$Alias;
-Landroid/text/FontConfig$Alias$1;
-Landroid/text/FontConfig$Axis;
-Landroid/text/FontConfig$Axis$1;
-Landroid/text/FontConfig$Family;
-Landroid/text/FontConfig$Family$1;
-Landroid/text/FontConfig$Font;
-Landroid/text/FontConfig$Font$1;
-Landroid/text/format/DateFormat;
-Landroid/text/format/Time;
-Landroid/text/format/Time$TimeCalculator;
-Landroid/text/GetChars;
-Landroid/text/GraphicsOperations;
-Landroid/text/Hyphenator;
-Landroid/text/InputFilter;
-Landroid/text/InputType;
-Landroid/text/ITextClassificationService;
-Landroid/text/ITextClassificationService$Stub;
-Landroid/text/Layout;
-Landroid/text/Layout$Alignment;
-Landroid/text/Layout$Directions;
-Landroid/text/method/AllCapsTransformationMethod;
-Landroid/text/method/PasswordTransformationMethod;
-Landroid/text/method/ReplacementTransformationMethod;
-Landroid/text/method/SingleLineTransformationMethod;
-Landroid/text/method/TransformationMethod;
-Landroid/text/method/TransformationMethod2;
-Landroid/text/NoCopySpan;
-Landroid/text/ParcelableSpan;
-Landroid/text/Selection;
-Landroid/text/Selection$END;
-Landroid/text/Selection$START;
-Landroid/text/Spannable;
-Landroid/text/Spannable$Factory;
-Landroid/text/SpannableString;
-Landroid/text/SpannableStringBuilder;
-Landroid/text/SpannableStringInternal;
-Landroid/text/Spanned;
-Landroid/text/SpannedString;
-Landroid/text/SpanSet;
-Landroid/text/SpanWatcher;
-Landroid/text/StaticLayout;
-Landroid/text/StaticLayout$LineBreaks;
-Landroid/text/style/CharacterStyle;
-Landroid/text/style/MetricAffectingSpan;
-Landroid/text/style/ParagraphStyle;
-Landroid/text/style/ReplacementSpan;
-Landroid/text/style/SpellCheckSpan;
-Landroid/text/style/StyleSpan;
-Landroid/text/style/SuggestionSpan;
-Landroid/text/style/UpdateAppearance;
-Landroid/text/style/UpdateLayout;
-Landroid/text/TextDirectionHeuristic;
-Landroid/text/TextDirectionHeuristics;
-Landroid/text/TextDirectionHeuristics$AnyStrong;
-Landroid/text/TextDirectionHeuristics$FirstStrong;
-Landroid/text/TextDirectionHeuristics$TextDirectionAlgorithm;
-Landroid/text/TextDirectionHeuristics$TextDirectionHeuristicImpl;
-Landroid/text/TextDirectionHeuristics$TextDirectionHeuristicInternal;
-Landroid/text/TextDirectionHeuristics$TextDirectionHeuristicLocale;
-Landroid/text/TextLine;
-Landroid/text/TextPaint;
-Landroid/text/TextUtils;
-Landroid/text/TextUtils$1;
-Landroid/text/TextUtils$EllipsizeCallback;
-Landroid/text/TextUtils$SimpleStringSplitter;
-Landroid/text/TextUtils$StringSplitter;
-Landroid/text/TextUtils$TruncateAt;
-Landroid/text/TextWatcher;
-Landroid/transition/AutoTransition;
-Landroid/transition/ChangeBounds;
-Landroid/transition/ChangeBounds$1;
-Landroid/transition/ChangeBounds$2;
-Landroid/transition/ChangeBounds$3;
-Landroid/transition/ChangeBounds$4;
-Landroid/transition/ChangeBounds$5;
-Landroid/transition/ChangeBounds$6;
-Landroid/transition/ChangeClipBounds;
-Landroid/transition/ChangeImageTransform;
-Landroid/transition/ChangeImageTransform$1;
-Landroid/transition/ChangeImageTransform$2;
-Landroid/transition/ChangeTransform;
-Landroid/transition/ChangeTransform$1;
-Landroid/transition/ChangeTransform$2;
-Landroid/transition/Fade;
-Landroid/transition/PathMotion;
-Landroid/transition/Transition;
-Landroid/transition/Transition$1;
-Landroid/transition/TransitionInflater;
-Landroid/transition/TransitionManager;
-Landroid/transition/TransitionSet;
-Landroid/transition/TransitionValuesMaps;
-Landroid/transition/Visibility;
-Landroid/util/AndroidException;
-Landroid/util/AndroidRuntimeException;
-Landroid/util/apk/ApkSignatureSchemeV2Verifier;
-Landroid/util/apk/ApkSignatureSchemeV2Verifier$ByteBufferDataSource;
-Landroid/util/apk/ApkSignatureSchemeV2Verifier$DataSource;
-Landroid/util/apk/ApkSignatureSchemeV2Verifier$MemoryMappedFileDataSource;
-Landroid/util/apk/ApkSignatureSchemeV2Verifier$SignatureInfo;
-Landroid/util/apk/ApkSignatureSchemeV2Verifier$SignatureNotFoundException;
-Landroid/util/apk/ApkSignatureSchemeV2Verifier$VerbatimX509Certificate;
-Landroid/util/apk/ApkSignatureSchemeV2Verifier$WrappedX509Certificate;
-Landroid/util/apk/ZipUtils;
-Landroid/util/ArrayMap;
-Landroid/util/ArrayMap$1;
-Landroid/util/ArraySet;
-Landroid/util/ArraySet$1;
-Landroid/util/AtomicFile;
-Landroid/util/AttributeSet;
-Landroid/util/Base64;
-Landroid/util/Base64$Coder;
-Landroid/util/Base64$Decoder;
-Landroid/util/Base64$Encoder;
-Landroid/util/BootTimingsTraceLog;
-Landroid/util/ContainerHelpers;
-Landroid/util/DebugUtils;
-Landroid/util/DisplayMetrics;
-Landroid/util/EventLog;
-Landroid/util/EventLog$Event;
-Landroid/util/FastImmutableArraySet;
-Landroid/util/FastImmutableArraySet$FastIterator;
-Landroid/util/FloatProperty;
-Landroid/util/IntArray;
-Landroid/util/IntProperty;
-Landroid/util/jar/StrictJarFile;
-Landroid/util/KeyValueListParser;
-Landroid/util/LocalLog;
-Landroid/util/LocalLog$ReadOnlyLocalLog;
-Landroid/util/Log;
-Landroid/util/Log$1;
-Landroid/util/Log$ImmediateLogWriter;
-Landroid/util/Log$NoPreloadHolder;
-Landroid/util/LogPrinter;
-Landroid/util/Log$TerribleFailureHandler;
-Landroid/util/LongArray;
-Landroid/util/LongSparseArray;
-Landroid/util/LongSparseLongArray;
-Landroid/util/LruCache;
-Landroid/util/MapCollections;
-Landroid/util/MapCollections$ArrayIterator;
-Landroid/util/MapCollections$EntrySet;
-Landroid/util/MapCollections$KeySet;
-Landroid/util/MapCollections$MapIterator;
-Landroid/util/MapCollections$ValuesCollection;
-Landroid/util/MathUtils;
-Landroid/util/MemoryIntArray;
-Landroid/util/MemoryIntArray$1;
-Landroid/util/MutableBoolean;
-Landroid/util/MutableInt;
-Landroid/util/MutableLong;
-Landroid/util/NtpTrustedTime;
-Landroid/util/Pair;
-Landroid/util/PathParser;
-Landroid/util/PathParser$PathData;
-Landroid/util/Pools$Pool;
-Landroid/util/Pools$SimplePool;
-Landroid/util/Pools$SynchronizedPool;
-Landroid/util/Printer;
-Landroid/util/Property;
-Landroid/util/Rational;
-Landroid/util/Singleton;
-Landroid/util/Size;
-Landroid/util/Slog;
-Landroid/util/SparseArray;
-Landroid/util/SparseBooleanArray;
-Landroid/util/SparseIntArray;
-Landroid/util/SparseLongArray;
-Landroid/util/Spline;
-Landroid/util/Spline$MonotoneCubicSpline;
-Landroid/util/StateSet;
-Landroid/util/SuperNotCalledException;
-Landroid/util/TimedRemoteCaller;
-Landroid/util/TimeUtils;
-Landroid/util/TrustedTime;
-Landroid/util/TypedValue;
-Landroid/util/Xml;
-Landroid/util/Xml$XmlSerializerFactory;
-Landroid/view/accessibility/AccessibilityEvent;
-Landroid/view/accessibility/AccessibilityEventSource;
-Landroid/view/accessibility/AccessibilityManager;
-Landroid/view/accessibility/AccessibilityManager$1;
-Landroid/view/accessibility/AccessibilityManager$AccessibilityServicesStateChangeListener;
-Landroid/view/accessibility/AccessibilityManager$AccessibilityStateChangeListener;
-Landroid/view/accessibility/AccessibilityManager$HighTextContrastChangeListener;
-Landroid/view/accessibility/AccessibilityManager$MyHandler;
-Landroid/view/accessibility/AccessibilityManager$TouchExplorationStateChangeListener;
-Landroid/view/accessibility/AccessibilityRecord;
-Landroid/view/accessibility/CaptioningManager;
-Landroid/view/accessibility/IAccessibilityInteractionConnection;
-Landroid/view/accessibility/IAccessibilityManager;
-Landroid/view/accessibility/IAccessibilityManagerClient;
-Landroid/view/accessibility/IAccessibilityManagerClient$Stub;
-Landroid/view/accessibility/IAccessibilityManagerClient$Stub$Proxy;
-Landroid/view/accessibility/IAccessibilityManager$Stub;
-Landroid/view/ActionMode;
-Landroid/view/ActionMode$Callback;
-Landroid/view/animation/AccelerateDecelerateInterpolator;
-Landroid/view/animation/AccelerateInterpolator;
-Landroid/view/animation/AlphaAnimation;
-Landroid/view/animation/Animation;
-Landroid/view/animation/Animation$Description;
-Landroid/view/animation/Animation$NoImagePreloadHolder;
-Landroid/view/animation/AnimationSet;
-Landroid/view/animation/AnimationUtils;
-Landroid/view/animation/AnimationUtils$1;
-Landroid/view/animation/AnimationUtils$AnimationState;
-Landroid/view/animation/BaseInterpolator;
-Landroid/view/animation/ClipRectAnimation;
-Landroid/view/animation/DecelerateInterpolator;
-Landroid/view/animation/Interpolator;
-Landroid/view/animation/LinearInterpolator;
-Landroid/view/animation/PathInterpolator;
-Landroid/view/animation/RotateAnimation;
-Landroid/view/animation/ScaleAnimation;
-Landroid/view/animation/Transformation;
-Landroid/view/animation/TranslateAnimation;
-Landroid/view/AppTransitionAnimationSpec;
-Landroid/view/AppTransitionAnimationSpec$1;
-Landroid/view/autofill/AutoFillId;
-Landroid/view/autofill/AutoFillId$1;
-Landroid/view/autofill/AutoFillManager;
-Landroid/view/Choreographer;
-Landroid/view/Choreographer$1;
-Landroid/view/Choreographer$2;
-Landroid/view/Choreographer$CallbackQueue;
-Landroid/view/Choreographer$CallbackRecord;
-Landroid/view/Choreographer$FrameCallback;
-Landroid/view/Choreographer$FrameDisplayEventReceiver;
-Landroid/view/Choreographer$FrameHandler;
-Landroid/view/ContextMenu;
-Landroid/view/ContextThemeWrapper;
-Landroid/view/Display;
-Landroid/view/DisplayAdjustments;
-Landroid/view/DisplayEventReceiver;
-Landroid/view/Display$HdrCapabilities;
-Landroid/view/Display$HdrCapabilities$1;
-Landroid/view/DisplayInfo;
-Landroid/view/DisplayInfo$1;
-Landroid/view/DisplayListCanvas;
-Landroid/view/Display$Mode;
-Landroid/view/Display$Mode$1;
-Landroid/view/DragEvent;
-Landroid/view/FallbackEventHandler;
-Landroid/view/FrameInfo;
-Landroid/view/FrameMetrics;
-Landroid/view/FrameMetricsObserver;
-Landroid/view/FrameStats;
-Landroid/view/GestureDetector;
-Landroid/view/GestureDetector$GestureHandler;
-Landroid/view/GestureDetector$OnContextClickListener;
-Landroid/view/GestureDetector$OnDoubleTapListener;
-Landroid/view/GestureDetector$OnGestureListener;
-Landroid/view/GestureDetector$SimpleOnGestureListener;
-Landroid/view/Gravity;
-Landroid/view/HandlerActionQueue;
-Landroid/view/HardwareLayer;
-Landroid/view/IApplicationToken;
-Landroid/view/IApplicationToken$Stub;
-Landroid/view/IAppTransitionAnimationSpecsFuture;
-Landroid/view/IAppTransitionAnimationSpecsFuture$Stub;
-Landroid/view/IAppTransitionAnimationSpecsFuture$Stub$Proxy;
-Landroid/view/IDockedStackListener;
-Landroid/view/IDockedStackListener$Stub;
-Landroid/view/IDockedStackListener$Stub$Proxy;
-Landroid/view/IGraphicsStats;
-Landroid/view/IGraphicsStats$Stub;
-Landroid/view/IInputFilter;
-Landroid/view/InflateException;
-Landroid/view/InputChannel;
-Landroid/view/InputChannel$1;
-Landroid/view/InputDevice;
-Landroid/view/InputDevice$1;
-Landroid/view/InputDevice$MotionRange;
-Landroid/view/InputEvent;
-Landroid/view/InputEvent$1;
-Landroid/view/InputEventConsistencyVerifier;
-Landroid/view/InputEventReceiver;
-Landroid/view/InputEventReceiver$Factory;
-Landroid/view/InputEventSender;
-Landroid/view/inputmethod/BaseInputConnection;
-Landroid/view/inputmethod/ComposingText;
-Landroid/view/inputmethod/EditorInfo;
-Landroid/view/inputmethod/EditorInfo$1;
-Landroid/view/inputmethod/InputBinding;
-Landroid/view/inputmethod/InputBinding$1;
-Landroid/view/inputmethod/InputConnection;
-Landroid/view/inputmethod/InputMethodInfo;
-Landroid/view/inputmethod/InputMethodInfo$1;
-Landroid/view/inputmethod/InputMethodManager;
-Landroid/view/inputmethod/InputMethodManager$1;
-Landroid/view/inputmethod/InputMethodManager$2;
-Landroid/view/inputmethod/InputMethodManager$ControlledInputConnectionWrapper;
-Landroid/view/inputmethod/InputMethodManager$FinishedInputEventCallback;
-Landroid/view/inputmethod/InputMethodManager$H;
-Landroid/view/inputmethod/InputMethodManagerInternal;
-Landroid/view/inputmethod/InputMethodSubtype;
-Landroid/view/inputmethod/InputMethodSubtype$1;
-Landroid/view/inputmethod/InputMethodSubtypeArray;
-Landroid/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder;
-Landroid/view/InputQueue;
-Landroid/view/InputQueue$Callback;
-Landroid/view/InputQueue$FinishedInputEventCallback;
-Landroid/view/IOnKeyguardExitResult;
-Landroid/view/IPinnedStackController;
-Landroid/view/IPinnedStackController$Stub;
-Landroid/view/IPinnedStackListener;
-Landroid/view/IPinnedStackListener$Stub;
-Landroid/view/IPinnedStackListener$Stub$Proxy;
-Landroid/view/IRotationWatcher;
-Landroid/view/IRotationWatcher$Stub;
-Landroid/view/IRotationWatcher$Stub$Proxy;
-Landroid/view/IWindow;
-Landroid/view/IWindowFocusObserver;
-Landroid/view/IWindowId;
-Landroid/view/IWindowId$Stub;
-Landroid/view/IWindowManager;
-Landroid/view/IWindowManager$Stub;
-Landroid/view/IWindowSession;
-Landroid/view/IWindowSessionCallback;
-Landroid/view/IWindowSessionCallback$Stub;
-Landroid/view/IWindowSessionCallback$Stub$Proxy;
-Landroid/view/IWindowSession$Stub;
-Landroid/view/IWindow$Stub;
-Landroid/view/IWindow$Stub$Proxy;
-Landroid/view/KeyCharacterMap;
-Landroid/view/KeyCharacterMap$1;
-Landroid/view/KeyCharacterMap$FallbackAction;
-Landroid/view/KeyEvent;
-Landroid/view/KeyEvent$1;
-Landroid/view/KeyEvent$Callback;
-Landroid/view/KeyEvent$DispatcherState;
-Landroid/view/LayoutInflater;
-Landroid/view/LayoutInflater$Factory;
-Landroid/view/LayoutInflater$Factory2;
-Landroid/view/LayoutInflater$Filter;
-Landroid/view/MagnificationSpec;
-Landroid/view/Menu;
-Landroid/view/MenuItem;
-Landroid/view/MotionEvent;
-Landroid/view/MotionEvent$1;
-Landroid/view/MotionEvent$PointerCoords;
-Landroid/view/MotionEvent$PointerProperties;
-Landroid/view/PointerIcon;
-Landroid/view/PointerIcon$1;
-Landroid/view/RecordingCanvas;
-Landroid/view/RenderNode;
-Landroid/view/RenderNodeAnimator;
-Landroid/view/RenderNodeAnimator$1;
-Landroid/view/RenderNode$NoImagePreloadHolder;
-Landroid/view/Surface;
-Landroid/view/Surface$1;
-Landroid/view/Surface$CompatibleCanvas;
-Landroid/view/SurfaceControl;
-Landroid/view/SurfaceControl$PhysicalDisplayInfo;
-Landroid/view/SurfaceHolder;
-Landroid/view/SurfaceHolder$Callback;
-Landroid/view/SurfaceHolder$Callback2;
-Landroid/view/Surface$HwuiContext;
-Landroid/view/Surface$OutOfResourcesException;
-Landroid/view/SurfaceSession;
-Landroid/view/SurfaceView;
-Landroid/view/textclassifier/TextClassificationManager;
-Landroid/view/textservice/SpellCheckerInfo;
-Landroid/view/textservice/SpellCheckerInfo$1;
-Landroid/view/textservice/SpellCheckerSubtype;
-Landroid/view/textservice/SpellCheckerSubtype$1;
-Landroid/view/textservice/TextServicesManager;
-Landroid/view/TextureView;
-Landroid/view/ThreadedRenderer;
-Landroid/view/ThreadedRenderer$DrawCallbacks;
-Landroid/view/ThreadedRenderer$ProcessInitializer;
-Landroid/view/VelocityTracker;
-Landroid/view/VelocityTracker$Estimator;
-Landroid/view/View;
-Landroid/view/View$1;
-Landroid/view/View$10;
-Landroid/view/View$11;
-Landroid/view/View$12;
-Landroid/view/View$2;
-Landroid/view/View$3;
-Landroid/view/View$4;
-Landroid/view/View$5;
-Landroid/view/View$6;
-Landroid/view/View$7;
-Landroid/view/View$8;
-Landroid/view/View$9;
-Landroid/view/View$AttachInfo;
-Landroid/view/View$AttachInfo$Callbacks;
-Landroid/view/ViewConfiguration;
-Landroid/view/View$ForegroundInfo;
-Landroid/view/ViewGroup;
-Landroid/view/ViewGroup$1;
-Landroid/view/ViewGroup$2;
-Landroid/view/ViewGroup$LayoutParams;
-Landroid/view/ViewGroup$MarginLayoutParams;
-Landroid/view/ViewGroup$TouchTarget;
-Landroid/view/View$ListenerInfo;
-Landroid/view/ViewManager;
-Landroid/view/View$MeasureSpec;
-Landroid/view/View$OnClickListener;
-Landroid/view/View$OnCreateContextMenuListener;
-Landroid/view/ViewOutlineProvider;
-Landroid/view/ViewOutlineProvider$1;
-Landroid/view/ViewOutlineProvider$2;
-Landroid/view/ViewOutlineProvider$3;
-Landroid/view/ViewParent;
-Landroid/view/View$PerformClick;
-Landroid/view/ViewPropertyAnimator;
-Landroid/view/ViewPropertyAnimator$1;
-Landroid/view/ViewPropertyAnimator$2;
-Landroid/view/ViewPropertyAnimator$3;
-Landroid/view/ViewPropertyAnimator$AnimatorEventListener;
-Landroid/view/ViewPropertyAnimator$NameValuesHolder;
-Landroid/view/ViewPropertyAnimator$PropertyBundle;
-Landroid/view/ViewRootImpl;
-Landroid/view/ViewRootImpl$1;
-Landroid/view/ViewRootImpl$4;
-Landroid/view/ViewRootImpl$AccessibilityInteractionConnectionManager;
-Landroid/view/ViewRootImpl$AsyncInputStage;
-Landroid/view/ViewRootImpl$ConsumeBatchedInputImmediatelyRunnable;
-Landroid/view/ViewRootImpl$ConsumeBatchedInputRunnable;
-Landroid/view/ViewRootImpl$EarlyPostImeInputStage;
-Landroid/view/ViewRootImpl$HighContrastTextManager;
-Landroid/view/ViewRootImpl$ImeInputStage;
-Landroid/view/ViewRootImpl$InputStage;
-Landroid/view/ViewRootImpl$InvalidateOnAnimationRunnable;
-Landroid/view/ViewRootImpl$NativePostImeInputStage;
-Landroid/view/ViewRootImpl$NativePreImeInputStage;
-Landroid/view/ViewRootImpl$QueuedInputEvent;
-Landroid/view/ViewRootImpl$SyntheticInputStage;
-Landroid/view/ViewRootImpl$SyntheticJoystickHandler;
-Landroid/view/ViewRootImpl$SyntheticKeyboardHandler;
-Landroid/view/ViewRootImpl$SyntheticTouchNavigationHandler;
-Landroid/view/ViewRootImpl$SyntheticTouchNavigationHandler$1;
-Landroid/view/ViewRootImpl$SyntheticTrackballHandler;
-Landroid/view/ViewRootImpl$TrackballAxis;
-Landroid/view/ViewRootImpl$TraversalRunnable;
-Landroid/view/ViewRootImpl$ViewPostImeInputStage;
-Landroid/view/ViewRootImpl$ViewPreImeInputStage;
-Landroid/view/ViewRootImpl$ViewRootHandler;
-Landroid/view/ViewRootImpl$W;
-Landroid/view/ViewRootImpl$WindowInputEventReceiver;
-Landroid/view/ViewStub;
-Landroid/view/View$TransformationInfo;
-Landroid/view/ViewTreeObserver;
-Landroid/view/ViewTreeObserver$CopyOnWriteArray;
-Landroid/view/ViewTreeObserver$CopyOnWriteArray$Access;
-Landroid/view/ViewTreeObserver$InternalInsetsInfo;
-Landroid/view/ViewTreeObserver$OnComputeInternalInsetsListener;
-Landroid/view/ViewTreeObserver$OnGlobalLayoutListener;
-Landroid/view/ViewTreeObserver$OnPreDrawListener;
-Landroid/view/View$UnsetPressedState;
-Landroid/view/Window;
-Landroid/view/WindowAnimationFrameStats;
-Landroid/view/WindowAnimationFrameStats$1;
-Landroid/view/Window$Callback;
-Landroid/view/WindowCallbacks;
-Landroid/view/WindowContentFrameStats;
-Landroid/view/WindowContentFrameStats$1;
-Landroid/view/WindowInsets;
-Landroid/view/WindowLeaked;
-Landroid/view/WindowManager;
-Landroid/view/WindowManager$BadTokenException;
-Landroid/view/WindowManagerGlobal;
-Landroid/view/WindowManagerGlobal$1;
-Landroid/view/WindowManagerGlobal$2;
-Landroid/view/WindowManagerImpl;
-Landroid/view/WindowManagerInternal;
-Landroid/view/WindowManagerInternal$AppTransitionListener;
-Landroid/view/WindowManagerInternal$MagnificationCallbacks;
-Landroid/view/WindowManagerInternal$OnHardKeyboardStatusChangeListener;
-Landroid/view/WindowManagerInternal$WindowsForAccessibilityCallback;
-Landroid/view/WindowManager$LayoutParams;
-Landroid/view/WindowManager$LayoutParams$1;
-Landroid/view/WindowManagerPolicy;
-Landroid/view/WindowManagerPolicy$InputConsumer;
-Landroid/view/WindowManagerPolicy$OnKeyguardExitResult;
-Landroid/view/WindowManagerPolicy$PointerEventListener;
-Landroid/view/WindowManagerPolicy$ScreenOnListener;
-Landroid/view/WindowManagerPolicy$StartingSurface;
-Landroid/view/WindowManagerPolicy$WindowManagerFuncs;
-Landroid/view/WindowManagerPolicy$WindowState;
-Landroid/view/Window$OnWindowDismissedCallback;
-Landroid/view/Window$WindowControllerCallback;
-Landroid/webkit/IWebViewUpdateService;
-Landroid/webkit/IWebViewUpdateService$Stub;
-Landroid/webkit/UserPackage;
-Landroid/webkit/WebViewFactory;
-Landroid/webkit/WebViewFactory$1;
-Landroid/webkit/WebViewFactory$MissingWebViewPackageException;
-Landroid/webkit/WebViewFactory$RelroFileCreator;
-Landroid/webkit/WebViewProviderInfo;
-Landroid/webkit/WebViewProviderInfo$1;
-Landroid/webkit/WebViewProviderResponse;
-Landroid/webkit/WebViewProviderResponse$1;
-Landroid/webkit/WebViewZygote;
-Landroid/widget/ActionMenuView$OnMenuItemClickListener;
-Landroid/widget/Button;
-Landroid/widget/FrameLayout;
-Landroid/widget/FrameLayout$LayoutParams;
-Landroid/widget/ImageButton;
-Landroid/widget/ImageView;
-Landroid/widget/ImageView$ScaleType;
-Landroid/widget/LinearLayout;
-Landroid/widget/LinearLayout$LayoutParams;
-Landroid/widget/OverScroller;
-Landroid/widget/OverScroller$SplineOverScroller;
-Landroid/widget/RelativeLayout;
-Landroid/widget/RelativeLayout$DependencyGraph;
-Landroid/widget/RelativeLayout$DependencyGraph$Node;
-Landroid/widget/RelativeLayout$LayoutParams;
-Landroid/widget/RemoteViews;
-Landroid/widget/RemoteViews$1;
-Landroid/widget/RemoteViews$2;
-Landroid/widget/RemoteViews$3;
-Landroid/widget/RemoteViews$Action;
-Landroid/widget/RemoteViews$ActionException;
-Landroid/widget/RemoteViews$BitmapCache;
-Landroid/widget/RemoteViews$BitmapReflectionAction;
-Landroid/widget/RemoteViews$MemoryUsageCounter;
-Landroid/widget/RemoteViews$MutablePair;
-Landroid/widget/RemoteViews$OnClickHandler;
-Landroid/widget/RemoteViews$ReflectionAction;
-Landroid/widget/RemoteViews$RuntimeAction;
-Landroid/widget/RemoteViews$SetOnClickPendingIntent;
-Landroid/widget/RtlSpacingHelper;
-Landroid/widget/Scroller$ViscousFluidInterpolator;
-Landroid/widget/TextView;
-Landroid/widget/TextView$BufferType;
-Landroid/widget/TextView$CharWrapper;
-Landroid/widget/Toolbar;
-Landroid/widget/Toolbar$1;
-Landroid/widget/Toolbar$2;
-Landroid/widget/Toolbar$LayoutParams;
-LB;
-LC;
-Lcom/android/dex/ClassData;
-Lcom/android/dex/ClassData$Method;
-Lcom/android/dex/ClassDef;
-Lcom/android/dex/Code;
-Lcom/android/dex/Dex;
-Lcom/android/dex/Dex$ClassDefIterable;
-Lcom/android/dex/DexException;
-Lcom/android/dex/Dex$FieldIdTable;
-Lcom/android/dex/DexFormat;
-Lcom/android/dex/Dex$MethodIdTable;
-Lcom/android/dex/Dex$ProtoIdTable;
-Lcom/android/dex/Dex$Section;
-Lcom/android/dex/Dex$StringTable;
-Lcom/android/dex/Dex$TypeIndexToDescriptorIndexTable;
-Lcom/android/dex/Dex$TypeIndexToDescriptorTable;
-Lcom/android/dex/FieldId;
-Lcom/android/dex/Leb128;
-Lcom/android/dex/MethodId;
-Lcom/android/dex/Mutf8;
-Lcom/android/dex/TableOfContents;
-Lcom/android/dex/TableOfContents$Section;
-Lcom/android/dex/TypeList;
-Lcom/android/dex/util/ByteInput;
-Lcom/android/dex/util/ByteOutput;
-Lcom/android/dex/util/ExceptionWithContext;
-Lcom/android/dex/util/FileUtils;
-Lcom/android/framework/protobuf/nano/CodedInputByteBufferNano;
-Lcom/android/framework/protobuf/nano/CodedOutputByteBufferNano;
-Lcom/android/framework/protobuf/nano/InternalNano;
-Lcom/android/framework/protobuf/nano/InvalidProtocolBufferNanoException;
-Lcom/android/framework/protobuf/nano/MessageNano;
-Lcom/android/framework/protobuf/nano/WireFormatNano;
-Lcom/android/i18n/phonenumbers/AlternateFormatsCountryCodeSet;
-Lcom/android/i18n/phonenumbers/CountryCodeToRegionCodeMap;
-Lcom/android/i18n/phonenumbers/MetadataLoader;
-Lcom/android/i18n/phonenumbers/MetadataManager;
-Lcom/android/i18n/phonenumbers/MetadataManager$1;
-Lcom/android/i18n/phonenumbers/MetadataSource;
-Lcom/android/i18n/phonenumbers/MultiFileMetadataSourceImpl;
-Lcom/android/i18n/phonenumbers/NumberParseException;
-Lcom/android/i18n/phonenumbers/NumberParseException$ErrorType;
-Lcom/android/i18n/phonenumbers/Phonemetadata$NumberFormat;
-Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;
-Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadataCollection;
-Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;
-Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;
-Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber$CountryCodeSource;
-Lcom/android/i18n/phonenumbers/PhoneNumberUtil;
-Lcom/android/i18n/phonenumbers/PhoneNumberUtil$ValidationResult;
-Lcom/android/i18n/phonenumbers/RegexCache;
-Lcom/android/i18n/phonenumbers/RegexCache$LRUCache;
-Lcom/android/i18n/phonenumbers/RegexCache$LRUCache$1;
-Lcom/android/i18n/phonenumbers/ShortNumbersRegionCodeSet;
-Lcom/android/internal/alsa/AlsaCardsParser;
-Lcom/android/internal/alsa/AlsaCardsParser$AlsaCardRecord;
-Lcom/android/internal/alsa/AlsaDevicesParser;
-Lcom/android/internal/alsa/LineTokenizer;
-Lcom/android/internal/app/AssistUtils;
-Lcom/android/internal/app/IAppOpsCallback;
-Lcom/android/internal/app/IAppOpsCallback$Stub;
-Lcom/android/internal/app/IAppOpsCallback$Stub$Proxy;
-Lcom/android/internal/app/IAppOpsService;
-Lcom/android/internal/app/IAppOpsService$Stub;
-Lcom/android/internal/app/IAssistScreenshotReceiver;
-Lcom/android/internal/app/IAssistScreenshotReceiver$Stub;
-Lcom/android/internal/app/IBatteryStats;
-Lcom/android/internal/app/IBatteryStats$Stub;
-Lcom/android/internal/app/IMediaContainerService;
-Lcom/android/internal/app/IMediaContainerService$Stub;
-Lcom/android/internal/app/IMediaContainerService$Stub$Proxy;
-Lcom/android/internal/app/ISoundTriggerService;
-Lcom/android/internal/app/ISoundTriggerService$Stub;
-Lcom/android/internal/app/IVoiceInteractionManagerService;
-Lcom/android/internal/app/IVoiceInteractionManagerService$Stub;
-Lcom/android/internal/app/IVoiceInteractionSessionListener;
-Lcom/android/internal/app/IVoiceInteractionSessionListener$Stub;
-Lcom/android/internal/app/IVoiceInteractionSessionListener$Stub$Proxy;
-Lcom/android/internal/app/IVoiceInteractionSessionShowCallback;
-Lcom/android/internal/app/IVoiceInteractionSessionShowCallback$Stub;
-Lcom/android/internal/app/IVoiceInteractionSessionShowCallback$Stub$Proxy;
-Lcom/android/internal/app/IVoiceInteractor;
-Lcom/android/internal/app/IVoiceInteractor$Stub;
-Lcom/android/internal/app/IVoiceInteractor$Stub$Proxy;
-Lcom/android/internal/app/NightDisplayController;
-Lcom/android/internal/app/NightDisplayController$1;
-Lcom/android/internal/app/NightDisplayController$Callback;
-Lcom/android/internal/app/NightDisplayController$LocalTime;
-Lcom/android/internal/app/ProcessMap;
-Lcom/android/internal/app/procstats/DumpUtils;
-Lcom/android/internal/app/procstats/DurationsTable;
-Lcom/android/internal/app/procstats/IProcessStats;
-Lcom/android/internal/app/procstats/IProcessStats$Stub;
-Lcom/android/internal/app/procstats/ProcessState;
-Lcom/android/internal/app/procstats/ProcessState$1;
-Lcom/android/internal/app/procstats/ProcessState$PssAggr;
-Lcom/android/internal/app/procstats/ProcessStats;
-Lcom/android/internal/app/procstats/ProcessStats$1;
-Lcom/android/internal/app/procstats/ProcessStats$PackageState;
-Lcom/android/internal/app/procstats/ProcessStats$ProcessStateHolder;
-Lcom/android/internal/app/procstats/ProcessStats$TotalMemoryUseCollection;
-Lcom/android/internal/app/procstats/PssTable;
-Lcom/android/internal/app/procstats/ServiceState;
-Lcom/android/internal/app/procstats/SparseMappingTable;
-Lcom/android/internal/app/procstats/SparseMappingTable$Table;
-Lcom/android/internal/app/procstats/SysMemUsageTable;
-Lcom/android/internal/app/ResolverActivity;
-Lcom/android/internal/appwidget/IAppWidgetHost;
-Lcom/android/internal/appwidget/IAppWidgetHost$Stub;
-Lcom/android/internal/appwidget/IAppWidgetHost$Stub$Proxy;
-Lcom/android/internal/appwidget/IAppWidgetService;
-Lcom/android/internal/appwidget/IAppWidgetService$Stub;
-Lcom/android/internal/backup/IBackupTransport;
-Lcom/android/internal/backup/IBackupTransport$Stub;
-Lcom/android/internal/backup/IBackupTransport$Stub$Proxy;
-Lcom/android/internal/backup/LocalTransport;
-Lcom/android/internal/backup/LocalTransportService;
-Lcom/android/internal/content/NativeLibraryHelper;
-Lcom/android/internal/content/PackageHelper;
-Lcom/android/internal/content/PackageMonitor;
-Lcom/android/internal/content/ReferrerIntent;
-Lcom/android/internal/content/ReferrerIntent$1;
-Lcom/android/internal/graphics/drawable/AnimationScaleListDrawable;
-Lcom/android/internal/graphics/drawable/AnimationScaleListDrawable$AnimationScaleListState;
-Lcom/android/internal/hardware/AmbientDisplayConfiguration;
-Lcom/android/internal/inputmethod/IInputContentUriToken;
-Lcom/android/internal/inputmethod/InputMethodSubtypeHandle;
-Lcom/android/internal/inputmethod/InputMethodSubtypeSwitchingController;
-Lcom/android/internal/inputmethod/InputMethodSubtypeSwitchingController$ControllerImpl;
-Lcom/android/internal/inputmethod/InputMethodSubtypeSwitchingController$DynamicRotationList;
-Lcom/android/internal/inputmethod/InputMethodSubtypeSwitchingController$ImeSubtypeListItem;
-Lcom/android/internal/inputmethod/InputMethodSubtypeSwitchingController$InputMethodAndSubtypeList;
-Lcom/android/internal/inputmethod/InputMethodSubtypeSwitchingController$InputMethodAndSubtypeList$1;
-Lcom/android/internal/inputmethod/InputMethodSubtypeSwitchingController$StaticRotationList;
-Lcom/android/internal/inputmethod/InputMethodUtils;
-Lcom/android/internal/inputmethod/InputMethodUtils$1;
-Lcom/android/internal/inputmethod/InputMethodUtils$InputMethodListBuilder;
-Lcom/android/internal/inputmethod/InputMethodUtils$InputMethodSettings;
-Lcom/android/internal/inputmethod/LocaleUtils;
-Lcom/android/internal/inputmethod/LocaleUtils$LocaleExtractor;
-Lcom/android/internal/inputmethod/LocaleUtils$ScoreEntry;
-Lcom/android/internal/location/GpsNetInitiatedHandler;
-Lcom/android/internal/location/GpsNetInitiatedHandler$1;
-Lcom/android/internal/location/GpsNetInitiatedHandler$2;
-Lcom/android/internal/location/ILocationProvider;
-Lcom/android/internal/location/ILocationProvider$Stub;
-Lcom/android/internal/location/ILocationProvider$Stub$Proxy;
-Lcom/android/internal/location/ProviderProperties;
-Lcom/android/internal/location/ProviderProperties$1;
-Lcom/android/internal/location/ProviderRequest;
-Lcom/android/internal/location/ProviderRequest$1;
-Lcom/android/internal/logging/AndroidConfig;
-Lcom/android/internal/logging/AndroidHandler;
-Lcom/android/internal/logging/AndroidHandler$1;
-Lcom/android/internal/logging/EventLogTags;
-Lcom/android/internal/logging/MetricsLogger;
-Lcom/android/internal/net/LegacyVpnInfo;
-Lcom/android/internal/net/NetworkStatsFactory;
-Lcom/android/internal/net/VpnConfig;
-Lcom/android/internal/net/VpnInfo;
-Lcom/android/internal/net/VpnProfile;
-Lcom/android/internal/os/AndroidPrintStream;
-Lcom/android/internal/os/AppFuseMount;
-Lcom/android/internal/os/AtomicFile;
-Lcom/android/internal/os/BackgroundThread;
-Lcom/android/internal/os/BatterySipper;
-Lcom/android/internal/os/BatterySipper$DrainType;
-Lcom/android/internal/os/BatteryStatsHelper;
-Lcom/android/internal/os/BatteryStatsHelper$1;
-Lcom/android/internal/os/BatteryStatsImpl;
-Lcom/android/internal/os/BatteryStatsImpl$1;
-Lcom/android/internal/os/BatteryStatsImpl$5;
-Lcom/android/internal/os/BatteryStatsImpl$BatchTimer;
-Lcom/android/internal/os/BatteryStatsImpl$BatteryCallback;
-Lcom/android/internal/os/BatteryStatsImpl$Clocks;
-Lcom/android/internal/os/BatteryStatsImpl$ControllerActivityCounterImpl;
-Lcom/android/internal/os/BatteryStatsImpl$Counter;
-Lcom/android/internal/os/BatteryStatsImpl$DurationTimer;
-Lcom/android/internal/os/BatteryStatsImpl$ExternalStatsSync;
-Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounter;
-Lcom/android/internal/os/BatteryStatsImpl$MyHandler;
-Lcom/android/internal/os/BatteryStatsImpl$OverflowArrayMap;
-Lcom/android/internal/os/BatteryStatsImpl$PlatformIdleStateCallback;
-Lcom/android/internal/os/BatteryStatsImpl$SamplingTimer;
-Lcom/android/internal/os/BatteryStatsImpl$StopwatchTimer;
-Lcom/android/internal/os/BatteryStatsImpl$SystemClocks;
-Lcom/android/internal/os/BatteryStatsImpl$TimeBase;
-Lcom/android/internal/os/BatteryStatsImpl$TimeBaseObs;
-Lcom/android/internal/os/BatteryStatsImpl$Timer;
-Lcom/android/internal/os/BatteryStatsImpl$Uid;
-Lcom/android/internal/os/BatteryStatsImpl$Uid$1;
-Lcom/android/internal/os/BatteryStatsImpl$Uid$2;
-Lcom/android/internal/os/BatteryStatsImpl$Uid$3;
-Lcom/android/internal/os/BatteryStatsImpl$Uid$Pkg;
-Lcom/android/internal/os/BatteryStatsImpl$Uid$Pkg$Serv;
-Lcom/android/internal/os/BatteryStatsImpl$Uid$Proc;
-Lcom/android/internal/os/BatteryStatsImpl$Uid$Sensor;
-Lcom/android/internal/os/BatteryStatsImpl$Uid$Wakelock;
-Lcom/android/internal/os/BinderInternal;
-Lcom/android/internal/os/BinderInternal$GcWatcher;
-Lcom/android/internal/os/BluetoothPowerCalculator;
-Lcom/android/internal/os/CameraPowerCalculator;
-Lcom/android/internal/os/CpuPowerCalculator;
-Lcom/android/internal/os/FlashlightPowerCalculator;
-Lcom/android/internal/os/FuseAppLoop;
-Lcom/android/internal/os/FuseAppLoop$1;
-Lcom/android/internal/os/FuseAppLoop$UnmountedException;
-Lcom/android/internal/os/HandlerCaller;
-Lcom/android/internal/os/HandlerCaller$Callback;
-Lcom/android/internal/os/HandlerCaller$MyHandler;
-Lcom/android/internal/os/IDropBoxManagerService;
-Lcom/android/internal/os/IDropBoxManagerService$Stub;
-Lcom/android/internal/os/IResultReceiver;
-Lcom/android/internal/os/IResultReceiver$Stub;
-Lcom/android/internal/os/IResultReceiver$Stub$Proxy;
-Lcom/android/internal/os/IShellCallback;
-Lcom/android/internal/os/IShellCallback$Stub;
-Lcom/android/internal/os/IShellCallback$Stub$Proxy;
-Lcom/android/internal/os/KernelCpuSpeedReader;
-Lcom/android/internal/os/KernelMemoryBandwidthStats;
-Lcom/android/internal/os/KernelUidCpuTimeReader;
-Lcom/android/internal/os/KernelWakelockReader;
-Lcom/android/internal/os/KernelWakelockStats;
-Lcom/android/internal/os/KernelWakelockStats$Entry;
-Lcom/android/internal/os/LoggingPrintStream;
-Lcom/android/internal/os/LoggingPrintStream$1;
-Lcom/android/internal/os/MemoryPowerCalculator;
-Lcom/android/internal/os/MobileRadioPowerCalculator;
-Lcom/android/internal/os/PathClassLoaderFactory;
-Lcom/android/internal/os/PowerCalculator;
-Lcom/android/internal/os/PowerProfile;
-Lcom/android/internal/os/PowerProfile$CpuClusterKey;
-Lcom/android/internal/os/ProcessCpuTracker;
-Lcom/android/internal/os/ProcessCpuTracker$1;
-Lcom/android/internal/os/ProcessCpuTracker$FilterStats;
-Lcom/android/internal/os/ProcessCpuTracker$Stats;
-Lcom/android/internal/os/RoSystemProperties;
-Lcom/android/internal/os/RuntimeInit;
-Lcom/android/internal/os/RuntimeInit$1;
-Lcom/android/internal/os/RuntimeInit$Arguments;
-Lcom/android/internal/os/RuntimeInit$KillApplicationHandler;
-Lcom/android/internal/os/RuntimeInit$LoggingHandler;
-Lcom/android/internal/os/SamplingProfilerIntegration;
-Lcom/android/internal/os/SensorPowerCalculator;
-Lcom/android/internal/os/SomeArgs;
-Lcom/android/internal/os/TransferPipe;
-Lcom/android/internal/os/WakelockPowerCalculator;
-Lcom/android/internal/os/WifiPowerCalculator;
-Lcom/android/internal/os/Zygote;
-Lcom/android/internal/os/ZygoteConnection;
-Lcom/android/internal/os/ZygoteConnection$Arguments;
-Lcom/android/internal/os/ZygoteInit;
-Lcom/android/internal/os/Zygote$MethodAndArgsCaller;
-Lcom/android/internal/os/ZygoteSecurityException;
-Lcom/android/internal/os/ZygoteServer;
-Lcom/android/internal/policy/DecorContext;
-Lcom/android/internal/policy/DecorView;
-Lcom/android/internal/policy/DecorView$ColorViewState;
-Lcom/android/internal/policy/DividerSnapAlgorithm;
-Lcom/android/internal/policy/DividerSnapAlgorithm$SnapTarget;
-Lcom/android/internal/policy/DockedDividerUtils;
-Lcom/android/internal/policy/IKeyguardDismissCallback;
-Lcom/android/internal/policy/IKeyguardDrawnCallback;
-Lcom/android/internal/policy/IKeyguardDrawnCallback$Stub;
-Lcom/android/internal/policy/IKeyguardExitCallback;
-Lcom/android/internal/policy/IKeyguardService;
-Lcom/android/internal/policy/IKeyguardService$Stub;
-Lcom/android/internal/policy/IKeyguardService$Stub$Proxy;
-Lcom/android/internal/policy/IKeyguardStateCallback;
-Lcom/android/internal/policy/IKeyguardStateCallback$Stub;
-Lcom/android/internal/policy/IShortcutService;
-Lcom/android/internal/policy/IShortcutService$Stub;
-Lcom/android/internal/policy/IShortcutService$Stub$Proxy;
-Lcom/android/internal/policy/PhoneFallbackEventHandler;
-Lcom/android/internal/policy/PhoneLayoutInflater;
-Lcom/android/internal/policy/PhoneWindow;
-Lcom/android/internal/policy/PhoneWindow$1;
-Lcom/android/internal/policy/PhoneWindow$PanelFeatureState;
-Lcom/android/internal/policy/PhoneWindow$PhoneWindowMenuCallback;
-Lcom/android/internal/policy/PhoneWindow$RotationWatcher;
-Lcom/android/internal/policy/PhoneWindow$RotationWatcher$1;
-Lcom/android/internal/policy/PipMotionHelper;
-Lcom/android/internal/policy/PipSnapAlgorithm;
-Lcom/android/internal/R$styleable;
-Lcom/android/internal/statusbar/IStatusBar;
-Lcom/android/internal/statusbar/IStatusBarService;
-Lcom/android/internal/statusbar/IStatusBarService$Stub;
-Lcom/android/internal/statusbar/IStatusBar$Stub;
-Lcom/android/internal/statusbar/IStatusBar$Stub$Proxy;
-Lcom/android/internal/statusbar/NotificationVisibility;
-Lcom/android/internal/statusbar/NotificationVisibility$1;
-Lcom/android/internal/statusbar/StatusBarIcon;
-Lcom/android/internal/telecom/IConnectionService;
-Lcom/android/internal/telecom/IConnectionServiceAdapter;
-Lcom/android/internal/telecom/IConnectionServiceAdapter$Stub;
-Lcom/android/internal/telecom/IConnectionService$Stub;
-Lcom/android/internal/telecom/IConnectionService$Stub$Proxy;
-Lcom/android/internal/telecom/IInCallAdapter;
-Lcom/android/internal/telecom/IInCallAdapter$Stub;
-Lcom/android/internal/telecom/IInCallService;
-Lcom/android/internal/telecom/IInCallService$Stub;
-Lcom/android/internal/telecom/IInCallService$Stub$Proxy;
-Lcom/android/internal/telecom/ITelecomService;
-Lcom/android/internal/telecom/ITelecomService$Stub;
-Lcom/android/internal/telecom/IVideoProvider;
-Lcom/android/internal/telecom/IVideoProvider$Stub;
-Lcom/android/internal/telecom/RemoteServiceCallback;
-Lcom/android/internal/telecom/RemoteServiceCallback$Stub;
-Lcom/android/internal/telecom/RemoteServiceCallback$Stub$Proxy;
-Lcom/android/internal/telephony/CallerInfo;
-Lcom/android/internal/telephony/CallerInfoAsyncQuery;
-Lcom/android/internal/telephony/CallerInfoAsyncQuery$CallerInfoAsyncQueryHandler;
-Lcom/android/internal/telephony/CallerInfoAsyncQuery$CallerInfoAsyncQueryHandler$CallerInfoWorkerHandler;
-Lcom/android/internal/telephony/CallerInfoAsyncQuery$CookieWrapper;
-Lcom/android/internal/telephony/CallerInfoAsyncQuery$OnQueryCompleteListener;
-Lcom/android/internal/telephony/CarrierAppUtils;
-Lcom/android/internal/telephony/DefaultPhoneNotifier;
-Lcom/android/internal/telephony/ICarrierConfigLoader;
-Lcom/android/internal/telephony/ICarrierConfigLoader$Stub;
-Lcom/android/internal/telephony/ICarrierConfigLoader$Stub$Proxy;
-Lcom/android/internal/telephony/IccCardConstants$State;
-Lcom/android/internal/telephony/IMms;
-Lcom/android/internal/telephony/IMms$Stub;
-Lcom/android/internal/telephony/IOnSubscriptionsChangedListener;
-Lcom/android/internal/telephony/IOnSubscriptionsChangedListener$Stub;
-Lcom/android/internal/telephony/IOnSubscriptionsChangedListener$Stub$Proxy;
-Lcom/android/internal/telephony/IPhoneStateListener;
-Lcom/android/internal/telephony/IPhoneStateListener$Stub;
-Lcom/android/internal/telephony/IPhoneStateListener$Stub$Proxy;
-Lcom/android/internal/telephony/IPhoneSubInfo;
-Lcom/android/internal/telephony/IPhoneSubInfo$Stub;
-Lcom/android/internal/telephony/IPhoneSubInfo$Stub$Proxy;
-Lcom/android/internal/telephony/ISub;
-Lcom/android/internal/telephony/ISub$Stub;
-Lcom/android/internal/telephony/ISub$Stub$Proxy;
-Lcom/android/internal/telephony/ITelephony;
-Lcom/android/internal/telephony/ITelephonyRegistry;
-Lcom/android/internal/telephony/ITelephonyRegistry$Stub;
-Lcom/android/internal/telephony/ITelephony$Stub;
-Lcom/android/internal/telephony/ITelephony$Stub$Proxy;
-Lcom/android/internal/telephony/PhoneConstants$DataState;
-Lcom/android/internal/telephony/PhoneConstants$State;
-Lcom/android/internal/telephony/PhoneNotifier;
-Lcom/android/internal/telephony/SmsApplication;
-Lcom/android/internal/textservice/ISpellCheckerService;
-Lcom/android/internal/textservice/ISpellCheckerService$Stub;
-Lcom/android/internal/textservice/ISpellCheckerService$Stub$Proxy;
-Lcom/android/internal/textservice/ISpellCheckerSession;
-Lcom/android/internal/textservice/ISpellCheckerSessionListener;
-Lcom/android/internal/textservice/ISpellCheckerSessionListener$Stub;
-Lcom/android/internal/textservice/ISpellCheckerSessionListener$Stub$Proxy;
-Lcom/android/internal/textservice/ISpellCheckerSession$Stub;
-Lcom/android/internal/textservice/ISpellCheckerSession$Stub$Proxy;
-Lcom/android/internal/textservice/ITextServicesManager;
-Lcom/android/internal/textservice/ITextServicesManager$Stub;
-Lcom/android/internal/textservice/ITextServicesSessionListener;
-Lcom/android/internal/textservice/ITextServicesSessionListener$Stub;
-Lcom/android/internal/textservice/ITextServicesSessionListener$Stub$Proxy;
-Lcom/android/internal/util/ArrayUtils;
-Lcom/android/internal/util/AsyncChannel;
-Lcom/android/internal/util/AsyncChannel$AsyncChannelConnection;
-Lcom/android/internal/util/AsyncChannel$DeathMonitor;
-Lcom/android/internal/util/AsyncChannel$SyncMessenger;
-Lcom/android/internal/util/AsyncChannel$SyncMessenger$SyncHandler;
-Lcom/android/internal/util/ConcurrentUtils;
-Lcom/android/internal/util/ConcurrentUtils$1;
-Lcom/android/internal/util/ConcurrentUtils$1$1;
-Lcom/android/internal/util/DumpUtils$Dump;
-Lcom/android/internal/util/FastPrintWriter;
-Lcom/android/internal/util/FastPrintWriter$DummyWriter;
-Lcom/android/internal/util/FastXmlSerializer;
-Lcom/android/internal/util/FileRotator;
-Lcom/android/internal/util/FileRotator$FileInfo;
-Lcom/android/internal/util/FileRotator$Reader;
-Lcom/android/internal/util/FileRotator$Rewriter;
-Lcom/android/internal/util/FileRotator$Writer;
-Lcom/android/internal/util/GrowingArrayUtils;
-Lcom/android/internal/util/HexDump;
-Lcom/android/internal/util/IndentingPrintWriter;
-Lcom/android/internal/util/IState;
-Lcom/android/internal/util/JournaledFile;
-Lcom/android/internal/util/LineBreakBufferedWriter;
-Lcom/android/internal/util/LocalLog;
-Lcom/android/internal/util/MemInfoReader;
-Lcom/android/internal/util/MessageUtils;
-Lcom/android/internal/util/Preconditions;
-Lcom/android/internal/util/ProcFileReader;
-Lcom/android/internal/util/ProgressReporter;
-Lcom/android/internal/util/RingBufferIndices;
-Lcom/android/internal/util/ScreenShapeHelper;
-Lcom/android/internal/util/State;
-Lcom/android/internal/util/StateMachine;
-Lcom/android/internal/util/StateMachine$LogRec;
-Lcom/android/internal/util/StateMachine$LogRecords;
-Lcom/android/internal/util/StateMachine$SmHandler;
-Lcom/android/internal/util/StateMachine$SmHandler$HaltingState;
-Lcom/android/internal/util/StateMachine$SmHandler$QuittingState;
-Lcom/android/internal/util/StateMachine$SmHandler$StateInfo;
-Lcom/android/internal/util/ToBooleanFunction;
-Lcom/android/internal/util/TokenBucket;
-Lcom/android/internal/util/VirtualRefBasePtr;
-Lcom/android/internal/util/WakeupMessage;
-Lcom/android/internal/util/XmlUtils;
-Lcom/android/internal/util/XmlUtils$ReadMapCallback;
-Lcom/android/internal/util/XmlUtils$WriteMapCallback;
-Lcom/android/internal/view/animation/NativeInterpolatorFactory;
-Lcom/android/internal/view/animation/NativeInterpolatorFactoryHelper;
-Lcom/android/internal/view/BaseIWindow;
-Lcom/android/internal/view/IInputConnectionWrapper;
-Lcom/android/internal/view/IInputConnectionWrapper$MyHandler;
-Lcom/android/internal/view/IInputContext;
-Lcom/android/internal/view/IInputContext$Stub;
-Lcom/android/internal/view/IInputContext$Stub$Proxy;
-Lcom/android/internal/view/IInputMethod;
-Lcom/android/internal/view/IInputMethodClient;
-Lcom/android/internal/view/IInputMethodClient$Stub;
-Lcom/android/internal/view/IInputMethodClient$Stub$Proxy;
-Lcom/android/internal/view/IInputMethodManager;
-Lcom/android/internal/view/IInputMethodManager$Stub;
-Lcom/android/internal/view/IInputMethodSession;
-Lcom/android/internal/view/IInputMethodSession$Stub;
-Lcom/android/internal/view/IInputMethodSession$Stub$Proxy;
-Lcom/android/internal/view/IInputMethod$Stub;
-Lcom/android/internal/view/IInputMethod$Stub$Proxy;
-Lcom/android/internal/view/IInputSessionCallback;
-Lcom/android/internal/view/IInputSessionCallback$Stub;
-Lcom/android/internal/view/InputBindResult;
-Lcom/android/internal/view/InputBindResult$1;
-Lcom/android/internal/view/menu/ActionMenuItem;
-Lcom/android/internal/view/menu/MenuBuilder$Callback;
-Lcom/android/internal/view/menu/MenuPresenter$Callback;
-Lcom/android/internal/view/RootViewSurfaceTaker;
-Lcom/android/internal/view/WindowManagerPolicyThread;
-Lcom/android/internal/widget/AbsActionBarView;
-Lcom/android/internal/widget/AbsActionBarView$VisibilityAnimListener;
-Lcom/android/internal/widget/ActionBarContainer;
-Lcom/android/internal/widget/ActionBarContainer$ActionBarBackgroundDrawable;
-Lcom/android/internal/widget/ActionBarContextView;
-Lcom/android/internal/widget/ActionBarOverlayLayout;
-Lcom/android/internal/widget/ActionBarOverlayLayout$1;
-Lcom/android/internal/widget/ActionBarOverlayLayout$2;
-Lcom/android/internal/widget/ActionBarOverlayLayout$3;
-Lcom/android/internal/widget/ActionBarOverlayLayout$4;
-Lcom/android/internal/widget/ActionBarOverlayLayout$5;
-Lcom/android/internal/widget/ActionBarOverlayLayout$LayoutParams;
-Lcom/android/internal/widget/BackgroundFallback;
-Lcom/android/internal/widget/DecorContentParent;
-Lcom/android/internal/widget/DecorToolbar;
-Lcom/android/internal/widget/ICheckCredentialProgressCallback;
-Lcom/android/internal/widget/ILockSettings;
-Lcom/android/internal/widget/ILockSettings$Stub;
-Lcom/android/internal/widget/LockPatternUtils;
-Lcom/android/internal/widget/LockPatternUtils$StrongAuthTracker;
-Lcom/android/internal/widget/LockPatternUtils$StrongAuthTracker$1;
-Lcom/android/internal/widget/LockPatternUtils$StrongAuthTracker$H;
-Lcom/android/internal/widget/ToolbarWidgetWrapper;
-Lcom/android/internal/widget/ToolbarWidgetWrapper$1;
-Lcom/android/internal/widget/VerifyCredentialResponse;
-Lcom/android/location/fused/FusedLocationProvider;
-Lcom/android/location/fused/FusedLocationProvider$1;
-Lcom/android/location/fused/FusedLocationProvider$2;
-Lcom/android/location/fused/FusedLocationService;
-Lcom/android/location/fused/FusionEngine;
-Lcom/android/location/fused/FusionEngine$Callback;
-Lcom/android/location/fused/FusionEngine$ProviderStats;
-Lcom/android/location/provider/LocationProviderBase;
-Lcom/android/location/provider/LocationProviderBase$Service;
-Lcom/android/location/provider/ProviderPropertiesUnbundled;
-Lcom/android/okhttp/Address;
-Lcom/android/okhttp/Authenticator;
-Lcom/android/okhttp/CacheControl;
-Lcom/android/okhttp/CacheControl$Builder;
-Lcom/android/okhttp/CertificatePinner;
-Lcom/android/okhttp/CertificatePinner$Builder;
-Lcom/android/okhttp/CipherSuite;
-Lcom/android/okhttp/ConfigAwareConnectionPool;
-Lcom/android/okhttp/Connection;
-Lcom/android/okhttp/ConnectionPool;
-Lcom/android/okhttp/ConnectionPool$1;
-Lcom/android/okhttp/ConnectionSpec;
-Lcom/android/okhttp/ConnectionSpec$Builder;
-Lcom/android/okhttp/Dispatcher;
-Lcom/android/okhttp/Dns;
-Lcom/android/okhttp/Handshake;
-Lcom/android/okhttp/Headers;
-Lcom/android/okhttp/Headers$Builder;
-Lcom/android/okhttp/HttpHandler;
-Lcom/android/okhttp/HttpHandler$CleartextURLFilter;
-Lcom/android/okhttp/HttpsHandler;
-Lcom/android/okhttp/HttpUrl;
-Lcom/android/okhttp/HttpUrl$Builder;
-Lcom/android/okhttp/HttpUrl$Builder$ParseResult;
-Lcom/android/okhttp/internal/ConnectionSpecSelector;
-Lcom/android/okhttp/internal/http/AuthenticatorAdapter;
-Lcom/android/okhttp/internal/http/CacheStrategy;
-Lcom/android/okhttp/internal/http/CacheStrategy$Factory;
-Lcom/android/okhttp/internal/http/Http1xStream;
-Lcom/android/okhttp/internal/http/Http1xStream$AbstractSource;
-Lcom/android/okhttp/internal/http/Http1xStream$FixedLengthSource;
-Lcom/android/okhttp/internal/http/HttpEngine;
-Lcom/android/okhttp/internal/http/HttpEngine$1;
-Lcom/android/okhttp/internal/http/HttpMethod;
-Lcom/android/okhttp/internal/http/HttpStream;
-Lcom/android/okhttp/internal/http/OkHeaders;
-Lcom/android/okhttp/internal/http/OkHeaders$1;
-Lcom/android/okhttp/internal/http/RealResponseBody;
-Lcom/android/okhttp/internal/http/RequestException;
-Lcom/android/okhttp/internal/http/RequestLine;
-Lcom/android/okhttp/internal/http/RetryableSink;
-Lcom/android/okhttp/internal/http/RouteException;
-Lcom/android/okhttp/internal/http/RouteSelector;
-Lcom/android/okhttp/internal/http/StatusLine;
-Lcom/android/okhttp/internal/http/StreamAllocation;
-Lcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;
-Lcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;
-Lcom/android/okhttp/internal/huc/HttpURLConnectionImpl;
-Lcom/android/okhttp/internal/Internal;
-Lcom/android/okhttp/internal/io/RealConnection;
-Lcom/android/okhttp/internal/OptionalMethod;
-Lcom/android/okhttp/internal/Platform;
-Lcom/android/okhttp/internal/RouteDatabase;
-Lcom/android/okhttp/internal/tls/OkHostnameVerifier;
-Lcom/android/okhttp/internal/URLFilter;
-Lcom/android/okhttp/internal/Util;
-Lcom/android/okhttp/internal/Util$1;
-Lcom/android/okhttp/OkHttpClient;
-Lcom/android/okhttp/OkHttpClient$1;
-Lcom/android/okhttp/okio/AsyncTimeout;
-Lcom/android/okhttp/okio/AsyncTimeout$1;
-Lcom/android/okhttp/okio/AsyncTimeout$2;
-Lcom/android/okhttp/okio/AsyncTimeout$Watchdog;
-Lcom/android/okhttp/okio/Buffer;
-Lcom/android/okhttp/okio/BufferedSink;
-Lcom/android/okhttp/okio/BufferedSource;
-Lcom/android/okhttp/okio/ForwardingTimeout;
-Lcom/android/okhttp/okio/Okio;
-Lcom/android/okhttp/okio/Okio$1;
-Lcom/android/okhttp/okio/Okio$2;
-Lcom/android/okhttp/okio/Okio$3;
-Lcom/android/okhttp/okio/RealBufferedSink;
-Lcom/android/okhttp/okio/RealBufferedSource;
-Lcom/android/okhttp/okio/Segment;
-Lcom/android/okhttp/okio/SegmentPool;
-Lcom/android/okhttp/okio/Sink;
-Lcom/android/okhttp/okio/Source;
-Lcom/android/okhttp/okio/Timeout;
-Lcom/android/okhttp/okio/Timeout$1;
-Lcom/android/okhttp/okio/Util;
-Lcom/android/okhttp/OkUrlFactory;
-Lcom/android/okhttp/Protocol;
-Lcom/android/okhttp/Request;
-Lcom/android/okhttp/RequestBody;
-Lcom/android/okhttp/RequestBody$2;
-Lcom/android/okhttp/Request$Builder;
-Lcom/android/okhttp/Response;
-Lcom/android/okhttp/ResponseBody;
-Lcom/android/okhttp/Response$Builder;
-Lcom/android/okhttp/Route;
-Lcom/android/okhttp/TlsVersion;
-Lcom/android/org/bouncycastle/asn1/ASN1Encodable;
-Lcom/android/org/bouncycastle/asn1/ASN1Object;
-Lcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;
-Lcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier$OidHandle;
-Lcom/android/org/bouncycastle/asn1/ASN1Primitive;
-Lcom/android/org/bouncycastle/asn1/bc/BCObjectIdentifiers;
-Lcom/android/org/bouncycastle/asn1/iana/IANAObjectIdentifiers;
-Lcom/android/org/bouncycastle/asn1/misc/MiscObjectIdentifiers;
-Lcom/android/org/bouncycastle/asn1/nist/NISTObjectIdentifiers;
-Lcom/android/org/bouncycastle/asn1/OIDTokenizer;
-Lcom/android/org/bouncycastle/asn1/oiw/OIWObjectIdentifiers;
-Lcom/android/org/bouncycastle/asn1/pkcs/PKCSObjectIdentifiers;
-Lcom/android/org/bouncycastle/asn1/x509/X509ObjectIdentifiers;
-Lcom/android/org/bouncycastle/asn1/x9/X9ObjectIdentifiers;
-Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/dh/KeyFactorySpi;
-Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/DH$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/dsa/DSAUtil;
-Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/dsa/KeyFactorySpi;
-Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/DSA$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/ec/KeyFactorySpi;
-Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/ec/KeyFactorySpi$EC;
-Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/EC$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/rsa/KeyFactorySpi;
-Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/RSA$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/util/BaseKeyFactorySpi;
-Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/X509$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/config/ConfigurableProvider;
-Lcom/android/org/bouncycastle/jcajce/provider/config/ProviderConfiguration;
-Lcom/android/org/bouncycastle/jcajce/provider/config/ProviderConfigurationPermission;
-Lcom/android/org/bouncycastle/jcajce/provider/digest/DigestAlgorithmProvider;
-Lcom/android/org/bouncycastle/jcajce/provider/digest/MD5;
-Lcom/android/org/bouncycastle/jcajce/provider/digest/MD5$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/digest/SHA1;
-Lcom/android/org/bouncycastle/jcajce/provider/digest/SHA1$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/digest/SHA224;
-Lcom/android/org/bouncycastle/jcajce/provider/digest/SHA224$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/digest/SHA256;
-Lcom/android/org/bouncycastle/jcajce/provider/digest/SHA256$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/digest/SHA384;
-Lcom/android/org/bouncycastle/jcajce/provider/digest/SHA384$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/digest/SHA512;
-Lcom/android/org/bouncycastle/jcajce/provider/digest/SHA512$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi;
-Lcom/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi$Std;
-Lcom/android/org/bouncycastle/jcajce/provider/keystore/BC$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/keystore/PKCS12$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/AES;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/AES$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/ARC4;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/ARC4$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/Blowfish;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/Blowfish$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/DES;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/DESede;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/DESede$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/DES$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/PBEPBKDF2;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/PBEPBKDF2$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/PBEPKCS12;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/PBEPKCS12$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/PBES2AlgorithmParameters;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/PBES2AlgorithmParameters$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/RC2;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/RC2$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/SymmetricAlgorithmProvider;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/Twofish;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/Twofish$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/util/AlgorithmProvider;
-Lcom/android/org/bouncycastle/jcajce/provider/util/AsymmetricAlgorithmProvider;
-Lcom/android/org/bouncycastle/jcajce/provider/util/AsymmetricKeyInfoConverter;
-Lcom/android/org/bouncycastle/jcajce/util/BCJcaJceHelper;
-Lcom/android/org/bouncycastle/jcajce/util/JcaJceHelper;
-Lcom/android/org/bouncycastle/jcajce/util/ProviderJcaJceHelper;
-Lcom/android/org/bouncycastle/jce/interfaces/BCKeyStore;
-Lcom/android/org/bouncycastle/jce/provider/BouncyCastleProvider;
-Lcom/android/org/bouncycastle/jce/provider/BouncyCastleProvider$1;
-Lcom/android/org/bouncycastle/jce/provider/BouncyCastleProviderConfiguration;
-Lcom/android/org/bouncycastle/util/Arrays;
-Lcom/android/org/bouncycastle/util/Encodable;
-Lcom/android/org/bouncycastle/util/Strings;
-Lcom/android/org/bouncycastle/util/Strings$1;
-Lcom/android/org/conscrypt/AbstractOpenSSLSession;
-Lcom/android/org/conscrypt/AbstractSessionContext;
-Lcom/android/org/conscrypt/AbstractSessionContext$1;
-Lcom/android/org/conscrypt/AddressUtils;
-Lcom/android/org/conscrypt/ByteArray;
-Lcom/android/org/conscrypt/CertBlacklist;
-Lcom/android/org/conscrypt/CertificatePriorityComparator;
-Lcom/android/org/conscrypt/ChainStrengthAnalyzer;
-Lcom/android/org/conscrypt/ClientSessionContext;
-Lcom/android/org/conscrypt/ClientSessionContext$HostAndPort;
-Lcom/android/org/conscrypt/CryptoUpcalls;
-Lcom/android/org/conscrypt/ct/CTLogInfo;
-Lcom/android/org/conscrypt/ct/CTLogStore;
-Lcom/android/org/conscrypt/ct/CTLogStoreImpl;
-Lcom/android/org/conscrypt/ct/CTLogStoreImpl$InvalidLogFileException;
-Lcom/android/org/conscrypt/ct/CTPolicy;
-Lcom/android/org/conscrypt/ct/CTPolicyImpl;
-Lcom/android/org/conscrypt/ct/CTVerifier;
-Lcom/android/org/conscrypt/ct/KnownLogs;
-Lcom/android/org/conscrypt/ct/SerializationException;
-Lcom/android/org/conscrypt/EvpMdRef$MD5;
-Lcom/android/org/conscrypt/EvpMdRef$SHA1;
-Lcom/android/org/conscrypt/EvpMdRef$SHA256;
-Lcom/android/org/conscrypt/Hex;
-Lcom/android/org/conscrypt/JSSEProvider;
-Lcom/android/org/conscrypt/KeyManagerFactoryImpl;
-Lcom/android/org/conscrypt/KeyManagerImpl;
-Lcom/android/org/conscrypt/NativeCrypto;
-Lcom/android/org/conscrypt/NativeCryptoJni;
-Lcom/android/org/conscrypt/NativeCrypto$SSLHandshakeCallbacks;
-Lcom/android/org/conscrypt/NativeRef;
-Lcom/android/org/conscrypt/NativeRef$EC_GROUP;
-Lcom/android/org/conscrypt/NativeRef$EVP_MD_CTX;
-Lcom/android/org/conscrypt/NativeRef$EVP_PKEY;
-Lcom/android/org/conscrypt/OpenSSLBIOInputStream;
-Lcom/android/org/conscrypt/OpenSSLContextImpl;
-Lcom/android/org/conscrypt/OpenSSLContextImpl$TLSv12;
-Lcom/android/org/conscrypt/OpenSSLECGroupContext;
-Lcom/android/org/conscrypt/OpenSSLECPublicKey;
-Lcom/android/org/conscrypt/OpenSSLExtendedSessionImpl;
-Lcom/android/org/conscrypt/OpenSSLKey;
-Lcom/android/org/conscrypt/OpenSSLKeyHolder;
-Lcom/android/org/conscrypt/OpenSSLMessageDigestJDK;
-Lcom/android/org/conscrypt/OpenSSLMessageDigestJDK$MD5;
-Lcom/android/org/conscrypt/OpenSSLMessageDigestJDK$SHA1;
-Lcom/android/org/conscrypt/OpenSSLMessageDigestJDK$SHA256;
-Lcom/android/org/conscrypt/OpenSSLProvider;
-Lcom/android/org/conscrypt/OpenSSLRandom;
-Lcom/android/org/conscrypt/OpenSSLRSAKeyFactory;
-Lcom/android/org/conscrypt/OpenSSLRSAPublicKey;
-Lcom/android/org/conscrypt/OpenSSLSessionImpl;
-Lcom/android/org/conscrypt/OpenSSLSignature;
-Lcom/android/org/conscrypt/OpenSSLSignature$EngineType;
-Lcom/android/org/conscrypt/OpenSSLSignature$RSAPKCS1Padding;
-Lcom/android/org/conscrypt/OpenSSLSignature$SHA256RSA;
-Lcom/android/org/conscrypt/OpenSSLSocketFactoryImpl;
-Lcom/android/org/conscrypt/OpenSSLSocketImpl;
-Lcom/android/org/conscrypt/OpenSSLSocketImpl$SSLInputStream;
-Lcom/android/org/conscrypt/OpenSSLSocketImpl$SSLOutputStream;
-Lcom/android/org/conscrypt/OpenSSLSocketImplWrapper;
-Lcom/android/org/conscrypt/OpenSSLX509Certificate;
-Lcom/android/org/conscrypt/OpenSSLX509CertificateFactory;
-Lcom/android/org/conscrypt/OpenSSLX509CertificateFactory$1;
-Lcom/android/org/conscrypt/OpenSSLX509CertificateFactory$2;
-Lcom/android/org/conscrypt/OpenSSLX509CertificateFactory$Parser;
-Lcom/android/org/conscrypt/OpenSSLX509CertificateFactory$ParsingException;
-Lcom/android/org/conscrypt/OpenSSLX509CertPath;
-Lcom/android/org/conscrypt/OpenSSLX509CertPath$Encoding;
-Lcom/android/org/conscrypt/Platform;
-Lcom/android/org/conscrypt/Platform$NoPreloadHolder;
-Lcom/android/org/conscrypt/ServerSessionContext;
-Lcom/android/org/conscrypt/SSLParametersImpl;
-Lcom/android/org/conscrypt/SSLParametersImpl$AliasChooser;
-Lcom/android/org/conscrypt/SSLParametersImpl$PSKCallbacks;
-Lcom/android/org/conscrypt/TrustedCertificateIndex;
-Lcom/android/org/conscrypt/TrustedCertificateKeyStoreSpi;
-Lcom/android/org/conscrypt/TrustedCertificateStore;
-Lcom/android/org/conscrypt/TrustedCertificateStore$1;
-Lcom/android/org/conscrypt/TrustedCertificateStore$2;
-Lcom/android/org/conscrypt/TrustedCertificateStore$4;
-Lcom/android/org/conscrypt/TrustedCertificateStore$5;
-Lcom/android/org/conscrypt/TrustedCertificateStore$CertSelector;
-Lcom/android/org/conscrypt/TrustManagerFactoryImpl;
-Lcom/android/org/conscrypt/TrustManagerImpl;
-Lcom/android/org/conscrypt/TrustManagerImpl$ExtendedKeyUsagePKIXCertPathChecker;
-Lcom/android/org/conscrypt/TrustManagerImpl$TrustAnchorComparator;
-Lcom/android/org/conscrypt/util/ArrayUtils;
-Lcom/android/providers/settings/GenerationRegistry;
-Lcom/android/providers/settings/SettingsProvider;
-Lcom/android/providers/settings/SettingsProvider$1;
-Lcom/android/providers/settings/SettingsProvider$2;
-Lcom/android/providers/settings/SettingsProvider$SettingsRegistry;
-Lcom/android/providers/settings/SettingsProvider$SettingsRegistry$MyHandler;
-Lcom/android/providers/settings/SettingsProvider$SettingsRegistry$UpgradeController;
-Lcom/android/providers/settings/SettingsService;
-Lcom/android/providers/settings/SettingsService$MyShellCommand;
-Lcom/android/providers/settings/SettingsService$MyShellCommand$CommandVerb;
-Lcom/android/providers/settings/SettingsState;
-Lcom/android/providers/settings/SettingsState$1;
-Lcom/android/providers/settings/SettingsState$HistoricalOperation;
-Lcom/android/providers/settings/SettingsState$MyHandler;
-Lcom/android/providers/settings/SettingsState$Setting;
-Lcom/android/server/accessibility/AccessibilityManagerService;
-Lcom/android/server/accessibility/AccessibilityManagerService$1;
-Lcom/android/server/accessibility/AccessibilityManagerService$2;
-Lcom/android/server/accessibility/AccessibilityManagerService$AccessibilityContentObserver;
-Lcom/android/server/accessibility/AccessibilityManagerService$MainHandler;
-Lcom/android/server/accessibility/AccessibilityManagerService$SecurityPolicy;
-Lcom/android/server/accessibility/AccessibilityManagerService$Service;
-Lcom/android/server/accessibility/AccessibilityManagerService$UserState;
-Lcom/android/server/accessibility/AccessibilityManagerService$UserState$1;
-Lcom/android/server/accessibility/DisplayAdjustmentUtils;
-Lcom/android/server/accessibility/FingerprintGestureDispatcher$FingerprintGestureClient;
-Lcom/android/server/accessibility/KeyEventDispatcher$KeyEventFilter;
-Lcom/android/server/accounts/AccountAuthenticatorCache;
-Lcom/android/server/accounts/AccountAuthenticatorCache$MySerializer;
-Lcom/android/server/accounts/AccountManagerService;
-Lcom/android/server/accounts/AccountManagerService$1;
-Lcom/android/server/accounts/AccountManagerService$2;
-Lcom/android/server/accounts/AccountManagerService$3;
-Lcom/android/server/accounts/AccountManagerService$4;
-Lcom/android/server/accounts/AccountManagerService$8;
-Lcom/android/server/accounts/AccountManagerService$AccountManagerInternalImpl;
-Lcom/android/server/accounts/AccountManagerService$GetAccountsByTypeAndFeatureSession;
-Lcom/android/server/accounts/AccountManagerService$Injector;
-Lcom/android/server/accounts/AccountManagerService$Lifecycle;
-Lcom/android/server/accounts/AccountManagerService$MessageHandler;
-Lcom/android/server/accounts/AccountManagerService$Session;
-Lcom/android/server/accounts/AccountManagerService$TestFeaturesSession;
-Lcom/android/server/accounts/AccountManagerService$UserAccounts;
-Lcom/android/server/accounts/AccountsDb;
-Lcom/android/server/accounts/AccountsDb$CeDatabaseHelper;
-Lcom/android/server/accounts/AccountsDb$DeDatabaseHelper;
-Lcom/android/server/accounts/IAccountAuthenticatorCache;
-Lcom/android/server/accounts/TokenCache;
-Lcom/android/server/accounts/TokenCache$Key;
-Lcom/android/server/accounts/TokenCache$TokenLruCache;
-Lcom/android/server/accounts/TokenCache$TokenLruCache$Evictor;
-Lcom/android/server/accounts/TokenCache$Value;
-Lcom/android/server/AlarmManagerService;
-Lcom/android/server/AlarmManagerService$1;
-Lcom/android/server/AlarmManagerService$2;
-Lcom/android/server/AlarmManagerService$Alarm;
-Lcom/android/server/AlarmManagerService$AlarmHandler;
-Lcom/android/server/AlarmManagerService$AlarmThread;
-Lcom/android/server/AlarmManagerService$Batch;
-Lcom/android/server/AlarmManagerService$BatchTimeOrder;
-Lcom/android/server/AlarmManagerService$BroadcastStats;
-Lcom/android/server/AlarmManagerService$ClockReceiver;
-Lcom/android/server/AlarmManagerService$Constants;
-Lcom/android/server/AlarmManagerService$DeliveryTracker;
-Lcom/android/server/AlarmManagerService$FilterStats;
-Lcom/android/server/AlarmManagerService$IncreasingTimeOrder;
-Lcom/android/server/AlarmManagerService$InFlight;
-Lcom/android/server/AlarmManagerService$InteractiveStateReceiver;
-Lcom/android/server/AlarmManagerService$LocalService;
-Lcom/android/server/AlarmManagerService$PriorityClass;
-Lcom/android/server/AlarmManagerService$UidObserver;
-Lcom/android/server/AlarmManagerService$UninstallReceiver;
-Lcom/android/server/am/ActiveServices;
-Lcom/android/server/am/ActiveServices$1;
-Lcom/android/server/am/ActiveServices$ServiceLookupResult;
-Lcom/android/server/am/ActiveServices$ServiceMap;
-Lcom/android/server/am/ActiveServices$ServiceRestarter;
-Lcom/android/server/am/ActivityManagerConstants;
-Lcom/android/server/am/ActivityManagerDebugConfig;
-Lcom/android/server/am/ActivityManagerService;
-Lcom/android/server/am/ActivityManagerService$1;
-Lcom/android/server/am/ActivityManagerService$10;
-Lcom/android/server/am/ActivityManagerService$11;
-Lcom/android/server/am/ActivityManagerService$12;
-Lcom/android/server/am/ActivityManagerService$13;
-Lcom/android/server/am/ActivityManagerService$2;
-Lcom/android/server/am/ActivityManagerService$20;
-Lcom/android/server/am/ActivityManagerService$21;
-Lcom/android/server/am/ActivityManagerService$22;
-Lcom/android/server/am/ActivityManagerService$24;
-Lcom/android/server/am/ActivityManagerService$3;
-Lcom/android/server/am/ActivityManagerService$30;
-Lcom/android/server/am/ActivityManagerService$4;
-Lcom/android/server/am/ActivityManagerService$5;
-Lcom/android/server/am/ActivityManagerService$6;
-Lcom/android/server/am/ActivityManagerService$AppDeathRecipient;
-Lcom/android/server/am/ActivityManagerService$AppTaskImpl;
-Lcom/android/server/am/ActivityManagerService$CpuBinder;
-Lcom/android/server/am/ActivityManagerService$DbBinder;
-Lcom/android/server/am/ActivityManagerService$FontScaleSettingObserver;
-Lcom/android/server/am/ActivityManagerService$ForegroundToken;
-Lcom/android/server/am/ActivityManagerService$GrantUri;
-Lcom/android/server/am/ActivityManagerService$GraphicsBinder;
-Lcom/android/server/am/ActivityManagerService$Identity;
-Lcom/android/server/am/ActivityManagerService$IntentFirewallInterface;
-Lcom/android/server/am/ActivityManagerService$KillHandler;
-Lcom/android/server/am/ActivityManagerService$Lifecycle;
-Lcom/android/server/am/ActivityManagerService$LocalService;
-Lcom/android/server/am/ActivityManagerService$MainHandler;
-Lcom/android/server/am/ActivityManagerService$MemBinder;
-Lcom/android/server/am/ActivityManagerService$PendingAssistExtras;
-Lcom/android/server/am/ActivityManagerService$PermissionController;
-Lcom/android/server/am/ActivityManagerService$PriorityState;
-Lcom/android/server/am/ActivityManagerService$ProcessChangeItem;
-Lcom/android/server/am/ActivityManagerService$ProcessInfoService;
-Lcom/android/server/am/ActivityManagerService$SleepTokenImpl;
-Lcom/android/server/am/ActivityManagerService$UidObserverRegistration;
-Lcom/android/server/am/ActivityManagerService$UiHandler;
-Lcom/android/server/am/ActivityManagerService$UpdateConfigurationResult;
-Lcom/android/server/am/ActivityMetricsLogger;
-Lcom/android/server/am/ActivityRecord;
-Lcom/android/server/am/ActivityRecord$Token;
-Lcom/android/server/am/ActivityResult;
-Lcom/android/server/am/ActivityStack;
-Lcom/android/server/am/ActivityStack$ActivityStackHandler;
-Lcom/android/server/am/ActivityStack$ActivityState;
-Lcom/android/server/am/ActivityStackSupervisor;
-Lcom/android/server/am/ActivityStackSupervisor$ActivityContainer;
-Lcom/android/server/am/ActivityStackSupervisor$ActivityDisplay;
-Lcom/android/server/am/ActivityStackSupervisor$ActivityStackSupervisorHandler;
-Lcom/android/server/am/ActivityStackSupervisor$FindTaskResult;
-Lcom/android/server/am/ActivityStarter;
-Lcom/android/server/am/ActivityStartInterceptor;
-Lcom/android/server/am/AppBindRecord;
-Lcom/android/server/am/AppErrors;
-Lcom/android/server/am/BatteryStatsService;
-Lcom/android/server/am/BatteryStatsService$1;
-Lcom/android/server/am/BatteryStatsService$BatteryStatsHandler;
-Lcom/android/server/am/BatteryStatsService$WakeupReasonThread;
-Lcom/android/server/am/BroadcastFilter;
-Lcom/android/server/am/BroadcastQueue;
-Lcom/android/server/am/BroadcastQueue$AppNotResponding;
-Lcom/android/server/am/BroadcastQueue$BroadcastHandler;
-Lcom/android/server/am/BroadcastRecord;
-Lcom/android/server/am/BroadcastStats;
-Lcom/android/server/am/BroadcastStats$1;
-Lcom/android/server/am/BroadcastStats$ActionEntry;
-Lcom/android/server/am/BroadcastStats$PackageEntry;
-Lcom/android/server/am/CompatModePackages;
-Lcom/android/server/am/CompatModePackages$CompatHandler;
-Lcom/android/server/am/ConfigurationContainer;
-Lcom/android/server/am/ConnectionRecord;
-Lcom/android/server/am/ContentProviderConnection;
-Lcom/android/server/am/ContentProviderRecord;
-Lcom/android/server/am/CoreSettingsObserver;
-Lcom/android/server/am/DumpHeapProvider;
-Lcom/android/server/am/EventLogTags;
-Lcom/android/server/am/InstrumentationReporter;
-Lcom/android/server/am/IntentBindRecord;
-Lcom/android/server/am/KeyguardController;
-Lcom/android/server/am/NativeCrashListener;
-Lcom/android/server/am/PendingIntentRecord;
-Lcom/android/server/am/PendingIntentRecord$Key;
-Lcom/android/server/am/ProcessList;
-Lcom/android/server/am/ProcessRecord;
-Lcom/android/server/am/ProcessStatsService;
-Lcom/android/server/am/ProcessStatsService$1;
-Lcom/android/server/am/ProcessStatsService$2;
-Lcom/android/server/am/ProcessStatsService$3;
-Lcom/android/server/am/ProviderMap;
-Lcom/android/server/am/ReceiverList;
-Lcom/android/server/am/RecentTasks;
-Lcom/android/server/am/RecentTasks$1;
-Lcom/android/server/am/ServiceRecord;
-Lcom/android/server/am/ServiceRecord$1;
-Lcom/android/server/am/ServiceRecord$2;
-Lcom/android/server/am/ServiceRecord$3;
-Lcom/android/server/am/ServiceRecord$StartItem;
-Lcom/android/server/am/TaskChangeNotificationController;
-Lcom/android/server/am/TaskChangeNotificationController$MainHandler;
-Lcom/android/server/am/TaskChangeNotificationController$TaskStackConsumer;
-Lcom/android/server/am/TaskPersister;
-Lcom/android/server/am/TaskPersister$1;
-Lcom/android/server/am/TaskPersister$ImageWriteQueueItem;
-Lcom/android/server/am/TaskPersister$LazyTaskWriterThread;
-Lcom/android/server/am/TaskPersister$TaskWriteQueueItem;
-Lcom/android/server/am/TaskPersister$WriteQueueItem;
-Lcom/android/server/am/TaskRecord;
-Lcom/android/server/am/UidRecord;
-Lcom/android/server/am/UidRecord$ChangeItem;
-Lcom/android/server/am/UriPermission;
-Lcom/android/server/am/UriPermissionOwner;
-Lcom/android/server/am/UriPermissionOwner$ExternalToken;
-Lcom/android/server/am/UserController;
-Lcom/android/server/am/UserController$Injector;
-Lcom/android/server/am/UserState;
-Lcom/android/server/AnyMotionDetector;
-Lcom/android/server/AnyMotionDetector$1;
-Lcom/android/server/AnyMotionDetector$2;
-Lcom/android/server/AnyMotionDetector$3;
-Lcom/android/server/AnyMotionDetector$4;
-Lcom/android/server/AnyMotionDetector$DeviceIdleCallback;
-Lcom/android/server/AnyMotionDetector$RunningSignalStats;
-Lcom/android/server/AnyMotionDetector$Vector3;
-Lcom/android/server/AppOpsService;
-Lcom/android/server/AppOpsService$1;
-Lcom/android/server/AppOpsService$1$1;
-Lcom/android/server/AppOpsService$2;
-Lcom/android/server/AppOpsService$3;
-Lcom/android/server/AppOpsService$Callback;
-Lcom/android/server/AppOpsService$ClientRestrictionState;
-Lcom/android/server/AppOpsService$ClientState;
-Lcom/android/server/AppOpsService$Op;
-Lcom/android/server/AppOpsService$Ops;
-Lcom/android/server/AppOpsService$Restriction;
-Lcom/android/server/AppOpsService$UidState;
-Lcom/android/server/appwidget/AppWidgetService;
-Lcom/android/server/appwidget/AppWidgetServiceImpl;
-Lcom/android/server/appwidget/AppWidgetServiceImpl$1;
-Lcom/android/server/appwidget/AppWidgetServiceImpl$BackupRestoreController;
-Lcom/android/server/appwidget/AppWidgetServiceImpl$CallbackHandler;
-Lcom/android/server/appwidget/AppWidgetServiceImpl$Host;
-Lcom/android/server/appwidget/AppWidgetServiceImpl$HostId;
-Lcom/android/server/appwidget/AppWidgetServiceImpl$LoadedWidgetState;
-Lcom/android/server/appwidget/AppWidgetServiceImpl$Provider;
-Lcom/android/server/appwidget/AppWidgetServiceImpl$ProviderId;
-Lcom/android/server/appwidget/AppWidgetServiceImpl$SaveStateRunnable;
-Lcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;
-Lcom/android/server/appwidget/AppWidgetServiceImpl$Widget;
-Lcom/android/server/AppWidgetBackupBridge;
-Lcom/android/server/AttributeCache;
-Lcom/android/server/AttributeCache$Entry;
-Lcom/android/server/AttributeCache$Package;
-Lcom/android/server/audio/AudioService;
-Lcom/android/server/audio/AudioService$1;
-Lcom/android/server/audio/AudioService$2;
-Lcom/android/server/audio/AudioService$3;
-Lcom/android/server/audio/AudioService$4;
-Lcom/android/server/audio/AudioService$AudioHandler;
-Lcom/android/server/audio/AudioService$AudioServiceBroadcastReceiver;
-Lcom/android/server/audio/AudioService$AudioServiceInternal;
-Lcom/android/server/audio/AudioService$AudioServiceUserRestrictionsListener;
-Lcom/android/server/audio/AudioService$AudioSystemThread;
-Lcom/android/server/audio/AudioService$ForceControlStreamClient;
-Lcom/android/server/audio/AudioService$Lifecycle;
-Lcom/android/server/audio/AudioService$MyDisplayStatusCallback;
-Lcom/android/server/audio/AudioService$SetModeDeathHandler;
-Lcom/android/server/audio/AudioService$SettingsObserver;
-Lcom/android/server/audio/AudioService$SoundPoolCallback;
-Lcom/android/server/audio/AudioService$SoundPoolListenerThread;
-Lcom/android/server/audio/AudioService$VolumeController;
-Lcom/android/server/audio/AudioService$VolumeStreamState;
-Lcom/android/server/audio/FocusRequester;
-Lcom/android/server/audio/MediaFocusControl;
-Lcom/android/server/audio/MediaFocusControl$AudioFocusDeathHandler;
-Lcom/android/server/audio/PlaybackActivityMonitor;
-Lcom/android/server/audio/PlaybackActivityMonitor$PlayMonitorClient;
-Lcom/android/server/audio/RecordingActivityMonitor;
-Lcom/android/server/audio/RecordingActivityMonitor$RecMonitorClient;
-Lcom/android/server/autofill/AutoFillManagerService;
-Lcom/android/server/autofill/AutoFillManagerService$1;
-Lcom/android/server/autofill/AutoFillManagerService$AutoFillManagerServiceStub;
-Lcom/android/server/autofill/AutoFillManagerServiceImpl;
-Lcom/android/server/autofill/AutoFillManagerService$SettingsObserver;
-Lcom/android/server/BackgroundDexOptJobService;
-Lcom/android/server/BackgroundDexOptJobService$1;
-Lcom/android/server/backup/AccountSyncSettingsBackupHelper;
-Lcom/android/server/backup/BackupManagerService;
-Lcom/android/server/backup/BackupManagerService$1;
-Lcom/android/server/backup/BackupManagerService$2;
-Lcom/android/server/backup/BackupManagerService$3;
-Lcom/android/server/backup/BackupManagerService$4;
-Lcom/android/server/backup/BackupManagerService$6;
-Lcom/android/server/backup/BackupManagerService$BackupHandler;
-Lcom/android/server/backup/BackupManagerService$BackupRequest;
-Lcom/android/server/backup/BackupManagerService$FullBackupEntry;
-Lcom/android/server/backup/BackupManagerService$Lifecycle;
-Lcom/android/server/backup/BackupManagerService$ProvisionedObserver;
-Lcom/android/server/backup/BackupManagerService$RunBackupReceiver;
-Lcom/android/server/backup/BackupManagerService$RunInitializeReceiver;
-Lcom/android/server/backup/FullBackupJob;
-Lcom/android/server/backup/KeyValueBackupJob;
-Lcom/android/server/backup/PackageManagerBackupAgent;
-Lcom/android/server/backup/Trampoline;
-Lcom/android/server/backup/TransportManager;
-Lcom/android/server/backup/TransportManager$TransportBoundListener;
-Lcom/android/server/backup/TransportManager$TransportConnection;
-Lcom/android/server/BatteryService;
-Lcom/android/server/BatteryService$2;
-Lcom/android/server/BatteryService$9;
-Lcom/android/server/BatteryService$BatteryListener;
-Lcom/android/server/BatteryService$BinderService;
-Lcom/android/server/BatteryService$Led;
-Lcom/android/server/BatteryService$LocalService;
-Lcom/android/server/BluetoothManagerService;
-Lcom/android/server/BluetoothManagerService$1;
-Lcom/android/server/BluetoothManagerService$2;
-Lcom/android/server/BluetoothManagerService$3;
-Lcom/android/server/BluetoothManagerService$4;
-Lcom/android/server/BluetoothManagerService$ActiveLog;
-Lcom/android/server/BluetoothManagerService$BluetoothHandler;
-Lcom/android/server/BluetoothManagerService$BluetoothServiceConnection;
-Lcom/android/server/BluetoothManagerService$ProfileServiceConnections;
-Lcom/android/server/BluetoothService;
-Lcom/android/server/BootReceiver;
-Lcom/android/server/BootReceiver$1;
-Lcom/android/server/camera/CameraService;
-Lcom/android/server/camera/CameraService$1;
-Lcom/android/server/camera/CameraService$2;
-Lcom/android/server/CertBlacklister;
-Lcom/android/server/CertBlacklister$BlacklistObserver;
-Lcom/android/server/clipboard/ClipboardService;
-Lcom/android/server/clipboard/ClipboardService$ClipboardImpl;
-Lcom/android/server/clipboard/ClipboardService$ListenerInfo;
-Lcom/android/server/clipboard/ClipboardService$PerUserClipboard;
-Lcom/android/server/CommonTimeManagementService;
-Lcom/android/server/CommonTimeManagementService$1;
-Lcom/android/server/CommonTimeManagementService$2;
-Lcom/android/server/CommonTimeManagementService$3;
-Lcom/android/server/CommonTimeManagementService$4;
-Lcom/android/server/CommonTimeManagementService$5;
-Lcom/android/server/CommonTimeManagementService$InterfaceScoreRule;
-Lcom/android/server/connectivity/DataConnectionStats;
-Lcom/android/server/connectivity/DataConnectionStats$1;
-Lcom/android/server/connectivity/IpConnectivityMetrics;
-Lcom/android/server/connectivity/IpConnectivityMetrics$Impl;
-Lcom/android/server/connectivity/KeepalivePacketData;
-Lcom/android/server/connectivity/KeepalivePacketData$InvalidPacketException;
-Lcom/android/server/connectivity/KeepaliveTracker;
-Lcom/android/server/connectivity/LingerMonitor;
-Lcom/android/server/connectivity/MetricsLoggerService;
-Lcom/android/server/connectivity/MetricsLoggerService$MetricsLoggerImpl;
-Lcom/android/server/connectivity/MockableSystemProperties;
-Lcom/android/server/connectivity/Nat464Xlat;
-Lcom/android/server/connectivity/NetdEventListenerService;
-Lcom/android/server/connectivity/NetdEventListenerService$1;
-Lcom/android/server/connectivity/NetdEventListenerService$DnsEventBatch;
-Lcom/android/server/connectivity/NetworkAgentInfo;
-Lcom/android/server/connectivity/NetworkAgentInfo$LingerTimer;
-Lcom/android/server/connectivity/NetworkMonitor;
-Lcom/android/server/connectivity/NetworkMonitor$1ProbeThread;
-Lcom/android/server/connectivity/NetworkMonitor$CaptivePortalProbeResult;
-Lcom/android/server/connectivity/NetworkMonitor$CaptivePortalState;
-Lcom/android/server/connectivity/NetworkMonitor$DefaultState;
-Lcom/android/server/connectivity/NetworkMonitor$EvaluatingState;
-Lcom/android/server/connectivity/NetworkMonitor$EvaluationResult;
-Lcom/android/server/connectivity/NetworkMonitor$MaybeNotifyState;
-Lcom/android/server/connectivity/NetworkMonitor$ValidatedState;
-Lcom/android/server/connectivity/NetworkMonitor$ValidationStage;
-Lcom/android/server/connectivity/NetworkNotificationManager;
-Lcom/android/server/connectivity/PacManager;
-Lcom/android/server/connectivity/PacManager$1;
-Lcom/android/server/connectivity/PacManager$PacRefreshIntentReceiver;
-Lcom/android/server/connectivity/PermissionMonitor;
-Lcom/android/server/connectivity/PermissionMonitor$1;
-Lcom/android/server/ConnectivityService;
-Lcom/android/server/ConnectivityService$1;
-Lcom/android/server/ConnectivityService$2;
-Lcom/android/server/ConnectivityService$3;
-Lcom/android/server/ConnectivityService$InternalHandler;
-Lcom/android/server/ConnectivityService$LegacyTypeTracker;
-Lcom/android/server/ConnectivityService$NetworkFactoryInfo;
-Lcom/android/server/ConnectivityService$NetworkRequestInfo;
-Lcom/android/server/ConnectivityService$NetworkStateTrackerHandler;
-Lcom/android/server/ConnectivityService$ReapUnvalidatedNetworks;
-Lcom/android/server/ConnectivityService$SettingsObserver;
-Lcom/android/server/ConnectivityService$UnneededFor;
-Lcom/android/server/ConnectivityService$ValidationLog;
-Lcom/android/server/connectivity/Tethering;
-Lcom/android/server/connectivity/tethering/IControlsTethering;
-Lcom/android/server/connectivity/tethering/IPv6TetheringCoordinator;
-Lcom/android/server/connectivity/tethering/IPv6TetheringInterfaceServices;
-Lcom/android/server/connectivity/Tethering$StateReceiver;
-Lcom/android/server/connectivity/tethering/TetheringConfiguration;
-Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;
-Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine$InitialState;
-Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine$TetheredState;
-Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine$UnavailableState;
-Lcom/android/server/connectivity/Tethering$TetherMasterSM;
-Lcom/android/server/connectivity/Tethering$TetherMasterSM$ErrorState;
-Lcom/android/server/connectivity/Tethering$TetherMasterSM$InitialState;
-Lcom/android/server/connectivity/Tethering$TetherMasterSM$SetDnsForwardersErrorState;
-Lcom/android/server/connectivity/Tethering$TetherMasterSM$SetIpForwardingDisabledErrorState;
-Lcom/android/server/connectivity/Tethering$TetherMasterSM$SetIpForwardingEnabledErrorState;
-Lcom/android/server/connectivity/Tethering$TetherMasterSM$SimChangeListener;
-Lcom/android/server/connectivity/Tethering$TetherMasterSM$StartTetheringErrorState;
-Lcom/android/server/connectivity/Tethering$TetherMasterSM$StopTetheringErrorState;
-Lcom/android/server/connectivity/Tethering$TetherMasterSM$TetherMasterUtilState;
-Lcom/android/server/connectivity/Tethering$TetherMasterSM$TetherModeAliveState;
-Lcom/android/server/connectivity/Tethering$TetherState;
-Lcom/android/server/connectivity/tethering/UpstreamNetworkMonitor;
-Lcom/android/server/connectivity/Vpn;
-Lcom/android/server/connectivity/Vpn$1;
-Lcom/android/server/connectivity/Vpn$2;
-Lcom/android/server/ConsumerIrService;
-Lcom/android/server/content/ContentService;
-Lcom/android/server/content/ContentService$1;
-Lcom/android/server/content/ContentService$3;
-Lcom/android/server/content/ContentService$Lifecycle;
-Lcom/android/server/content/ContentService$ObserverCall;
-Lcom/android/server/content/ContentService$ObserverNode;
-Lcom/android/server/content/ContentService$ObserverNode$ObserverEntry;
-Lcom/android/server/content/SyncJobService;
-Lcom/android/server/content/SyncManager;
-Lcom/android/server/content/SyncManager$1;
-Lcom/android/server/content/SyncManager$10;
-Lcom/android/server/content/SyncManager$11;
-Lcom/android/server/content/SyncManager$13;
-Lcom/android/server/content/SyncManager$2;
-Lcom/android/server/content/SyncManager$3;
-Lcom/android/server/content/SyncManager$4;
-Lcom/android/server/content/SyncManager$5;
-Lcom/android/server/content/SyncManager$6;
-Lcom/android/server/content/SyncManager$7;
-Lcom/android/server/content/SyncManager$8;
-Lcom/android/server/content/SyncManager$9;
-Lcom/android/server/content/SyncManager$ActiveSyncContext;
-Lcom/android/server/content/SyncManager$ScheduleSyncMessagePayload;
-Lcom/android/server/content/SyncManager$ServiceConnectionData;
-Lcom/android/server/content/SyncManager$SyncFinishedOrCancelledMessagePayload;
-Lcom/android/server/content/SyncManager$SyncHandler;
-Lcom/android/server/content/SyncManager$SyncTimeTracker;
-Lcom/android/server/content/SyncManager$UpdatePeriodicSyncMessagePayload;
-Lcom/android/server/content/SyncOperation;
-Lcom/android/server/content/SyncStorageEngine;
-Lcom/android/server/content/SyncStorageEngine$AccountInfo;
-Lcom/android/server/content/SyncStorageEngine$AuthorityInfo;
-Lcom/android/server/content/SyncStorageEngine$DayStats;
-Lcom/android/server/content/SyncStorageEngine$EndPoint;
-Lcom/android/server/content/SyncStorageEngine$OnAuthorityRemovedListener;
-Lcom/android/server/content/SyncStorageEngine$OnSyncRequestListener;
-Lcom/android/server/content/SyncStorageEngine$PeriodicSyncAddedListener;
-Lcom/android/server/content/SyncStorageEngine$SyncHistoryItem;
-Lcom/android/server/ContextHubSystemService;
-Lcom/android/server/CountryDetectorService;
-Lcom/android/server/CountryDetectorService$1;
-Lcom/android/server/CountryDetectorService$1$1;
-Lcom/android/server/CountryDetectorService$2;
-Lcom/android/server/CountryDetectorService$Receiver;
-Lcom/android/server/coverage/CoverageService;
-Lcom/android/server/DeviceIdleController;
-Lcom/android/server/DeviceIdleController$1;
-Lcom/android/server/DeviceIdleController$2;
-Lcom/android/server/DeviceIdleController$3;
-Lcom/android/server/DeviceIdleController$4;
-Lcom/android/server/DeviceIdleController$5;
-Lcom/android/server/DeviceIdleController$6;
-Lcom/android/server/DeviceIdleController$7;
-Lcom/android/server/DeviceIdleController$8;
-Lcom/android/server/DeviceIdleController$BinderService;
-Lcom/android/server/DeviceIdleController$Constants;
-Lcom/android/server/DeviceIdleController$LocalService;
-Lcom/android/server/DeviceIdleController$MotionListener;
-Lcom/android/server/DeviceIdleController$MyHandler;
-Lcom/android/server/devicepolicy/DevicePolicyManagerService;
-Lcom/android/server/devicepolicy/DevicePolicyManagerService$1;
-Lcom/android/server/devicepolicy/DevicePolicyManagerService$2;
-Lcom/android/server/devicepolicy/DevicePolicyManagerService$3;
-Lcom/android/server/devicepolicy/DevicePolicyManagerService$4;
-Lcom/android/server/devicepolicy/DevicePolicyManagerService$4$1;
-Lcom/android/server/devicepolicy/DevicePolicyManagerService$9;
-Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;
-Lcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;
-Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;
-Lcom/android/server/devicepolicy/DevicePolicyManagerService$Lifecycle;
-Lcom/android/server/devicepolicy/DevicePolicyManagerService$LocalService;
-Lcom/android/server/devicepolicy/DevicePolicyManagerService$MonitoringCertNotificationTask;
-Lcom/android/server/devicepolicy/DevicePolicyManagerService$SetupContentObserver;
-Lcom/android/server/devicepolicy/Owners;
-Lcom/android/server/devicepolicy/Owners$DeviceOwnerReadWriter;
-Lcom/android/server/devicepolicy/Owners$FileReadWriter;
-Lcom/android/server/devicepolicy/Owners$OwnerInfo;
-Lcom/android/server/devicepolicy/Owners$ProfileOwnerReadWriter;
-Lcom/android/server/devicepolicy/SecurityLogMonitor;
-Lcom/android/server/DiskStatsService;
-Lcom/android/server/display/AutomaticBrightnessController;
-Lcom/android/server/display/AutomaticBrightnessController$1;
-Lcom/android/server/display/AutomaticBrightnessController$2;
-Lcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;
-Lcom/android/server/display/AutomaticBrightnessController$AutomaticBrightnessHandler;
-Lcom/android/server/display/AutomaticBrightnessController$Callbacks;
-Lcom/android/server/display/ColorFade;
-Lcom/android/server/display/ColorFade$NaturalSurfaceLayout;
-Lcom/android/server/display/DisplayAdapter;
-Lcom/android/server/display/DisplayAdapter$1;
-Lcom/android/server/display/DisplayAdapter$2;
-Lcom/android/server/display/DisplayAdapter$Listener;
-Lcom/android/server/display/DisplayBlanker;
-Lcom/android/server/display/DisplayDevice;
-Lcom/android/server/display/DisplayDeviceInfo;
-Lcom/android/server/display/DisplayManagerService;
-Lcom/android/server/display/DisplayManagerService$BinderService;
-Lcom/android/server/display/DisplayManagerService$CallbackRecord;
-Lcom/android/server/display/DisplayManagerService$DisplayAdapterListener;
-Lcom/android/server/display/DisplayManagerService$DisplayManagerHandler;
-Lcom/android/server/display/DisplayManagerService$LocalService;
-Lcom/android/server/display/DisplayManagerService$LocalService$1;
-Lcom/android/server/display/DisplayManagerService$SyncRoot;
-Lcom/android/server/display/DisplayPowerController;
-Lcom/android/server/display/DisplayPowerController$1;
-Lcom/android/server/display/DisplayPowerController$2;
-Lcom/android/server/display/DisplayPowerController$3;
-Lcom/android/server/display/DisplayPowerController$4;
-Lcom/android/server/display/DisplayPowerController$5;
-Lcom/android/server/display/DisplayPowerController$6;
-Lcom/android/server/display/DisplayPowerController$7;
-Lcom/android/server/display/DisplayPowerController$DisplayControllerHandler;
-Lcom/android/server/display/DisplayPowerController$ScreenOnUnblocker;
-Lcom/android/server/display/DisplayPowerState;
-Lcom/android/server/display/DisplayPowerState$1;
-Lcom/android/server/display/DisplayPowerState$2;
-Lcom/android/server/display/DisplayPowerState$3;
-Lcom/android/server/display/DisplayPowerState$4;
-Lcom/android/server/display/DisplayPowerState$PhotonicModulator;
-Lcom/android/server/display/DisplayTransformManager;
-Lcom/android/server/display/HysteresisLevels;
-Lcom/android/server/display/LocalDisplayAdapter;
-Lcom/android/server/display/LocalDisplayAdapter$DisplayModeRecord;
-Lcom/android/server/display/LocalDisplayAdapter$HotplugDisplayEventReceiver;
-Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;
-Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice$1;
-Lcom/android/server/display/LogicalDisplay;
-Lcom/android/server/display/NightDisplayService;
-Lcom/android/server/display/NightDisplayService$1;
-Lcom/android/server/display/NightDisplayService$3;
-Lcom/android/server/display/NightDisplayService$4;
-Lcom/android/server/display/NightDisplayService$ColorMatrixEvaluator;
-Lcom/android/server/display/OverlayDisplayAdapter;
-Lcom/android/server/display/OverlayDisplayAdapter$1;
-Lcom/android/server/display/OverlayDisplayAdapter$1$1;
-Lcom/android/server/display/PersistentDataStore;
-Lcom/android/server/display/PersistentDataStore$DisplayState;
-Lcom/android/server/display/RampAnimator;
-Lcom/android/server/display/RampAnimator$1;
-Lcom/android/server/display/RampAnimator$Listener;
-Lcom/android/server/DisplayThread;
-Lcom/android/server/display/VirtualDisplayAdapter;
-Lcom/android/server/DockObserver;
-Lcom/android/server/DockObserver$1;
-Lcom/android/server/DockObserver$2;
-Lcom/android/server/DockObserver$BinderService;
-Lcom/android/server/dreams/DreamController;
-Lcom/android/server/dreams/DreamController$1;
-Lcom/android/server/dreams/DreamController$2;
-Lcom/android/server/dreams/DreamController$3;
-Lcom/android/server/dreams/DreamController$DreamRecord;
-Lcom/android/server/dreams/DreamController$DreamRecord$1;
-Lcom/android/server/dreams/DreamController$DreamRecord$3;
-Lcom/android/server/dreams/DreamController$Listener;
-Lcom/android/server/dreams/DreamManagerService;
-Lcom/android/server/dreams/DreamManagerService$1;
-Lcom/android/server/dreams/DreamManagerService$2;
-Lcom/android/server/dreams/DreamManagerService$3;
-Lcom/android/server/dreams/DreamManagerService$4;
-Lcom/android/server/dreams/DreamManagerService$6;
-Lcom/android/server/dreams/DreamManagerService$BinderService;
-Lcom/android/server/dreams/DreamManagerService$DreamHandler;
-Lcom/android/server/dreams/DreamManagerService$LocalService;
-Lcom/android/server/DropBoxManagerService;
-Lcom/android/server/DropBoxManagerService$1;
-Lcom/android/server/DropBoxManagerService$1$1;
-Lcom/android/server/DropBoxManagerService$2;
-Lcom/android/server/DropBoxManagerService$3;
-Lcom/android/server/DropBoxManagerService$4;
-Lcom/android/server/DropBoxManagerService$EntryFile;
-Lcom/android/server/DropBoxManagerService$FileList;
-Lcom/android/server/emergency/EmergencyAffordanceService;
-Lcom/android/server/emergency/EmergencyAffordanceService$1;
-Lcom/android/server/emergency/EmergencyAffordanceService$2;
-Lcom/android/server/emergency/EmergencyAffordanceService$3;
-Lcom/android/server/emergency/EmergencyAffordanceService$MyHandler;
-Lcom/android/server/EntropyMixer;
-Lcom/android/server/EntropyMixer$1;
-Lcom/android/server/EntropyMixer$2;
-Lcom/android/server/ethernet/EthernetConfigStore;
-Lcom/android/server/ethernet/EthernetNetworkFactory;
-Lcom/android/server/ethernet/EthernetNetworkFactory$InterfaceObserver;
-Lcom/android/server/ethernet/EthernetNetworkFactory$LocalNetworkFactory;
-Lcom/android/server/ethernet/EthernetService;
-Lcom/android/server/ethernet/EthernetServiceImpl;
-Lcom/android/server/EventLogTags;
-Lcom/android/server/FgThread;
-Lcom/android/server/fingerprint/FingerprintService;
-Lcom/android/server/fingerprint/FingerprintService$1;
-Lcom/android/server/fingerprint/FingerprintService$10;
-Lcom/android/server/fingerprint/FingerprintService$2;
-Lcom/android/server/fingerprint/FingerprintService$3;
-Lcom/android/server/fingerprint/FingerprintService$4;
-Lcom/android/server/fingerprint/FingerprintService$5;
-Lcom/android/server/fingerprint/FingerprintService$FingerprintServiceLockoutResetMonitor;
-Lcom/android/server/fingerprint/FingerprintService$FingerprintServiceLockoutResetMonitor$1;
-Lcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper;
-Lcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper$9;
-Lcom/android/server/fingerprint/FingerprintService$PerformanceStats;
-Lcom/android/server/fingerprint/FingerprintsUserState;
-Lcom/android/server/fingerprint/FingerprintsUserState$1;
-Lcom/android/server/fingerprint/FingerprintUtils;
-Lcom/android/server/firewall/AndFilter;
-Lcom/android/server/firewall/AndFilter$1;
-Lcom/android/server/firewall/CategoryFilter;
-Lcom/android/server/firewall/CategoryFilter$1;
-Lcom/android/server/firewall/Filter;
-Lcom/android/server/firewall/FilterFactory;
-Lcom/android/server/firewall/FilterList;
-Lcom/android/server/firewall/IntentFirewall;
-Lcom/android/server/firewall/IntentFirewall$AMSInterface;
-Lcom/android/server/firewall/IntentFirewall$FirewallHandler;
-Lcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;
-Lcom/android/server/firewall/IntentFirewall$Rule;
-Lcom/android/server/firewall/IntentFirewall$RuleObserver;
-Lcom/android/server/firewall/NotFilter;
-Lcom/android/server/firewall/NotFilter$1;
-Lcom/android/server/firewall/OrFilter;
-Lcom/android/server/firewall/OrFilter$1;
-Lcom/android/server/firewall/PortFilter;
-Lcom/android/server/firewall/PortFilter$1;
-Lcom/android/server/firewall/SenderFilter;
-Lcom/android/server/firewall/SenderFilter$1;
-Lcom/android/server/firewall/SenderFilter$2;
-Lcom/android/server/firewall/SenderFilter$3;
-Lcom/android/server/firewall/SenderFilter$4;
-Lcom/android/server/firewall/SenderFilter$5;
-Lcom/android/server/firewall/SenderPackageFilter;
-Lcom/android/server/firewall/SenderPackageFilter$1;
-Lcom/android/server/firewall/SenderPermissionFilter;
-Lcom/android/server/firewall/SenderPermissionFilter$1;
-Lcom/android/server/firewall/StringFilter;
-Lcom/android/server/firewall/StringFilter$1;
-Lcom/android/server/firewall/StringFilter$10;
-Lcom/android/server/firewall/StringFilter$2;
-Lcom/android/server/firewall/StringFilter$3;
-Lcom/android/server/firewall/StringFilter$4;
-Lcom/android/server/firewall/StringFilter$5;
-Lcom/android/server/firewall/StringFilter$6;
-Lcom/android/server/firewall/StringFilter$7;
-Lcom/android/server/firewall/StringFilter$8;
-Lcom/android/server/firewall/StringFilter$9;
-Lcom/android/server/firewall/StringFilter$ValueProvider;
-Lcom/android/server/GestureLauncherService;
-Lcom/android/server/GestureLauncherService$1;
-Lcom/android/server/GestureLauncherService$2;
-Lcom/android/server/GestureLauncherService$GestureEventListener;
-Lcom/android/server/GraphicsStatsService;
-Lcom/android/server/GraphicsStatsService$ActiveBuffer;
-Lcom/android/server/GraphicsStatsService$HistoricalData;
-Lcom/android/server/HardwarePropertiesManagerService;
-Lcom/android/server/hdmi/HdmiCecController;
-Lcom/android/server/INativeDaemonConnectorCallbacks;
-Lcom/android/server/input/InputApplicationHandle;
-Lcom/android/server/input/InputManagerService;
-Lcom/android/server/input/InputManagerService$1;
-Lcom/android/server/input/InputManagerService$10;
-Lcom/android/server/input/InputManagerService$11;
-Lcom/android/server/input/InputManagerService$12;
-Lcom/android/server/input/InputManagerService$2;
-Lcom/android/server/input/InputManagerService$3;
-Lcom/android/server/input/InputManagerService$5;
-Lcom/android/server/input/InputManagerService$InputDevicesChangedListenerRecord;
-Lcom/android/server/input/InputManagerService$InputManagerHandler;
-Lcom/android/server/input/InputManagerService$KeyboardLayoutDescriptor;
-Lcom/android/server/input/InputManagerService$KeyboardLayoutVisitor;
-Lcom/android/server/input/InputManagerService$LocalService;
-Lcom/android/server/input/InputManagerService$WindowManagerCallbacks;
-Lcom/android/server/input/InputManagerService$WiredAccessoryCallbacks;
-Lcom/android/server/input/InputWindowHandle;
-Lcom/android/server/InputMethodManagerService;
-Lcom/android/server/InputMethodManagerService$1;
-Lcom/android/server/InputMethodManagerService$2;
-Lcom/android/server/InputMethodManagerService$ClientState;
-Lcom/android/server/InputMethodManagerService$HardKeyboardListener;
-Lcom/android/server/InputMethodManagerService$ImmsBroadcastReceiver;
-Lcom/android/server/InputMethodManagerService$InputMethodFileManager;
-Lcom/android/server/InputMethodManagerService$Lifecycle;
-Lcom/android/server/InputMethodManagerService$LocalServiceImpl;
-Lcom/android/server/InputMethodManagerService$MethodCallback;
-Lcom/android/server/InputMethodManagerService$MyPackageMonitor;
-Lcom/android/server/InputMethodManagerService$SessionState;
-Lcom/android/server/InputMethodManagerService$SettingsObserver;
-Lcom/android/server/input/PersistentDataStore;
-Lcom/android/server/input/PersistentDataStore$InputDeviceState;
-Lcom/android/server/IntentResolver;
-Lcom/android/server/IntentResolver$1;
-Lcom/android/server/IntentResolver$IteratorWrapper;
-Lcom/android/server/IoThread;
-Lcom/android/server/job/controllers/AppIdleController;
-Lcom/android/server/job/controllers/AppIdleController$AppIdleStateChangeListener;
-Lcom/android/server/job/controllers/AppIdleController$GlobalUpdateFunc;
-Lcom/android/server/job/controllers/AppIdleController$PackageUpdateFunc;
-Lcom/android/server/job/controllers/BatteryController;
-Lcom/android/server/job/controllers/BatteryController$ChargingTracker;
-Lcom/android/server/job/controllers/ConnectivityController;
-Lcom/android/server/job/controllers/ConnectivityController$1;
-Lcom/android/server/job/controllers/ConnectivityController$2;
-Lcom/android/server/job/controllers/ContentObserverController;
-Lcom/android/server/job/controllers/ContentObserverController$JobInstance;
-Lcom/android/server/job/controllers/ContentObserverController$ObserverInstance;
-Lcom/android/server/job/controllers/ContentObserverController$TriggerRunnable;
-Lcom/android/server/job/controllers/DeviceIdleJobsController;
-Lcom/android/server/job/controllers/DeviceIdleJobsController$1;
-Lcom/android/server/job/controllers/DeviceIdleJobsController$2;
-Lcom/android/server/job/controllers/IdleController;
-Lcom/android/server/job/controllers/IdleController$IdlenessTracker;
-Lcom/android/server/job/controllers/JobStatus;
-Lcom/android/server/job/controllers/StateController;
-Lcom/android/server/job/controllers/TimeController;
-Lcom/android/server/job/controllers/TimeController$1;
-Lcom/android/server/job/controllers/TimeController$2;
-Lcom/android/server/job/JobCompletedListener;
-Lcom/android/server/job/JobPackageTracker;
-Lcom/android/server/job/JobPackageTracker$DataSet;
-Lcom/android/server/job/JobPackageTracker$PackageEntry;
-Lcom/android/server/job/JobSchedulerInternal;
-Lcom/android/server/job/JobSchedulerService;
-Lcom/android/server/job/JobSchedulerService$1;
-Lcom/android/server/job/JobSchedulerService$2;
-Lcom/android/server/job/JobSchedulerService$3;
-Lcom/android/server/job/JobSchedulerService$Constants;
-Lcom/android/server/job/JobSchedulerService$JobHandler;
-Lcom/android/server/job/JobSchedulerService$JobHandler$MaybeReadyJobQueueFunctor;
-Lcom/android/server/job/JobSchedulerService$JobHandler$ReadyJobQueueFunctor;
-Lcom/android/server/job/JobSchedulerService$JobSchedulerStub;
-Lcom/android/server/job/JobSchedulerService$LocalService;
-Lcom/android/server/job/JobSchedulerService$LocalService$1;
-Lcom/android/server/job/JobServiceContext;
-Lcom/android/server/job/JobServiceContext$JobServiceHandler;
-Lcom/android/server/job/JobStore;
-Lcom/android/server/job/JobStore$JobSet;
-Lcom/android/server/job/JobStore$JobStatusFunctor;
-Lcom/android/server/job/JobStore$ReadJobMapFromDiskRunnable;
-Lcom/android/server/job/JobStore$WriteJobsMapToDiskRunnable;
-Lcom/android/server/job/JobStore$WriteJobsMapToDiskRunnable$1;
-Lcom/android/server/job/StateChangedListener;
-Lcom/android/server/lights/Light;
-Lcom/android/server/lights/LightsManager;
-Lcom/android/server/lights/LightsService;
-Lcom/android/server/lights/LightsService$1;
-Lcom/android/server/lights/LightsService$2;
-Lcom/android/server/lights/LightsService$LightImpl;
-Lcom/android/server/LocalServices;
-Lcom/android/server/location/ActivityRecognitionProxy;
-Lcom/android/server/location/ActivityRecognitionProxy$1;
-Lcom/android/server/location/ComprehensiveCountryDetector;
-Lcom/android/server/location/ComprehensiveCountryDetector$1;
-Lcom/android/server/location/ComprehensiveCountryDetector$2;
-Lcom/android/server/location/ComprehensiveCountryDetector$3;
-Lcom/android/server/location/ComprehensiveCountryDetector$4;
-Lcom/android/server/location/ContextHubService;
-Lcom/android/server/location/CountryDetectorBase;
-Lcom/android/server/location/FlpHardwareProvider;
-Lcom/android/server/location/GeocoderProxy;
-Lcom/android/server/location/GeofenceManager;
-Lcom/android/server/location/GeofenceManager$GeofenceHandler;
-Lcom/android/server/location/GeofenceProxy;
-Lcom/android/server/location/GeofenceProxy$1;
-Lcom/android/server/location/GeofenceProxy$2;
-Lcom/android/server/location/GeofenceProxy$3;
-Lcom/android/server/location/GnssLocationProvider;
-Lcom/android/server/location/GnssLocationProvider$1;
-Lcom/android/server/location/GnssLocationProvider$10;
-Lcom/android/server/location/GnssLocationProvider$11;
-Lcom/android/server/location/GnssLocationProvider$12;
-Lcom/android/server/location/GnssLocationProvider$14;
-Lcom/android/server/location/GnssLocationProvider$2;
-Lcom/android/server/location/GnssLocationProvider$3;
-Lcom/android/server/location/GnssLocationProvider$4;
-Lcom/android/server/location/GnssLocationProvider$5;
-Lcom/android/server/location/GnssLocationProvider$6;
-Lcom/android/server/location/GnssLocationProvider$7;
-Lcom/android/server/location/GnssLocationProvider$8;
-Lcom/android/server/location/GnssLocationProvider$9;
-Lcom/android/server/location/GnssLocationProvider$BackOff;
-Lcom/android/server/location/GnssLocationProvider$GnssSystemInfoProvider;
-Lcom/android/server/location/GnssLocationProvider$GpsRequest;
-Lcom/android/server/location/GnssLocationProvider$NetworkLocationListener;
-Lcom/android/server/location/GnssLocationProvider$ProviderHandler;
-Lcom/android/server/location/GnssLocationProvider$SetCarrierProperty;
-Lcom/android/server/location/GnssMeasurementsProvider;
-Lcom/android/server/location/GnssNavigationMessageProvider;
-Lcom/android/server/location/GnssNavigationMessageProvider$StatusChangedOperation;
-Lcom/android/server/location/GnssStatusListenerHelper;
-Lcom/android/server/location/GnssStatusListenerHelper$1;
-Lcom/android/server/location/GnssStatusListenerHelper$2;
-Lcom/android/server/location/GnssStatusListenerHelper$3;
-Lcom/android/server/location/GnssStatusListenerHelper$4;
-Lcom/android/server/location/GnssStatusListenerHelper$5;
-Lcom/android/server/location/GnssStatusListenerHelper$Operation;
-Lcom/android/server/location/LocationBasedCountryDetector;
-Lcom/android/server/location/LocationBasedCountryDetector$1;
-Lcom/android/server/location/LocationBasedCountryDetector$2;
-Lcom/android/server/location/LocationBasedCountryDetector$3;
-Lcom/android/server/location/LocationBlacklist;
-Lcom/android/server/location/LocationFudger;
-Lcom/android/server/location/LocationFudger$1;
-Lcom/android/server/location/LocationProviderInterface;
-Lcom/android/server/location/LocationProviderProxy;
-Lcom/android/server/location/LocationProviderProxy$1;
-Lcom/android/server/location/LocationRequestStatistics;
-Lcom/android/server/location/LocationRequestStatistics$PackageProviderKey;
-Lcom/android/server/location/LocationRequestStatistics$PackageStatistics;
-Lcom/android/server/LocationManagerService;
-Lcom/android/server/LocationManagerService$1;
-Lcom/android/server/LocationManagerService$2;
-Lcom/android/server/LocationManagerService$3;
-Lcom/android/server/LocationManagerService$4;
-Lcom/android/server/LocationManagerService$5;
-Lcom/android/server/LocationManagerService$6;
-Lcom/android/server/LocationManagerService$7;
-Lcom/android/server/LocationManagerService$8;
-Lcom/android/server/LocationManagerService$9;
-Lcom/android/server/LocationManagerService$LocationWorkerHandler;
-Lcom/android/server/LocationManagerService$Receiver;
-Lcom/android/server/LocationManagerService$UpdateRecord;
-Lcom/android/server/location/PassiveProvider;
-Lcom/android/server/location/RemoteListenerHelper;
-Lcom/android/server/location/RemoteListenerHelper$HandlerRunnable;
-Lcom/android/server/location/RemoteListenerHelper$LinkedListener;
-Lcom/android/server/location/RemoteListenerHelper$ListenerOperation;
-Lcom/android/server/LockSettingsService;
-Lcom/android/server/LockSettingsService$1;
-Lcom/android/server/LockSettingsService$GateKeeperDiedRecipient;
-Lcom/android/server/LockSettingsService$Injector;
-Lcom/android/server/LockSettingsService$Injector$1;
-Lcom/android/server/LockSettingsService$Lifecycle;
-Lcom/android/server/LockSettingsService$SynchronizedStrongAuthTracker;
-Lcom/android/server/LockSettingsStorage;
-Lcom/android/server/LockSettingsStorage$Cache;
-Lcom/android/server/LockSettingsStorage$Cache$CacheKey;
-Lcom/android/server/LockSettingsStorage$Callback;
-Lcom/android/server/LockSettingsStorage$CredentialHash;
-Lcom/android/server/LockSettingsStorage$DatabaseHelper;
-Lcom/android/server/LockSettingsStrongAuth;
-Lcom/android/server/LockSettingsStrongAuth$1;
-Lcom/android/server/media/MediaResourceMonitorService;
-Lcom/android/server/media/MediaResourceMonitorService$MediaResourceMonitorImpl;
-Lcom/android/server/media/MediaRouterService;
-Lcom/android/server/media/MediaRouterService$1;
-Lcom/android/server/media/MediaRouterService$ClientRecord;
-Lcom/android/server/media/MediaRouterService$UserHandler;
-Lcom/android/server/media/MediaRouterService$UserHandler$ProviderRecord;
-Lcom/android/server/media/MediaRouterService$UserRecord;
-Lcom/android/server/media/MediaSessionRecord;
-Lcom/android/server/media/MediaSessionRecord$1;
-Lcom/android/server/media/MediaSessionRecord$ControllerStub;
-Lcom/android/server/media/MediaSessionRecord$MessageHandler;
-Lcom/android/server/media/MediaSessionRecord$SessionCb;
-Lcom/android/server/media/MediaSessionRecord$SessionStub;
-Lcom/android/server/media/MediaSessionService;
-Lcom/android/server/media/MediaSessionService$MessageHandler;
-Lcom/android/server/media/MediaSessionService$SessionManagerImpl;
-Lcom/android/server/media/MediaSessionService$SessionManagerImpl$1;
-Lcom/android/server/media/MediaSessionService$SessionManagerImpl$4;
-Lcom/android/server/media/MediaSessionService$SessionManagerImpl$KeyEventWakeLockReceiver;
-Lcom/android/server/media/MediaSessionService$SessionsListenerRecord;
-Lcom/android/server/media/MediaSessionService$SettingsObserver;
-Lcom/android/server/media/MediaSessionService$UserRecord;
-Lcom/android/server/media/MediaSessionStack;
-Lcom/android/server/media/projection/MediaProjectionManagerService;
-Lcom/android/server/media/projection/MediaProjectionManagerService$1;
-Lcom/android/server/media/projection/MediaProjectionManagerService$BinderService;
-Lcom/android/server/media/projection/MediaProjectionManagerService$CallbackDelegate;
-Lcom/android/server/media/projection/MediaProjectionManagerService$MediaRouterCallback;
-Lcom/android/server/media/RemoteDisplayProviderProxy;
-Lcom/android/server/media/RemoteDisplayProviderProxy$1;
-Lcom/android/server/media/RemoteDisplayProviderProxy$Callback;
-Lcom/android/server/media/RemoteDisplayProviderWatcher;
-Lcom/android/server/media/RemoteDisplayProviderWatcher$1;
-Lcom/android/server/media/RemoteDisplayProviderWatcher$2;
-Lcom/android/server/media/RemoteDisplayProviderWatcher$Callback;
-Lcom/android/server/midi/MidiService;
-Lcom/android/server/midi/MidiService$1;
-Lcom/android/server/midi/MidiService$Lifecycle;
-Lcom/android/server/MmsServiceBroker;
-Lcom/android/server/MmsServiceBroker$1;
-Lcom/android/server/MmsServiceBroker$2;
-Lcom/android/server/MmsServiceBroker$3;
-Lcom/android/server/MmsServiceBroker$BinderService;
-Lcom/android/server/MountServiceIdler;
-Lcom/android/server/NativeDaemonConnector;
-Lcom/android/server/NativeDaemonConnector$Command;
-Lcom/android/server/NativeDaemonConnectorException;
-Lcom/android/server/NativeDaemonConnector$NativeDaemonFailureException;
-Lcom/android/server/NativeDaemonConnector$ResponseQueue;
-Lcom/android/server/NativeDaemonConnector$ResponseQueue$PendingCmd;
-Lcom/android/server/NativeDaemonConnector$SensitiveArg;
-Lcom/android/server/NativeDaemonEvent;
-Lcom/android/server/NativeDaemonTimeoutException;
-Lcom/android/server/net/BaseNetworkObserver;
-Lcom/android/server/net/DelayedDiskWrite;
-Lcom/android/server/net/DelayedDiskWrite$Writer;
-Lcom/android/server/net/DnsServerEntry;
-Lcom/android/server/net/DnsServerRepository;
-Lcom/android/server/net/IpConfigStore;
-Lcom/android/server/net/LockdownVpnTracker;
-Lcom/android/server/net/NetlinkTracker;
-Lcom/android/server/net/NetlinkTracker$Callback;
-Lcom/android/server/net/NetworkIdentitySet;
-Lcom/android/server/net/NetworkPolicyManagerInternal;
-Lcom/android/server/net/NetworkPolicyManagerService;
-Lcom/android/server/net/NetworkPolicyManagerService$1;
-Lcom/android/server/net/NetworkPolicyManagerService$10;
-Lcom/android/server/net/NetworkPolicyManagerService$11;
-Lcom/android/server/net/NetworkPolicyManagerService$12;
-Lcom/android/server/net/NetworkPolicyManagerService$13;
-Lcom/android/server/net/NetworkPolicyManagerService$14;
-Lcom/android/server/net/NetworkPolicyManagerService$15;
-Lcom/android/server/net/NetworkPolicyManagerService$2;
-Lcom/android/server/net/NetworkPolicyManagerService$3;
-Lcom/android/server/net/NetworkPolicyManagerService$4;
-Lcom/android/server/net/NetworkPolicyManagerService$5;
-Lcom/android/server/net/NetworkPolicyManagerService$6;
-Lcom/android/server/net/NetworkPolicyManagerService$7;
-Lcom/android/server/net/NetworkPolicyManagerService$8;
-Lcom/android/server/net/NetworkPolicyManagerService$9;
-Lcom/android/server/net/NetworkPolicyManagerService$AppIdleStateChangeListener;
-Lcom/android/server/net/NetworkPolicyManagerService$NetworkPolicyManagerInternalImpl;
-Lcom/android/server/net/NetworkStatsAccess;
-Lcom/android/server/net/NetworkStatsCollection;
-Lcom/android/server/net/NetworkStatsCollection$Key;
-Lcom/android/server/net/NetworkStatsObservers;
-Lcom/android/server/net/NetworkStatsObservers$1;
-Lcom/android/server/net/NetworkStatsObservers$StatsContext;
-Lcom/android/server/net/NetworkStatsRecorder;
-Lcom/android/server/net/NetworkStatsRecorder$CombiningRewriter;
-Lcom/android/server/net/NetworkStatsService;
-Lcom/android/server/net/NetworkStatsService$1;
-Lcom/android/server/net/NetworkStatsService$2;
-Lcom/android/server/net/NetworkStatsService$3;
-Lcom/android/server/net/NetworkStatsService$4;
-Lcom/android/server/net/NetworkStatsService$5;
-Lcom/android/server/net/NetworkStatsService$6;
-Lcom/android/server/net/NetworkStatsService$7;
-Lcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;
-Lcom/android/server/net/NetworkStatsService$DropBoxNonMonotonicObserver;
-Lcom/android/server/net/NetworkStatsService$HandlerCallback;
-Lcom/android/server/net/NetworkStatsService$NetworkStatsSettings;
-Lcom/android/server/net/NetworkStatsService$NetworkStatsSettings$Config;
-Lcom/android/server/NetworkManagementService;
-Lcom/android/server/NetworkManagementService$1;
-Lcom/android/server/NetworkManagementService$IdleTimerParams;
-Lcom/android/server/NetworkManagementService$NetdCallbackReceiver;
-Lcom/android/server/NetworkManagementService$NetworkManagementEventCallback;
-Lcom/android/server/NetworkManagementSocketTagger;
-Lcom/android/server/NetworkManagementSocketTagger$1;
-Lcom/android/server/NetworkManagementSocketTagger$SocketTags;
-Lcom/android/server/NetworkScoreService;
-Lcom/android/server/NetworkScoreService$1;
-Lcom/android/server/NetworkScoreService$2;
-Lcom/android/server/NetworkScoreService$DispatchingContentObserver;
-Lcom/android/server/NetworkScoreService$NetworkScorerPackageMonitor;
-Lcom/android/server/NetworkScoreService$RequestRecommendationCaller;
-Lcom/android/server/NetworkScoreService$RequestRecommendationCaller$1;
-Lcom/android/server/NetworkScoreService$ServiceHandler;
-Lcom/android/server/NetworkTimeUpdateService;
-Lcom/android/server/NetworkTimeUpdateService$1;
-Lcom/android/server/NetworkTimeUpdateService$2;
-Lcom/android/server/NetworkTimeUpdateService$3;
-Lcom/android/server/NetworkTimeUpdateService$MyHandler;
-Lcom/android/server/NetworkTimeUpdateService$SettingsObserver;
-Lcom/android/server/notification/BadgeExtractor;
-Lcom/android/server/notification/CalendarTracker;
-Lcom/android/server/notification/CalendarTracker$1;
-Lcom/android/server/notification/CalendarTracker$Callback;
-Lcom/android/server/notification/CalendarTracker$CheckEventResult;
-Lcom/android/server/notification/ConditionProviders;
-Lcom/android/server/notification/ConditionProviders$Callback;
-Lcom/android/server/notification/ConditionProviders$ConditionRecord;
-Lcom/android/server/notification/CountdownConditionProvider;
-Lcom/android/server/notification/CountdownConditionProvider$Receiver;
-Lcom/android/server/notification/EventConditionProvider;
-Lcom/android/server/notification/EventConditionProvider$1;
-Lcom/android/server/notification/EventConditionProvider$2;
-Lcom/android/server/notification/EventConditionProvider$3;
-Lcom/android/server/notification/EventConditionProvider$4;
-Lcom/android/server/notification/GlobalSortKeyComparator;
-Lcom/android/server/notification/GroupHelper;
-Lcom/android/server/notification/GroupHelper$Callback;
-Lcom/android/server/notification/ImportanceExtractor;
-Lcom/android/server/notification/ManagedServices;
-Lcom/android/server/notification/ManagedServices$1;
-Lcom/android/server/notification/ManagedServices$Config;
-Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;
-Lcom/android/server/notification/ManagedServices$SettingRestoredReceiver;
-Lcom/android/server/notification/ManagedServices$SettingsObserver;
-Lcom/android/server/notification/ManagedServices$UserProfiles;
-Lcom/android/server/notification/NotificationComparator;
-Lcom/android/server/notification/NotificationComparator$1;
-Lcom/android/server/notification/NotificationComparator$2;
-Lcom/android/server/notification/NotificationDelegate;
-Lcom/android/server/notification/NotificationIntrusivenessExtractor;
-Lcom/android/server/notification/NotificationIntrusivenessExtractor$1;
-Lcom/android/server/notification/NotificationManagerInternal;
-Lcom/android/server/notification/NotificationManagerService;
-Lcom/android/server/notification/NotificationManagerService$1;
-Lcom/android/server/notification/NotificationManagerService$10;
-Lcom/android/server/notification/NotificationManagerService$11;
-Lcom/android/server/notification/NotificationManagerService$12;
-Lcom/android/server/notification/NotificationManagerService$13;
-Lcom/android/server/notification/NotificationManagerService$16;
-Lcom/android/server/notification/NotificationManagerService$2;
-Lcom/android/server/notification/NotificationManagerService$3;
-Lcom/android/server/notification/NotificationManagerService$4;
-Lcom/android/server/notification/NotificationManagerService$5;
-Lcom/android/server/notification/NotificationManagerService$6;
-Lcom/android/server/notification/NotificationManagerService$6$1;
-Lcom/android/server/notification/NotificationManagerService$7;
-Lcom/android/server/notification/NotificationManagerService$7$1;
-Lcom/android/server/notification/NotificationManagerService$8;
-Lcom/android/server/notification/NotificationManagerService$9;
-Lcom/android/server/notification/NotificationManagerService$Archive;
-Lcom/android/server/notification/NotificationManagerService$DumpFilter;
-Lcom/android/server/notification/NotificationManagerService$EnqueueNotificationRunnable;
-Lcom/android/server/notification/NotificationManagerService$FlagChecker;
-Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;
-Lcom/android/server/notification/NotificationManagerService$NotificationListeners;
-Lcom/android/server/notification/NotificationManagerService$NotificationListeners$2;
-Lcom/android/server/notification/NotificationManagerService$NotificationListeners$3;
-Lcom/android/server/notification/NotificationManagerService$NotificationListeners$6;
-Lcom/android/server/notification/NotificationManagerService$PolicyAccess;
-Lcom/android/server/notification/NotificationManagerService$PostNotificationRunnable;
-Lcom/android/server/notification/NotificationManagerService$PostNotificationRunnable$1;
-Lcom/android/server/notification/NotificationManagerService$RankingHandlerWorker;
-Lcom/android/server/notification/NotificationManagerService$SettingsObserver;
-Lcom/android/server/notification/NotificationManagerService$StatusBarNotificationHolder;
-Lcom/android/server/notification/NotificationManagerService$ToastRecord;
-Lcom/android/server/notification/NotificationManagerService$TrimCache;
-Lcom/android/server/notification/NotificationManagerService$WorkerHandler;
-Lcom/android/server/notification/NotificationRecord;
-Lcom/android/server/notification/NotificationSignalExtractor;
-Lcom/android/server/notification/NotificationUsageStats;
-Lcom/android/server/notification/NotificationUsageStats$1;
-Lcom/android/server/notification/NotificationUsageStats$AggregatedStats;
-Lcom/android/server/notification/NotificationUsageStats$ImportanceHistogram;
-Lcom/android/server/notification/NotificationUsageStats$SingleNotificationStats;
-Lcom/android/server/notification/NotificationUsageStats$SQLiteLog;
-Lcom/android/server/notification/NotificationUsageStats$SQLiteLog$1;
-Lcom/android/server/notification/NotificationUsageStats$SQLiteLog$2;
-Lcom/android/server/notification/PriorityExtractor;
-Lcom/android/server/notification/PropConfig;
-Lcom/android/server/notification/RankingConfig;
-Lcom/android/server/notification/RankingHandler;
-Lcom/android/server/notification/RankingHelper;
-Lcom/android/server/notification/RankingHelper$Record;
-Lcom/android/server/notification/RankingReconsideration;
-Lcom/android/server/notification/RateEstimator;
-Lcom/android/server/notification/ScheduleCalendar;
-Lcom/android/server/notification/ScheduleConditionProvider;
-Lcom/android/server/notification/ScheduleConditionProvider$1;
-Lcom/android/server/notification/SnoozeHelper;
-Lcom/android/server/notification/SnoozeHelper$1;
-Lcom/android/server/notification/SnoozeHelper$Callback;
-Lcom/android/server/notification/SystemConditionProviderService;
-Lcom/android/server/notification/ValidateNotificationPeople;
-Lcom/android/server/notification/ValidateNotificationPeople$1;
-Lcom/android/server/notification/VisibilityExtractor;
-Lcom/android/server/notification/ZenLog;
-Lcom/android/server/notification/ZenModeConditions;
-Lcom/android/server/notification/ZenModeFiltering;
-Lcom/android/server/notification/ZenModeFiltering$RepeatCallers;
-Lcom/android/server/notification/ZenModeHelper;
-Lcom/android/server/notification/ZenModeHelper$Callback;
-Lcom/android/server/notification/ZenModeHelper$H;
-Lcom/android/server/notification/ZenModeHelper$H$ConfigMessageData;
-Lcom/android/server/notification/ZenModeHelper$Metrics;
-Lcom/android/server/notification/ZenModeHelper$RingerModeDelegate;
-Lcom/android/server/notification/ZenModeHelper$SettingsObserver;
-Lcom/android/server/NsdService;
-Lcom/android/server/NsdService$NativeCallbackReceiver;
-Lcom/android/server/NsdService$NsdStateMachine;
-Lcom/android/server/NsdService$NsdStateMachine$1;
-Lcom/android/server/NsdService$NsdStateMachine$DefaultState;
-Lcom/android/server/NsdService$NsdStateMachine$DisabledState;
-Lcom/android/server/NsdService$NsdStateMachine$EnabledState;
-Lcom/android/server/os/DeviceIdentifiersPolicyService;
-Lcom/android/server/os/DeviceIdentifiersPolicyService$DeviceIdentifiersPolicy;
-Lcom/android/server/os/SchedulingPolicyService;
-Lcom/android/server/PersistentDataBlockService;
-Lcom/android/server/PersistentDataBlockService$1;
-Lcom/android/server/PinnerService;
-Lcom/android/server/PinnerService$BinderService;
-Lcom/android/server/PinnerService$PinnedFile;
-Lcom/android/server/PinnerService$PinnerHandler;
-Lcom/android/server/pm/AbstractStatsBase;
-Lcom/android/server/pm/AbstractStatsBase$1;
-Lcom/android/server/pm/BasePermission;
-Lcom/android/server/pm/CompilerStats;
-Lcom/android/server/pm/CompilerStats$PackageStats;
-Lcom/android/server/pm/CrossProfileIntentResolver;
-Lcom/android/server/pm/DefaultPermissionGrantPolicy;
-Lcom/android/server/pm/DefaultPermissionGrantPolicy$1;
-Lcom/android/server/pm/DefaultPermissionGrantPolicy$DefaultPermissionGrant;
-Lcom/android/server/pm/dex/DexManager;
-Lcom/android/server/pm/dex/DexManager$DexSearchResult;
-Lcom/android/server/pm/dex/DexManager$PackageCodeLocations;
-Lcom/android/server/pm/dex/PackageDexUsage;
-Lcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;
-Lcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;
-Lcom/android/server/pm/EphemeralResolverConnection;
-Lcom/android/server/pm/EphemeralResolverConnection$GetEphemeralResolveInfoCaller;
-Lcom/android/server/pm/EphemeralResolverConnection$GetEphemeralResolveInfoCaller$1;
-Lcom/android/server/pm/EphemeralResolverConnection$MyServiceConnection;
-Lcom/android/server/pm/Installer;
-Lcom/android/server/pm/Installer$1;
-Lcom/android/server/pm/Installer$InstallerException;
-Lcom/android/server/pm/InstantAppRegistry;
-Lcom/android/server/pm/InstantAppRegistry$CookiePersistence;
-Lcom/android/server/pm/InstructionSets;
-Lcom/android/server/pm/KeySetHandle;
-Lcom/android/server/pm/KeySetManagerService;
-Lcom/android/server/pm/KeySetManagerService$PublicKeyHandle;
-Lcom/android/server/pm/LauncherAppsService;
-Lcom/android/server/pm/LauncherAppsService$BroadcastCookie;
-Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;
-Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl$MyPackageMonitor;
-Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl$PackageCallbackList;
-Lcom/android/server/pm/OtaDexoptService;
-Lcom/android/server/pm/PackageDexOptimizer;
-Lcom/android/server/pm/PackageInstallerService;
-Lcom/android/server/pm/PackageInstallerService$1;
-Lcom/android/server/pm/PackageInstallerService$Callbacks;
-Lcom/android/server/pm/PackageInstallerService$InternalCallback;
-Lcom/android/server/pm/PackageKeySetData;
-Lcom/android/server/pm/PackageManagerException;
-Lcom/android/server/pm/PackageManagerService;
-Lcom/android/server/pm/PackageManagerService$1;
-Lcom/android/server/pm/PackageManagerService$11;
-Lcom/android/server/pm/PackageManagerService$2;
-Lcom/android/server/pm/PackageManagerService$21;
-Lcom/android/server/pm/PackageManagerService$3;
-Lcom/android/server/pm/PackageManagerService$8;
-Lcom/android/server/pm/PackageManagerService$ActivityIntentResolver;
-Lcom/android/server/pm/PackageManagerService$ActivityIntentResolver$ActionIterGenerator;
-Lcom/android/server/pm/PackageManagerService$ActivityIntentResolver$AuthoritiesIterGenerator;
-Lcom/android/server/pm/PackageManagerService$ActivityIntentResolver$CategoriesIterGenerator;
-Lcom/android/server/pm/PackageManagerService$ActivityIntentResolver$IterGenerator;
-Lcom/android/server/pm/PackageManagerService$ActivityIntentResolver$SchemesIterGenerator;
-Lcom/android/server/pm/PackageManagerServiceCompilerMapping;
-Lcom/android/server/pm/PackageManagerService$DefaultContainerConnection;
-Lcom/android/server/pm/PackageManagerService$DumpState;
-Lcom/android/server/pm/PackageManagerService$HandlerParams;
-Lcom/android/server/pm/PackageManagerService$IntentFilterVerifier;
-Lcom/android/server/pm/PackageManagerService$IntentVerifierProxy;
-Lcom/android/server/pm/PackageManagerService$MeasureParams;
-Lcom/android/server/pm/PackageManagerService$MoveCallbacks;
-Lcom/android/server/pm/PackageManagerService$OnPermissionChangeListeners;
-Lcom/android/server/pm/PackageManagerService$PackageHandler;
-Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
-Lcom/android/server/pm/PackageManagerService$PendingPackageBroadcasts;
-Lcom/android/server/pm/PackageManagerService$ProviderIntentResolver;
-Lcom/android/server/pm/PackageManagerService$ServiceIntentResolver;
-Lcom/android/server/pm/PackageManagerService$SharedLibraryEntry;
-Lcom/android/server/pm/PackageManagerServiceUtils;
-Lcom/android/server/pm/PackageSetting;
-Lcom/android/server/pm/PackageSettingBase;
-Lcom/android/server/pm/PackageSignatures;
-Lcom/android/server/pm/PackageUsage;
-Lcom/android/server/pm/ParallelPackageParser;
-Lcom/android/server/pm/ParallelPackageParser$ParseResult;
-Lcom/android/server/pm/PermissionsState;
-Lcom/android/server/pm/PermissionsState$PermissionData;
-Lcom/android/server/pm/PermissionsState$PermissionState;
-Lcom/android/server/pm/PersistentPreferredIntentResolver;
-Lcom/android/server/pm/Policy;
-Lcom/android/server/pm/PolicyComparator;
-Lcom/android/server/pm/Policy$PolicyBuilder;
-Lcom/android/server/pm/PreferredActivity;
-Lcom/android/server/pm/PreferredComponent;
-Lcom/android/server/pm/PreferredComponent$Callbacks;
-Lcom/android/server/pm/PreferredIntentResolver;
-Lcom/android/server/pm/ProcessLoggingHandler;
-Lcom/android/server/pm/ProtectedPackages;
-Lcom/android/server/pm/SELinuxMMAC;
-Lcom/android/server/pm/SettingBase;
-Lcom/android/server/pm/Settings;
-Lcom/android/server/pm/Settings$RuntimePermissionPersistence;
-Lcom/android/server/pm/Settings$RuntimePermissionPersistence$MyHandler;
-Lcom/android/server/pm/Settings$VersionInfo;
-Lcom/android/server/pm/SharedUserSetting;
-Lcom/android/server/pm/ShortcutLauncher;
-Lcom/android/server/pm/ShortcutPackage;
-Lcom/android/server/pm/ShortcutPackageInfo;
-Lcom/android/server/pm/ShortcutPackageItem;
-Lcom/android/server/pm/ShortcutParser;
-Lcom/android/server/pm/ShortcutRequestPinProcessor;
-Lcom/android/server/pm/ShortcutService;
-Lcom/android/server/pm/ShortcutService$1;
-Lcom/android/server/pm/ShortcutService$2;
-Lcom/android/server/pm/ShortcutService$3;
-Lcom/android/server/pm/ShortcutService$4;
-Lcom/android/server/pm/ShortcutService$5;
-Lcom/android/server/pm/ShortcutService$FileOutputStreamWithPath;
-Lcom/android/server/pm/ShortcutService$InvalidFileFormatException;
-Lcom/android/server/pm/ShortcutService$Lifecycle;
-Lcom/android/server/pm/ShortcutService$LocalService;
-Lcom/android/server/pm/ShortcutUser;
-Lcom/android/server/pm/ShortcutUser$PackageWithUser;
-Lcom/android/server/pm/UserDataPreparer;
-Lcom/android/server/pm/UserManagerService;
-Lcom/android/server/pm/UserManagerService$1;
-Lcom/android/server/pm/UserManagerService$2;
-Lcom/android/server/pm/UserManagerService$3;
-Lcom/android/server/pm/UserManagerService$LifeCycle;
-Lcom/android/server/pm/UserManagerService$LocalService;
-Lcom/android/server/pm/UserManagerService$MainHandler;
-Lcom/android/server/pm/UserManagerService$UserData;
-Lcom/android/server/pm/UserRestrictionsUtils;
-Lcom/android/server/policy/AccessibilityShortcutController;
-Lcom/android/server/policy/AccessibilityShortcutController$1;
-Lcom/android/server/policy/AccessibilityShortcutController$FrameworkObjectProvider;
-Lcom/android/server/policy/BarController;
-Lcom/android/server/policy/BarController$1;
-Lcom/android/server/policy/GlobalKeyManager;
-Lcom/android/server/policy/IconUtilities;
-Lcom/android/server/policy/ImmersiveModeConfirmation;
-Lcom/android/server/policy/ImmersiveModeConfirmation$1;
-Lcom/android/server/policy/ImmersiveModeConfirmation$2;
-Lcom/android/server/policy/ImmersiveModeConfirmation$ClingWindowView;
-Lcom/android/server/policy/ImmersiveModeConfirmation$ClingWindowView$1;
-Lcom/android/server/policy/ImmersiveModeConfirmation$ClingWindowView$2;
-Lcom/android/server/policy/ImmersiveModeConfirmation$ClingWindowView$3;
-Lcom/android/server/policy/ImmersiveModeConfirmation$ClingWindowView$4;
-Lcom/android/server/policy/ImmersiveModeConfirmation$ClingWindowView$5;
-Lcom/android/server/policy/ImmersiveModeConfirmation$ClingWindowView$5$1;
-Lcom/android/server/policy/ImmersiveModeConfirmation$H;
-Lcom/android/server/policy/keyguard/KeyguardServiceDelegate;
-Lcom/android/server/policy/keyguard/KeyguardServiceDelegate$1;
-Lcom/android/server/policy/keyguard/KeyguardServiceDelegate$DrawnListener;
-Lcom/android/server/policy/keyguard/KeyguardServiceDelegate$KeyguardShowDelegate;
-Lcom/android/server/policy/keyguard/KeyguardServiceDelegate$KeyguardState;
-Lcom/android/server/policy/keyguard/KeyguardServiceWrapper;
-Lcom/android/server/policy/keyguard/KeyguardStateMonitor;
-Lcom/android/server/policy/keyguard/KeyguardStateMonitor$StateCallback;
-Lcom/android/server/policy/LogDecelerateInterpolator;
-Lcom/android/server/policy/PhoneWindowManager;
-Lcom/android/server/policy/PhoneWindowManager$1;
-Lcom/android/server/policy/PhoneWindowManager$10;
-Lcom/android/server/policy/PhoneWindowManager$11;
-Lcom/android/server/policy/PhoneWindowManager$12;
-Lcom/android/server/policy/PhoneWindowManager$13;
-Lcom/android/server/policy/PhoneWindowManager$16;
-Lcom/android/server/policy/PhoneWindowManager$17;
-Lcom/android/server/policy/PhoneWindowManager$19;
-Lcom/android/server/policy/PhoneWindowManager$2;
-Lcom/android/server/policy/PhoneWindowManager$3;
-Lcom/android/server/policy/PhoneWindowManager$4;
-Lcom/android/server/policy/PhoneWindowManager$5;
-Lcom/android/server/policy/PhoneWindowManager$6;
-Lcom/android/server/policy/PhoneWindowManager$7;
-Lcom/android/server/policy/PhoneWindowManager$8;
-Lcom/android/server/policy/PhoneWindowManager$9;
-Lcom/android/server/policy/PhoneWindowManager$MyOrientationListener;
-Lcom/android/server/policy/PhoneWindowManager$MyOrientationListener$1;
-Lcom/android/server/policy/PhoneWindowManager$MyWakeGestureListener;
-Lcom/android/server/policy/PhoneWindowManager$PolicyHandler;
-Lcom/android/server/policy/PhoneWindowManager$ScreenLockTimeout;
-Lcom/android/server/policy/PhoneWindowManager$ScreenshotRunnable;
-Lcom/android/server/policy/PhoneWindowManager$SettingsObserver;
-Lcom/android/server/policy/PolicyControl;
-Lcom/android/server/policy/ShortcutManager;
-Lcom/android/server/policy/ShortcutManager$ShortcutInfo;
-Lcom/android/server/policy/SplashScreenSurface;
-Lcom/android/server/policy/StatusBarController;
-Lcom/android/server/policy/StatusBarController$1;
-Lcom/android/server/policy/StatusBarController$1$1;
-Lcom/android/server/policy/StatusBarController$1$2;
-Lcom/android/server/policy/StatusBarController$1$3;
-Lcom/android/server/policy/StatusBarController$1$4;
-Lcom/android/server/policy/SystemGesturesPointerEventListener;
-Lcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;
-Lcom/android/server/policy/SystemGesturesPointerEventListener$FlingGestureDetector;
-Lcom/android/server/policy/WakeGestureListener;
-Lcom/android/server/policy/WakeGestureListener$1;
-Lcom/android/server/policy/WakeGestureListener$2;
-Lcom/android/server/policy/WindowOrientationListener;
-Lcom/android/server/policy/WindowOrientationListener$OrientationJudge;
-Lcom/android/server/policy/WindowOrientationListener$OrientationSensorJudge;
-Lcom/android/server/policy/WindowOrientationListener$OrientationSensorJudge$1;
-Lcom/android/server/power/Notifier;
-Lcom/android/server/power/Notifier$1;
-Lcom/android/server/power/Notifier$2;
-Lcom/android/server/power/Notifier$3;
-Lcom/android/server/power/Notifier$4;
-Lcom/android/server/power/Notifier$5;
-Lcom/android/server/power/Notifier$6;
-Lcom/android/server/power/Notifier$7;
-Lcom/android/server/power/Notifier$8;
-Lcom/android/server/power/Notifier$NotifierHandler;
-Lcom/android/server/power/PowerManagerService;
-Lcom/android/server/power/PowerManagerService$1;
-Lcom/android/server/power/PowerManagerService$2;
-Lcom/android/server/power/PowerManagerService$BatteryReceiver;
-Lcom/android/server/power/PowerManagerService$BinderService;
-Lcom/android/server/power/PowerManagerService$Constants;
-Lcom/android/server/power/PowerManagerService$DockReceiver;
-Lcom/android/server/power/PowerManagerService$DreamReceiver;
-Lcom/android/server/power/PowerManagerService$LocalService;
-Lcom/android/server/power/PowerManagerService$PowerManagerHandler;
-Lcom/android/server/power/PowerManagerService$SettingsObserver;
-Lcom/android/server/power/PowerManagerService$SuspendBlockerImpl;
-Lcom/android/server/power/PowerManagerService$UidState;
-Lcom/android/server/power/PowerManagerService$UserSwitchedReceiver;
-Lcom/android/server/power/PowerManagerService$WakeLock;
-Lcom/android/server/power/SuspendBlocker;
-Lcom/android/server/power/WirelessChargerDetector;
-Lcom/android/server/power/WirelessChargerDetector$1;
-Lcom/android/server/power/WirelessChargerDetector$2;
-Lcom/android/server/print/PrintManagerService;
-Lcom/android/server/print/PrintManagerService$PrintManagerImpl;
-Lcom/android/server/print/PrintManagerService$PrintManagerImpl$1;
-Lcom/android/server/print/PrintManagerService$PrintManagerImpl$2;
-Lcom/android/server/print/PrintManagerService$PrintManagerImpl$3;
-Lcom/android/server/print/RemotePrintService;
-Lcom/android/server/print/RemotePrintService$MyHandler;
-Lcom/android/server/print/RemotePrintService$PrintServiceCallbacks;
-Lcom/android/server/print/RemotePrintServiceRecommendationService$RemotePrintServiceRecommendationServiceCallbacks;
-Lcom/android/server/print/RemotePrintService$RemotePrintServiceClient;
-Lcom/android/server/print/RemotePrintService$RemoteServiceConneciton;
-Lcom/android/server/print/RemotePrintSpooler;
-Lcom/android/server/print/RemotePrintSpooler$BasePrintSpoolerServiceCallbacks;
-Lcom/android/server/print/RemotePrintSpooler$ClearCustomPrinterIconCacheCaller;
-Lcom/android/server/print/RemotePrintSpooler$ClearCustomPrinterIconCacheCaller$1;
-Lcom/android/server/print/RemotePrintSpooler$GetCustomPrinterIconCaller;
-Lcom/android/server/print/RemotePrintSpooler$GetCustomPrinterIconCaller$1;
-Lcom/android/server/print/RemotePrintSpooler$GetPrintJobInfoCaller;
-Lcom/android/server/print/RemotePrintSpooler$GetPrintJobInfoCaller$1;
-Lcom/android/server/print/RemotePrintSpooler$GetPrintJobInfosCaller;
-Lcom/android/server/print/RemotePrintSpooler$GetPrintJobInfosCaller$1;
-Lcom/android/server/print/RemotePrintSpooler$MyServiceConnection;
-Lcom/android/server/print/RemotePrintSpooler$OnCustomPrinterIconLoadedCaller;
-Lcom/android/server/print/RemotePrintSpooler$OnCustomPrinterIconLoadedCaller$1;
-Lcom/android/server/print/RemotePrintSpooler$PrintSpoolerCallbacks;
-Lcom/android/server/print/RemotePrintSpooler$PrintSpoolerClient;
-Lcom/android/server/print/RemotePrintSpooler$SetPrintJobStateCaller;
-Lcom/android/server/print/RemotePrintSpooler$SetPrintJobStateCaller$1;
-Lcom/android/server/print/RemotePrintSpooler$SetPrintJobTagCaller;
-Lcom/android/server/print/RemotePrintSpooler$SetPrintJobTagCaller$1;
-Lcom/android/server/print/UserState;
-Lcom/android/server/print/UserState$4;
-Lcom/android/server/print/UserState$ListenerRecord;
-Lcom/android/server/print/UserState$PrintJobForAppCache;
-Lcom/android/server/print/UserState$UserStateHandler;
-Lcom/android/server/PruneInstantAppsJobService;
-Lcom/android/server/RandomBlock;
-Lcom/android/server/RecoverySystemService;
-Lcom/android/server/RecoverySystemService$BinderService;
-Lcom/android/server/RescueParty;
-Lcom/android/server/RescueParty$BootThreshold;
-Lcom/android/server/RescueParty$Threshold;
-Lcom/android/server/restrictions/RestrictionsManagerService;
-Lcom/android/server/restrictions/RestrictionsManagerService$RestrictionsManagerImpl;
-Lcom/android/server/SamplingProfilerService;
-Lcom/android/server/SamplingProfilerService$1;
-Lcom/android/server/SamplingProfilerService$SamplingProfilerSettingsObserver;
-Lcom/android/server/search/Searchables;
-Lcom/android/server/search/Searchables$1;
-Lcom/android/server/search/SearchManagerService;
-Lcom/android/server/search/SearchManagerService$GlobalSearchProviderObserver;
-Lcom/android/server/search/SearchManagerService$Lifecycle;
-Lcom/android/server/search/SearchManagerService$Lifecycle$1;
-Lcom/android/server/search/SearchManagerService$MyPackageMonitor;
-Lcom/android/server/security/KeyAttestationApplicationIdProviderService;
-Lcom/android/server/SensorNotificationService;
-Lcom/android/server/SerialService;
-Lcom/android/server/ServiceThread;
-Lcom/android/server/ServiceWatcher;
-Lcom/android/server/ServiceWatcher$1;
-Lcom/android/server/ServiceWatcher$2;
-Lcom/android/server/soundtrigger/SoundTriggerDbHelper;
-Lcom/android/server/soundtrigger/SoundTriggerHelper;
-Lcom/android/server/soundtrigger/SoundTriggerHelper$MyCallStateListener;
-Lcom/android/server/soundtrigger/SoundTriggerInternal;
-Lcom/android/server/soundtrigger/SoundTriggerService;
-Lcom/android/server/soundtrigger/SoundTriggerService$LocalSoundTriggerService;
-Lcom/android/server/soundtrigger/SoundTriggerService$SoundTriggerServiceStub;
-Lcom/android/server/statusbar/StatusBarManagerInternal;
-Lcom/android/server/statusbar/StatusBarManagerService;
-Lcom/android/server/statusbar/StatusBarManagerService$1;
-Lcom/android/server/statusbar/StatusBarManagerService$2;
-Lcom/android/server/statusbar/StatusBarManagerService$3;
-Lcom/android/server/statusbar/StatusBarManagerService$4;
-Lcom/android/server/statusbar/StatusBarManagerService$5;
-Lcom/android/server/statusbar/StatusBarManagerService$DisableRecord;
-Lcom/android/server/storage/AppFuseBridge;
-Lcom/android/server/storage/DeviceStorageMonitorInternal;
-Lcom/android/server/storage/DeviceStorageMonitorService;
-Lcom/android/server/storage/DeviceStorageMonitorService$1;
-Lcom/android/server/storage/DeviceStorageMonitorService$2;
-Lcom/android/server/storage/DeviceStorageMonitorService$3;
-Lcom/android/server/storage/DeviceStorageMonitorService$CacheFileDeletedObserver;
-Lcom/android/server/storage/DiskStatsLoggingService;
-Lcom/android/server/StorageManagerService;
-Lcom/android/server/StorageManagerService$1;
-Lcom/android/server/StorageManagerService$Callbacks;
-Lcom/android/server/StorageManagerService$DefaultContainerConnection;
-Lcom/android/server/StorageManagerService$Lifecycle;
-Lcom/android/server/StorageManagerService$ObbActionHandler;
-Lcom/android/server/StorageManagerService$StorageManagerInternalImpl;
-Lcom/android/server/StorageManagerService$StorageManagerServiceHandler;
-Lcom/android/server/SystemConfig;
-Lcom/android/server/SystemConfig$PermissionEntry;
-Lcom/android/server/SystemServer;
-Lcom/android/server/SystemServerInitThreadPool;
-Lcom/android/server/SystemService;
-Lcom/android/server/SystemServiceManager;
-Lcom/android/server/telecom/Analytics;
-Lcom/android/server/telecom/Analytics$1;
-Lcom/android/server/telecom/Analytics$2;
-Lcom/android/server/telecom/Analytics$3;
-Lcom/android/server/telecom/Analytics$CallInfo;
-Lcom/android/server/telecom/Analytics$CallInfoImpl;
-Lcom/android/server/telecom/AsyncRingtonePlayer;
-Lcom/android/server/telecom/BluetoothAdapterProxy;
-Lcom/android/server/telecom/bluetooth/BluetoothDeviceManager;
-Lcom/android/server/telecom/bluetooth/BluetoothDeviceManager$1;
-Lcom/android/server/telecom/bluetooth/BluetoothDeviceManager$2;
-Lcom/android/server/telecom/bluetooth/BluetoothRouteManager;
-Lcom/android/server/telecom/bluetooth/BluetoothRouteManager$1;
-Lcom/android/server/telecom/bluetooth/BluetoothRouteManager$2;
-Lcom/android/server/telecom/bluetooth/BluetoothRouteManager$AudioOffState;
-Lcom/android/server/telecom/bluetooth/BluetoothRouteManager$BluetoothStateListener;
-Lcom/android/server/telecom/BluetoothHeadsetProxy;
-Lcom/android/server/telecom/BluetoothPhoneServiceImpl;
-Lcom/android/server/telecom/BluetoothPhoneServiceImpl$1;
-Lcom/android/server/telecom/BluetoothPhoneServiceImpl$2;
-Lcom/android/server/telecom/BluetoothPhoneServiceImpl$3;
-Lcom/android/server/telecom/BluetoothPhoneServiceImpl$4;
-Lcom/android/server/telecom/BluetoothPhoneServiceImpl$BluetoothPhoneServiceImplFactory;
-Lcom/android/server/telecom/Call;
-Lcom/android/server/telecom/Call$1;
-Lcom/android/server/telecom/CallAudioManager;
-Lcom/android/server/telecom/CallAudioManager$1;
-Lcom/android/server/telecom/CallAudioManager$AudioServiceFactory;
-Lcom/android/server/telecom/CallAudioModeStateMachine;
-Lcom/android/server/telecom/CallAudioModeStateMachine$1;
-Lcom/android/server/telecom/CallAudioModeStateMachine$BaseState;
-Lcom/android/server/telecom/CallAudioModeStateMachine$MessageArgs;
-Lcom/android/server/telecom/CallAudioModeStateMachine$OtherFocusState;
-Lcom/android/server/telecom/CallAudioModeStateMachine$RingingFocusState;
-Lcom/android/server/telecom/CallAudioModeStateMachine$SimCallFocusState;
-Lcom/android/server/telecom/CallAudioModeStateMachine$UnfocusedState;
-Lcom/android/server/telecom/CallAudioModeStateMachine$VoipCallFocusState;
-Lcom/android/server/telecom/CallAudioRoutePeripheralAdapter;
-Lcom/android/server/telecom/CallAudioRouteStateMachine;
-Lcom/android/server/telecom/CallAudioRouteStateMachine$1;
-Lcom/android/server/telecom/CallAudioRouteStateMachine$2;
-Lcom/android/server/telecom/CallAudioRouteStateMachine$3;
-Lcom/android/server/telecom/CallAudioRouteStateMachine$ActiveBluetoothRoute;
-Lcom/android/server/telecom/CallAudioRouteStateMachine$ActiveEarpieceRoute;
-Lcom/android/server/telecom/CallAudioRouteStateMachine$ActiveHeadsetRoute;
-Lcom/android/server/telecom/CallAudioRouteStateMachine$ActiveSpeakerRoute;
-Lcom/android/server/telecom/CallAudioRouteStateMachine$AudioState;
-Lcom/android/server/telecom/CallAudioRouteStateMachine$BluetoothRoute;
-Lcom/android/server/telecom/CallAudioRouteStateMachine$EarpieceRoute;
-Lcom/android/server/telecom/CallAudioRouteStateMachine$HeadsetRoute;
-Lcom/android/server/telecom/CallAudioRouteStateMachine$QuiescentBluetoothRoute;
-Lcom/android/server/telecom/CallAudioRouteStateMachine$QuiescentEarpieceRoute;
-Lcom/android/server/telecom/CallAudioRouteStateMachine$QuiescentHeadsetRoute;
-Lcom/android/server/telecom/CallAudioRouteStateMachine$QuiescentSpeakerRoute;
-Lcom/android/server/telecom/CallAudioRouteStateMachine$RingingBluetoothRoute;
-Lcom/android/server/telecom/CallAudioRouteStateMachine$SpeakerRoute;
-Lcom/android/server/telecom/CallerInfoAsyncQueryFactory;
-Lcom/android/server/telecom/CallerInfoLookupHelper;
-Lcom/android/server/telecom/CallerInfoLookupHelper$1;
-Lcom/android/server/telecom/CallerInfoLookupHelper$CallerInfoQueryInfo;
-Lcom/android/server/telecom/CallerInfoLookupHelper$OnQueryCompleteListener;
-Lcom/android/server/telecom/callfiltering/CallFilterResultCallback;
-Lcom/android/server/telecom/CallIdMapper;
-Lcom/android/server/telecom/CallIdMapper$BiMap;
-Lcom/android/server/telecom/CallIdMapper$ICallInfo;
-Lcom/android/server/telecom/CallIntentProcessor;
-Lcom/android/server/telecom/CallIntentProcessor$Adapter;
-Lcom/android/server/telecom/CallIntentProcessor$AdapterImpl;
-Lcom/android/server/telecom/Call$Listener;
-Lcom/android/server/telecom/Call$ListenerBase;
-Lcom/android/server/telecom/CallLogManager;
-Lcom/android/server/telecom/CallLogManager$AddCallArgs;
-Lcom/android/server/telecom/CallLogManager$LogCallAsyncTask;
-Lcom/android/server/telecom/CallLogManager$LogCallCompletedListener;
-Lcom/android/server/telecom/CallsManager;
-Lcom/android/server/telecom/CallsManager$CallsManagerListener;
-Lcom/android/server/telecom/CallsManagerListenerBase;
-Lcom/android/server/telecom/CallState;
-Lcom/android/server/telecom/components/BluetoothPhoneService;
-Lcom/android/server/telecom/components/PrimaryCallReceiver;
-Lcom/android/server/telecom/components/TelecomBroadcastReceiver;
-Lcom/android/server/telecom/components/TelecomService;
-Lcom/android/server/telecom/components/TelecomService$1;
-Lcom/android/server/telecom/components/TelecomService$2;
-Lcom/android/server/telecom/components/TelecomService$3;
-Lcom/android/server/telecom/components/TelecomService$4;
-Lcom/android/server/telecom/components/TelecomService$5;
-Lcom/android/server/telecom/components/TelecomService$6;
-Lcom/android/server/telecom/components/TelecomService$7;
-Lcom/android/server/telecom/components/TelecomService$8;
-Lcom/android/server/telecom/components/UserCallIntentProcessor;
-Lcom/android/server/telecom/components/UserCallIntentProcessorFactory;
-Lcom/android/server/telecom/ConnectionServiceRepository;
-Lcom/android/server/telecom/ConnectionServiceRepository$1;
-Lcom/android/server/telecom/ConnectionServiceWrapper;
-Lcom/android/server/telecom/ConnectionServiceWrapper$1;
-Lcom/android/server/telecom/ConnectionServiceWrapper$2;
-Lcom/android/server/telecom/ConnectionServiceWrapper$Adapter;
-Lcom/android/server/telecom/ContactsAsyncHelper;
-Lcom/android/server/telecom/ContactsAsyncHelper$ContentResolverAdapter;
-Lcom/android/server/telecom/CreateConnectionProcessor;
-Lcom/android/server/telecom/CreateConnectionProcessor$CallAttemptRecord;
-Lcom/android/server/telecom/CreateConnectionResponse;
-Lcom/android/server/telecom/CreateConnectionTimeout;
-Lcom/android/server/telecom/CurrentUserProxy;
-Lcom/android/server/telecom/DefaultDialerCache;
-Lcom/android/server/telecom/DefaultDialerCache$1;
-Lcom/android/server/telecom/DefaultDialerCache$2;
-Lcom/android/server/telecom/DefaultDialerCache$DefaultDialerManagerAdapter;
-Lcom/android/server/telecom/DefaultDialerCache$DefaultDialerManagerAdapterImpl;
-Lcom/android/server/telecom/DialerCodeReceiver;
-Lcom/android/server/telecom/DockManager;
-Lcom/android/server/telecom/DockManager$DockBroadcastReceiver;
-Lcom/android/server/telecom/DockManager$Listener;
-Lcom/android/server/telecom/DtmfLocalTonePlayer;
-Lcom/android/server/telecom/DtmfLocalTonePlayer$1;
-Lcom/android/server/telecom/EmergencyCallHelper;
-Lcom/android/server/telecom/HeadsetMediaButton;
-Lcom/android/server/telecom/HeadsetMediaButton$1;
-Lcom/android/server/telecom/HeadsetMediaButton$2;
-Lcom/android/server/telecom/HeadsetMediaButtonFactory;
-Lcom/android/server/telecom/InCallAdapter;
-Lcom/android/server/telecom/InCallController;
-Lcom/android/server/telecom/InCallController$1;
-Lcom/android/server/telecom/InCallController$2;
-Lcom/android/server/telecom/InCallController$3;
-Lcom/android/server/telecom/InCallController$CarSwappingInCallServiceConnection;
-Lcom/android/server/telecom/InCallController$EmergencyInCallServiceConnection;
-Lcom/android/server/telecom/InCallController$EmergencyInCallServiceConnection$1;
-Lcom/android/server/telecom/InCallController$InCallServiceBindingConnection;
-Lcom/android/server/telecom/InCallController$InCallServiceBindingConnection$1;
-Lcom/android/server/telecom/InCallController$InCallServiceConnection;
-Lcom/android/server/telecom/InCallController$InCallServiceConnection$Listener;
-Lcom/android/server/telecom/InCallController$InCallServiceInfo;
-Lcom/android/server/telecom/InCallController$NonUIInCallServiceConnectionCollection;
-Lcom/android/server/telecom/InCallTonePlayer$Factory;
-Lcom/android/server/telecom/InCallWakeLockController;
-Lcom/android/server/telecom/InCallWakeLockControllerFactory;
-Lcom/android/server/telecom/InterruptionFilterProxy;
-Lcom/android/server/telecom/LogUtils;
-Lcom/android/server/telecom/LogUtils$Events$Timings;
-Lcom/android/server/telecom/MissedCallNotifier;
-Lcom/android/server/telecom/MissedCallNotifier$CallInfoFactory;
-Lcom/android/server/telecom/nano/TelecomLogClass$InCallServiceInfo;
-Lcom/android/server/telecom/NewOutgoingCallIntentBroadcaster;
-Lcom/android/server/telecom/NewOutgoingCallIntentBroadcaster$NewOutgoingCallBroadcastIntentReceiver;
-Lcom/android/server/telecom/ParcelableCallUtils;
-Lcom/android/server/telecom/PhoneAccountRegistrar;
-Lcom/android/server/telecom/PhoneAccountRegistrar$1;
-Lcom/android/server/telecom/PhoneAccountRegistrar$2;
-Lcom/android/server/telecom/PhoneAccountRegistrar$3;
-Lcom/android/server/telecom/PhoneAccountRegistrar$4;
-Lcom/android/server/telecom/PhoneAccountRegistrar$5;
-Lcom/android/server/telecom/PhoneAccountRegistrar$AsyncXmlWriter;
-Lcom/android/server/telecom/PhoneAccountRegistrar$DefaultPhoneAccountHandle;
-Lcom/android/server/telecom/PhoneAccountRegistrar$Listener;
-Lcom/android/server/telecom/PhoneAccountRegistrar$PhoneAccountRegistrarWriteLock;
-Lcom/android/server/telecom/PhoneAccountRegistrar$State;
-Lcom/android/server/telecom/PhoneAccountRegistrar$XmlSerialization;
-Lcom/android/server/telecom/PhoneNumberUtilsAdapter;
-Lcom/android/server/telecom/PhoneNumberUtilsAdapterImpl;
-Lcom/android/server/telecom/PhoneStateBroadcaster;
-Lcom/android/server/telecom/ProximitySensorManager;
-Lcom/android/server/telecom/ProximitySensorManagerFactory;
-Lcom/android/server/telecom/RespondViaSmsManager;
-Lcom/android/server/telecom/RespondViaSmsManager$1;
-Lcom/android/server/telecom/RingbackPlayer;
-Lcom/android/server/telecom/Ringer;
-Lcom/android/server/telecom/RingtoneFactory;
-Lcom/android/server/telecom/ServiceBinder;
-Lcom/android/server/telecom/ServiceBinder$BindCallback;
-Lcom/android/server/telecom/ServiceBinder$Binder2;
-Lcom/android/server/telecom/ServiceBinder$Listener;
-Lcom/android/server/telecom/ServiceBinder$ServiceBinderConnection;
-Lcom/android/server/telecom/StatusBarNotifier;
-Lcom/android/server/telecom/SystemSettingsUtil;
-Lcom/android/server/telecom/SystemStateProvider;
-Lcom/android/server/telecom/SystemStateProvider$1;
-Lcom/android/server/telecom/SystemStateProvider$SystemStateListener;
-Lcom/android/server/telecom/TelecomBroadcastIntentProcessor;
-Lcom/android/server/telecom/TelecomLoaderService;
-Lcom/android/server/telecom/TelecomLoaderService$1;
-Lcom/android/server/telecom/TelecomLoaderService$2;
-Lcom/android/server/telecom/TelecomLoaderService$3;
-Lcom/android/server/telecom/TelecomLoaderService$4;
-Lcom/android/server/telecom/TelecomLoaderService$5;
-Lcom/android/server/telecom/TelecomLoaderService$TelecomServiceConnection;
-Lcom/android/server/telecom/TelecomLoaderService$TelecomServiceConnection$1;
-Lcom/android/server/telecom/TelecomServiceImpl;
-Lcom/android/server/telecom/TelecomServiceImpl$1;
-Lcom/android/server/telecom/TelecomServiceImpl$SubscriptionManagerAdapter;
-Lcom/android/server/telecom/TelecomServiceImpl$SubscriptionManagerAdapterImpl;
-Lcom/android/server/telecom/TelecomSystem;
-Lcom/android/server/telecom/TelecomSystem$1;
-Lcom/android/server/telecom/TelecomSystem$2;
-Lcom/android/server/telecom/TelecomSystem$3;
-Lcom/android/server/telecom/TelecomSystem$4;
-Lcom/android/server/telecom/TelecomSystem$5;
-Lcom/android/server/telecom/TelecomSystem$6;
-Lcom/android/server/telecom/TelecomSystem$SyncRoot;
-Lcom/android/server/telecom/TelecomWakeLock;
-Lcom/android/server/telecom/TelecomWakeLock$WakeLockAdapter;
-Lcom/android/server/telecom/TelephonyUtil;
-Lcom/android/server/telecom/Timeouts;
-Lcom/android/server/telecom/Timeouts$Adapter;
-Lcom/android/server/telecom/TtyManager;
-Lcom/android/server/telecom/TtyManager$TtyBroadcastReceiver;
-Lcom/android/server/telecom/ui/MissedCallNotifierImpl;
-Lcom/android/server/telecom/ui/MissedCallNotifierImpl$2;
-Lcom/android/server/telecom/ui/MissedCallNotifierImpl$DefaultNotificationBuilderFactory;
-Lcom/android/server/telecom/ui/MissedCallNotifierImpl$MissedCallNotifierImplFactory;
-Lcom/android/server/telecom/ui/MissedCallNotifierImpl$NotificationBuilderFactory;
-Lcom/android/server/telecom/UserUtil;
-Lcom/android/server/telecom/VideoProviderProxy$Listener;
-Lcom/android/server/telecom/WiredHeadsetManager;
-Lcom/android/server/telecom/WiredHeadsetManager$Listener;
-Lcom/android/server/telecom/WiredHeadsetManager$WiredHeadsetCallback;
-Lcom/android/server/TelephonyRegistry;
-Lcom/android/server/TelephonyRegistry$1;
-Lcom/android/server/TelephonyRegistry$2;
-Lcom/android/server/TelephonyRegistry$LogSSC;
-Lcom/android/server/TelephonyRegistry$Record;
-Lcom/android/server/TextServicesManagerService;
-Lcom/android/server/TextServicesManagerService$InternalDeathRecipient;
-Lcom/android/server/TextServicesManagerService$InternalServiceConnection;
-Lcom/android/server/TextServicesManagerService$Lifecycle;
-Lcom/android/server/TextServicesManagerService$SpellCheckerBindGroup;
-Lcom/android/server/TextServicesManagerService$TextServicesBroadcastReceiver;
-Lcom/android/server/TextServicesManagerService$TextServicesMonitor;
-Lcom/android/server/TextServicesManagerService$TextServicesSettings;
-Lcom/android/server/text/TextClassificationService;
-Lcom/android/server/text/TextClassificationService$Lifecycle;
-Lcom/android/server/trust/TrustArchive;
-Lcom/android/server/trust/TrustManagerService;
-Lcom/android/server/trust/TrustManagerService$1;
-Lcom/android/server/trust/TrustManagerService$2;
-Lcom/android/server/trust/TrustManagerService$3;
-Lcom/android/server/trust/TrustManagerService$Receiver;
-Lcom/android/server/trust/TrustManagerService$StrongAuthTracker;
-Lcom/android/server/tv/TvInputHal;
-Lcom/android/server/tv/UinputBridge;
-Lcom/android/server/twilight/TwilightListener;
-Lcom/android/server/twilight/TwilightManager;
-Lcom/android/server/twilight/TwilightService;
-Lcom/android/server/twilight/TwilightService$1;
-Lcom/android/server/UiModeManagerService;
-Lcom/android/server/UiModeManagerService$1;
-Lcom/android/server/UiModeManagerService$2;
-Lcom/android/server/UiModeManagerService$3;
-Lcom/android/server/UiModeManagerService$4;
-Lcom/android/server/UiModeManagerService$5;
-Lcom/android/server/UiModeManagerService$6;
-Lcom/android/server/UiThread;
-Lcom/android/server/UpdateLockService;
-Lcom/android/server/UpdateLockService$LockWatcher;
-Lcom/android/server/usage/AppIdleHistory;
-Lcom/android/server/usage/AppIdleHistory$PackageHistory;
-Lcom/android/server/usage/IntervalStats;
-Lcom/android/server/usage/StorageStatsService;
-Lcom/android/server/usage/StorageStatsService$1;
-Lcom/android/server/usage/StorageStatsService$Lifecycle;
-Lcom/android/server/usage/UnixCalendar;
-Lcom/android/server/usage/UsageStatsDatabase;
-Lcom/android/server/usage/UsageStatsDatabase$1;
-Lcom/android/server/usage/UsageStatsDatabase$StatCombiner;
-Lcom/android/server/usage/UsageStatsService;
-Lcom/android/server/usage/UsageStatsService$1;
-Lcom/android/server/usage/UsageStatsService$2;
-Lcom/android/server/usage/UsageStatsService$BinderService;
-Lcom/android/server/usage/UsageStatsService$DeviceStateReceiver;
-Lcom/android/server/usage/UsageStatsService$H;
-Lcom/android/server/usage/UsageStatsService$LocalService;
-Lcom/android/server/usage/UsageStatsService$PackageReceiver;
-Lcom/android/server/usage/UsageStatsService$SettingsObserver;
-Lcom/android/server/usage/UsageStatsService$UserActionsReceiver;
-Lcom/android/server/usage/UsageStatsXml;
-Lcom/android/server/usage/UsageStatsXmlV1;
-Lcom/android/server/usage/UserUsageStatsService;
-Lcom/android/server/usage/UserUsageStatsService$1;
-Lcom/android/server/usage/UserUsageStatsService$2;
-Lcom/android/server/usage/UserUsageStatsService$3;
-Lcom/android/server/usage/UserUsageStatsService$StatsUpdatedListener;
-Lcom/android/server/usb/MtpNotificationManager;
-Lcom/android/server/usb/MtpNotificationManager$OnOpenInAppListener;
-Lcom/android/server/usb/MtpNotificationManager$Receiver;
-Lcom/android/server/usb/UsbAlsaManager;
-Lcom/android/server/usb/UsbAlsaManager$1;
-Lcom/android/server/usb/UsbAlsaManager$AlsaDevice;
-Lcom/android/server/usb/UsbDebuggingManager;
-Lcom/android/server/usb/UsbDebuggingManager$UsbDebuggingHandler;
-Lcom/android/server/usb/UsbDebuggingManager$UsbDebuggingThread;
-Lcom/android/server/usb/UsbDeviceManager;
-Lcom/android/server/usb/UsbDeviceManager$1;
-Lcom/android/server/usb/UsbDeviceManager$2;
-Lcom/android/server/usb/UsbDeviceManager$AdbSettingsObserver;
-Lcom/android/server/usb/UsbDeviceManager$UsbHandler;
-Lcom/android/server/usb/UsbHostManager;
-Lcom/android/server/usb/UsbHostManager$1;
-Lcom/android/server/usb/UsbMidiDevice;
-Lcom/android/server/usb/UsbPortManager;
-Lcom/android/server/usb/UsbPortManager$1;
-Lcom/android/server/usb/UsbPortManager$2;
-Lcom/android/server/usb/UsbPortManager$DeathRecipient;
-Lcom/android/server/usb/UsbPortManager$HALCallback;
-Lcom/android/server/usb/UsbPortManager$PortInfo;
-Lcom/android/server/usb/UsbPortManager$RawPortInfo;
-Lcom/android/server/usb/UsbPortManager$RawPortInfo$1;
-Lcom/android/server/usb/UsbPortManager$ServiceNotification;
-Lcom/android/server/usb/UsbProfileGroupSettingsManager;
-Lcom/android/server/usb/UsbProfileGroupSettingsManager$1;
-Lcom/android/server/usb/UsbProfileGroupSettingsManager$AccessoryFilter;
-Lcom/android/server/usb/UsbProfileGroupSettingsManager$MyPackageMonitor;
-Lcom/android/server/usb/UsbProfileGroupSettingsManager$UserPackage;
-Lcom/android/server/usb/UsbService;
-Lcom/android/server/usb/UsbService$1;
-Lcom/android/server/usb/UsbService$Lifecycle;
-Lcom/android/server/usb/UsbSettingsManager;
-Lcom/android/server/utils/ManagedApplicationService$BinderChecker;
-Lcom/android/server/VibratorService;
-Lcom/android/server/VibratorService$1;
-Lcom/android/server/VibratorService$2;
-Lcom/android/server/VibratorService$3;
-Lcom/android/server/VibratorService$4;
-Lcom/android/server/VibratorService$SettingsObserver;
-Lcom/android/server/VibratorService$VibrateThread;
-Lcom/android/server/VibratorService$Vibration;
-Lcom/android/server/VibratorService$VibrationInfo;
-Lcom/android/server/voiceinteraction/DatabaseHelper;
-Lcom/android/server/voiceinteraction/VoiceInteractionManagerService;
-Lcom/android/server/voiceinteraction/VoiceInteractionManagerService$1;
-Lcom/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl;
-Lcom/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl$1;
-Lcom/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl$2;
-Lcom/android/server/voiceinteraction/VoiceInteractionManagerService$LocalService;
-Lcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;
-Lcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub$1;
-Lcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub$SettingsObserver;
-Lcom/android/server/voiceinteraction/VoiceInteractionSessionConnection;
-Lcom/android/server/voiceinteraction/VoiceInteractionSessionConnection$1;
-Lcom/android/server/voiceinteraction/VoiceInteractionSessionConnection$2;
-Lcom/android/server/voiceinteraction/VoiceInteractionSessionConnection$3;
-Lcom/android/server/voiceinteraction/VoiceInteractionSessionConnection$4;
-Lcom/android/server/voiceinteraction/VoiceInteractionSessionConnection$5;
-Lcom/android/server/voiceinteraction/VoiceInteractionSessionConnection$AssistDataForActivity;
-Lcom/android/server/voiceinteraction/VoiceInteractionSessionConnection$Callback;
-Lcom/android/server/vr/CompatibilityDisplay;
-Lcom/android/server/vr/CompatibilityDisplay$1;
-Lcom/android/server/vr/EnabledComponentsObserver;
-Lcom/android/server/vr/EnabledComponentsObserver$1;
-Lcom/android/server/vr/EnabledComponentsObserver$EnabledComponentChangeListener;
-Lcom/android/server/vr/SettingsObserver;
-Lcom/android/server/vr/SettingsObserver$1;
-Lcom/android/server/vr/SettingsObserver$2;
-Lcom/android/server/vr/SettingsObserver$SettingChangeListener;
-Lcom/android/server/vr/VrManagerInternal;
-Lcom/android/server/vr/VrManagerService;
-Lcom/android/server/vr/VrManagerService$1;
-Lcom/android/server/vr/VrManagerService$2;
-Lcom/android/server/vr/VrManagerService$3;
-Lcom/android/server/vr/VrManagerService$LocalService;
-Lcom/android/server/vr/VrManagerService$NotificationAccessManager;
-Lcom/android/server/vr/VrManagerService$VrState;
-Lcom/android/server/wallpaper/WallpaperManagerService;
-Lcom/android/server/wallpaper/WallpaperManagerService$1;
-Lcom/android/server/wallpaper/WallpaperManagerService$2;
-Lcom/android/server/wallpaper/WallpaperManagerService$3;
-Lcom/android/server/wallpaper/WallpaperManagerService$4;
-Lcom/android/server/wallpaper/WallpaperManagerService$Lifecycle;
-Lcom/android/server/wallpaper/WallpaperManagerService$MyPackageMonitor;
-Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection;
-Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;
-Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperObserver;
-Lcom/android/server/Watchdog;
-Lcom/android/server/Watchdog$BinderThreadMonitor;
-Lcom/android/server/Watchdog$HandlerChecker;
-Lcom/android/server/Watchdog$Monitor;
-Lcom/android/server/Watchdog$RebootRequestReceiver;
-Lcom/android/server/webkit/SystemImpl;
-Lcom/android/server/webkit/SystemImpl$LazyHolder;
-Lcom/android/server/webkit/SystemInterface;
-Lcom/android/server/webkit/WebViewUpdateService;
-Lcom/android/server/webkit/WebViewUpdateService$1;
-Lcom/android/server/webkit/WebViewUpdateService$BinderService;
-Lcom/android/server/webkit/WebViewUpdateServiceImpl;
-Lcom/android/server/webkit/WebViewUpdateServiceImpl$WebViewUpdater;
-Lcom/android/server/webkit/WebViewUpdateServiceImpl$WebViewUpdater$ProviderAndPackageInfo;
-Lcom/android/server/webkit/WebViewUpdateServiceImpl$WebViewUpdater$WebViewPackageMissingException;
-Lcom/android/server/WidgetBackupProvider;
-Lcom/android/server/wifi/BackupManagerProxy;
-Lcom/android/server/wifi/BaseWifiDiagnostics;
-Lcom/android/server/wifi/BuildProperties;
-Lcom/android/server/wifi/Clock;
-Lcom/android/server/wifi/ConfigurationMap;
-Lcom/android/server/wifi/ExternalScoreEvaluator;
-Lcom/android/server/wifi/FrameworkFacade;
-Lcom/android/server/wifi/HalDeviceManager;
-Lcom/android/server/wifi/HalDeviceManager$ManagerStatusListener;
-Lcom/android/server/wifi/HalDeviceManager$WifiEventCallback;
-Lcom/android/server/wifi/hotspot2/AnqpCache;
-Lcom/android/server/wifi/hotspot2/anqp/Constants$ANQPElementType;
-Lcom/android/server/wifi/hotspot2/ANQPRequestManager;
-Lcom/android/server/wifi/hotspot2/NetworkDetail;
-Lcom/android/server/wifi/hotspot2/NetworkDetail$Ant;
-Lcom/android/server/wifi/hotspot2/NetworkDetail$HSRelease;
-Lcom/android/server/wifi/hotspot2/PasspointEventHandler;
-Lcom/android/server/wifi/hotspot2/PasspointEventHandler$Callbacks;
-Lcom/android/server/wifi/hotspot2/PasspointManager;
-Lcom/android/server/wifi/hotspot2/PasspointManager$CallbackHandler;
-Lcom/android/server/wifi/hotspot2/PasspointNetworkEvaluator;
-Lcom/android/server/wifi/hotspot2/PasspointObjectFactory;
-Lcom/android/server/wifi/hotspot2/Utils;
-Lcom/android/server/wifi/LastMileLogger;
-Lcom/android/server/wifi/LogcatLog;
-Lcom/android/server/wifi/LogcatLog$RealLogMessage;
-Lcom/android/server/wifi/nano/WifiMetricsProto$AlertReasonCount;
-Lcom/android/server/wifi/nano/WifiMetricsProto$ConnectionEvent;
-Lcom/android/server/wifi/nano/WifiMetricsProto$RouterFingerPrint;
-Lcom/android/server/wifi/nano/WifiMetricsProto$RssiPollCount;
-Lcom/android/server/wifi/nano/WifiMetricsProto$SoftApDurationBucket;
-Lcom/android/server/wifi/nano/WifiMetricsProto$SoftApReturnCodeCount;
-Lcom/android/server/wifi/nano/WifiMetricsProto$WifiLog;
-Lcom/android/server/wifi/nano/WifiMetricsProto$WifiLog$ScanReturnEntry;
-Lcom/android/server/wifi/nano/WifiMetricsProto$WifiLog$WifiSystemStateEntry;
-Lcom/android/server/wifi/nano/WifiMetricsProto$WifiScoreCount;
-Lcom/android/server/wifi/p2p/WifiP2pService;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$1;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$ClientHandler;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$1;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$DefaultState;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$FrequencyConflictState;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$GroupCreatedState;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$GroupCreatingState;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$GroupNegotiationState;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$InactiveState;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$OngoingGroupRemovalState;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$P2pDisabledState;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$P2pDisablingState;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$P2pEnabledState;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$P2pEnablingState;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$P2pNotSupportedState;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$ProvisionDiscoveryState;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$UserAuthorizingInviteRequestState;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$UserAuthorizingJoinState;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$UserAuthorizingNegotiationRequestState;
-Lcom/android/server/wifi/PropertyService;
-Lcom/android/server/wifi/RecommendedNetworkEvaluator;
-Lcom/android/server/wifi/RecommendedNetworkEvaluator$1;
-Lcom/android/server/wifi/RttService;
-Lcom/android/server/wifi/RttService$RttServiceImpl;
-Lcom/android/server/wifi/RttService$RttServiceImpl$1;
-Lcom/android/server/wifi/RttService$RttServiceImpl$2;
-Lcom/android/server/wifi/RttService$RttServiceImpl$ClientHandler;
-Lcom/android/server/wifi/RttService$RttServiceImpl$ClientInfo;
-Lcom/android/server/wifi/RttService$RttServiceImpl$InterfaceEventHandler;
-Lcom/android/server/wifi/RttService$RttServiceImpl$RttStateMachine;
-Lcom/android/server/wifi/RttService$RttServiceImpl$RttStateMachine$DefaultState;
-Lcom/android/server/wifi/RttService$RttServiceImpl$RttStateMachine$EnabledState;
-Lcom/android/server/wifi/RttService$RttServiceImpl$RttStateMachine$InitiatorEnabledState;
-Lcom/android/server/wifi/RttService$RttServiceImpl$RttStateMachine$ResponderEnabledState;
-Lcom/android/server/wifi/SavedNetworkEvaluator;
-Lcom/android/server/wifi/SavedNetworkEvaluator$1;
-Lcom/android/server/wifi/ScanDetail;
-Lcom/android/server/wifi/ScanDetailCache;
-Lcom/android/server/wifi/scanner/BackgroundScanScheduler;
-Lcom/android/server/wifi/scanner/BackgroundScanScheduler$Bucket;
-Lcom/android/server/wifi/scanner/BackgroundScanScheduler$BucketList;
-Lcom/android/server/wifi/scanner/BackgroundScanScheduler$BucketList$1;
-Lcom/android/server/wifi/scanner/ChannelHelper;
-Lcom/android/server/wifi/scanner/ChannelHelper$ChannelCollection;
-Lcom/android/server/wifi/scanner/HalChannelHelper;
-Lcom/android/server/wifi/scanner/HalWifiScannerImpl;
-Lcom/android/server/wifi/scanner/KnownBandsChannelHelper;
-Lcom/android/server/wifi/scanner/KnownBandsChannelHelper$KnownBandsChannelCollection;
-Lcom/android/server/wifi/scanner/ScanScheduleUtil;
-Lcom/android/server/wifi/scanner/SupplicantWifiScannerImpl;
-Lcom/android/server/wifi/scanner/SupplicantWifiScannerImpl$1;
-Lcom/android/server/wifi/scanner/SupplicantWifiScannerImpl$2;
-Lcom/android/server/wifi/scanner/SupplicantWifiScannerImpl$3;
-Lcom/android/server/wifi/scanner/SupplicantWifiScannerImpl$ChangeBuffer;
-Lcom/android/server/wifi/scanner/SupplicantWifiScannerImpl$HwPnoDebouncer;
-Lcom/android/server/wifi/scanner/SupplicantWifiScannerImpl$HwPnoDebouncer$1;
-Lcom/android/server/wifi/scanner/SupplicantWifiScannerImpl$HwPnoDebouncer$Listener;
-Lcom/android/server/wifi/scanner/SupplicantWifiScannerImpl$LastScanSettings;
-Lcom/android/server/wifi/scanner/SupplicantWifiScannerImpl$ScanBuffer;
-Lcom/android/server/wifi/scanner/WifiScannerImpl;
-Lcom/android/server/wifi/scanner/WifiScannerImpl$1;
-Lcom/android/server/wifi/scanner/WifiScannerImpl$2;
-Lcom/android/server/wifi/scanner/WifiScannerImpl$WifiScannerImplFactory;
-Lcom/android/server/wifi/scanner/WifiScanningService;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$1;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$ClientHandler;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$ClientInfo;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$ExternalClientInfo;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$RequestInfo;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$RequestList;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiBackgroundScanStateMachine;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiBackgroundScanStateMachine$DefaultState;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiBackgroundScanStateMachine$PausedState;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiBackgroundScanStateMachine$StartedState;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiChangeStateMachine;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiChangeStateMachine$DefaultState;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiChangeStateMachine$MovingState;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiChangeStateMachine$StationaryState;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiPnoScanStateMachine;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiPnoScanStateMachine$DefaultState;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiPnoScanStateMachine$HwPnoScanState;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiPnoScanStateMachine$SingleScanState;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiPnoScanStateMachine$StartedState;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiPnoScanStateMachine$SwPnoScanState;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine$DefaultState;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine$DriverStartedState;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine$IdleState;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine$ScanningState;
-Lcom/android/server/wifi/SIMAccessor;
-Lcom/android/server/wifi/StateChangeResult;
-Lcom/android/server/wifi/StateMachineDeathRecipient;
-Lcom/android/server/wifi/SupplicantStateTracker;
-Lcom/android/server/wifi/SupplicantStateTracker$CompletedState;
-Lcom/android/server/wifi/SupplicantStateTracker$ConnectionActiveState;
-Lcom/android/server/wifi/SupplicantStateTracker$DefaultState;
-Lcom/android/server/wifi/SupplicantStateTracker$DisconnectedState;
-Lcom/android/server/wifi/SupplicantStateTracker$DormantState;
-Lcom/android/server/wifi/SupplicantStateTracker$HandshakeState;
-Lcom/android/server/wifi/SupplicantStateTracker$InactiveState;
-Lcom/android/server/wifi/SupplicantStateTracker$ScanState;
-Lcom/android/server/wifi/SupplicantStateTracker$UninitializedState;
-Lcom/android/server/wifi/SystemBuildProperties;
-Lcom/android/server/wifi/SystemPropertyService;
-Lcom/android/server/wifi/util/ByteArrayRingBuffer;
-Lcom/android/server/wifi/util/InformationElementUtil;
-Lcom/android/server/wifi/util/InformationElementUtil$BssLoad;
-Lcom/android/server/wifi/util/InformationElementUtil$Capabilities;
-Lcom/android/server/wifi/util/InformationElementUtil$ExtendedCapabilities;
-Lcom/android/server/wifi/util/InformationElementUtil$HtOperation;
-Lcom/android/server/wifi/util/InformationElementUtil$Interworking;
-Lcom/android/server/wifi/util/InformationElementUtil$RoamingConsortium;
-Lcom/android/server/wifi/util/InformationElementUtil$SupportedRates;
-Lcom/android/server/wifi/util/InformationElementUtil$TrafficIndicationMap;
-Lcom/android/server/wifi/util/InformationElementUtil$VhtOperation;
-Lcom/android/server/wifi/util/InformationElementUtil$Vsa;
-Lcom/android/server/wifi/util/InformationElementUtil$WifiMode;
-Lcom/android/server/wifi/util/ScanResultUtil;
-Lcom/android/server/wifi/util/TelephonyUtil;
-Lcom/android/server/wifi/util/TelephonyUtil$SimAuthRequestData;
-Lcom/android/server/wifi/util/TelephonyUtil$SimAuthResponseData;
-Lcom/android/server/wifi/util/WifiAsyncChannel;
-Lcom/android/server/wifi/util/WifiHandler;
-Lcom/android/server/wifi/util/WifiPermissionsUtil;
-Lcom/android/server/wifi/util/WifiPermissionsWrapper;
-Lcom/android/server/wifi/util/XmlUtil;
-Lcom/android/server/wifi/util/XmlUtil$IpConfigurationXmlUtil;
-Lcom/android/server/wifi/util/XmlUtil$NetworkSelectionStatusXmlUtil;
-Lcom/android/server/wifi/util/XmlUtil$WifiConfigurationXmlUtil;
-Lcom/android/server/wifi/WifiApConfigStore;
-Lcom/android/server/wifi/WifiBackupRestore;
-Lcom/android/server/wifi/WifiCertManager;
-Lcom/android/server/wifi/WifiCertManager$1;
-Lcom/android/server/wifi/WifiConfigManager;
-Lcom/android/server/wifi/WifiConfigManager$1;
-Lcom/android/server/wifi/WifiConfigStore;
-Lcom/android/server/wifi/WifiConfigStore$1;
-Lcom/android/server/wifi/WifiConfigStoreData;
-Lcom/android/server/wifi/WifiConfigStoreData$SharedData;
-Lcom/android/server/wifi/WifiConfigStoreData$UserData;
-Lcom/android/server/wifi/WifiConfigStoreLegacy;
-Lcom/android/server/wifi/WifiConfigStore$StoreFile;
-Lcom/android/server/wifi/WifiConfigurationUtil;
-Lcom/android/server/wifi/WifiConfigurationUtil$WifiConfigurationComparator;
-Lcom/android/server/wifi/WifiConnectivityManager;
-Lcom/android/server/wifi/WifiConnectivityManager$1;
-Lcom/android/server/wifi/WifiConnectivityManager$2;
-Lcom/android/server/wifi/WifiConnectivityManager$3;
-Lcom/android/server/wifi/WifiConnectivityManager$AllSingleScanListener;
-Lcom/android/server/wifi/WifiConnectivityManager$PnoScanListener;
-Lcom/android/server/wifi/WifiConnectivityManager$SingleScanListener;
-Lcom/android/server/wifi/WifiController;
-Lcom/android/server/wifi/WifiController$1;
-Lcom/android/server/wifi/WifiController$2;
-Lcom/android/server/wifi/WifiController$3;
-Lcom/android/server/wifi/WifiController$4;
-Lcom/android/server/wifi/WifiController$ApEnabledState;
-Lcom/android/server/wifi/WifiController$ApStaDisabledState;
-Lcom/android/server/wifi/WifiController$DefaultState;
-Lcom/android/server/wifi/WifiController$DeviceActiveState;
-Lcom/android/server/wifi/WifiController$DeviceInactiveState;
-Lcom/android/server/wifi/WifiController$EcmState;
-Lcom/android/server/wifi/WifiController$FullHighPerfLockHeldState;
-Lcom/android/server/wifi/WifiController$FullLockHeldState;
-Lcom/android/server/wifi/WifiController$NoLockHeldState;
-Lcom/android/server/wifi/WifiController$ScanOnlyLockHeldState;
-Lcom/android/server/wifi/WifiController$StaDisabledWithScanState;
-Lcom/android/server/wifi/WifiController$StaEnabledState;
-Lcom/android/server/wifi/WifiCountryCode;
-Lcom/android/server/wifi/WifiDiagnostics;
-Lcom/android/server/wifi/WifiDiagnostics$1;
-Lcom/android/server/wifi/WifiDiagnostics$LimitedCircularArray;
-Lcom/android/server/wifi/WifiInjector;
-Lcom/android/server/wifi/WifiKeyStore;
-Lcom/android/server/wifi/WifiLastResortWatchdog;
-Lcom/android/server/wifi/WifiLastResortWatchdog$AvailableNetworkFailureCount;
-Lcom/android/server/wifi/WifiLockManager;
-Lcom/android/server/wifi/WifiLockManager$WifiLock;
-Lcom/android/server/wifi/WifiLog;
-Lcom/android/server/wifi/WifiLog$LogMessage;
-Lcom/android/server/wifi/WifiMetrics;
-Lcom/android/server/wifi/WifiMetrics$ConnectionEvent;
-Lcom/android/server/wifi/WifiMetrics$RouterFingerPrint;
-Lcom/android/server/wifi/WifiMonitor;
-Lcom/android/server/wifi/WifiMonitor$1;
-Lcom/android/server/wifi/WifiMonitor$MonitorThread;
-Lcom/android/server/wifi/WifiMulticastLockManager;
-Lcom/android/server/wifi/WifiMulticastLockManager$FilterController;
-Lcom/android/server/wifi/WifiMulticastLockManager$Multicaster;
-Lcom/android/server/wifi/WifiNative;
-Lcom/android/server/wifi/WifiNative$BucketSettings;
-Lcom/android/server/wifi/WifiNative$ChannelSettings;
-Lcom/android/server/wifi/WifiNative$HotlistEventHandler;
-Lcom/android/server/wifi/WifiNative$MonitorThread;
-Lcom/android/server/wifi/WifiNative$PnoEventHandler;
-Lcom/android/server/wifi/WifiNative$RingBufferStatus;
-Lcom/android/server/wifi/WifiNative$RttEventHandler;
-Lcom/android/server/wifi/WifiNative$ScanCapabilities;
-Lcom/android/server/wifi/WifiNative$ScanEventHandler;
-Lcom/android/server/wifi/WifiNative$ScanSettings;
-Lcom/android/server/wifi/WifiNative$SignificantWifiChangeEventHandler;
-Lcom/android/server/wifi/WifiNative$WifiLoggerEventHandler;
-Lcom/android/server/wifi/WifiNative$WifiRssiEventHandler;
-Lcom/android/server/wifi/WifiNetworkHistory;
-Lcom/android/server/wifi/WifiNetworkHistory$1;
-Lcom/android/server/wifi/WifiNetworkSelector;
-Lcom/android/server/wifi/WifiNetworkSelector$BssidBlacklistStatus;
-Lcom/android/server/wifi/WifiNetworkSelector$NetworkEvaluator;
-Lcom/android/server/wifi/WifiScoreReport;
-Lcom/android/server/wifi/WifiService;
-Lcom/android/server/wifi/WifiServiceImpl;
-Lcom/android/server/wifi/WifiServiceImpl$1;
-Lcom/android/server/wifi/WifiServiceImpl$2;
-Lcom/android/server/wifi/WifiServiceImpl$3;
-Lcom/android/server/wifi/WifiServiceImpl$4;
-Lcom/android/server/wifi/WifiServiceImpl$5;
-Lcom/android/server/wifi/WifiServiceImpl$ClientHandler;
-Lcom/android/server/wifi/WifiServiceImpl$WifiStateMachineHandler;
-Lcom/android/server/wifi/WifiSettingsStore;
-Lcom/android/server/wifi/WifiStateMachine;
-Lcom/android/server/wifi/WifiStateMachine$1;
-Lcom/android/server/wifi/WifiStateMachine$2;
-Lcom/android/server/wifi/WifiStateMachine$3;
-Lcom/android/server/wifi/WifiStateMachine$4;
-Lcom/android/server/wifi/WifiStateMachine$ConnectedState;
-Lcom/android/server/wifi/WifiStateMachine$ConnectModeState;
-Lcom/android/server/wifi/WifiStateMachine$DefaultState;
-Lcom/android/server/wifi/WifiStateMachine$DisconnectedState;
-Lcom/android/server/wifi/WifiStateMachine$DisconnectingState;
-Lcom/android/server/wifi/WifiStateMachine$InitialState;
-Lcom/android/server/wifi/WifiStateMachine$IpManagerCallback;
-Lcom/android/server/wifi/WifiStateMachine$L2ConnectedState;
-Lcom/android/server/wifi/WifiStateMachine$ObtainingIpState;
-Lcom/android/server/wifi/WifiStateMachine$RoamingState;
-Lcom/android/server/wifi/WifiStateMachine$ScanModeState;
-Lcom/android/server/wifi/WifiStateMachine$SoftApState;
-Lcom/android/server/wifi/WifiStateMachine$SupplicantStartedState;
-Lcom/android/server/wifi/WifiStateMachine$SupplicantStartingState;
-Lcom/android/server/wifi/WifiStateMachine$SupplicantStoppingState;
-Lcom/android/server/wifi/WifiStateMachine$UntrustedWifiNetworkFactory;
-Lcom/android/server/wifi/WifiStateMachine$WaitForP2pDisableState;
-Lcom/android/server/wifi/WifiStateMachine$WifiNetworkAgent;
-Lcom/android/server/wifi/WifiStateMachine$WifiNetworkFactory;
-Lcom/android/server/wifi/WifiStateMachine$WpsRunningState;
-Lcom/android/server/wifi/WifiSupplicantControl;
-Lcom/android/server/wifi/WifiSupplicantControl$WpaConfigFileObserver;
-Lcom/android/server/wifi/WifiSupplicantHal;
-Lcom/android/server/wifi/WifiSupplicantHal$HalDeviceManagerStatusListener;
-Lcom/android/server/wifi/WifiTrafficPoller;
-Lcom/android/server/wifi/WifiTrafficPoller$1;
-Lcom/android/server/wifi/WifiTrafficPoller$TrafficHandler;
-Lcom/android/server/wifi/WifiVendorHal;
-Lcom/android/server/wifi/WifiVendorHal$HalDeviceManagerStatusListener;
-Lcom/android/server/WiredAccessoryManager;
-Lcom/android/server/WiredAccessoryManager$1;
-Lcom/android/server/WiredAccessoryManager$WiredAccessoryObserver;
-Lcom/android/server/WiredAccessoryManager$WiredAccessoryObserver$UEventInfo;
-Lcom/android/server/wm/animation/ClipRectLRAnimation;
-Lcom/android/server/wm/animation/ClipRectTBAnimation;
-Lcom/android/server/wm/AppTokenList;
-Lcom/android/server/wm/AppTransition;
-Lcom/android/server/wm/AppTransition$1;
-Lcom/android/server/wm/AppTransition$2;
-Lcom/android/server/wm/AppTransition$4;
-Lcom/android/server/wm/AppWindowAnimator;
-Lcom/android/server/wm/AppWindowAnimator$DummyAnimation;
-Lcom/android/server/wm/AppWindowContainerController;
-Lcom/android/server/wm/AppWindowContainerListener;
-Lcom/android/server/wm/AppWindowToken;
-Lcom/android/server/wm/BlackFrame;
-Lcom/android/server/wm/BlackFrame$BlackSurface;
-Lcom/android/server/wm/BoundsAnimationController;
-Lcom/android/server/wm/BoundsAnimationController$AnimateBoundsUser;
-Lcom/android/server/wm/BoundsAnimationController$AppTransitionNotifier;
-Lcom/android/server/wm/DimLayer;
-Lcom/android/server/wm/DimLayerController;
-Lcom/android/server/wm/DimLayerController$DimLayerState;
-Lcom/android/server/wm/DimLayer$DimLayerUser;
-Lcom/android/server/wm/DisplayContent;
-Lcom/android/server/wm/DisplayContent$ApplySurfaceChangesTransactionState;
-Lcom/android/server/wm/DisplayContent$DisplayChildWindowContainer;
-Lcom/android/server/wm/DisplayContent$NonAppWindowContainers;
-Lcom/android/server/wm/DisplayContent$ScreenshotApplicationState;
-Lcom/android/server/wm/DisplayContent$Screenshoter;
-Lcom/android/server/wm/DisplayContent$TaskForResizePointSearchResult;
-Lcom/android/server/wm/DisplayContent$TaskStackContainers;
-Lcom/android/server/wm/DisplaySettings;
-Lcom/android/server/wm/DisplaySettings$Entry;
-Lcom/android/server/wm/DockedStackDividerController;
-Lcom/android/server/wm/InputConsumerImpl;
-Lcom/android/server/wm/InputMonitor;
-Lcom/android/server/wm/InputMonitor$UpdateInputForAllWindowsConsumer;
-Lcom/android/server/wm/KeyguardDisableHandler;
-Lcom/android/server/wm/nano/WindowManagerProtos$TaskSnapshotProto;
-Lcom/android/server/wm/PinnedStackController;
-Lcom/android/server/wm/PinnedStackController$PinnedStackControllerCallback;
-Lcom/android/server/wm/PinnedStackController$PinnedStackListenerDeathHandler;
-Lcom/android/server/wm/PointerEventDispatcher;
-Lcom/android/server/wm/RootWindowContainer;
-Lcom/android/server/wm/ScreenRotationAnimation;
-Lcom/android/server/wm/Session;
-Lcom/android/server/wm/SnapshotStartingData;
-Lcom/android/server/wm/SplashScreenStartingData;
-Lcom/android/server/wm/StackWindowController;
-Lcom/android/server/wm/StackWindowController$H;
-Lcom/android/server/wm/StackWindowListener;
-Lcom/android/server/wm/StartingData;
-Lcom/android/server/wm/Task;
-Lcom/android/server/wm/TaskSnapshotCache;
-Lcom/android/server/wm/TaskSnapshotCache$CacheEntry;
-Lcom/android/server/wm/TaskSnapshotController;
-Lcom/android/server/wm/TaskSnapshotLoader;
-Lcom/android/server/wm/TaskSnapshotPersister;
-Lcom/android/server/wm/TaskSnapshotPersister$1;
-Lcom/android/server/wm/TaskSnapshotPersister$DeleteWriteQueueItem;
-Lcom/android/server/wm/TaskSnapshotPersister$DirectoryResolver;
-Lcom/android/server/wm/TaskSnapshotPersister$RemoveObsoleteFilesQueueItem;
-Lcom/android/server/wm/TaskSnapshotPersister$StoreWriteQueueItem;
-Lcom/android/server/wm/TaskSnapshotPersister$WriteQueueItem;
-Lcom/android/server/wm/TaskSnapshotSurface;
-Lcom/android/server/wm/TaskSnapshotSurface$1;
-Lcom/android/server/wm/TaskSnapshotSurface$Window;
-Lcom/android/server/wm/TaskStack;
-Lcom/android/server/wm/TaskTapPointerEventListener;
-Lcom/android/server/wm/TaskWindowContainerController;
-Lcom/android/server/wm/TaskWindowContainerController$H;
-Lcom/android/server/wm/TaskWindowContainerListener;
-Lcom/android/server/wm/UnknownAppVisibilityController;
-Lcom/android/server/wm/WallpaperController;
-Lcom/android/server/wm/WallpaperController$FindWallpaperTargetResult;
-Lcom/android/server/wm/WallpaperWindowToken;
-Lcom/android/server/wm/WindowAnimator;
-Lcom/android/server/wm/WindowAnimator$1;
-Lcom/android/server/wm/WindowAnimator$DisplayContentsAnimator;
-Lcom/android/server/wm/WindowContainer;
-Lcom/android/server/wm/WindowContainerController;
-Lcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;
-Lcom/android/server/wm/WindowContainerListener;
-Lcom/android/server/wm/WindowLayersController;
-Lcom/android/server/wm/WindowManagerService;
-Lcom/android/server/wm/WindowManagerService$1;
-Lcom/android/server/wm/WindowManagerService$2;
-Lcom/android/server/wm/WindowManagerService$3;
-Lcom/android/server/wm/WindowManagerService$4;
-Lcom/android/server/wm/WindowManagerService$6;
-Lcom/android/server/wm/WindowManagerService$AppFreezeListener;
-Lcom/android/server/wm/WindowManagerService$H;
-Lcom/android/server/wm/WindowManagerService$LocalService;
-Lcom/android/server/wm/WindowManagerService$MousePositionTracker;
-Lcom/android/server/wm/WindowManagerService$RotationWatcher;
-Lcom/android/server/wm/WindowManagerService$SettingsObserver;
-Lcom/android/server/wm/WindowState;
-Lcom/android/server/wm/WindowState$1;
-Lcom/android/server/wm/WindowState$2;
-Lcom/android/server/wm/WindowState$3;
-Lcom/android/server/wm/WindowStateAnimator;
-Lcom/android/server/wm/WindowState$DeathRecipient;
-Lcom/android/server/wm/WindowState$UpdateReportedVisibilityResults;
-Lcom/android/server/wm/WindowSurfaceController;
-Lcom/android/server/wm/WindowSurfaceController$SurfaceControlWithBackground;
-Lcom/android/server/wm/WindowSurfacePlacer;
-Lcom/android/server/wm/WindowSurfacePlacer$LayerAndToken;
-Lcom/android/server/wm/WindowToken;
-Lcom/google/android/collect/Lists;
-Lcom/google/android/collect/Maps;
-Lcom/google/android/collect/Sets;
-Lcom/google/android/gles_jni/EGLImpl;
-Lcom/google/android/gles_jni/GLImpl;
-Lcom/google/protobuf/nano/InvalidProtocolBufferNanoException;
-Lcom/google/protobuf/nano/MessageNano;
-LD;
-Ldalvik/annotation/optimization/CriticalNative;
-Ldalvik/annotation/optimization/FastNative;
-Ldalvik/system/BaseDexClassLoader;
-Ldalvik/system/BaseDexClassLoader$Reporter;
-Ldalvik/system/BlockGuard;
-Ldalvik/system/BlockGuard$1;
-Ldalvik/system/BlockGuard$2;
-Ldalvik/system/BlockGuard$BlockGuardPolicyException;
-Ldalvik/system/BlockGuard$Policy;
-Ldalvik/system/ClassExt;
-Ldalvik/system/CloseGuard;
-Ldalvik/system/CloseGuard$DefaultReporter;
-Ldalvik/system/CloseGuard$DefaultTracker;
-Ldalvik/system/CloseGuard$Reporter;
-Ldalvik/system/CloseGuard$Tracker;
-Ldalvik/system/DalvikLogHandler;
-Ldalvik/system/DexClassLoader;
-Ldalvik/system/DexFile;
-Ldalvik/system/DexFile$DFEnum;
-Ldalvik/system/DexPathList;
-Ldalvik/system/DexPathList$Element;
-Ldalvik/system/DexPathList$NativeLibraryElement;
-Ldalvik/system/EmulatedStackFrame;
-Ldalvik/system/EmulatedStackFrame$Range;
-Ldalvik/system/InMemoryDexClassLoader$DexData;
-Ldalvik/system/PathClassLoader;
-Ldalvik/system/SocketTagger;
-Ldalvik/system/SocketTagger$1;
-Ldalvik/system/VMDebug;
-Ldalvik/system/VMRuntime;
-Ldalvik/system/VMStack;
-Ldalvik/system/ZygoteHooks;
-LF;
-LI;
-LJ;
-Ljava/io/Bits;
-Ljava/io/BufferedInputStream;
-Ljava/io/BufferedOutputStream;
-Ljava/io/BufferedReader;
-Ljava/io/BufferedWriter;
-Ljava/io/ByteArrayInputStream;
-Ljava/io/ByteArrayOutputStream;
-Ljava/io/CharArrayWriter;
-Ljava/io/Closeable;
-Ljava/io/Console;
-Ljava/io/DataInput;
-Ljava/io/DataInputStream;
-Ljava/io/DataOutput;
-Ljava/io/DataOutputStream;
-Ljava/io/DefaultFileSystem;
-Ljava/io/EOFException;
-Ljava/io/ExpiringCache;
-Ljava/io/ExpiringCache$1;
-Ljava/io/ExpiringCache$Entry;
-Ljava/io/Externalizable;
-Ljava/io/File;
-Ljava/io/FileDescriptor;
-Ljava/io/FileDescriptor$1;
-Ljava/io/FileInputStream;
-Ljava/io/FileInputStream$UseManualSkipException;
-Ljava/io/FilenameFilter;
-Ljava/io/FileNotFoundException;
-Ljava/io/FileOutputStream;
-Ljava/io/File$PathStatus;
-Ljava/io/FileReader;
-Ljava/io/FileSystem;
-Ljava/io/File$TempDirectory;
-Ljava/io/FileWriter;
-Ljava/io/FilterInputStream;
-Ljava/io/FilterOutputStream;
-Ljava/io/Flushable;
-Ljava/io/InputStream;
-Ljava/io/InputStreamReader;
-Ljava/io/InterruptedIOException;
-Ljava/io/InvalidObjectException;
-Ljava/io/IOException;
-Ljava/io/ObjectInput;
-Ljava/io/ObjectInputStream;
-Ljava/io/ObjectInputStream$BlockDataInputStream;
-Ljava/io/ObjectInputStream$HandleTable;
-Ljava/io/ObjectInputStream$HandleTable$HandleList;
-Ljava/io/ObjectInputStream$PeekInputStream;
-Ljava/io/ObjectInputStream$ValidationList;
-Ljava/io/ObjectOutput;
-Ljava/io/ObjectOutputStream;
-Ljava/io/ObjectOutputStream$PutField;
-Ljava/io/ObjectStreamClass;
-Ljava/io/ObjectStreamConstants;
-Ljava/io/ObjectStreamException;
-Ljava/io/ObjectStreamField;
-Ljava/io/OutputStream;
-Ljava/io/OutputStreamWriter;
-Ljava/io/PrintStream;
-Ljava/io/PrintWriter;
-Ljava/io/PushbackInputStream;
-Ljava/io/RandomAccessFile;
-Ljava/io/Reader;
-Ljava/io/Serializable;
-Ljava/io/SerializablePermission;
-Ljava/io/StringWriter;
-Ljava/io/UnixFileSystem;
-Ljava/io/UnsupportedEncodingException;
-Ljava/io/UTFDataFormatException;
-Ljava/io/Writer;
-Ljava/lang/AbstractMethodError;
-Ljava/lang/AbstractStringBuilder;
-Ljava/lang/AndroidHardcodedSystemProperties;
-Ljava/lang/annotation/Annotation;
-Ljava/lang/annotation/AnnotationTypeMismatchException;
-Ljava/lang/annotation/IncompleteAnnotationException;
-Ljava/lang/annotation/Inherited;
-Ljava/lang/Appendable;
-Ljava/lang/ArithmeticException;
-Ljava/lang/ArrayIndexOutOfBoundsException;
-Ljava/lang/ArrayStoreException;
-Ljava/lang/AssertionError;
-Ljava/lang/AutoCloseable;
-Ljava/lang/Boolean;
-Ljava/lang/BootClassLoader;
-Ljava/lang/Byte;
-Ljava/lang/Byte$ByteCache;
-Ljava/lang/CaseMapper;
-Ljava/lang/CaseMapper$1;
-Ljava/lang/Character;
-Ljava/lang/Character$CharacterCache;
-Ljava/lang/Character$Subset;
-Ljava/lang/Character$UnicodeBlock;
-Ljava/lang/CharSequence;
-Ljava/lang/CharSequence$1CharIterator;
-Ljava/lang/CharSequence$1CodePointIterator;
-Ljava/lang/Class;
-Ljava/lang/Class$Caches;
-Ljava/lang/ClassCastException;
-Ljava/lang/ClassLoader;
-Ljava/lang/ClassLoader$SystemClassLoader;
-Ljava/lang/ClassNotFoundException;
-Ljava/lang/Cloneable;
-Ljava/lang/CloneNotSupportedException;
-Ljava/lang/Comparable;
-Ljava/lang/Daemons;
-Ljava/lang/Daemons$Daemon;
-Ljava/lang/Daemons$FinalizerDaemon;
-Ljava/lang/Daemons$FinalizerWatchdogDaemon;
-Ljava/lang/Daemons$HeapTaskDaemon;
-Ljava/lang/Daemons$ReferenceQueueDaemon;
-Ljava/lang/DexCache;
-Ljava/lang/Double;
-Ljava/lang/Enum;
-Ljava/lang/Enum$1;
-Ljava/lang/EnumConstantNotPresentException;
-Ljava/lang/Error;
-Ljava/lang/Exception;
-Ljava/lang/ExceptionInInitializerError;
-Ljava/lang/Float;
-Ljava/lang/IllegalAccessError;
-Ljava/lang/IllegalAccessException;
-Ljava/lang/IllegalArgumentException;
-Ljava/lang/IllegalStateException;
-Ljava/lang/IllegalThreadStateException;
-Ljava/lang/IncompatibleClassChangeError;
-Ljava/lang/IndexOutOfBoundsException;
-Ljava/lang/InheritableThreadLocal;
-Ljava/lang/InstantiationException;
-Ljava/lang/Integer;
-Ljava/lang/Integer$IntegerCache;
-Ljava/lang/InternalError;
-Ljava/lang/InterruptedException;
-Ljava/lang/invoke/MethodHandle;
-Ljava/lang/invoke/MethodHandleImpl;
-Ljava/lang/invoke/MethodHandleImpl$HandleInfo;
-Ljava/lang/invoke/MethodHandleInfo;
-Ljava/lang/invoke/MethodHandles;
-Ljava/lang/invoke/MethodHandleStatics;
-Ljava/lang/invoke/MethodType;
-Ljava/lang/invoke/MethodType$ConcurrentWeakInternSet;
-Ljava/lang/invoke/MethodType$ConcurrentWeakInternSet$WeakEntry;
-Ljava/lang/invoke/MethodTypeForm;
-Ljava/lang/invoke/Transformers$BindTo;
-Ljava/lang/invoke/Transformers$Collector;
-Ljava/lang/invoke/Transformers$Spreader;
-Ljava/lang/invoke/Transformers$Transformer;
-Ljava/lang/invoke/Transformers$VarargsCollector;
-Ljava/lang/invoke/WrongMethodTypeException;
-Ljava/lang/Iterable;
-Ljava/lang/JavaLangAccess;
-Ljava/lang/LinkageError;
-Ljava/lang/Long;
-Ljava/lang/Long$LongCache;
-Ljava/lang/Math;
-Ljava/lang/Math$RandomNumberGeneratorHolder;
-Ljava/lang/NoClassDefFoundError;
-Ljava/lang/NoSuchFieldError;
-Ljava/lang/NoSuchFieldException;
-Ljava/lang/NoSuchMethodError;
-Ljava/lang/NoSuchMethodException;
-Ljava/lang/NullPointerException;
-Ljava/lang/Number;
-Ljava/lang/NumberFormatException;
-Ljava/lang/Object;
-Ljava/lang/OutOfMemoryError;
-Ljava/lang/Package;
-Ljava/lang/Process;
-Ljava/lang/ProcessBuilder;
-Ljava/lang/ProcessEnvironment;
-Ljava/lang/Readable;
-Ljava/lang/ref/FinalizerReference;
-Ljava/lang/ref/FinalizerReference$Sentinel;
-Ljava/lang/reflect/AccessibleObject;
-Ljava/lang/reflect/AnnotatedElement;
-Ljava/lang/reflect/Array;
-Ljava/lang/reflect/Constructor;
-Ljava/lang/reflect/Executable;
-Ljava/lang/reflect/Executable$GenericInfo;
-Ljava/lang/reflect/Field;
-Ljava/lang/reflect/GenericDeclaration;
-Ljava/lang/reflect/InvocationHandler;
-Ljava/lang/reflect/InvocationTargetException;
-Ljava/lang/ReflectiveOperationException;
-Ljava/lang/reflect/MalformedParametersException;
-Ljava/lang/reflect/Member;
-Ljava/lang/reflect/Method;
-Ljava/lang/reflect/Method$1;
-Ljava/lang/reflect/Modifier;
-Ljava/lang/reflect/Parameter;
-Ljava/lang/reflect/ParameterizedType;
-Ljava/lang/reflect/Proxy;
-Ljava/lang/reflect/Proxy$1;
-Ljava/lang/reflect/Proxy$Key1;
-Ljava/lang/reflect/Proxy$Key2;
-Ljava/lang/reflect/Proxy$KeyFactory;
-Ljava/lang/reflect/Proxy$KeyX;
-Ljava/lang/reflect/Proxy$ProxyClassFactory;
-Ljava/lang/reflect/Type;
-Ljava/lang/reflect/TypeVariable;
-Ljava/lang/reflect/WeakCache;
-Ljava/lang/reflect/WeakCache$CacheKey;
-Ljava/lang/reflect/WeakCache$Factory;
-Ljava/lang/reflect/WeakCache$LookupValue;
-Ljava/lang/reflect/WeakCache$Value;
-Ljava/lang/ref/PhantomReference;
-Ljava/lang/ref/Reference;
-Ljava/lang/ref/ReferenceQueue;
-Ljava/lang/ref/SoftReference;
-Ljava/lang/ref/WeakReference;
-Ljava/lang/Runnable;
-Ljava/lang/Runtime;
-Ljava/lang/RuntimeException;
-Ljava/lang/RuntimePermission;
-Ljava/lang/SecurityException;
-Ljava/lang/Short;
-Ljava/lang/Short$ShortCache;
-Ljava/lang/StackOverflowError;
-Ljava/lang/StackTraceElement;
-Ljava/lang/StrictMath;
-Ljava/lang/String;
-Ljava/lang/StringBuffer;
-Ljava/lang/StringBuilder;
-Ljava/lang/String$CaseInsensitiveComparator;
-Ljava/lang/StringFactory;
-Ljava/lang/StringIndexOutOfBoundsException;
-Ljava/lang/System;
-Ljava/lang/System$PropertiesWithNonOverrideableDefaults;
-Ljava/lang/Thread;
-Ljava/lang/Thread$1;
-Ljava/lang/Thread$Caches;
-Ljava/lang/ThreadDeath;
-Ljava/lang/ThreadGroup;
-Ljava/lang/ThreadLocal;
-Ljava/lang/ThreadLocal$ThreadLocalMap;
-Ljava/lang/ThreadLocal$ThreadLocalMap$Entry;
-Ljava/lang/Thread$State;
-Ljava/lang/Thread$UncaughtExceptionHandler;
-Ljava/lang/Thread$WeakClassKey;
-Ljava/lang/Throwable;
-Ljava/lang/Throwable$PrintStreamOrWriter;
-Ljava/lang/Throwable$SentinelHolder;
-Ljava/lang/Throwable$WrappedPrintStream;
-Ljava/lang/Throwable$WrappedPrintWriter;
-Ljava/lang/TypeNotPresentException;
-Ljava/lang/UNIXProcess;
-Ljava/lang/UnsatisfiedLinkError;
-Ljava/lang/UnsupportedOperationException;
-Ljava/lang/VirtualMachineError;
-Ljava/lang/VMClassLoader;
-Ljava/lang/Void;
-Ljava/math/BigInt;
-Ljava/math/BigInteger;
-Ljava/math/NativeBN;
-Ljava/math/RoundingMode;
-Ljava/net/AbstractPlainDatagramSocketImpl;
-Ljava/net/AbstractPlainSocketImpl;
-Ljava/net/AddressCache;
-Ljava/net/AddressCache$AddressCacheEntry;
-Ljava/net/AddressCache$AddressCacheKey;
-Ljava/net/ConnectException;
-Ljava/net/CookieHandler;
-Ljava/net/DatagramPacket;
-Ljava/net/DatagramSocket;
-Ljava/net/DatagramSocket$1;
-Ljava/net/DatagramSocketImpl;
-Ljava/net/DefaultDatagramSocketImplFactory;
-Ljava/net/DefaultInterface;
-Ljava/net/HttpURLConnection;
-Ljava/net/IDN;
-Ljava/net/Inet4Address;
-Ljava/net/Inet6Address;
-Ljava/net/Inet6AddressImpl;
-Ljava/net/Inet6Address$Inet6AddressHolder;
-Ljava/net/InetAddress;
-Ljava/net/InetAddress$1;
-Ljava/net/InetAddressImpl;
-Ljava/net/InetAddress$InetAddressHolder;
-Ljava/net/InetSocketAddress;
-Ljava/net/InetSocketAddress$InetSocketAddressHolder;
-Ljava/net/InterfaceAddress;
-Ljava/net/JarURLConnection;
-Ljava/net/MalformedURLException;
-Ljava/net/MulticastSocket;
-Ljava/net/NetworkInterface;
-Ljava/net/Parts;
-Ljava/net/PlainDatagramSocketImpl;
-Ljava/net/PlainSocketImpl;
-Ljava/net/ProtocolException;
-Ljava/net/Proxy;
-Ljava/net/ProxySelector;
-Ljava/net/Proxy$Type;
-Ljava/net/ResponseCache;
-Ljava/net/ServerSocket;
-Ljava/net/Socket;
-Ljava/net/Socket$2;
-Ljava/net/Socket$3;
-Ljava/net/SocketAddress;
-Ljava/net/SocketException;
-Ljava/net/SocketImpl;
-Ljava/net/SocketInputStream;
-Ljava/net/SocketOptions;
-Ljava/net/SocketOutputStream;
-Ljava/net/SocketTimeoutException;
-Ljava/net/SocksConsts;
-Ljava/net/SocksSocketImpl;
-Ljava/net/UnknownHostException;
-Ljava/net/URI;
-Ljava/net/URI$Parser;
-Ljava/net/URISyntaxException;
-Ljava/net/URL;
-Ljava/net/URLConnection;
-Ljava/net/URLEncoder;
-Ljava/net/URLStreamHandler;
-Ljava/net/URLStreamHandlerFactory;
-Ljava/nio/Bits;
-Ljava/nio/Buffer;
-Ljava/nio/BufferOverflowException;
-Ljava/nio/BufferUnderflowException;
-Ljava/nio/ByteBuffer;
-Ljava/nio/ByteBufferAsCharBuffer;
-Ljava/nio/ByteBufferAsDoubleBuffer;
-Ljava/nio/ByteBufferAsFloatBuffer;
-Ljava/nio/ByteBufferAsIntBuffer;
-Ljava/nio/ByteBufferAsLongBuffer;
-Ljava/nio/ByteBufferAsShortBuffer;
-Ljava/nio/ByteOrder;
-Ljava/nio/channels/AsynchronousCloseException;
-Ljava/nio/channels/ByteChannel;
-Ljava/nio/channels/Channel;
-Ljava/nio/channels/Channels;
-Ljava/nio/channels/ClosedByInterruptException;
-Ljava/nio/channels/ClosedChannelException;
-Ljava/nio/channels/DatagramChannel;
-Ljava/nio/channels/FileChannel;
-Ljava/nio/channels/FileChannel$MapMode;
-Ljava/nio/channels/GatheringByteChannel;
-Ljava/nio/channels/InterruptibleChannel;
-Ljava/nio/channels/MulticastChannel;
-Ljava/nio/channels/NetworkChannel;
-Ljava/nio/channels/ReadableByteChannel;
-Ljava/nio/channels/ScatteringByteChannel;
-Ljava/nio/channels/SeekableByteChannel;
-Ljava/nio/channels/SelectableChannel;
-Ljava/nio/channels/ServerSocketChannel;
-Ljava/nio/channels/SocketChannel;
-Ljava/nio/channels/spi/AbstractInterruptibleChannel;
-Ljava/nio/channels/spi/AbstractInterruptibleChannel$1;
-Ljava/nio/channels/spi/AbstractSelectableChannel;
-Ljava/nio/channels/WritableByteChannel;
-Ljava/nio/CharBuffer;
-Ljava/nio/charset/CharacterCodingException;
-Ljava/nio/charset/Charset;
-Ljava/nio/charset/CharsetDecoder;
-Ljava/nio/charset/CharsetDecoderICU;
-Ljava/nio/charset/CharsetEncoder;
-Ljava/nio/charset/CharsetEncoderICU;
-Ljava/nio/charset/CharsetICU;
-Ljava/nio/charset/CoderResult;
-Ljava/nio/charset/CoderResult$1;
-Ljava/nio/charset/CoderResult$2;
-Ljava/nio/charset/CoderResult$Cache;
-Ljava/nio/charset/CodingErrorAction;
-Ljava/nio/charset/IllegalCharsetNameException;
-Ljava/nio/charset/StandardCharsets;
-Ljava/nio/charset/UnsupportedCharsetException;
-Ljava/nio/DirectByteBuffer;
-Ljava/nio/DirectByteBuffer$MemoryRef;
-Ljava/nio/DoubleBuffer;
-Ljava/nio/file/attribute/BasicFileAttributes;
-Ljava/nio/file/attribute/FileAttribute;
-Ljava/nio/file/attribute/PosixFileAttributes;
-Ljava/nio/file/FileAlreadyExistsException;
-Ljava/nio/file/Files;
-Ljava/nio/file/FileSystem;
-Ljava/nio/file/FileSystemException;
-Ljava/nio/file/FileSystems;
-Ljava/nio/file/FileSystems$DefaultFileSystemHolder;
-Ljava/nio/file/FileSystems$DefaultFileSystemHolder$1;
-Ljava/nio/file/NoSuchFileException;
-Ljava/nio/file/OpenOption;
-Ljava/nio/file/Path;
-Ljava/nio/file/spi/FileSystemProvider;
-Ljava/nio/file/Watchable;
-Ljava/nio/FloatBuffer;
-Ljava/nio/HeapByteBuffer;
-Ljava/nio/HeapCharBuffer;
-Ljava/nio/IntBuffer;
-Ljava/nio/InvalidMarkException;
-Ljava/nio/LongBuffer;
-Ljava/nio/MappedByteBuffer;
-Ljava/nio/NIOAccess;
-Ljava/nio/NioUtils;
-Ljava/nio/ReadOnlyBufferException;
-Ljava/nio/ShortBuffer;
-Ljava/nio/StringCharBuffer;
-Ljava/security/AccessControlContext;
-Ljava/security/AccessControlException;
-Ljava/security/AccessController;
-Ljava/security/AlgorithmConstraints;
-Ljava/security/BasicPermission;
-Ljava/security/cert/Certificate;
-Ljava/security/cert/CertificateEncodingException;
-Ljava/security/cert/CertificateException;
-Ljava/security/cert/CertificateExpiredException;
-Ljava/security/cert/CertificateFactory;
-Ljava/security/cert/CertificateFactorySpi;
-Ljava/security/cert/CertificateNotYetValidException;
-Ljava/security/cert/CertificateParsingException;
-Ljava/security/cert/CertPath;
-Ljava/security/cert/CertPathChecker;
-Ljava/security/cert/CertPathHelperImpl;
-Ljava/security/cert/CertPathParameters;
-Ljava/security/cert/CertPathValidator;
-Ljava/security/cert/CertPathValidatorException;
-Ljava/security/cert/CertPathValidatorResult;
-Ljava/security/cert/CertPathValidatorSpi;
-Ljava/security/cert/CertSelector;
-Ljava/security/cert/CRLException;
-Ljava/security/cert/Extension;
-Ljava/security/cert/PKIXCertPathChecker;
-Ljava/security/cert/PKIXCertPathValidatorResult;
-Ljava/security/cert/PKIXParameters;
-Ljava/security/cert/PKIXRevocationChecker;
-Ljava/security/cert/PolicyNode;
-Ljava/security/cert/TrustAnchor;
-Ljava/security/cert/X509Certificate;
-Ljava/security/cert/X509CertSelector;
-Ljava/security/cert/X509Extension;
-Ljava/security/CryptoPrimitive;
-Ljava/security/DigestException;
-Ljava/security/GeneralSecurityException;
-Ljava/security/Guard;
-Ljava/security/interfaces/DSAKey;
-Ljava/security/interfaces/DSAPublicKey;
-Ljava/security/interfaces/ECKey;
-Ljava/security/interfaces/ECPrivateKey;
-Ljava/security/interfaces/ECPublicKey;
-Ljava/security/interfaces/RSAKey;
-Ljava/security/interfaces/RSAPrivateKey;
-Ljava/security/interfaces/RSAPublicKey;
-Ljava/security/InvalidAlgorithmParameterException;
-Ljava/security/InvalidKeyException;
-Ljava/security/Key;
-Ljava/security/KeyException;
-Ljava/security/KeyFactory;
-Ljava/security/KeyFactorySpi;
-Ljava/security/KeyManagementException;
-Ljava/security/KeyStore;
-Ljava/security/KeyStore$1;
-Ljava/security/KeyStoreException;
-Ljava/security/KeyStoreSpi;
-Ljava/security/MessageDigest;
-Ljava/security/MessageDigest$Delegate;
-Ljava/security/MessageDigestSpi;
-Ljava/security/NoSuchAlgorithmException;
-Ljava/security/NoSuchProviderException;
-Ljava/security/Permission;
-Ljava/security/PermissionCollection;
-Ljava/security/Permissions;
-Ljava/security/Principal;
-Ljava/security/PrivateKey;
-Ljava/security/PrivilegedAction;
-Ljava/security/PrivilegedActionException;
-Ljava/security/PrivilegedExceptionAction;
-Ljava/security/ProtectionDomain;
-Ljava/security/Provider;
-Ljava/security/Provider$EngineDescription;
-Ljava/security/Provider$Service;
-Ljava/security/Provider$ServiceKey;
-Ljava/security/Provider$UString;
-Ljava/security/PublicKey;
-Ljava/security/SecureRandom;
-Ljava/security/SecureRandomSpi;
-Ljava/security/Security;
-Ljava/security/Signature;
-Ljava/security/Signature$Delegate;
-Ljava/security/SignatureException;
-Ljava/security/SignatureSpi;
-Ljava/security/spec/AlgorithmParameterSpec;
-Ljava/security/spec/EncodedKeySpec;
-Ljava/security/spec/InvalidKeySpecException;
-Ljava/security/spec/KeySpec;
-Ljava/security/spec/RSAPublicKeySpec;
-Ljava/security/spec/X509EncodedKeySpec;
-Ljava/security/UnrecoverableEntryException;
-Ljava/security/UnrecoverableKeyException;
-Ljava/text/AttributedCharacterIterator$Attribute;
-Ljava/text/DateFormat;
-Ljava/text/DateFormat$Field;
-Ljava/text/DateFormatSymbols;
-Ljava/text/DecimalFormat;
-Ljava/text/DecimalFormatSymbols;
-Ljava/text/DontCareFieldPosition;
-Ljava/text/DontCareFieldPosition$1;
-Ljava/text/FieldPosition;
-Ljava/text/FieldPosition$Delegate;
-Ljava/text/Format;
-Ljava/text/Format$Field;
-Ljava/text/Format$FieldDelegate;
-Ljava/text/Normalizer;
-Ljava/text/Normalizer$Form;
-Ljava/text/NumberFormat;
-Ljava/text/ParseException;
-Ljava/text/SimpleDateFormat;
-Ljava/time/DateTimeException;
-Ljava/util/AbstractCollection;
-Ljava/util/AbstractList;
-Ljava/util/AbstractList$Itr;
-Ljava/util/AbstractList$ListItr;
-Ljava/util/AbstractMap;
-Ljava/util/AbstractMap$1;
-Ljava/util/AbstractMap$2;
-Ljava/util/AbstractMap$SimpleImmutableEntry;
-Ljava/util/AbstractQueue;
-Ljava/util/AbstractSequentialList;
-Ljava/util/AbstractSet;
-Ljava/util/ArrayDeque;
-Ljava/util/ArrayDeque$DeqIterator;
-Ljava/util/ArrayList;
-Ljava/util/ArrayList$ArrayListSpliterator;
-Ljava/util/ArrayList$Itr;
-Ljava/util/ArrayList$ListItr;
-Ljava/util/ArrayList$SubList;
-Ljava/util/ArrayList$SubList$1;
-Ljava/util/ArrayPrefixHelpers$CumulateTask;
-Ljava/util/ArrayPrefixHelpers$DoubleCumulateTask;
-Ljava/util/ArrayPrefixHelpers$IntCumulateTask;
-Ljava/util/ArrayPrefixHelpers$LongCumulateTask;
-Ljava/util/Arrays;
-Ljava/util/Arrays$ArrayList;
-Ljava/util/Arrays$NaturalOrder;
-Ljava/util/ArraysParallelSortHelpers$FJByte$Sorter;
-Ljava/util/ArraysParallelSortHelpers$FJChar$Sorter;
-Ljava/util/ArraysParallelSortHelpers$FJDouble$Sorter;
-Ljava/util/ArraysParallelSortHelpers$FJFloat$Sorter;
-Ljava/util/ArraysParallelSortHelpers$FJInt$Sorter;
-Ljava/util/ArraysParallelSortHelpers$FJLong$Sorter;
-Ljava/util/ArraysParallelSortHelpers$FJObject$Sorter;
-Ljava/util/ArraysParallelSortHelpers$FJShort$Sorter;
-Ljava/util/Base64;
-Ljava/util/Base64$Decoder;
-Ljava/util/Base64$Encoder;
-Ljava/util/BitSet;
-Ljava/util/Calendar;
-Ljava/util/Collection;
-Ljava/util/Collections;
-Ljava/util/Collections$1;
-Ljava/util/Collections$2;
-Ljava/util/Collections$3;
-Ljava/util/Collections$AsLIFOQueue;
-Ljava/util/Collections$CheckedCollection;
-Ljava/util/Collections$CheckedList;
-Ljava/util/Collections$CheckedMap;
-Ljava/util/Collections$CheckedNavigableMap;
-Ljava/util/Collections$CheckedNavigableSet;
-Ljava/util/Collections$CheckedQueue;
-Ljava/util/Collections$CheckedRandomAccessList;
-Ljava/util/Collections$CheckedSet;
-Ljava/util/Collections$CheckedSortedMap;
-Ljava/util/Collections$CheckedSortedSet;
-Ljava/util/Collections$CopiesList;
-Ljava/util/Collections$EmptyEnumeration;
-Ljava/util/Collections$EmptyIterator;
-Ljava/util/Collections$EmptyList;
-Ljava/util/Collections$EmptyListIterator;
-Ljava/util/Collections$EmptyMap;
-Ljava/util/Collections$EmptySet;
-Ljava/util/Collections$ReverseComparator;
-Ljava/util/Collections$ReverseComparator2;
-Ljava/util/Collections$SetFromMap;
-Ljava/util/Collections$SingletonList;
-Ljava/util/Collections$SingletonMap;
-Ljava/util/Collections$SingletonSet;
-Ljava/util/Collections$SynchronizedCollection;
-Ljava/util/Collections$SynchronizedList;
-Ljava/util/Collections$SynchronizedMap;
-Ljava/util/Collections$SynchronizedNavigableMap;
-Ljava/util/Collections$SynchronizedNavigableSet;
-Ljava/util/Collections$SynchronizedRandomAccessList;
-Ljava/util/Collections$SynchronizedSet;
-Ljava/util/Collections$SynchronizedSortedMap;
-Ljava/util/Collections$SynchronizedSortedSet;
-Ljava/util/Collections$UnmodifiableCollection;
-Ljava/util/Collections$UnmodifiableCollection$1;
-Ljava/util/Collections$UnmodifiableList;
-Ljava/util/Collections$UnmodifiableList$1;
-Ljava/util/Collections$UnmodifiableMap;
-Ljava/util/Collections$UnmodifiableMap$UnmodifiableEntrySet;
-Ljava/util/Collections$UnmodifiableMap$UnmodifiableEntrySet$1;
-Ljava/util/Collections$UnmodifiableMap$UnmodifiableEntrySet$UnmodifiableEntry;
-Ljava/util/Collections$UnmodifiableNavigableMap;
-Ljava/util/Collections$UnmodifiableNavigableMap$EmptyNavigableMap;
-Ljava/util/Collections$UnmodifiableNavigableSet;
-Ljava/util/Collections$UnmodifiableNavigableSet$EmptyNavigableSet;
-Ljava/util/Collections$UnmodifiableRandomAccessList;
-Ljava/util/Collections$UnmodifiableSet;
-Ljava/util/Collections$UnmodifiableSortedMap;
-Ljava/util/Collections$UnmodifiableSortedSet;
-Ljava/util/ComparableTimSort;
-Ljava/util/Comparator;
-Ljava/util/Comparators$NaturalOrderComparator;
-Ljava/util/Comparators$NullComparator;
-Ljava/util/concurrent/AbstractExecutorService;
-Ljava/util/concurrent/ArrayBlockingQueue;
-Ljava/util/concurrent/atomic/AtomicBoolean;
-Ljava/util/concurrent/atomic/AtomicInteger;
-Ljava/util/concurrent/atomic/AtomicLong;
-Ljava/util/concurrent/atomic/AtomicReference;
-Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;
-Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl;
-Ljava/util/concurrent/BlockingQueue;
-Ljava/util/concurrent/Callable;
-Ljava/util/concurrent/CancellationException;
-Ljava/util/concurrent/CompletableFuture;
-Ljava/util/concurrent/CompletableFuture$AltResult;
-Ljava/util/concurrent/CompletableFuture$AsynchronousCompletionTask;
-Ljava/util/concurrent/CompletableFuture$Completion;
-Ljava/util/concurrent/CompletableFuture$Signaller;
-Ljava/util/concurrent/CompletionStage;
-Ljava/util/concurrent/ConcurrentHashMap;
-Ljava/util/concurrent/ConcurrentHashMap$BaseIterator;
-Ljava/util/concurrent/ConcurrentHashMap$BulkTask;
-Ljava/util/concurrent/ConcurrentHashMap$CollectionView;
-Ljava/util/concurrent/ConcurrentHashMap$CounterCell;
-Ljava/util/concurrent/ConcurrentHashMap$EntryIterator;
-Ljava/util/concurrent/ConcurrentHashMap$EntrySetView;
-Ljava/util/concurrent/ConcurrentHashMap$ForEachEntryTask;
-Ljava/util/concurrent/ConcurrentHashMap$ForEachKeyTask;
-Ljava/util/concurrent/ConcurrentHashMap$ForEachMappingTask;
-Ljava/util/concurrent/ConcurrentHashMap$ForEachTransformedEntryTask;
-Ljava/util/concurrent/ConcurrentHashMap$ForEachTransformedKeyTask;
-Ljava/util/concurrent/ConcurrentHashMap$ForEachTransformedMappingTask;
-Ljava/util/concurrent/ConcurrentHashMap$ForEachTransformedValueTask;
-Ljava/util/concurrent/ConcurrentHashMap$ForEachValueTask;
-Ljava/util/concurrent/ConcurrentHashMap$ForwardingNode;
-Ljava/util/concurrent/ConcurrentHashMap$KeyIterator;
-Ljava/util/concurrent/ConcurrentHashMap$KeySetView;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToDoubleTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToIntTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToLongTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysToDoubleTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysToIntTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceKeysToLongTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsToDoubleTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsToIntTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceMappingsToLongTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesToDoubleTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesToIntTask;
-Ljava/util/concurrent/ConcurrentHashMap$MapReduceValuesToLongTask;
-Ljava/util/concurrent/ConcurrentHashMap$Node;
-Ljava/util/concurrent/ConcurrentHashMap$ReduceEntriesTask;
-Ljava/util/concurrent/ConcurrentHashMap$ReduceKeysTask;
-Ljava/util/concurrent/ConcurrentHashMap$ReduceValuesTask;
-Ljava/util/concurrent/ConcurrentHashMap$ReservationNode;
-Ljava/util/concurrent/ConcurrentHashMap$SearchEntriesTask;
-Ljava/util/concurrent/ConcurrentHashMap$SearchKeysTask;
-Ljava/util/concurrent/ConcurrentHashMap$SearchMappingsTask;
-Ljava/util/concurrent/ConcurrentHashMap$SearchValuesTask;
-Ljava/util/concurrent/ConcurrentHashMap$Segment;
-Ljava/util/concurrent/ConcurrentHashMap$Traverser;
-Ljava/util/concurrent/ConcurrentHashMap$TreeBin;
-Ljava/util/concurrent/ConcurrentHashMap$TreeNode;
-Ljava/util/concurrent/ConcurrentHashMap$ValueIterator;
-Ljava/util/concurrent/ConcurrentHashMap$ValuesView;
-Ljava/util/concurrent/ConcurrentLinkedQueue;
-Ljava/util/concurrent/ConcurrentLinkedQueue$Node;
-Ljava/util/concurrent/ConcurrentMap;
-Ljava/util/concurrent/CopyOnWriteArrayList;
-Ljava/util/concurrent/CopyOnWriteArrayList$COWIterator;
-Ljava/util/concurrent/CopyOnWriteArraySet;
-Ljava/util/concurrent/CountDownLatch;
-Ljava/util/concurrent/CountDownLatch$Sync;
-Ljava/util/concurrent/CountedCompleter;
-Ljava/util/concurrent/ExecutionException;
-Ljava/util/concurrent/Executor;
-Ljava/util/concurrent/Executors;
-Ljava/util/concurrent/Executors$DefaultThreadFactory;
-Ljava/util/concurrent/Executors$DelegatedExecutorService;
-Ljava/util/concurrent/ExecutorService;
-Ljava/util/concurrent/Executors$FinalizableDelegatedExecutorService;
-Ljava/util/concurrent/Executors$RunnableAdapter;
-Ljava/util/concurrent/ForkJoinPool;
-Ljava/util/concurrent/ForkJoinPool$1;
-Ljava/util/concurrent/ForkJoinPool$DefaultForkJoinWorkerThreadFactory;
-Ljava/util/concurrent/ForkJoinPool$ForkJoinWorkerThreadFactory;
-Ljava/util/concurrent/ForkJoinPool$ManagedBlocker;
-Ljava/util/concurrent/ForkJoinTask;
-Ljava/util/concurrent/ForkJoinTask$ExceptionNode;
-Ljava/util/concurrent/ForkJoinWorkerThread;
-Ljava/util/concurrent/Future;
-Ljava/util/concurrent/FutureTask;
-Ljava/util/concurrent/FutureTask$WaitNode;
-Ljava/util/concurrent/LinkedBlockingQueue;
-Ljava/util/concurrent/LinkedBlockingQueue$Node;
-Ljava/util/concurrent/locks/AbstractOwnableSynchronizer;
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;
-Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$Node;
-Ljava/util/concurrent/locks/Condition;
-Ljava/util/concurrent/locks/Lock;
-Ljava/util/concurrent/locks/LockSupport;
-Ljava/util/concurrent/locks/ReadWriteLock;
-Ljava/util/concurrent/locks/ReentrantLock;
-Ljava/util/concurrent/locks/ReentrantLock$NonfairSync;
-Ljava/util/concurrent/locks/ReentrantLock$Sync;
-Ljava/util/concurrent/locks/ReentrantReadWriteLock;
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$NonfairSync;
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$ReadLock;
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync$ThreadLocalHoldCounter;
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$WriteLock;
-Ljava/util/ConcurrentModificationException;
-Ljava/util/concurrent/RejectedExecutionHandler;
-Ljava/util/concurrent/RunnableFuture;
-Ljava/util/concurrent/ThreadFactory;
-Ljava/util/concurrent/ThreadLocalRandom;
-Ljava/util/concurrent/ThreadPoolExecutor;
-Ljava/util/concurrent/ThreadPoolExecutor$AbortPolicy;
-Ljava/util/concurrent/ThreadPoolExecutor$Worker;
-Ljava/util/concurrent/TimeoutException;
-Ljava/util/concurrent/TimeUnit;
-Ljava/util/concurrent/TimeUnit$1;
-Ljava/util/concurrent/TimeUnit$2;
-Ljava/util/concurrent/TimeUnit$3;
-Ljava/util/concurrent/TimeUnit$4;
-Ljava/util/concurrent/TimeUnit$5;
-Ljava/util/concurrent/TimeUnit$6;
-Ljava/util/concurrent/TimeUnit$7;
-Ljava/util/Currency;
-Ljava/util/Date;
-Ljava/util/Deque;
-Ljava/util/Dictionary;
-Ljava/util/DualPivotQuicksort;
-Ljava/util/Enumeration;
-Ljava/util/EnumMap;
-Ljava/util/EnumMap$1;
-Ljava/util/EnumSet;
-Ljava/util/Formattable;
-Ljava/util/Formatter;
-Ljava/util/Formatter$Conversion;
-Ljava/util/Formatter$DateTime;
-Ljava/util/Formatter$FixedString;
-Ljava/util/Formatter$Flags;
-Ljava/util/Formatter$FormatSpecifier;
-Ljava/util/Formatter$FormatSpecifierParser;
-Ljava/util/Formatter$FormatString;
-Ljava/util/function/BiConsumer;
-Ljava/util/function/BiFunction;
-Ljava/util/function/BinaryOperator;
-Ljava/util/function/Consumer;
-Ljava/util/function/DoubleBinaryOperator;
-Ljava/util/function/Function;
-Ljava/util/function/IntBinaryOperator;
-Ljava/util/function/IntConsumer;
-Ljava/util/function/IntFunction;
-Ljava/util/function/IntToDoubleFunction;
-Ljava/util/function/IntToLongFunction;
-Ljava/util/function/IntUnaryOperator;
-Ljava/util/function/LongBinaryOperator;
-Ljava/util/function/LongUnaryOperator;
-Ljava/util/function/Predicate;
-Ljava/util/function/Supplier;
-Ljava/util/function/ToDoubleBiFunction;
-Ljava/util/function/ToDoubleFunction;
-Ljava/util/function/ToIntBiFunction;
-Ljava/util/function/ToIntFunction;
-Ljava/util/function/ToLongBiFunction;
-Ljava/util/function/ToLongFunction;
-Ljava/util/function/UnaryOperator;
-Ljava/util/GregorianCalendar;
-Ljava/util/HashMap;
-Ljava/util/HashMap$EntryIterator;
-Ljava/util/HashMap$EntrySet;
-Ljava/util/HashMap$HashIterator;
-Ljava/util/HashMap$KeyIterator;
-Ljava/util/HashMap$KeySet;
-Ljava/util/HashMap$Node;
-Ljava/util/HashMap$TreeNode;
-Ljava/util/HashMap$ValueIterator;
-Ljava/util/HashMap$Values;
-Ljava/util/HashSet;
-Ljava/util/Hashtable;
-Ljava/util/Hashtable$Enumerator;
-Ljava/util/Hashtable$HashtableEntry;
-Ljava/util/Hashtable$KeySet;
-Ljava/util/Hashtable$ValueCollection;
-Ljava/util/IdentityHashMap;
-Ljava/util/IdentityHashMap$KeySet;
-Ljava/util/IllegalFormatException;
-Ljava/util/IllformedLocaleException;
-Ljava/util/Iterator;
-Ljava/util/jar/JarEntry;
-Ljava/util/jar/JarFile;
-Ljava/util/jar/JarFile$JarEntryIterator;
-Ljava/util/jar/JarFile$JarFileEntry;
-Ljava/util/LinkedHashMap;
-Ljava/util/LinkedHashMap$LinkedEntryIterator;
-Ljava/util/LinkedHashMap$LinkedEntrySet;
-Ljava/util/LinkedHashMap$LinkedHashIterator;
-Ljava/util/LinkedHashMap$LinkedHashMapEntry;
-Ljava/util/LinkedHashMap$LinkedKeyIterator;
-Ljava/util/LinkedHashMap$LinkedKeySet;
-Ljava/util/LinkedHashMap$LinkedValueIterator;
-Ljava/util/LinkedHashMap$LinkedValues;
-Ljava/util/LinkedHashSet;
-Ljava/util/LinkedList;
-Ljava/util/LinkedList$ListItr;
-Ljava/util/LinkedList$Node;
-Ljava/util/List;
-Ljava/util/ListIterator;
-Ljava/util/Locale;
-Ljava/util/Locale$Builder;
-Ljava/util/Locale$Cache;
-Ljava/util/Locale$Category;
-Ljava/util/Locale$FilteringMode;
-Ljava/util/Locale$LanguageRange;
-Ljava/util/Locale$LocaleKey;
-Ljava/util/logging/ErrorManager;
-Ljava/util/logging/Formatter;
-Ljava/util/logging/Handler;
-Ljava/util/logging/Level;
-Ljava/util/logging/Level$KnownLevel;
-Ljava/util/logging/Logger;
-Ljava/util/logging/Logger$LoggerBundle;
-Ljava/util/logging/LoggingPermission;
-Ljava/util/logging/LoggingProxyImpl;
-Ljava/util/logging/LogManager;
-Ljava/util/logging/LogManager$1;
-Ljava/util/logging/LogManager$2;
-Ljava/util/logging/LogManager$3;
-Ljava/util/logging/LogManager$5;
-Ljava/util/logging/LogManager$Cleaner;
-Ljava/util/logging/LogManager$LoggerContext;
-Ljava/util/logging/LogManager$LoggerContext$1;
-Ljava/util/logging/LogManager$LoggerWeakRef;
-Ljava/util/logging/LogManager$LogNode;
-Ljava/util/logging/LogManager$RootLogger;
-Ljava/util/logging/LogManager$SystemLoggerContext;
-Ljava/util/Map;
-Ljava/util/Map$Entry;
-Ljava/util/MissingResourceException;
-Ljava/util/NavigableMap;
-Ljava/util/NavigableSet;
-Ljava/util/NoSuchElementException;
-Ljava/util/Objects;
-Ljava/util/prefs/AbstractPreferences;
-Ljava/util/prefs/FileSystemPreferences;
-Ljava/util/prefs/Preferences;
-Ljava/util/PrimitiveIterator;
-Ljava/util/PrimitiveIterator$OfInt;
-Ljava/util/Properties;
-Ljava/util/Properties$LineReader;
-Ljava/util/Queue;
-Ljava/util/Random;
-Ljava/util/RandomAccess;
-Ljava/util/RandomAccessSubList;
-Ljava/util/regex/Matcher;
-Ljava/util/regex/MatchResult;
-Ljava/util/regex/Pattern;
-Ljava/util/regex/PatternSyntaxException;
-Ljava/util/RegularEnumSet;
-Ljava/util/ResourceBundle;
-Ljava/util/ResourceBundle$1;
-Ljava/util/Set;
-Ljava/util/SimpleTimeZone;
-Ljava/util/SortedMap;
-Ljava/util/SortedSet;
-Ljava/util/Spliterator;
-Ljava/util/Spliterator$OfDouble;
-Ljava/util/Spliterator$OfInt;
-Ljava/util/Spliterator$OfLong;
-Ljava/util/Spliterator$OfPrimitive;
-Ljava/util/Spliterators;
-Ljava/util/Spliterators$EmptySpliterator;
-Ljava/util/Spliterators$EmptySpliterator$OfDouble;
-Ljava/util/Spliterators$EmptySpliterator$OfInt;
-Ljava/util/Spliterators$EmptySpliterator$OfLong;
-Ljava/util/Spliterators$EmptySpliterator$OfRef;
-Ljava/util/Stack;
-Ljava/util/stream/BaseStream;
-Ljava/util/stream/DoubleStream;
-Ljava/util/stream/IntStream;
-Ljava/util/stream/LongStream;
-Ljava/util/stream/Stream;
-Ljava/util/stream/StreamSupport;
-Ljava/util/StringJoiner;
-Ljava/util/StringTokenizer;
-Ljava/util/SubList;
-Ljava/util/TaskQueue;
-Ljava/util/Timer;
-Ljava/util/Timer$1;
-Ljava/util/TimerTask;
-Ljava/util/TimerThread;
-Ljava/util/TimeZone;
-Ljava/util/TimSort;
-Ljava/util/TreeMap;
-Ljava/util/TreeMap$AscendingSubMap;
-Ljava/util/TreeMap$AscendingSubMap$AscendingEntrySetView;
-Ljava/util/TreeMap$EntryIterator;
-Ljava/util/TreeMap$EntrySet;
-Ljava/util/TreeMap$KeyIterator;
-Ljava/util/TreeMap$KeySet;
-Ljava/util/TreeMap$NavigableSubMap;
-Ljava/util/TreeMap$NavigableSubMap$EntrySetView;
-Ljava/util/TreeMap$NavigableSubMap$SubMapIterator;
-Ljava/util/TreeMap$NavigableSubMap$SubMapKeyIterator;
-Ljava/util/TreeMap$PrivateEntryIterator;
-Ljava/util/TreeMap$TreeMapEntry;
-Ljava/util/TreeMap$ValueIterator;
-Ljava/util/TreeMap$Values;
-Ljava/util/TreeSet;
-Ljava/util/UUID;
-Ljava/util/UUID$Holder;
-Ljava/util/Vector;
-Ljava/util/Vector$Itr;
-Ljava/util/WeakHashMap;
-Ljava/util/WeakHashMap$Entry;
-Ljava/util/WeakHashMap$EntrySet;
-Ljava/util/WeakHashMap$KeySet;
-Ljava/util/WeakHashMap$Values;
-Ljava/util/zip/Adler32;
-Ljava/util/zip/Checksum;
-Ljava/util/zip/CRC32;
-Ljava/util/zip/DataFormatException;
-Ljava/util/zip/Deflater;
-Ljava/util/zip/DeflaterOutputStream;
-Ljava/util/zip/GZIPOutputStream;
-Ljava/util/zip/Inflater;
-Ljava/util/zip/InflaterInputStream;
-Ljava/util/zip/ZipCoder;
-Ljava/util/zip/ZipConstants;
-Ljava/util/zip/ZipEntry;
-Ljava/util/zip/ZipFile;
-Ljava/util/zip/ZipFile$ZipEntryIterator;
-Ljava/util/zip/ZipFile$ZipFileInflaterInputStream;
-Ljava/util/zip/ZipFile$ZipFileInputStream;
-Ljava/util/zip/ZipUtils;
-Ljava/util/zip/ZStreamRef;
-Ljavax/crypto/BadPaddingException;
-Ljavax/crypto/IllegalBlockSizeException;
-Ljavax/crypto/NoSuchPaddingException;
-Ljavax/crypto/SecretKey;
-Ljavax/microedition/khronos/egl/EGL;
-Ljavax/microedition/khronos/egl/EGL10;
-Ljavax/microedition/khronos/opengles/GL;
-Ljavax/microedition/khronos/opengles/GL10;
-Ljavax/microedition/khronos/opengles/GL10Ext;
-Ljavax/microedition/khronos/opengles/GL11;
-Ljavax/microedition/khronos/opengles/GL11Ext;
-Ljavax/microedition/khronos/opengles/GL11ExtensionPack;
-Ljavax/net/SocketFactory;
-Ljavax/net/ssl/ExtendedSSLSession;
-Ljavax/net/ssl/HostnameVerifier;
-Ljavax/net/ssl/HttpsURLConnection;
-Ljavax/net/ssl/HttpsURLConnection$NoPreloadHolder;
-Ljavax/net/ssl/KeyManager;
-Ljavax/net/ssl/KeyManagerFactory;
-Ljavax/net/ssl/KeyManagerFactory$1;
-Ljavax/net/ssl/KeyManagerFactorySpi;
-Ljavax/net/ssl/SNIHostName;
-Ljavax/net/ssl/SNIServerName;
-Ljavax/net/ssl/SSLContext;
-Ljavax/net/ssl/SSLContextSpi;
-Ljavax/net/ssl/SSLException;
-Ljavax/net/ssl/SSLParameters;
-Ljavax/net/ssl/SSLPeerUnverifiedException;
-Ljavax/net/ssl/SSLProtocolException;
-Ljavax/net/ssl/SSLSession;
-Ljavax/net/ssl/SSLSessionContext;
-Ljavax/net/ssl/SSLSocket;
-Ljavax/net/ssl/SSLSocketFactory;
-Ljavax/net/ssl/SSLSocketFactory$1;
-Ljavax/net/ssl/TrustManager;
-Ljavax/net/ssl/TrustManagerFactory;
-Ljavax/net/ssl/TrustManagerFactory$1;
-Ljavax/net/ssl/TrustManagerFactorySpi;
-Ljavax/net/ssl/X509ExtendedKeyManager;
-Ljavax/net/ssl/X509ExtendedTrustManager;
-Ljavax/net/ssl/X509KeyManager;
-Ljavax/net/ssl/X509TrustManager;
-Ljavax/security/auth/callback/UnsupportedCallbackException;
-Ljavax/security/auth/Destroyable;
-Ljavax/security/auth/x500/X500Principal;
-Ljavax/security/cert/CertificateException;
-Llibcore/icu/ICU;
-Llibcore/icu/LocaleData;
-Llibcore/icu/NativeConverter;
-Llibcore/icu/TimeZoneNames;
-Llibcore/icu/TimeZoneNames$1;
-Llibcore/icu/TimeZoneNames$ZoneStringsCache;
-Llibcore/internal/StringPool;
-Llibcore/io/AsynchronousCloseMonitor;
-Llibcore/io/BlockGuardOs;
-Llibcore/io/BufferIterator;
-Llibcore/io/ClassPathURLStreamHandler;
-Llibcore/io/ClassPathURLStreamHandler$ClassPathURLConnection;
-Llibcore/io/ClassPathURLStreamHandler$ClassPathURLConnection$1;
-Llibcore/io/DropBox;
-Llibcore/io/DropBox$DefaultReporter;
-Llibcore/io/DropBox$Reporter;
-Llibcore/io/ForwardingOs;
-Llibcore/io/IoBridge;
-Llibcore/io/IoTracker;
-Llibcore/io/IoTracker$Mode;
-Llibcore/io/IoUtils;
-Llibcore/io/IoUtils$FileReader;
-Llibcore/io/Libcore;
-Llibcore/io/Memory;
-Llibcore/io/MemoryMappedFile;
-Llibcore/io/NioBufferIterator;
-Llibcore/io/Os;
-Llibcore/io/Posix;
-Llibcore/io/Streams;
-Llibcore/net/event/NetworkEventDispatcher;
-Llibcore/net/NetworkSecurityPolicy;
-Llibcore/net/NetworkSecurityPolicy$DefaultNetworkSecurityPolicy;
-Llibcore/net/UriCodec;
-Llibcore/reflect/AnnotatedElements;
-Llibcore/reflect/AnnotationFactory;
-Llibcore/reflect/AnnotationMember;
-Llibcore/reflect/AnnotationMember$DefaultValues;
-Llibcore/reflect/GenericSignatureParser;
-Llibcore/reflect/InternalNames;
-Llibcore/reflect/ListOfTypes;
-Llibcore/reflect/Types;
-Llibcore/util/BasicLruCache;
-Llibcore/util/CharsetUtils;
-Llibcore/util/CollectionUtils;
-Llibcore/util/EmptyArray;
-Llibcore/util/HexEncoding;
-Llibcore/util/NativeAllocationRegistry;
-Llibcore/util/NativeAllocationRegistry$CleanerRunner;
-Llibcore/util/NativeAllocationRegistry$CleanerThunk;
-Llibcore/util/Objects;
-Llibcore/util/ZoneInfo;
-Llibcore/util/ZoneInfo$CheckedArithmeticException;
-Llibcore/util/ZoneInfoDB;
-Llibcore/util/ZoneInfoDB$TzData;
-Llibcore/util/ZoneInfoDB$TzData$1;
-Llibcore/util/ZoneInfo$WallTime;
-Lorg/apache/harmony/dalvik/ddmc/Chunk;
-Lorg/apache/harmony/dalvik/ddmc/ChunkHandler;
-Lorg/apache/harmony/dalvik/ddmc/DdmServer;
-Lorg/apache/harmony/dalvik/ddmc/DdmVmInternal;
-Lorg/apache/harmony/dalvik/NativeTestTarget;
-Lorg/apache/harmony/luni/internal/util/TimezoneGetter;
-Lorg/apache/harmony/xml/ExpatAttributes;
-Lorg/apache/harmony/xml/ExpatParser;
-Lorg/json/JSON;
-Lorg/json/JSONArray;
-Lorg/json/JSONException;
-Lorg/json/JSONObject;
-Lorg/json/JSONObject$1;
-Lorg/json/JSONStringer;
-Lorg/json/JSONStringer$Scope;
-Lorg/json/JSONTokener;
-Lorg/kxml2/io/KXmlParser;
-Lorg/kxml2/io/KXmlParser$ValueContext;
-Lorg/kxml2/io/KXmlSerializer;
-Lorg/xmlpull/v1/XmlPullParser;
-Lorg/xmlpull/v1/XmlPullParserException;
-Lorg/xmlpull/v1/XmlPullParserFactory;
-Lorg/xmlpull/v1/XmlSerializer;
-Lorg/xml/sax/Attributes;
-LS;
-Lsun/invoke/util/BytecodeDescriptor;
-Lsun/invoke/util/Wrapper;
-Lsun/misc/Cleaner;
-Lsun/misc/CompoundEnumeration;
-Lsun/misc/FDBigInteger;
-Lsun/misc/FloatingDecimal;
-Lsun/misc/FloatingDecimal$1;
-Lsun/misc/FloatingDecimal$ASCIIToBinaryBuffer;
-Lsun/misc/FloatingDecimal$ASCIIToBinaryConverter;
-Lsun/misc/FloatingDecimal$BinaryToASCIIBuffer;
-Lsun/misc/FloatingDecimal$BinaryToASCIIConverter;
-Lsun/misc/FloatingDecimal$ExceptionalBinaryToASCIIBuffer;
-Lsun/misc/FloatingDecimal$PreparedASCIIToBinaryBuffer;
-Lsun/misc/FormattedFloatingDecimal;
-Lsun/misc/FormattedFloatingDecimal$1;
-Lsun/misc/FormattedFloatingDecimal$Form;
-Lsun/misc/IOUtils;
-Lsun/misc/JavaIOFileDescriptorAccess;
-Lsun/misc/SharedSecrets;
-Lsun/misc/Unsafe;
-Lsun/misc/Version;
-Lsun/misc/VM;
-Lsun/net/ConnectionResetException;
-Lsun/net/NetHooks;
-Lsun/net/ResourceManager;
-Lsun/net/spi/DefaultProxySelector;
-Lsun/net/spi/nameservice/NameService;
-Lsun/net/util/IPAddressUtil;
-Lsun/net/www/ParseUtil;
-Lsun/net/www/protocol/file/Handler;
-Lsun/net/www/protocol/jar/Handler;
-Lsun/nio/ch/ChannelInputStream;
-Lsun/nio/ch/DatagramChannelImpl;
-Lsun/nio/ch/DatagramDispatcher;
-Lsun/nio/ch/DirectBuffer;
-Lsun/nio/ch/EPollArrayWrapper;
-Lsun/nio/ch/FileChannelImpl;
-Lsun/nio/ch/FileChannelImpl$Unmapper;
-Lsun/nio/ch/FileDispatcher;
-Lsun/nio/ch/FileDispatcherImpl;
-Lsun/nio/ch/FileKey;
-Lsun/nio/ch/Interruptible;
-Lsun/nio/ch/IOStatus;
-Lsun/nio/ch/IOUtil;
-Lsun/nio/ch/NativeDispatcher;
-Lsun/nio/ch/NativeThread;
-Lsun/nio/ch/NativeThreadSet;
-Lsun/nio/ch/Net;
-Lsun/nio/ch/SelChImpl;
-Lsun/nio/ch/ServerSocketChannelImpl;
-Lsun/nio/ch/SocketChannelImpl;
-Lsun/nio/ch/Util;
-Lsun/nio/ch/Util$1;
-Lsun/nio/ch/Util$BufferCache;
-Lsun/nio/cs/ArrayEncoder;
-Lsun/nio/cs/StreamDecoder;
-Lsun/nio/cs/StreamEncoder;
-Lsun/nio/fs/AbstractFileSystemProvider;
-Lsun/nio/fs/AbstractPath;
-Lsun/nio/fs/DefaultFileSystemProvider;
-Lsun/nio/fs/LinuxFileSystem;
-Lsun/nio/fs/LinuxFileSystemProvider;
-Lsun/nio/fs/NativeBuffer;
-Lsun/nio/fs/NativeBuffer$Deallocator;
-Lsun/nio/fs/NativeBuffers;
-Lsun/nio/fs/UnixChannelFactory;
-Lsun/nio/fs/UnixChannelFactory$Flags;
-Lsun/nio/fs/UnixConstants;
-Lsun/nio/fs/UnixException;
-Lsun/nio/fs/UnixFileAttributes;
-Lsun/nio/fs/UnixFileModeAttribute;
-Lsun/nio/fs/UnixFileStoreAttributes;
-Lsun/nio/fs/UnixFileSystem;
-Lsun/nio/fs/UnixFileSystemProvider;
-Lsun/nio/fs/UnixMountEntry;
-Lsun/nio/fs/UnixNativeDispatcher;
-Lsun/nio/fs/UnixPath;
-Lsun/nio/fs/Util;
-Lsun/security/action/GetBooleanAction;
-Lsun/security/action/GetPropertyAction;
-Lsun/security/jca/GetInstance;
-Lsun/security/jca/GetInstance$Instance;
-Lsun/security/jca/ProviderConfig;
-Lsun/security/jca/ProviderConfig$2;
-Lsun/security/jca/ProviderList;
-Lsun/security/jca/ProviderList$1;
-Lsun/security/jca/ProviderList$2;
-Lsun/security/jca/ProviderList$3;
-Lsun/security/jca/ProviderList$ServiceList;
-Lsun/security/jca/ProviderList$ServiceList$1;
-Lsun/security/jca/Providers;
-Lsun/security/jca/ServiceId;
-Lsun/security/pkcs/PKCS9Attribute;
-Lsun/security/pkcs/SignerInfo;
-Lsun/security/provider/certpath/AdaptableX509CertSelector;
-Lsun/security/provider/certpath/AlgorithmChecker;
-Lsun/security/provider/certpath/BasicChecker;
-Lsun/security/provider/certpath/CertPathHelper;
-Lsun/security/provider/certpath/ConstraintsChecker;
-Lsun/security/provider/certpath/KeyChecker;
-Lsun/security/provider/certpath/PKIX;
-Lsun/security/provider/certpath/PKIXCertPathValidator;
-Lsun/security/provider/certpath/PKIXMasterCertPathValidator;
-Lsun/security/provider/certpath/PKIX$ValidatorParams;
-Lsun/security/provider/certpath/PolicyChecker;
-Lsun/security/provider/certpath/PolicyNodeImpl;
-Lsun/security/provider/CertPathProvider;
-Lsun/security/provider/X509Factory;
-Lsun/security/util/AbstractAlgorithmConstraints;
-Lsun/security/util/AlgorithmDecomposer;
-Lsun/security/util/BitArray;
-Lsun/security/util/ByteArrayLexOrder;
-Lsun/security/util/ByteArrayTagOrder;
-Lsun/security/util/Cache;
-Lsun/security/util/Cache$EqualByteArray;
-Lsun/security/util/Debug;
-Lsun/security/util/DerEncoder;
-Lsun/security/util/DerIndefLenConverter;
-Lsun/security/util/DerInputBuffer;
-Lsun/security/util/DerInputStream;
-Lsun/security/util/DerOutputStream;
-Lsun/security/util/DerValue;
-Lsun/security/util/DisabledAlgorithmConstraints;
-Lsun/security/util/DisabledAlgorithmConstraints$KeySizeConstraint;
-Lsun/security/util/DisabledAlgorithmConstraints$KeySizeConstraint$Operator;
-Lsun/security/util/DisabledAlgorithmConstraints$KeySizeConstraints;
-Lsun/security/util/KeyUtil;
-Lsun/security/util/Length;
-Lsun/security/util/MemoryCache;
-Lsun/security/util/MemoryCache$CacheEntry;
-Lsun/security/util/MemoryCache$SoftCacheEntry;
-Lsun/security/util/ObjectIdentifier;
-Lsun/security/x509/AccessDescription;
-Lsun/security/x509/AlgorithmId;
-Lsun/security/x509/AuthorityInfoAccessExtension;
-Lsun/security/x509/AuthorityKeyIdentifierExtension;
-Lsun/security/x509/AVA;
-Lsun/security/x509/AVAKeyword;
-Lsun/security/x509/BasicConstraintsExtension;
-Lsun/security/x509/CertAttrSet;
-Lsun/security/x509/CertificateAlgorithmId;
-Lsun/security/x509/CertificateExtensions;
-Lsun/security/x509/CertificateIssuerExtension;
-Lsun/security/x509/CertificatePoliciesExtension;
-Lsun/security/x509/CertificatePolicyId;
-Lsun/security/x509/CertificateSerialNumber;
-Lsun/security/x509/CertificateValidity;
-Lsun/security/x509/CertificateVersion;
-Lsun/security/x509/CertificateX509Key;
-Lsun/security/x509/CRLDistributionPointsExtension;
-Lsun/security/x509/CRLNumberExtension;
-Lsun/security/x509/CRLReasonCodeExtension;
-Lsun/security/x509/DeltaCRLIndicatorExtension;
-Lsun/security/x509/DistributionPoint;
-Lsun/security/x509/DNSName;
-Lsun/security/x509/ExtendedKeyUsageExtension;
-Lsun/security/x509/Extension;
-Lsun/security/x509/FreshestCRLExtension;
-Lsun/security/x509/GeneralName;
-Lsun/security/x509/GeneralNameInterface;
-Lsun/security/x509/GeneralNames;
-Lsun/security/x509/InhibitAnyPolicyExtension;
-Lsun/security/x509/IssuerAlternativeNameExtension;
-Lsun/security/x509/IssuingDistributionPointExtension;
-Lsun/security/x509/KeyIdentifier;
-Lsun/security/x509/KeyUsageExtension;
-Lsun/security/x509/NameConstraintsExtension;
-Lsun/security/x509/NetscapeCertTypeExtension;
-Lsun/security/x509/OCSPNoCheckExtension;
-Lsun/security/x509/OIDMap;
-Lsun/security/x509/OIDMap$OIDInfo;
-Lsun/security/x509/PKIXExtensions;
-Lsun/security/x509/PolicyConstraintsExtension;
-Lsun/security/x509/PolicyInformation;
-Lsun/security/x509/PolicyMappingsExtension;
-Lsun/security/x509/PrivateKeyUsageExtension;
-Lsun/security/x509/RDN;
-Lsun/security/x509/SerialNumber;
-Lsun/security/x509/SubjectAlternativeNameExtension;
-Lsun/security/x509/SubjectInfoAccessExtension;
-Lsun/security/x509/SubjectKeyIdentifierExtension;
-Lsun/security/x509/URIName;
-Lsun/security/x509/X500Name;
-Lsun/security/x509/X500Name$1;
-Lsun/security/x509/X509AttributeName;
-Lsun/security/x509/X509CertImpl;
-Lsun/security/x509/X509CertInfo;
-Lsun/security/x509/X509Key;
-Lsun/util/calendar/AbstractCalendar;
-Lsun/util/calendar/BaseCalendar;
-Lsun/util/calendar/BaseCalendar$Date;
-Lsun/util/calendar/CalendarDate;
-Lsun/util/calendar/CalendarSystem;
-Lsun/util/calendar/CalendarUtils;
-Lsun/util/calendar/Gregorian;
-Lsun/util/calendar/Gregorian$Date;
-Lsun/util/calendar/JulianCalendar;
-Lsun/util/calendar/LocalGregorianCalendar;
-Lsun/util/locale/BaseLocale;
-Lsun/util/locale/BaseLocale$Cache;
-Lsun/util/locale/BaseLocale$Key;
-Lsun/util/locale/InternalLocaleBuilder;
-Lsun/util/locale/InternalLocaleBuilder$CaseInsensitiveChar;
-Lsun/util/locale/LanguageTag;
-Lsun/util/locale/LocaleObjectCache;
-Lsun/util/locale/LocaleObjectCache$CacheEntry;
-Lsun/util/locale/LocaleSyntaxException;
-Lsun/util/locale/LocaleUtils;
-Lsun/util/locale/ParseStatus;
-Lsun/util/locale/StringTokenIterator;
-Lsun/util/logging/LoggingProxy;
-Lsun/util/logging/LoggingSupport;
-Lsun/util/logging/LoggingSupport$1;
-Lsun/util/logging/PlatformLogger;
-Lsun/util/logging/PlatformLogger$1;
-Lsun/util/logging/PlatformLogger$Level;
-LV;
-LZ;
diff --git a/services/tests/notification/Android.mk b/services/tests/notification/Android.mk
index 79f96fd..597a584 100644
--- a/services/tests/notification/Android.mk
+++ b/services/tests/notification/Android.mk
@@ -28,6 +28,7 @@
LOCAL_JAVA_LIBRARIES := android.test.runner
LOCAL_JACK_FLAGS := --multi-dex native
+LOCAL_DX_FLAGS := --multi-dex
LOCAL_PACKAGE_NAME := FrameworksNotificationTests
LOCAL_COMPATIBILITY_SUITE := device-tests
@@ -51,9 +52,4 @@
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
-# Code coverage puts us over the dex limit, so enable multi-dex for coverage-enabled builds
-ifeq (true,$(EMMA_INSTRUMENT))
-LOCAL_JACK_FLAGS := --multi-dex native
-endif # EMMA_INSTRUMENT_STATIC
-
include $(BUILD_PACKAGE)
diff --git a/services/tests/notification/src/com/android/server/notification/BuzzBeepBlinkTest.java b/services/tests/notification/src/com/android/server/notification/BuzzBeepBlinkTest.java
index b023126..835603a 100644
--- a/services/tests/notification/src/com/android/server/notification/BuzzBeepBlinkTest.java
+++ b/services/tests/notification/src/com/android/server/notification/BuzzBeepBlinkTest.java
@@ -76,7 +76,8 @@
@Mock Vibrator mVibrator;
@Mock android.media.IRingtonePlayer mRingtonePlayer;
@Mock Light mLight;
- @Mock Handler mHandler;
+ @Mock
+ NotificationManagerService.WorkerHandler mHandler;
@Mock
NotificationUsageStats mUsageStats;
diff --git a/services/tests/notification/src/com/android/server/notification/ManagedServicesTest.java b/services/tests/notification/src/com/android/server/notification/ManagedServicesTest.java
new file mode 100644
index 0000000..bd65f57
--- /dev/null
+++ b/services/tests/notification/src/com/android/server/notification/ManagedServicesTest.java
@@ -0,0 +1,694 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.server.notification;
+
+import static com.android.server.notification.ManagedServices.APPROVAL_BY_COMPONENT;
+import static com.android.server.notification.ManagedServices.APPROVAL_BY_PACKAGE;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.IPackageManager;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
+import android.content.pm.UserInfo;
+import android.os.IBinder;
+import android.os.IInterface;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.util.ArrayMap;
+import android.util.Xml;
+
+import com.android.internal.util.FastXmlSerializer;
+
+import com.google.android.collect.Lists;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlSerializer;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+public class ManagedServicesTest extends NotificationTestCase {
+
+ @Mock
+ private IPackageManager mIpm;
+ @Mock
+ private PackageManager mPm;
+ @Mock
+ private UserManager mUm;
+ @Mock
+ private ManagedServices.UserProfiles mUserProfiles;
+ Object mLock = new Object();
+
+ UserInfo mZero = new UserInfo(0, "zero", 0);
+ UserInfo mTen = new UserInfo(10, "ten", 0);
+
+ private static final String SETTING = "setting";
+ private static final String SECONDARY_SETTING = "secondary_setting";
+
+ private ArrayMap<Integer, String> mExpectedPrimaryPackages;
+ private ArrayMap<Integer, String> mExpectedPrimaryComponentNames;
+ private ArrayMap<Integer, String> mExpectedSecondaryPackages;
+ private ArrayMap<Integer, String> mExpectedSecondaryComponentNames;
+
+ private ArrayMap<Integer, ArrayMap<Integer, String>> mExpectedPrimary = new ArrayMap<>();
+ private ArrayMap<Integer, ArrayMap<Integer, String>> mExpectedSecondary = new ArrayMap<>();
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+
+ getContext().setMockPackageManager(mPm);
+ getContext().addMockSystemService(Context.USER_SERVICE, mUm);
+
+ List<UserInfo> users = new ArrayList<>();
+ users.add(mZero);
+ users.add(mTen);
+ users.add(new UserInfo(11, "11", 0));
+ users.add(new UserInfo(12, "12", 0));
+ for (UserInfo user : users) {
+ when(mUm.getUserInfo(eq(user.id))).thenReturn(user);
+ }
+ when(mUm.getUsers()).thenReturn(users);
+ when(mUserProfiles.getCurrentProfileIds()).thenReturn(new int[] {0, 10, 11, 12});
+
+ mExpectedPrimaryPackages = new ArrayMap<>();
+ mExpectedPrimaryPackages.put(0, "this.is.a.package.name:another.package");
+ mExpectedPrimaryPackages.put(10, "this.is.another.package");
+ mExpectedPrimaryPackages.put(11, "");
+ mExpectedPrimaryPackages.put(12, "bananas!");
+ mExpectedPrimaryComponentNames = new ArrayMap<>();
+ mExpectedPrimaryComponentNames.put(0, "this.is.a.package.name/Ba:another.package/B1");
+ mExpectedPrimaryComponentNames.put(10, "this.is.another.package/M1");
+ mExpectedPrimaryComponentNames.put(11, "");
+ mExpectedPrimaryComponentNames.put(12, "bananas!/Bananas!");
+ mExpectedPrimary.put(APPROVAL_BY_PACKAGE, mExpectedPrimaryPackages);
+ mExpectedPrimary.put(APPROVAL_BY_COMPONENT, mExpectedPrimaryComponentNames);
+
+ mExpectedSecondaryComponentNames = new ArrayMap<>();
+ mExpectedSecondaryComponentNames.put(0, "secondary/component.Name");
+ mExpectedSecondaryComponentNames.put(10,
+ "this.is.another.package/with.Component:component/2:package/component2");
+ mExpectedSecondaryPackages = new ArrayMap<>();
+ mExpectedSecondaryPackages.put(0, "secondary");
+ mExpectedSecondaryPackages.put(10,
+ "this.is.another.package:component:package");
+ mExpectedSecondary.put(APPROVAL_BY_PACKAGE, mExpectedSecondaryPackages);
+ mExpectedSecondary.put(APPROVAL_BY_COMPONENT, mExpectedSecondaryComponentNames);
+ }
+
+ @Test
+ public void testBackupAndRestore_migration() throws Exception {
+ for (int approvalLevel : new int[] {APPROVAL_BY_COMPONENT, APPROVAL_BY_PACKAGE}) {
+ ManagedServices service = new TestManagedServices(getContext(), mLock, mUserProfiles,
+ mIpm, approvalLevel);
+
+ for (int userId : mExpectedPrimary.get(approvalLevel).keySet()) {
+ service.onSettingRestored(
+ service.getConfig().secureSettingName,
+ mExpectedPrimary.get(approvalLevel).get(userId),
+ userId);
+ }
+ verifyExpectedApprovedEntries(service, true);
+
+ for (int userId : mExpectedSecondary.get(approvalLevel).keySet()) {
+ service.onSettingRestored(service.getConfig().secondarySettingName,
+ mExpectedSecondary.get(approvalLevel).get(userId), userId);
+ }
+ verifyExpectedApprovedEntries(service);
+ }
+ }
+
+ @Test
+ public void testReadXml_migrationFromSettings() throws Exception {
+ for (int approvalLevel : new int[] {APPROVAL_BY_COMPONENT, APPROVAL_BY_PACKAGE}) {
+ ManagedServices service = new TestManagedServices(getContext(), mLock, mUserProfiles,
+ mIpm, approvalLevel);
+
+ // approved services aren't in xml
+ XmlPullParser parser = Xml.newPullParser();
+ parser.setInput(new BufferedInputStream(new ByteArrayInputStream(new byte[]{})),
+ null);
+ writeExpectedValuesToSettings(approvalLevel);
+
+ service.migrateToXml();
+
+ verifyExpectedApprovedEntries(service);
+ }
+ }
+
+ @Test
+ public void testReadXml() throws Exception {
+ for (int approvalLevel : new int[] {APPROVAL_BY_COMPONENT, APPROVAL_BY_PACKAGE}) {
+ ManagedServices service = new TestManagedServices(getContext(), mLock, mUserProfiles,
+ mIpm, approvalLevel);
+
+ loadXml(service);
+
+ verifyExpectedApprovedEntries(service);
+ }
+ }
+
+ @Test
+ public void testWriteXml_trimsMissingServices() throws Exception {
+ for (int approvalLevel : new int[] {APPROVAL_BY_COMPONENT, APPROVAL_BY_PACKAGE}) {
+ ManagedServices service = new TestManagedServices(getContext(), mLock, mUserProfiles,
+ mIpm, approvalLevel);
+ loadXml(service);
+
+ // remove missing
+ mExpectedPrimaryPackages.put(0, "another.package");
+ mExpectedPrimaryPackages.remove(12);
+ mExpectedPrimaryComponentNames.put(0, "another.package/B1");
+ mExpectedPrimaryComponentNames.remove(12);
+ mExpectedSecondaryPackages.put(10, "this.is.another.package:component");
+ mExpectedSecondaryComponentNames.put(
+ 10, "this.is.another.package/with.Component:component/2");
+
+ for (UserInfo userInfo : mUm.getUsers()) {
+ List<String> entriesExpectedToHaveServices = new ArrayList<>();
+ if (mExpectedPrimary.get(approvalLevel).containsKey(userInfo.id)) {
+ for (String packageOrComponent :
+ mExpectedPrimary.get(approvalLevel).get(userInfo.id).split(":")) {
+ if (!TextUtils.isEmpty(packageOrComponent)) {
+ entriesExpectedToHaveServices.add(
+ service.getPackageName(packageOrComponent));
+ }
+ }
+ }
+ if (mExpectedSecondary.get(approvalLevel).containsKey(userInfo.id)) {
+ for (String packageOrComponent :
+ mExpectedSecondary.get(approvalLevel).get(userInfo.id).split(":")) {
+ if (!TextUtils.isEmpty(packageOrComponent)) {
+ entriesExpectedToHaveServices.add(
+ service.getPackageName(packageOrComponent));
+ }
+ }
+ }
+ addExpectedServices(service, entriesExpectedToHaveServices, userInfo.id);
+ }
+
+ XmlSerializer serializer = new FastXmlSerializer();
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ serializer.setOutput(new BufferedOutputStream(baos), "utf-8");
+ serializer.startDocument(null, true);
+ service.writeXml(serializer, true);
+ serializer.endDocument();
+ serializer.flush();
+
+ XmlPullParser parser = Xml.newPullParser();
+ parser.setInput(new BufferedInputStream(
+ new ByteArrayInputStream(baos.toByteArray())), null);
+ parser.nextTag();
+ service.readXml(parser);
+
+ verifyExpectedApprovedEntries(service);
+ assertFalse(service.isPackageOrComponentAllowed("this.is.a.package.name", 0));
+ assertFalse(service.isPackageOrComponentAllowed("bananas!", 12));
+ assertFalse(service.isPackageOrComponentAllowed("package/component2", 10));
+ }
+ }
+
+ @Test
+ public void testWriteXml_writesSetting() throws Exception {
+ for (int approvalLevel : new int[] {APPROVAL_BY_COMPONENT, APPROVAL_BY_PACKAGE}) {
+ ManagedServices service = new TestManagedServices(getContext(), mLock, mUserProfiles,
+ mIpm, approvalLevel);
+ loadXml(service);
+
+ XmlSerializer serializer = new FastXmlSerializer();
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ serializer.setOutput(new BufferedOutputStream(baos), "utf-8");
+ serializer.startDocument(null, true);
+ service.writeXml(serializer, false);
+ serializer.endDocument();
+ serializer.flush();
+
+ for (int userId : mUserProfiles.getCurrentProfileIds()) {
+ List<String> expected =
+ stringToList(mExpectedPrimary.get(approvalLevel).get(userId));
+ List<String> actual = stringToList(Settings.Secure.getStringForUser(
+ getContext().getContentResolver(),
+ service.getConfig().secureSettingName, userId));
+ assertContentsInAnyOrder(actual, expected);
+ }
+ }
+ }
+
+ @Test
+ public void rebindServices_onlyBindsExactMatchesIfComponent() throws Exception {
+ // If the primary and secondary lists contain component names, only those components within
+ // the package should be matched
+ ManagedServices service = new TestManagedServices(getContext(), mLock, mUserProfiles,
+ mIpm,
+ ManagedServices.APPROVAL_BY_COMPONENT);
+
+ List<String> packages = new ArrayList<>();
+ packages.add("package");
+ packages.add("anotherPackage");
+ addExpectedServices(service, packages, 0);
+
+ // only 2 components are approved per package
+ mExpectedPrimaryComponentNames.clear();
+ mExpectedPrimaryComponentNames.put(0, "package/C1:package/C2");
+ mExpectedSecondaryComponentNames.clear();
+ mExpectedSecondaryComponentNames.put(0, "anotherPackage/C1:anotherPackage/C2");
+
+ loadXml(service);
+
+ // verify the 2 components per package are enabled (bound)
+ verifyExpectedBoundEntries(service, true);
+ verifyExpectedBoundEntries(service, false);
+
+ // verify the last component per package is not enabled/we don't try to bind to it
+ for (String pkg : packages) {
+ ComponentName unapprovedAdditionalComponent =
+ ComponentName.unflattenFromString(pkg + "/C3");
+ assertFalse(
+ service.isComponentEnabledForCurrentProfiles(
+ unapprovedAdditionalComponent));
+ verify(mIpm, never()).getServiceInfo(
+ eq(unapprovedAdditionalComponent), anyInt(), anyInt());
+ }
+ }
+
+ @Test
+ public void rebindServices_bindsEverythingInAPackage() throws Exception {
+ // If the primary and secondary lists contain packages, all components within those packages
+ // should be bound
+ ManagedServices service = new TestManagedServices(getContext(), mLock, mUserProfiles, mIpm,
+ APPROVAL_BY_PACKAGE);
+
+ List<String> packages = new ArrayList<>();
+ packages.add("package");
+ packages.add("packagea");
+ addExpectedServices(service, packages, 0);
+
+ // 2 approved packages
+ mExpectedPrimaryPackages.clear();
+ mExpectedPrimaryPackages.put(0, "package");
+ mExpectedSecondaryPackages.clear();
+ mExpectedSecondaryPackages.put(0, "packagea");
+
+ loadXml(service);
+
+ // verify the 3 components per package are enabled (bound)
+ verifyExpectedBoundEntries(service, true);
+ verifyExpectedBoundEntries(service, false);
+ }
+
+ @Test
+ public void testPackageUninstall_packageNoLongerInApprovedList() throws Exception {
+ for (int approvalLevel : new int[] {APPROVAL_BY_COMPONENT, APPROVAL_BY_PACKAGE}) {
+ ManagedServices service = new TestManagedServices(getContext(), mLock, mUserProfiles,
+ mIpm, approvalLevel);
+ writeExpectedValuesToSettings(approvalLevel);
+ service.migrateToXml();
+
+ mExpectedPrimaryPackages.put(0, "another.package");
+ mExpectedPrimaryComponentNames.put(0, "another.package/B1");
+ service.onPackagesChanged(true, new String[]{"this.is.a.package.name"}, new int[]{103});
+
+ verifyExpectedApprovedEntries(service);
+ }
+ }
+
+ @Test
+ public void testPackageUninstall_componentNoLongerInApprovedList() throws Exception {
+ for (int approvalLevel : new int[] {APPROVAL_BY_COMPONENT, APPROVAL_BY_PACKAGE}) {
+ ManagedServices service = new TestManagedServices(getContext(), mLock, mUserProfiles,
+ mIpm, approvalLevel);
+ writeExpectedValuesToSettings(approvalLevel);
+ service.migrateToXml();
+
+ mExpectedSecondaryComponentNames.put(10, "component/2");
+ mExpectedSecondaryPackages.put(10, "component");
+ service.onPackagesChanged(true, new String[]{"this.is.another.package"}, new int[]{
+ UserHandle.PER_USER_RANGE + 1});
+
+ verifyExpectedApprovedEntries(service);
+ }
+ }
+
+ @Test
+ public void testSetPackageOrComponentEnabled() throws Exception {
+ for (int approvalLevel : new int[] {APPROVAL_BY_COMPONENT, APPROVAL_BY_PACKAGE}) {
+ ManagedServices service = new TestManagedServices(getContext(), mLock, mUserProfiles,
+ mIpm, approvalLevel);
+ ArrayMap<Integer, ArrayList<String>> expectedEnabled = new ArrayMap<>();
+ expectedEnabled.put(0,
+ Lists.newArrayList(new String[]{"package/Comp", "package/C2", "again/M4"}));
+ expectedEnabled.put(10,
+ Lists.newArrayList(new String[]{"user10package/B", "user10/Component",
+ "user10package1/K", "user10.3/Component", "user10package2/L",
+ "user10.4/Component"}));
+
+ for (int userId : expectedEnabled.keySet()) {
+ ArrayList<String> expectedForUser = expectedEnabled.get(userId);
+ for (int i = 0; i < expectedForUser.size(); i++) {
+ boolean primary = i % 2 == 0;
+ service.setPackageOrComponentEnabled(expectedForUser.get(i), userId, primary,
+ true);
+ }
+ }
+
+ // verify everything added is approved
+ for (int userId : expectedEnabled.keySet()) {
+ ArrayList<String> expectedForUser = expectedEnabled.get(userId);
+ for (int i = 0; i < expectedForUser.size(); i++) {
+ String verifyValue = (approvalLevel == APPROVAL_BY_COMPONENT)
+ ? expectedForUser.get(i)
+ : service.getPackageName(expectedForUser.get(i));
+ assertTrue("Not allowed: user: " + userId + " entry: " + verifyValue
+ + " for approval level " + approvalLevel,
+ service.isPackageOrComponentAllowed(verifyValue, userId));
+ }
+ }
+
+ ArrayMap<Integer, ArrayList<String>> expectedNoAccess = new ArrayMap<>();
+ for (int userId : expectedEnabled.keySet()) {
+ ArrayList<String> expectedForUser = expectedEnabled.get(userId);
+ for (int i = expectedForUser.size() - 1; i >= 0; i--) {
+ ArrayList<String> removed = new ArrayList<>();
+ if (i % 3 == 0) {
+ String revokeAccessFor = expectedForUser.remove(i);
+ removed.add(revokeAccessFor);
+ service.setPackageOrComponentEnabled(
+ revokeAccessFor, userId, i % 2 == 0, false);
+ }
+ expectedNoAccess.put(userId, removed);
+ }
+ }
+
+ // verify everything still there is approved
+ for (int userId : expectedEnabled.keySet()) {
+ ArrayList<String> expectedForUser = expectedEnabled.get(userId);
+ for (int i = 0; i < expectedForUser.size(); i++) {
+ String verifyValue = (approvalLevel == APPROVAL_BY_COMPONENT)
+ ? expectedForUser.get(i)
+ : service.getPackageName(expectedForUser.get(i));
+ assertTrue("Not allowed: user: " + userId + " entry: " + verifyValue,
+ service.isPackageOrComponentAllowed(verifyValue, userId));
+ }
+ }
+ // verify everything removed isn't
+ for (int userId : expectedNoAccess.keySet()) {
+ ArrayList<String> notExpectedForUser = expectedNoAccess.get(userId);
+ for (int i = 0; i < notExpectedForUser.size(); i++) {
+ assertFalse(
+ "Is allowed: user: " + userId + " entry: " + notExpectedForUser.get(i),
+ service.isPackageOrComponentAllowed(notExpectedForUser.get(i), userId));
+ }
+ }
+ }
+ }
+
+ @Test
+ public void testGetAllowedPackages() throws Exception {
+ for (int approvalLevel : new int[] {APPROVAL_BY_COMPONENT, APPROVAL_BY_PACKAGE}) {
+ ManagedServices service = new TestManagedServices(getContext(), mLock, mUserProfiles,
+ mIpm, approvalLevel);
+ loadXml(service);
+
+ List<String> allowedPackagesForUser0 = new ArrayList<>();
+ allowedPackagesForUser0.add("this.is.a.package.name");
+ allowedPackagesForUser0.add("another.package");
+ allowedPackagesForUser0.add("secondary");
+
+ List<String> actual = service.getAllowedPackages(0);
+ assertEquals(3, actual.size());
+ for (String pkg : allowedPackagesForUser0) {
+ assertTrue(actual.contains(pkg));
+ }
+
+ List<String> allowedPackagesForUser10 = new ArrayList<>();
+ allowedPackagesForUser10.add("this.is.another.package");
+ allowedPackagesForUser10.add("package");
+ allowedPackagesForUser10.add("this.is.another.package");
+ allowedPackagesForUser10.add("component");
+
+ actual = service.getAllowedPackages(10);
+ assertEquals(4, actual.size());
+ for (String pkg : allowedPackagesForUser10) {
+ assertTrue(actual.contains(pkg));
+ }
+ }
+ }
+
+ @Test
+ public void testGetAllowedComponents() throws Exception {
+ ManagedServices service = new TestManagedServices(getContext(), mLock, mUserProfiles, mIpm,
+ APPROVAL_BY_COMPONENT);
+ loadXml(service);
+
+ List<ComponentName> expected = new ArrayList<>();
+ expected.add(ComponentName.unflattenFromString("this.is.another.package/M1"));
+ expected.add(ComponentName.unflattenFromString("this.is.another.package/with.Component"));
+ expected.add(ComponentName.unflattenFromString("component/2"));
+ expected.add(ComponentName.unflattenFromString("package/component2"));
+
+ List<ComponentName> actual = service.getAllowedComponents(10);
+
+ assertContentsInAnyOrder(expected, actual);
+
+ assertEquals(expected.size(), actual.size());
+
+ for (ComponentName cn : expected) {
+ assertTrue("Actual missing " + cn, actual.contains(cn));
+ }
+
+ for (ComponentName cn : actual) {
+ assertTrue("Actual contains extra " + cn, expected.contains(cn));
+ }
+ }
+
+ @Test
+ public void testGetAllowedComponents_approvalByPackage() throws Exception {
+ ManagedServices service = new TestManagedServices(getContext(), mLock, mUserProfiles, mIpm,
+ APPROVAL_BY_PACKAGE);
+ loadXml(service);
+
+ assertEquals(0, service.getAllowedComponents(10).size());
+ }
+
+ private void loadXml(ManagedServices service) throws Exception {
+ final StringBuffer xml = new StringBuffer();
+ xml.append("<" + service.getConfig().xmlTag + ">\n");
+ for (int userId : mExpectedPrimary.get(service.mApprovalLevel).keySet()) {
+ xml.append(getXmlEntry(
+ mExpectedPrimary.get(service.mApprovalLevel).get(userId), userId, true));
+ }
+ for (int userId : mExpectedSecondary.get(service.mApprovalLevel).keySet()) {
+ xml.append(getXmlEntry(
+ mExpectedSecondary.get(service.mApprovalLevel).get(userId), userId, false));
+ }
+ xml.append("</" + service.getConfig().xmlTag + ">");
+
+ XmlPullParser parser = Xml.newPullParser();
+ parser.setInput(new BufferedInputStream(
+ new ByteArrayInputStream(xml.toString().getBytes())), null);
+ parser.nextTag();
+ service.readXml(parser);
+ }
+
+ private void addExpectedServices(final ManagedServices service, final List<String> packages,
+ int userId) {
+ when(mPm.queryIntentServicesAsUser(any(), anyInt(), eq(userId))).
+ thenAnswer(new Answer<List<ResolveInfo>>() {
+ @Override
+ public List<ResolveInfo> answer(InvocationOnMock invocationOnMock)
+ throws Throwable {
+ Object[] args = invocationOnMock.getArguments();
+ Intent invocationIntent = (Intent) args[0];
+ if (invocationIntent != null) {
+ if (invocationIntent.getAction().equals(
+ service.getConfig().serviceInterface)
+ && packages.contains(invocationIntent.getPackage())) {
+ List<ResolveInfo> dummyServices = new ArrayList<>();
+ for (int i = 1; i <= 3; i ++) {
+ ResolveInfo resolveInfo = new ResolveInfo();
+ ServiceInfo serviceInfo = new ServiceInfo();
+ serviceInfo.packageName = invocationIntent.getPackage();
+ serviceInfo.name = "C"+i;
+ serviceInfo.permission = service.getConfig().bindPermission;
+ resolveInfo.serviceInfo = serviceInfo;
+ dummyServices.add(resolveInfo);
+ }
+ return dummyServices;
+ }
+ }
+ return new ArrayList<>();
+ }
+ });
+ }
+
+ private List<String> stringToList(String list) {
+ if (list == null) {
+ list = "";
+ }
+ return new ArrayList<>(Lists.newArrayList(list.split(
+ ManagedServices.ENABLED_SERVICES_SEPARATOR)));
+ }
+
+ private void assertContentsInAnyOrder(List<?> expected, List<?> actual) {
+ assertEquals(expected.size(), actual.size());
+
+ for (Object o : expected) {
+ assertTrue("Actual missing " + o, actual.contains(o));
+ }
+
+ for (Object o : actual) {
+ assertTrue("Actual contains extra " + o, expected.contains(o));
+ }
+ }
+
+ private void verifyExpectedBoundEntries(ManagedServices service, boolean primary)
+ throws Exception {
+ ArrayMap<Integer, String> verifyMap = primary ? mExpectedPrimary.get(service.mApprovalLevel)
+ : mExpectedSecondary.get(service.mApprovalLevel);
+ for (int userId : verifyMap.keySet()) {
+ for (String packageOrComponent : verifyMap.get(userId).split(":")) {
+ if (!TextUtils.isEmpty(packageOrComponent)) {
+ if (service.mApprovalLevel == APPROVAL_BY_PACKAGE) {
+ assertTrue(packageOrComponent, service.isComponentEnabledForPackage(packageOrComponent));
+ for (int i = 1; i <= 3; i ++) {
+ ComponentName componentName = ComponentName.unflattenFromString(
+ packageOrComponent +"/C" + i);
+ assertTrue(service.isComponentEnabledForCurrentProfiles(
+ componentName));
+ verify(mIpm, times(1)).getServiceInfo(
+ eq(componentName), anyInt(), anyInt());
+ }
+ } else {
+ ComponentName componentName =
+ ComponentName.unflattenFromString(packageOrComponent);
+ assertTrue(service.isComponentEnabledForCurrentProfiles(componentName));
+ verify(mIpm, times(1)).getServiceInfo(
+ eq(componentName), anyInt(), anyInt());
+ }
+ }
+ }
+ }
+ }
+
+ private void verifyExpectedApprovedEntries(ManagedServices service) {
+ verifyExpectedApprovedEntries(service, true);
+ verifyExpectedApprovedEntries(service, false);
+ }
+
+ private void verifyExpectedApprovedEntries(ManagedServices service, boolean primary) {
+ ArrayMap<Integer, String> verifyMap = primary
+ ? mExpectedPrimary.get(service.mApprovalLevel)
+ : mExpectedSecondary.get(service.mApprovalLevel);
+ for (int userId : verifyMap.keySet()) {
+ for (String verifyValue : verifyMap.get(userId).split(":")) {
+ if (!TextUtils.isEmpty(verifyValue)) {
+ assertTrue("service type " + service.mApprovalLevel + ":"
+ + verifyValue + " is not allowed for user " + userId,
+ service.isPackageOrComponentAllowed(verifyValue, userId));
+ }
+ }
+ }
+ }
+
+ private boolean isPackage(String packageOrComponent) {
+ final ComponentName component = ComponentName.unflattenFromString(packageOrComponent);
+ if (component != null) {
+ return false;
+ }
+ return true;
+ }
+
+ private void writeExpectedValuesToSettings(int approvalLevel) {
+ for (int userId : mExpectedPrimary.get(approvalLevel).keySet()) {
+ Settings.Secure.putStringForUser(getContext().getContentResolver(), SETTING,
+ mExpectedPrimary.get(approvalLevel).get(userId), userId);
+ }
+ for (int userId : mExpectedSecondary.get(approvalLevel).keySet()) {
+ Settings.Secure.putStringForUser(getContext().getContentResolver(), SECONDARY_SETTING,
+ mExpectedSecondary.get(approvalLevel).get(userId), userId);
+ }
+ }
+
+ private String getXmlEntry(String approved, int userId, boolean isPrimary) {
+ return "<" + ManagedServices.TAG_MANAGED_SERVICES + " "
+ + ManagedServices.ATT_USER_ID + "=\"" + userId +"\" "
+ + ManagedServices.ATT_IS_PRIMARY + "=\"" + isPrimary +"\" "
+ + ManagedServices.ATT_APPROVED_LIST + "=\"" + approved +"\" "
+ + "/>\n";
+ }
+
+ class TestManagedServices extends ManagedServices {
+
+ public TestManagedServices(Context context, Object mutex, UserProfiles userProfiles,
+ IPackageManager pm, int approvedServiceType) {
+ super(context, mutex, userProfiles, pm);
+ mApprovalLevel = approvedServiceType;
+ }
+
+ @Override
+ protected Config getConfig() {
+ final Config c = new Config();
+ c.xmlTag = "test";
+ c.secureSettingName = SETTING;
+ c.secondarySettingName = SECONDARY_SETTING;
+ c.bindPermission = "permission";
+ c.serviceInterface = "serviceInterface";
+ return c;
+ }
+
+ @Override
+ protected IInterface asInterface(IBinder binder) {
+ return null;
+ }
+
+ @Override
+ protected boolean checkType(IInterface service) {
+ return false;
+ }
+
+ @Override
+ protected void onServiceAdded(ManagedServiceInfo info) {
+
+ }
+ }
+}
diff --git a/services/tests/notification/src/com/android/server/notification/NotificationAdjustmentExtractorTest.java b/services/tests/notification/src/com/android/server/notification/NotificationAdjustmentExtractorTest.java
new file mode 100644
index 0000000..e527644
--- /dev/null
+++ b/services/tests/notification/src/com/android/server/notification/NotificationAdjustmentExtractorTest.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.notification;
+
+import static android.app.NotificationManager.IMPORTANCE_LOW;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertNull;
+import static junit.framework.Assert.assertTrue;
+
+import android.app.Notification;
+import android.app.NotificationChannel;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.service.notification.Adjustment;
+import android.service.notification.SnoozeCriterion;
+import android.service.notification.StatusBarNotification;
+
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.Objects;
+
+public class NotificationAdjustmentExtractorTest extends NotificationTestCase {
+
+ @Test
+ public void testExtractsAdjustment() {
+ NotificationAdjustmentExtractor extractor = new NotificationAdjustmentExtractor();
+
+ NotificationRecord r = generateRecord();
+
+ Bundle signals = new Bundle();
+ signals.putString(Adjustment.KEY_GROUP_KEY, GroupHelper.AUTOGROUP_KEY);
+ ArrayList<SnoozeCriterion> snoozeCriteria = new ArrayList<>();
+ snoozeCriteria.add(new SnoozeCriterion("n", "n", "n"));
+ signals.putParcelableArrayList(Adjustment.KEY_SNOOZE_CRITERIA, snoozeCriteria);
+ ArrayList<String> people = new ArrayList<>();
+ people.add("you");
+ signals.putStringArrayList(Adjustment.KEY_PEOPLE, people);
+ Adjustment adjustment = new Adjustment("pkg", r.getKey(), signals, "", 0);
+ r.addAdjustment(adjustment);
+
+ assertFalse(r.getGroupKey().contains(GroupHelper.AUTOGROUP_KEY));
+ assertFalse(Objects.equals(people, r.getPeopleOverride()));
+ assertFalse(Objects.equals(snoozeCriteria, r.getSnoozeCriteria()));
+
+ assertNull(extractor.process(r));
+
+ assertTrue(r.getGroupKey().contains(GroupHelper.AUTOGROUP_KEY));
+ assertEquals(people, r.getPeopleOverride());
+ assertEquals(snoozeCriteria, r.getSnoozeCriteria());
+ }
+
+ @Test
+ public void testExtractsAdjustments() {
+ NotificationAdjustmentExtractor extractor = new NotificationAdjustmentExtractor();
+
+ NotificationRecord r = generateRecord();
+
+ Bundle pSignals = new Bundle();
+ ArrayList<String> people = new ArrayList<>();
+ people.add("you");
+ pSignals.putStringArrayList(Adjustment.KEY_PEOPLE, people);
+ Adjustment pAdjustment = new Adjustment("pkg", r.getKey(), pSignals, "", 0);
+ r.addAdjustment(pAdjustment);
+
+ Bundle sSignals = new Bundle();
+ ArrayList<SnoozeCriterion> snoozeCriteria = new ArrayList<>();
+ snoozeCriteria.add(new SnoozeCriterion("n", "n", "n"));
+ sSignals.putParcelableArrayList(Adjustment.KEY_SNOOZE_CRITERIA, snoozeCriteria);
+ Adjustment sAdjustment = new Adjustment("pkg", r.getKey(), sSignals, "", 0);
+ r.addAdjustment(sAdjustment);
+
+ Bundle gSignals = new Bundle();
+ gSignals.putString(Adjustment.KEY_GROUP_KEY, GroupHelper.AUTOGROUP_KEY);
+ Adjustment gAdjustment = new Adjustment("pkg", r.getKey(), gSignals, "", 0);
+ r.addAdjustment(gAdjustment);
+
+ assertFalse(r.getGroupKey().contains(GroupHelper.AUTOGROUP_KEY));
+ assertFalse(Objects.equals(people, r.getPeopleOverride()));
+ assertFalse(Objects.equals(snoozeCriteria, r.getSnoozeCriteria()));
+
+ assertNull(extractor.process(r));
+
+ assertTrue(r.getGroupKey().contains(GroupHelper.AUTOGROUP_KEY));
+ assertEquals(people, r.getPeopleOverride());
+ assertEquals(snoozeCriteria, r.getSnoozeCriteria());
+ }
+
+ private NotificationRecord generateRecord() {
+ NotificationChannel channel = new NotificationChannel("a", "a", IMPORTANCE_LOW);
+ final Notification.Builder builder = new Notification.Builder(getContext())
+ .setContentTitle("foo")
+ .setSmallIcon(android.R.drawable.sym_def_app_icon);
+ Notification n = builder.build();
+ StatusBarNotification sbn = new StatusBarNotification("", "", 0, "", 0,
+ 0, n, UserHandle.ALL, null, System.currentTimeMillis());
+ return new NotificationRecord(getContext(), sbn, channel);
+ }
+}
diff --git a/services/tests/notification/src/com/android/server/notification/NotificationChannelExtractorTest.java b/services/tests/notification/src/com/android/server/notification/NotificationChannelExtractorTest.java
new file mode 100644
index 0000000..d75213c
--- /dev/null
+++ b/services/tests/notification/src/com/android/server/notification/NotificationChannelExtractorTest.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.notification;
+
+import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
+import static android.app.NotificationManager.IMPORTANCE_HIGH;
+import static android.app.NotificationManager.IMPORTANCE_LOW;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertNotNull;
+import static junit.framework.Assert.assertNull;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.when;
+
+import android.app.Notification;
+import android.app.NotificationChannel;
+import android.app.PendingIntent;
+import android.content.Intent;
+import android.os.UserHandle;
+import android.service.notification.StatusBarNotification;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+public class NotificationChannelExtractorTest extends NotificationTestCase {
+
+ @Mock RankingConfig mConfig;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ }
+
+ @Test
+ public void testExtractsUpdatedChannel() {
+ NotificationChannelExtractor extractor = new NotificationChannelExtractor();
+ extractor.setConfig(mConfig);
+
+ NotificationChannel channel = new NotificationChannel("a", "a", IMPORTANCE_LOW);
+ final Notification.Builder builder = new Notification.Builder(getContext())
+ .setContentTitle("foo")
+ .setSmallIcon(android.R.drawable.sym_def_app_icon);
+ Notification n = builder.build();
+ StatusBarNotification sbn = new StatusBarNotification("", "", 0, "", 0,
+ 0, n, UserHandle.ALL, null, System.currentTimeMillis());
+ NotificationRecord r = new NotificationRecord(getContext(), sbn, channel);
+
+ NotificationChannel updatedChannel =
+ new NotificationChannel("a", "", IMPORTANCE_HIGH);
+ when(mConfig.getNotificationChannel(any(), anyInt(), eq("a"), eq(false)))
+ .thenReturn(updatedChannel);
+
+ assertNull(extractor.process(r));
+ assertEquals(updatedChannel, r.getChannel());
+ }
+
+}
diff --git a/services/tests/notification/src/com/android/server/notification/NotificationIntrusivenessExtractorTest.java b/services/tests/notification/src/com/android/server/notification/NotificationIntrusivenessExtractorTest.java
new file mode 100644
index 0000000..85852f9
--- /dev/null
+++ b/services/tests/notification/src/com/android/server/notification/NotificationIntrusivenessExtractorTest.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.notification;
+
+import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
+import static android.app.NotificationManager.IMPORTANCE_LOW;
+
+import static com.android.server.notification.NotificationIntrusivenessExtractor.HANG_TIME_MS;
+
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertNotNull;
+import static junit.framework.Assert.assertNull;
+
+import android.app.Notification;
+import android.app.NotificationChannel;
+import android.app.PendingIntent;
+import android.content.Intent;
+import android.os.UserHandle;
+import android.service.notification.StatusBarNotification;
+
+import org.junit.Test;
+
+public class NotificationIntrusivenessExtractorTest extends NotificationTestCase {
+
+ @Test
+ public void testNonIntrusive() {
+ NotificationChannel channel = new NotificationChannel("a", "a", IMPORTANCE_LOW);
+ final Notification.Builder builder = new Notification.Builder(getContext())
+ .setContentTitle("foo")
+ .setSmallIcon(android.R.drawable.sym_def_app_icon);
+
+ Notification n = builder.build();
+ StatusBarNotification sbn = new StatusBarNotification("", "", 0, "", 0,
+ 0, n, UserHandle.ALL, null, System.currentTimeMillis());
+ NotificationRecord r = new NotificationRecord(getContext(), sbn, channel);
+
+ assertNull(new NotificationIntrusivenessExtractor().process(r));
+ }
+
+ @Test
+ public void testIntrusive_fillScreen() {
+ NotificationChannel channel = new NotificationChannel("a", "a", IMPORTANCE_DEFAULT);
+ final Notification.Builder builder = new Notification.Builder(getContext())
+ .setContentTitle("foo")
+ .setFullScreenIntent(PendingIntent.getActivity(
+ getContext(), 0, new Intent(""), 0), true)
+ .setSmallIcon(android.R.drawable.sym_def_app_icon);
+
+ Notification n = builder.build();
+ StatusBarNotification sbn = new StatusBarNotification("", "", 0, "", 0,
+ 0, n, UserHandle.ALL, null,
+ System.currentTimeMillis());
+ NotificationRecord r = new NotificationRecord(getContext(), sbn, channel);
+
+ assertNotNull(new NotificationIntrusivenessExtractor().process(r));
+ }
+
+ @Test
+ public void testOldNotificationsNotIntrusive() {
+ NotificationChannel channel = new NotificationChannel("a", "a", IMPORTANCE_DEFAULT);
+ final Notification.Builder builder = new Notification.Builder(getContext())
+ .setContentTitle("foo")
+ .setFullScreenIntent(PendingIntent.getActivity(
+ getContext(), 0, new Intent(""), 0), true)
+ .setSmallIcon(android.R.drawable.sym_def_app_icon);
+
+ Notification n = builder.build();
+ StatusBarNotification sbn = new StatusBarNotification("", "", 0, "", 0,
+ 0, n, UserHandle.ALL, null,
+ System.currentTimeMillis() - HANG_TIME_MS);
+
+ NotificationRecord r = new NotificationRecord(getContext(), sbn, channel);
+ assertNull(new NotificationIntrusivenessExtractor().process(r));
+ assertFalse(r.isRecentlyIntrusive());
+ }
+}
diff --git a/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java
index 3801697..09af1e2 100644
--- a/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -31,6 +31,7 @@
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
@@ -38,6 +39,7 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.app.ActivityManager;
import android.app.INotificationManager;
import android.app.Notification;
import android.app.NotificationChannel;
@@ -58,23 +60,36 @@
import android.provider.Settings.Secure;
import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
+import android.service.notification.ZenModeConfig;
import android.test.suitebuilder.annotation.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
+import android.util.ArrayMap;
+import android.util.AtomicFile;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
+import com.android.server.lights.Light;
+import com.android.server.lights.LightsManager;
+import com.android.server.notification.NotificationManagerService.NotificationAssistants;
+import com.android.server.notification.NotificationManagerService.NotificationListeners;
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import org.mockito.stubbing.Answer;
-import com.android.server.lights.Light;
-import com.android.server.lights.LightsManager;
+import java.io.BufferedInputStream;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
@SmallTest
@RunWith(AndroidTestingRunner.class)
@@ -94,17 +109,26 @@
private TestableLooper mTestableLooper;
@Mock
private RankingHelper mRankingHelper;
+ AtomicFile mPolicyFile;
+ File mFile;
@Mock
private NotificationUsageStats mUsageStats;
@Mock
private AudioManager mAudioManager;
+ @Mock
+ ActivityManager mActivityManager;
+ NotificationManagerService.WorkerHandler mHandler;
+
private NotificationChannel mTestNotificationChannel = new NotificationChannel(
TEST_CHANNEL_ID, TEST_CHANNEL_ID, NotificationManager.IMPORTANCE_DEFAULT);
@Mock
- private NotificationManagerService.NotificationListeners mNotificationListeners;
+ private NotificationListeners mListeners;
+ @Mock private NotificationAssistants mAssistants;
+ @Mock private ConditionProviders mConditionProviders;
private ManagedServices.ManagedServiceInfo mListener;
@Mock private ICompanionDeviceManager mCompanionMgr;
@Mock SnoozeHelper mSnoozeHelper;
+ @Mock GroupHelper mGroupHelper;
// Use a Testable subclass so we can simulate calls from the system without failing.
private static class TestableNotificationManagerService extends NotificationManagerService {
@@ -137,6 +161,9 @@
mNotificationManagerService = new TestableNotificationManagerService(mContext);
+ // Use this testable looper.
+ mTestableLooper = TestableLooper.get(this);
+ mHandler = mNotificationManagerService.new WorkerHandler(mTestableLooper.getLooper());
// MockPackageManager - default returns ApplicationInfo with matching calling UID
final ApplicationInfo applicationInfo = new ApplicationInfo();
applicationInfo.uid = mUid;
@@ -147,22 +174,44 @@
final LightsManager mockLightsManager = mock(LightsManager.class);
when(mockLightsManager.getLight(anyInt())).thenReturn(mock(Light.class));
when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_NORMAL);
- // Use this testable looper.
- mTestableLooper = TestableLooper.get(this);
- mListener = mNotificationListeners.new ManagedServiceInfo(
+ // write to a test file; the system file isn't readable from tests
+ mFile = new File(mContext.getCacheDir(), "test.xml");
+ mFile.createNewFile();
+ final String preupgradeXml = "<notification-policy></notification-policy>";
+ mPolicyFile = new AtomicFile(mFile);
+ FileOutputStream fos = mPolicyFile.startWrite();
+ fos.write(preupgradeXml.getBytes());
+ mPolicyFile.finishWrite(fos);
+ FileInputStream fStream = new FileInputStream(mFile);
+
+ // Setup managed services
+ mListener = mListeners.new ManagedServiceInfo(
null, new ComponentName(PKG, "test_class"), mUid, true, null, 0);
- when(mNotificationListeners.checkServiceTokenLocked(any())).thenReturn(mListener);
+ when(mListeners.checkServiceTokenLocked(any())).thenReturn(mListener);
+ ManagedServices.Config listenerConfig = new ManagedServices.Config();
+ listenerConfig.xmlTag = NotificationListeners.TAG_ENABLED_NOTIFICATION_LISTENERS;
+ when(mListeners.getConfig()).thenReturn(listenerConfig);
+ ManagedServices.Config assistantConfig = new ManagedServices.Config();
+ assistantConfig.xmlTag = NotificationAssistants.TAG_ENABLED_NOTIFICATION_ASSISTANTS;
+ when(mAssistants.getConfig()).thenReturn(assistantConfig);
+ ManagedServices.Config dndConfig = new ManagedServices.Config();
+ dndConfig.xmlTag = ConditionProviders.TAG_ENABLED_DND_APPS;
+ when(mConditionProviders.getConfig()).thenReturn(dndConfig);
+
try {
- mNotificationManagerService.init(mTestableLooper.getLooper(), mPackageManager,
- mPackageManagerClient, mockLightsManager, mNotificationListeners,
- mCompanionMgr, mSnoozeHelper, mUsageStats);
+ mNotificationManagerService.init(mTestableLooper.getLooper(),
+ mPackageManager, mPackageManagerClient, mockLightsManager,
+ mListeners, mAssistants, mConditionProviders,
+ mCompanionMgr, mSnoozeHelper, mUsageStats, mPolicyFile, mActivityManager,
+ mGroupHelper);
} catch (SecurityException e) {
if (!e.getMessage().contains("Permission Denial: not allowed to send broadcast")) {
throw e;
}
}
mNotificationManagerService.setAudioManager(mAudioManager);
+
// Tests call directly into the Binder.
mBinderService = mNotificationManagerService.getBinderService();
mInternalService = mNotificationManagerService.getInternalService();
@@ -171,6 +220,11 @@
PKG, new ParceledListSlice(Arrays.asList(mTestNotificationChannel)));
}
+ @After
+ public void tearDown() throws Exception {
+ mFile.delete();
+ }
+
public void waitForIdle() throws Exception {
mTestableLooper.processAllMessages();
}
@@ -207,6 +261,43 @@
return new NotificationRecord(mContext, sbn, channel);
}
+ private Map<String, Answer> getSignalExtractorSideEffects() {
+ Map<String, Answer> answers = new ArrayMap<>();
+
+ answers.put("override group key", invocationOnMock -> {
+ ((NotificationRecord) invocationOnMock.getArguments()[0])
+ .setOverrideGroupKey("bananas");
+ return null;
+ });
+ answers.put("override people", invocationOnMock -> {
+ ((NotificationRecord) invocationOnMock.getArguments()[0])
+ .setPeopleOverride(new ArrayList<>());
+ return null;
+ });
+ answers.put("snooze criteria", invocationOnMock -> {
+ ((NotificationRecord) invocationOnMock.getArguments()[0])
+ .setSnoozeCriteria(new ArrayList<>());
+ return null;
+ });
+ answers.put("notification channel", invocationOnMock -> {
+ ((NotificationRecord) invocationOnMock.getArguments()[0])
+ .updateNotificationChannel(new NotificationChannel("a", "", IMPORTANCE_LOW));
+ return null;
+ });
+ answers.put("badging", invocationOnMock -> {
+ NotificationRecord r = (NotificationRecord) invocationOnMock.getArguments()[0];
+ r.setShowBadge(!r.canShowBadge());
+ return null;
+ });
+ answers.put("package visibility", invocationOnMock -> {
+ ((NotificationRecord) invocationOnMock.getArguments()[0]).setPackageVisibilityOverride(
+ Notification.VISIBILITY_SECRET);
+ return null;
+ });
+
+ return answers;
+ }
+
@Test
public void testCreateNotificationChannels_SingleChannel() throws Exception {
final NotificationChannel channel =
@@ -242,6 +333,42 @@
}
@Test
+ public void testCreateNotificationChannels_SecondCreateDoesNotChangeImportance()
+ throws Exception {
+ final NotificationChannel channel =
+ new NotificationChannel("id", "name", NotificationManager.IMPORTANCE_DEFAULT);
+ mBinderService.createNotificationChannels(PKG,
+ new ParceledListSlice(Arrays.asList(channel)));
+
+ // Recreating the channel doesn't throw, but ignores importance.
+ final NotificationChannel dupeChannel =
+ new NotificationChannel("id", "name", NotificationManager.IMPORTANCE_HIGH);
+ mBinderService.createNotificationChannels(PKG,
+ new ParceledListSlice(Arrays.asList(dupeChannel)));
+ final NotificationChannel createdChannel =
+ mBinderService.getNotificationChannel(PKG, "id");
+ assertEquals(NotificationManager.IMPORTANCE_DEFAULT, createdChannel.getImportance());
+ }
+
+ @Test
+ public void testCreateNotificationChannels_SecondCreateAllowedToDowngradeImportance()
+ throws Exception {
+ final NotificationChannel channel =
+ new NotificationChannel("id", "name", NotificationManager.IMPORTANCE_DEFAULT);
+ mBinderService.createNotificationChannels(PKG,
+ new ParceledListSlice(Arrays.asList(channel)));
+
+ // Recreating with a lower importance is allowed to modify the channel.
+ final NotificationChannel dupeChannel =
+ new NotificationChannel("id", "name", NotificationManager.IMPORTANCE_LOW);
+ mBinderService.createNotificationChannels(PKG,
+ new ParceledListSlice(Arrays.asList(dupeChannel)));
+ final NotificationChannel createdChannel =
+ mBinderService.getNotificationChannel(PKG, "id");
+ assertEquals(NotificationManager.IMPORTANCE_LOW, createdChannel.getImportance());
+ }
+
+ @Test
public void testCreateNotificationChannels_CannotDowngradeImportanceIfAlreadyUpdated()
throws Exception {
final NotificationChannel channel =
@@ -295,7 +422,7 @@
NotificationChannel channel = new NotificationChannel("id", "name",
NotificationManager.IMPORTANCE_HIGH);
- channel.setImportance(NotificationManager.IMPORTANCE_NONE);
+ channel.setImportance(IMPORTANCE_NONE);
NotificationRecord r = generateNotificationRecord(channel);
assertTrue(mNotificationManagerService.isBlocked(r, mUsageStats));
verify(mUsageStats, times(1)).registerBlocked(eq(r));
@@ -510,6 +637,93 @@
}
@Test
+ public void testAppInitiatedCancelAllNotifications_CancelsNoClearFlag() throws Exception {
+ final StatusBarNotification sbn = generateNotificationRecord(null).sbn;
+ sbn.getNotification().flags |= Notification.FLAG_NO_CLEAR;
+ mBinderService.enqueueNotificationWithTag(PKG, "opPkg", "tag",
+ sbn.getId(), sbn.getNotification(), sbn.getUserId());
+ mBinderService.cancelAllNotifications(PKG, sbn.getUserId());
+ waitForIdle();
+ StatusBarNotification[] notifs =
+ mBinderService.getActiveNotifications(sbn.getPackageName());
+ assertEquals(0, notifs.length);
+ }
+
+ @Test
+ public void testCancelAllNotifications_CancelsNoClearFlag() throws Exception {
+ final NotificationRecord notif = generateNotificationRecord(
+ mTestNotificationChannel, 1, "group", true);
+ notif.getNotification().flags |= Notification.FLAG_NO_CLEAR;
+ mNotificationManagerService.addNotification(notif);
+ mNotificationManagerService.cancelAllNotificationsInt(mUid, 0, PKG, null, 0, 0, true,
+ notif.getUserId(), 0, null);
+ waitForIdle();
+ StatusBarNotification[] notifs =
+ mBinderService.getActiveNotifications(notif.sbn.getPackageName());
+ assertEquals(0, notifs.length);
+ }
+
+ @Test
+ public void testUserInitiatedCancelAllOnClearAll_NoClearFlag() throws Exception {
+ final NotificationRecord notif = generateNotificationRecord(
+ mTestNotificationChannel, 1, "group", true);
+ notif.getNotification().flags |= Notification.FLAG_NO_CLEAR;
+ mNotificationManagerService.addNotification(notif);
+
+ mNotificationManagerService.mNotificationDelegate.onClearAll(mUid, Binder.getCallingPid(),
+ notif.getUserId());
+ waitForIdle();
+ StatusBarNotification[] notifs =
+ mBinderService.getActiveNotifications(notif.sbn.getPackageName());
+ assertEquals(1, notifs.length);
+ }
+
+ @Test
+ public void testCancelAllCancelNotificationsFromListener_NoClearFlag() throws Exception {
+ final NotificationRecord parent = generateNotificationRecord(
+ mTestNotificationChannel, 1, "group", true);
+ final NotificationRecord child = generateNotificationRecord(
+ mTestNotificationChannel, 2, "group", false);
+ final NotificationRecord child2 = generateNotificationRecord(
+ mTestNotificationChannel, 3, "group", false);
+ child2.getNotification().flags |= Notification.FLAG_NO_CLEAR;
+ final NotificationRecord newGroup = generateNotificationRecord(
+ mTestNotificationChannel, 4, "group2", false);
+ mNotificationManagerService.addNotification(parent);
+ mNotificationManagerService.addNotification(child);
+ mNotificationManagerService.addNotification(child2);
+ mNotificationManagerService.addNotification(newGroup);
+ mNotificationManagerService.getBinderService().cancelNotificationsFromListener(null, null);
+ waitForIdle();
+ StatusBarNotification[] notifs =
+ mBinderService.getActiveNotifications(parent.sbn.getPackageName());
+ assertEquals(1, notifs.length);
+ }
+
+ @Test
+ public void testUserInitiatedCancelAllWithGroup_NoClearFlag() throws Exception {
+ final NotificationRecord parent = generateNotificationRecord(
+ mTestNotificationChannel, 1, "group", true);
+ final NotificationRecord child = generateNotificationRecord(
+ mTestNotificationChannel, 2, "group", false);
+ final NotificationRecord child2 = generateNotificationRecord(
+ mTestNotificationChannel, 3, "group", false);
+ child2.getNotification().flags |= Notification.FLAG_NO_CLEAR;
+ final NotificationRecord newGroup = generateNotificationRecord(
+ mTestNotificationChannel, 4, "group2", false);
+ mNotificationManagerService.addNotification(parent);
+ mNotificationManagerService.addNotification(child);
+ mNotificationManagerService.addNotification(child2);
+ mNotificationManagerService.addNotification(newGroup);
+ mNotificationManagerService.mNotificationDelegate.onClearAll(mUid, Binder.getCallingPid(),
+ parent.getUserId());
+ waitForIdle();
+ StatusBarNotification[] notifs =
+ mBinderService.getActiveNotifications(parent.sbn.getPackageName());
+ assertEquals(1, notifs.length);
+ }
+
+ @Test
public void testRemoveForegroundServiceFlag_ImmediatelyAfterEnqueue() throws Exception {
final StatusBarNotification sbn = generateNotificationRecord(null).sbn;
sbn.getNotification().flags |= Notification.FLAG_FOREGROUND_SERVICE;
@@ -622,13 +836,13 @@
eq(channel2.getId()), anyBoolean()))
.thenReturn(channel2);
- reset(mNotificationListeners);
+ reset(mListeners);
mBinderService.createNotificationChannels(PKG,
new ParceledListSlice(Arrays.asList(mTestNotificationChannel, channel2)));
- verify(mNotificationListeners, times(1)).notifyNotificationChannelChanged(eq(PKG),
+ verify(mListeners, times(1)).notifyNotificationChannelChanged(eq(PKG),
eq(Process.myUserHandle()), eq(mTestNotificationChannel),
eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_ADDED));
- verify(mNotificationListeners, times(1)).notifyNotificationChannelChanged(eq(PKG),
+ verify(mListeners, times(1)).notifyNotificationChannelChanged(eq(PKG),
eq(Process.myUserHandle()), eq(channel2),
eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_ADDED));
}
@@ -642,13 +856,13 @@
NotificationChannelGroup group1 = new NotificationChannelGroup("a", "b");
NotificationChannelGroup group2 = new NotificationChannelGroup("n", "m");
- reset(mNotificationListeners);
+ reset(mListeners);
mBinderService.createNotificationChannelGroups(PKG,
new ParceledListSlice(Arrays.asList(group1, group2)));
- verify(mNotificationListeners, times(1)).notifyNotificationChannelGroupChanged(eq(PKG),
+ verify(mListeners, times(1)).notifyNotificationChannelGroupChanged(eq(PKG),
eq(Process.myUserHandle()), eq(group1),
eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_ADDED));
- verify(mNotificationListeners, times(1)).notifyNotificationChannelGroupChanged(eq(PKG),
+ verify(mListeners, times(1)).notifyNotificationChannelGroupChanged(eq(PKG),
eq(Process.myUserHandle()), eq(group2),
eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_ADDED));
}
@@ -664,9 +878,9 @@
eq(mTestNotificationChannel.getId()), anyBoolean()))
.thenReturn(mTestNotificationChannel);
- reset(mNotificationListeners);
+ reset(mListeners);
mBinderService.updateNotificationChannelForPackage(PKG, 0, mTestNotificationChannel);
- verify(mNotificationListeners, times(1)).notifyNotificationChannelChanged(eq(PKG),
+ verify(mListeners, times(1)).notifyNotificationChannelChanged(eq(PKG),
eq(Process.myUserHandle()), eq(mTestNotificationChannel),
eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_UPDATED));
}
@@ -680,9 +894,9 @@
when(mRankingHelper.getNotificationChannel(eq(PKG), anyInt(),
eq(mTestNotificationChannel.getId()), anyBoolean()))
.thenReturn(mTestNotificationChannel);
- reset(mNotificationListeners);
+ reset(mListeners);
mBinderService.deleteNotificationChannel(PKG, mTestNotificationChannel.getId());
- verify(mNotificationListeners, times(1)).notifyNotificationChannelChanged(eq(PKG),
+ verify(mListeners, times(1)).notifyNotificationChannelChanged(eq(PKG),
eq(Process.myUserHandle()), eq(mTestNotificationChannel),
eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_DELETED));
}
@@ -696,9 +910,9 @@
mNotificationManagerService.setRankingHelper(mRankingHelper);
when(mRankingHelper.getNotificationChannelGroup(eq(ncg.getId()), eq(PKG), anyInt()))
.thenReturn(ncg);
- reset(mNotificationListeners);
+ reset(mListeners);
mBinderService.deleteNotificationChannelGroup(PKG, ncg.getId());
- verify(mNotificationListeners, times(1)).notifyNotificationChannelGroupChanged(eq(PKG),
+ verify(mListeners, times(1)).notifyNotificationChannelGroupChanged(eq(PKG),
eq(Process.myUserHandle()), eq(ncg),
eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_DELETED));
}
@@ -715,7 +929,7 @@
verify(mRankingHelper, times(1)).updateNotificationChannel(anyString(), anyInt(), any());
- verify(mNotificationListeners, never()).notifyNotificationChannelChanged(eq(PKG),
+ verify(mListeners, never()).notifyNotificationChannelChanged(eq(PKG),
eq(Process.myUserHandle()), eq(mTestNotificationChannel),
eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_UPDATED));
}
@@ -736,7 +950,7 @@
verify(mRankingHelper, never()).updateNotificationChannel(anyString(), anyInt(), any());
- verify(mNotificationListeners, never()).notifyNotificationChannelChanged(eq(PKG),
+ verify(mListeners, never()).notifyNotificationChannelChanged(eq(PKG),
eq(Process.myUserHandle()), eq(mTestNotificationChannel),
eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_UPDATED));
}
@@ -750,7 +964,7 @@
mListener = mock(ManagedServices.ManagedServiceInfo.class);
mListener.component = new ComponentName(PKG, PKG);
when(mListener.enabledAndUserMatches(anyInt())).thenReturn(false);
- when(mNotificationListeners.checkServiceTokenLocked(any())).thenReturn(mListener);
+ when(mListeners.checkServiceTokenLocked(any())).thenReturn(mListener);
try {
mBinderService.updateNotificationChannelFromPrivilegedListener(
@@ -762,7 +976,7 @@
verify(mRankingHelper, never()).updateNotificationChannel(anyString(), anyInt(), any());
- verify(mNotificationListeners, never()).notifyNotificationChannelChanged(eq(PKG),
+ verify(mListeners, never()).notifyNotificationChannelChanged(eq(PKG),
eq(Process.myUserHandle()), eq(mTestNotificationChannel),
eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_UPDATED));
}
@@ -807,7 +1021,7 @@
when(mCompanionMgr.getAssociations(PKG, mUid)).thenReturn(associations);
mListener = mock(ManagedServices.ManagedServiceInfo.class);
when(mListener.enabledAndUserMatches(anyInt())).thenReturn(false);
- when(mNotificationListeners.checkServiceTokenLocked(any())).thenReturn(mListener);
+ when(mListeners.checkServiceTokenLocked(any())).thenReturn(mListener);
try {
mBinderService.getNotificationChannelsFromPrivilegedListener(
@@ -858,7 +1072,7 @@
when(mCompanionMgr.getAssociations(PKG, mUid)).thenReturn(associations);
mListener = mock(ManagedServices.ManagedServiceInfo.class);
when(mListener.enabledAndUserMatches(anyInt())).thenReturn(false);
- when(mNotificationListeners.checkServiceTokenLocked(any())).thenReturn(mListener);
+ when(mListeners.checkServiceTokenLocked(any())).thenReturn(mListener);
try {
mBinderService.getNotificationChannelGroupsFromPrivilegedListener(
@@ -1017,6 +1231,150 @@
}
@Test
+ public void testSetListenerAccess() throws Exception {
+ ComponentName c = ComponentName.unflattenFromString("package/Component");
+ try {
+ mBinderService.setNotificationListenerAccessGranted(c, true);
+ } catch (SecurityException e) {
+ if (!e.getMessage().contains("Permission Denial: not allowed to send broadcast")) {
+ throw e;
+ }
+ }
+
+ verify(mListeners, times(1)).setPackageOrComponentEnabled(
+ c.flattenToString(), 0, true, true);
+ verify(mConditionProviders, times(1)).setPackageOrComponentEnabled(
+ c.flattenToString(), 0, false, true);
+ verify(mAssistants, never()).setPackageOrComponentEnabled(
+ any(), anyInt(), anyBoolean(), anyBoolean());
+ }
+
+ @Test
+ public void testSetAssistantAccess() throws Exception {
+ ComponentName c = ComponentName.unflattenFromString("package/Component");
+ try {
+ mBinderService.setNotificationAssistantAccessGranted(c, true);
+ } catch (SecurityException e) {
+ if (!e.getMessage().contains("Permission Denial: not allowed to send broadcast")) {
+ throw e;
+ }
+ }
+
+ verify(mAssistants, times(1)).setPackageOrComponentEnabled(
+ c.flattenToString(), 0, true, true);
+ verify(mConditionProviders, times(1)).setPackageOrComponentEnabled(
+ c.flattenToString(), 0, false, true);
+ verify(mListeners, never()).setPackageOrComponentEnabled(
+ any(), anyInt(), anyBoolean(), anyBoolean());
+ }
+
+ @Test
+ public void testSetDndAccess() throws Exception {
+ ComponentName c = ComponentName.unflattenFromString("package/Component");
+ try {
+ mBinderService.setNotificationPolicyAccessGranted(c.getPackageName(), true);
+ } catch (SecurityException e) {
+ if (!e.getMessage().contains("Permission Denial: not allowed to send broadcast")) {
+ throw e;
+ }
+ }
+
+ verify(mConditionProviders, times(1)).setPackageOrComponentEnabled(
+ c.getPackageName(), 0, true, true);
+ verify(mAssistants, never()).setPackageOrComponentEnabled(
+ any(), anyInt(), anyBoolean(), anyBoolean());
+ verify(mListeners, never()).setPackageOrComponentEnabled(
+ any(), anyInt(), anyBoolean(), anyBoolean());
+ }
+
+ @Test
+ public void testSetListenerAccess_doesNothingOnLowRam() throws Exception {
+ when(mActivityManager.isLowRamDevice()).thenReturn(true);
+ ComponentName c = ComponentName.unflattenFromString("package/Component");
+ mBinderService.setNotificationListenerAccessGranted(c, true);
+
+ verify(mListeners, never()).setPackageOrComponentEnabled(
+ c.flattenToString(), 0, true, true);
+ verify(mConditionProviders, never()).setPackageOrComponentEnabled(
+ c.flattenToString(), 0, false, true);
+ verify(mAssistants, never()).setPackageOrComponentEnabled(
+ any(), anyInt(), anyBoolean(), anyBoolean());
+ }
+
+ @Test
+ public void testSetAssistantAccess_doesNothingOnLowRam() throws Exception {
+ when(mActivityManager.isLowRamDevice()).thenReturn(true);
+ ComponentName c = ComponentName.unflattenFromString("package/Component");
+ mBinderService.setNotificationAssistantAccessGranted(c, true);
+
+
+ verify(mListeners, never()).setPackageOrComponentEnabled(
+ c.flattenToString(), 0, true, true);
+ verify(mConditionProviders, never()).setPackageOrComponentEnabled(
+ c.flattenToString(), 0, false, true);
+ verify(mAssistants, never()).setPackageOrComponentEnabled(
+ any(), anyInt(), anyBoolean(), anyBoolean());
+ }
+
+ @Test
+ public void testSetDndAccess_doesNothingOnLowRam() throws Exception {
+ when(mActivityManager.isLowRamDevice()).thenReturn(true);
+ ComponentName c = ComponentName.unflattenFromString("package/Component");
+ mBinderService.setNotificationPolicyAccessGranted(c.getPackageName(), true);
+
+ verify(mListeners, never()).setPackageOrComponentEnabled(
+ c.flattenToString(), 0, true, true);
+ verify(mConditionProviders, never()).setPackageOrComponentEnabled(
+ c.flattenToString(), 0, false, true);
+ verify(mAssistants, never()).setPackageOrComponentEnabled(
+ any(), anyInt(), anyBoolean(), anyBoolean());
+ }
+
+ @Test
+ public void testOnlyAutogroupIfGroupChanged_noPriorNoti_autogroups() throws Exception {
+ NotificationRecord r = generateNotificationRecord(mTestNotificationChannel, 0, null, false);
+ mNotificationManagerService.addEnqueuedNotification(r);
+ NotificationManagerService.PostNotificationRunnable runnable =
+ mNotificationManagerService.new PostNotificationRunnable(r.getKey());
+ runnable.run();
+ waitForIdle();
+
+ verify(mGroupHelper, times(1)).onNotificationPosted(any());
+ }
+
+ @Test
+ public void testOnlyAutogroupIfGroupChanged_groupChanged_autogroups()
+ throws Exception {
+ NotificationRecord r = generateNotificationRecord(mTestNotificationChannel, 0, "group", false);
+ mNotificationManagerService.addNotification(r);
+
+ r = generateNotificationRecord(mTestNotificationChannel, 0, null, false);
+ mNotificationManagerService.addEnqueuedNotification(r);
+ NotificationManagerService.PostNotificationRunnable runnable =
+ mNotificationManagerService.new PostNotificationRunnable(r.getKey());
+ runnable.run();
+ waitForIdle();
+
+ verify(mGroupHelper, times(1)).onNotificationPosted(any());
+ }
+
+ @Test
+ public void testOnlyAutogroupIfGroupChanged_noGroupChanged_autogroups()
+ throws Exception {
+ NotificationRecord r = generateNotificationRecord(mTestNotificationChannel, 0, "group",
+ false);
+ mNotificationManagerService.addNotification(r);
+ mNotificationManagerService.addEnqueuedNotification(r);
+
+ NotificationManagerService.PostNotificationRunnable runnable =
+ mNotificationManagerService.new PostNotificationRunnable(r.getKey());
+ runnable.run();
+ waitForIdle();
+
+ verify(mGroupHelper, never()).onNotificationPosted(any());
+ }
+
+ @Test
public void testNoFakeColorizedPermission() throws Exception {
when(mPackageManagerClient.checkPermission(any(), any())).thenReturn(PERMISSION_DENIED);
Notification.Builder nb = new Notification.Builder(mContext,
@@ -1066,15 +1424,130 @@
mNotificationManagerService.addNotification(otherPackage);
// Same notifications are enqueued as posted, everything counts b/c id and tag don't match
- assertEquals(40, mNotificationManagerService.getNotificationCountLocked(
- PKG, new UserHandle(mUid).getIdentifier(), 0, null));
- assertEquals(40, mNotificationManagerService.getNotificationCountLocked(
- PKG, new UserHandle(mUid).getIdentifier(), 0, "tag2"));
- assertEquals(2, mNotificationManagerService.getNotificationCountLocked(
- "a", new UserHandle(mUid).getIdentifier(), 0, "banana"));
+ int userId = new UserHandle(mUid).getIdentifier();
+ assertEquals(40, mNotificationManagerService.getNotificationCountLocked(PKG, userId, 0, null));
+ assertEquals(40, mNotificationManagerService.getNotificationCountLocked(PKG, userId, 0, "tag2"));
+ assertEquals(2, mNotificationManagerService.getNotificationCountLocked("a", userId, 0, "banana"));
// exclude a known notification - it's excluded from only the posted list, not enqueued
- assertEquals(39, mNotificationManagerService.getNotificationCountLocked(
- PKG, new UserHandle(mUid).getIdentifier(), 0, "tag"));
+ assertEquals(39, mNotificationManagerService.getNotificationCountLocked(PKG, userId, 0, "tag"));
}
+
+ @Test
+ public void testAddAutogroup_requestsSort() throws Exception {
+ RankingHandler rh = mock(RankingHandler.class);
+ mNotificationManagerService.setRankingHandler(rh);
+
+ final NotificationRecord r = generateNotificationRecord(mTestNotificationChannel);
+ mNotificationManagerService.addNotification(r);
+ mNotificationManagerService.addAutogroupKeyLocked(r.getKey());
+
+ verify(rh, times(1)).requestSort();
+ }
+
+ @Test
+ public void testRemoveAutogroup_requestsSort() throws Exception {
+ RankingHandler rh = mock(RankingHandler.class);
+ mNotificationManagerService.setRankingHandler(rh);
+
+ final NotificationRecord r = generateNotificationRecord(mTestNotificationChannel);
+ r.setOverrideGroupKey("TEST");
+ mNotificationManagerService.addNotification(r);
+ mNotificationManagerService.removeAutogroupKeyLocked(r.getKey());
+
+ verify(rh, times(1)).requestSort();
+ }
+
+ @Test
+ public void testReaddAutogroup_noSort() throws Exception {
+ RankingHandler rh = mock(RankingHandler.class);
+ mNotificationManagerService.setRankingHandler(rh);
+
+ final NotificationRecord r = generateNotificationRecord(mTestNotificationChannel);
+ r.setOverrideGroupKey("TEST");
+ mNotificationManagerService.addNotification(r);
+ mNotificationManagerService.addAutogroupKeyLocked(r.getKey());
+
+ verify(rh, never()).requestSort();
+ }
+
+ @Test
+ public void testHandleRankingSort_sendsUpdateOnSignalExtractorChange() throws Exception {
+ mNotificationManagerService.setRankingHelper(mRankingHelper);
+ NotificationManagerService.WorkerHandler handler = mock(
+ NotificationManagerService.WorkerHandler.class);
+ mNotificationManagerService.setHandler(handler);
+
+ Map<String, Answer> answers = getSignalExtractorSideEffects();
+ for (String message : answers.keySet()) {
+ mNotificationManagerService.clearNotifications();
+ final NotificationRecord r = generateNotificationRecord(mTestNotificationChannel);
+ mNotificationManagerService.addNotification(r);
+
+ doAnswer(answers.get(message)).when(mRankingHelper).extractSignals(r);
+
+ mNotificationManagerService.handleRankingSort();
+ }
+ verify(handler, times(answers.size())).scheduleSendRankingUpdate();
+ }
+
+ @Test
+ public void testHandleRankingSort_noUpdateWhenNoSignalChange() throws Exception {
+ mNotificationManagerService.setRankingHelper(mRankingHelper);
+ NotificationManagerService.WorkerHandler handler = mock(
+ NotificationManagerService.WorkerHandler.class);
+ mNotificationManagerService.setHandler(handler);
+
+ final NotificationRecord r = generateNotificationRecord(mTestNotificationChannel);
+ mNotificationManagerService.addNotification(r);
+
+ mNotificationManagerService.handleRankingSort();
+ verify(handler, never()).scheduleSendRankingUpdate();
+ }
+
+ @Test
+ public void testReadPolicyXml_readApprovedServicesFromXml() throws Exception {
+ final String preupgradeXml = "<notification-policy version=\"1\">"
+ + "<zen></zen>"
+ + "<ranking></ranking>"
+ + "<enabled_listeners>"
+ + "<service_listing approved=\"test\" user=\"0\" primary=\"true\" />"
+ + "</enabled_listeners>"
+ + "<enabled_assistants>"
+ + "<service_listing approved=\"test\" user=\"0\" primary=\"true\" />"
+ + "</enabled_assistants>"
+ + "<dnd_apps>"
+ + "<service_listing approved=\"test\" user=\"0\" primary=\"true\" />"
+ + "</dnd_apps>"
+ + "</notification-policy>";
+ mNotificationManagerService.readPolicyXml(
+ new BufferedInputStream(new ByteArrayInputStream(preupgradeXml.getBytes())), false);
+ verify(mListeners, times(1)).readXml(any());
+ verify(mConditionProviders, times(1)).readXml(any());
+ verify(mAssistants, times(1)).readXml(any());
+
+ // numbers are inflated for setup
+ verify(mListeners, times(1)).migrateToXml();
+ verify(mConditionProviders, times(1)).migrateToXml();
+ verify(mAssistants, times(1)).migrateToXml();
+ }
+
+ @Test
+ public void testReadPolicyXml_readApprovedServicesFromSettings() throws Exception {
+ final String preupgradeXml = "<notification-policy version=\"1\">"
+ + "<zen></zen>"
+ + "<ranking></ranking>"
+ + "</notification-policy>";
+ mNotificationManagerService.readPolicyXml(
+ new BufferedInputStream(new ByteArrayInputStream(preupgradeXml.getBytes())), false);
+ verify(mListeners, never()).readXml(any());
+ verify(mConditionProviders, never()).readXml(any());
+ verify(mAssistants, never()).readXml(any());
+
+ // numbers are inflated for setup
+ verify(mListeners, times(2)).migrateToXml();
+ verify(mConditionProviders, times(2)).migrateToXml();
+ verify(mAssistants, times(2)).migrateToXml();
+ }
+
}
diff --git a/services/tests/notification/src/com/android/server/notification/NotificationTest.java b/services/tests/notification/src/com/android/server/notification/NotificationTest.java
new file mode 100644
index 0000000..4165e9e
--- /dev/null
+++ b/services/tests/notification/src/com/android/server/notification/NotificationTest.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.notification;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertNotNull;
+import static junit.framework.Assert.assertNull;
+
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.app.ActivityManager;
+import android.app.Notification;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.graphics.Color;
+import android.os.Build;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class NotificationTest extends NotificationTestCase {
+
+ @Mock
+ ActivityManager mAm;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ }
+
+ @Test
+ public void testStripsExtendersInLowRamMode() {
+ Notification.Builder nb = new Notification.Builder(mContext, "channel");
+ nb.extend(new Notification.CarExtender().setColor(Color.RED));
+ nb.extend(new Notification.TvExtender().setChannelId("different channel"));
+ nb.extend(new Notification.WearableExtender().setDismissalId("dismiss"));
+ Notification before = nb.build();
+
+ Notification after = Notification.Builder.maybeCloneStrippedForDelivery(before, true);
+
+ assertEquals("different channel", new Notification.TvExtender(before).getChannelId());
+ assertNull(new Notification.TvExtender(after).getChannelId());
+
+ assertEquals(Color.RED, new Notification.CarExtender(before).getColor());
+ assertEquals(Notification.COLOR_DEFAULT, new Notification.CarExtender(after).getColor());
+
+ assertEquals("dismiss", new Notification.WearableExtender(before).getDismissalId());
+ assertNull(new Notification.WearableExtender(after).getDismissalId());
+ }
+
+ @Test
+ public void testStripsRemoteViewsInLowRamMode() {
+ Context context = spy(getContext());
+ ApplicationInfo ai = new ApplicationInfo();
+ ai.targetSdkVersion = Build.VERSION_CODES.M;
+ when(context.getApplicationInfo()).thenReturn(ai);
+
+ final Notification.BigTextStyle style = new Notification.BigTextStyle()
+ .bigText("hello")
+ .setSummaryText("And the summary");
+ Notification before = new Notification.Builder(context, "channel")
+ .setContentText("hi")
+ .setStyle(style)
+ .build();
+
+ Notification after = Notification.Builder.maybeCloneStrippedForDelivery(before, true);
+ assertNotNull(before.contentView);
+ assertNotNull(before.bigContentView);
+ assertNotNull(before.headsUpContentView);
+ assertNull(after.contentView);
+ assertNull(after.bigContentView);
+ assertNull(after.headsUpContentView);
+ }
+
+ @Test
+ public void testDoesNotStripsExtendersInNormalRamMode() {
+ Notification.Builder nb = new Notification.Builder(mContext, "channel");
+ nb.extend(new Notification.CarExtender().setColor(Color.RED));
+ nb.extend(new Notification.TvExtender().setChannelId("different channel"));
+ nb.extend(new Notification.WearableExtender().setDismissalId("dismiss"));
+ Notification before = nb.build();
+ Notification after = Notification.Builder.maybeCloneStrippedForDelivery(before, false);
+
+ assertTrue(before == after);
+
+ assertEquals("different channel", new Notification.TvExtender(before).getChannelId());
+ assertEquals(Color.RED, new Notification.CarExtender(before).getColor());
+ assertEquals("dismiss", new Notification.WearableExtender(before).getDismissalId());
+ }
+}
+
diff --git a/services/tests/notification/src/com/android/server/notification/NotificationTestCase.java b/services/tests/notification/src/com/android/server/notification/NotificationTestCase.java
index cc30aab..1ee3412 100644
--- a/services/tests/notification/src/com/android/server/notification/NotificationTestCase.java
+++ b/services/tests/notification/src/com/android/server/notification/NotificationTestCase.java
@@ -27,7 +27,7 @@
public final TestableContext mContext =
new TestableContext(InstrumentationRegistry.getContext(), null);
- protected Context getContext() {
+ protected TestableContext getContext() {
return mContext;
}
}
diff --git a/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java b/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java
index 5a72e6b..801479b 100644
--- a/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java
+++ b/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java
@@ -78,6 +78,9 @@
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@SmallTest
@@ -630,6 +633,8 @@
// all fields should be changed
assertEquals(channel2, mHelper.getNotificationChannel(PKG, UID, channel.getId(), false));
+
+ verify(mHandler, times(1)).requestSort();
}
@Test
@@ -712,6 +717,8 @@
assertFalse(savedChannel.canBypassDnd());
assertFalse(Notification.VISIBILITY_SECRET == savedChannel.getLockscreenVisibility());
assertEquals(channel.canShowBadge(), savedChannel.canShowBadge());
+
+ verify(mHandler, never()).requestSort();
}
@Test
@@ -1058,6 +1065,8 @@
// notDeleted
assertEquals(1, mHelper.getNotificationChannelGroups(PKG, UID).size());
+
+ verify(mHandler, never()).requestSort();
}
@Test
@@ -1159,6 +1168,7 @@
NotificationChannelGroup ncg = new NotificationChannelGroup("group1", "name1");
mHelper.createNotificationChannelGroup(PKG, UID, ncg, true);
assertEquals(ncg, mHelper.getNotificationChannelGroups(PKG, UID).iterator().next());
+ verify(mHandler, never()).requestSort();
}
@Test
@@ -1275,6 +1285,8 @@
actual = mHelper.getNotificationChannel(PKG, UID, "id", false);
assertEquals("goodbye", actual.getName());
assertEquals(IMPORTANCE_DEFAULT, actual.getImportance());
+
+ verify(mHandler, times(1)).requestSort();
}
@Test
diff --git a/services/tests/servicestests/Android.mk b/services/tests/servicestests/Android.mk
index e3a6dae..507b483 100644
--- a/services/tests/servicestests/Android.mk
+++ b/services/tests/servicestests/Android.mk
@@ -31,7 +31,7 @@
LOCAL_SRC_FILES += aidl/com/android/servicestests/aidl/INetworkStateObserver.aidl
-LOCAL_JAVA_LIBRARIES := android.test.runner
+LOCAL_JAVA_LIBRARIES := android.test.mock legacy-android-test
LOCAL_PACKAGE_NAME := FrameworksServicesTests
LOCAL_COMPATIBILITY_SUITE := device-tests
diff --git a/services/tests/servicestests/AndroidManifest.xml b/services/tests/servicestests/AndroidManifest.xml
index e12032d..59d205e 100644
--- a/services/tests/servicestests/AndroidManifest.xml
+++ b/services/tests/servicestests/AndroidManifest.xml
@@ -35,7 +35,6 @@
<uses-permission android:name="android.permission.REORDER_TASKS" />
<uses-permission android:name="android.permission.MANAGE_NETWORK_POLICY" />
<uses-permission android:name="android.permission.READ_NETWORK_USAGE_HISTORY" />
- <uses-permission android:name="android.permission.MODIFY_NETWORK_ACCOUNTING" />
<uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.MANAGE_USERS" />
diff --git a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
index ad8303a..8decb96 100644
--- a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
@@ -24,27 +24,24 @@
import static android.net.NetworkPolicyManager.POLICY_ALLOW_METERED_BACKGROUND;
import static android.net.NetworkPolicyManager.POLICY_NONE;
import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND;
-import static android.net.NetworkPolicyManager.computeLastCycleBoundary;
-import static android.net.NetworkPolicyManager.computeNextCycleBoundary;
import static android.net.NetworkPolicyManager.uidPoliciesToString;
import static android.net.NetworkTemplate.buildTemplateMobileAll;
import static android.net.TrafficStats.KB_IN_BYTES;
import static android.net.TrafficStats.MB_IN_BYTES;
import static android.telephony.CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED;
-import static android.telephony.CarrierConfigManager.DATA_CYCLE_USE_PLATFORM_DEFAULT;
import static android.telephony.CarrierConfigManager.DATA_CYCLE_THRESHOLD_DISABLED;
+import static android.telephony.CarrierConfigManager.DATA_CYCLE_USE_PLATFORM_DEFAULT;
import static android.telephony.CarrierConfigManager.KEY_DATA_LIMIT_THRESHOLD_BYTES_LONG;
import static android.telephony.CarrierConfigManager.KEY_DATA_WARNING_THRESHOLD_BYTES_LONG;
import static android.telephony.CarrierConfigManager.KEY_MONTHLY_DATA_CYCLE_DAY_INT;
-import static android.text.format.DateUtils.DAY_IN_MILLIS;
import static android.text.format.DateUtils.MINUTE_IN_MILLIS;
import static android.text.format.Time.TIMEZONE_UTC;
import static com.android.server.net.NetworkPolicyManagerService.MAX_PROC_STATE_SEQ_HISTORY;
-import static com.android.server.net.NetworkPolicyManagerService.ProcStateSeqHistory;
import static com.android.server.net.NetworkPolicyManagerService.TYPE_LIMIT;
import static com.android.server.net.NetworkPolicyManagerService.TYPE_LIMIT_SNOOZED;
import static com.android.server.net.NetworkPolicyManagerService.TYPE_WARNING;
+
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertEquals;
@@ -53,22 +50,19 @@
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.anyLong;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Matchers.isA;
-import static org.mockito.Matchers.isNull;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.isA;
+import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -116,14 +110,17 @@
import android.text.TextUtils;
import android.text.format.Time;
import android.util.Log;
+import android.util.Pair;
+import android.util.RecurrenceRule;
import android.util.TrustedTime;
-import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.telephony.PhoneConstants;
+import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.test.BroadcastInterceptingContext;
import com.android.internal.util.test.BroadcastInterceptingContext.FutureIntent;
import com.android.server.net.NetworkPolicyManagerInternal;
import com.android.server.net.NetworkPolicyManagerService;
+import com.android.server.net.NetworkPolicyManagerService.ProcStateSeqHistory;
import libcore.io.IoUtils;
import libcore.io.Streams;
@@ -132,7 +129,6 @@
import org.junit.After;
import org.junit.Before;
-import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.MethodRule;
@@ -156,8 +152,14 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
+import java.time.Clock;
+import java.time.Instant;
+import java.time.Period;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
import java.util.Arrays;
import java.util.Calendar;
+import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.concurrent.CountDownLatch;
@@ -393,6 +395,11 @@
LocalServices.removeServiceForTest(UsageStatsManagerInternal.class);
}
+ @After
+ public void resetClock() throws Exception {
+ RecurrenceRule.sClock = Clock.systemDefaultZone();
+ }
+
@Test
public void testTurnRestrictBackgroundOn() throws Exception {
assertRestrictBackgroundOff(); // Sanity check.
@@ -778,6 +785,26 @@
assertTrue(mService.isUidForeground(UID_B));
}
+ private static long computeLastCycleBoundary(long currentTime, NetworkPolicy policy) {
+ RecurrenceRule.sClock = Clock.fixed(Instant.ofEpochMilli(currentTime),
+ ZoneId.systemDefault());
+ final Iterator<Pair<ZonedDateTime, ZonedDateTime>> it = policy.cycleIterator();
+ while (it.hasNext()) {
+ final Pair<ZonedDateTime, ZonedDateTime> cycle = it.next();
+ if (cycle.first.toInstant().toEpochMilli() < currentTime) {
+ return cycle.first.toInstant().toEpochMilli();
+ }
+ }
+ throw new IllegalStateException(
+ "Failed to find current cycle for " + policy + " at " + currentTime);
+ }
+
+ private static long computeNextCycleBoundary(long currentTime, NetworkPolicy policy) {
+ RecurrenceRule.sClock = Clock.fixed(Instant.ofEpochMilli(currentTime),
+ ZoneId.systemDefault());
+ return policy.cycleIterator().next().second.toInstant().toEpochMilli();
+ }
+
@Test
public void testLastCycleBoundaryThisMonth() throws Exception {
// assume cycle day of "5th", which should be in same month
@@ -818,7 +845,7 @@
public void testLastCycleBoundaryLastMonthFebruary() throws Exception {
// assume cycle day of "30th" in february, which should clamp
final long currentTime = parseTime("2007-03-14T00:00:00.000Z");
- final long expectedCycle = parseTime("2007-02-28T23:59:59.000Z");
+ final long expectedCycle = parseTime("2007-02-28T23:59:59.999Z");
final NetworkPolicy policy = new NetworkPolicy(
sTemplateWifi, 30, TIMEZONE_UTC, 1024L, 1024L, false);
@@ -842,9 +869,9 @@
assertTimeEquals(parseTime("2007-01-29T00:00:00.000Z"),
computeNextCycleBoundary(parseTime("2007-01-14T00:00:00.000Z"), policy));
- assertTimeEquals(parseTime("2007-02-28T23:59:59.000Z"),
+ assertTimeEquals(parseTime("2007-02-28T23:59:59.999Z"),
computeNextCycleBoundary(parseTime("2007-02-14T00:00:00.000Z"), policy));
- assertTimeEquals(parseTime("2007-02-28T23:59:59.000Z"),
+ assertTimeEquals(parseTime("2007-02-28T23:59:59.999Z"),
computeLastCycleBoundary(parseTime("2007-03-14T00:00:00.000Z"), policy));
assertTimeEquals(parseTime("2007-03-29T00:00:00.000Z"),
computeNextCycleBoundary(parseTime("2007-03-14T00:00:00.000Z"), policy));
@@ -869,38 +896,6 @@
}
@Test
- public void testNextCycleSane() throws Exception {
- final NetworkPolicy policy = new NetworkPolicy(
- sTemplateWifi, 31, TIMEZONE_UTC, WARNING_DISABLED, LIMIT_DISABLED, false);
- final LinkedHashSet<Long> seen = new LinkedHashSet<Long>();
-
- // walk forwards, ensuring that cycle boundaries don't get stuck
- long currentCycle = computeNextCycleBoundary(parseTime("2011-08-01T00:00:00.000Z"), policy);
- for (int i = 0; i < 128; i++) {
- long nextCycle = computeNextCycleBoundary(currentCycle, policy);
- assertEqualsFuzzy(DAY_IN_MILLIS * 30, nextCycle - currentCycle, DAY_IN_MILLIS * 3);
- assertUnique(seen, nextCycle);
- currentCycle = nextCycle;
- }
- }
-
- @Test
- public void testLastCycleSane() throws Exception {
- final NetworkPolicy policy = new NetworkPolicy(
- sTemplateWifi, 31, TIMEZONE_UTC, WARNING_DISABLED, LIMIT_DISABLED, false);
- final LinkedHashSet<Long> seen = new LinkedHashSet<Long>();
-
- // walk backwards, ensuring that cycle boundaries look sane
- long currentCycle = computeLastCycleBoundary(parseTime("2011-08-04T00:00:00.000Z"), policy);
- for (int i = 0; i < 128; i++) {
- long lastCycle = computeLastCycleBoundary(currentCycle, policy);
- assertEqualsFuzzy(DAY_IN_MILLIS * 30, currentCycle - lastCycle, DAY_IN_MILLIS * 3);
- assertUnique(seen, lastCycle);
- currentCycle = lastCycle;
- }
- }
-
- @Test
public void testCycleTodayJanuary() throws Exception {
final NetworkPolicy policy = new NetworkPolicy(
sTemplateWifi, 14, "US/Pacific", 1024L, 1024L, false);
@@ -921,37 +916,16 @@
}
@Test
- public void testLastCycleBoundaryDST() throws Exception {
- final long currentTime = parseTime("1989-01-02T07:30:00.000");
- final long expectedCycle = parseTime("1988-12-03T02:00:00.000Z");
-
- final NetworkPolicy policy = new NetworkPolicy(
- sTemplateWifi, 3, "America/Argentina/Buenos_Aires", 1024L, 1024L, false);
- final long actualCycle = computeLastCycleBoundary(currentTime, policy);
- assertTimeEquals(expectedCycle, actualCycle);
- }
-
- @Test
- public void testLastCycleBoundaryJanuaryDST() throws Exception {
- final long currentTime = parseTime("1989-01-26T21:00:00.000Z");
- final long expectedCycle = parseTime("1989-01-01T01:59:59.000Z");
-
- final NetworkPolicy policy = new NetworkPolicy(
- sTemplateWifi, 32, "America/Argentina/Buenos_Aires", 1024L, 1024L, false);
- final long actualCycle = computeLastCycleBoundary(currentTime, policy);
- assertTimeEquals(expectedCycle, actualCycle);
- }
-
- @Test
public void testNetworkPolicyAppliedCycleLastMonth() throws Exception {
NetworkState[] state = null;
NetworkStats stats = null;
- final long TIME_FEB_15 = 1171497600000L;
- final long TIME_MAR_10 = 1173484800000L;
final int CYCLE_DAY = 15;
+ final long NOW = parseTime("2007-03-10T00:00Z");
+ final long CYCLE_START = parseTime("2007-02-15T00:00Z");
+ final long CYCLE_END = parseTime("2007-03-15T00:00Z");
- setCurrentTimeMillis(TIME_MAR_10);
+ setCurrentTimeMillis(NOW);
// first, pretend that wifi network comes online. no policy active,
// which means we shouldn't push limit to interface.
@@ -971,7 +945,7 @@
// pretend that 512 bytes total have happened
stats = new NetworkStats(getElapsedRealtime(), 1)
.addIfaceValues(TEST_IFACE, 256L, 2L, 256L, 2L);
- when(mStatsService.getNetworkTotalBytes(sTemplateWifi, TIME_FEB_15, TIME_MAR_10))
+ when(mStatsService.getNetworkTotalBytes(sTemplateWifi, CYCLE_START, CYCLE_END))
.thenReturn(stats.getTotalBytes());
mPolicyListener.expect().onMeteredIfacesChanged(any());
@@ -991,11 +965,12 @@
NetworkStats stats = null;
Future<String> tagFuture = null;
- final long TIME_FEB_15 = 1171497600000L;
- final long TIME_MAR_10 = 1173484800000L;
final int CYCLE_DAY = 15;
+ final long NOW = parseTime("2007-03-10T00:00Z");
+ final long CYCLE_START = parseTime("2007-02-15T00:00Z");
+ final long CYCLE_END = parseTime("2007-03-15T00:00Z");
- setCurrentTimeMillis(TIME_MAR_10);
+ setCurrentTimeMillis(NOW);
// assign wifi policy
state = new NetworkState[] {};
@@ -1005,8 +980,8 @@
{
expectCurrentTime();
when(mConnManager.getAllNetworkState()).thenReturn(state);
- when(mStatsService.getNetworkTotalBytes(sTemplateWifi, TIME_FEB_15,
- currentTimeMillis())).thenReturn(stats.getTotalBytes());
+ when(mStatsService.getNetworkTotalBytes(sTemplateWifi, CYCLE_START,
+ CYCLE_END)).thenReturn(stats.getTotalBytes());
mPolicyListener.expect().onMeteredIfacesChanged(any());
setNetworkPolicies(new NetworkPolicy(sTemplateWifi, CYCLE_DAY, TIMEZONE_UTC, 1
@@ -1024,8 +999,8 @@
{
expectCurrentTime();
when(mConnManager.getAllNetworkState()).thenReturn(state);
- when(mStatsService.getNetworkTotalBytes(sTemplateWifi, TIME_FEB_15,
- currentTimeMillis())).thenReturn(stats.getTotalBytes());
+ when(mStatsService.getNetworkTotalBytes(sTemplateWifi, CYCLE_START,
+ CYCLE_END)).thenReturn(stats.getTotalBytes());
mPolicyListener.expect().onMeteredIfacesChanged(any());
mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
@@ -1043,8 +1018,8 @@
{
expectCurrentTime();
- when(mStatsService.getNetworkTotalBytes(sTemplateWifi, TIME_FEB_15,
- currentTimeMillis())).thenReturn(stats.getTotalBytes());
+ when(mStatsService.getNetworkTotalBytes(sTemplateWifi, CYCLE_START,
+ CYCLE_END)).thenReturn(stats.getTotalBytes());
tagFuture = expectEnqueueNotification();
mNetworkObserver.limitReached(null, TEST_IFACE);
@@ -1061,8 +1036,8 @@
{
expectCurrentTime();
- when(mStatsService.getNetworkTotalBytes(sTemplateWifi, TIME_FEB_15,
- currentTimeMillis())).thenReturn(stats.getTotalBytes());
+ when(mStatsService.getNetworkTotalBytes(sTemplateWifi, CYCLE_START,
+ CYCLE_END)).thenReturn(stats.getTotalBytes());
tagFuture = expectEnqueueNotification();
mNetworkObserver.limitReached(null, TEST_IFACE);
@@ -1077,8 +1052,8 @@
{
expectCurrentTime();
when(mConnManager.getAllNetworkState()).thenReturn(state);
- when(mStatsService.getNetworkTotalBytes(sTemplateWifi, TIME_FEB_15,
- currentTimeMillis())).thenReturn(stats.getTotalBytes());
+ when(mStatsService.getNetworkTotalBytes(sTemplateWifi, CYCLE_START,
+ CYCLE_END)).thenReturn(stats.getTotalBytes());
tagFuture = expectEnqueueNotification();
mPolicyListener.expect().onMeteredIfacesChanged(any());
@@ -1447,7 +1422,9 @@
private NetworkPolicy buildDefaultFakeMobilePolicy() {
NetworkPolicy p = mService.buildDefaultMobilePolicy(FAKE_SUB_ID, FAKE_SUBSCRIBER_ID);
// set a deterministic cycle date
- p.cycleDay = DEFAULT_CYCLE_DAY;
+ p.cycleRule = new RecurrenceRule(
+ p.cycleRule.start.withDayOfMonth(DEFAULT_CYCLE_DAY),
+ p.cycleRule.end, Period.ofMonths(1));
return p;
}
@@ -1470,9 +1447,7 @@
}
private static long parseTime(String time) {
- final Time result = new Time();
- result.parse3339(time);
- return result.toMillis(true);
+ return ZonedDateTime.parse(time).toInstant().toEpochMilli();
}
private void setNetworkPolicies(NetworkPolicy... policies) {
@@ -1559,16 +1534,15 @@
}
private static String formatTime(long millis) {
- final Time time = new Time(Time.TIMEZONE_UTC);
- time.set(millis);
- return time.format3339(false);
+ return Instant.ofEpochMilli(millis) + " [" + millis + "]";
}
private static void assertEqualsFuzzy(long expected, long actual, long fuzzy) {
final long low = expected - fuzzy;
final long high = expected + fuzzy;
if (actual < low || actual > high) {
- fail("value " + actual + " is outside [" + low + "," + high + "]");
+ fail("value " + formatTime(actual) + " is outside [" + formatTime(low) + ","
+ + formatTime(high) + "]");
}
}
@@ -1643,6 +1617,8 @@
}
private void setCurrentTimeMillis(long currentTimeMillis) {
+ RecurrenceRule.sClock = Clock.fixed(Instant.ofEpochMilli(currentTimeMillis),
+ ZoneId.systemDefault());
mStartTime = currentTimeMillis;
mElapsedRealtime = 0L;
}
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityNodeInfoTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityNodeInfoTest.java
new file mode 100644
index 0000000..7f97973
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityNodeInfoTest.java
@@ -0,0 +1,63 @@
+package com.android.server.accessibility;
+
+import static org.junit.Assert.fail;
+
+import android.support.test.runner.AndroidJUnit4;
+import android.util.ArraySet;
+import android.view.accessibility.AccessibilityNodeInfo;
+import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
+
+import com.android.internal.util.CollectionUtils;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.ArrayList;
+
+@RunWith(AndroidJUnit4.class)
+public class AccessibilityNodeInfoTest {
+
+ @Test
+ public void testStandardActions_serializationFlagIsValid() {
+ AccessibilityAction brokenStandardAction = CollectionUtils.find(
+ new ArrayList<>(AccessibilityAction.sStandardActions),
+ action -> Integer.bitCount(action.mSerializationFlag) != 1);
+ if (brokenStandardAction != null) {
+ String message = "Invalid serialization flag(0x"
+ + Integer.toHexString(brokenStandardAction.mSerializationFlag)
+ + ") in " + brokenStandardAction;
+ if (brokenStandardAction.mSerializationFlag == 0L) {
+ message += "\nThis is likely due to an overflow";
+ }
+ fail(message);
+ }
+
+ brokenStandardAction = CollectionUtils.find(
+ new ArrayList<>(AccessibilityAction.sStandardActions),
+ action -> Integer.bitCount(action.getId()) == 1
+ && action.getId() <= AccessibilityNodeInfo.LAST_LEGACY_STANDARD_ACTION
+ && action.getId() != action.mSerializationFlag);
+ if (brokenStandardAction != null) {
+ fail("Serialization flag(0x"
+ + Integer.toHexString(brokenStandardAction.mSerializationFlag)
+ + ") is different from legacy action id(0x"
+ + Integer.toHexString(brokenStandardAction.getId())
+ + ") in " + brokenStandardAction);
+ }
+ }
+
+ @Test
+ public void testStandardActions_idsAreUnique() {
+ ArraySet<AccessibilityAction> actions = AccessibilityAction.sStandardActions;
+ for (int i = 0; i < actions.size(); i++) {
+ for (int j = 0; j < i; j++) {
+ int id = actions.valueAt(i).getId();
+ if (id == actions.valueAt(j).getId()) {
+ fail("Id 0x" + Integer.toHexString(id)
+ + " is duplicated for standard actions #" + i + " and #" + j);
+ }
+ }
+ }
+ }
+
+}
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/KeyboardInterceptorTest.java b/services/tests/servicestests/src/com/android/server/accessibility/KeyboardInterceptorTest.java
new file mode 100644
index 0000000..5db397f
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/accessibility/KeyboardInterceptorTest.java
@@ -0,0 +1,218 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.accessibility;
+
+import static junit.framework.Assert.assertTrue;
+
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.junit.Assert.assertFalse;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyObject;
+import static org.mockito.Matchers.isNull;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.mockito.hamcrest.MockitoHamcrest.argThat;
+
+import org.hamcrest.BaseMatcher;
+import org.hamcrest.Description;
+import org.hamcrest.TypeSafeMatcher;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InOrder;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+import android.os.Looper;
+import android.support.test.runner.AndroidJUnit4;
+import android.view.KeyEvent;
+import android.view.WindowManagerPolicy;
+import android.view.WindowManagerPolicy.WindowState;
+
+/**
+ * Tests for KeyboardInterceptor
+ */
+@RunWith(AndroidJUnit4.class)
+public class KeyboardInterceptorTest {
+ private KeyboardInterceptor mInterceptor;
+ private MessageCapturingHandler mHandler = new MessageCapturingHandler(
+ msg -> mInterceptor.handleMessage(msg));
+ @Mock AccessibilityManagerService mMockAms;
+ @Mock WindowManagerPolicy mMockPolicy;
+
+ @BeforeClass
+ public static void oneTimeInitialization() {
+ if (Looper.myLooper() == null) {
+ Looper.prepare();
+ }
+ }
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mInterceptor = new KeyboardInterceptor(mMockAms, mMockPolicy, mHandler);
+ }
+
+ @Test
+ public void whenNonspecialKeyArrives_withNothingInQueue_eventGoesToAms() {
+ KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_0);
+ mInterceptor.onKeyEvent(event, 0);
+ verify(mMockAms).notifyKeyEvent(argThat(matchesKeyEvent(event)), eq(0));
+ }
+
+ @Test
+ public void whenVolumeKeyArrives_andPolicySaysUseIt_eventGoesToAms() {
+ KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_VOLUME_DOWN);
+ when(mMockPolicy.interceptKeyBeforeDispatching((WindowState) argThat(nullValue()),
+ argThat(matchesKeyEvent(event)), eq(0))).thenReturn(0L);
+ mInterceptor.onKeyEvent(event, 0);
+ verify(mMockAms).notifyKeyEvent(argThat(matchesKeyEvent(event)), eq(0));
+ }
+
+ @Test
+ public void whenVolumeKeyArrives_andPolicySaysDropIt_eventDropped() {
+ KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_VOLUME_UP);
+ when(mMockPolicy.interceptKeyBeforeDispatching((WindowState) argThat(nullValue()),
+ argThat(matchesKeyEvent(event)), eq(0))).thenReturn(-1L);
+ mInterceptor.onKeyEvent(event, 0);
+ verify(mMockAms, times(0)).notifyKeyEvent(anyObject(), anyInt());
+ assertFalse(mHandler.hasMessages());
+ }
+
+ @Test
+ public void whenVolumeKeyArrives_andPolicySaysDelayThenUse_eventQueuedThenSentToAms() {
+ KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_VOLUME_UP);
+ when(mMockPolicy.interceptKeyBeforeDispatching((WindowState) argThat(nullValue()),
+ argThat(matchesKeyEvent(event)), eq(0))).thenReturn(150L);
+ mInterceptor.onKeyEvent(event, 0);
+
+ assertTrue(mHandler.hasMessages());
+ verify(mMockAms, times(0)).notifyKeyEvent(anyObject(), anyInt());
+
+ when(mMockPolicy.interceptKeyBeforeDispatching((WindowState) argThat(nullValue()),
+ argThat(matchesKeyEvent(event)), eq(0))).thenReturn(0L);
+ mHandler.sendAllMessages();
+
+ verify(mMockAms).notifyKeyEvent(argThat(matchesKeyEvent(event)), eq(0));
+ }
+
+ @Test
+ public void whenVolumeKeyArrives_andPolicySaysDelayThenDrop_eventQueuedThenDropped() {
+ KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_VOLUME_DOWN);
+ when(mMockPolicy.interceptKeyBeforeDispatching((WindowState) argThat(nullValue()),
+ argThat(matchesKeyEvent(event)), eq(0))).thenReturn(150L);
+ mInterceptor.onKeyEvent(event, 0);
+
+ assertTrue(mHandler.hasMessages());
+ verify(mMockAms, times(0)).notifyKeyEvent(anyObject(), anyInt());
+
+ when(mMockPolicy.interceptKeyBeforeDispatching((WindowState) argThat(nullValue()),
+ argThat(matchesKeyEvent(event)), eq(0))).thenReturn(-1L);
+ mHandler.sendAllMessages();
+
+ verify(mMockAms, times(0)).notifyKeyEvent(anyObject(), anyInt());
+ }
+
+ @Test
+ public void whenSomeEventsGetDelayed_allEventsStillInOrder() {
+ KeyEvent[] events = {new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_0),
+ new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_VOLUME_UP),
+ new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_A),
+ new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_VOLUME_UP),
+ new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_0)};
+
+ when(mMockPolicy.interceptKeyBeforeDispatching((WindowState) argThat(nullValue()),
+ argThat(matchesKeyEvent(events[1])), eq(0))).thenReturn(150L);
+ when(mMockPolicy.interceptKeyBeforeDispatching((WindowState) argThat(nullValue()),
+ argThat(matchesKeyEvent(events[3])), eq(0))).thenReturn(75L);
+
+ for (KeyEvent event : events) {
+ mInterceptor.onKeyEvent(event, 0);
+ }
+
+ when(mMockPolicy.interceptKeyBeforeDispatching((WindowState) argThat(nullValue()),
+ argThat(matchesKeyEvent(events[1])), eq(0))).thenReturn(0L);
+ when(mMockPolicy.interceptKeyBeforeDispatching((WindowState) argThat(nullValue()),
+ argThat(matchesKeyEvent(events[3])), eq(0))).thenReturn(0L);
+
+ mHandler.sendAllMessages();
+
+ InOrder inOrder = Mockito.inOrder(mMockAms);
+ for (KeyEvent event : events) {
+ inOrder.verify(mMockAms).notifyKeyEvent(argThat(matchesKeyEvent(event)), eq(0));
+ }
+ }
+
+ @Test
+ public void whenSomeEventsGetDropped_otherEventsStillInOrder() {
+ KeyEvent[] events = {new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_0),
+ new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_VOLUME_UP),
+ new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_A),
+ new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_VOLUME_UP),
+ new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_0)};
+
+ when(mMockPolicy.interceptKeyBeforeDispatching((WindowState) argThat(nullValue()),
+ argThat(matchesKeyEvent(events[1])), eq(0))).thenReturn(150L);
+ when(mMockPolicy.interceptKeyBeforeDispatching((WindowState) argThat(nullValue()),
+ argThat(matchesKeyEvent(events[3])), eq(0))).thenReturn(75L);
+
+ for (KeyEvent event : events) {
+ mInterceptor.onKeyEvent(event, 0);
+ }
+
+ when(mMockPolicy.interceptKeyBeforeDispatching((WindowState) argThat(nullValue()),
+ argThat(matchesKeyEvent(events[1])), eq(0))).thenReturn(-1L);
+ when(mMockPolicy.interceptKeyBeforeDispatching((WindowState) argThat(nullValue()),
+ argThat(matchesKeyEvent(events[3])), eq(0))).thenReturn(-1L);
+
+ mHandler.sendAllMessages();
+
+ InOrder inOrder = Mockito.inOrder(mMockAms);
+ for (KeyEvent event : events) {
+ if ((event == events[1]) || (event == events[3])) continue;
+ inOrder.verify(mMockAms).notifyKeyEvent(argThat(matchesKeyEvent(event)), eq(0));
+ }
+ }
+
+ private static KeyEventMatcher matchesKeyEvent(KeyEvent event) {
+ return new KeyEventMatcher(event);
+ }
+
+ private static class KeyEventMatcher extends TypeSafeMatcher<KeyEvent> {
+ private KeyEvent mEventToMatch;
+
+ public KeyEventMatcher(KeyEvent eventToMatch) {
+ mEventToMatch = eventToMatch;
+ }
+
+ @Override
+ protected boolean matchesSafely(KeyEvent item) {
+ return (mEventToMatch.getKeyCode() == item.getKeyCode())
+ && (mEventToMatch.getAction() == item.getAction());
+ }
+
+ @Override
+ public void describeTo(Description description) {
+ description.appendText("Matches key event");
+ }
+ }
+}
\ No newline at end of file
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java
index 6701b71..0ffc61a 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java
@@ -113,7 +113,7 @@
private static final int[] UID_RECORD_CHANGES = {
UidRecord.CHANGE_PROCSTATE,
UidRecord.CHANGE_GONE,
- UidRecord.CHANGE_GONE_IDLE,
+ UidRecord.CHANGE_GONE | UidRecord.CHANGE_IDLE,
UidRecord.CHANGE_IDLE,
UidRecord.CHANGE_ACTIVE
};
@@ -417,7 +417,7 @@
// delivered to this observer.
final int[] changesToVerify = {
UidRecord.CHANGE_IDLE,
- UidRecord.CHANGE_GONE_IDLE
+ UidRecord.CHANGE_GONE | UidRecord.CHANGE_IDLE
};
verifyObserverReceivedChanges(observerToTest, changesToVerify, changeItems,
(observer, changeItem) -> {
@@ -439,7 +439,7 @@
// delivered to this observer.
final int[] changesToVerify = {
UidRecord.CHANGE_GONE,
- UidRecord.CHANGE_GONE_IDLE
+ UidRecord.CHANGE_GONE | UidRecord.CHANGE_IDLE
};
verifyObserverReceivedChanges(observerToTest, changesToVerify, changeItems,
(observer, changeItem) -> {
@@ -585,7 +585,7 @@
for (int i = 0; i < pendingItemsForUids.size(); ++i) {
final UidRecord.ChangeItem item = pendingItemsForUids.get(i);
final UidRecord validateUidRecord = mAms.mValidateUids.get(item.uid);
- if (item.change == UidRecord.CHANGE_GONE || item.change == UidRecord.CHANGE_GONE_IDLE) {
+ if ((item.change & UidRecord.CHANGE_GONE) != 0) {
assertNull("validateUidRecord should be null since the change is either "
+ "CHANGE_GONE or CHANGE_GONE_IDLE", validateUidRecord);
} else {
@@ -614,7 +614,8 @@
final UidRecord.ChangeItem item = pendingItemsForUids.get(i);
// Assign CHANGE_GONE_IDLE to some items and CHANGE_GONE to the others, using even/odd
// distribution for this assignment.
- item.change = (i % 2) == 0 ? UidRecord.CHANGE_GONE_IDLE : UidRecord.CHANGE_GONE;
+ item.change = (i % 2) == 0 ? (UidRecord.CHANGE_GONE | UidRecord.CHANGE_IDLE)
+ : UidRecord.CHANGE_GONE;
}
mAms.mPendingUidChanges.addAll(pendingItemsForUids);
mAms.dispatchUidsChanged();
@@ -653,8 +654,7 @@
mAms.enqueueUidChangeLocked(uidRecord, uid, changeToDispatch);
// Verify there is no effect on curProcStateSeq.
assertEquals(curProcstateSeq, uidRecord.curProcStateSeq);
- if (changeToDispatch == UidRecord.CHANGE_GONE
- || changeToDispatch == UidRecord.CHANGE_GONE_IDLE) {
+ if ((changeToDispatch & UidRecord.CHANGE_GONE) != 0) {
// Since the change is CHANGE_GONE or CHANGE_GONE_IDLE, verify that
// lastProcStateSeqDispatchedToObservers is not updated.
assertNotEquals(uidRecord.curProcStateSeq,
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java
index 711c36b..48464e5 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java
@@ -98,25 +98,4 @@
testStack.stopActivityLocked(activityRecord);
}
-
- /**
- * This test verifies that {@link ActivityStack#STACK_VISIBLE_ACTIVITY_BEHIND} is returned from
- * {@link ActivityStack#shouldBeVisible(ActivityRecord)} from a fullscreen workspace stack with
- * a visible behind activity when top focused stack is the home stack.
- */
- @Test
- public void testShouldBeVisibleWithVisibleBehindActivity() throws Exception {
- final ActivityManagerService service = createActivityManagerService();
- final TaskRecord task = createTask(service, testActivityComponent,
- ActivityManager.StackId.FULLSCREEN_WORKSPACE_STACK_ID);
- final ActivityStack fullscreenWorkspaceStackId = task.getStack();
- final ActivityStack homeStack = service.mStackSupervisor.getStack(
- ActivityManager.StackId.HOME_STACK_ID, true /*createStaticStackIfNeeded*/,
- true /*onTop*/);
- final ActivityRecord activityRecord = createActivity(service, testActivityComponent, task);
- service.mStackSupervisor.setFocusStackUnchecked("testEmptyStackShouldBeVisible", homeStack);
- service.mStackSupervisor.requestVisibleBehindLocked(activityRecord, true);
- assertEquals(ActivityStack.STACK_VISIBLE_ACTIVITY_BEHIND,
- fullscreenWorkspaceStackId.shouldBeVisible(null /*starting*/));
- }
}
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
index 16bc011..04b5bde 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
@@ -16,6 +16,7 @@
package com.android.server.am;
+import static android.app.ActivityManager.StackId.PINNED_STACK_ID;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.any;
@@ -78,7 +79,7 @@
int stackId, int displayId, boolean onTop) {
if (service.mStackSupervisor instanceof TestActivityStackSupervisor) {
return ((TestActivityStackSupervisor) service.mStackSupervisor)
- .createTestStack(service, stackId, onTop);
+ .createTestStack(stackId, onTop);
}
return null;
@@ -96,8 +97,7 @@
0 /* launchedFromPid */, 0, null, intent, null,
aInfo /*aInfo*/, new Configuration(), null /* resultTo */, null /* resultWho */,
0 /* reqCode */, false /*componentSpecified*/, false /* rootVoiceInteraction */,
- service.mStackSupervisor, null /* container */, null /* options */,
- null /* sourceRecord */);
+ service.mStackSupervisor, null /* options */, null /* sourceRecord */);
activity.mWindowContainerController = mock(AppWindowContainerController.class);
if (task != null) {
@@ -187,12 +187,24 @@
boolean preserveWindows) {
}
- public <T extends ActivityStack> T createTestStack(ActivityManagerService service,
- int stackId, boolean onTop) {
- final TestActivityContainer container =
- new TestActivityContainer(service, stackId, mDisplay, onTop);
- mActivityContainers.put(stackId, container);
- return (T) container.getStack();
+ <T extends ActivityStack> T createTestStack(int stackId, boolean onTop) {
+ return (T) createStack(stackId, mDisplay, onTop);
+ }
+
+ @Override
+ ActivityStack createStack(int stackId, ActivityDisplay display, boolean onTop) {
+ final RecentTasks recents =
+ new RecentTasks(mService, mService.mStackSupervisor);
+ if (stackId == PINNED_STACK_ID) {
+ return new PinnedActivityStack(display, stackId, this, recents, onTop) {
+ @Override
+ Rect getDefaultPictureInPictureBounds(float aspectRatio) {
+ return new Rect(50, 50, 100, 100);
+ }
+ };
+ } else {
+ return new TestActivityStack(display, stackId, this, recents, onTop);
+ }
}
@Override
@@ -204,49 +216,7 @@
return stack;
}
- return createTestStack(mService, stackId, createOnTop);
- }
-
- private class TestActivityContainer extends ActivityContainer {
- private final ActivityManagerService mService;
-
- private boolean mOnTop;
- private int mStackId;
- private ActivityStack mStack;
-
- TestActivityContainer(ActivityManagerService service, int stackId,
- ActivityDisplay activityDisplay, boolean onTop) {
- super(stackId, activityDisplay, onTop);
- mService = service;
- }
-
- @Override
- protected void createStack(int stackId, boolean onTop) {
- // normally stack creation is done here. However we need to do it on demand since
- // we cannot set {@link mService} by the time the super constructor calling this
- // method is invoked.
- mOnTop = onTop;
- mStackId = stackId;
- }
-
- public ActivityStack getStack() {
- if (mStack == null) {
- final RecentTasks recents =
- new RecentTasks(mService, mService.mStackSupervisor);
- if (mStackId == ActivityManager.StackId.PINNED_STACK_ID) {
- mStack = new PinnedActivityStack(this, recents, mOnTop) {
- @Override
- Rect getDefaultPictureInPictureBounds(float aspectRatio) {
- return new Rect(50, 50, 100, 100);
- }
- };
- } else {
- mStack = new TestActivityStack(this, recents, mOnTop);
- }
- }
-
- return mStack;
- }
+ return createTestStack(stackId, createOnTop);
}
}
@@ -277,9 +247,9 @@
extends ActivityStack<T> implements ActivityStackReporter {
private int mOnActivityRemovedFromStackCount = 0;
private T mContainerController;
- TestActivityStack(ActivityStackSupervisor.ActivityContainer activityContainer,
- RecentTasks recentTasks, boolean onTop) {
- super(activityContainer, recentTasks, onTop);
+ TestActivityStack(ActivityStackSupervisor.ActivityDisplay display, int stackId,
+ ActivityStackSupervisor supervisor, RecentTasks recentTasks, boolean onTop) {
+ super(display, stackId, supervisor, recentTasks, onTop);
}
@Override
diff --git a/services/tests/servicestests/src/com/android/server/backup/BackupPasswordManagerTest.java b/services/tests/servicestests/src/com/android/server/backup/BackupPasswordManagerTest.java
new file mode 100644
index 0000000..04c0251
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/backup/BackupPasswordManagerTest.java
@@ -0,0 +1,232 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.backup;
+
+import static com.android.server.testutis.TestUtils.assertExpectException;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doThrow;
+
+import android.content.Context;
+import android.platform.test.annotations.Presubmit;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import com.android.server.backup.utils.PasswordUtils;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.security.SecureRandom;
+
+@SmallTest
+@Presubmit
+@RunWith(AndroidJUnit4.class)
+public class BackupPasswordManagerTest {
+ private static final String PASSWORD_VERSION_FILE_NAME = "pwversion";
+ private static final String PASSWORD_HASH_FILE_NAME = "pwhash";
+ private static final String V1_HASH_ALGORITHM = "PBKDF2WithHmacSHA1And8bit";
+
+ @Rule public TemporaryFolder mTemporaryFolder = new TemporaryFolder();
+
+ @Mock private Context mContext;
+
+ private File mStateFolder;
+ private BackupPasswordManager mPasswordManager;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+ mStateFolder = mTemporaryFolder.newFolder();
+ mPasswordManager = new BackupPasswordManager(mContext, mStateFolder, new SecureRandom());
+ }
+
+ @Test
+ public void hasBackupPassword_isFalseIfFileDoesNotExist() {
+ assertThat(mPasswordManager.hasBackupPassword()).isFalse();
+ }
+
+ @Test
+ public void hasBackupPassword_isTrueIfFileExists() throws Exception {
+ mPasswordManager.setBackupPassword(null, "password1234");
+ assertThat(mPasswordManager.hasBackupPassword()).isTrue();
+ }
+
+ @Test
+ public void hasBackupPassword_throwsSecurityExceptionIfLacksPermission() {
+ setDoesNotHavePermission();
+
+ assertExpectException(
+ SecurityException.class,
+ /* expectedExceptionMessageRegex */ null,
+ () -> mPasswordManager.hasBackupPassword());
+ }
+
+ @Test
+ public void backupPasswordMatches_isTrueIfNoPassword() {
+ assertThat(mPasswordManager.backupPasswordMatches("anything")).isTrue();
+ }
+
+ @Test
+ public void backupPasswordMatches_isTrueForSamePassword() {
+ String password = "password1234";
+ mPasswordManager.setBackupPassword(null, password);
+ assertThat(mPasswordManager.backupPasswordMatches(password)).isTrue();
+ }
+
+ @Test
+ public void backupPasswordMatches_isFalseForDifferentPassword() {
+ mPasswordManager.setBackupPassword(null, "shiba");
+ assertThat(mPasswordManager.backupPasswordMatches("corgi")).isFalse();
+ }
+
+ @Test
+ public void backupPasswordMatches_worksForV1HashIfVersionIsV1() throws Exception {
+ String password = "corgi\uFFFF";
+ writePasswordVersionToFile(1);
+ writeV1HashToFile(password, saltFixture());
+
+ // Reconstruct so it reloads from filesystem
+ mPasswordManager = new BackupPasswordManager(mContext, mStateFolder, new SecureRandom());
+
+ assertThat(mPasswordManager.backupPasswordMatches(password)).isTrue();
+ }
+
+ @Test
+ public void backupPasswordMatches_failsForV1HashIfVersionIsV2() throws Exception {
+ // The algorithms produce identical hashes except if the password contains higher-order
+ // unicode. See
+ // https://android-developers.googleblog.com/2013/12/changes-to-secretkeyfactory-api-in.html
+ String password = "corgi\uFFFF";
+ writePasswordVersionToFile(2);
+ writeV1HashToFile(password, saltFixture());
+
+ // Reconstruct so it reloads from filesystem
+ mPasswordManager = new BackupPasswordManager(mContext, mStateFolder, new SecureRandom());
+
+ assertThat(mPasswordManager.backupPasswordMatches(password)).isFalse();
+ }
+
+ @Test
+ public void backupPasswordMatches_throwsSecurityExceptionIfLacksPermission() {
+ setDoesNotHavePermission();
+
+ assertExpectException(
+ SecurityException.class,
+ /* expectedExceptionMessageRegex */ null,
+ () -> mPasswordManager.backupPasswordMatches("password123"));
+ }
+
+ @Test
+ public void setBackupPassword_persistsPasswordToFile() {
+ String password = "shiba";
+
+ mPasswordManager.setBackupPassword(null, password);
+
+ BackupPasswordManager newManager = new BackupPasswordManager(
+ mContext, mStateFolder, new SecureRandom());
+ assertThat(newManager.backupPasswordMatches(password)).isTrue();
+ }
+
+ @Test
+ public void setBackupPassword_failsIfCurrentPasswordIsWrong() {
+ String secondPassword = "second password";
+ mPasswordManager.setBackupPassword(null, "first password");
+
+ boolean result = mPasswordManager.setBackupPassword(
+ "incorrect pass", secondPassword);
+
+ BackupPasswordManager newManager = new BackupPasswordManager(
+ mContext, mStateFolder, new SecureRandom());
+ assertThat(result).isFalse();
+ assertThat(newManager.backupPasswordMatches(secondPassword)).isFalse();
+ }
+
+ @Test
+ public void setBackupPassword_throwsSecurityExceptionIfLacksPermission() {
+ setDoesNotHavePermission();
+
+ assertExpectException(
+ SecurityException.class,
+ /* expectedExceptionMessageRegex */ null,
+ () -> mPasswordManager.setBackupPassword(
+ "password123", "password111"));
+ }
+
+ private byte[] saltFixture() {
+ byte[] bytes = new byte[64];
+ for (int i = 0; i < 64; i++) {
+ bytes[i] = (byte) i;
+ }
+ return bytes;
+ }
+
+ private void setDoesNotHavePermission() {
+ doThrow(new SecurityException()).when(mContext)
+ .enforceCallingOrSelfPermission(anyString(), anyString());
+ }
+
+ private void writeV1HashToFile(String password, byte[] salt) throws Exception {
+ String hash = PasswordUtils.buildPasswordHash(
+ V1_HASH_ALGORITHM, password, salt, PasswordUtils.PBKDF2_HASH_ROUNDS);
+ writeHashAndSaltToFile(hash, salt);
+ }
+
+ private void writeHashAndSaltToFile(String hash, byte[] salt) throws Exception {
+ FileOutputStream fos = null;
+ DataOutputStream dos = null;
+
+ try {
+ File passwordHash = new File(mStateFolder, PASSWORD_HASH_FILE_NAME);
+ fos = new FileOutputStream(passwordHash);
+ dos = new DataOutputStream(fos);
+ dos.writeInt(salt.length);
+ dos.write(salt);
+ dos.writeUTF(hash);
+ dos.flush();
+ } finally {
+ if (dos != null) dos.close();
+ if (fos != null) fos.close();
+ }
+ }
+
+ private void writePasswordVersionToFile(int version) throws Exception {
+ FileOutputStream fos = null;
+ DataOutputStream dos = null;
+
+ try {
+ File passwordVersion = new File(mStateFolder, PASSWORD_VERSION_FILE_NAME);
+ fos = new FileOutputStream(passwordVersion);
+ dos = new DataOutputStream(fos);
+ dos.writeInt(version);
+ dos.flush();
+ } finally {
+ if (dos != null) dos.close();
+ if (fos != null) fos.close();
+ }
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/backup/DataChangedJournalTest.java b/services/tests/servicestests/src/com/android/server/backup/DataChangedJournalTest.java
new file mode 100644
index 0000000..c27fd07
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/backup/DataChangedJournalTest.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.backup;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.platform.test.annotations.Presubmit;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import org.junit.runner.RunWith;
+import org.mockito.InOrder;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+import java.io.DataInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.util.ArrayList;
+
+@SmallTest
+@Presubmit
+@RunWith(AndroidJUnit4.class)
+public class DataChangedJournalTest {
+ private static final String GMAIL = "com.google.gmail";
+ private static final String DOCS = "com.google.docs";
+ private static final String GOOGLE_PLUS = "com.google.plus";
+
+ @Rule public TemporaryFolder mTemporaryFolder = new TemporaryFolder();
+
+ @Mock private DataChangedJournal.Consumer mConsumer;
+
+ private File mFile;
+ private DataChangedJournal mJournal;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+ mFile = mTemporaryFolder.newFile();
+ mJournal = new DataChangedJournal(mFile);
+ }
+
+ @Test
+ public void addPackage_addsPackagesToEndOfFile() throws Exception {
+ mJournal.addPackage(GMAIL);
+ mJournal.addPackage(DOCS);
+ mJournal.addPackage(GOOGLE_PLUS);
+
+ FileInputStream fos = new FileInputStream(mFile);
+ DataInputStream dos = new DataInputStream(fos);
+ assertThat(dos.readUTF()).isEqualTo(GMAIL);
+ assertThat(dos.readUTF()).isEqualTo(DOCS);
+ assertThat(dos.readUTF()).isEqualTo(GOOGLE_PLUS);
+ assertThat(dos.available()).isEqualTo(0);
+ }
+
+ @Test
+ public void delete_deletesTheFile() throws Exception {
+ mJournal.addPackage(GMAIL);
+
+ mJournal.delete();
+
+ assertThat(mFile.exists()).isFalse();
+ }
+
+ @Test
+ public void equals_isTrueForTheSameFile() throws Exception {
+ assertThat(mJournal.equals(new DataChangedJournal(mFile))).isTrue();
+ }
+
+ @Test
+ public void equals_isFalseForDifferentFiles() throws Exception {
+ assertThat(mJournal.equals(new DataChangedJournal(mTemporaryFolder.newFile()))).isFalse();
+ }
+
+ @Test
+ public void forEach_iteratesThroughPackagesInFileInOrder() throws Exception {
+ mJournal.addPackage(GMAIL);
+ mJournal.addPackage(DOCS);
+
+ mJournal.forEach(mConsumer);
+
+ InOrder inOrder = Mockito.inOrder(mConsumer);
+ inOrder.verify(mConsumer).accept(GMAIL);
+ inOrder.verify(mConsumer).accept(DOCS);
+ inOrder.verifyNoMoreInteractions();
+ }
+
+ @Test
+ public void listJournals_returnsJournalsForEveryFileInDirectory() throws Exception {
+ File folder = mTemporaryFolder.newFolder();
+ DataChangedJournal.newJournal(folder);
+ DataChangedJournal.newJournal(folder);
+
+ ArrayList<DataChangedJournal> journals = DataChangedJournal.listJournals(folder);
+
+ assertThat(journals).hasSize(2);
+ }
+
+ @Test
+ public void newJournal_createsANewTemporaryFile() throws Exception {
+ File folder = mTemporaryFolder.newFolder();
+
+ DataChangedJournal.newJournal(folder);
+
+ assertThat(folder.listFiles()).hasLength(1);
+ }
+
+ @Test
+ public void toString_isSameAsFileToString() throws Exception {
+ assertThat(mJournal.toString()).isEqualTo(mFile.toString());
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/backup/utils/DataStreamFileCodecTest.java b/services/tests/servicestests/src/com/android/server/backup/utils/DataStreamFileCodecTest.java
new file mode 100644
index 0000000..bfb95c1
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/backup/utils/DataStreamFileCodecTest.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.backup.utils;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.platform.test.annotations.Presubmit;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import org.junit.runner.RunWith;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.IOException;
+
+@SmallTest
+@Presubmit
+@RunWith(AndroidJUnit4.class)
+public final class DataStreamFileCodecTest {
+ @Rule public TemporaryFolder mTemporaryFolder = new TemporaryFolder();
+
+ @Test
+ public void serialize_writesToTheFile() throws Exception {
+ File unicornFile = mTemporaryFolder.newFile();
+
+ DataStreamFileCodec<MythicalCreature> mythicalCreatureCodec = new DataStreamFileCodec<>(
+ unicornFile, new MythicalCreatureDataStreamCodec());
+ MythicalCreature unicorn = new MythicalCreature(
+ 10000, "Unicorn");
+ mythicalCreatureCodec.serialize(unicorn);
+
+ DataStreamFileCodec<MythicalCreature> newCodecWithSameFile = new DataStreamFileCodec<>(
+ unicornFile, new MythicalCreatureDataStreamCodec());
+ MythicalCreature deserializedUnicorn = newCodecWithSameFile.deserialize();
+
+ assertThat(deserializedUnicorn.averageLifespanInYears)
+ .isEqualTo(unicorn.averageLifespanInYears);
+ assertThat(deserializedUnicorn.name).isEqualTo(unicorn.name);
+ }
+
+ private static class MythicalCreature {
+ int averageLifespanInYears;
+ String name;
+
+ MythicalCreature(int averageLifespanInYears, String name) {
+ this.averageLifespanInYears = averageLifespanInYears;
+ this.name = name;
+ }
+ }
+
+ private static class MythicalCreatureDataStreamCodec implements
+ DataStreamCodec<MythicalCreature> {
+ @Override
+ public void serialize(MythicalCreature mythicalCreature,
+ DataOutputStream dataOutputStream) throws IOException {
+ dataOutputStream.writeInt(mythicalCreature.averageLifespanInYears);
+ dataOutputStream.writeUTF(mythicalCreature.name);
+ }
+
+ @Override
+ public MythicalCreature deserialize(DataInputStream dataInputStream)
+ throws IOException {
+ int years = dataInputStream.readInt();
+ String name = dataInputStream.readUTF();
+ return new MythicalCreature(years, name);
+ }
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/backup/utils/SparseArrayUtilsTest.java b/services/tests/servicestests/src/com/android/server/backup/utils/SparseArrayUtilsTest.java
new file mode 100644
index 0000000..db55120
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/backup/utils/SparseArrayUtilsTest.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.backup.utils;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.platform.test.annotations.Presubmit;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.util.SparseArray;
+
+import com.google.android.collect.Sets;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.HashSet;
+
+@SmallTest
+@Presubmit
+@RunWith(AndroidJUnit4.class)
+public class SparseArrayUtilsTest {
+ @Test
+ public void union_mergesSets() {
+ SparseArray<HashSet<String>> sparseArray = new SparseArray<>();
+ sparseArray.append(12, Sets.newHashSet("a", "b", "c"));
+ sparseArray.append(45, Sets.newHashSet("d", "e"));
+ sparseArray.append(46, Sets.newHashSet());
+ sparseArray.append(66, Sets.newHashSet("a", "e", "f"));
+
+ assertThat(SparseArrayUtils.union(sparseArray)).isEqualTo(
+ Sets.newHashSet("a", "b", "c", "d", "e", "f"));
+ }
+
+ @Test
+ public void union_returnsEmptySetForEmptyList() {
+ SparseArray<HashSet<String>> sparseArray = new SparseArray<>();
+
+ assertThat(SparseArrayUtils.union(sparseArray)).isEqualTo(Sets.newHashSet());
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
index bad9b5b..dcca724 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
@@ -69,6 +69,7 @@
import android.os.Process;
import android.os.UserHandle;
import android.os.UserManager;
+import android.platform.test.annotations.Presubmit;
import android.provider.Settings;
import android.security.KeyChain;
import android.telephony.TelephonyManager;
@@ -112,6 +113,7 @@
* runtest -c com.android.server.devicepolicy.DevicePolicyManagerTest frameworks-services
*/
@SmallTest
+@Presubmit
public class DevicePolicyManagerTest extends DpmTestBase {
private static final List<String> OWNER_SETUP_PERMISSIONS = Arrays.asList(
permission.MANAGE_DEVICE_ADMINS, permission.MANAGE_PROFILE_AND_DEVICE_OWNERS,
@@ -2377,11 +2379,6 @@
// restore to the debuggable build state
getServices().buildMock.isDebuggable = true;
- // Always return the default (second arg) when getting system property for long type
- when(getServices().systemProperties.getLong(anyString(), anyLong())).thenAnswer(
- invocation -> invocation.getArguments()[1]
- );
-
// reset to default (0 means the admin is not participating, so default should be returned)
dpm.setRequiredStrongAuthTimeout(admin1, 0);
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DpmTestBase.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DpmTestBase.java
index e0ea573..0c8a787 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DpmTestBase.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DpmTestBase.java
@@ -16,9 +16,13 @@
package com.android.server.devicepolicy;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.when;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
@@ -62,6 +66,7 @@
adminAnotherPackage = new ComponentName(DpmMockContext.ANOTHER_PACKAGE_NAME,
"whatever.random.class");
adminNoPerm = new ComponentName(mRealTestContext, DummyDeviceAdmins.AdminNoPerm.class);
+ mockSystemPropertiesToReturnDefault();
}
@Override
@@ -213,4 +218,25 @@
// Set up getPackageInfo().
markPackageAsInstalled(admin.getPackageName(), ai, UserHandle.getUserId(packageUid));
}
+
+ /**
+ * By default, system properties are mocked to return default value. Override the mock if you
+ * want a specific value.
+ */
+ private void mockSystemPropertiesToReturnDefault() {
+ when(getServices().systemProperties.get(
+ anyString(), anyString())).thenAnswer(
+ invocation -> invocation.getArguments()[1]
+ );
+
+ when(getServices().systemProperties.getBoolean(
+ anyString(), anyBoolean())).thenAnswer(
+ invocation -> invocation.getArguments()[1]
+ );
+
+ when(getServices().systemProperties.getLong(
+ anyString(), anyLong())).thenAnswer(
+ invocation -> invocation.getArguments()[1]
+ );
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/BaseLockSettingsServiceTests.java b/services/tests/servicestests/src/com/android/server/locksettings/BaseLockSettingsServiceTests.java
index 84cca0e..13cf9df 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/BaseLockSettingsServiceTests.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/BaseLockSettingsServiceTests.java
@@ -20,21 +20,26 @@
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import android.app.IActivityManager;
import android.app.NotificationManager;
import android.app.admin.DevicePolicyManager;
+import android.app.trust.TrustManager;
import android.content.ComponentName;
import android.content.pm.UserInfo;
import android.os.FileUtils;
import android.os.IProgressListener;
+import android.os.RemoteException;
import android.os.UserManager;
import android.os.storage.StorageManager;
+import android.os.storage.IStorageManager;
import android.security.KeyStore;
import android.test.AndroidTestCase;
+import com.android.internal.widget.ILockSettings;
import com.android.internal.widget.LockPatternUtils;
import org.mockito.invocation.InvocationOnMock;
@@ -64,10 +69,10 @@
LockSettingsStorageTestable mStorage;
LockPatternUtils mLockPatternUtils;
- MockGateKeeperService mGateKeeperService;
+ FakeGateKeeperService mGateKeeperService;
NotificationManager mNotificationManager;
UserManager mUserManager;
- MockStorageManager mStorageManager;
+ FakeStorageManager mStorageManager;
IActivityManager mActivityManager;
DevicePolicyManager mDevicePolicyManager;
KeyStore mKeyStore;
@@ -77,16 +82,15 @@
protected void setUp() throws Exception {
super.setUp();
- mLockPatternUtils = mock(LockPatternUtils.class);
- mGateKeeperService = new MockGateKeeperService();
+ mGateKeeperService = new FakeGateKeeperService();
mNotificationManager = mock(NotificationManager.class);
mUserManager = mock(UserManager.class);
- mStorageManager = new MockStorageManager();
+ mStorageManager = new FakeStorageManager();
mActivityManager = mock(IActivityManager.class);
mDevicePolicyManager = mock(DevicePolicyManager.class);
mContext = new MockLockSettingsContext(getContext(), mUserManager, mNotificationManager,
- mDevicePolicyManager, mock(StorageManager.class));
+ mDevicePolicyManager, mock(StorageManager.class), mock(TrustManager.class));
mStorage = new LockSettingsStorageTestable(mContext,
new File(getContext().getFilesDir(), "locksettings"));
File storageDir = mStorage.mStorageDir;
@@ -96,9 +100,15 @@
storageDir.mkdirs();
}
+ mLockPatternUtils = new LockPatternUtils(mContext) {
+ @Override
+ public ILockSettings getLockSettings() {
+ return mService;
+ }
+ };
mSpManager = new MockSyntheticPasswordManager(mStorage, mGateKeeperService, mUserManager);
- mService = new LockSettingsServiceTestable(mContext, mLockPatternUtils,
- mStorage, mGateKeeperService, mKeyStore, mStorageManager, mActivityManager,
+ mService = new LockSettingsServiceTestable(mContext, mLockPatternUtils, mStorage,
+ mGateKeeperService, mKeyStore, setUpStorageManagerMock(), mActivityManager,
mSpManager);
when(mUserManager.getUserInfo(eq(PRIMARY_USER_ID))).thenReturn(PRIMARY_USER_INFO);
mPrimaryUserProfiles.add(PRIMARY_USER_INFO);
@@ -119,8 +129,6 @@
}
});
- when(mLockPatternUtils.getLockSettings()).thenReturn(mService);
-
// Adding a fake Device Owner app which will enable escrow token support in LSS.
when(mDevicePolicyManager.getDeviceOwnerComponentOnAnyUser()).thenReturn(
new ComponentName("com.dummy.package", ".FakeDeviceOwner"));
@@ -145,6 +153,33 @@
return userInfo;
}
+ private IStorageManager setUpStorageManagerMock() throws RemoteException {
+ final IStorageManager sm = mock(IStorageManager.class);
+
+ doAnswer(new Answer<Void>() {
+ @Override
+ public Void answer(InvocationOnMock invocation) throws Throwable {
+ Object[] args = invocation.getArguments();
+ mStorageManager.addUserKeyAuth((int) args[0] /* userId */,
+ (int) args[1] /* serialNumber */,
+ (byte[]) args[2] /* token */,
+ (byte[]) args[3] /* secret */);
+ return null;
+ }
+ }).when(sm).addUserKeyAuth(anyInt(), anyInt(), any(), any());
+
+ doAnswer(
+ new Answer<Void>() {
+ @Override
+ public Void answer(InvocationOnMock invocation) throws Throwable {
+ Object[] args = invocation.getArguments();
+ mStorageManager.fixateNewestUserKeyAuth((int) args[0] /* userId */);
+ return null;
+ }
+ }).when(sm).fixateNewestUserKeyAuth(anyInt());
+ return sm;
+ }
+
@Override
protected void tearDown() throws Exception {
super.tearDown();
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/FakeGateKeeperService.java b/services/tests/servicestests/src/com/android/server/locksettings/FakeGateKeeperService.java
new file mode 100644
index 0000000..094b7af
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/locksettings/FakeGateKeeperService.java
@@ -0,0 +1,198 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.locksettings;
+
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.service.gatekeeper.GateKeeperResponse;
+import android.service.gatekeeper.IGateKeeperService;
+import android.util.ArrayMap;
+
+import junit.framework.AssertionFailedError;
+
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+import java.util.Random;
+
+public class FakeGateKeeperService implements IGateKeeperService {
+ static class VerifyHandle {
+ public byte[] password;
+ public long sid;
+
+ public VerifyHandle(byte[] password, long sid) {
+ this.password = password;
+ this.sid = sid;
+ }
+
+ public VerifyHandle(byte[] handle) {
+ ByteBuffer buffer = ByteBuffer.allocate(handle.length);
+ buffer.put(handle, 0, handle.length);
+ buffer.flip();
+ int version = buffer.get();
+ sid = buffer.getLong();
+ password = new byte[buffer.remaining()];
+ buffer.get(password);
+ }
+
+ public byte[] toBytes() {
+ ByteBuffer buffer = ByteBuffer.allocate(1 + Long.BYTES + password.length);
+ buffer.put((byte)0);
+ buffer.putLong(sid);
+ buffer.put(password);
+ return buffer.array();
+ }
+ }
+
+ static class AuthToken {
+ public long challenge;
+ public long sid;
+
+ public AuthToken(long challenge, long sid) {
+ this.challenge = challenge;
+ this.sid = sid;
+ }
+
+ public AuthToken(byte[] handle) {
+ ByteBuffer buffer = ByteBuffer.allocate(handle.length);
+ buffer.put(handle, 0, handle.length);
+ buffer.flip();
+ int version = buffer.get();
+ challenge = buffer.getLong();
+ sid = buffer.getLong();
+ }
+
+ public byte[] toBytes() {
+ ByteBuffer buffer = ByteBuffer.allocate(1 + Long.BYTES + Long.BYTES);
+ buffer.put((byte)0);
+ buffer.putLong(challenge);
+ buffer.putLong(sid);
+ return buffer.array();
+ }
+ }
+
+ private ArrayMap<Integer, Long> sidMap = new ArrayMap<>();
+ private ArrayMap<Integer, AuthToken> authTokenMap = new ArrayMap<>();
+
+ private ArrayMap<Integer, byte[]> handleMap = new ArrayMap<>();
+
+ @Override
+ public GateKeeperResponse enroll(int uid, byte[] currentPasswordHandle, byte[] currentPassword,
+ byte[] desiredPassword) throws android.os.RemoteException {
+ if (currentPasswordHandle != null) {
+ VerifyHandle handle = new VerifyHandle(currentPasswordHandle);
+ if (Arrays.equals(currentPassword, handle.password)) {
+ // Trusted enroll
+ VerifyHandle newHandle = new VerifyHandle(desiredPassword, handle.sid);
+ refreshSid(uid, handle.sid, false);
+ handleMap.put(uid, newHandle.toBytes());
+ return GateKeeperResponse.createOkResponse(newHandle.toBytes(), false);
+ } else if (currentPassword != null) {
+ // current password is provided but does not match handle, this is an error case.
+ return null;
+ }
+ // Fall through: password handle is provided, but no password
+ }
+ // Untrusted/new enrollment: generate a new SID
+ long newSid = new Random().nextLong();
+ VerifyHandle newHandle = new VerifyHandle(desiredPassword, newSid);
+ refreshSid(uid, newSid, true);
+ handleMap.put(uid, newHandle.toBytes());
+ return GateKeeperResponse.createOkResponse(newHandle.toBytes(), false);
+ }
+
+ @Override
+ public GateKeeperResponse verify(int uid, byte[] enrolledPasswordHandle,
+ byte[] providedPassword) throws android.os.RemoteException {
+ return verifyChallenge(uid, 0, enrolledPasswordHandle, providedPassword);
+ }
+
+ @Override
+ public GateKeeperResponse verifyChallenge(int uid, long challenge,
+ byte[] enrolledPasswordHandle, byte[] providedPassword) throws RemoteException {
+
+ VerifyHandle handle = new VerifyHandle(enrolledPasswordHandle);
+ if (Arrays.equals(handle.password, providedPassword)) {
+ byte[] knownHandle = handleMap.get(uid);
+ if (knownHandle != null) {
+ if (!Arrays.equals(knownHandle, enrolledPasswordHandle)) {
+ throw new AssertionFailedError("Got correct but obsolete handle");
+ }
+ }
+ refreshSid(uid, handle.sid, false);
+ AuthToken token = new AuthToken(challenge, handle.sid);
+ refreshAuthToken(uid, token);
+ return GateKeeperResponse.createOkResponse(token.toBytes(), false);
+ } else {
+ return GateKeeperResponse.createGenericResponse(GateKeeperResponse.RESPONSE_ERROR);
+ }
+ }
+
+ private void refreshAuthToken(int uid, AuthToken token) {
+ authTokenMap.put(uid, token);
+ }
+
+ public AuthToken getAuthToken(int uid) {
+ return authTokenMap.get(uid);
+ }
+
+ public AuthToken getAuthTokenForSid(long sid) {
+ for(AuthToken token : authTokenMap.values()) {
+ if (token.sid == sid) {
+ return token;
+ }
+ }
+ return null;
+ }
+
+ public void clearAuthToken(int uid) {
+ authTokenMap.remove(uid);
+ }
+
+ @Override
+ public IBinder asBinder() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void clearSecureUserId(int userId) throws RemoteException {
+ sidMap.remove(userId);
+ }
+
+ @Override
+ public void reportDeviceSetupComplete() throws RemoteException {
+ }
+
+ @Override
+ public long getSecureUserId(int userId) throws RemoteException {
+ if (sidMap.containsKey(userId)) {
+ return sidMap.get(userId);
+ } else {
+ return 0L;
+ }
+ }
+
+ private void refreshSid(int uid, long sid, boolean force) {
+ if (!sidMap.containsKey(uid) || force) {
+ sidMap.put(uid, sid);
+ } else{
+ if (sidMap.get(uid) != sid) {
+ throw new AssertionFailedError("Inconsistent SID");
+ }
+ }
+ }
+
+}
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/FakeStorageManager.java b/services/tests/servicestests/src/com/android/server/locksettings/FakeStorageManager.java
new file mode 100644
index 0000000..dbdb41b
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/locksettings/FakeStorageManager.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.locksettings;
+
+import android.os.IProgressListener;
+import android.os.RemoteException;
+import android.util.ArrayMap;
+import android.util.Pair;
+
+
+import junit.framework.AssertionFailedError;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+public class FakeStorageManager {
+
+ private ArrayMap<Integer, ArrayList<Pair<byte[], byte[]>>> mAuth = new ArrayMap<>();
+ private boolean mIgnoreBadUnlock;
+
+ public void addUserKeyAuth(int userId, int serialNumber, byte[] token, byte[] secret) {
+ getUserAuth(userId).add(new Pair<>(token, secret));
+ }
+
+ public void fixateNewestUserKeyAuth(int userId) {
+ ArrayList<Pair<byte[], byte[]>> auths = mAuth.get(userId);
+ Pair<byte[], byte[]> latest = auths.get(auths.size() - 1);
+ auths.clear();
+ auths.add(latest);
+ }
+
+ private ArrayList<Pair<byte[], byte[]>> getUserAuth(int userId) {
+ if (!mAuth.containsKey(userId)) {
+ ArrayList<Pair<byte[], byte[]>> auths = new ArrayList<Pair<byte[], byte[]>>();
+ auths.add(new Pair(null, null));
+ mAuth.put(userId, auths);
+ }
+ return mAuth.get(userId);
+ }
+
+ public byte[] getUserUnlockToken(int userId) {
+ ArrayList<Pair<byte[], byte[]>> auths = getUserAuth(userId);
+ if (auths.size() != 1) {
+ throw new AssertionFailedError("More than one secret exists");
+ }
+ return auths.get(0).second;
+ }
+
+ public void unlockUser(int userId, byte[] secret, IProgressListener listener)
+ throws RemoteException {
+ listener.onStarted(userId, null);
+ listener.onFinished(userId, null);
+ ArrayList<Pair<byte[], byte[]>> auths = getUserAuth(userId);
+ if (secret != null) {
+ if (auths.size() > 1) {
+ throw new AssertionFailedError("More than one secret exists");
+ }
+ Pair<byte[], byte[]> auth = auths.get(0);
+ if ((!mIgnoreBadUnlock) && auth.second != null && !Arrays.equals(secret, auth.second)) {
+ throw new AssertionFailedError("Invalid secret to unlock user");
+ }
+ } else {
+ if (auths != null && auths.size() > 0) {
+ throw new AssertionFailedError("Cannot unlock encrypted user with empty token");
+ }
+ }
+ }
+
+ public void setIgnoreBadUnlock(boolean ignore) {
+ mIgnoreBadUnlock = ignore;
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTestable.java b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTestable.java
index 3a4aa2d..0df834f 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTestable.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTestable.java
@@ -103,12 +103,10 @@
public int binderGetCallingUid() {
return Process.SYSTEM_UID;
}
-
-
}
protected LockSettingsServiceTestable(Context context, LockPatternUtils lockPatternUtils,
- LockSettingsStorage storage, MockGateKeeperService gatekeeper, KeyStore keystore,
+ LockSettingsStorage storage, FakeGateKeeperService gatekeeper, KeyStore keystore,
IStorageManager storageManager, IActivityManager mActivityManager,
SyntheticPasswordManager spManager) {
super(new MockInjector(context, storage, keystore, mActivityManager, lockPatternUtils,
@@ -137,4 +135,5 @@
}
return new String(storedData);
}
+
}
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTests.java b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTests.java
index cb32492..e12f6d3 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTests.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTests.java
@@ -26,12 +26,13 @@
import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_PATTERN;
import android.os.RemoteException;
+import android.os.UserHandle;
import android.service.gatekeeper.GateKeeperResponse;
import com.android.internal.widget.LockPatternUtils;
import com.android.internal.widget.VerifyCredentialResponse;
import com.android.server.locksettings.LockSettingsStorage.CredentialHash;
-import com.android.server.locksettings.MockGateKeeperService.VerifyHandle;
+import com.android.server.locksettings.FakeGateKeeperService.VerifyHandle;
/**
* runtest frameworks-services -c com.android.server.locksettings.LockSettingsServiceTests
@@ -80,13 +81,6 @@
} catch (RemoteException expected) {
assertTrue(expected.getMessage().equals(FAILED_MESSAGE));
}
- try {
- mService.setLockCredential("newpwd", CREDENTIAL_TYPE_PASSWORD, null,
- PASSWORD_QUALITY_UNSPECIFIED, PRIMARY_USER_ID);
- fail("Did not fail when enrolling using incorrect credential");
- } catch (RemoteException expected) {
- assertTrue(expected.getMessage().equals(FAILED_MESSAGE));
- }
assertVerifyCredentials(PRIMARY_USER_ID, "password", CREDENTIAL_TYPE_PASSWORD, sid);
}
@@ -101,9 +95,10 @@
}
public void testManagedProfileUnifiedChallenge() throws RemoteException {
- final String UnifiedPassword = "testManagedProfileUnifiedChallenge-pwd";
- mService.setLockCredential(UnifiedPassword, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, null,
- PASSWORD_QUALITY_COMPLEX, PRIMARY_USER_ID);
+ final String firstUnifiedPassword = "testManagedProfileUnifiedChallenge-pwd-1";
+ final String secondUnifiedPassword = "testManagedProfileUnifiedChallenge-pwd-2";
+ mService.setLockCredential(firstUnifiedPassword, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD,
+ null, PASSWORD_QUALITY_COMPLEX, PRIMARY_USER_ID);
mService.setSeparateProfileChallengeEnabled(MANAGED_PROFILE_USER_ID, false, null);
final long primarySid = mGateKeeperService.getSecureUserId(PRIMARY_USER_ID);
final long profileSid = mGateKeeperService.getSecureUserId(MANAGED_PROFILE_USER_ID);
@@ -121,7 +116,7 @@
mGateKeeperService.clearAuthToken(TURNED_OFF_PROFILE_USER_ID);
// verify credential
assertEquals(VerifyCredentialResponse.RESPONSE_OK, mService.verifyCredential(
- UnifiedPassword, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, 0, PRIMARY_USER_ID)
+ firstUnifiedPassword, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, 0, PRIMARY_USER_ID)
.getResponseCode());
// Verify that we have a new auth token for the profile
@@ -137,15 +132,15 @@
*/
mStorageManager.setIgnoreBadUnlock(true);
// Change primary password and verify that profile SID remains
- mService.setLockCredential("pwd", LockPatternUtils.CREDENTIAL_TYPE_PASSWORD,
- UnifiedPassword, PASSWORD_QUALITY_ALPHABETIC, PRIMARY_USER_ID);
+ mService.setLockCredential(secondUnifiedPassword, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD,
+ firstUnifiedPassword, PASSWORD_QUALITY_ALPHABETIC, PRIMARY_USER_ID);
mStorageManager.setIgnoreBadUnlock(false);
assertEquals(profileSid, mGateKeeperService.getSecureUserId(MANAGED_PROFILE_USER_ID));
assertNull(mGateKeeperService.getAuthToken(TURNED_OFF_PROFILE_USER_ID));
// Clear unified challenge
- mService.setLockCredential(null, LockPatternUtils.CREDENTIAL_TYPE_NONE, UnifiedPassword,
- PASSWORD_QUALITY_UNSPECIFIED, PRIMARY_USER_ID);
+ mService.setLockCredential(null, LockPatternUtils.CREDENTIAL_TYPE_NONE,
+ secondUnifiedPassword, PASSWORD_QUALITY_UNSPECIFIED, PRIMARY_USER_ID);
assertEquals(0, mGateKeeperService.getSecureUserId(PRIMARY_USER_ID));
assertEquals(0, mGateKeeperService.getSecureUserId(MANAGED_PROFILE_USER_ID));
assertEquals(0, mGateKeeperService.getSecureUserId(TURNED_OFF_PROFILE_USER_ID));
@@ -241,14 +236,21 @@
type, challenge, userId).getResponseCode());
}
- private void initializeStorageWithCredential(int userId, String credential, int type, long sid) {
+ private void initializeStorageWithCredential(int userId, String credential, int type, long sid)
+ throws RemoteException {
byte[] oldHash = new VerifyHandle(credential.getBytes(), sid).toBytes();
- if (type == LockPatternUtils.CREDENTIAL_TYPE_PASSWORD) {
- mStorage.writeCredentialHash(CredentialHash.create(oldHash,
- LockPatternUtils.CREDENTIAL_TYPE_PASSWORD), userId);
+ if (mService.shouldMigrateToSyntheticPasswordLocked(userId)) {
+ mService.initializeSyntheticPasswordLocked(oldHash, credential, type,
+ type == LockPatternUtils.CREDENTIAL_TYPE_PASSWORD ? PASSWORD_QUALITY_ALPHABETIC
+ : PASSWORD_QUALITY_SOMETHING, userId);
} else {
- mStorage.writeCredentialHash(CredentialHash.create(oldHash,
- LockPatternUtils.CREDENTIAL_TYPE_PATTERN), userId);
+ if (type == LockPatternUtils.CREDENTIAL_TYPE_PASSWORD) {
+ mStorage.writeCredentialHash(CredentialHash.create(oldHash,
+ LockPatternUtils.CREDENTIAL_TYPE_PASSWORD), userId);
+ } else {
+ mStorage.writeCredentialHash(CredentialHash.create(oldHash,
+ LockPatternUtils.CREDENTIAL_TYPE_PATTERN), userId);
+ }
}
}
}
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStorageTests.java b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStorageTests.java
index a0578c9..b0325cb 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStorageTests.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStorageTests.java
@@ -22,6 +22,7 @@
import android.app.NotificationManager;
import android.app.admin.DevicePolicyManager;
+import android.app.trust.TrustManager;
import android.content.pm.UserInfo;
import android.database.sqlite.SQLiteDatabase;
import android.os.FileUtils;
@@ -74,7 +75,7 @@
MockLockSettingsContext context = new MockLockSettingsContext(getContext(), mockUserManager,
mock(NotificationManager.class), mock(DevicePolicyManager.class),
- mock(StorageManager.class));
+ mock(StorageManager.class), mock(TrustManager.class));
mStorage = new LockSettingsStorageTestable(context,
new File(getContext().getFilesDir(), "locksettings"));
mStorage.setDatabaseOnCreateCallback(new LockSettingsStorage.Callback() {
@@ -346,11 +347,11 @@
}
public void testPersistentData_serializeUnserialize() {
- byte[] serialized = PersistentData.toBytes(PersistentData.TYPE_GATEKEEPER, SOME_USER_ID,
+ byte[] serialized = PersistentData.toBytes(PersistentData.TYPE_SP, SOME_USER_ID,
DevicePolicyManager.PASSWORD_QUALITY_COMPLEX, PAYLOAD);
PersistentData deserialized = PersistentData.fromBytes(serialized);
- assertEquals(PersistentData.TYPE_GATEKEEPER, deserialized.type);
+ assertEquals(PersistentData.TYPE_SP, deserialized.type);
assertEquals(DevicePolicyManager.PASSWORD_QUALITY_COMPLEX, deserialized.qualityForUi);
assertArrayEquals(PAYLOAD, deserialized.payload);
}
@@ -370,7 +371,7 @@
// the wire format in the future.
byte[] serializedVersion1 = new byte[] {
1, /* PersistentData.VERSION_1 */
- 2, /* PersistentData.TYPE_SP */
+ 1, /* PersistentData.TYPE_SP */
0x00, 0x00, 0x04, 0x0A, /* SOME_USER_ID */
0x00, 0x03, 0x00, 0x00, /* PASSWORD_NUMERIC_COMPLEX */
1, 2, -1, -2, 33, /* PAYLOAD */
@@ -384,9 +385,8 @@
// Make sure the constants we use on the wire do not change.
assertEquals(0, PersistentData.TYPE_NONE);
- assertEquals(1, PersistentData.TYPE_GATEKEEPER);
- assertEquals(2, PersistentData.TYPE_SP);
- assertEquals(3, PersistentData.TYPE_SP_WEAVER);
+ assertEquals(1, PersistentData.TYPE_SP);
+ assertEquals(2, PersistentData.TYPE_SP_WEAVER);
}
public void testCredentialHash_serializeUnserialize() {
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/MockGateKeeperService.java b/services/tests/servicestests/src/com/android/server/locksettings/MockGateKeeperService.java
deleted file mode 100644
index b89c1d1..0000000
--- a/services/tests/servicestests/src/com/android/server/locksettings/MockGateKeeperService.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.server.locksettings;
-
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.service.gatekeeper.GateKeeperResponse;
-import android.service.gatekeeper.IGateKeeperService;
-import android.util.ArrayMap;
-
-import junit.framework.AssertionFailedError;
-
-import java.nio.ByteBuffer;
-import java.util.Arrays;
-import java.util.Random;
-
-public class MockGateKeeperService implements IGateKeeperService {
- static class VerifyHandle {
- public byte[] password;
- public long sid;
-
- public VerifyHandle(byte[] password, long sid) {
- this.password = password;
- this.sid = sid;
- }
-
- public VerifyHandle(byte[] handle) {
- ByteBuffer buffer = ByteBuffer.allocate(handle.length);
- buffer.put(handle, 0, handle.length);
- buffer.flip();
- int version = buffer.get();
- sid = buffer.getLong();
- password = new byte[buffer.remaining()];
- buffer.get(password);
- }
-
- public byte[] toBytes() {
- ByteBuffer buffer = ByteBuffer.allocate(1 + Long.BYTES + password.length);
- buffer.put((byte)0);
- buffer.putLong(sid);
- buffer.put(password);
- return buffer.array();
- }
- }
-
- static class AuthToken {
- public long challenge;
- public long sid;
-
- public AuthToken(long challenge, long sid) {
- this.challenge = challenge;
- this.sid = sid;
- }
-
- public AuthToken(byte[] handle) {
- ByteBuffer buffer = ByteBuffer.allocate(handle.length);
- buffer.put(handle, 0, handle.length);
- buffer.flip();
- int version = buffer.get();
- challenge = buffer.getLong();
- sid = buffer.getLong();
- }
-
- public byte[] toBytes() {
- ByteBuffer buffer = ByteBuffer.allocate(1 + Long.BYTES + Long.BYTES);
- buffer.put((byte)0);
- buffer.putLong(challenge);
- buffer.putLong(sid);
- return buffer.array();
- }
- }
-
- private ArrayMap<Integer, Long> sidMap = new ArrayMap<>();
- private ArrayMap<Integer, AuthToken> authTokenMap = new ArrayMap<>();
-
- private ArrayMap<Integer, byte[]> handleMap = new ArrayMap<>();
-
- @Override
- public GateKeeperResponse enroll(int uid, byte[] currentPasswordHandle, byte[] currentPassword,
- byte[] desiredPassword) throws android.os.RemoteException {
-
- if (currentPasswordHandle != null) {
- VerifyHandle handle = new VerifyHandle(currentPasswordHandle);
- if (Arrays.equals(currentPassword, handle.password)) {
- // Trusted enroll
- VerifyHandle newHandle = new VerifyHandle(desiredPassword, handle.sid);
- refreshSid(uid, handle.sid, false);
- handleMap.put(uid, newHandle.toBytes());
- return GateKeeperResponse.createOkResponse(newHandle.toBytes(), false);
- } else {
- return null;
- }
- } else {
- // Untrusted enroll
- long newSid = new Random().nextLong();
- VerifyHandle newHandle = new VerifyHandle(desiredPassword, newSid);
- refreshSid(uid, newSid, true);
- handleMap.put(uid, newHandle.toBytes());
- return GateKeeperResponse.createOkResponse(newHandle.toBytes(), false);
- }
- }
-
- @Override
- public GateKeeperResponse verify(int uid, byte[] enrolledPasswordHandle,
- byte[] providedPassword) throws android.os.RemoteException {
- return verifyChallenge(uid, 0, enrolledPasswordHandle, providedPassword);
- }
-
- @Override
- public GateKeeperResponse verifyChallenge(int uid, long challenge,
- byte[] enrolledPasswordHandle, byte[] providedPassword) throws RemoteException {
-
- VerifyHandle handle = new VerifyHandle(enrolledPasswordHandle);
- if (Arrays.equals(handle.password, providedPassword)) {
- byte[] knownHandle = handleMap.get(uid);
- if (knownHandle != null) {
- if (!Arrays.equals(knownHandle, enrolledPasswordHandle)) {
- throw new AssertionFailedError("Got correct but obsolete handle");
- }
- }
- refreshSid(uid, handle.sid, false);
- AuthToken token = new AuthToken(challenge, handle.sid);
- refreshAuthToken(uid, token);
- return GateKeeperResponse.createOkResponse(token.toBytes(), false);
- } else {
- return GateKeeperResponse.createGenericResponse(GateKeeperResponse.RESPONSE_ERROR);
- }
- }
-
- private void refreshAuthToken(int uid, AuthToken token) {
- authTokenMap.put(uid, token);
- }
-
- public AuthToken getAuthToken(int uid) {
- return authTokenMap.get(uid);
- }
-
- public AuthToken getAuthTokenForSid(long sid) {
- for(AuthToken token : authTokenMap.values()) {
- if (token.sid == sid) {
- return token;
- }
- }
- return null;
- }
-
- public void clearAuthToken(int uid) {
- authTokenMap.remove(uid);
- }
-
- @Override
- public IBinder asBinder() {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void clearSecureUserId(int userId) throws RemoteException {
- sidMap.remove(userId);
- }
-
- @Override
- public void reportDeviceSetupComplete() throws RemoteException {
- }
-
- @Override
- public long getSecureUserId(int userId) throws RemoteException {
- if (sidMap.containsKey(userId)) {
- return sidMap.get(userId);
- } else {
- return 0L;
- }
- }
-
- private void refreshSid(int uid, long sid, boolean force) {
- if (!sidMap.containsKey(uid) || force) {
- sidMap.put(uid, sid);
- } else{
- if (sidMap.get(uid) != sid) {
- throw new AssertionFailedError("Inconsistent SID");
- }
- }
- }
-
-}
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/MockLockSettingsContext.java b/services/tests/servicestests/src/com/android/server/locksettings/MockLockSettingsContext.java
index 8da33a8..3ad30f3 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/MockLockSettingsContext.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/MockLockSettingsContext.java
@@ -18,8 +18,10 @@
import android.app.NotificationManager;
import android.app.admin.DevicePolicyManager;
+import android.app.trust.TrustManager;
import android.content.Context;
import android.content.ContextWrapper;
+import android.content.pm.PackageManager;
import android.os.UserManager;
import android.os.storage.StorageManager;
@@ -29,15 +31,17 @@
private NotificationManager mNotificationManager;
private DevicePolicyManager mDevicePolicyManager;
private StorageManager mStorageManager;
+ private TrustManager mTrustManager;
public MockLockSettingsContext(Context base, UserManager userManager,
NotificationManager notificationManager, DevicePolicyManager devicePolicyManager,
- StorageManager storageManager) {
+ StorageManager storageManager, TrustManager trustManager) {
super(base);
mUserManager = userManager;
mNotificationManager = notificationManager;
mDevicePolicyManager = devicePolicyManager;
mStorageManager = storageManager;
+ mTrustManager = trustManager;
}
@Override
@@ -50,6 +54,8 @@
return mDevicePolicyManager;
} else if (STORAGE_SERVICE.equals(name)) {
return mStorageManager;
+ } else if (TRUST_SERVICE.equals(name)) {
+ return mTrustManager;
} else {
throw new RuntimeException("System service not mocked: " + name);
}
@@ -60,4 +66,8 @@
// Skip permission checks for unit tests.
}
+ @Override
+ public int checkCallingOrSelfPermission(String permission) {
+ return PackageManager.PERMISSION_GRANTED;
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/MockStorageManager.java b/services/tests/servicestests/src/com/android/server/locksettings/MockStorageManager.java
deleted file mode 100644
index 40e114b..0000000
--- a/services/tests/servicestests/src/com/android/server/locksettings/MockStorageManager.java
+++ /dev/null
@@ -1,507 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.server.locksettings;
-
-import android.content.pm.IPackageMoveObserver;
-import android.os.IBinder;
-import android.os.IProgressListener;
-import android.os.ParcelFileDescriptor;
-import android.os.RemoteException;
-import android.os.storage.DiskInfo;
-import android.os.storage.IObbActionListener;
-import android.os.storage.IStorageEventListener;
-import android.os.storage.IStorageManager;
-import android.os.storage.IStorageShutdownObserver;
-import android.os.storage.StorageVolume;
-import android.os.storage.VolumeInfo;
-import android.os.storage.VolumeRecord;
-import android.util.ArrayMap;
-import android.util.Pair;
-
-import com.android.internal.os.AppFuseMount;
-
-import junit.framework.AssertionFailedError;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-
-public class MockStorageManager implements IStorageManager {
-
- private ArrayMap<Integer, ArrayList<Pair<byte[], byte[]>>> mAuth = new ArrayMap<>();
- private boolean mIgnoreBadUnlock;
-
- @Override
- public void addUserKeyAuth(int userId, int serialNumber, byte[] token, byte[] secret)
- throws RemoteException {
- getUserAuth(userId).add(new Pair<>(token, secret));
- }
-
- @Override
- public void fixateNewestUserKeyAuth(int userId) throws RemoteException {
- ArrayList<Pair<byte[], byte[]>> auths = mAuth.get(userId);
- Pair<byte[], byte[]> latest = auths.get(auths.size() - 1);
- auths.clear();
- auths.add(latest);
- }
-
- private ArrayList<Pair<byte[], byte[]>> getUserAuth(int userId) {
- if (!mAuth.containsKey(userId)) {
- ArrayList<Pair<byte[], byte[]>> auths = new ArrayList<Pair<byte[], byte[]>>();
- auths.add(new Pair(null, null));
- mAuth.put(userId, auths);
- }
- return mAuth.get(userId);
- }
-
- public byte[] getUserUnlockToken(int userId) {
- ArrayList<Pair<byte[], byte[]>> auths = getUserAuth(userId);
- if (auths.size() != 1) {
- throw new AssertionFailedError("More than one secret exists");
- }
- return auths.get(0).second;
- }
-
- public void unlockUser(int userId, byte[] secret, IProgressListener listener)
- throws RemoteException {
- listener.onStarted(userId, null);
- listener.onFinished(userId, null);
- ArrayList<Pair<byte[], byte[]>> auths = getUserAuth(userId);
- if (secret != null) {
- if (auths.size() > 1) {
- throw new AssertionFailedError("More than one secret exists");
- }
- Pair<byte[], byte[]> auth = auths.get(0);
- if ((!mIgnoreBadUnlock) && auth.second != null && !Arrays.equals(secret, auth.second)) {
- throw new AssertionFailedError("Invalid secret to unlock user");
- }
- } else {
- if (auths != null && auths.size() > 0) {
- throw new AssertionFailedError("Cannot unlock encrypted user with empty token");
- }
- }
- }
-
- public void setIgnoreBadUnlock(boolean ignore) {
- mIgnoreBadUnlock = ignore;
- }
-
- @Override
- public IBinder asBinder() {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void registerListener(IStorageEventListener listener) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void unregisterListener(IStorageEventListener listener) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public boolean isUsbMassStorageConnected() throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void setUsbMassStorageEnabled(boolean enable) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public boolean isUsbMassStorageEnabled() throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public int mountVolume(String mountPoint) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void unmountVolume(String mountPoint, boolean force, boolean removeEncryption)
- throws RemoteException {
- throw new UnsupportedOperationException();
-
- }
-
- @Override
- public int formatVolume(String mountPoint) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public int[] getStorageUsers(String path) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public String getVolumeState(String mountPoint) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public int createSecureContainer(String id, int sizeMb, String fstype, String key, int ownerUid,
- boolean external) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public int finalizeSecureContainer(String id) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public int destroySecureContainer(String id, boolean force) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public int mountSecureContainer(String id, String key, int ownerUid, boolean readOnly)
- throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public int unmountSecureContainer(String id, boolean force) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public boolean isSecureContainerMounted(String id) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public int renameSecureContainer(String oldId, String newId) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public String getSecureContainerPath(String id) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public String[] getSecureContainerList() throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void shutdown(IStorageShutdownObserver observer) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void finishMediaUpdate() throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void mountObb(String rawPath, String canonicalPath, String key, IObbActionListener token,
- int nonce) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void unmountObb(String rawPath, boolean force, IObbActionListener token, int nonce)
- throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public boolean isObbMounted(String rawPath) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public String getMountedObbPath(String rawPath) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public boolean isExternalStorageEmulated() throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public int decryptStorage(String password) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public int encryptStorage(int type, String password) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public int changeEncryptionPassword(int type, String password) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public StorageVolume[] getVolumeList(int uid, String packageName, int flags)
- throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public String getSecureContainerFilesystemPath(String cid) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public int getEncryptionState() throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public int verifyEncryptionPassword(String password) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public int fixPermissionsSecureContainer(String id, int gid, String filename)
- throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public int mkdirs(String callingPkg, String path) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public int getPasswordType() throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public String getPassword() throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void clearPassword() throws RemoteException {
- throw new UnsupportedOperationException();
-
- }
-
- @Override
- public void setField(String field, String contents) throws RemoteException {
- throw new UnsupportedOperationException();
-
- }
-
- @Override
- public String getField(String field) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public int resizeSecureContainer(String id, int sizeMb, String key) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public long lastMaintenance() throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void runMaintenance() throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void waitForAsecScan() throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public DiskInfo[] getDisks() throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public VolumeInfo[] getVolumes(int flags) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public VolumeRecord[] getVolumeRecords(int flags) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void mount(String volId) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void unmount(String volId) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void format(String volId) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void partitionPublic(String diskId) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void partitionPrivate(String diskId) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void partitionMixed(String diskId, int ratio) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void setVolumeNickname(String fsUuid, String nickname) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void setVolumeUserFlags(String fsUuid, int flags, int mask) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void forgetVolume(String fsUuid) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void forgetAllVolumes() throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public String getPrimaryStorageUuid() throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void setPrimaryStorageUuid(String volumeUuid, IPackageMoveObserver callback)
- throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public long benchmark(String volId) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void setDebugFlags(int flags, int mask) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void createUserKey(int userId, int serialNumber, boolean ephemeral)
- throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void destroyUserKey(int userId) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void unlockUserKey(int userId, int serialNumber, byte[] token, byte[] secret)
- throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void lockUserKey(int userId) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public boolean isUserKeyUnlocked(int userId) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void prepareUserStorage(String volumeUuid, int userId, int serialNumber, int flags)
- throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void destroyUserStorage(String volumeUuid, int userId, int flags)
- throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public boolean isConvertibleToFBE() throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void fstrim(int flags) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public AppFuseMount mountProxyFileDescriptorBridge() throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public ParcelFileDescriptor openProxyFileDescriptor(int mountPointId, int fileId, int mode)
- throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public long getCacheQuotaBytes(String volumeUuid, int uid) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public long getCacheSizeBytes(String volumeUuid, int uid) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public long getAllocatableBytes(String path, int flags, String callingPackage) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void allocateBytes(String path, long bytes, int flags, String callingPackage) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void secdiscard(String path) throws RemoteException {
- throw new UnsupportedOperationException();
- }
-}
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/MockSyntheticPasswordManager.java b/services/tests/servicestests/src/com/android/server/locksettings/MockSyntheticPasswordManager.java
index d7468c2..cf03593 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/MockSyntheticPasswordManager.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/MockSyntheticPasswordManager.java
@@ -32,11 +32,11 @@
public class MockSyntheticPasswordManager extends SyntheticPasswordManager {
- private MockGateKeeperService mGateKeeper;
+ private FakeGateKeeperService mGateKeeper;
private IWeaver mWeaverService;
public MockSyntheticPasswordManager(LockSettingsStorage storage,
- MockGateKeeperService gatekeeper, UserManager userManager) {
+ FakeGateKeeperService gatekeeper, UserManager userManager) {
super(storage, userManager);
mGateKeeper = gatekeeper;
}
@@ -88,7 +88,7 @@
@Override
protected long sidFromPasswordHandle(byte[] handle) {
- return new MockGateKeeperService.VerifyHandle(handle).sid;
+ return new FakeGateKeeperService.VerifyHandle(handle).sid;
}
@Override
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/SyntheticPasswordTests.java b/services/tests/servicestests/src/com/android/server/locksettings/SyntheticPasswordTests.java
index ba4ff33..fd77de3 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/SyntheticPasswordTests.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/SyntheticPasswordTests.java
@@ -72,11 +72,11 @@
assertNull(result.authToken);
}
- private void disableSyntheticPassword(int userId) throws RemoteException {
+ private void disableSyntheticPassword() throws RemoteException {
mService.setLong(SYNTHETIC_PASSWORD_ENABLED_KEY, 0, UserHandle.USER_SYSTEM);
}
- private void enableSyntheticPassword(int userId) throws RemoteException {
+ private void enableSyntheticPassword() throws RemoteException {
mService.setLong(SYNTHETIC_PASSWORD_ENABLED_KEY, 1, UserHandle.USER_SYSTEM);
}
@@ -87,12 +87,12 @@
public void testPasswordMigration() throws RemoteException {
final String PASSWORD = "testPasswordMigration-password";
- disableSyntheticPassword(PRIMARY_USER_ID);
+ disableSyntheticPassword();
mService.setLockCredential(PASSWORD, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, null,
PASSWORD_QUALITY_ALPHABETIC, PRIMARY_USER_ID);
long sid = mGateKeeperService.getSecureUserId(PRIMARY_USER_ID);
final byte[] primaryStorageKey = mStorageManager.getUserUnlockToken(PRIMARY_USER_ID);
- enableSyntheticPassword(PRIMARY_USER_ID);
+ enableSyntheticPassword();
// Performs migration
assertEquals(VerifyCredentialResponse.RESPONSE_OK,
mService.verifyCredential(PASSWORD, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, 0, PRIMARY_USER_ID).getResponseCode());
@@ -106,7 +106,7 @@
}
private void initializeCredentialUnderSP(String password, int userId) throws RemoteException {
- enableSyntheticPassword(userId);
+ enableSyntheticPassword();
int quality = password != null ? PASSWORD_QUALITY_ALPHABETIC
: PASSWORD_QUALITY_UNSPECIFIED;
int type = password != null ? LockPatternUtils.CREDENTIAL_TYPE_PASSWORD
@@ -198,8 +198,7 @@
public void testManagedProfileUnifiedChallengeMigration() throws RemoteException {
final String UnifiedPassword = "testManagedProfileUnifiedChallengeMigration-pwd";
- disableSyntheticPassword(PRIMARY_USER_ID);
- disableSyntheticPassword(MANAGED_PROFILE_USER_ID);
+ disableSyntheticPassword();
mService.setLockCredential(UnifiedPassword, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, null,
PASSWORD_QUALITY_ALPHABETIC, PRIMARY_USER_ID);
mService.setSeparateProfileChallengeEnabled(MANAGED_PROFILE_USER_ID, false, null);
@@ -212,8 +211,7 @@
assertTrue(profileSid != primarySid);
// do migration
- enableSyntheticPassword(PRIMARY_USER_ID);
- enableSyntheticPassword(MANAGED_PROFILE_USER_ID);
+ enableSyntheticPassword();
assertEquals(VerifyCredentialResponse.RESPONSE_OK,
mService.verifyCredential(UnifiedPassword, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, 0, PRIMARY_USER_ID).getResponseCode());
@@ -231,6 +229,7 @@
public void testManagedProfileSeparateChallengeMigration() throws RemoteException {
final String primaryPassword = "testManagedProfileSeparateChallengeMigration-primary";
final String profilePassword = "testManagedProfileSeparateChallengeMigration-profile";
+ disableSyntheticPassword();
mService.setLockCredential(primaryPassword, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, null,
PASSWORD_QUALITY_ALPHABETIC, PRIMARY_USER_ID);
mService.setLockCredential(profilePassword, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, null,
@@ -244,8 +243,7 @@
assertTrue(profileSid != primarySid);
// do migration
- enableSyntheticPassword(PRIMARY_USER_ID);
- enableSyntheticPassword(MANAGED_PROFILE_USER_ID);
+ enableSyntheticPassword();
assertEquals(VerifyCredentialResponse.RESPONSE_OK,
mService.verifyCredential(primaryPassword, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, 0, PRIMARY_USER_ID).getResponseCode());
assertEquals(VerifyCredentialResponse.RESPONSE_OK,
@@ -335,7 +333,7 @@
public void testEscrowTokenActivatedImmediatelyIfNoUserPasswordNeedsMigration() throws RemoteException {
final String TOKEN = "some-high-entropy-secure-token";
- enableSyntheticPassword(PRIMARY_USER_ID);
+ enableSyntheticPassword();
long handle = mService.addEscrowToken(TOKEN.getBytes(), PRIMARY_USER_ID);
assertTrue(mService.isEscrowTokenActive(handle, PRIMARY_USER_ID));
assertEquals(0, mGateKeeperService.getSecureUserId(PRIMARY_USER_ID));
@@ -355,10 +353,10 @@
final String TOKEN = "some-high-entropy-secure-token";
final String PASSWORD = "password";
// Set up pre-SP user password
- disableSyntheticPassword(PRIMARY_USER_ID);
+ disableSyntheticPassword();
mService.setLockCredential(PASSWORD, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, null,
PASSWORD_QUALITY_ALPHABETIC, PRIMARY_USER_ID);
- enableSyntheticPassword(PRIMARY_USER_ID);
+ enableSyntheticPassword();
long handle = mService.addEscrowToken(TOKEN.getBytes(), PRIMARY_USER_ID);
// Token not activated immediately since user password exists
diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java
index 8f2f34e..beffcee 100644
--- a/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java
@@ -47,7 +47,7 @@
}
public void sendPackageAddedForNewUsers(String packageName,
- boolean isSystem, int appId, int... userIds) {
+ boolean sendBootComplete, boolean includeStopped, int appId, int... userIds) {
}
}
diff --git a/services/tests/servicestests/src/com/android/server/pm/UserLifecycleStressTest.java b/services/tests/servicestests/src/com/android/server/pm/UserLifecycleStressTest.java
new file mode 100644
index 0000000..304e0e9
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/pm/UserLifecycleStressTest.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+package com.android.server.pm;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import android.app.ActivityManager;
+import android.app.IStopUserCallback;
+import android.content.Context;
+import android.content.pm.UserInfo;
+import android.os.RemoteException;
+import android.os.UserManager;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.LargeTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.util.Log;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.IOException;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * To run the test:
+ * bit FrameworksServicesTests:com.android.server.pm.UserLifecycleStressTest
+ */
+@RunWith(AndroidJUnit4.class)
+@LargeTest
+public class UserLifecycleStressTest {
+ private static final String TAG = "UserLifecycleStressTest";
+ // TODO: Make this smaller once we have improved it.
+ private static final int MAX_TIME_STOP_USER_IN_SECOND = 30;
+ private static final int NUM_ITERATIONS_STOP_USER = 10;
+ private static final int WAIT_BEFORE_STOP_USER_IN_SECOND = 3;
+
+ private Context mContext;
+ private UserManager mUserManager;
+ private ActivityManager mActivityManager;
+
+ @Before
+ public void setup() {
+ mContext = InstrumentationRegistry.getInstrumentation().getContext();
+ mUserManager = mContext.getSystemService(UserManager.class);
+ mActivityManager = mContext.getSystemService(ActivityManager.class);
+ }
+
+ /**
+ * Create and stop user 10 times in a row. Check stop user can be finished in a reasonable
+ * amount of time.
+ */
+ @Test
+ public void stopManagedProfileStressTest()
+ throws IOException, RemoteException, InterruptedException {
+ for (int i = 0; i < NUM_ITERATIONS_STOP_USER; i++) {
+ final UserInfo userInfo = mUserManager.createProfileForUser("TestUser",
+ UserInfo.FLAG_MANAGED_PROFILE, mActivityManager.getCurrentUser());
+ assertNotNull(userInfo);
+ try {
+ assertTrue(
+ "Failed to start the profile",
+ ActivityManager.getService().startUserInBackground(userInfo.id));
+ // Seems the broadcast queue is getting more busy if we wait a few seconds before
+ // stopping the user.
+ TimeUnit.SECONDS.sleep(WAIT_BEFORE_STOP_USER_IN_SECOND);
+ stopUser(userInfo.id);
+ } finally {
+ mUserManager.removeUser(userInfo.id);
+ }
+ }
+ }
+
+ private void stopUser(int userId) throws RemoteException, InterruptedException {
+ final long startTime = System.currentTimeMillis();
+ CountDownLatch countDownLatch = new CountDownLatch(1);
+ ActivityManager.getService().
+ stopUser(userId, true,
+ new IStopUserCallback.Stub() {
+ @Override
+ public void userStopped(int userId) throws RemoteException {
+ countDownLatch.countDown();
+ }
+
+ @Override
+ public void userStopAborted(int userId) throws RemoteException {
+
+ }
+ });
+ boolean stoppedBeforeTimeout =
+ countDownLatch.await(MAX_TIME_STOP_USER_IN_SECOND, TimeUnit.SECONDS);
+ assertTrue(
+ "Take more than " + MAX_TIME_STOP_USER_IN_SECOND + "s to stop user",
+ stoppedBeforeTimeout);
+ Log.d(TAG, "stopUser takes " + (System.currentTimeMillis() - startTime) + " ms");
+ }
+}
+
diff --git a/services/tests/servicestests/src/com/android/server/pm/dex/DexoptOptionsTests.java b/services/tests/servicestests/src/com/android/server/pm/dex/DexoptOptionsTests.java
new file mode 100644
index 0000000..1eb5552
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/pm/dex/DexoptOptionsTests.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.pm.dex;
+
+
+import static com.android.server.pm.PackageManagerServiceCompilerMapping.getCompilerFilterForReason;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import com.android.server.pm.PackageManagerService;
+import com.android.server.pm.PackageManagerServiceCompilerMapping;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class DexoptOptionsTests {
+ private final static String mPackageName = "test.android.com";
+ private final static String mCompilerFilter =
+ PackageManagerServiceCompilerMapping.getDefaultCompilerFilter();
+ private final static String mSplitName = "split-A.apk";
+
+ @Test
+ public void testCreateDexoptOptionsEmpty() {
+ DexoptOptions opt = new DexoptOptions(mPackageName, mCompilerFilter, /*flags*/ 0);
+ assertEquals(mPackageName, opt.getPackageName());
+ assertEquals(mCompilerFilter, opt.getCompilerFilter());
+ assertEquals(null, opt.getSplitName());
+ assertFalse(opt.isBootComplete());
+ assertFalse(opt.isCheckForProfileUpdates());
+ assertFalse(opt.isDexoptOnlySecondaryDex());
+ assertFalse(opt.isDexoptOnlySharedDex());
+ assertFalse(opt.isDowngrade());
+ assertFalse(opt.isForce());
+ }
+
+ @Test
+ public void testCreateDexoptOptionsFull() {
+ int flags =
+ DexoptOptions.DEXOPT_FORCE |
+ DexoptOptions.DEXOPT_BOOT_COMPLETE |
+ DexoptOptions.DEXOPT_CHECK_FOR_PROFILES_UPDATES |
+ DexoptOptions.DEXOPT_ONLY_SECONDARY_DEX |
+ DexoptOptions.DEXOPT_ONLY_SHARED_DEX |
+ DexoptOptions.DEXOPT_DOWNGRADE;
+
+ DexoptOptions opt = new DexoptOptions(mPackageName, mCompilerFilter, flags);
+ assertEquals(mPackageName, opt.getPackageName());
+ assertEquals(mCompilerFilter, opt.getCompilerFilter());
+ assertEquals(null, opt.getSplitName());
+ assertTrue(opt.isBootComplete());
+ assertTrue(opt.isCheckForProfileUpdates());
+ assertTrue(opt.isDexoptOnlySecondaryDex());
+ assertTrue(opt.isDexoptOnlySharedDex());
+ assertTrue(opt.isDowngrade());
+ assertTrue(opt.isForce());
+ }
+
+ @Test
+ public void testCreateDexoptOptionsReason() {
+ int flags =
+ DexoptOptions.DEXOPT_FORCE |
+ DexoptOptions.DEXOPT_BOOT_COMPLETE |
+ DexoptOptions.DEXOPT_CHECK_FOR_PROFILES_UPDATES;
+
+ int[] reasons = new int[] {
+ PackageManagerService.REASON_FIRST_BOOT,
+ PackageManagerService.REASON_BOOT,
+ PackageManagerService.REASON_INSTALL,
+ PackageManagerService.REASON_BACKGROUND_DEXOPT,
+ PackageManagerService.REASON_AB_OTA,
+ PackageManagerService.REASON_INACTIVE_PACKAGE_DOWNGRADE};
+
+ for (int reason : reasons) {
+ DexoptOptions opt = new DexoptOptions(mPackageName, reason, flags);
+ assertEquals(mPackageName, opt.getPackageName());
+ assertEquals(getCompilerFilterForReason(reason), opt.getCompilerFilter());
+ assertEquals(null, opt.getSplitName());
+ assertTrue(opt.isBootComplete());
+ assertTrue(opt.isCheckForProfileUpdates());
+ assertFalse(opt.isDexoptOnlySecondaryDex());
+ assertFalse(opt.isDexoptOnlySharedDex());
+ assertFalse(opt.isDowngrade());
+ assertTrue(opt.isForce());
+ }
+ }
+
+ @Test
+ public void testCreateDexoptOptionsSplit() {
+ int flags = DexoptOptions.DEXOPT_FORCE | DexoptOptions.DEXOPT_BOOT_COMPLETE;
+
+ DexoptOptions opt = new DexoptOptions(mPackageName, mCompilerFilter, mSplitName, flags);
+ assertEquals(mPackageName, opt.getPackageName());
+ assertEquals(mCompilerFilter, opt.getCompilerFilter());
+ assertEquals(mSplitName, opt.getSplitName());
+ assertTrue(opt.isBootComplete());
+ assertFalse(opt.isCheckForProfileUpdates());
+ assertFalse(opt.isDexoptOnlySecondaryDex());
+ assertFalse(opt.isDexoptOnlySharedDex());
+ assertFalse(opt.isDowngrade());
+ assertTrue(opt.isForce());
+ }
+
+ @Test
+ public void testCreateDexoptInvalid() {
+ boolean gotException = false;
+ try {
+ int invalidFlags = 999;
+ new DexoptOptions(mPackageName, mCompilerFilter, invalidFlags);
+ } catch (IllegalArgumentException ignore) {
+ gotException = true;
+ }
+
+ assertTrue(gotException);
+ }
+}
\ No newline at end of file
diff --git a/services/tests/servicestests/src/com/android/server/pm/dex/DexoptUtilsTest.java b/services/tests/servicestests/src/com/android/server/pm/dex/DexoptUtilsTest.java
new file mode 100644
index 0000000..47918ea
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/pm/dex/DexoptUtilsTest.java
@@ -0,0 +1,213 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.pm.dex;
+
+import static org.junit.Assert.assertEquals;
+
+import android.content.pm.ApplicationInfo;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.util.SparseArray;
+
+import dalvik.system.DelegateLastClassLoader;
+import dalvik.system.PathClassLoader;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class DexoptUtilsTest {
+ private static final String PATH_CLASS_LOADER_NAME = PathClassLoader.class.getName();
+ private static final String DELEGATE_LAST_CLASS_LOADER_NAME =
+ DelegateLastClassLoader.class.getName();
+
+ private ApplicationInfo createMockApplicationInfo(String baseClassLoader, boolean addSplits,
+ boolean addSplitDependencies) {
+ ApplicationInfo ai = new ApplicationInfo();
+ String codeDir = "/data/app/mock.android.com";
+ ai.setBaseCodePath(codeDir + "/base.dex");
+ ai.classLoaderName = baseClassLoader;
+ ai.privateFlags = ai.privateFlags | ApplicationInfo.PRIVATE_FLAG_ISOLATED_SPLIT_LOADING;
+
+ if (addSplits) {
+ ai.setSplitCodePaths(new String[]{
+ codeDir + "/base-1.dex",
+ codeDir + "/base-2.dex",
+ codeDir + "/base-3.dex",
+ codeDir + "/base-4.dex",
+ codeDir + "/base-5.dex",
+ codeDir + "/base-6.dex"});
+
+ ai.splitClassLoaderNames = new String[]{
+ DELEGATE_LAST_CLASS_LOADER_NAME,
+ DELEGATE_LAST_CLASS_LOADER_NAME,
+ PATH_CLASS_LOADER_NAME,
+ PATH_CLASS_LOADER_NAME,
+ PATH_CLASS_LOADER_NAME,
+ null}; // A null class loader name should default to PathClassLoader.
+ if (addSplitDependencies) {
+ ai.splitDependencies = new SparseArray<>(ai.splitClassLoaderNames.length + 1);
+ ai.splitDependencies.put(0, new int[] {-1}); // base has no dependency
+ ai.splitDependencies.put(1, new int[] {2}); // split 1 depends on 2
+ ai.splitDependencies.put(2, new int[] {4}); // split 2 depends on 4
+ ai.splitDependencies.put(3, new int[] {4}); // split 3 depends on 4
+ ai.splitDependencies.put(4, new int[] {0}); // split 4 depends on base
+ ai.splitDependencies.put(5, new int[] {0}); // split 5 depends on base
+ ai.splitDependencies.put(6, new int[] {5}); // split 6 depends on 5
+ }
+ }
+ return ai;
+ }
+
+ @Test
+ public void testSplitChain() {
+ ApplicationInfo ai = createMockApplicationInfo(PATH_CLASS_LOADER_NAME, true, true);
+ String[] sharedLibrary = new String[] {"a.dex", "b.dex"};
+ String[] contexts = DexoptUtils.getClassLoaderContexts(ai, sharedLibrary);
+
+ assertEquals(7, contexts.length);
+ assertEquals("PCL[a.dex:b.dex]", contexts[0]);
+ assertEquals("DLC[];DLC[base-2.dex];PCL[base-4.dex];PCL[a.dex:b.dex:base.dex]",
+ contexts[1]);
+ assertEquals("DLC[];PCL[base-4.dex];PCL[a.dex:b.dex:base.dex]", contexts[2]);
+ assertEquals("PCL[];PCL[base-4.dex];PCL[a.dex:b.dex:base.dex]", contexts[3]);
+ assertEquals("PCL[];PCL[a.dex:b.dex:base.dex]", contexts[4]);
+ assertEquals("PCL[];PCL[a.dex:b.dex:base.dex]", contexts[5]);
+ assertEquals("PCL[];PCL[base-5.dex];PCL[a.dex:b.dex:base.dex]", contexts[6]);
+ }
+
+ @Test
+ public void testSplitChainNoSplitDependencies() {
+ ApplicationInfo ai = createMockApplicationInfo(PATH_CLASS_LOADER_NAME, true, false);
+ String[] sharedLibrary = new String[] {"a.dex", "b.dex"};
+ String[] contexts = DexoptUtils.getClassLoaderContexts(ai, sharedLibrary);
+
+ assertEquals(7, contexts.length);
+ assertEquals("PCL[a.dex:b.dex]", contexts[0]);
+ assertEquals("PCL[a.dex:b.dex:base.dex]", contexts[1]);
+ assertEquals("PCL[a.dex:b.dex:base.dex:base-1.dex]", contexts[2]);
+ assertEquals("PCL[a.dex:b.dex:base.dex:base-1.dex:base-2.dex]", contexts[3]);
+ assertEquals("PCL[a.dex:b.dex:base.dex:base-1.dex:base-2.dex:base-3.dex]", contexts[4]);
+ assertEquals(
+ "PCL[a.dex:b.dex:base.dex:base-1.dex:base-2.dex:base-3.dex:base-4.dex]",
+ contexts[5]);
+ assertEquals(
+ "PCL[a.dex:b.dex:base.dex:base-1.dex:base-2.dex:base-3.dex:base-4.dex:base-5.dex]",
+ contexts[6]);
+ }
+
+ @Test
+ public void testSplitChainNoIsolationNoSharedLibrary() {
+ ApplicationInfo ai = createMockApplicationInfo(PATH_CLASS_LOADER_NAME, true, true);
+ ai.privateFlags = ai.privateFlags & (~ApplicationInfo.PRIVATE_FLAG_ISOLATED_SPLIT_LOADING);
+ String[] contexts = DexoptUtils.getClassLoaderContexts(ai, null);
+
+ assertEquals(7, contexts.length);
+ assertEquals("PCL[]", contexts[0]);
+ assertEquals("PCL[base.dex]", contexts[1]);
+ assertEquals("PCL[base.dex:base-1.dex]", contexts[2]);
+ assertEquals("PCL[base.dex:base-1.dex:base-2.dex]", contexts[3]);
+ assertEquals("PCL[base.dex:base-1.dex:base-2.dex:base-3.dex]", contexts[4]);
+ assertEquals("PCL[base.dex:base-1.dex:base-2.dex:base-3.dex:base-4.dex]", contexts[5]);
+ assertEquals(
+ "PCL[base.dex:base-1.dex:base-2.dex:base-3.dex:base-4.dex:base-5.dex]",
+ contexts[6]);
+ }
+ @Test
+ public void testSplitChainNoSharedLibraries() {
+ ApplicationInfo ai = createMockApplicationInfo(
+ DELEGATE_LAST_CLASS_LOADER_NAME, true, true);
+ String[] contexts = DexoptUtils.getClassLoaderContexts(ai, null);
+
+ assertEquals(7, contexts.length);
+ assertEquals("DLC[]", contexts[0]);
+ assertEquals("DLC[];DLC[base-2.dex];PCL[base-4.dex];DLC[base.dex]", contexts[1]);
+ assertEquals("DLC[];PCL[base-4.dex];DLC[base.dex]", contexts[2]);
+ assertEquals("PCL[];PCL[base-4.dex];DLC[base.dex]", contexts[3]);
+ assertEquals("PCL[];DLC[base.dex]", contexts[4]);
+ assertEquals("PCL[];DLC[base.dex]", contexts[5]);
+ assertEquals("PCL[];PCL[base-5.dex];DLC[base.dex]", contexts[6]);
+ }
+
+ @Test
+ public void testSplitChainWithNullPrimaryClassLoader() {
+ // A null classLoaderName should mean PathClassLoader.
+ ApplicationInfo ai = createMockApplicationInfo(null, true, true);
+ String[] sharedLibrary = new String[] {"a.dex", "b.dex"};
+ String[] contexts = DexoptUtils.getClassLoaderContexts(ai, sharedLibrary);
+
+ assertEquals(7, contexts.length);
+ assertEquals("PCL[a.dex:b.dex]", contexts[0]);
+ assertEquals("DLC[];DLC[base-2.dex];PCL[base-4.dex];PCL[a.dex:b.dex:base.dex]", contexts[1]);
+ assertEquals("DLC[];PCL[base-4.dex];PCL[a.dex:b.dex:base.dex]", contexts[2]);
+ assertEquals("PCL[];PCL[base-4.dex];PCL[a.dex:b.dex:base.dex]", contexts[3]);
+ assertEquals("PCL[];PCL[a.dex:b.dex:base.dex]", contexts[4]);
+ assertEquals("PCL[];PCL[a.dex:b.dex:base.dex]", contexts[5]);
+ assertEquals("PCL[];PCL[base-5.dex];PCL[a.dex:b.dex:base.dex]", contexts[6]);
+ }
+
+ @Test
+ public void tesNoSplits() {
+ ApplicationInfo ai = createMockApplicationInfo(PATH_CLASS_LOADER_NAME, false, false);
+ String[] sharedLibrary = new String[] {"a.dex", "b.dex"};
+ String[] contexts = DexoptUtils.getClassLoaderContexts(ai, sharedLibrary);
+
+ assertEquals(1, contexts.length);
+ assertEquals("PCL[a.dex:b.dex]", contexts[0]);
+ }
+
+ @Test
+ public void tesNoSplitsNullClassLoaderName() {
+ ApplicationInfo ai = createMockApplicationInfo(null, false, false);
+ String[] sharedLibrary = new String[] {"a.dex", "b.dex"};
+ String[] contexts = DexoptUtils.getClassLoaderContexts(ai, sharedLibrary);
+
+ assertEquals(1, contexts.length);
+ assertEquals("PCL[a.dex:b.dex]", contexts[0]);
+ }
+
+ @Test
+ public void tesNoSplitDelegateLast() {
+ ApplicationInfo ai = createMockApplicationInfo(
+ DELEGATE_LAST_CLASS_LOADER_NAME, false, false);
+ String[] sharedLibrary = new String[] {"a.dex", "b.dex"};
+ String[] contexts = DexoptUtils.getClassLoaderContexts(ai, sharedLibrary);
+
+ assertEquals(1, contexts.length);
+ assertEquals("DLC[a.dex:b.dex]", contexts[0]);
+ }
+
+ @Test
+ public void tesNoSplitsNoSharedLibraries() {
+ ApplicationInfo ai = createMockApplicationInfo(PATH_CLASS_LOADER_NAME, false, false);
+ String[] contexts = DexoptUtils.getClassLoaderContexts(ai, null);
+
+ assertEquals(1, contexts.length);
+ assertEquals("PCL[]", contexts[0]);
+ }
+
+ @Test
+ public void tesNoSplitDelegateLastNoSharedLibraries() {
+ ApplicationInfo ai = createMockApplicationInfo(
+ DELEGATE_LAST_CLASS_LOADER_NAME, false, false);
+ String[] contexts = DexoptUtils.getClassLoaderContexts(ai, null);
+
+ assertEquals(1, contexts.length);
+ assertEquals("DLC[]", contexts[0]);
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/pm/dex/PackageDexUsageTests.java b/services/tests/servicestests/src/com/android/server/pm/dex/PackageDexUsageTests.java
index 2e99433..e1ef41e 100644
--- a/services/tests/servicestests/src/com/android/server/pm/dex/PackageDexUsageTests.java
+++ b/services/tests/servicestests/src/com/android/server/pm/dex/PackageDexUsageTests.java
@@ -72,25 +72,25 @@
String isa = VMRuntime.getInstructionSet(Build.SUPPORTED_ABIS[0]);
mFooBaseUser0 = new TestData(fooPackageName,
- fooCodeDir + "base.apk", 0, isa, false, true);
+ fooCodeDir + "base.apk", 0, isa, false, true, fooPackageName);
mFooSplit1User0 = new TestData(fooPackageName,
- fooCodeDir + "split-1.apk", 0, isa, false, true);
+ fooCodeDir + "split-1.apk", 0, isa, false, true, fooPackageName);
mFooSplit2UsedByOtherApps0 = new TestData(fooPackageName,
- fooCodeDir + "split-2.apk", 0, isa, true, true);
+ fooCodeDir + "split-2.apk", 0, isa, true, true, "used.by.other.com");
mFooSecondary1User0 = new TestData(fooPackageName,
- fooDataDir + "sec-1.dex", 0, isa, false, false);
+ fooDataDir + "sec-1.dex", 0, isa, false, false, fooPackageName);
mFooSecondary1User1 = new TestData(fooPackageName,
- fooDataDir + "sec-1.dex", 1, isa, false, false);
+ fooDataDir + "sec-1.dex", 1, isa, false, false, fooPackageName);
mFooSecondary2UsedByOtherApps0 = new TestData(fooPackageName,
- fooDataDir + "sec-2.dex", 0, isa, true, false);
+ fooDataDir + "sec-2.dex", 0, isa, true, false, "used.by.other.com");
mInvalidIsa = new TestData(fooPackageName,
- fooCodeDir + "base.apk", 0, "INVALID_ISA", false, true);
+ fooCodeDir + "base.apk", 0, "INVALID_ISA", false, true, "INALID_USER");
String barPackageName = "com.google.bar";
String barCodeDir = "/data/app/com.google.bar/";
@@ -98,11 +98,11 @@
String barDataDir1 = "/data/user/1/com.google.bar/";
mBarBaseUser0 = new TestData(barPackageName,
- barCodeDir + "base.apk", 0, isa, false, true);
+ barCodeDir + "base.apk", 0, isa, false, true, barPackageName);
mBarSecondary1User0 = new TestData(barPackageName,
- barDataDir + "sec-1.dex", 0, isa, false, false);
+ barDataDir + "sec-1.dex", 0, isa, false, false, barPackageName);
mBarSecondary2User1 = new TestData(barPackageName,
- barDataDir1 + "sec-2.dex", 1, isa, false, false);
+ barDataDir1 + "sec-2.dex", 1, isa, false, false, barPackageName);
}
@Test
@@ -319,7 +319,8 @@
mFooSplit2UsedByOtherApps0.mOwnerUserId,
mFooSplit2UsedByOtherApps0.mLoaderIsa,
/*mIsUsedByOtherApps*/false,
- mFooSplit2UsedByOtherApps0.mPrimaryOrSplit);
+ mFooSplit2UsedByOtherApps0.mPrimaryOrSplit,
+ mFooSplit2UsedByOtherApps0.mUsedBy);
assertPackageDexUsage(noLongerUsedByOtherApps);
}
@@ -332,14 +333,65 @@
assertFalse(mPackageDexUsage.clearUsedByOtherApps(mFooSplit2UsedByOtherApps0.mPackageName));
}
+ @Test
+ public void testRecordDexFileUsers() {
+ PackageDexUsage packageDexUsageRecordUsers = new PackageDexUsage();
+ Set<String> users = new HashSet<>(Arrays.asList(
+ new String[] {"another.package.1"}));
+ Set<String> usersExtra = new HashSet<>(Arrays.asList(
+ new String[] {"another.package.2", "another.package.3"}));
+
+ assertTrue(record(packageDexUsageRecordUsers, mFooBaseUser0, users));
+ assertTrue(record(packageDexUsageRecordUsers, mFooBaseUser0, usersExtra));
+
+ assertTrue(record(packageDexUsageRecordUsers, mFooSecondary1User0, users));
+ assertTrue(record(packageDexUsageRecordUsers, mFooSecondary1User0, usersExtra));
+
+ packageDexUsageRecordUsers = writeAndReadBack(packageDexUsageRecordUsers);
+ // Verify that the users were recorded.
+ Set<String> userAll = new HashSet<>(users);
+ userAll.addAll(usersExtra);
+ assertPackageDexUsage(packageDexUsageRecordUsers, userAll, mFooBaseUser0,
+ mFooSecondary1User0);
+ }
+
+ @Test
+ public void testRecordDexFileUsersNotTheOwningPackage() {
+ PackageDexUsage packageDexUsageRecordUsers = new PackageDexUsage();
+ Set<String> users = new HashSet<>(Arrays.asList(
+ new String[] {mFooBaseUser0.mPackageName,}));
+ Set<String> usersExtra = new HashSet<>(Arrays.asList(
+ new String[] {"another.package.2", "another.package.3"}));
+
+ assertTrue(record(packageDexUsageRecordUsers, mFooBaseUser0, users));
+ assertTrue(record(packageDexUsageRecordUsers, mFooBaseUser0, usersExtra));
+
+ assertTrue(record(packageDexUsageRecordUsers, mFooSecondary1User0, users));
+ assertTrue(record(packageDexUsageRecordUsers, mFooSecondary1User0, usersExtra));
+
+ packageDexUsageRecordUsers = writeAndReadBack(packageDexUsageRecordUsers);
+ // Verify that only the non owning packages were recorded.
+ assertPackageDexUsage(packageDexUsageRecordUsers, usersExtra, mFooBaseUser0,
+ mFooSecondary1User0);
+ }
+
private void assertPackageDexUsage(TestData primary, TestData... secondaries) {
+ assertPackageDexUsage(mPackageDexUsage, null, primary, secondaries);
+ }
+
+ private void assertPackageDexUsage(PackageDexUsage packageDexUsage, Set<String> users,
+ TestData primary, TestData... secondaries) {
String packageName = primary == null ? secondaries[0].mPackageName : primary.mPackageName;
boolean primaryUsedByOtherApps = primary == null ? false : primary.mUsedByOtherApps;
- PackageUseInfo pInfo = mPackageDexUsage.getPackageUseInfo(packageName);
+ PackageUseInfo pInfo = packageDexUsage.getPackageUseInfo(packageName);
// Check package use info
assertNotNull(pInfo);
assertEquals(primaryUsedByOtherApps, pInfo.isUsedByOtherApps());
+ if (users != null) {
+ assertEquals(pInfo.getLoadingPackages(), users);
+ }
+
Map<String, DexUseInfo> dexUseInfoMap = pInfo.getDexUseInfoMap();
assertEquals(secondaries.length, dexUseInfoMap.size());
@@ -351,24 +403,43 @@
assertEquals(testData.mOwnerUserId, dInfo.getOwnerUserId());
assertEquals(1, dInfo.getLoaderIsas().size());
assertTrue(dInfo.getLoaderIsas().contains(testData.mLoaderIsa));
+ if (users != null) {
+ assertEquals(dInfo.getLoadingPackages(), users);
+ }
}
}
private boolean record(TestData testData) {
return mPackageDexUsage.record(testData.mPackageName, testData.mDexFile,
- testData.mOwnerUserId, testData.mLoaderIsa, testData.mUsedByOtherApps,
- testData.mPrimaryOrSplit);
+ testData.mOwnerUserId, testData.mLoaderIsa, testData.mUsedByOtherApps,
+ testData.mPrimaryOrSplit, testData.mUsedBy);
+ }
+
+ private boolean record(PackageDexUsage packageDexUsage, TestData testData, Set<String> users) {
+ boolean result = true;
+ for (String user : users) {
+ result = result && packageDexUsage.record(testData.mPackageName, testData.mDexFile,
+ testData.mOwnerUserId, testData.mLoaderIsa, testData.mUsedByOtherApps,
+ testData.mPrimaryOrSplit, user);
+ }
+ return result;
}
private void writeAndReadBack() {
+ mPackageDexUsage = writeAndReadBack(mPackageDexUsage);
+ }
+
+ private PackageDexUsage writeAndReadBack(PackageDexUsage packageDexUsage) {
try {
StringWriter writer = new StringWriter();
- mPackageDexUsage.write(writer);
+ packageDexUsage.write(writer);
- mPackageDexUsage = new PackageDexUsage();
- mPackageDexUsage.read(new StringReader(writer.toString()));
+ PackageDexUsage newPackageDexUsage = new PackageDexUsage();
+ newPackageDexUsage.read(new StringReader(writer.toString()));
+ return newPackageDexUsage;
} catch (IOException e) {
fail("Unexpected IOException: " + e.getMessage());
+ return null;
}
}
@@ -379,15 +450,17 @@
private final String mLoaderIsa;
private final boolean mUsedByOtherApps;
private final boolean mPrimaryOrSplit;
+ private final String mUsedBy;
private TestData(String packageName, String dexFile, int ownerUserId,
- String loaderIsa, boolean isUsedByOtherApps, boolean primaryOrSplit) {
+ String loaderIsa, boolean isUsedByOtherApps, boolean primaryOrSplit, String usedBy) {
mPackageName = packageName;
mDexFile = dexFile;
mOwnerUserId = ownerUserId;
mLoaderIsa = loaderIsa;
mUsedByOtherApps = isUsedByOtherApps;
mPrimaryOrSplit = primaryOrSplit;
+ mUsedBy = usedBy;
}
}
diff --git a/services/tests/servicestests/src/com/android/server/timezone/PackageStatusStorageTest.java b/services/tests/servicestests/src/com/android/server/timezone/PackageStatusStorageTest.java
index e085270..b57cac0 100644
--- a/services/tests/servicestests/src/com/android/server/timezone/PackageStatusStorageTest.java
+++ b/services/tests/servicestests/src/com/android/server/timezone/PackageStatusStorageTest.java
@@ -21,10 +21,13 @@
import org.junit.Test;
import android.content.Context;
-import android.database.sqlite.SQLiteDatabase;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
+import java.io.File;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
import static junit.framework.Assert.assertTrue;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -40,15 +43,16 @@
@Before
public void setUp() throws Exception {
Context context = InstrumentationRegistry.getContext();
+ File dataDir = context.getFilesDir();
// Using the instrumentation context means the database is created in a test app-specific
// directory.
- mPackageStatusStorage = new PackageStatusStorage(context);
+ mPackageStatusStorage = new PackageStatusStorage(dataDir);
}
@After
public void tearDown() throws Exception {
- mPackageStatusStorage.deleteDatabaseForTests();
+ mPackageStatusStorage.deleteFileForTests();
}
@Test
@@ -90,7 +94,7 @@
}
@Test
- public void generateCheckToken_missingRowBehavior() {
+ public void generateCheckToken_missingFileBehavior() {
// Assert initial state.
assertNull(mPackageStatusStorage.getPackageStatus());
@@ -100,15 +104,15 @@
// There should now be state.
assertNotNull(mPackageStatusStorage.getPackageStatus());
- // Corrupt the table by removing the one row.
- mPackageStatusStorage.deleteRowForTests();
+ // Corrupt the data by removing the file.
+ mPackageStatusStorage.deleteFileForTests();
// Check that generateCheckToken recovers.
assertNotNull(mPackageStatusStorage.generateCheckToken(VALID_PACKAGE_VERSIONS));
}
@Test
- public void getPackageStatus_missingRowBehavior() {
+ public void getPackageStatus_missingFileBehavior() {
// Assert initial state.
assertNull(mPackageStatusStorage.getPackageStatus());
@@ -118,14 +122,14 @@
// There should now be a state.
assertNotNull(mPackageStatusStorage.getPackageStatus());
- // Corrupt the table by removing the one row.
- mPackageStatusStorage.deleteRowForTests();
+ // Corrupt the data by removing the file.
+ mPackageStatusStorage.deleteFileForTests();
assertNull(mPackageStatusStorage.getPackageStatus());
}
@Test
- public void markChecked_missingRowBehavior() {
+ public void markChecked_missingFileBehavior() {
// Assert initial state.
CheckToken token1 = mPackageStatusStorage.generateCheckToken(VALID_PACKAGE_VERSIONS);
assertNotNull(token1);
@@ -133,10 +137,10 @@
// There should now be a state.
assertNotNull(mPackageStatusStorage.getPackageStatus());
- // Corrupt the table by removing the one row.
- mPackageStatusStorage.deleteRowForTests();
+ // Corrupt the data by removing the file.
+ mPackageStatusStorage.deleteFileForTests();
- // The missing row should mean token1 is now considered invalid, so we should get a false.
+ // The missing file should mean token1 is now considered invalid, so we should get a false.
assertFalse(mPackageStatusStorage.markChecked(token1, true /* succeeded */));
// The storage should have recovered and we should be able to carry on like before.
@@ -226,4 +230,27 @@
assertFalse(writeOk2);
assertEquals(expectedPackageStatus, mPackageStatusStorage.getPackageStatus());
}
+
+ @Test
+ public void dump() {
+ StringWriter stringWriter = new StringWriter();
+ PrintWriter printWriter = new PrintWriter(stringWriter);
+
+ // Dump initial state.
+ mPackageStatusStorage.dump(printWriter);
+
+ // No crash and it does something.
+ assertFalse(stringWriter.toString().isEmpty());
+
+ // Reset
+ stringWriter.getBuffer().setLength(0);
+ assertTrue(stringWriter.toString().isEmpty());
+
+ // Store something.
+ mPackageStatusStorage.generateCheckToken(VALID_PACKAGE_VERSIONS);
+
+ mPackageStatusStorage.dump(printWriter);
+
+ assertFalse(stringWriter.toString().isEmpty());
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/timezone/PackageTrackerTest.java b/services/tests/servicestests/src/com/android/server/timezone/PackageTrackerTest.java
index 45b0af3..38142d3 100644
--- a/services/tests/servicestests/src/com/android/server/timezone/PackageTrackerTest.java
+++ b/services/tests/servicestests/src/com/android/server/timezone/PackageTrackerTest.java
@@ -30,6 +30,9 @@
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
@@ -71,7 +74,7 @@
// Using the instrumentation context means the database is created in a test app-specific
// directory. We can use the real thing for this test.
- mPackageStatusStorage = new PackageStatusStorage(context);
+ mPackageStatusStorage = new PackageStatusStorage(context.getFilesDir());
// For other interactions with the Android framework we create a fake object.
mFakeIntentHelper = new FakeIntentHelper();
@@ -88,7 +91,7 @@
@After
public void tearDown() throws Exception {
if (mPackageStatusStorage != null) {
- mPackageStatusStorage.deleteDatabaseForTests();
+ mPackageStatusStorage.deleteFileForTests();
}
}
@@ -195,26 +198,25 @@
mFakeIntentHelper.assertReliabilityTriggeringDisabled();
}
- // TODO(nfuller): Uncomment or delete when it's clear what will happen with http://b/35995024
- // @Test
- // public void trackingEnabled_updateAppNotPrivileged() throws Exception {
- // // Set up device configuration.
- // configureTrackingEnabled();
- // configureReliabilityConfigSettingsOk();
- // configureUpdateAppPackageNotPrivileged(UPDATE_APP_PACKAGE_NAME);
- // configureDataAppPackageOk(DATA_APP_PACKAGE_NAME);
- //
- // try {
- // // Initialize the tracker.
- // mPackageTracker.start();
- // fail();
- // } catch (RuntimeException expected) {}
- //
- // mFakeIntentHelper.assertNotInitialized();
- //
- // // Check reliability triggering state.
- // mFakeIntentHelper.assertReliabilityTriggeringDisabled();
- // }
+ @Test
+ public void trackingEnabled_updateAppNotPrivileged() throws Exception {
+ // Set up device configuration.
+ configureTrackingEnabled();
+ configureReliabilityConfigSettingsOk();
+ configureUpdateAppPackageNotPrivileged(UPDATE_APP_PACKAGE_NAME);
+ configureDataAppPackageOk(DATA_APP_PACKAGE_NAME);
+
+ try {
+ // Initialize the tracker.
+ mPackageTracker.start();
+ fail();
+ } catch (RuntimeException expected) {}
+
+ mFakeIntentHelper.assertNotInitialized();
+
+ // Check reliability triggering state.
+ mFakeIntentHelper.assertReliabilityTriggeringDisabled();
+ }
@Test
public void trackingEnabled_dataAppConfigMissing() throws Exception {
@@ -236,26 +238,25 @@
mFakeIntentHelper.assertReliabilityTriggeringDisabled();
}
- // TODO(nfuller): Uncomment or delete when it's clear what will happen with http://b/35995024
- // @Test
- // public void trackingEnabled_dataAppNotPrivileged() throws Exception {
- // // Set up device configuration.
- // configureTrackingEnabled();
- // configureReliabilityConfigSettingsOk();
- // configureUpdateAppPackageOk(UPDATE_APP_PACKAGE_NAME);
- // configureDataAppPackageNotPrivileged(DATA_APP_PACKAGE_NAME);
- //
- // try {
- // // Initialize the tracker.
- // mPackageTracker.start();
- // fail();
- // } catch (RuntimeException expected) {}
- //
- // mFakeIntentHelper.assertNotInitialized();
- //
- // // Check reliability triggering state.
- // mFakeIntentHelper.assertReliabilityTriggeringDisabled();
- // }
+ @Test
+ public void trackingEnabled_dataAppNotPrivileged() throws Exception {
+ // Set up device configuration.
+ configureTrackingEnabled();
+ configureReliabilityConfigSettingsOk();
+ configureUpdateAppPackageOk(UPDATE_APP_PACKAGE_NAME);
+ configureDataAppPackageNotPrivileged(DATA_APP_PACKAGE_NAME);
+
+ try {
+ // Initialize the tracker.
+ mPackageTracker.start();
+ fail();
+ } catch (RuntimeException expected) {}
+
+ mFakeIntentHelper.assertNotInitialized();
+
+ // Check reliability triggering state.
+ mFakeIntentHelper.assertReliabilityTriggeringDisabled();
+ }
@Test
public void trackingEnabled_packageUpdate_badUpdateAppManifestEntry() throws Exception {
@@ -1174,6 +1175,16 @@
assertFalse(token1.equals(token2));
}
+ @Test
+ public void dump() {
+ StringWriter stringWriter = new StringWriter();
+ PrintWriter printWriter = new PrintWriter(stringWriter);
+
+ mPackageTracker.dump(printWriter);
+
+ assertFalse(stringWriter.toString().isEmpty());
+ }
+
private void simulatePackageInstallation(PackageVersions packageVersions) throws Exception {
configureApplicationsValidManifests(packageVersions);
diff --git a/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java
index a7f4c99..2887e3b 100644
--- a/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java
@@ -16,6 +16,11 @@
package com.android.server.timezone;
+import com.android.timezone.distro.DistroVersion;
+import com.android.timezone.distro.StagedDistroOperation;
+import com.android.timezone.distro.TimeZoneDistro;
+import com.android.timezone.distro.installer.TimeZoneDistroInstaller;
+
import org.junit.Before;
import org.junit.Test;
@@ -26,12 +31,15 @@
import android.app.timezone.RulesState;
import android.os.ParcelFileDescriptor;
+import java.io.File;
+import java.io.FileDescriptor;
+import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.PrintWriter;
import java.util.concurrent.Executor;
import javax.annotation.Nullable;
-import libcore.tzdata.shared2.DistroVersion;
-import libcore.tzdata.shared2.StagedDistroOperation;
-import libcore.tzdata.update2.TimeZoneDistroInstaller;
+
+import libcore.io.IoUtils;
import static com.android.server.timezone.RulesManagerService.REQUIRED_UPDATER_PERMISSION;
import static org.junit.Assert.assertEquals;
@@ -40,7 +48,7 @@
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
-import static org.mockito.Matchers.eq;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doThrow;
@@ -48,6 +56,7 @@
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
/**
@@ -59,7 +68,6 @@
private FakeExecutor mFakeExecutor;
private PermissionHelper mMockPermissionHelper;
- private FileDescriptorHelper mMockFileDescriptorHelper;
private PackageTracker mMockPackageTracker;
private TimeZoneDistroInstaller mMockTimeZoneDistroInstaller;
@@ -67,7 +75,6 @@
public void setUp() {
mFakeExecutor = new FakeExecutor();
- mMockFileDescriptorHelper = mock(FileDescriptorHelper.class);
mMockPackageTracker = mock(PackageTracker.class);
mMockPermissionHelper = mock(PermissionHelper.class);
mMockTimeZoneDistroInstaller = mock(TimeZoneDistroInstaller.class);
@@ -75,7 +82,6 @@
mRulesManagerService = new RulesManagerService(
mMockPermissionHelper,
mFakeExecutor,
- mMockFileDescriptorHelper,
mMockPackageTracker,
mMockTimeZoneDistroInstaller);
}
@@ -271,9 +277,8 @@
revision);
configureInstalledDistroVersion(installedDistroVersion);
- byte[] expectedContent = createArbitraryBytes(1000);
- ParcelFileDescriptor parcelFileDescriptor = createFakeParcelFileDescriptor();
- configureParcelFileDescriptorReadSuccess(parcelFileDescriptor, expectedContent);
+ ParcelFileDescriptor parcelFileDescriptor =
+ createParcelFileDescriptor(createArbitraryBytes(1000));
// Start an async operation so there is one in progress. The mFakeExecutor won't actually
// execute it.
@@ -282,36 +287,41 @@
mRulesManagerService.requestInstall(parcelFileDescriptor, tokenBytes, callback);
+ // Request the rules state while the async operation is "happening".
+ RulesState actualRulesState = mRulesManagerService.getRulesState();
RulesState expectedRuleState = new RulesState(
systemRulesVersion, RulesManagerService.DISTRO_FORMAT_VERSION_SUPPORTED,
true /* operationInProgress */,
RulesState.STAGED_OPERATION_UNKNOWN, null /* stagedDistroRulesVersion */,
RulesState.DISTRO_STATUS_UNKNOWN, null /* installedDistroRulesVersion */);
- assertEquals(expectedRuleState, mRulesManagerService.getRulesState());
+ assertEquals(expectedRuleState, actualRulesState);
}
@Test
public void requestInstall_operationInProgress() throws Exception {
configureCallerHasPermission();
- byte[] expectedContent = createArbitraryBytes(1000);
- ParcelFileDescriptor parcelFileDescriptor = createFakeParcelFileDescriptor();
- configureParcelFileDescriptorReadSuccess(parcelFileDescriptor, expectedContent);
+ ParcelFileDescriptor parcelFileDescriptor1 =
+ createParcelFileDescriptor(createArbitraryBytes(1000));
byte[] tokenBytes = createArbitraryTokenBytes();
ICallback callback = new StubbedCallback();
// First request should succeed.
assertEquals(RulesManager.SUCCESS,
- mRulesManagerService.requestInstall(parcelFileDescriptor, tokenBytes, callback));
+ mRulesManagerService.requestInstall(parcelFileDescriptor1, tokenBytes, callback));
// Something async should be enqueued. Clear it but do not execute it so we can detect the
// second request does nothing.
mFakeExecutor.getAndResetLastCommand();
// Second request should fail.
+ ParcelFileDescriptor parcelFileDescriptor2 =
+ createParcelFileDescriptor(createArbitraryBytes(1000));
assertEquals(RulesManager.ERROR_OPERATION_IN_PROGRESS,
- mRulesManagerService.requestInstall(parcelFileDescriptor, tokenBytes, callback));
+ mRulesManagerService.requestInstall(parcelFileDescriptor2, tokenBytes, callback));
+
+ assertClosed(parcelFileDescriptor2);
// Assert nothing async was enqueued.
mFakeExecutor.assertNothingQueued();
@@ -323,9 +333,8 @@
public void requestInstall_badToken() throws Exception {
configureCallerHasPermission();
- byte[] expectedContent = createArbitraryBytes(1000);
- ParcelFileDescriptor parcelFileDescriptor = createFakeParcelFileDescriptor();
- configureParcelFileDescriptorReadSuccess(parcelFileDescriptor, expectedContent);
+ ParcelFileDescriptor parcelFileDescriptor =
+ createParcelFileDescriptor(createArbitraryBytes(1000));
byte[] badTokenBytes = new byte[2];
ICallback callback = new StubbedCallback();
@@ -336,6 +345,8 @@
} catch (IllegalArgumentException expected) {
}
+ assertClosed(parcelFileDescriptor);
+
// Assert nothing async was enqueued.
mFakeExecutor.assertNothingQueued();
verifyNoInstallerCallsMade();
@@ -365,7 +376,8 @@
public void requestInstall_nullCallback() throws Exception {
configureCallerHasPermission();
- ParcelFileDescriptor parcelFileDescriptor = createFakeParcelFileDescriptor();
+ ParcelFileDescriptor parcelFileDescriptor =
+ createParcelFileDescriptor(createArbitraryBytes(1000));
byte[] tokenBytes = createArbitraryTokenBytes();
ICallback callback = null;
@@ -374,6 +386,8 @@
fail();
} catch (NullPointerException expected) {}
+ assertClosed(parcelFileDescriptor);
+
// Assert nothing async was enqueued.
mFakeExecutor.assertNothingQueued();
verifyNoInstallerCallsMade();
@@ -384,9 +398,8 @@
public void requestInstall_asyncSuccess() throws Exception {
configureCallerHasPermission();
- ParcelFileDescriptor parcelFileDescriptor = createFakeParcelFileDescriptor();
- byte[] expectedContent = createArbitraryBytes(1000);
- configureParcelFileDescriptorReadSuccess(parcelFileDescriptor, expectedContent);
+ ParcelFileDescriptor parcelFileDescriptor =
+ createParcelFileDescriptor(createArbitraryBytes(1000));
CheckToken token = createArbitraryToken();
byte[] tokenBytes = token.toByteArray();
@@ -403,13 +416,15 @@
verifyNoPackageTrackerCallsMade();
// Set up the installer.
- configureStageInstallExpectation(expectedContent, TimeZoneDistroInstaller.INSTALL_SUCCESS);
+ configureStageInstallExpectation(TimeZoneDistroInstaller.INSTALL_SUCCESS);
// Simulate the async execution.
mFakeExecutor.simulateAsyncExecutionOfLastCommand();
+ assertClosed(parcelFileDescriptor);
+
// Verify the expected calls were made to other components.
- verifyStageInstallCalled(expectedContent);
+ verifyStageInstallCalled();
verifyPackageTrackerCalled(token, true /* success */);
// Check the callback was called.
@@ -420,9 +435,8 @@
public void requestInstall_nullTokenBytes() throws Exception {
configureCallerHasPermission();
- ParcelFileDescriptor parcelFileDescriptor = createFakeParcelFileDescriptor();
- byte[] expectedContent = createArbitraryBytes(1000);
- configureParcelFileDescriptorReadSuccess(parcelFileDescriptor, expectedContent);
+ ParcelFileDescriptor parcelFileDescriptor =
+ createParcelFileDescriptor(createArbitraryBytes(1000));
TestCallback callback = new TestCallback();
@@ -436,13 +450,15 @@
callback.assertNoResultReceived();
// Set up the installer.
- configureStageInstallExpectation(expectedContent, TimeZoneDistroInstaller.INSTALL_SUCCESS);
+ configureStageInstallExpectation(TimeZoneDistroInstaller.INSTALL_SUCCESS);
// Simulate the async execution.
mFakeExecutor.simulateAsyncExecutionOfLastCommand();
+ assertClosed(parcelFileDescriptor);
+
// Verify the expected calls were made to other components.
- verifyStageInstallCalled(expectedContent);
+ verifyStageInstallCalled();
verifyPackageTrackerCalled(null /* expectedToken */, true /* success */);
// Check the callback was received.
@@ -453,9 +469,8 @@
public void requestInstall_asyncInstallFail() throws Exception {
configureCallerHasPermission();
- byte[] expectedContent = createArbitraryBytes(1000);
- ParcelFileDescriptor parcelFileDescriptor = createFakeParcelFileDescriptor();
- configureParcelFileDescriptorReadSuccess(parcelFileDescriptor, expectedContent);
+ ParcelFileDescriptor parcelFileDescriptor =
+ createParcelFileDescriptor(createArbitraryBytes(1000));
CheckToken token = createArbitraryToken();
byte[] tokenBytes = token.toByteArray();
@@ -471,14 +486,15 @@
callback.assertNoResultReceived();
// Set up the installer.
- configureStageInstallExpectation(
- expectedContent, TimeZoneDistroInstaller.INSTALL_FAIL_VALIDATION_ERROR);
+ configureStageInstallExpectation(TimeZoneDistroInstaller.INSTALL_FAIL_VALIDATION_ERROR);
// Simulate the async execution.
mFakeExecutor.simulateAsyncExecutionOfLastCommand();
+ assertClosed(parcelFileDescriptor);
+
// Verify the expected calls were made to other components.
- verifyStageInstallCalled(expectedContent);
+ verifyStageInstallCalled();
// Validation failure is treated like a successful check: repeating it won't improve things.
boolean expectedSuccess = true;
@@ -489,38 +505,6 @@
}
@Test
- public void requestInstall_asyncParcelFileDescriptorReadFail() throws Exception {
- configureCallerHasPermission();
-
- ParcelFileDescriptor parcelFileDescriptor = createFakeParcelFileDescriptor();
- configureParcelFileDescriptorReadFailure(parcelFileDescriptor);
-
- CheckToken token = createArbitraryToken();
- byte[] tokenBytes = token.toByteArray();
-
- TestCallback callback = new TestCallback();
-
- // Request the install.
- assertEquals(RulesManager.SUCCESS,
- mRulesManagerService.requestInstall(parcelFileDescriptor, tokenBytes, callback));
-
- // Simulate the async execution.
- mFakeExecutor.simulateAsyncExecutionOfLastCommand();
-
- // Verify nothing else happened.
- verifyNoInstallerCallsMade();
-
- // A failure to read the ParcelFileDescriptor is treated as a failure. It might be the
- // result of a file system error. This is a fairly arbitrary choice.
- verifyPackageTrackerCalled(token, false /* success */);
-
- verifyNoPackageTrackerCallsMade();
-
- // Check the callback was received.
- callback.assertResultReceived(Callback.ERROR_UNKNOWN_FAILURE);
- }
-
- @Test
public void requestUninstall_operationInProgress() throws Exception {
configureCallerHasPermission();
@@ -745,6 +729,97 @@
verifyPackageTrackerCalled(null /* token */, true /* success */);
}
+ @Test
+ public void dump_noPermission() throws Exception {
+ when(mMockPermissionHelper.checkDumpPermission(any(String.class), any(PrintWriter.class)))
+ .thenReturn(false);
+
+ doDumpCallAndCapture(mRulesManagerService, null);
+ verifyZeroInteractions(mMockPackageTracker, mMockTimeZoneDistroInstaller);
+ }
+
+ @Test
+ public void dump_emptyArgs() throws Exception {
+ doSuccessfulDumpCall(mRulesManagerService, new String[0]);
+
+ // Verify the package tracker was consulted.
+ verify(mMockPackageTracker).dump(any(PrintWriter.class));
+ }
+
+ @Test
+ public void dump_nullArgs() throws Exception {
+ doSuccessfulDumpCall(mRulesManagerService, null);
+ // Verify the package tracker was consulted.
+ verify(mMockPackageTracker).dump(any(PrintWriter.class));
+ }
+
+ @Test
+ public void dump_unknownArgs() throws Exception {
+ String dumpedTextUnknownArgs = doSuccessfulDumpCall(
+ mRulesManagerService, new String[] { "foo", "bar"});
+
+ // Verify the package tracker was consulted.
+ verify(mMockPackageTracker).dump(any(PrintWriter.class));
+
+ String dumpedTextZeroArgs = doSuccessfulDumpCall(mRulesManagerService, null);
+ assertEquals(dumpedTextZeroArgs, dumpedTextUnknownArgs);
+ }
+
+ @Test
+ public void dump_formatState() throws Exception {
+ // Just expect these to not throw exceptions, not return nothing, and not interact with the
+ // package tracker.
+ doSuccessfulDumpCall(mRulesManagerService, dumpFormatArgs("p"));
+ doSuccessfulDumpCall(mRulesManagerService, dumpFormatArgs("s"));
+ doSuccessfulDumpCall(mRulesManagerService, dumpFormatArgs("c"));
+ doSuccessfulDumpCall(mRulesManagerService, dumpFormatArgs("i"));
+ doSuccessfulDumpCall(mRulesManagerService, dumpFormatArgs("o"));
+ doSuccessfulDumpCall(mRulesManagerService, dumpFormatArgs("t"));
+ doSuccessfulDumpCall(mRulesManagerService, dumpFormatArgs("a"));
+ doSuccessfulDumpCall(mRulesManagerService, dumpFormatArgs("z" /* Unknown */));
+ doSuccessfulDumpCall(mRulesManagerService, dumpFormatArgs("piscotz"));
+
+ verifyZeroInteractions(mMockPackageTracker);
+ }
+
+ private static String[] dumpFormatArgs(String argsString) {
+ return new String[] { "-format_state", argsString};
+ }
+
+ private String doSuccessfulDumpCall(RulesManagerService rulesManagerService, String[] args)
+ throws Exception {
+ when(mMockPermissionHelper.checkDumpPermission(any(String.class), any(PrintWriter.class)))
+ .thenReturn(true);
+
+ // Set up the mocks to return (arbitrary) information about the current device state.
+ when(mMockTimeZoneDistroInstaller.getSystemRulesVersion()).thenReturn("2017a");
+ when(mMockTimeZoneDistroInstaller.getInstalledDistroVersion()).thenReturn(
+ new DistroVersion(2, 3, "2017b", 4));
+ when(mMockTimeZoneDistroInstaller.getStagedDistroOperation()).thenReturn(
+ StagedDistroOperation.install(new DistroVersion(5, 6, "2017c", 7)));
+
+ // Do the dump call.
+ String dumpedOutput = doDumpCallAndCapture(rulesManagerService, args);
+
+ assertFalse(dumpedOutput.isEmpty());
+
+ return dumpedOutput;
+ }
+
+ private static String doDumpCallAndCapture(
+ RulesManagerService rulesManagerService, String[] args) throws IOException {
+ File file = File.createTempFile("dump", null);
+ try {
+ try (FileOutputStream fos = new FileOutputStream(file)) {
+ FileDescriptor fd = fos.getFD();
+ rulesManagerService.dump(fd, args);
+ }
+ return IoUtils.readFileAsString(file.getAbsolutePath());
+ } finally {
+ file.delete();
+ }
+ }
+
private void verifyNoPackageTrackerCallsMade() {
verifyNoMoreInteractions(mMockPackageTracker);
reset(mMockPackageTracker);
@@ -768,20 +843,9 @@
.enforceCallerHasPermission(REQUIRED_UPDATER_PERMISSION);
}
- private void configureParcelFileDescriptorReadSuccess(ParcelFileDescriptor parcelFileDescriptor,
- byte[] content) throws Exception {
- when(mMockFileDescriptorHelper.readFully(parcelFileDescriptor)).thenReturn(content);
- }
-
- private void configureParcelFileDescriptorReadFailure(ParcelFileDescriptor parcelFileDescriptor)
+ private void configureStageInstallExpectation(int resultCode)
throws Exception {
- when(mMockFileDescriptorHelper.readFully(parcelFileDescriptor))
- .thenThrow(new IOException("Simulated failure"));
- }
-
- private void configureStageInstallExpectation(byte[] expectedContent, int resultCode)
- throws Exception {
- when(mMockTimeZoneDistroInstaller.stageInstallWithErrorCode(eq(expectedContent)))
+ when(mMockTimeZoneDistroInstaller.stageInstallWithErrorCode(any(TimeZoneDistro.class)))
.thenReturn(resultCode);
}
@@ -789,8 +853,8 @@
doReturn(success).when(mMockTimeZoneDistroInstaller).stageUninstall();
}
- private void verifyStageInstallCalled(byte[] expectedContent) throws Exception {
- verify(mMockTimeZoneDistroInstaller).stageInstallWithErrorCode(eq(expectedContent));
+ private void verifyStageInstallCalled() throws Exception {
+ verify(mMockTimeZoneDistroInstaller).stageInstallWithErrorCode(any(TimeZoneDistro.class));
verifyNoMoreInteractions(mMockTimeZoneDistroInstaller);
reset(mMockTimeZoneDistroInstaller);
}
@@ -822,10 +886,6 @@
return new CheckToken(1, new PackageVersions(1, 1));
}
- private ParcelFileDescriptor createFakeParcelFileDescriptor() {
- return new ParcelFileDescriptor((ParcelFileDescriptor) null);
- }
-
private void configureDeviceSystemRulesVersion(String systemRulesVersion) throws Exception {
when(mMockTimeZoneDistroInstaller.getSystemRulesVersion()).thenReturn(systemRulesVersion);
}
@@ -865,6 +925,10 @@
.thenThrow(new IOException("Simulated failure"));
}
+ private static void assertClosed(ParcelFileDescriptor parcelFileDescriptor) {
+ assertFalse(parcelFileDescriptor.getFileDescriptor().valid());
+ }
+
private static class FakeExecutor implements Executor {
private Runnable mLastCommand;
@@ -921,4 +985,17 @@
fail("Unexpected call");
}
}
+
+ private static ParcelFileDescriptor createParcelFileDescriptor(byte[] bytes)
+ throws IOException {
+ File file = File.createTempFile("pfd", null);
+ try (FileOutputStream fos = new FileOutputStream(file)) {
+ fos.write(bytes);
+ }
+ ParcelFileDescriptor pfd =
+ ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
+ // This should now be safe to delete. The ParcelFileDescriptor has an open fd.
+ file.delete();
+ return pfd;
+ }
}
diff --git a/services/usage/java/com/android/server/usage/StorageStatsService.java b/services/usage/java/com/android/server/usage/StorageStatsService.java
index 9f4fb85..21b11b0 100644
--- a/services/usage/java/com/android/server/usage/StorageStatsService.java
+++ b/services/usage/java/com/android/server/usage/StorageStatsService.java
@@ -392,6 +392,7 @@
res.videoBytes = stats[2];
res.imageBytes = stats[3];
res.appBytes = stats[4];
+ res.obbBytes = stats[5];
return res;
}
diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java
index 073a17e..25e471c 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsService.java
@@ -363,19 +363,22 @@
}
@Override
- public void onUidIdle(int uid, boolean disabled) throws RemoteException {
+ public void onUidIdle(int uid, boolean disabled) {
// Ignored
}
@Override
- public void onUidGone(int uid, boolean disabled) throws RemoteException {
+ public void onUidGone(int uid, boolean disabled) {
onUidStateChanged(uid, ActivityManager.PROCESS_STATE_NONEXISTENT, 0);
}
@Override
- public void onUidActive(int uid) throws RemoteException {
+ public void onUidActive(int uid) {
// Ignored
}
+
+ @Override public void onUidCachedChanged(int uid, boolean cached) {
+ }
};
@Override
diff --git a/services/usb/java/com/android/server/usb/UsbDebuggingManager.java b/services/usb/java/com/android/server/usb/UsbDebuggingManager.java
index f6d9e9a..703f1a1 100644
--- a/services/usb/java/com/android/server/usb/UsbDebuggingManager.java
+++ b/services/usb/java/com/android/server/usb/UsbDebuggingManager.java
@@ -43,12 +43,10 @@
import com.android.server.FgThread;
import java.io.File;
-import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
-import java.io.PrintWriter;
import java.security.MessageDigest;
import java.util.Arrays;
@@ -56,10 +54,10 @@
private static final String TAG = "UsbDebuggingManager";
private static final boolean DEBUG = false;
- private final String ADBD_SOCKET = "adbd";
- private final String ADB_DIRECTORY = "misc/adb";
- private final String ADB_KEYS_FILE = "adb_keys";
- private final int BUFFER_SIZE = 4096;
+ private static final String ADBD_SOCKET = "adbd";
+ private static final String ADB_DIRECTORY = "misc/adb";
+ private static final String ADB_KEYS_FILE = "adb_keys";
+ private static final int BUFFER_SIZE = 4096;
private final Context mContext;
private final Handler mHandler;
@@ -346,7 +344,7 @@
}
/**
- * @returns true if the componentName led to an Activity that was started.
+ * @return true if the componentName led to an Activity that was started.
*/
private boolean startConfirmationActivity(ComponentName componentName, UserHandle userHandle,
String key, String fingerprints) {
@@ -365,7 +363,7 @@
}
/**
- * @returns true if the componentName led to a Service that was started.
+ * @return true if the componentName led to a Service that was started.
*/
private boolean startConfirmationService(ComponentName componentName, UserHandle userHandle,
String key, String fingerprints) {
diff --git a/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/services/usb/java/com/android/server/usb/UsbDeviceManager.java
index c696b50..184dd73 100644
--- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java
+++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java
@@ -92,14 +92,6 @@
private static final String USB_CONFIG_PROPERTY = "sys.usb.config";
/**
- * The property which stores the current build type (user/userdebug/eng).
- */
- private static final String BUILD_TYPE_PROPERTY = "ro.build.type";
-
- private static final String BUILD_TYPE_USERDEBUG = "userdebug";
- private static final String BUILD_TYPE_ENG = "eng";
-
- /**
* The non-persistent property which stores the current USB actual state.
*/
private static final String USB_STATE_PROPERTY = "sys.usb.state";
@@ -179,7 +171,7 @@
private static Set<Integer> sBlackListedInterfaces;
static {
- sBlackListedInterfaces = new HashSet<Integer>();
+ sBlackListedInterfaces = new HashSet<>();
sBlackListedInterfaces.add(UsbConstants.USB_CLASS_AUDIO);
sBlackListedInterfaces.add(UsbConstants.USB_CLASS_COMM);
sBlackListedInterfaces.add(UsbConstants.USB_CLASS_HID);
@@ -191,7 +183,7 @@
sBlackListedInterfaces.add(UsbConstants.USB_CLASS_CONTENT_SEC);
sBlackListedInterfaces.add(UsbConstants.USB_CLASS_VIDEO);
sBlackListedInterfaces.add(UsbConstants.USB_CLASS_WIRELESS_CONTROLLER);
- };
+ }
private class AdbSettingsObserver extends ContentObserver {
public AdbSettingsObserver() {
@@ -225,44 +217,6 @@
}
};
- private final BroadcastReceiver mPortReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- UsbPort port = intent.getParcelableExtra(UsbManager.EXTRA_PORT);
- UsbPortStatus status = intent.getParcelableExtra(UsbManager.EXTRA_PORT_STATUS);
- mHandler.updateHostState(port, status);
- }
- };
-
- private final BroadcastReceiver mChargingReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
- boolean usbCharging = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
- mHandler.sendMessage(MSG_UPDATE_CHARGING_STATE, usbCharging);
- }
- };
-
- private final BroadcastReceiver mHostReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- Iterator devices = ((UsbManager) context.getSystemService(Context.USB_SERVICE))
- .getDeviceList().entrySet().iterator();
- if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_ATTACHED)) {
- mHandler.sendMessage(MSG_UPDATE_HOST_STATE, devices, true);
- } else {
- mHandler.sendMessage(MSG_UPDATE_HOST_STATE, devices, false);
- }
- }
- };
-
- private final BroadcastReceiver mLanguageChangedReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- mHandler.sendEmptyMessage(MSG_LOCALE_CHANGED);
- }
- };
-
public UsbDeviceManager(Context context, UsbAlsaManager alsaManager,
UsbSettingsManager settingsManager) {
mContext = context;
@@ -287,17 +241,56 @@
if (secureAdbEnabled && !dataEncrypted) {
mDebuggingManager = new UsbDebuggingManager(context);
}
- mContext.registerReceiver(mPortReceiver,
+
+ BroadcastReceiver portReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ UsbPort port = intent.getParcelableExtra(UsbManager.EXTRA_PORT);
+ UsbPortStatus status = intent.getParcelableExtra(UsbManager.EXTRA_PORT_STATUS);
+ mHandler.updateHostState(port, status);
+ }
+ };
+
+ BroadcastReceiver chargingReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
+ boolean usbCharging = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
+ mHandler.sendMessage(MSG_UPDATE_CHARGING_STATE, usbCharging);
+ }
+ };
+
+ BroadcastReceiver hostReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ Iterator devices = ((UsbManager) context.getSystemService(Context.USB_SERVICE))
+ .getDeviceList().entrySet().iterator();
+ if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_ATTACHED)) {
+ mHandler.sendMessage(MSG_UPDATE_HOST_STATE, devices, true);
+ } else {
+ mHandler.sendMessage(MSG_UPDATE_HOST_STATE, devices, false);
+ }
+ }
+ };
+
+ BroadcastReceiver languageChangedReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ mHandler.sendEmptyMessage(MSG_LOCALE_CHANGED);
+ }
+ };
+
+ mContext.registerReceiver(portReceiver,
new IntentFilter(UsbManager.ACTION_USB_PORT_CHANGED));
- mContext.registerReceiver(mChargingReceiver,
+ mContext.registerReceiver(chargingReceiver,
new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
IntentFilter filter =
new IntentFilter(UsbManager.ACTION_USB_DEVICE_ATTACHED);
filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
- mContext.registerReceiver(mHostReceiver, filter);
+ mContext.registerReceiver(hostReceiver, filter);
- mContext.registerReceiver(mLanguageChangedReceiver,
+ mContext.registerReceiver(languageChangedReceiver,
new IntentFilter(Intent.ACTION_LOCALE_CHANGED));
}
@@ -326,7 +319,7 @@
// We do not show the USB notification if the primary volume supports mass storage.
// The legacy mass storage UI will be used instead.
- boolean massStorageSupported = false;
+ boolean massStorageSupported;
final StorageManager storageManager = StorageManager.from(mContext);
final StorageVolume primary = storageManager.getPrimaryVolume();
massStorageSupported = primary != null && primary.allowMassStorage();
@@ -454,7 +447,7 @@
SystemProperties.get(USB_STATE_PROPERTY));
}
- /**
+ /*
* Use the normal bootmode persistent prop to maintain state of adb across
* all boot modes.
*/
@@ -462,7 +455,7 @@
SystemProperties.get(USB_PERSISTENT_CONFIG_PROPERTY),
UsbManager.USB_FUNCTION_ADB);
- /**
+ /*
* Previous versions can set persist config to mtp/ptp but it does not
* get reset on OTA. Reset the property here instead.
*/
@@ -652,10 +645,7 @@
private boolean isNormalBoot() {
String bootMode = SystemProperties.get(BOOT_MODE_PROPERTY, "unknown");
- if (bootMode.equals(NORMAL_BOOT) || bootMode.equals("unknown")) {
- return true;
- }
- return false;
+ return bootMode.equals(NORMAL_BOOT) || bootMode.equals("unknown");
}
private boolean trySetEnabledFunctions(String functions, boolean forceRestart) {
@@ -1037,7 +1027,9 @@
if (DEBUG) {
Slog.v(TAG, "Accessory mode enter timeout: " + mConnected);
}
- if (!mConnected) {
+ if (!mConnected || !UsbManager.containsFunction(
+ mCurrentFunctions,
+ UsbManager.USB_FUNCTION_ACCESSORY)) {
notifyAccessoryModeExit();
}
break;
@@ -1319,25 +1311,21 @@
String[] items = config.split(":");
if (items.length == 3 || items.length == 4) {
if (mOemModeMap == null) {
- mOemModeMap = new HashMap<String, HashMap<String,
- Pair<String, String>>>();
+ mOemModeMap = new HashMap<>();
}
HashMap<String, Pair<String, String>> overrideMap
= mOemModeMap.get(items[0]);
if (overrideMap == null) {
- overrideMap = new HashMap<String,
- Pair<String, String>>();
+ overrideMap = new HashMap<>();
mOemModeMap.put(items[0], overrideMap);
}
// Favoring the first combination if duplicate exists
if (!overrideMap.containsKey(items[1])) {
if (items.length == 3) {
- overrideMap.put(items[1],
- new Pair<String, String>(items[2], ""));
+ overrideMap.put(items[1], new Pair<>(items[2], ""));
} else {
- overrideMap.put(items[1],
- new Pair<String, String>(items[2], items[3]));
+ overrideMap.put(items[1], new Pair<>(items[2], items[3]));
}
}
}
@@ -1398,7 +1386,7 @@
String bootMode = SystemProperties.get(BOOT_MODE_PROPERTY, "unknown");
String persistProp = USB_PERSISTENT_CONFIG_PROPERTY;
if (!(bootMode.equals(NORMAL_BOOT) || bootMode.equals("unknown"))) {
- if (functions == true) {
+ if (functions) {
persistProp = "persist.sys.usb." + bootMode + ".func";
} else {
persistProp = "persist.sys.usb." + bootMode + ".config";
diff --git a/services/usb/java/com/android/server/usb/UsbHostManager.java b/services/usb/java/com/android/server/usb/UsbHostManager.java
index 3279fa6..ce0dcc3 100644
--- a/services/usb/java/com/android/server/usb/UsbHostManager.java
+++ b/services/usb/java/com/android/server/usb/UsbHostManager.java
@@ -44,13 +44,11 @@
private static final boolean DEBUG = false;
// contains all connected USB devices
- private final HashMap<String, UsbDevice> mDevices = new HashMap<String, UsbDevice>();
-
+ private final HashMap<String, UsbDevice> mDevices = new HashMap<>();
// USB busses to exclude from USB host support
private final String[] mHostBlacklist;
- private final Context mContext;
private final Object mLock = new Object();
private UsbDevice mNewDevice;
@@ -71,7 +69,6 @@
public UsbHostManager(Context context, UsbAlsaManager alsaManager,
UsbSettingsManager settingsManager) {
- mContext = context;
mHostBlacklist = context.getResources().getStringArray(
com.android.internal.R.array.config_usbHostBlacklist);
mUsbAlsaManager = alsaManager;
@@ -119,17 +116,14 @@
}
/* returns true if the USB device should not be accessible by applications */
- private boolean isBlackListed(int clazz, int subClass, int protocol) {
+ private boolean isBlackListed(int clazz, int subClass) {
// blacklist hubs
if (clazz == UsbConstants.USB_CLASS_HUB) return true;
// blacklist HID boot devices (mouse and keyboard)
- if (clazz == UsbConstants.USB_CLASS_HID &&
- subClass == UsbConstants.USB_INTERFACE_SUBCLASS_BOOT) {
- return true;
- }
+ return clazz == UsbConstants.USB_CLASS_HID
+ && subClass == UsbConstants.USB_INTERFACE_SUBCLASS_BOOT;
- return false;
}
/* Called from JNI in monitorUsbHostBus() to report new USB devices
@@ -137,6 +131,7 @@
interfaces and endpoints, and finally call endUsbDeviceAdded after all descriptors
have been processed
*/
+ @SuppressWarnings("unused")
private boolean beginUsbDeviceAdded(String deviceName, int vendorID, int productID,
int deviceClass, int deviceSubclass, int deviceProtocol,
String manufacturerName, String productName, int version, String serialNumber) {
@@ -161,7 +156,7 @@
// such test until endUsbDeviceAdded() when we have that info.
if (isBlackListed(deviceName) ||
- isBlackListed(deviceClass, deviceSubclass, deviceProtocol)) {
+ isBlackListed(deviceClass, deviceSubclass)) {
return false;
}
@@ -183,9 +178,9 @@
deviceClass, deviceSubclass, deviceProtocol,
manufacturerName, productName, versionString, serialNumber);
- mNewConfigurations = new ArrayList<UsbConfiguration>();
- mNewInterfaces = new ArrayList<UsbInterface>();
- mNewEndpoints = new ArrayList<UsbEndpoint>();
+ mNewConfigurations = new ArrayList<>();
+ mNewInterfaces = new ArrayList<>();
+ mNewEndpoints = new ArrayList<>();
}
return true;
@@ -194,6 +189,7 @@
/* Called from JNI in monitorUsbHostBus() to report new USB configuration for the device
currently being added. Returns true if successful, false in case of error.
*/
+ @SuppressWarnings("unused")
private void addUsbConfiguration(int id, String name, int attributes, int maxPower) {
if (mNewConfiguration != null) {
mNewConfiguration.setInterfaces(
@@ -208,6 +204,7 @@
/* Called from JNI in monitorUsbHostBus() to report new USB interface for the device
currently being added. Returns true if successful, false in case of error.
*/
+ @SuppressWarnings("unused")
private void addUsbInterface(int id, String name, int altSetting,
int Class, int subClass, int protocol) {
if (mNewInterface != null) {
@@ -223,11 +220,13 @@
/* Called from JNI in monitorUsbHostBus() to report new USB endpoint for the device
currently being added. Returns true if successful, false in case of error.
*/
+ @SuppressWarnings("unused")
private void addUsbEndpoint(int address, int attributes, int maxPacketSize, int interval) {
mNewEndpoints.add(new UsbEndpoint(address, attributes, maxPacketSize, interval));
}
/* Called from JNI in monitorUsbHostBus() to finish adding a new device */
+ @SuppressWarnings("unused")
private void endUsbDeviceAdded() {
if (DEBUG) {
Slog.d(TAG, "usb:UsbHostManager.endUsbDeviceAdded()");
@@ -284,6 +283,7 @@
}
/* Called from JNI in monitorUsbHostBus to report USB device removal */
+ @SuppressWarnings("unused")
private void usbDeviceRemoved(String deviceName) {
synchronized (mLock) {
UsbDevice device = mDevices.remove(deviceName);
@@ -299,11 +299,7 @@
synchronized (mLock) {
// Create a thread to call into native code to wait for USB host events.
// This thread will call us back on usbDeviceAdded and usbDeviceRemoved.
- Runnable runnable = new Runnable() {
- public void run() {
- monitorUsbHostBus();
- }
- };
+ Runnable runnable = this::monitorUsbHostBus;
new Thread(null, runnable, "UsbService host thread").start();
}
}
diff --git a/services/usb/java/com/android/server/usb/UsbPortManager.java b/services/usb/java/com/android/server/usb/UsbPortManager.java
index 7e2496c..e28513a 100644
--- a/services/usb/java/com/android/server/usb/UsbPortManager.java
+++ b/services/usb/java/com/android/server/usb/UsbPortManager.java
@@ -87,9 +87,6 @@
// Mostly due a command sent by the remote Usb device.
private HALCallback mHALCallback = new HALCallback(null, this);
- // Notification object used to listen to the start of the usb daemon.
- private final ServiceNotification mServiceNotification = new ServiceNotification();
-
// Cookie sent for usb hal death notification.
private static final int USB_HAL_DEATH_COOKIE = 1000;
@@ -107,18 +104,20 @@
// Ports may temporarily have different dispositions as they are added or removed
// but the class invariant is that this list will only contain ports with DISPOSITION_READY
// except while updatePortsLocked() is in progress.
- private final ArrayMap<String, PortInfo> mPorts = new ArrayMap<String, PortInfo>();
+ private final ArrayMap<String, PortInfo> mPorts = new ArrayMap<>();
// List of all simulated ports, indexed by id.
private final ArrayMap<String, RawPortInfo> mSimulatedPorts =
- new ArrayMap<String, RawPortInfo>();
+ new ArrayMap<>();
public UsbPortManager(Context context) {
mContext = context;
try {
+ ServiceNotification serviceNotification = new ServiceNotification();
+
boolean ret = IServiceManager.getService()
.registerForNotifications("android.hardware.usb@1.0::IUsb",
- "", mServiceNotification);
+ "", serviceNotification);
if (!ret) {
logAndPrint(Log.ERROR, null,
"Failed to register service start notification");
@@ -258,7 +257,6 @@
logAndPrintException(pw, "Failed to set the USB port mode: "
+ "portId=" + portId
+ ", newMode=" + UsbPort.modeToString(newRole.role), e);
- return;
}
} else {
// Change power and data role independently as needed.
@@ -289,7 +287,6 @@
+ ", newDataRole=" + UsbPort.dataRoleToString(newRole
.role),
e);
- return;
}
}
}
@@ -415,10 +412,6 @@
public IndentingPrintWriter pw;
public UsbPortManager portManager;
- HALCallback() {
- super();
- }
-
HALCallback(IndentingPrintWriter pw, UsbPortManager portManager) {
this.pw = pw;
this.portManager = portManager;
@@ -434,7 +427,7 @@
return;
}
- ArrayList<RawPortInfo> newPortInfo = new ArrayList<RawPortInfo>();
+ ArrayList<RawPortInfo> newPortInfo = new ArrayList<>();
for (PortStatus current : currentPortStatus) {
RawPortInfo temp = new RawPortInfo(current.portName,
@@ -452,7 +445,6 @@
message.what = MSG_UPDATE_PORTS;
message.setData(bundle);
portManager.mHandler.sendMessage(message);
- return;
}
@@ -467,7 +459,7 @@
return;
}
- ArrayList<RawPortInfo> newPortInfo = new ArrayList<RawPortInfo>();
+ ArrayList<RawPortInfo> newPortInfo = new ArrayList<>();
for (PortStatus_1_1 current : currentPortStatus) {
RawPortInfo temp = new RawPortInfo(current.status.portName,
@@ -485,7 +477,6 @@
message.what = MSG_UPDATE_PORTS;
message.setData(bundle);
portManager.mHandler.sendMessage(message);
- return;
}
public void notifyRoleSwitchStatus(String portName, PortRole role, int retval) {
@@ -495,7 +486,7 @@
logAndPrint(Log.ERROR, pw, portName + " role switch failed");
}
}
- };
+ }
final class DeathRecipient implements HwBinder.DeathRecipient {
public IndentingPrintWriter pw;
@@ -701,12 +692,7 @@
// Guard against possible reentrance by posting the broadcast from the handler
// instead of from within the critical section.
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
- }
- });
+ mHandler.post(() -> mContext.sendBroadcastAsUser(intent, UserHandle.ALL));
}
private static void logAndPrint(int priority, IndentingPrintWriter pw, String msg) {
diff --git a/services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java b/services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java
index 840ae22..ebb5a62 100644
--- a/services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java
+++ b/services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java
@@ -225,7 +225,7 @@
} else if ("serial-number".equals(name)) {
serialNumber = value;
} else {
- int intValue = -1;
+ int intValue;
int radix = 10;
if (value != null && value.length() > 2 && value.charAt(0) == '0' &&
(value.charAt(1) == 'x' || value.charAt(1) == 'X')) {
@@ -388,9 +388,9 @@
(filter.mSerialNumber != null &&
mSerialNumber != null &&
!mSerialNumber.equals(filter.mSerialNumber))) {
- return(false);
+ return false;
}
- return(true);
+ return true;
}
if (obj instanceof UsbDevice) {
UsbDevice device = (UsbDevice)obj;
@@ -415,7 +415,7 @@
!mProductName.equals(device.getProductName())) ||
(device.getSerialNumber() != null &&
!mSerialNumber.equals(device.getSerialNumber()))) {
- return(false);
+ return false;
}
return true;
}
@@ -501,8 +501,7 @@
public boolean matches(UsbAccessory acc) {
if (mManufacturer != null && !acc.getManufacturer().equals(mManufacturer)) return false;
if (mModel != null && !acc.getModel().equals(mModel)) return false;
- if (mVersion != null && !acc.getVersion().equals(mVersion)) return false;
- return true;
+ return !(mVersion != null && !acc.getVersion().equals(mVersion));
}
/**
@@ -517,8 +516,7 @@
return false;
}
if (mModel != null && !Objects.equals(accessory.mModel, mModel)) return false;
- if (mVersion != null && !Objects.equals(accessory.mVersion, mVersion)) return false;
- return true;
+ return !(mVersion != null && !Objects.equals(accessory.mVersion, mVersion));
}
@Override
@@ -624,13 +622,8 @@
mPackageMonitor.register(context, null, UserHandle.ALL, true);
mMtpNotificationManager = new MtpNotificationManager(
parentUserContext,
- new MtpNotificationManager.OnOpenInAppListener() {
- @Override
- public void onOpenInApp(UsbDevice device) {
- resolveActivity(createDeviceAttachedIntent(device),
- device, false /* showMtpNotification */);
- }
- });
+ device -> resolveActivity(createDeviceAttachedIntent(device),
+ device, false /* showMtpNotification */));
}
/**
@@ -727,9 +720,7 @@
XmlUtils.nextElement(parser);
}
}
- } catch (IOException e) {
- Log.wtf(TAG, "Failed to read single-user settings", e);
- } catch (XmlPullParserException e) {
+ } catch (IOException | XmlPullParserException e) {
Log.wtf(TAG, "Failed to read single-user settings", e);
} finally {
IoUtils.closeQuietly(fis);
@@ -1015,8 +1006,8 @@
}
}
- private final ArrayList<ResolveInfo> getDeviceMatchesLocked(UsbDevice device, Intent intent) {
- ArrayList<ResolveInfo> matches = new ArrayList<ResolveInfo>();
+ private ArrayList<ResolveInfo> getDeviceMatchesLocked(UsbDevice device, Intent intent) {
+ ArrayList<ResolveInfo> matches = new ArrayList<>();
List<ResolveInfo> resolveInfos = queryIntentActivitiesForAllProfiles(intent);
int count = resolveInfos.size();
for (int i = 0; i < count; i++) {
@@ -1029,9 +1020,9 @@
return removeForwardIntentIfNotNeeded(preferHighPriority(matches));
}
- private final ArrayList<ResolveInfo> getAccessoryMatchesLocked(
+ private ArrayList<ResolveInfo> getAccessoryMatchesLocked(
UsbAccessory accessory, Intent intent) {
- ArrayList<ResolveInfo> matches = new ArrayList<ResolveInfo>();
+ ArrayList<ResolveInfo> matches = new ArrayList<>();
List<ResolveInfo> resolveInfos = queryIntentActivitiesForAllProfiles(intent);
int count = resolveInfos.size();
for (int i = 0; i < count; i++) {
@@ -1402,7 +1393,7 @@
void setDevicePackage(@NonNull UsbDevice device, @Nullable String packageName,
@NonNull UserHandle user) {
DeviceFilter filter = new DeviceFilter(device);
- boolean changed = false;
+ boolean changed;
synchronized (mLock) {
if (packageName == null) {
changed = (mDevicePreferenceMap.remove(filter) != null);
@@ -1430,7 +1421,7 @@
void setAccessoryPackage(@NonNull UsbAccessory accessory, @Nullable String packageName,
@NonNull UserHandle user) {
AccessoryFilter filter = new AccessoryFilter(accessory);
- boolean changed = false;
+ boolean changed;
synchronized (mLock) {
if (packageName == null) {
changed = (mAccessoryPreferenceMap.remove(filter) != null);
@@ -1460,8 +1451,7 @@
UserPackage userPackage = new UserPackage(packageName, user);
synchronized (mLock) {
if (mDevicePreferenceMap.values().contains(userPackage)) return true;
- if (mAccessoryPreferenceMap.values().contains(userPackage)) return true;
- return false;
+ return mAccessoryPreferenceMap.values().contains(userPackage);
}
}
@@ -1493,9 +1483,9 @@
synchronized (mLock) {
if (mDevicePreferenceMap.containsValue(userPackage)) {
// make a copy of the key set to avoid ConcurrentModificationException
- Object[] keys = mDevicePreferenceMap.keySet().toArray();
+ DeviceFilter[] keys = mDevicePreferenceMap.keySet().toArray(new DeviceFilter[0]);
for (int i = 0; i < keys.length; i++) {
- Object key = keys[i];
+ DeviceFilter key = keys[i];
if (userPackage.equals(mDevicePreferenceMap.get(key))) {
mDevicePreferenceMap.remove(key);
cleared = true;
@@ -1504,9 +1494,10 @@
}
if (mAccessoryPreferenceMap.containsValue(userPackage)) {
// make a copy of the key set to avoid ConcurrentModificationException
- Object[] keys = mAccessoryPreferenceMap.keySet().toArray();
+ AccessoryFilter[] keys =
+ mAccessoryPreferenceMap.keySet().toArray(new AccessoryFilter[0]);
for (int i = 0; i < keys.length; i++) {
- Object key = keys[i];
+ AccessoryFilter key = keys[i];
if (userPackage.equals(mAccessoryPreferenceMap.get(key))) {
mAccessoryPreferenceMap.remove(key);
cleared = true;
diff --git a/services/usb/java/com/android/server/usb/UsbService.java b/services/usb/java/com/android/server/usb/UsbService.java
index 61e1e8f..e4fcea7 100644
--- a/services/usb/java/com/android/server/usb/UsbService.java
+++ b/services/usb/java/com/android/server/usb/UsbService.java
@@ -134,25 +134,25 @@
onSwitchUser(UserHandle.USER_SYSTEM);
+ BroadcastReceiver receiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ final String action = intent.getAction();
+ if (DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED
+ .equals(action)) {
+ if (mDeviceManager != null) {
+ mDeviceManager.updateUserRestrictions();
+ }
+ }
+ }
+ };
+
final IntentFilter filter = new IntentFilter();
filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED);
- mContext.registerReceiver(mReceiver, filter, null, null);
+ mContext.registerReceiver(receiver, filter, null, null);
}
- private BroadcastReceiver mReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- final String action = intent.getAction();
- if (DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED
- .equals(action)) {
- if (mDeviceManager != null) {
- mDeviceManager.updateUserRestrictions();
- }
- }
- }
- };
-
/**
* Set new {@link #mCurrentUserId} and propagate it to other modules.
*
@@ -681,7 +681,7 @@
}
}
- private static final String removeLastChar(String value) {
+ private static String removeLastChar(String value) {
return value.substring(0, value.length() - 1);
}
}
diff --git a/services/usb/java/com/android/server/usb/UsbSettingsManager.java b/services/usb/java/com/android/server/usb/UsbSettingsManager.java
index 7a55be4..c7e5998d 100644
--- a/services/usb/java/com/android/server/usb/UsbSettingsManager.java
+++ b/services/usb/java/com/android/server/usb/UsbSettingsManager.java
@@ -28,6 +28,7 @@
import android.os.UserManager;
import android.util.Slog;
import android.util.SparseArray;
+
import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.IndentingPrintWriter;
diff --git a/services/usb/java/com/android/server/usb/UsbUserSettingsManager.java b/services/usb/java/com/android/server/usb/UsbUserSettingsManager.java
index 4a34ece..96c5211 100644
--- a/services/usb/java/com/android/server/usb/UsbUserSettingsManager.java
+++ b/services/usb/java/com/android/server/usb/UsbUserSettingsManager.java
@@ -32,6 +32,7 @@
import android.os.UserHandle;
import android.util.Slog;
import android.util.SparseBooleanArray;
+
import com.android.internal.util.IndentingPrintWriter;
import java.util.HashMap;
@@ -48,10 +49,10 @@
// Temporary mapping USB device name to list of UIDs with permissions for the device
private final HashMap<String, SparseBooleanArray> mDevicePermissionMap =
- new HashMap<String, SparseBooleanArray>();
+ new HashMap<>();
// Temporary mapping UsbAccessory to list of UIDs with permissions for the accessory
private final HashMap<UsbAccessory, SparseBooleanArray> mAccessoryPermissionMap =
- new HashMap<UsbAccessory, SparseBooleanArray>();
+ new HashMap<>();
private final Object mLock = new Object();
diff --git a/telecomm/java/android/telecom/Call.java b/telecomm/java/android/telecom/Call.java
index e8e0680..c1289d3 100644
--- a/telecomm/java/android/telecom/Call.java
+++ b/telecomm/java/android/telecom/Call.java
@@ -19,7 +19,6 @@
import android.annotation.IntDef;
import android.annotation.Nullable;
import android.annotation.SystemApi;
-import android.annotation.TestApi;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
@@ -1090,17 +1089,12 @@
* @return A string containing text sent by the remote user, or {@code null} if the
* conversation has been terminated or if there was an error while reading.
*/
- public String read() {
- try {
- int numRead = mReceiveStream.read(mReadBuffer, 0, READ_BUFFER_SIZE);
- if (numRead < 0) {
- return null;
- }
- return new String(mReadBuffer, 0, numRead);
- } catch (IOException e) {
- Log.w(this, "Exception encountered when reading from InputStreamReader: %s", e);
+ public String read() throws IOException {
+ int numRead = mReceiveStream.read(mReadBuffer, 0, READ_BUFFER_SIZE);
+ if (numRead < 0) {
+ return null;
}
- return null;
+ return new String(mReadBuffer, 0, numRead);
}
/**
@@ -1108,9 +1102,7 @@
* be read.
* @return A string containing text entered by the user, or {@code null} if the user has
* not entered any new text yet.
- * @hide
*/
- @TestApi
public String readImmediately() throws IOException {
if (mReceiveStream.ready()) {
return read();
diff --git a/telecomm/java/android/telecom/Log.java b/telecomm/java/android/telecom/Log.java
index de20538..3361b5b 100644
--- a/telecomm/java/android/telecom/Log.java
+++ b/telecomm/java/android/telecom/Log.java
@@ -56,7 +56,7 @@
public static boolean ERROR = isLoggable(android.util.Log.ERROR);
private static final boolean FORCE_LOGGING = false; /* STOP SHIP if true */
- private static final boolean USER_BUILD = Build.TYPE.equals("user");
+ private static final boolean USER_BUILD = Build.IS_USER;
// Used to synchronize singleton logging lazy initialization
private static final Object sSingletonSync = new Object();
diff --git a/telecomm/java/android/telecom/Logging/EventManager.java b/telecomm/java/android/telecom/Logging/EventManager.java
index fddbfce..4fc3385 100644
--- a/telecomm/java/android/telecom/Logging/EventManager.java
+++ b/telecomm/java/android/telecom/Logging/EventManager.java
@@ -36,6 +36,7 @@
import java.util.List;
import java.util.Locale;
import java.util.Map;
+import java.util.TimeZone;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.stream.Collectors;
@@ -268,6 +269,7 @@
public EventManager(@NonNull SessionManager.ISessionIdQueryHandler l) {
mSessionIdHandler = l;
+ sDateFormat.setTimeZone(TimeZone.getDefault());
}
public void event(Loggable recordEntry, String event, Object data) {
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index 3821b9c..0001d42 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -26,6 +26,7 @@
import android.os.PersistableBundle;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.service.carrier.CarrierService;
import com.android.ims.ImsReasonInfo;
import com.android.internal.telephony.ICarrierConfigLoader;
@@ -262,6 +263,17 @@
"config_ims_package_override_string";
/**
+ * Override the package that will manage {@link SubscriptionPlan}
+ * information instead of the {@link CarrierService} that defines this
+ * value.
+ *
+ * @see SubscriptionManager#getSubscriptionPlans(int)
+ * @see SubscriptionManager#setSubscriptionPlans(int, java.util.List)
+ */
+ public static final String KEY_CONFIG_PLANS_PACKAGE_OVERRIDE_STRING =
+ "config_plans_package_override_string";
+
+ /**
* Override the platform's notion of a network operator being considered roaming.
* Value is string array of SIDs to be considered roaming for 3GPP2 RATs.
*/
@@ -1379,12 +1391,16 @@
/**
* The day of the month (1-31) on which the data cycle rolls over.
* <p>
- * If the current month does not have this day, the cycle will roll over at the start of the
- * next month.
+ * If the current month does not have this day, the cycle will roll over at
+ * the start of the next month.
* <p>
- * This setting may be still overridden by explicit user choice. By default, the platform value
- * will be used.
+ * This setting may be still overridden by explicit user choice. By default,
+ * the platform value will be used.
+ *
+ * @deprecated replaced by
+ * {@link SubscriptionManager#setSubscriptionPlans(int, java.util.List)}
*/
+ @Deprecated
public static final String KEY_MONTHLY_DATA_CYCLE_DAY_INT =
"monthly_data_cycle_day_int";
@@ -1395,6 +1411,7 @@
*
* @hide
*/
+ @Deprecated
public static final int DATA_CYCLE_USE_PLATFORM_DEFAULT = -1;
/**
@@ -1408,6 +1425,7 @@
* default data limit, if one exists, will be disabled. A user selected data limit will not be
* overridden.
*/
+ @Deprecated
public static final int DATA_CYCLE_THRESHOLD_DISABLED = -2;
/**
@@ -1420,7 +1438,11 @@
* <p>
* This setting may be overridden by explicit user choice. By default, the platform value
* will be used.
+ *
+ * @deprecated replaced by
+ * {@link SubscriptionManager#setSubscriptionPlans(int, java.util.List)}
*/
+ @Deprecated
public static final String KEY_DATA_WARNING_THRESHOLD_BYTES_LONG =
"data_warning_threshold_bytes_long";
@@ -1434,7 +1456,11 @@
* <p>
* This setting may be overridden by explicit user choice. By default, the platform value
* will be used.
+ *
+ * @deprecated replaced by
+ * {@link SubscriptionManager#setSubscriptionPlans(int, java.util.List)}
*/
+ @Deprecated
public static final String KEY_DATA_LIMIT_THRESHOLD_BYTES_LONG =
"data_limit_threshold_bytes_long";
@@ -1462,6 +1488,30 @@
"disable_voice_barring_notification_bool";
/**
+ * List of operators considered non-roaming which won't show roaming icon.
+ * <p>
+ * Can use mcc or mcc+mnc as item. For example, 302 or 21407.
+ * If operators, 21404 and 21407, make roaming agreements, users of 21404 should not see
+ * the roaming icon as using 21407 network.
+ * @hide
+ */
+ public static final String KEY_NON_ROAMING_OPERATOR_STRING_ARRAY =
+ "non_roaming_operator_string_array";
+
+ /**
+ * List of operators considered roaming with the roaming icon.
+ * <p>
+ * Can use mcc or mcc+mnc as item. For example, 302 or 21407.
+ * If operators, 21404 and 21407, make roaming agreements, users of 21404 should see
+ * the roaming icon as using 21407 network.
+ * <p>
+ * A match on this supersedes a match on {@link #KEY_NON_ROAMING_OPERATOR_STRING_ARRAY}.
+ * @hide
+ */
+ public static final String KEY_ROAMING_OPERATOR_STRING_ARRAY =
+ "roaming_operator_string_array";
+
+ /**
* URL from which the proto containing the public key of the Carrier used for
* IMSI encryption will be downloaded.
* @hide
@@ -1742,6 +1792,8 @@
sDefaults.putString(IMSI_KEY_DOWNLOAD_URL_STRING, null);
sDefaults.putBoolean(KEY_CONVERT_CDMA_CALLER_ID_MMI_CODES_WHILE_ROAMING_ON_3GPP_BOOL,
false);
+ sDefaults.putStringArray(KEY_NON_ROAMING_OPERATOR_STRING_ARRAY, null);
+ sDefaults.putStringArray(KEY_ROAMING_OPERATOR_STRING_ARRAY, null);
}
/**
@@ -1840,6 +1892,15 @@
}
}
+ /** {@hide} */
+ public String getDefaultCarrierServicePackageName() {
+ try {
+ return getICarrierConfigLoader().getDefaultCarrierServicePackageName();
+ } catch (Throwable t) {
+ return null;
+ }
+ }
+
/**
* Returns a new bundle with the default value for every supported configuration variable.
*
diff --git a/telephony/java/android/telephony/MbmsDownloadManager.java b/telephony/java/android/telephony/MbmsDownloadManager.java
index a9ec299..c747b84 100644
--- a/telephony/java/android/telephony/MbmsDownloadManager.java
+++ b/telephony/java/android/telephony/MbmsDownloadManager.java
@@ -16,19 +16,35 @@
package android.telephony;
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
+import android.content.ServiceConnection;
+import android.content.SharedPreferences;
+import android.content.pm.ResolveInfo;
import android.net.Uri;
+import android.os.IBinder;
import android.os.RemoteException;
-import android.telephony.mbms.IDownloadCallback;
+import android.telephony.mbms.FileInfo;
import android.telephony.mbms.DownloadRequest;
-import android.telephony.mbms.DownloadStatus;
+import android.telephony.mbms.IDownloadProgressListener;
import android.telephony.mbms.IMbmsDownloadManagerCallback;
+import android.telephony.mbms.MbmsDownloadManagerCallback;
+import android.telephony.mbms.MbmsDownloadReceiver;
import android.telephony.mbms.MbmsException;
+import android.telephony.mbms.MbmsTempFileProvider;
+import android.telephony.mbms.MbmsUtils;
import android.telephony.mbms.vendor.IMbmsDownloadService;
import android.util.Log;
+import java.io.File;
+import java.io.IOException;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.List;
+import java.util.concurrent.atomic.AtomicReference;
import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
@@ -36,11 +52,13 @@
public class MbmsDownloadManager {
private static final String LOG_TAG = MbmsDownloadManager.class.getSimpleName();
+ public static final String MBMS_DOWNLOAD_SERVICE_ACTION =
+ "android.telephony.action.EmbmsDownload";
/**
* The MBMS middleware should send this when a download of single file has completed or
* failed. Mandatory extras are
* {@link #EXTRA_RESULT}
- * {@link #EXTRA_INFO}
+ * {@link #EXTRA_FILE_INFO}
* {@link #EXTRA_REQUEST}
* {@link #EXTRA_TEMP_LIST}
* {@link #EXTRA_FINAL_URI}
@@ -76,21 +94,23 @@
"android.telephony.mbms.action.CLEANUP";
/**
- * Integer extra indicating the result code of the download.
- * TODO: put in link to error list
- * TODO: future systemapi (here and and all extras)
+ * Integer extra indicating the result code of the download. One of
+ * {@link #RESULT_SUCCESSFUL}, {@link #RESULT_EXPIRED}, or {@link #RESULT_CANCELLED}.
+ * TODO: Not systemapi.
*/
public static final String EXTRA_RESULT = "android.telephony.mbms.extra.RESULT";
/**
* Extra containing the {@link android.telephony.mbms.FileInfo} for which the download result
* is for. Must not be null.
+ * TODO: Not systemapi.
*/
- public static final String EXTRA_INFO = "android.telephony.mbms.extra.INFO";
+ public static final String EXTRA_FILE_INFO = "android.telephony.mbms.extra.FILE_INFO";
/**
* Extra containing the {@link DownloadRequest} for which the download result or file
* descriptor request is for. Must not be null.
+ * TODO: future systemapi (here and and all extras) except the three for the app intent
*/
public static final String EXTRA_REQUEST = "android.telephony.mbms.extra.REQUEST";
@@ -137,191 +157,487 @@
"android.telephony.mbms.extra.PAUSED_URI_LIST";
/**
+ * Extra containing a string that points to the middleware's knowledge of where the temp file
+ * root for the app is. The path should be a canonical path as returned by
+ * {@link File#getCanonicalPath()}
+ */
+ public static final String EXTRA_TEMP_FILE_ROOT =
+ "android.telephony.mbms.extra.TEMP_FILE_ROOT";
+
+ /**
* Extra containing a list of {@link Uri}s indicating temp files which the middleware is
* still using.
*/
public static final String EXTRA_TEMP_FILES_IN_USE =
"android.telephony.mbms.extra.TEMP_FILES_IN_USE";
+ /**
+ * Extra containing an instance of {@link android.telephony.mbms.ServiceInfo}, used by
+ * file-descriptor requests and cleanup requests to specify which service they want to
+ * request temp files or clean up temp files for, respectively.
+ */
+ public static final String EXTRA_SERVICE_INFO =
+ "android.telephony.mbms.extra.SERVICE_INFO";
+
+ /**
+ * Extra containing a single {@link Uri} indicating the location of the successfully
+ * downloaded file. Set on the intent provided via
+ * {@link android.telephony.mbms.DownloadRequest.Builder#setAppIntent(Intent)}.
+ * Will always be set to a non-null value if {@link #EXTRA_RESULT} is set to
+ * {@link #RESULT_SUCCESSFUL}.
+ * TODO: Not systemapi.
+ */
+ public static final String EXTRA_COMPLETED_FILE_URI =
+ "android.telephony.mbms.extra.COMPLETED_FILE_URI";
+
public static final int RESULT_SUCCESSFUL = 1;
public static final int RESULT_CANCELLED = 2;
public static final int RESULT_EXPIRED = 3;
// TODO - more results!
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({STATUS_UNKNOWN, STATUS_ACTIVELY_DOWNLOADING, STATUS_PENDING_DOWNLOAD,
+ STATUS_PENDING_REPAIR, STATUS_PENDING_DOWNLOAD_WINDOW})
+ public @interface DownloadStatus {}
+
+ public static final int STATUS_UNKNOWN = 0;
+ public static final int STATUS_ACTIVELY_DOWNLOADING = 1;
+ public static final int STATUS_PENDING_DOWNLOAD = 2;
+ public static final int STATUS_PENDING_REPAIR = 3;
+ public static final int STATUS_PENDING_DOWNLOAD_WINDOW = 4;
+
private final Context mContext;
- private int mSubId = INVALID_SUBSCRIPTION_ID;
+ private int mSubscriptionId = INVALID_SUBSCRIPTION_ID;
- private IMbmsDownloadService mService;
+ private AtomicReference<IMbmsDownloadService> mService = new AtomicReference<>(null);
private final IMbmsDownloadManagerCallback mCallback;
- private final String mDownloadAppName;
- private MbmsDownloadManager(Context context, IMbmsDownloadManagerCallback callback,
- String downloadAppName, int subId) {
+ private MbmsDownloadManager(Context context, IMbmsDownloadManagerCallback callback, int subId) {
mContext = context;
mCallback = callback;
- mDownloadAppName = downloadAppName;
- mSubId = subId;
+ mSubscriptionId = subId;
}
/**
* Create a new MbmsDownloadManager using the system default data subscription ID.
- *
- * Note that this call will bind a remote service and that may take a bit. This
- * may throw an Illegal ArgumentException or RemoteException.
+ * See {@link #create(Context, IMbmsDownloadManagerCallback, int)}
*
* @hide
*/
- public static MbmsDownloadManager createManager(Context context,
- IMbmsDownloadManagerCallback listener, String downloadAppName)
+ public static MbmsDownloadManager create(Context context,
+ IMbmsDownloadManagerCallback listener)
throws MbmsException {
- MbmsDownloadManager mdm = new MbmsDownloadManager(context, listener, downloadAppName,
- SubscriptionManager.getDefaultSubscriptionId());
- mdm.bindAndInitialize();
- return mdm;
+ return create(context, listener, SubscriptionManager.getDefaultSubscriptionId());
}
/**
* Create a new MbmsDownloadManager using the given subscription ID.
*
- * Note that this call will bind a remote service and that may take a bit. This
- * may throw an Illegal ArgumentException or RemoteException.
+ * Note that this call will bind a remote service and that may take a bit. The instance of
+ * {@link MbmsDownloadManager} that is returned will not be ready for use until
+ * {@link IMbmsDownloadManagerCallback#middlewareReady()} is called on the provided callback.
+ * If you attempt to use the manager before it is ready, a {@link MbmsException} will be thrown.
*
+ * This also may throw an {@link IllegalArgumentException} or a {@link MbmsException}.
+ *
+ * @param context The instance of {@link Context} to use
+ * @param listener A callback to get asynchronous error messages and file service updates.
+ * @param subscriptionId The data subscription ID to use
* @hide
*/
-
- public static MbmsDownloadManager createManager(Context context,
- IMbmsDownloadManagerCallback listener, String downloadAppName, int subId)
+ public static MbmsDownloadManager create(Context context,
+ IMbmsDownloadManagerCallback listener, int subscriptionId)
throws MbmsException {
- MbmsDownloadManager mdm = new MbmsDownloadManager(context, listener, downloadAppName,
- subId);
+ MbmsDownloadManager mdm = new MbmsDownloadManager(context, listener, subscriptionId);
mdm.bindAndInitialize();
return mdm;
}
private void bindAndInitialize() throws MbmsException {
- // TODO: bind
+ MbmsUtils.startBinding(mContext, MBMS_DOWNLOAD_SERVICE_ACTION,
+ new ServiceConnection() {
+ @Override
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ IMbmsDownloadService downloadService =
+ IMbmsDownloadService.Stub.asInterface(service);
+ try {
+ downloadService.initialize(mSubscriptionId, mCallback);
+ } catch (RemoteException e) {
+ Log.e(LOG_TAG, "Service died before initialization");
+ return;
+ }
+ mService.set(downloadService);
+ }
+
+ @Override
+ public void onServiceDisconnected(ComponentName name) {
+ mService.set(null);
+ }
+ });
+ }
+
+ /**
+ * An inspection API to retrieve the list of available
+ * {@link android.telephony.mbms.FileServiceInfo}s currently being advertised.
+ * The results are returned asynchronously via a call to
+ * {@link IMbmsDownloadManagerCallback#fileServicesUpdated(List)}
+ *
+ * The serviceClasses argument lets the app filter on types of programming and is opaque data
+ * negotiated beforehand between the app and the carrier.
+ *
+ * This may throw an {@link MbmsException} containing one of the following errors:
+ * {@link MbmsException#ERROR_MIDDLEWARE_NOT_BOUND}
+ * {@link MbmsException#ERROR_MIDDLEWARE_LOST}
+ *
+ * Asynchronous error codes via the {@link MbmsDownloadManagerCallback#error(int, String)}
+ * callback can include any of the errors except:
+ * {@link MbmsException.StreamingErrors#ERROR_UNABLE_TO_START_SERVICE}
+ *
+ * @param classList A list of service classes which the app wishes to receive
+ * {@link IMbmsDownloadManagerCallback#fileServicesUpdated(List)} callbacks
+ * about. Subsequent calls to this method will replace this list of service
+ * classes (i.e. the middleware will no longer send updates for services
+ * matching classes only in the old list).
+ */
+ public void getFileServices(List<String> classList) throws MbmsException {
+ IMbmsDownloadService downloadService = mService.get();
+ if (downloadService == null) {
+ throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_NOT_BOUND);
+ }
try {
- mService.initialize(mDownloadAppName, mSubId, mCallback);
+ int returnCode = downloadService.getFileServices(mSubscriptionId, classList);
+ if (returnCode != MbmsException.SUCCESS) {
+ throw new MbmsException(returnCode);
+ }
} catch (RemoteException e) {
- throw new MbmsException(0); // TODO: proper error code
+ Log.w(LOG_TAG, "Remote process died");
+ mService.set(null);
+ throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST);
}
}
/**
- * Gets the list of files published for download.
- * They may occur at times far in the future.
- * servicesClasses lets the app filter on types of files and is opaque data between
- * the app and the carrier
+ * Sets the temp file root for downloads.
+ * All temp files created for the middleware to write to will be contained in the specified
+ * directory. Applications that wish to specify a location only need to call this method once
+ * as long their data is persisted in storage -- the argument will be stored both in a
+ * local instance of {@link android.content.SharedPreferences} and by the middleware.
*
- * Multiple calls replace trhe list of serviceClasses of interest.
+ * If this method is not called at least once before calling
+ * {@link #download(DownloadRequest, IDownloadCallback)}, the framework
+ * will default to a directory formed by the concatenation of the app's files directory and
+ * {@link android.telephony.mbms.MbmsTempFileProvider#DEFAULT_TOP_LEVEL_TEMP_DIRECTORY}.
*
- * May throw an IllegalArgumentException or RemoteException.
+ * Before calling this method, the app must cancel all of its pending
+ * {@link DownloadRequest}s via {@link #cancelDownload(DownloadRequest)}. If this is not done,
+ * an {@link MbmsException} will be thrown with code
+ * {@link MbmsException.DownloadErrors#ERROR_CANNOT_CHANGE_TEMP_FILE_ROOT}
*
- * Synchronous responses include
- * <li>SUCCESS</li>
- * <li>ERROR_MSDC_CONCURRENT_SERVICE_LIMIT_REACHED</li>
- *
- * Asynchronous errors through the listener include any of the errors except
- * <li>ERROR_MSDC_UNABLE_TO_)START_SERVICE</li>
- * <li>ERROR_MSDC_INVALID_SERVICE_ID</li>
- * <li>ERROR_MSDC_END_OF_SESSION</li>
+ * The {@link File} supplied as a root temp file directory must already exist. If not, an
+ * {@link IllegalArgumentException} will be thrown.
+ * @param tempFileRootDirectory A directory to place temp files in.
*/
- public int getFileServices(List<String> serviceClasses) {
- return 0;
+ public void setTempFileRootDirectory(@NonNull File tempFileRootDirectory)
+ throws MbmsException {
+ IMbmsDownloadService downloadService = mService.get();
+ if (downloadService == null) {
+ throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_NOT_BOUND);
+ }
+ if (!tempFileRootDirectory.exists()) {
+ throw new IllegalArgumentException("Provided directory does not exist");
+ }
+ if (!tempFileRootDirectory.isDirectory()) {
+ throw new IllegalArgumentException("Provided File is not a directory");
+ }
+ String filePath;
+ try {
+ filePath = tempFileRootDirectory.getCanonicalPath();
+ } catch (IOException e) {
+ throw new IllegalArgumentException("Unable to canonicalize the provided path: " + e);
+ }
+
+ try {
+ int result = downloadService.setTempFileRootDirectory(mSubscriptionId, filePath);
+ if (result != MbmsException.SUCCESS) {
+ throw new MbmsException(result);
+ }
+ } catch (RemoteException e) {
+ mService.set(null);
+ throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST);
+ }
+
+ SharedPreferences prefs = mContext.getSharedPreferences(
+ MbmsTempFileProvider.TEMP_FILE_ROOT_PREF_FILE_NAME, 0);
+ prefs.edit().putString(MbmsTempFileProvider.TEMP_FILE_ROOT_PREF_NAME, filePath).apply();
}
-
/**
- * Requests a future download.
- * returns a token which may be used to cancel a download.
+ * Requests a download of a file that is available via multicast.
+ *
* downloadListener is an optional callback object which can be used to get progress reports
* of a currently occuring download. Note this can only run while the calling app
* is running, so future downloads will simply result in resultIntents being sent
* for completed or errored-out downloads. A NULL indicates no callbacks are needed.
*
- * May throw an IllegalArgumentException or RemoteExcpetion.
+ * May throw an {@link IllegalArgumentException}
+ *
+ * If {@link #setTempFileRootDirectory(File)} has not called after the app has been installed,
+ * this method will create a directory at the default location defined at
+ * {@link MbmsTempFileProvider#DEFAULT_TOP_LEVEL_TEMP_DIRECTORY} and store that as the temp
+ * file root directory.
*
* Asynchronous errors through the listener include any of the errors
+ *
+ * @param request The request that specifies what should be downloaded
+ * @param progressListener Optional listener that will be provided progress updates
+ * if the app is running.
*/
- public DownloadRequest download(DownloadRequest request, IDownloadCallback listener) {
- request.setAppName(mDownloadAppName);
- return request;
+ public void download(DownloadRequest request, IDownloadProgressListener progressListener)
+ throws MbmsException {
+ IMbmsDownloadService downloadService = mService.get();
+ if (downloadService == null) {
+ throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_NOT_BOUND);
+ }
+
+ // Check to see whether the app's set a temp root dir yet, and set it if not.
+ SharedPreferences prefs = mContext.getSharedPreferences(
+ MbmsTempFileProvider.TEMP_FILE_ROOT_PREF_FILE_NAME, 0);
+ if (prefs.getString(MbmsTempFileProvider.TEMP_FILE_ROOT_PREF_NAME, null) == null) {
+ File tempRootDirectory = new File(mContext.getFilesDir(),
+ MbmsTempFileProvider.DEFAULT_TOP_LEVEL_TEMP_DIRECTORY);
+ tempRootDirectory.mkdirs();
+ setTempFileRootDirectory(tempRootDirectory);
+ }
+
+ checkValidDownloadDestination(request);
+ writeDownloadRequestToken(request);
+ try {
+ downloadService.download(request, progressListener);
+ } catch (RemoteException e) {
+ mService.set(null);
+ throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST);
+ }
}
/**
- * Returns a list DownloadRequests that originated from this application (UID).
- *
- * May throw a RemoteException.
- *
- * Asynchronous errors through the listener include any of the errors except
- * <li>ERROR_UNABLED_TO_START_SERVICE</li>
- * <li>ERROR_MSDC_INVALID_SERVICE_ID</li>
- * <li>ERROR_MSDC_END_OF_SESSION</li>
+ * Returns a list of pending {@link DownloadRequest}s that originated from this application.
+ * A pending request is one that was issued via
+ * {@link #download(DownloadRequest, IDownloadCallback)} but not cancelled through
+ * {@link #cancelDownload(DownloadRequest)}.
+ * @return A list, possibly empty, of {@link DownloadRequest}s
*/
- public List<DownloadRequest> listPendingDownloads() {
- return null;
+ public @NonNull List<DownloadRequest> listPendingDownloads() throws MbmsException {
+ IMbmsDownloadService downloadService = mService.get();
+ if (downloadService == null) {
+ throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_NOT_BOUND);
+ }
+
+ try {
+ return downloadService.listPendingDownloads(mSubscriptionId);
+ } catch (RemoteException e) {
+ mService.set(null);
+ throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST);
+ }
}
/**
- * Attempts to cancel the specified DownloadRequest.
+ * Attempts to cancel the specified {@link DownloadRequest}.
*
- * May throw a RemoteException.
+ * If the middleware is not aware of the specified download request, an MbmsException will be
+ * thrown with error code {@link MbmsException.DownloadErrors#ERROR_UNKNOWN_DOWNLOAD_REQUEST}.
*
- * Synchronous responses may include
- * <li>SUCCESS</li>
- * <li>ERROR_MSDC_CONCURRENT_SERVICE_LIMIT_REACHED</li>
- * <li>ERROR_MSDC_UNKNOWN_REQUEST</li>
+ * If this method returns without throwing an exception, you may assume that cancellation
+ * was successful.
+ * @param downloadRequest The download request that you wish to cancel.
*/
- public int cancelDownload(DownloadRequest downloadRequest) {
- return 0;
+ public void cancelDownload(DownloadRequest downloadRequest) throws MbmsException {
+ IMbmsDownloadService downloadService = mService.get();
+ if (downloadService == null) {
+ throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_NOT_BOUND);
+ }
+
+ try {
+ int result = downloadService.cancelDownload(downloadRequest);
+ if (result != MbmsException.SUCCESS) {
+ throw new MbmsException(result);
+ }
+ } catch (RemoteException e) {
+ mService.set(null);
+ throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST);
+ }
+ deleteDownloadRequestToken(downloadRequest);
}
/**
- * Gets information about current and known upcoming downloads.
+ * Gets information about the status of a file pending download.
*
- * Current is a straightforward count of the files being downloaded "now"
- * for some definition of now (may be racey).
- * Future downloads include counts of files with pending repair operations, counts of
- * files with future downloads and indication of scheduled download times with unknown
- * file details.
+ * If the middleware has not yet been properly initialized or if it has no records of the
+ * file indicated by {@code fileInfo} being associated with {@code downloadRequest},
+ * {@link #STATUS_UNKNOWN} will be returned.
*
- * May throw an IllegalArgumentException or RemoteException.
- *
- * If the DownloadRequest is unknown the results will be null.
+ * @param downloadRequest The download request to query.
+ * @param fileInfo The particular file within the request to get information on.
+ * @return The status of the download.
*/
- public DownloadStatus getDownloadStatus(DownloadRequest downloadRequest) {
- return null;
+ @DownloadStatus
+ public int getDownloadStatus(DownloadRequest downloadRequest, FileInfo fileInfo)
+ throws MbmsException {
+ IMbmsDownloadService downloadService = mService.get();
+ if (downloadService == null) {
+ throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_NOT_BOUND);
+ }
+
+ try {
+ return downloadService.getDownloadStatus(downloadRequest, fileInfo);
+ } catch (RemoteException e) {
+ mService.set(null);
+ throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST);
+ }
}
/**
- * Resets middleware knowledge regarding this download request.
+ * Resets the middleware's knowledge of previously-downloaded files in this download request.
*
- * This state consists of knowledge of what files have already been downloaded.
- * Normally the middleware won't download files who's hash matches previously downloaded
- * content, even if that content has since been deleted. If this function is called
- * repeated content will be downloaded again when available. This does not interrupt
- * in-progress downloads.
+ * Normally, the middleware keeps track of the hashes of downloaded files and won't re-download
+ * files whose server-reported hash matches one of the already-downloaded files. This means
+ * that if the file is accidentally deleted by the user or by the app, the middleware will
+ * not try to download it again.
+ * This method will reset the middleware's cache of hashes for the provided
+ * {@link DownloadRequest}, so that previously downloaded content will be downloaded again
+ * when available.
+ * This will not interrupt in-progress downloads.
*
- * May throw an IllegalArgumentException or RemoteException.
+ * If the middleware is not aware of the specified download request, an MbmsException will be
+ * thrown with error code {@link MbmsException.DownloadErrors#ERROR_UNKNOWN_DOWNLOAD_REQUEST}.
*
- * <li>SUCCESS</li>
- * <li>ERROR_MSDC_CONCURRENT_SERVICE_LIMIT_REACHED</li>
- * <li>ERROR_MSDC_UNKNOWN_REQUEST</li>
+ * May throw a {@link MbmsException} with error code
+ * @param downloadRequest The request to re-download files for.
*/
- public int resetDownloadKnowledge(DownloadRequest downloadRequest) {
- return 0;
+ public void resetDownloadKnowledge(DownloadRequest downloadRequest) throws MbmsException {
+ IMbmsDownloadService downloadService = mService.get();
+ if (downloadService == null) {
+ throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_NOT_BOUND);
+ }
+
+ try {
+ int result = downloadService.resetDownloadKnowledge(downloadRequest);
+ if (result != MbmsException.SUCCESS) {
+ throw new MbmsException(result);
+ }
+ } catch (RemoteException e) {
+ mService.set(null);
+ throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST);
+ }
}
public void dispose() {
try {
- if (mService != null) {
- mService.dispose(mDownloadAppName, mSubId);
- } else {
+ IMbmsDownloadService downloadService = mService.get();
+ if (downloadService == null) {
Log.i(LOG_TAG, "Service already dead");
+ return;
}
+ downloadService.dispose(mSubscriptionId);
+ mService.set(null);
} catch (RemoteException e) {
// Ignore
Log.i(LOG_TAG, "Remote exception while disposing of service");
}
}
+
+ /**
+ * Retrieves the {@link ComponentName} for the {@link android.content.BroadcastReceiver} that
+ * the various intents from the middleware should be targeted towards.
+ * @param uid The uid of the frontend app.
+ * @return The component name of the receiver that the middleware should send its intents to,
+ * or null if the app didn't declare it in the manifest.
+ *
+ * @hide
+ * future systemapi
+ */
+ public static ComponentName getAppReceiverFromUid(Context context, int uid) {
+ String[] packageNames = context.getPackageManager().getPackagesForUid(uid);
+ if (packageNames == null) {
+ return null;
+ }
+
+ for (String packageName : packageNames) {
+ ComponentName candidate = new ComponentName(packageName,
+ MbmsDownloadReceiver.class.getCanonicalName());
+ Intent queryIntent = new Intent();
+ queryIntent.setComponent(candidate);
+ List<ResolveInfo> receivers =
+ context.getPackageManager().queryBroadcastReceivers(queryIntent, 0);
+ if (receivers != null && receivers.size() > 0) {
+ return candidate;
+ }
+ }
+ return null;
+ }
+
+ private void writeDownloadRequestToken(DownloadRequest request) {
+ File token = getDownloadRequestTokenPath(request);
+ if (!token.getParentFile().exists()) {
+ token.getParentFile().mkdirs();
+ }
+ if (token.exists()) {
+ Log.w(LOG_TAG, "Download token " + token.getName() + " already exists");
+ return;
+ }
+ try {
+ if (!token.createNewFile()) {
+ throw new RuntimeException("Failed to create download token for request "
+ + request);
+ }
+ } catch (IOException e) {
+ throw new RuntimeException("Failed to create download token for request " + request
+ + " due to IOException " + e);
+ }
+ }
+
+ private void deleteDownloadRequestToken(DownloadRequest request) {
+ File token = getDownloadRequestTokenPath(request);
+ if (!token.isFile()) {
+ Log.w(LOG_TAG, "Attempting to delete non-existent download token at " + token);
+ return;
+ }
+ if (!token.delete()) {
+ Log.w(LOG_TAG, "Couldn't delete download token at " + token);
+ }
+ }
+
+ private File getDownloadRequestTokenPath(DownloadRequest request) {
+ File tempFileLocation = MbmsUtils.getEmbmsTempFileDirForService(mContext,
+ request.getFileServiceId());
+ String downloadTokenFileName = request.getHash()
+ + MbmsDownloadReceiver.DOWNLOAD_TOKEN_SUFFIX;
+ return new File(tempFileLocation, downloadTokenFileName);
+ }
+
+ /**
+ * Verifies the following:
+ * If a request is multi-part,
+ * 1. Destination Uri must exist and be a directory
+ * 2. Directory specified must contain no files.
+ * Otherwise
+ * 1. The file specified by the destination Uri must not exist.
+ */
+ private void checkValidDownloadDestination(DownloadRequest request) {
+ File toFile = new File(request.getDestinationUri().getSchemeSpecificPart());
+ if (request.isMultipartDownload()) {
+ if (!toFile.isDirectory()) {
+ throw new IllegalArgumentException("Multipart download must specify valid " +
+ "destination directory.");
+ }
+ if (toFile.listFiles().length > 0) {
+ throw new IllegalArgumentException("Destination directory must be clear of all " +
+ "files.");
+ }
+ } else {
+ if (toFile.exists()) {
+ throw new IllegalArgumentException("Destination file must not exist.");
+ }
+ }
+ }
}
diff --git a/telephony/java/android/telephony/MbmsStreamingManager.java b/telephony/java/android/telephony/MbmsStreamingManager.java
index e90a63c..5b3503a 100644
--- a/telephony/java/android/telephony/MbmsStreamingManager.java
+++ b/telephony/java/android/telephony/MbmsStreamingManager.java
@@ -18,77 +18,42 @@
import android.content.ComponentName;
import android.content.Context;
-import android.content.Intent;
import android.content.ServiceConnection;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.os.DeadObjectException;
import android.os.IBinder;
import android.os.RemoteException;
import android.telephony.mbms.MbmsException;
import android.telephony.mbms.MbmsStreamingManagerCallback;
+import android.telephony.mbms.MbmsUtils;
import android.telephony.mbms.StreamingService;
import android.telephony.mbms.StreamingServiceCallback;
import android.telephony.mbms.StreamingServiceInfo;
import android.telephony.mbms.vendor.IMbmsStreamingService;
import android.util.Log;
-import java.util.LinkedList;
import java.util.List;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
-/** @hide */
+/**
+ * This class provides functionality for streaming media over MBMS.
+ * @hide
+ */
public class MbmsStreamingManager {
- private interface ServiceListener {
- void onServiceConnected();
- void onServiceDisconnected();
- }
-
private static final String LOG_TAG = "MbmsStreamingManager";
public static final String MBMS_STREAMING_SERVICE_ACTION =
"android.telephony.action.EmbmsStreaming";
- private static final boolean DEBUG = true;
- private static final int BIND_TIMEOUT_MS = 3000;
-
- private IMbmsStreamingService mService;
- private ServiceConnection mServiceConnection = new ServiceConnection() {
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- if (service != null) {
- Log.i(LOG_TAG, String.format("Connected to service %s", name));
- synchronized (MbmsStreamingManager.this) {
- mService = IMbmsStreamingService.Stub.asInterface(service);
- mServiceListeners.forEach(ServiceListener::onServiceConnected);
- }
- }
- }
-
- @Override
- public void onServiceDisconnected(ComponentName name) {
- Log.i(LOG_TAG, String.format("Disconnected from service %s", name));
- synchronized (MbmsStreamingManager.this) {
- mService = null;
- mServiceListeners.forEach(ServiceListener::onServiceDisconnected);
- }
- }
- };
- private List<ServiceListener> mServiceListeners = new LinkedList<>();
-
+ private AtomicReference<IMbmsStreamingService> mService = new AtomicReference<>(null);
private MbmsStreamingManagerCallback mCallbackToApp;
- private final String mAppName;
private final Context mContext;
private int mSubscriptionId = INVALID_SUBSCRIPTION_ID;
/** @hide */
private MbmsStreamingManager(Context context, MbmsStreamingManagerCallback listener,
- String streamingAppName, int subscriptionId) {
+ int subscriptionId) {
mContext = context;
- mAppName = streamingAppName;
mCallbackToApp = listener;
mSubscriptionId = subscriptionId;
}
@@ -103,47 +68,44 @@
* @param context The {@link Context} to use.
* @param listener A callback object on which you wish to receive results of asynchronous
* operations.
- * @param streamingAppName The name of the streaming app, as specified by the carrier.
* @param subscriptionId The subscription ID to use.
*/
public static MbmsStreamingManager create(Context context,
- MbmsStreamingManagerCallback listener, String streamingAppName, int subscriptionId)
+ MbmsStreamingManagerCallback listener, int subscriptionId)
throws MbmsException {
- MbmsStreamingManager manager = new MbmsStreamingManager(context, listener,
- streamingAppName, subscriptionId);
+ MbmsStreamingManager manager = new MbmsStreamingManager(context, listener, subscriptionId);
manager.bindAndInitialize();
return manager;
}
/**
* Create a new MbmsStreamingManager using the system default data subscription ID.
- * See {@link #create(Context, MbmsStreamingManagerCallback, String, int)}.
+ * See {@link #create(Context, MbmsStreamingManagerCallback, int)}.
*/
public static MbmsStreamingManager create(Context context,
- MbmsStreamingManagerCallback listener, String streamingAppName)
+ MbmsStreamingManagerCallback listener)
throws MbmsException {
- int subId = SubscriptionManager.getDefaultSubscriptionId();
- MbmsStreamingManager manager = new MbmsStreamingManager(context, listener,
- streamingAppName, subId);
- manager.bindAndInitialize();
- return manager;
+ return create(context, listener, SubscriptionManager.getDefaultSubscriptionId());
}
/**
* Terminates this instance, ending calls to the registered listener. Also terminates
* any streaming services spawned from this instance.
+ *
+ * May throw an {@link IllegalStateException}
*/
- public synchronized void dispose() {
- if (mService == null) {
+ public void dispose() {
+ IMbmsStreamingService streamingService = mService.get();
+ if (streamingService == null) {
// Ignore and return, assume already disposed.
return;
}
try {
- mService.dispose(mAppName, mSubscriptionId);
+ streamingService.dispose(mSubscriptionId);
} catch (RemoteException e) {
// Ignore for now
}
- mService = null;
+ mService.set(null);
}
/**
@@ -154,29 +116,30 @@
*
* Multiple calls replace the list of serviceClasses of interest.
*
- * This may throw an {@link MbmsException} containing one of the following errors:
- * {@link MbmsException#ERROR_MIDDLEWARE_NOT_BOUND}
- * {@link MbmsException#ERROR_CONCURRENT_SERVICE_LIMIT_REACHED}
- * {@link MbmsException#ERROR_SERVICE_LOST}
+ * This may throw an {@link MbmsException} containing any error in
+ * {@link android.telephony.mbms.MbmsException.GeneralErrors},
+ * {@link MbmsException#ERROR_MIDDLEWARE_NOT_BOUND}, or
+ * {@link MbmsException#ERROR_MIDDLEWARE_LOST}.
*
- * Asynchronous error codes via the {@link MbmsStreamingManagerCallback#error(int, String)}
- * callback can include any of the errors except:
- * {@link MbmsException#ERROR_UNABLE_TO_START_SERVICE}
- * {@link MbmsException#ERROR_END_OF_SESSION}
+ * May also throw an unchecked {@link IllegalArgumentException} or an
+ * {@link IllegalStateException}
+ *
+ * @param classList A list of streaming service classes that the app would like updates on.
*/
public void getStreamingServices(List<String> classList) throws MbmsException {
- if (mService == null) {
+ IMbmsStreamingService streamingService = mService.get();
+ if (streamingService == null) {
throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_NOT_BOUND);
}
try {
- int returnCode = mService.getStreamingServices(mAppName, mSubscriptionId, classList);
+ int returnCode = streamingService.getStreamingServices(mSubscriptionId, classList);
if (returnCode != MbmsException.SUCCESS) {
throw new MbmsException(returnCode);
}
} catch (RemoteException e) {
Log.w(LOG_TAG, "Remote process died");
- mService = null;
- throw new MbmsException(MbmsException.ERROR_SERVICE_LOST);
+ mService.set(null);
+ throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST);
}
}
@@ -184,112 +147,67 @@
* Starts streaming a requested service, reporting status to the indicated listener.
* Returns an object used to control that stream. The stream may not be ready for consumption
* immediately upon return from this method -- wait until the streaming state has been
- * reported via {@link android.telephony.mbms.StreamingServiceCallback#streamStateChanged(int)}.
+ * reported via
+ * {@link android.telephony.mbms.StreamingServiceCallback#streamStateUpdated(int, int)}
*
- * May throw an {@link MbmsException} containing any of the following error codes:
- * {@link MbmsException#ERROR_MIDDLEWARE_NOT_BOUND}
- * {@link MbmsException#ERROR_CONCURRENT_SERVICE_LIMIT_REACHED}
- * {@link MbmsException#ERROR_SERVICE_LOST}
+ * May throw an
+ * {@link MbmsException} containing any of the error codes in
+ * {@link android.telephony.mbms.MbmsException.GeneralErrors},
+ * {@link MbmsException#ERROR_MIDDLEWARE_NOT_BOUND}, or
+ * {@link MbmsException#ERROR_MIDDLEWARE_LOST}.
*
* May also throw an {@link IllegalArgumentException} or an {@link IllegalStateException}
*
- * Asynchronous errors through the listener include any of the errors
+ * Asynchronous errors through the listener include any of the errors in
+ * {@link android.telephony.mbms.MbmsException.GeneralErrors} or
+ * {@link android.telephony.mbms.MbmsException.StreamingErrors}.
+ *
+ * @param serviceInfo The information about the service to stream.
+ * @param listener A listener that'll be called when something about the stream changes.
+ * @return An instance of {@link StreamingService} through which the stream can be controlled.
*/
public StreamingService startStreaming(StreamingServiceInfo serviceInfo,
StreamingServiceCallback listener) throws MbmsException {
- if (mService == null) {
+ IMbmsStreamingService streamingService = mService.get();
+ if (streamingService == null) {
throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_NOT_BOUND);
}
try {
- int returnCode = mService.startStreaming(
- mAppName, mSubscriptionId, serviceInfo.getServiceId(), listener);
+ int returnCode = streamingService.startStreaming(
+ mSubscriptionId, serviceInfo.getServiceId(), listener);
if (returnCode != MbmsException.SUCCESS) {
throw new MbmsException(returnCode);
}
} catch (RemoteException e) {
Log.w(LOG_TAG, "Remote process died");
- mService = null;
- throw new MbmsException(MbmsException.ERROR_SERVICE_LOST);
+ mService.set(null);
+ throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST);
}
- return new StreamingService(
- mAppName, mSubscriptionId, mService, serviceInfo, listener);
+ return new StreamingService(mSubscriptionId, streamingService, serviceInfo, listener);
}
private void bindAndInitialize() throws MbmsException {
- // Query for the proper service
- PackageManager packageManager = mContext.getPackageManager();
- Intent queryIntent = new Intent();
- queryIntent.setAction(MBMS_STREAMING_SERVICE_ACTION);
- List<ResolveInfo> streamingServices = packageManager.queryIntentServices(queryIntent,
- PackageManager.MATCH_SYSTEM_ONLY);
+ MbmsUtils.startBinding(mContext, MBMS_STREAMING_SERVICE_ACTION,
+ new ServiceConnection() {
+ @Override
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ IMbmsStreamingService streamingService =
+ IMbmsStreamingService.Stub.asInterface(service);
+ try {
+ streamingService.initialize(mCallbackToApp, mSubscriptionId);
+ } catch (RemoteException e) {
+ Log.e(LOG_TAG, "Service died before initialization");
+ return;
+ }
+ mService.set(streamingService);
+ }
- if (streamingServices == null || streamingServices.size() == 0) {
- throw new MbmsException(
- MbmsException.ERROR_NO_SERVICE_INSTALLED);
- }
- if (streamingServices.size() > 1) {
- throw new MbmsException(
- MbmsException.ERROR_MULTIPLE_SERVICES_INSTALLED);
- }
-
- // Kick off the binding, and synchronously wait until binding is complete
- final CountDownLatch latch = new CountDownLatch(1);
- ServiceListener bindListener = new ServiceListener() {
- @Override
- public void onServiceConnected() {
- latch.countDown();
- }
-
- @Override
- public void onServiceDisconnected() {
- }
- };
-
- synchronized (this) {
- mServiceListeners.add(bindListener);
- }
-
- Intent bindIntent = new Intent();
- bindIntent.setComponent(streamingServices.get(0).getComponentInfo().getComponentName());
-
- mContext.bindService(bindIntent, mServiceConnection, Context.BIND_AUTO_CREATE);
-
- waitOnLatchWithTimeout(latch, BIND_TIMEOUT_MS);
-
- // Remove the listener and call the initialization method through the interface.
- synchronized (this) {
- mServiceListeners.remove(bindListener);
-
- if (mService == null) {
- throw new MbmsException(MbmsException.ERROR_BIND_TIMEOUT_OR_FAILURE);
- }
-
- try {
- int returnCode = mService.initialize(mCallbackToApp, mAppName, mSubscriptionId);
- if (returnCode != MbmsException.SUCCESS) {
- throw new MbmsException(returnCode);
- }
- } catch (RemoteException e) {
- mService = null;
- Log.e(LOG_TAG, "Service died before initialization");
- throw new MbmsException(MbmsException.ERROR_SERVICE_LOST);
- }
- }
- }
-
- private static void waitOnLatchWithTimeout(CountDownLatch l, long timeoutMs) {
- long endTime = System.currentTimeMillis() + timeoutMs;
- while (System.currentTimeMillis() < endTime) {
- try {
- l.await(timeoutMs, TimeUnit.MILLISECONDS);
- } catch (InterruptedException e) {
- // keep waiting
- }
- if (l.getCount() <= 0) {
- return;
- }
- }
+ @Override
+ public void onServiceDisconnected(ComponentName name) {
+ mService.set(null);
+ }
+ });
}
}
diff --git a/telephony/java/android/telephony/Rlog.java b/telephony/java/android/telephony/Rlog.java
index 2a31e3a..e0b46e1 100644
--- a/telephony/java/android/telephony/Rlog.java
+++ b/telephony/java/android/telephony/Rlog.java
@@ -33,7 +33,7 @@
*/
public final class Rlog {
- private static final boolean USER_BUILD = Build.TYPE.equals("user");
+ private static final boolean USER_BUILD = Build.IS_USER;
private Rlog() {
}
diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java
index 0d1764b..503bf82 100644
--- a/telephony/java/android/telephony/SubscriptionManager.java
+++ b/telephony/java/android/telephony/SubscriptionManager.java
@@ -18,12 +18,13 @@
import android.annotation.NonNull;
import android.annotation.SdkConstant;
-import android.annotation.SystemService;
import android.annotation.SdkConstant.SdkConstantType;
+import android.annotation.SystemService;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Resources;
+import android.net.INetworkPolicyManager;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
@@ -37,6 +38,7 @@
import com.android.internal.telephony.PhoneConstants;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
/**
@@ -1539,4 +1541,57 @@
}
return false;
}
+
+ /**
+ * Get the description of the billing relationship plan between a carrier
+ * and a specific subscriber.
+ * <p>
+ * This method is only accessible to the following narrow set of apps:
+ * <ul>
+ * <li>The carrier app for this subscriberId, as determined by
+ * {@link TelephonyManager#hasCarrierPrivileges(int)}.
+ * <li>The carrier app explicitly delegated access through
+ * {@link CarrierConfigManager#KEY_CONFIG_PLANS_PACKAGE_OVERRIDE_STRING}.
+ * </ul>
+ *
+ * @param subId the subscriber this relationship applies to
+ */
+ public @NonNull List<SubscriptionPlan> getSubscriptionPlans(int subId) {
+ final INetworkPolicyManager npm = INetworkPolicyManager.Stub
+ .asInterface(ServiceManager.getService(Context.NETWORK_POLICY_SERVICE));
+ try {
+ return Arrays.asList(npm.getSubscriptionPlans(subId,
+ mContext.getOpPackageName()));
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Set the description of the billing relationship plan between a carrier
+ * and a specific subscriber.
+ * <p>
+ * This method is only accessible to the following narrow set of apps:
+ * <ul>
+ * <li>The carrier app for this subscriberId, as determined by
+ * {@link TelephonyManager#hasCarrierPrivileges(int)}.
+ * <li>The carrier app explicitly delegated access through
+ * {@link CarrierConfigManager#KEY_CONFIG_PLANS_PACKAGE_OVERRIDE_STRING}.
+ * </ul>
+ *
+ * @param subId the subscriber this relationship applies to
+ * @param plans the list of plans. The first plan is always the primary and
+ * most important plan. Any additional plans are secondary and
+ * may not be displayed or used by decision making logic.
+ */
+ public void setSubscriptionPlans(int subId, @NonNull List<SubscriptionPlan> plans) {
+ final INetworkPolicyManager npm = INetworkPolicyManager.Stub
+ .asInterface(ServiceManager.getService(Context.NETWORK_POLICY_SERVICE));
+ try {
+ npm.setSubscriptionPlans(subId, plans.toArray(new SubscriptionPlan[plans.size()]),
+ mContext.getOpPackageName());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
}
diff --git a/telephony/java/android/telephony/SubscriptionPlan.aidl b/telephony/java/android/telephony/SubscriptionPlan.aidl
new file mode 100755
index 0000000..655df3a
--- /dev/null
+++ b/telephony/java/android/telephony/SubscriptionPlan.aidl
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2017 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.telephony;
+
+parcelable SubscriptionPlan;
diff --git a/telephony/java/android/telephony/SubscriptionPlan.java b/telephony/java/android/telephony/SubscriptionPlan.java
new file mode 100644
index 0000000..c9419c5
--- /dev/null
+++ b/telephony/java/android/telephony/SubscriptionPlan.java
@@ -0,0 +1,298 @@
+/*
+ * Copyright (C) 2017 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.telephony;
+
+import android.annotation.BytesLong;
+import android.annotation.CurrentTimeMillisLong;
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.util.Pair;
+import android.util.RecurrenceRule;
+
+import com.android.internal.util.Preconditions;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.time.Period;
+import java.time.ZonedDateTime;
+import java.util.Iterator;
+
+/**
+ * Description of a billing relationship plan between a carrier and a specific
+ * subscriber. This information is used to present more useful UI to users, such
+ * as explaining how much mobile data they have remaining, and what will happen
+ * when they run out.
+ *
+ * @see SubscriptionManager#setSubscriptionPlans(int, java.util.List)
+ * @see SubscriptionManager#getSubscriptionPlans(int)
+ */
+public final class SubscriptionPlan implements Parcelable {
+ /** {@hide} */
+ @IntDef(prefix = "LIMIT_BEHAVIOR_", value = {
+ LIMIT_BEHAVIOR_UNKNOWN,
+ LIMIT_BEHAVIOR_DISABLED,
+ LIMIT_BEHAVIOR_BILLED,
+ LIMIT_BEHAVIOR_THROTTLED,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface LimitBehavior {}
+
+ /** When a resource limit is hit, the behavior is unknown. */
+ public static final int LIMIT_BEHAVIOR_UNKNOWN = -1;
+ /** When a resource limit is hit, access is disabled. */
+ public static final int LIMIT_BEHAVIOR_DISABLED = 0;
+ /** When a resource limit is hit, the user is billed automatically. */
+ public static final int LIMIT_BEHAVIOR_BILLED = 1;
+ /** When a resource limit is hit, access is throttled to a slower rate. */
+ public static final int LIMIT_BEHAVIOR_THROTTLED = 2;
+
+ /** Value indicating a number of bytes is unknown. */
+ public static final long BYTES_UNKNOWN = -1;
+ /** Value indicating a number of bytes is unlimited. */
+ public static final long BYTES_UNLIMITED = Long.MAX_VALUE;
+
+ /** Value indicating a timestamp is unknown. */
+ public static final long TIME_UNKNOWN = -1;
+
+ private final RecurrenceRule cycleRule;
+ private CharSequence title;
+ private CharSequence summary;
+ private long dataLimitBytes = BYTES_UNKNOWN;
+ private int dataLimitBehavior = LIMIT_BEHAVIOR_UNKNOWN;
+ private long dataUsageBytes = BYTES_UNKNOWN;
+ private long dataUsageTime = TIME_UNKNOWN;
+
+ private SubscriptionPlan(RecurrenceRule cycleRule) {
+ this.cycleRule = Preconditions.checkNotNull(cycleRule);
+ }
+
+ private SubscriptionPlan(Parcel source) {
+ cycleRule = source.readParcelable(null);
+ title = source.readCharSequence();
+ summary = source.readCharSequence();
+ dataLimitBytes = source.readLong();
+ dataLimitBehavior = source.readInt();
+ dataUsageBytes = source.readLong();
+ dataUsageTime = source.readLong();
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeParcelable(cycleRule, flags);
+ dest.writeCharSequence(title);
+ dest.writeCharSequence(summary);
+ dest.writeLong(dataLimitBytes);
+ dest.writeInt(dataLimitBehavior);
+ dest.writeLong(dataUsageBytes);
+ dest.writeLong(dataUsageTime);
+ }
+
+ @Override
+ public String toString() {
+ return new StringBuilder("SubscriptionPlan{")
+ .append("cycleRule=").append(cycleRule)
+ .append(" title=").append(title)
+ .append(" summary=").append(summary)
+ .append(" dataLimitBytes=").append(dataLimitBytes)
+ .append(" dataLimitBehavior=").append(dataLimitBehavior)
+ .append(" dataUsageBytes=").append(dataUsageBytes)
+ .append(" dataUsageTime=").append(dataUsageTime)
+ .append("}").toString();
+ }
+
+ public static final Parcelable.Creator<SubscriptionPlan> CREATOR = new Parcelable.Creator<SubscriptionPlan>() {
+ @Override
+ public SubscriptionPlan createFromParcel(Parcel source) {
+ return new SubscriptionPlan(source);
+ }
+
+ @Override
+ public SubscriptionPlan[] newArray(int size) {
+ return new SubscriptionPlan[size];
+ }
+ };
+
+ /** {@hide} */
+ public @NonNull RecurrenceRule getCycleRule() {
+ return cycleRule;
+ }
+
+ /** Return the short title of this plan. */
+ public @Nullable CharSequence getTitle() {
+ return title;
+ }
+
+ /** Return the short summary of this plan. */
+ public @Nullable CharSequence getSummary() {
+ return summary;
+ }
+
+ /**
+ * Return the usage threshold at which data access changes according to
+ * {@link #getDataLimitBehavior()}.
+ */
+ public @BytesLong long getDataLimitBytes() {
+ return dataLimitBytes;
+ }
+
+ /**
+ * Return the behavior of data access when usage reaches
+ * {@link #getDataLimitBytes()}.
+ */
+ public @LimitBehavior int getDataLimitBehavior() {
+ return dataLimitBehavior;
+ }
+
+ /**
+ * Return a snapshot of currently known mobile data usage at
+ * {@link #getDataUsageTime()}.
+ */
+ public @BytesLong long getDataUsageBytes() {
+ return dataUsageBytes;
+ }
+
+ /**
+ * Return the time at which {@link #getDataUsageBytes()} was valid.
+ */
+ public @CurrentTimeMillisLong long getDataUsageTime() {
+ return dataUsageTime;
+ }
+
+ /**
+ * Return an iterator that will return all valid data usage cycles based on
+ * any recurrence rules. The iterator starts from the currently active cycle
+ * and walks backwards through time.
+ */
+ public Iterator<Pair<ZonedDateTime, ZonedDateTime>> cycleIterator() {
+ return cycleRule.cycleIterator();
+ }
+
+ /**
+ * Builder for a {@link SubscriptionPlan}.
+ */
+ public static class Builder {
+ private final SubscriptionPlan plan;
+
+ /** {@hide} */
+ public Builder(ZonedDateTime start, ZonedDateTime end, Period period) {
+ plan = new SubscriptionPlan(new RecurrenceRule(start, end, period));
+ }
+
+ /**
+ * Start defining a {@link SubscriptionPlan} that covers a very specific
+ * window of time, and never automatically recurs.
+ */
+ public static Builder createNonrecurring(ZonedDateTime start, ZonedDateTime end) {
+ if (!end.isAfter(start)) {
+ throw new IllegalArgumentException(
+ "End " + end + " isn't after start " + start);
+ }
+ return new Builder(start, end, null);
+ }
+
+ /**
+ * Start defining a {@link SubscriptionPlan} that will recur
+ * automatically every month. It will always recur on the same day of a
+ * particular month. When a particular month ends before the defined
+ * recurrence day, the plan will recur on the last instant of that
+ * month.
+ */
+ public static Builder createRecurringMonthly(ZonedDateTime start) {
+ return new Builder(start, null, Period.ofMonths(1));
+ }
+
+ /**
+ * Start defining a {@link SubscriptionPlan} that will recur
+ * automatically every week.
+ */
+ public static Builder createRecurringWeekly(ZonedDateTime start) {
+ return new Builder(start, null, Period.ofDays(7));
+ }
+
+ /**
+ * Start defining a {@link SubscriptionPlan} that will recur
+ * automatically every day.
+ */
+ public static Builder createRecurringDaily(ZonedDateTime start) {
+ return new Builder(start, null, Period.ofDays(1));
+ }
+
+ public SubscriptionPlan build() {
+ return plan;
+ }
+
+ /** Set the short title of this plan. */
+ public Builder setTitle(@Nullable CharSequence title) {
+ plan.title = title;
+ return this;
+ }
+
+ /** Set the short summary of this plan. */
+ public Builder setSummary(@Nullable CharSequence summary) {
+ plan.summary = summary;
+ return this;
+ }
+
+ /**
+ * Set the usage threshold at which data access changes.
+ *
+ * @param dataLimitBytes the usage threshold at which data access
+ * changes
+ * @param dataLimitBehavior the behavior of data access when usage
+ * reaches the threshold
+ */
+ public Builder setDataLimit(@BytesLong long dataLimitBytes,
+ @LimitBehavior int dataLimitBehavior) {
+ if (dataLimitBytes < 0) {
+ throw new IllegalArgumentException("Limit bytes must be positive");
+ }
+ if (dataLimitBehavior < 0) {
+ throw new IllegalArgumentException("Limit behavior must be defined");
+ }
+ plan.dataLimitBytes = dataLimitBytes;
+ plan.dataLimitBehavior = dataLimitBehavior;
+ return this;
+ }
+
+ /**
+ * Set a snapshot of currently known mobile data usage.
+ *
+ * @param dataUsageBytes the currently known mobile data usage
+ * @param dataUsageTime the time at which this snapshot was valid
+ */
+ public Builder setDataUsage(@BytesLong long dataUsageBytes,
+ @CurrentTimeMillisLong long dataUsageTime) {
+ if (dataUsageBytes < 0) {
+ throw new IllegalArgumentException("Usage bytes must be positive");
+ }
+ if (dataUsageTime < 0) {
+ throw new IllegalArgumentException("Usage time must be positive");
+ }
+ plan.dataUsageBytes = dataUsageBytes;
+ plan.dataUsageTime = dataUsageTime;
+ return this;
+ }
+ }
+}
diff --git a/telephony/java/android/telephony/Telephony.java b/telephony/java/android/telephony/Telephony.java
index e64e815..216d28c 100644
--- a/telephony/java/android/telephony/Telephony.java
+++ b/telephony/java/android/telephony/Telephony.java
@@ -1176,6 +1176,29 @@
}
/**
+ * Base column for the table that contain Carrier Public key.
+ * @hide
+ */
+ public interface CarrierColumns extends BaseColumns {
+
+ public static final String MCC = "mcc";
+ public static final String MNC = "mnc";
+ public static final String KEY_TYPE = "key_type";
+ public static final String MVNO_TYPE = "mvno_type";
+ public static final String MVNO_MATCH_DATA = "mvno_match_data";
+ public static final String PUBLIC_KEY = "public_key";
+ public static final String KEY_IDENTIFIER = "key_identifier";
+ public static final String EXPIRATION_TIME = "expiration_time";
+ public static final String LAST_MODIFIED = "last_modified";
+
+ /**
+ * The {@code content://} style URL for this table.
+ * @hide
+ */
+ public static final Uri CONTENT_URI = Uri.parse("content://carrier_information/carrier");
+ }
+
+ /**
* Base columns for tables that contain MMSs.
*/
public interface BaseMmsColumns extends BaseColumns {
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index b5b32e4..2e7b19a 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -767,12 +767,15 @@
* The {@link #EXTRA_LAUNCH_VOICEMAIL_SETTINGS_INTENT} extra is a
* {@link android.app.PendingIntent} that will launch the voicemail settings. This extra is only
* available when the voicemail number is not set.
+ * The {@link #EXTRA_IS_REFRESH} extra indicates whether the notification is a refresh or a new
+ * notification.
*
* @see #EXTRA_PHONE_ACCOUNT_HANDLE
* @see #EXTRA_NOTIFICATION_COUNT
* @see #EXTRA_VOICEMAIL_NUMBER
* @see #EXTRA_CALL_VOICEMAIL_INTENT
* @see #EXTRA_LAUNCH_VOICEMAIL_SETTINGS_INTENT
+ * @see #EXTRA_IS_REFRESH
*/
public static final String ACTION_SHOW_VOICEMAIL_NOTIFICATION =
"android.telephony.action.SHOW_VOICEMAIL_NOTIFICATION";
@@ -811,6 +814,15 @@
"android.telephony.extra.LAUNCH_VOICEMAIL_SETTINGS_INTENT";
/**
+ * Boolean value representing whether the {@link
+ * TelephonyManager#ACTION_SHOW_VOICEMAIL_NOTIFICATION} is new or a refresh of an existing
+ * notification. Notification refresh happens after reboot or connectivity changes. The user has
+ * already been notified for the voicemail so it should not alert the user, and should not be
+ * shown again if the user has dismissed it.
+ */
+ public static final String EXTRA_IS_REFRESH = "android.telephony.extra.IS_REFRESH";
+
+ /**
* {@link android.telecom.Connection} event used to indicate that an IMS call has be
* successfully handed over from WIFI to LTE.
* <p>
diff --git a/telephony/java/android/telephony/mbms/DownloadCallback.java b/telephony/java/android/telephony/mbms/DownloadCallback.java
deleted file mode 100644
index 0c6fec4..0000000
--- a/telephony/java/android/telephony/mbms/DownloadCallback.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.telephony.mbms;
-
-/**
- * A optional listener class used by download clients to track progress.
- * @hide
- */
-public class DownloadCallback extends IDownloadCallback.Stub {
- /**
- * Gives process callbacks for a given DownloadRequest.
- * request indicates which download is being referenced.
- * fileInfo gives information about the file being downloaded. Note that
- * the request may result in many files being downloaded and the client
- * may not have been able to get a list of them in advance.
- * downloadSize is the final amount to be downloaded. This may be different
- * from the decoded final size, but is useful in gauging download progress.
- * currentSize is the amount currently downloaded.
- * decodedPercent is the percent from 0 to 100 of the file decoded. After the
- * download completes the contents needs to be processed. It is perhaps
- * uncompressed, transcoded and/or decrypted. Generally the download completes
- * before the decode is started, but that's not required.
- */
- public void progress(DownloadRequest request, FileInfo fileInfo,
- int downloadSize, int currentSize, int decodedPercent) {
- }
-}
diff --git a/telephony/java/android/telephony/mbms/DownloadProgressListener.java b/telephony/java/android/telephony/mbms/DownloadProgressListener.java
new file mode 100644
index 0000000..d6bd5dc
--- /dev/null
+++ b/telephony/java/android/telephony/mbms/DownloadProgressListener.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.telephony.mbms;
+
+/**
+ * A optional listener class used by download clients to track progress.
+ * @hide
+ */
+public class DownloadProgressListener extends IDownloadProgressListener.Stub {
+ /**
+ * Gives process callbacks for a given DownloadRequest.
+ * This is optionally specified when requesting a download and
+ * only lives while the app is running - it's unlikely to be useful for
+ * downloads far in the future.
+ *
+ * @param request a {@link DownloadRequest}, indicating which download is being referenced.
+ * @param fileInfo a {@link FileInfo} specifying the file to report progress on. Note that
+ * the request may result in many files being downloaded and the client
+ * may not have been able to get a list of them in advance.
+ * @param currentDownloadSize is the current amount downloaded.
+ * @param fullDownloadSize is the total number of bytes that make up the downloaded content.
+ * This may be different from the decoded final size, but is useful in gauging download
+ * progress.
+ * @param currentDecodedSize is the number of bytes that have been decoded.
+ * @param fullDecodedSize is the total number of bytes that make up the final decoded content.
+ */
+ public void progress(DownloadRequest request, FileInfo fileInfo,
+ int currentDownloadSize, int fullDownloadSize,
+ int currentDecodedSize, int fullDecodedSize) {
+ }
+}
diff --git a/telephony/java/android/telephony/mbms/DownloadRequest.java b/telephony/java/android/telephony/mbms/DownloadRequest.java
index f3ca058..01e0bbd 100644
--- a/telephony/java/android/telephony/mbms/DownloadRequest.java
+++ b/telephony/java/android/telephony/mbms/DownloadRequest.java
@@ -20,32 +20,74 @@
import android.net.Uri;
import android.os.Parcel;
import android.os.Parcelable;
+import android.util.Base64;
+import android.util.Log;
-import java.lang.IllegalStateException;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
import java.net.URISyntaxException;
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Objects;
/**
* A Parcelable class describing a pending Cell-Broadcast download request
* @hide
*/
public class DownloadRequest implements Parcelable {
+ // Version code used to keep token calculation consistent.
+ private static final int CURRENT_VERSION = 1;
+ private static final String LOG_TAG = "MbmsDownloadRequest";
+
+ /**
+ * Maximum permissible length for the app's download-completion intent, when serialized via
+ * {@link Intent#toUri(int)}.
+ */
+ public static final int MAX_APP_INTENT_SIZE = 50000;
+
+ /**
+ * Maximum permissible length for the app's destination path, when serialized via
+ * {@link Uri#toString()}.
+ */
+ public static final int MAX_DESTINATION_URI_SIZE = 50000;
+
/** @hide */
+ private static class OpaqueDataContainer implements Serializable {
+ private final String destinationUri;
+ private final String appIntent;
+ private final int version;
+
+ public OpaqueDataContainer(String destinationUri, String appIntent, int version) {
+ this.destinationUri = destinationUri;
+ this.appIntent = appIntent;
+ this.version = version;
+ }
+ }
+
public static class Builder {
- private int id;
- private FileServiceInfo serviceInfo;
+ private String fileServiceId;
private Uri source;
private Uri dest;
- private int sub;
+ private int subscriptionId;
private String appIntent;
- private String appName; // not the Android app Name, the embms app Name
+ private int version = CURRENT_VERSION;
- public Builder setId(int id) {
- this.id = id;
+ public Builder setServiceInfo(FileServiceInfo serviceInfo) {
+ fileServiceId = serviceInfo.getServiceId();
return this;
}
- public Builder setServiceInfo(FileServiceInfo serviceInfo) {
- this.serviceInfo = serviceInfo;
+ /**
+ * @hide
+ * TODO: systemapi
+ */
+ public Builder setServiceId(String serviceId) {
+ fileServiceId = serviceId;
return this;
}
@@ -55,43 +97,73 @@
}
public Builder setDest(Uri dest) {
+ if (dest.toString().length() > MAX_DESTINATION_URI_SIZE) {
+ throw new IllegalArgumentException("Destination uri must not exceed length " +
+ MAX_DESTINATION_URI_SIZE);
+ }
this.dest = dest;
return this;
}
- public Builder setSub(int sub) {
- this.sub = sub;
+ public Builder setSubscriptionId(int sub) {
+ this.subscriptionId = sub;
return this;
}
public Builder setAppIntent(Intent intent) {
this.appIntent = intent.toUri(0);
+ if (this.appIntent.length() > MAX_APP_INTENT_SIZE) {
+ throw new IllegalArgumentException("App intent must not exceed length " +
+ MAX_APP_INTENT_SIZE);
+ }
+ return this;
+ }
+
+ /**
+ * For use by middleware only
+ * TODO: systemapi
+ * @hide
+ */
+ public Builder setOpaqueData(byte[] data) {
+ try {
+ ObjectInputStream stream = new ObjectInputStream(new ByteArrayInputStream(data));
+ OpaqueDataContainer dataContainer = (OpaqueDataContainer) stream.readObject();
+ version = dataContainer.version;
+ appIntent = dataContainer.appIntent;
+ dest = Uri.parse(dataContainer.destinationUri);
+ } catch (IOException e) {
+ // Really should never happen
+ Log.e(LOG_TAG, "Got IOException trying to parse opaque data");
+ throw new IllegalArgumentException(e);
+ } catch (ClassNotFoundException e) {
+ Log.e(LOG_TAG, "Got ClassNotFoundException trying to parse opaque data");
+ throw new IllegalArgumentException(e);
+ }
return this;
}
public DownloadRequest build() {
- return new DownloadRequest(id, serviceInfo, source, dest, sub, appIntent, appName);
+ return new DownloadRequest(fileServiceId, source, dest,
+ subscriptionId, appIntent, version);
}
}
- private final int downloadId;
- private final FileServiceInfo fileServiceInfo;
+ private final String fileServiceId;
private final Uri sourceUri;
private final Uri destinationUri;
- private final int subId;
+ private final int subscriptionId;
private final String serializedResultIntentForApp;
- private String appName; // not the Android app Name, the embms app name
+ private final int version;
- private DownloadRequest(int id, FileServiceInfo serviceInfo,
+ private DownloadRequest(String fileServiceId,
Uri source, Uri dest,
- int sub, String appIntent, String name) {
- downloadId = id;
- fileServiceInfo = serviceInfo;
+ int sub, String appIntent, int version) {
+ this.fileServiceId = fileServiceId;
sourceUri = source;
destinationUri = dest;
- subId = sub;
+ subscriptionId = sub;
serializedResultIntentForApp = appIntent;
- appName = name;
+ this.version = version;
}
public static DownloadRequest copy(DownloadRequest other) {
@@ -99,23 +171,21 @@
}
private DownloadRequest(DownloadRequest dr) {
- downloadId = dr.downloadId;
- fileServiceInfo = dr.fileServiceInfo;
+ fileServiceId = dr.fileServiceId;
sourceUri = dr.sourceUri;
destinationUri = dr.destinationUri;
- subId = dr.subId;
+ subscriptionId = dr.subscriptionId;
serializedResultIntentForApp = dr.serializedResultIntentForApp;
- appName = dr.appName;
+ version = dr.version;
}
private DownloadRequest(Parcel in) {
- downloadId = in.readInt();
- fileServiceInfo = in.readParcelable(getClass().getClassLoader());
+ fileServiceId = in.readString();
sourceUri = in.readParcelable(getClass().getClassLoader());
destinationUri = in.readParcelable(getClass().getClassLoader());
- subId = in.readInt();
+ subscriptionId = in.readInt();
serializedResultIntentForApp = in.readString();
- appName = in.readString();
+ version = in.readInt();
}
public int describeContents() {
@@ -123,21 +193,16 @@
}
public void writeToParcel(Parcel out, int flags) {
- out.writeInt(downloadId);
- out.writeParcelable(fileServiceInfo, flags);
+ out.writeString(fileServiceId);
out.writeParcelable(sourceUri, flags);
out.writeParcelable(destinationUri, flags);
- out.writeInt(subId);
+ out.writeInt(subscriptionId);
out.writeString(serializedResultIntentForApp);
- out.writeString(appName);
+ out.writeInt(version);
}
- public int getDownloadId() {
- return downloadId;
- }
-
- public FileServiceInfo getFileServiceInfo() {
- return fileServiceInfo;
+ public String getFileServiceId() {
+ return fileServiceId;
}
public Uri getSourceUri() {
@@ -148,8 +213,8 @@
return destinationUri;
}
- public int getSubId() {
- return subId;
+ public int getSubscriptionId() {
+ return subscriptionId;
}
public Intent getIntentForApp() {
@@ -160,16 +225,29 @@
}
}
- /** @hide */
- public synchronized void setAppName(String newAppName) {
- if (appName != null) {
- throw new IllegalStateException("Attempting to reset appName");
+ /**
+ * @hide
+ * TODO: systemapi
+ */
+ public byte[] getOpaqueData() {
+ try {
+ ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+ ObjectOutputStream stream = new ObjectOutputStream(byteArrayOutputStream);
+ OpaqueDataContainer container = new OpaqueDataContainer(
+ destinationUri.toString(), serializedResultIntentForApp, version);
+ stream.writeObject(container);
+ stream.flush();
+ return byteArrayOutputStream.toByteArray();
+ } catch (IOException e) {
+ // Really should never happen
+ Log.e(LOG_TAG, "Got IOException trying to serialize opaque data");
+ return null;
}
- appName = newAppName;
}
- public String getAppName() {
- return appName;
+ /** @hide */
+ public int getVersion() {
+ return version;
}
public static final Parcelable.Creator<DownloadRequest> CREATOR =
@@ -181,4 +259,59 @@
return new DownloadRequest[size];
}
};
+
+ /**
+ * @hide
+ */
+ public boolean isMultipartDownload() {
+ // TODO: figure out what qualifies a request as a multipart download request.
+ return getSourceUri().getLastPathSegment() != null &&
+ getSourceUri().getLastPathSegment().contains("*");
+ }
+
+ /**
+ * Retrieves the hash string that should be used as the filename when storing a token for
+ * this DownloadRequest.
+ * @hide
+ */
+ public String getHash() {
+ MessageDigest digest;
+ try {
+ digest = MessageDigest.getInstance("SHA-256");
+ } catch (NoSuchAlgorithmException e) {
+ throw new RuntimeException("Could not get sha256 hash object");
+ }
+ if (version >= 1) {
+ // Hash the source URI, destination URI, and the app intent
+ digest.update(sourceUri.toString().getBytes(StandardCharsets.UTF_8));
+ digest.update(destinationUri.toString().getBytes(StandardCharsets.UTF_8));
+ digest.update(serializedResultIntentForApp.getBytes(StandardCharsets.UTF_8));
+ }
+ // Add updates for future versions here
+ return Base64.encodeToString(digest.digest(), Base64.URL_SAFE | Base64.NO_WRAP);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null) {
+ return false;
+ }
+ if (!(o instanceof DownloadRequest)) {
+ return false;
+ }
+ DownloadRequest request = (DownloadRequest) o;
+ return subscriptionId == request.subscriptionId &&
+ version == request.version &&
+ Objects.equals(fileServiceId, request.fileServiceId) &&
+ Objects.equals(sourceUri, request.sourceUri) &&
+ Objects.equals(destinationUri, request.destinationUri) &&
+ Objects.equals(serializedResultIntentForApp, request.serializedResultIntentForApp);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(fileServiceId, sourceUri, destinationUri,
+ subscriptionId, serializedResultIntentForApp, version);
+ }
}
diff --git a/telephony/java/android/telephony/mbms/DownloadStatus.aidl b/telephony/java/android/telephony/mbms/DownloadStatus.aidl
deleted file mode 100755
index e7cfd39..0000000
--- a/telephony/java/android/telephony/mbms/DownloadStatus.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
-** Copyright 2017, 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.telephony.mbms;
-
-parcelable DownloadStatus;
diff --git a/telephony/java/android/telephony/mbms/DownloadStatus.java b/telephony/java/android/telephony/mbms/DownloadStatus.java
deleted file mode 100644
index 90eb53f..0000000
--- a/telephony/java/android/telephony/mbms/DownloadStatus.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2017 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.telephony.mbms;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-
-/**
- * A Parcelable class describing the status of a Cell-Broadcast download request
- * @hide
- */
-public class DownloadStatus implements Parcelable {
- // includes downloads and active repair work
- public final int activelyDownloading;
-
- // files scheduled for future broadcast
- public final int pendingDownloads;
-
- // files scheduled for future repairs
- public final int pendingRepairs;
-
- // is a future download window scheduled with unknown
- // number of files
- public final boolean windowPending;
-
- public DownloadStatus(int downloading, int downloads, int repairs, boolean window) {
- activelyDownloading = downloading;
- pendingDownloads = downloads;
- pendingRepairs = repairs;
- windowPending = window;
- }
-
- public static final Parcelable.Creator<DownloadStatus> CREATOR =
- new Parcelable.Creator<DownloadStatus>() {
- @Override
- public DownloadStatus createFromParcel(Parcel in) {
- return new DownloadStatus(in);
- }
-
- @Override
- public DownloadStatus[] newArray(int size) {
- return new DownloadStatus[size];
- }
- };
-
- DownloadStatus(Parcel in) {
- activelyDownloading = in.readInt();
- pendingDownloads = in.readInt();
- pendingRepairs = in.readInt();
- windowPending = (in.readInt() == 1);
- }
-
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeInt(activelyDownloading);
- dest.writeInt(pendingDownloads);
- dest.writeInt(pendingRepairs);
- dest.writeInt((windowPending ? 1 : 0));
- }
-
- public int describeContents() {
- return 0;
- }
-}
diff --git a/telephony/java/android/telephony/mbms/FileInfo.java b/telephony/java/android/telephony/mbms/FileInfo.java
index d3888bd..1b87393 100644
--- a/telephony/java/android/telephony/mbms/FileInfo.java
+++ b/telephony/java/android/telephony/mbms/FileInfo.java
@@ -31,29 +31,22 @@
* This is used internally but is also one of the few pieces of data about the content that is
* exposed and may be needed for disambiguation by the application.
*/
- final Uri uri;
+ private final Uri uri;
/**
* The mime type of the content.
*/
- final String mimeType;
+ private final String mimeType;
/**
* The size of the file in bytes.
*/
- final long size;
+ private final long size;
/**
* The MD5 hash of the file.
*/
- final byte md5Hash[];
-
- /**
- * Gets the parent service for this file.
- */
- public FileServiceInfo getFileServiceInfo() {
- return null;
- }
+ private final byte md5Hash[];
public static final Parcelable.Creator<FileInfo> CREATOR =
new Parcelable.Creator<FileInfo>() {
@@ -68,6 +61,13 @@
}
};
+ public FileInfo(Uri uri, String mimeType, long size, byte[] md5Hash) {
+ this.uri = uri;
+ this.mimeType = mimeType;
+ this.size = size;
+ this.md5Hash = md5Hash;
+ }
+
private FileInfo(Parcel in) {
uri = in.readParcelable(null);
mimeType = in.readString();
@@ -90,4 +90,20 @@
public int describeContents() {
return 0;
}
+
+ public Uri getUri() {
+ return uri;
+ }
+
+ public String getMimeType() {
+ return mimeType;
+ }
+
+ public long getSize() {
+ return size;
+ }
+
+ public byte[] getMd5Hash() {
+ return md5Hash;
+ }
}
diff --git a/telephony/java/android/telephony/mbms/FileServiceInfo.java b/telephony/java/android/telephony/mbms/FileServiceInfo.java
index 8bda370..6646dc8 100644
--- a/telephony/java/android/telephony/mbms/FileServiceInfo.java
+++ b/telephony/java/android/telephony/mbms/FileServiceInfo.java
@@ -30,12 +30,13 @@
* @hide
*/
public class FileServiceInfo extends ServiceInfo implements Parcelable {
- public List<FileInfo> files;
+ private final List<FileInfo> files;
- public FileServiceInfo(Map<Locale, String> newNames, String newClassName, Locale newLocale,
- String newServiceId, Date start, Date end, List<FileInfo> newFiles) {
- super(newNames, newClassName, newLocale, newServiceId, start, end);
- files = new ArrayList(newFiles);
+ public FileServiceInfo(Map<Locale, String> newNames, String newClassName,
+ List<Locale> newLocales, String newServiceId, Date start, Date end,
+ List<FileInfo> newFiles) {
+ super(newNames, newClassName, newLocales, newServiceId, start, end);
+ files = new ArrayList<>(newFiles);
}
public static final Parcelable.Creator<FileServiceInfo> CREATOR =
@@ -67,4 +68,9 @@
public int describeContents() {
return 0;
}
+
+ public List<FileInfo> getFiles() {
+ return files;
+ }
+
}
diff --git a/telephony/java/android/telephony/mbms/IDownloadCallback.aidl b/telephony/java/android/telephony/mbms/IDownloadCallback.aidl
deleted file mode 100755
index a6bd7e5..0000000
--- a/telephony/java/android/telephony/mbms/IDownloadCallback.aidl
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
-** Copyright 2017, 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.telephony.mbms;
-
-import android.telephony.mbms.DownloadRequest;
-import android.telephony.mbms.FileInfo;
-
-/**
- * The optional interface used by download clients to track progress.
- * @hide
- */
-interface IDownloadCallback
-{
- /**
- * Gives progress callbacks for a given DownloadRequest. Includes a FileInfo
- * as the list of files may not have been known at request-time.
- */
- void progress(in DownloadRequest request, in FileInfo fileInfo, int downloadSize,
- int currentSize, int decodedPercent);
-}
diff --git a/telephony/java/android/telephony/mbms/IDownloadProgressListener.aidl b/telephony/java/android/telephony/mbms/IDownloadProgressListener.aidl
new file mode 100755
index 0000000..bb9dc6c
--- /dev/null
+++ b/telephony/java/android/telephony/mbms/IDownloadProgressListener.aidl
@@ -0,0 +1,34 @@
+/*
+** Copyright 2017, 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.telephony.mbms;
+
+import android.telephony.mbms.DownloadRequest;
+import android.telephony.mbms.FileInfo;
+
+/**
+ * The optional interface used by download clients to track progress.
+ * @hide
+ */
+interface IDownloadProgressListener
+{
+ /**
+ * Gives progress callbacks for a given DownloadRequest. Includes a FileInfo
+ * as the list of files may not have been known at request-time.
+ */
+ void progress(in DownloadRequest request, in FileInfo fileInfo, int currentDownloadSize,
+ int fullDownloadSize, int currentDecodedSize, int fullDecodedSize);
+}
diff --git a/telephony/java/android/telephony/mbms/IMbmsDownloadManagerCallback.aidl b/telephony/java/android/telephony/mbms/IMbmsDownloadManagerCallback.aidl
index 03227d0..ac2f202 100755
--- a/telephony/java/android/telephony/mbms/IMbmsDownloadManagerCallback.aidl
+++ b/telephony/java/android/telephony/mbms/IMbmsDownloadManagerCallback.aidl
@@ -24,19 +24,11 @@
* The interface the clients top-level file download listener will satisfy.
* @hide
*/
-interface IMbmsDownloadManagerCallback
+oneway interface IMbmsDownloadManagerCallback
{
void error(int errorCode, String message);
- /**
- * Called to indicate published File Services have changed.
- *
- * This will only be called after the application has requested
- * a list of file services and specified a service class list
- * of interest AND the results of a subsequent getFileServices
- * call with the same service class list would
- * return different
- * results.
- */
void fileServicesUpdated(in List<FileServiceInfo> services);
+
+ void middlewareReady();
}
diff --git a/telephony/java/android/telephony/mbms/IMbmsStreamingManagerCallback.aidl b/telephony/java/android/telephony/mbms/IMbmsStreamingManagerCallback.aidl
index cbf0fca..007aee7 100755
--- a/telephony/java/android/telephony/mbms/IMbmsStreamingManagerCallback.aidl
+++ b/telephony/java/android/telephony/mbms/IMbmsStreamingManagerCallback.aidl
@@ -24,30 +24,11 @@
* The interface the clients top-level streaming listener will satisfy.
* @hide
*/
-interface IMbmsStreamingManagerCallback
+oneway interface IMbmsStreamingManagerCallback
{
void error(int errorCode, String message);
- /**
- * Called to indicate published Streaming Services have changed.
- *
- * This will only be called after the application has requested
- * a list of streaming services and specified a service class list
- * of interest AND the results of a subsequent getStreamServices
- * call with the same service class list would
- * return different
- * results.
- */
void streamingServicesUpdated(in List<StreamingServiceInfo> services);
- /**
- * Called to indicate the active Streaming Services have changed.
- *
- * This will be caused whenever a new service starts streaming or whenever
- * MbmsStreamServiceManager.getActiveStreamingServices is called.
- *
- * @param services a list of StreamingServiceInfos. May be empty if
- * there are no active StreamingServices
- */
- void activeStreamingServicesUpdated(in List<StreamingServiceInfo> services);
+ void middlewareReady();
}
diff --git a/telephony/java/android/telephony/mbms/IStreamingServiceCallback.aidl b/telephony/java/android/telephony/mbms/IStreamingServiceCallback.aidl
index 891edad..0952fbe 100755
--- a/telephony/java/android/telephony/mbms/IStreamingServiceCallback.aidl
+++ b/telephony/java/android/telephony/mbms/IStreamingServiceCallback.aidl
@@ -16,14 +16,13 @@
package android.telephony.mbms;
-import android.net.Uri;
-
/**
* @hide
*/
oneway interface IStreamingServiceCallback {
void error(int errorCode, String message);
- void streamStateChanged(int state);
- void uriUpdated(in Uri uri);
+ void streamStateUpdated(int state, int reason);
+ void mediaDescriptionUpdated();
void broadcastSignalStrengthUpdated(int signalStrength);
+ void streamMethodUpdated(int methodType);
}
diff --git a/telephony/java/android/telephony/mbms/MbmsDownloadManagerCallback.java b/telephony/java/android/telephony/mbms/MbmsDownloadManagerCallback.java
index 16fafe4..ba25f66 100644
--- a/telephony/java/android/telephony/mbms/MbmsDownloadManagerCallback.java
+++ b/telephony/java/android/telephony/mbms/MbmsDownloadManagerCallback.java
@@ -48,4 +48,17 @@
public void fileServicesUpdated(List<FileServiceInfo> services) {
// default implementation empty
}
+
+ /**
+ * Called to indicate that the middleware has been initialized and is ready.
+ *
+ * Before this method is called, calling any method on an instance of
+ * {@link android.telephony.MbmsDownloadManager} will result in an {@link MbmsException}
+ * being thrown with error code {@link MbmsException#ERROR_MIDDLEWARE_NOT_BOUND}
+ * or {@link MbmsException.GeneralErrors#ERROR_MIDDLEWARE_NOT_YET_READY}
+ */
+ @Override
+ public void middlewareReady() {
+ // default implementation empty
+ }
}
diff --git a/telephony/java/android/telephony/mbms/MbmsDownloadReceiver.java b/telephony/java/android/telephony/mbms/MbmsDownloadReceiver.java
new file mode 100644
index 0000000..3617165
--- /dev/null
+++ b/telephony/java/android/telephony/mbms/MbmsDownloadReceiver.java
@@ -0,0 +1,535 @@
+/*
+ * Copyright (C) 2017 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.telephony.mbms;
+
+import android.content.BroadcastReceiver;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.net.Uri;
+import android.os.Bundle;
+import android.telephony.MbmsDownloadManager;
+import android.util.Log;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Objects;
+import java.util.UUID;
+
+/**
+ * @hide
+ */
+public class MbmsDownloadReceiver extends BroadcastReceiver {
+ public static final String DOWNLOAD_TOKEN_SUFFIX = ".download_token";
+ public static final String MBMS_FILE_PROVIDER_META_DATA_KEY = "mbms-file-provider-authority";
+
+ /**
+ * TODO: @SystemApi all these result codes
+ * Indicates that the requested operation completed without error.
+ */
+ public static final int RESULT_OK = 0;
+
+ /**
+ * Indicates that the intent sent had an invalid action. This will be the result if
+ * {@link Intent#getAction()} returns anything other than
+ * {@link MbmsDownloadManager#ACTION_DOWNLOAD_RESULT_INTERNAL},
+ * {@link MbmsDownloadManager#ACTION_FILE_DESCRIPTOR_REQUEST}, or
+ * {@link MbmsDownloadManager#ACTION_CLEANUP}.
+ * This is a fatal result code and no result extras should be expected.
+ */
+ public static final int RESULT_INVALID_ACTION = 1;
+
+ /**
+ * Indicates that the intent was missing some required extras.
+ * This is a fatal result code and no result extras should be expected.
+ */
+ public static final int RESULT_MALFORMED_INTENT = 2;
+
+ /**
+ * Indicates that the supplied value for {@link MbmsDownloadManager#EXTRA_TEMP_FILE_ROOT}
+ * does not match what the app has stored.
+ * This is a fatal result code and no result extras should be expected.
+ */
+ public static final int RESULT_BAD_TEMP_FILE_ROOT = 3;
+
+ /**
+ * Indicates that the manager was unable to move the completed download to its final location.
+ * This is a fatal result code and no result extras should be expected.
+ */
+ public static final int RESULT_DOWNLOAD_FINALIZATION_ERROR = 4;
+
+ /**
+ * Indicates that the manager was unable to generate one or more of the requested file
+ * descriptors.
+ * This is a non-fatal result code -- some file descriptors may still be generated, but there
+ * is no guarantee that they will be the same number as requested.
+ */
+ public static final int RESULT_TEMP_FILE_GENERATION_ERROR = 5;
+
+ private static final String LOG_TAG = "MbmsDownloadReceiver";
+ private static final String TEMP_FILE_SUFFIX = ".embms.temp";
+ private static final int MAX_TEMP_FILE_RETRIES = 5;
+
+
+ private String mFileProviderAuthorityCache = null;
+ private String mMiddlewarePackageNameCache = null;
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (!verifyIntentContents(context, intent)) {
+ setResultCode(RESULT_MALFORMED_INTENT);
+ return;
+ }
+ if (!Objects.equals(intent.getStringExtra(MbmsDownloadManager.EXTRA_TEMP_FILE_ROOT),
+ MbmsTempFileProvider.getEmbmsTempFileDir(context).getPath())) {
+ setResultCode(RESULT_BAD_TEMP_FILE_ROOT);
+ return;
+ }
+
+ if (MbmsDownloadManager.ACTION_DOWNLOAD_RESULT_INTERNAL.equals(intent.getAction())) {
+ moveDownloadedFile(context, intent);
+ cleanupPostMove(context, intent);
+ } else if (MbmsDownloadManager.ACTION_FILE_DESCRIPTOR_REQUEST.equals(intent.getAction())) {
+ generateTempFiles(context, intent);
+ } else if (MbmsDownloadManager.ACTION_CLEANUP.equals(intent.getAction())) {
+ cleanupTempFiles(context, intent);
+ } else {
+ setResultCode(RESULT_INVALID_ACTION);
+ }
+ }
+
+ private boolean verifyIntentContents(Context context, Intent intent) {
+ if (MbmsDownloadManager.ACTION_DOWNLOAD_RESULT_INTERNAL.equals(intent.getAction())) {
+ if (!intent.hasExtra(MbmsDownloadManager.EXTRA_RESULT)) {
+ Log.w(LOG_TAG, "Download result did not include a result code. Ignoring.");
+ return false;
+ }
+ if (!intent.hasExtra(MbmsDownloadManager.EXTRA_REQUEST)) {
+ Log.w(LOG_TAG, "Download result did not include the associated request. Ignoring.");
+ return false;
+ }
+ if (!intent.hasExtra(MbmsDownloadManager.EXTRA_TEMP_FILE_ROOT)) {
+ Log.w(LOG_TAG, "Download result did not include the temp file root. Ignoring.");
+ return false;
+ }
+ if (!intent.hasExtra(MbmsDownloadManager.EXTRA_FILE_INFO)) {
+ Log.w(LOG_TAG, "Download result did not include the associated file info. " +
+ "Ignoring.");
+ return false;
+ }
+ if (!intent.hasExtra(MbmsDownloadManager.EXTRA_FINAL_URI)) {
+ Log.w(LOG_TAG, "Download result did not include the path to the final " +
+ "temp file. Ignoring.");
+ return false;
+ }
+ DownloadRequest request = intent.getParcelableExtra(MbmsDownloadManager.EXTRA_REQUEST);
+ String expectedTokenFileName = request.getHash() + DOWNLOAD_TOKEN_SUFFIX;
+ File expectedTokenFile = new File(
+ MbmsUtils.getEmbmsTempFileDirForService(context, request.getFileServiceId()),
+ expectedTokenFileName);
+ if (!expectedTokenFile.exists()) {
+ Log.w(LOG_TAG, "Supplied download request does not match a token that we have. " +
+ "Expected " + expectedTokenFile);
+ return false;
+ }
+ } else if (MbmsDownloadManager.ACTION_FILE_DESCRIPTOR_REQUEST.equals(intent.getAction())) {
+ if (!intent.hasExtra(MbmsDownloadManager.EXTRA_SERVICE_INFO)) {
+ Log.w(LOG_TAG, "Temp file request did not include the associated service info." +
+ " Ignoring.");
+ return false;
+ }
+ if (!intent.hasExtra(MbmsDownloadManager.EXTRA_TEMP_FILE_ROOT)) {
+ Log.w(LOG_TAG, "Download result did not include the temp file root. Ignoring.");
+ return false;
+ }
+ } else if (MbmsDownloadManager.ACTION_CLEANUP.equals(intent.getAction())) {
+ if (!intent.hasExtra(MbmsDownloadManager.EXTRA_SERVICE_INFO)) {
+ Log.w(LOG_TAG, "Cleanup request did not include the associated service info." +
+ " Ignoring.");
+ return false;
+ }
+ if (!intent.hasExtra(MbmsDownloadManager.EXTRA_TEMP_FILE_ROOT)) {
+ Log.w(LOG_TAG, "Cleanup request did not include the temp file root. Ignoring.");
+ return false;
+ }
+ if (!intent.hasExtra(MbmsDownloadManager.EXTRA_TEMP_FILES_IN_USE)) {
+ Log.w(LOG_TAG, "Cleanup request did not include the list of temp files in use. " +
+ "Ignoring.");
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private void moveDownloadedFile(Context context, Intent intent) {
+ DownloadRequest request = intent.getParcelableExtra(MbmsDownloadManager.EXTRA_REQUEST);
+ Intent intentForApp = request.getIntentForApp();
+
+ int result = intent.getIntExtra(MbmsDownloadManager.EXTRA_RESULT,
+ MbmsDownloadManager.RESULT_CANCELLED);
+ intentForApp.putExtra(MbmsDownloadManager.EXTRA_RESULT, result);
+
+ if (result != MbmsDownloadManager.RESULT_SUCCESSFUL) {
+ Log.i(LOG_TAG, "Download request indicated a failed download. Aborting.");
+ context.sendBroadcast(intentForApp);
+ return;
+ }
+
+ Uri destinationUri = request.getDestinationUri();
+ Uri finalTempFile = intent.getParcelableExtra(MbmsDownloadManager.EXTRA_FINAL_URI);
+ if (!verifyTempFilePath(context, request.getFileServiceId(), finalTempFile)) {
+ Log.w(LOG_TAG, "Download result specified an invalid temp file " + finalTempFile);
+ setResultCode(RESULT_DOWNLOAD_FINALIZATION_ERROR);
+ return;
+ }
+
+ FileInfo completedFileInfo =
+ (FileInfo) intent.getParcelableExtra(MbmsDownloadManager.EXTRA_FILE_INFO);
+ String relativePath = calculateDestinationFileRelativePath(request, completedFileInfo);
+
+ Uri finalFileLocation = moveTempFile(finalTempFile, destinationUri, relativePath);
+ if (finalFileLocation == null) {
+ Log.w(LOG_TAG, "Failed to move temp file to final destination");
+ setResultCode(RESULT_DOWNLOAD_FINALIZATION_ERROR);
+ return;
+ }
+ intentForApp.putExtra(MbmsDownloadManager.EXTRA_COMPLETED_FILE_URI, finalFileLocation);
+ intentForApp.putExtra(MbmsDownloadManager.EXTRA_FILE_INFO, completedFileInfo);
+
+ context.sendBroadcast(intentForApp);
+ setResultCode(RESULT_OK);
+ }
+
+ private void cleanupPostMove(Context context, Intent intent) {
+ DownloadRequest request = intent.getParcelableExtra(MbmsDownloadManager.EXTRA_REQUEST);
+ if (request == null) {
+ Log.w(LOG_TAG, "Intent does not include a DownloadRequest. Ignoring.");
+ return;
+ }
+
+ List<Uri> tempFiles = intent.getParcelableExtra(MbmsDownloadManager.EXTRA_TEMP_LIST);
+ if (tempFiles == null) {
+ return;
+ }
+
+ for (Uri tempFileUri : tempFiles) {
+ if (verifyTempFilePath(context, request.getFileServiceId(), tempFileUri)) {
+ File tempFile = new File(tempFileUri.getSchemeSpecificPart());
+ tempFile.delete();
+ }
+ }
+ }
+
+ private void generateTempFiles(Context context, Intent intent) {
+ FileServiceInfo serviceInfo =
+ intent.getParcelableExtra(MbmsDownloadManager.EXTRA_SERVICE_INFO);
+ if (serviceInfo == null) {
+ Log.w(LOG_TAG, "Temp file request did not include the associated service info. " +
+ "Ignoring.");
+ setResultCode(RESULT_MALFORMED_INTENT);
+ return;
+ }
+ int fdCount = intent.getIntExtra(MbmsDownloadManager.EXTRA_FD_COUNT, 0);
+ List<Uri> pausedList = intent.getParcelableExtra(MbmsDownloadManager.EXTRA_PAUSED_LIST);
+
+ if (fdCount == 0 && (pausedList == null || pausedList.size() == 0)) {
+ Log.i(LOG_TAG, "No temp files actually requested. Ending.");
+ setResultCode(RESULT_OK);
+ setResultExtras(Bundle.EMPTY);
+ return;
+ }
+
+ ArrayList<UriPathPair> freshTempFiles =
+ generateFreshTempFiles(context, serviceInfo, fdCount);
+ ArrayList<UriPathPair> pausedFiles =
+ generateUrisForPausedFiles(context, serviceInfo, pausedList);
+
+ Bundle result = new Bundle();
+ result.putParcelableArrayList(MbmsDownloadManager.EXTRA_FREE_URI_LIST, freshTempFiles);
+ result.putParcelableArrayList(MbmsDownloadManager.EXTRA_PAUSED_URI_LIST, pausedFiles);
+ setResultCode(RESULT_OK);
+ setResultExtras(result);
+ }
+
+ private ArrayList<UriPathPair> generateFreshTempFiles(Context context,
+ FileServiceInfo serviceInfo,
+ int freshFdCount) {
+ File tempFileDir = MbmsUtils.getEmbmsTempFileDirForService(context,
+ serviceInfo.getServiceId());
+ if (!tempFileDir.exists()) {
+ tempFileDir.mkdirs();
+ }
+
+ // Name the files with the template "N-UUID", where N is the request ID and UUID is a
+ // random uuid.
+ ArrayList<UriPathPair> result = new ArrayList<>(freshFdCount);
+ for (int i = 0; i < freshFdCount; i++) {
+ File tempFile = generateSingleTempFile(tempFileDir);
+ if (tempFile == null) {
+ setResultCode(RESULT_TEMP_FILE_GENERATION_ERROR);
+ Log.w(LOG_TAG, "Failed to generate a temp file. Moving on.");
+ continue;
+ }
+ Uri fileUri = Uri.fromFile(tempFile);
+ Uri contentUri = MbmsTempFileProvider.getUriForFile(
+ context, getFileProviderAuthorityCached(context), tempFile);
+ context.grantUriPermission(getMiddlewarePackageCached(context), contentUri,
+ Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
+ result.add(new UriPathPair(fileUri, contentUri));
+ }
+
+ return result;
+ }
+
+ private static File generateSingleTempFile(File tempFileDir) {
+ int numTries = 0;
+ while (numTries < MAX_TEMP_FILE_RETRIES) {
+ numTries++;
+ String fileName = UUID.randomUUID() + TEMP_FILE_SUFFIX;
+ File tempFile = new File(tempFileDir, fileName);
+ try {
+ if (tempFile.createNewFile()) {
+ return tempFile.getCanonicalFile();
+ }
+ } catch (IOException e) {
+ continue;
+ }
+ }
+ return null;
+ }
+
+ private ArrayList<UriPathPair> generateUrisForPausedFiles(Context context,
+ FileServiceInfo serviceInfo, List<Uri> pausedFiles) {
+ if (pausedFiles == null) {
+ return new ArrayList<>(0);
+ }
+ ArrayList<UriPathPair> result = new ArrayList<>(pausedFiles.size());
+
+ for (Uri fileUri : pausedFiles) {
+ if (!verifyTempFilePath(context, serviceInfo.getServiceId(), fileUri)) {
+ Log.w(LOG_TAG, "Supplied file " + fileUri + " is not a valid temp file to resume");
+ setResultCode(RESULT_TEMP_FILE_GENERATION_ERROR);
+ continue;
+ }
+ File tempFile = new File(fileUri.getSchemeSpecificPart());
+ if (!tempFile.exists()) {
+ Log.w(LOG_TAG, "Supplied file " + fileUri + " does not exist.");
+ setResultCode(RESULT_TEMP_FILE_GENERATION_ERROR);
+ continue;
+ }
+ Uri contentUri = MbmsTempFileProvider.getUriForFile(
+ context, getFileProviderAuthorityCached(context), tempFile);
+ context.grantUriPermission(getMiddlewarePackageCached(context), contentUri,
+ Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
+
+ result.add(new UriPathPair(fileUri, contentUri));
+ }
+ return result;
+ }
+
+ private void cleanupTempFiles(Context context, Intent intent) {
+ FileServiceInfo serviceInfo =
+ intent.getParcelableExtra(MbmsDownloadManager.EXTRA_SERVICE_INFO);
+ File tempFileDir = MbmsUtils.getEmbmsTempFileDirForService(context,
+ serviceInfo.getServiceId());
+ List<Uri> filesInUse =
+ intent.getParcelableArrayListExtra(MbmsDownloadManager.EXTRA_TEMP_FILES_IN_USE);
+ File[] filesToDelete = tempFileDir.listFiles(new FileFilter() {
+ @Override
+ public boolean accept(File file) {
+ File canonicalFile;
+ try {
+ canonicalFile = file.getCanonicalFile();
+ } catch (IOException e) {
+ Log.w(LOG_TAG, "Got IOException canonicalizing " + file + ", not deleting.");
+ return false;
+ }
+ // Reject all files that don't match what we think a temp file should look like
+ // e.g. download tokens
+ if (!canonicalFile.getName().endsWith(TEMP_FILE_SUFFIX)) {
+ return false;
+ }
+ // If any of the files in use match the uri, return false to reject it from the
+ // list to delete.
+ Uri fileInUseUri = Uri.fromFile(canonicalFile);
+ return !filesInUse.contains(fileInUseUri);
+ }
+ });
+ for (File fileToDelete : filesToDelete) {
+ fileToDelete.delete();
+ }
+ }
+
+ private static String calculateDestinationFileRelativePath(DownloadRequest request,
+ FileInfo info) {
+ List<String> filePathComponents = info.getUri().getPathSegments();
+ List<String> requestPathComponents = request.getSourceUri().getPathSegments();
+ Iterator<String> filePathIter = filePathComponents.iterator();
+ Iterator<String> requestPathIter = requestPathComponents.iterator();
+
+ StringBuilder pathBuilder = new StringBuilder();
+ // Iterate through the segments of the carrier's URI to the file, along with the segments
+ // of the source URI specified in the download request. The relative path is calculated
+ // as the tail of the file's URI that does not match the path segments in the source URI.
+ while (filePathIter.hasNext()) {
+ String currFilePathComponent = filePathIter.next();
+ if (requestPathIter.hasNext()) {
+ String requestFilePathComponent = requestPathIter.next();
+ if (requestFilePathComponent.equals(currFilePathComponent)) {
+ continue;
+ }
+ }
+ pathBuilder.append(currFilePathComponent);
+ pathBuilder.append('/');
+ }
+ // remove the trailing slash
+ if (pathBuilder.length() > 0) {
+ pathBuilder.deleteCharAt(pathBuilder.length() - 1);
+ }
+ return pathBuilder.toString();
+ }
+
+ /*
+ * Moves a tempfile located at fromPath to a new location at toPath. If
+ * toPath is a directory, the destination file will be located at relativePath
+ * underneath toPath.
+ */
+ private static Uri moveTempFile(Uri fromPath, Uri toPath, String relativePath) {
+ if (!ContentResolver.SCHEME_FILE.equals(fromPath.getScheme())) {
+ Log.w(LOG_TAG, "Moving source uri " + fromPath+ " does not have a file scheme");
+ return null;
+ }
+ if (!ContentResolver.SCHEME_FILE.equals(toPath.getScheme())) {
+ Log.w(LOG_TAG, "Moving destination uri " + toPath + " does not have a file scheme");
+ return null;
+ }
+
+ File fromFile = new File(fromPath.getSchemeSpecificPart());
+ File toFile = new File(toPath.getSchemeSpecificPart());
+ if (toFile.isDirectory()) {
+ toFile = new File(toFile, relativePath);
+ }
+ toFile.getParentFile().mkdirs();
+
+ if (fromFile.renameTo(toFile)) {
+ return Uri.fromFile(toFile);
+ } else if (manualMove(fromFile, toFile)) {
+ return Uri.fromFile(toFile);
+ }
+ return null;
+ }
+
+ private static boolean verifyTempFilePath(Context context, String serviceId,
+ Uri filePath) {
+ if (!ContentResolver.SCHEME_FILE.equals(filePath.getScheme())) {
+ Log.w(LOG_TAG, "Uri " + filePath + " does not have a file scheme");
+ return false;
+ }
+
+ String path = filePath.getSchemeSpecificPart();
+ File tempFile = new File(path);
+ if (!tempFile.exists()) {
+ Log.w(LOG_TAG, "File at " + path + " does not exist.");
+ return false;
+ }
+
+ if (!MbmsUtils.isContainedIn(
+ MbmsUtils.getEmbmsTempFileDirForService(context, serviceId), tempFile)) {
+ return false;
+ }
+
+ return true;
+ }
+
+ private String getFileProviderAuthorityCached(Context context) {
+ if (mFileProviderAuthorityCache != null) {
+ return mFileProviderAuthorityCache;
+ }
+
+ mFileProviderAuthorityCache = getFileProviderAuthority(context);
+ return mFileProviderAuthorityCache;
+ }
+
+ private static String getFileProviderAuthority(Context context) {
+ ApplicationInfo appInfo;
+ try {
+ appInfo = context.getPackageManager()
+ .getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
+ } catch (PackageManager.NameNotFoundException e) {
+ throw new RuntimeException("Package manager couldn't find " + context.getPackageName());
+ }
+ String authority = appInfo.metaData.getString(MBMS_FILE_PROVIDER_META_DATA_KEY);
+ if (authority == null) {
+ throw new RuntimeException("Must declare the file provider authority as meta data");
+ }
+ return authority;
+ }
+
+ private String getMiddlewarePackageCached(Context context) {
+ if (mMiddlewarePackageNameCache == null) {
+ mMiddlewarePackageNameCache = MbmsUtils.getMiddlewareServiceInfo(context,
+ MbmsDownloadManager.MBMS_DOWNLOAD_SERVICE_ACTION).packageName;
+ }
+ return mMiddlewarePackageNameCache;
+ }
+
+ private static boolean manualMove(File src, File dst) {
+ InputStream in = null;
+ OutputStream out = null;
+ try {
+ if (!dst.exists()) {
+ dst.createNewFile();
+ }
+ in = new FileInputStream(src);
+ out = new FileOutputStream(dst);
+ byte[] buffer = new byte[2048];
+ int len;
+ do {
+ len = in.read(buffer);
+ out.write(buffer, 0, len);
+ } while (len > 0);
+ } catch (IOException e) {
+ Log.w(LOG_TAG, "Manual file move failed due to exception " + e);
+ if (dst.exists()) {
+ dst.delete();
+ }
+ return false;
+ } finally {
+ try {
+ if (in != null) {
+ in.close();
+ }
+ if (out != null) {
+ out.close();
+ }
+ } catch (IOException e) {
+ Log.w(LOG_TAG, "Error closing streams: " + e);
+ }
+ }
+ return true;
+ }
+}
diff --git a/telephony/java/android/telephony/mbms/MbmsException.java b/telephony/java/android/telephony/mbms/MbmsException.java
index 6b90592..8888119 100644
--- a/telephony/java/android/telephony/mbms/MbmsException.java
+++ b/telephony/java/android/telephony/mbms/MbmsException.java
@@ -18,24 +18,112 @@
/** @hide */
public class MbmsException extends Exception {
+ /** Indicates that the operation was successful. */
public static final int SUCCESS = 0;
- public static final int ERROR_NO_SERVICE_INSTALLED = 1;
- public static final int ERROR_MULTIPLE_SERVICES_INSTALLED = 2;
- public static final int ERROR_BIND_TIMEOUT_OR_FAILURE = 3;
- public static final int ERROR_UNABLE_TO_INITIALIZE = 4;
- public static final int ERROR_ALREADY_INITIALIZED = 5;
- public static final int ERROR_CONCURRENT_SERVICE_LIMIT_REACHED = 6;
- public static final int ERROR_MIDDLEWARE_NOT_BOUND = 7;
- public static final int ERROR_UNABLE_TO_START_SERVICE = 8;
- public static final int ERROR_STREAM_ALREADY_STARTED = 9;
- public static final int ERROR_END_OF_SESSION = 10;
- public static final int ERROR_SERVICE_LOST = 11;
- public static final int ERROR_APP_PERMISSIONS_NOT_GRANTED = 12;
- public static final int ERROR_IN_E911 = 13;
- public static final int ERROR_OUT_OF_MEMORY = 14;
- public static final int ERROR_NOT_CONNECTED_TO_HOME_CARRIER_LTE = 15;
- public static final int ERROR_UNABLE_TO_READ_SIM = 16;
- public static final int ERROR_CARRIER_CHANGE_NOT_ALLOWED = 17;
+
+ // Following errors are generated in the manager and should not be returned from the
+ // middleware
+ /**
+ * Indicates that either no MBMS middleware app is installed on the device or multiple
+ * middleware apps are installed on the device.
+ */
+ public static final int ERROR_NO_UNIQUE_MIDDLEWARE = 1;
+
+ /**
+ * Indicates that the app attempted to perform an operation on an instance of
+ * {@link android.telephony.MbmsDownloadManager} or
+ * {@link android.telephony.MbmsStreamingManager} without being bound to the middleware.
+ */
+ public static final int ERROR_MIDDLEWARE_NOT_BOUND = 2;
+
+ /** Indicates that the middleware has died and the requested operation was not completed.*/
+ public static final int ERROR_MIDDLEWARE_LOST = 3;
+
+ /**
+ * Indicates errors that may be generated during initialization by the
+ * middleware. They are applicable to both streaming and file-download use-cases.
+ */
+ public static class InitializationErrors {
+ /**
+ * Indicates that the app tried to create more than one instance each of
+ * {@link android.telephony.MbmsStreamingManager} or
+ * {@link android.telephony.MbmsDownloadManager}.
+ */
+ public static final int ERROR_DUPLICATE_INITIALIZE = 101;
+ /** Indicates that the app is not authorized to access media via MBMS.*/
+ public static final int ERROR_APP_PERMISSIONS_NOT_GRANTED = 102;
+ /** Indicates that the middleware was unable to initialize for this app. */
+ public static final int ERROR_UNABLE_TO_INITIALIZE = 103;
+ }
+
+ /**
+ * Indicates the errors that may occur at any point and are applicable to both
+ * streaming and file-download.
+ */
+ public static class GeneralErrors {
+ /**
+ * Indicates that the app attempted to perform an operation before receiving notification
+ * that the middleware is ready via {@link MbmsStreamingManagerCallback#middlewareReady()}
+ * or {@link MbmsDownloadManagerCallback#middlewareReady()}.
+ */
+ public static final int ERROR_MIDDLEWARE_NOT_YET_READY = 201;
+ /**
+ * Indicates that the middleware ran out of memory and was unable to complete the requested
+ * operation.
+ */
+ public static final int ERROR_OUT_OF_MEMORY = 202;
+ /**
+ * Indicates that the requested operation failed due to the middleware being unavailable due
+ * to a transient condition. The app may retry the operation at a later time.
+ */
+ public static final int ERROR_MIDDLEWARE_TEMPORARILY_UNAVAILABLE = 203;
+ /**
+ * Indicates that the requested operation was not performed due to being in emergency
+ * callback mode.
+ */
+ public static final int ERROR_IN_E911 = 204;
+ /** Indicates that MBMS is not available due to the device being in roaming. */
+ public static final int ERROR_NOT_CONNECTED_TO_HOME_CARRIER_LTE = 205;
+ /** Indicates that MBMS is not available due to a SIM read error. */
+ public static final int ERROR_UNABLE_TO_READ_SIM = 206;
+ /**
+ * Indicates that MBMS is not available due to the inserted SIM being from an unsupported
+ * carrier.
+ */
+ public static final int ERROR_CARRIER_CHANGE_NOT_ALLOWED = 207;
+ }
+
+ /**
+ * Indicates the errors that are applicable only to the streaming use-case
+ */
+ public static class StreamingErrors {
+ /** Indicates that the middleware cannot start a stream due to too many ongoing streams */
+ public static final int ERROR_CONCURRENT_SERVICE_LIMIT_REACHED = 301;
+
+ /** Indicates that the middleware was unable to start the streaming service */
+ public static final int ERROR_UNABLE_TO_START_SERVICE = 302;
+
+ /**
+ * Indicates that the app called
+ * {@link android.telephony.MbmsStreamingManager#startStreaming(StreamingServiceInfo, StreamingServiceCallback)}
+ * more than once for the same {@link StreamingServiceInfo}.
+ */
+ public static final int ERROR_DUPLICATE_START_STREAM = 303;
+ }
+
+ /**
+ * Indicates the errors that are applicable only to the file-download use-case
+ */
+ public static class DownloadErrors {
+ /**
+ * Indicates that the app is not allowed to change the temp file root at this time due to
+ * outstanding download requests.
+ */
+ public static final int ERROR_CANNOT_CHANGE_TEMP_FILE_ROOT = 401;
+
+ /** Indicates that the middleware has no record of the supplied {@link DownloadRequest}. */
+ public static final int ERROR_UNKNOWN_DOWNLOAD_REQUEST = 402;
+ }
private final int mErrorCode;
diff --git a/telephony/java/android/telephony/mbms/MbmsStreamingManagerCallback.java b/telephony/java/android/telephony/mbms/MbmsStreamingManagerCallback.java
index b3bc814..2e91be9 100644
--- a/telephony/java/android/telephony/mbms/MbmsStreamingManagerCallback.java
+++ b/telephony/java/android/telephony/mbms/MbmsStreamingManagerCallback.java
@@ -50,15 +50,15 @@
}
/**
- * Called to indicate the active Streaming Services have changed.
+ * Called to indicate that the middleware has been initialized and is ready.
*
- * This will be caused whenever a new service starts streaming or whenever
- * MbmsStreamServiceManager.getActiveStreamingServices is called.
- *
- * @param services a list of StreamingServiceInfos. May be empty if
- * there are no active StreamingServices
+ * Before this method is called, calling any method on an instance of
+ * {@link android.telephony.MbmsStreamingManager} will result in an {@link MbmsException}
+ * being thrown with error code {@link MbmsException#ERROR_MIDDLEWARE_NOT_BOUND}
+ * or {@link MbmsException.GeneralErrors#ERROR_MIDDLEWARE_NOT_YET_READY}
*/
- public void activeStreamingServicesUpdated(List<StreamingServiceInfo> services) {
+ @Override
+ public void middlewareReady() {
// default implementation empty
}
}
diff --git a/telephony/java/android/telephony/mbms/MbmsTempFileProvider.java b/telephony/java/android/telephony/mbms/MbmsTempFileProvider.java
new file mode 100644
index 0000000..c4d033b
--- /dev/null
+++ b/telephony/java/android/telephony/mbms/MbmsTempFileProvider.java
@@ -0,0 +1,192 @@
+/*
+ * Copyright (C) 2017 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.telephony.mbms;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.ContentProvider;
+import android.content.ContentResolver;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.content.pm.ProviderInfo;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.ParcelFileDescriptor;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.Objects;
+
+/**
+ * @hide
+ */
+public class MbmsTempFileProvider extends ContentProvider {
+ public static final String DEFAULT_TOP_LEVEL_TEMP_DIRECTORY = "androidMbmsTempFileRoot";
+ public static final String TEMP_FILE_ROOT_PREF_FILE_NAME = "MbmsTempFileRootPrefs";
+ public static final String TEMP_FILE_ROOT_PREF_NAME = "mbms_temp_file_root";
+
+ private String mAuthority;
+ private Context mContext;
+
+ @Override
+ public boolean onCreate() {
+ return true;
+ }
+
+ @Override
+ public Cursor query(@NonNull Uri uri, @Nullable String[] projection,
+ @Nullable String selection, @Nullable String[] selectionArgs,
+ @Nullable String sortOrder) {
+ throw new UnsupportedOperationException("No querying supported");
+ }
+
+ @Override
+ public String getType(@NonNull Uri uri) {
+ // EMBMS temp files can contain arbitrary content.
+ return "application/octet-stream";
+ }
+
+ @Override
+ public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
+ throw new UnsupportedOperationException("No inserting supported");
+ }
+
+ @Override
+ public int delete(@NonNull Uri uri, @Nullable String selection,
+ @Nullable String[] selectionArgs) {
+ throw new UnsupportedOperationException("No deleting supported");
+ }
+
+ @Override
+ public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String
+ selection, @Nullable String[] selectionArgs) {
+ throw new UnsupportedOperationException("No updating supported");
+ }
+
+ @Override
+ public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
+ // ContentProvider has already checked granted permissions
+ final File file = getFileForUri(mContext, mAuthority, uri);
+ final int fileMode = ParcelFileDescriptor.parseMode(mode);
+ return ParcelFileDescriptor.open(file, fileMode);
+ }
+
+ @Override
+ public void attachInfo(Context context, ProviderInfo info) {
+ super.attachInfo(context, info);
+
+ // Sanity check our security
+ if (info.exported) {
+ throw new SecurityException("Provider must not be exported");
+ }
+ if (!info.grantUriPermissions) {
+ throw new SecurityException("Provider must grant uri permissions");
+ }
+
+ mAuthority = info.authority;
+ mContext = context;
+ }
+
+ public static Uri getUriForFile(Context context, String authority, File file) {
+ // Get the canonical path of the temp file
+ String filePath;
+ try {
+ filePath = file.getCanonicalPath();
+ } catch (IOException e) {
+ throw new IllegalArgumentException("Could not get canonical path for file " + file);
+ }
+
+ // Make sure the temp file is contained in the temp file directory as configured in the
+ // manifest
+ File tempFileDir = getEmbmsTempFileDir(context);
+ if (!MbmsUtils.isContainedIn(tempFileDir, file)) {
+ throw new IllegalArgumentException("File " + file + " is not contained in the temp " +
+ "file directory, which is " + tempFileDir);
+ }
+
+ // Get the canonical path of the temp file directory
+ String tempFileDirPath;
+ try {
+ tempFileDirPath = tempFileDir.getCanonicalPath();
+ } catch (IOException e) {
+ throw new RuntimeException(
+ "Could not get canonical path for temp file root dir " + tempFileDir);
+ }
+
+ // Start at first char of path under temp file directory
+ String pathFragment;
+ if (tempFileDirPath.endsWith("/")) {
+ pathFragment = filePath.substring(tempFileDirPath.length());
+ } else {
+ pathFragment = filePath.substring(tempFileDirPath.length() + 1);
+ }
+
+ String encodedPath = Uri.encode(pathFragment);
+ return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT)
+ .authority(authority).encodedPath(encodedPath).build();
+ }
+
+ public static File getFileForUri(Context context, String authority, Uri uri)
+ throws FileNotFoundException {
+ if (!ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())) {
+ throw new IllegalArgumentException("Uri must have scheme content");
+ }
+ if (!Objects.equals(authority, uri.getAuthority())) {
+ throw new IllegalArgumentException("Uri does not have a matching authority: " +
+ authority + ", " + uri.getAuthority());
+ }
+
+ String relPath = Uri.decode(uri.getEncodedPath());
+ File file;
+ File tempFileDir;
+
+ try {
+ tempFileDir = getEmbmsTempFileDir(context).getCanonicalFile();
+ file = new File(tempFileDir, relPath).getCanonicalFile();
+ } catch (IOException e) {
+ throw new FileNotFoundException("Could not resolve paths");
+ }
+
+ if (!file.getPath().startsWith(tempFileDir.getPath())) {
+ throw new SecurityException("Resolved path jumped beyond configured root");
+ }
+
+ return file;
+ }
+
+ /**
+ * Returns a File for the directory used to store temp files for this app
+ */
+ public static File getEmbmsTempFileDir(Context context) {
+ SharedPreferences prefs = context.getSharedPreferences(TEMP_FILE_ROOT_PREF_FILE_NAME, 0);
+ String storedTempFileRoot = prefs.getString(TEMP_FILE_ROOT_PREF_NAME, null);
+ try {
+ if (storedTempFileRoot != null) {
+ return new File(storedTempFileRoot).getCanonicalFile();
+ } else {
+ return new File(context.getFilesDir(), DEFAULT_TOP_LEVEL_TEMP_DIRECTORY)
+ .getCanonicalFile();
+ }
+ } catch (IOException e) {
+ throw new RuntimeException("Unable to canonicalize temp file root path " + e);
+ }
+ }
+}
diff --git a/telephony/java/android/telephony/mbms/MbmsUtils.java b/telephony/java/android/telephony/mbms/MbmsUtils.java
new file mode 100644
index 0000000..4b913f8
--- /dev/null
+++ b/telephony/java/android/telephony/mbms/MbmsUtils.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2017 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.telephony.mbms;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.content.pm.*;
+import android.content.pm.ServiceInfo;
+import android.util.Log;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * @hide
+ */
+public class MbmsUtils {
+ private static final String LOG_TAG = "MbmsUtils";
+
+ public static boolean isContainedIn(File parent, File child) {
+ try {
+ String parentPath = parent.getCanonicalPath();
+ String childPath = child.getCanonicalPath();
+ return childPath.startsWith(parentPath);
+ } catch (IOException e) {
+ throw new RuntimeException("Failed to resolve canonical paths: " + e);
+ }
+ }
+
+ public static ComponentName toComponentName(ComponentInfo ci) {
+ return new ComponentName(ci.packageName, ci.name);
+ }
+
+ public static ServiceInfo getMiddlewareServiceInfo(Context context, String serviceAction) {
+ // Query for the proper service
+ PackageManager packageManager = context.getPackageManager();
+ Intent queryIntent = new Intent();
+ queryIntent.setAction(serviceAction);
+ List<ResolveInfo> downloadServices = packageManager.queryIntentServices(queryIntent,
+ PackageManager.MATCH_SYSTEM_ONLY);
+
+ if (downloadServices == null || downloadServices.size() == 0) {
+ Log.w(LOG_TAG, "No download services found, cannot get service info");
+ return null;
+ }
+
+ if (downloadServices.size() > 1) {
+ Log.w(LOG_TAG, "More than one download service found, cannot get unique service");
+ return null;
+ }
+ return downloadServices.get(0).serviceInfo;
+ }
+
+ public static void startBinding(Context context, String serviceAction,
+ ServiceConnection serviceConnection) throws MbmsException {
+ Intent bindIntent = new Intent();
+ ServiceInfo mbmsServiceInfo =
+ MbmsUtils.getMiddlewareServiceInfo(context, serviceAction);
+
+ if (mbmsServiceInfo == null) {
+ throw new MbmsException(MbmsException.ERROR_NO_UNIQUE_MIDDLEWARE);
+ }
+
+ bindIntent.setComponent(MbmsUtils.toComponentName(mbmsServiceInfo));
+
+ context.bindService(bindIntent, serviceConnection, Context.BIND_AUTO_CREATE);
+ }
+
+ /**
+ * Returns a File linked to the directory used to store temp files for this file service
+ */
+ public static File getEmbmsTempFileDirForService(Context context, String serviceId) {
+ File embmsTempFileDir = MbmsTempFileProvider.getEmbmsTempFileDir(context);
+
+ return new File(embmsTempFileDir, serviceId);
+ }
+}
diff --git a/telephony/java/android/telephony/mbms/ServiceInfo.java b/telephony/java/android/telephony/mbms/ServiceInfo.java
index f167f0ab..f9ad44c 100644
--- a/telephony/java/android/telephony/mbms/ServiceInfo.java
+++ b/telephony/java/android/telephony/mbms/ServiceInfo.java
@@ -20,10 +20,13 @@
import android.os.Parcelable;
import android.text.TextUtils;
+import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
+import java.util.List;
import java.util.Locale;
import java.util.Map;
+import java.util.Objects;
import java.util.Set;
/**
@@ -44,9 +47,9 @@
final String className;
/**
- * The language for this service content
+ * The languages available for this service content
*/
- final Locale locale;
+ final List<Locale> locales;
/**
* The carrier's identifier for the service.
@@ -64,20 +67,23 @@
final Date sessionEndTime;
- public ServiceInfo(Map<Locale, String> newNames, String newClassName, Locale newLocale,
+ public ServiceInfo(Map<Locale, String> newNames, String newClassName, List<Locale> newLocales,
String newServiceId, Date start, Date end) {
if (newNames == null || newNames.isEmpty() || TextUtils.isEmpty(newClassName)
- || newLocale == null || TextUtils.isEmpty(newServiceId)
+ || newLocales == null || newLocales.isEmpty() || TextUtils.isEmpty(newServiceId)
|| start == null || end == null) {
throw new IllegalArgumentException("Bad ServiceInfo construction");
}
if (newNames.size() > MAP_LIMIT) {
- throw new RuntimeException("bad map length" + newNames.size());
+ throw new RuntimeException("bad map length " + newNames.size());
+ }
+ if (newLocales.size() > MAP_LIMIT) {
+ throw new RuntimeException("bad locales length " + newLocales.size());
}
names = new HashMap(newNames.size());
names.putAll(newNames);
className = newClassName;
- locale = (Locale)newLocale.clone();
+ locales = new ArrayList(newLocales);
serviceId = newServiceId;
sessionStartTime = (Date)start.clone();
sessionEndTime = (Date)end.clone();
@@ -99,7 +105,7 @@
ServiceInfo(Parcel in) {
int mapCount = in.readInt();
if (mapCount > MAP_LIMIT || mapCount < 0) {
- throw new RuntimeException("bad map length" + mapCount);
+ throw new RuntimeException("bad map length" + mapCount);
}
names = new HashMap(mapCount);
while (mapCount-- > 0) {
@@ -108,7 +114,15 @@
names.put(locale, name);
}
className = in.readString();
- locale = (java.util.Locale) in.readSerializable();
+ int localesCount = in.readInt();
+ if (localesCount > MAP_LIMIT || localesCount < 0) {
+ throw new RuntimeException("bad locale length " + localesCount);
+ }
+ locales = new ArrayList<Locale>(localesCount);
+ while (localesCount-- > 0) {
+ Locale l = (java.util.Locale) in.readSerializable();
+ locales.add(l);
+ }
serviceId = in.readString();
sessionStartTime = (java.util.Date) in.readSerializable();
sessionEndTime = (java.util.Date) in.readSerializable();
@@ -123,7 +137,11 @@
dest.writeString(names.get(l));
}
dest.writeString(className);
- dest.writeSerializable(locale);
+ int localesCount = locales.size();
+ dest.writeInt(localesCount);
+ for (Locale l : locales) {
+ dest.writeSerializable(l);
+ }
dest.writeString(serviceId);
dest.writeSerializable(sessionStartTime);
dest.writeSerializable(sessionEndTime);
@@ -142,8 +160,8 @@
return className;
}
- public Locale getLocale() {
- return locale;
+ public List<Locale> getLocales() {
+ return locales;
}
public String getServiceId() {
@@ -158,4 +176,26 @@
return sessionEndTime;
}
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null) {
+ return false;
+ }
+ if (!(o instanceof ServiceInfo)) {
+ return false;
+ }
+ ServiceInfo that = (ServiceInfo) o;
+ return Objects.equals(names, that.names) &&
+ Objects.equals(className, that.className) &&
+ Objects.equals(locales, that.locales) &&
+ Objects.equals(serviceId, that.serviceId) &&
+ Objects.equals(sessionStartTime, that.sessionStartTime) &&
+ Objects.equals(sessionEndTime, that.sessionEndTime);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(names, className, locales, serviceId, sessionStartTime, sessionEndTime);
+ }
}
diff --git a/telephony/java/android/telephony/mbms/StreamingService.java b/telephony/java/android/telephony/mbms/StreamingService.java
index 85ba625..1a64189 100644
--- a/telephony/java/android/telephony/mbms/StreamingService.java
+++ b/telephony/java/android/telephony/mbms/StreamingService.java
@@ -16,22 +16,81 @@
package android.telephony.mbms;
+import android.annotation.IntDef;
import android.net.Uri;
-import android.os.DeadObjectException;
import android.os.RemoteException;
import android.telephony.mbms.vendor.IMbmsStreamingService;
import android.util.Log;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
/**
* @hide
*/
public class StreamingService {
private static final String LOG_TAG = "MbmsStreamingService";
+
+ /**
+ * The state of a stream, reported via {@link StreamingServiceCallback#streamStateUpdated}
+ * @hide
+ */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({STATE_STOPPED, STATE_STARTED, STATE_STALLED})
+ public @interface StreamingState {}
public final static int STATE_STOPPED = 1;
public final static int STATE_STARTED = 2;
public final static int STATE_STALLED = 3;
- private final String mAppName;
+ /**
+ * The reason for a stream state change, reported via
+ * {@link StreamingServiceCallback#streamStateUpdated}
+ * @hide
+ */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({REASON_BY_USER_REQUEST, REASON_END_OF_SESSION, REASON_FREQUENCY_CONFLICT,
+ REASON_OUT_OF_MEMORY, REASON_NOT_CONNECTED_TO_HOMECARRIER_LTE,
+ REASON_LEFT_MBMS_BROADCAST_AREA})
+ public @interface StreamingStateChangeReason {}
+
+ /**
+ * State changed due to a call to {@link #stopStreaming()} or
+ * {@link android.telephony.MbmsStreamingManager#startStreaming(StreamingServiceInfo, StreamingServiceCallback)}
+ */
+ public static final int REASON_BY_USER_REQUEST = 1;
+
+ /**
+ * State changed due to the streaming session ending at the carrier.
+ */
+ public static final int REASON_END_OF_SESSION = 2;
+
+ /**
+ * State changed due to a frequency conflict with another requested stream.
+ */
+ public static final int REASON_FREQUENCY_CONFLICT = 3;
+
+ /**
+ * State changed due to the middleware running out of memory
+ */
+ public static final int REASON_OUT_OF_MEMORY = 4;
+
+ /**
+ * State changed due to the device leaving the home carrier's LTE network.
+ */
+ public static final int REASON_NOT_CONNECTED_TO_HOMECARRIER_LTE = 5;
+
+ /**
+ * State changed due to the device leaving the where this stream is being broadcast.
+ */
+ public static final int REASON_LEFT_MBMS_BROADCAST_AREA = 5;
+
+ /**
+ * The method of transmission currently used for a stream,
+ * reported via {@link StreamingServiceCallback#streamMethodUpdated}
+ */
+ public final static int BROADCAST_METHOD = 1;
+ public final static int UNICAST_METHOD = 2;
+
private final int mSubscriptionId;
private final StreamingServiceInfo mServiceInfo;
private final IStreamingServiceCallback mCallback;
@@ -40,12 +99,10 @@
/**
* @hide
*/
- public StreamingService(String appName,
- int subscriptionId,
+ public StreamingService(int subscriptionId,
IMbmsStreamingService service,
StreamingServiceInfo streamingServiceInfo,
IStreamingServiceCallback callback) {
- mAppName = appName;
mSubscriptionId = subscriptionId;
mService = service;
mServiceInfo = streamingServiceInfo;
@@ -56,7 +113,9 @@
* Retreive the Uri used to play this stream.
*
* This may throw a {@link MbmsException} with the error code
- * {@link MbmsException#ERROR_SERVICE_LOST}
+ * {@link MbmsException#ERROR_MIDDLEWARE_LOST}
+ *
+ * May also throw an {@link IllegalArgumentException} or an {@link IllegalStateException}
*
* @return The {@link Uri} to pass to the streaming client.
*/
@@ -66,11 +125,11 @@
}
try {
- return mService.getPlaybackUri(mAppName, mSubscriptionId, mServiceInfo.getServiceId());
+ return mService.getPlaybackUri(mSubscriptionId, mServiceInfo.getServiceId());
} catch (RemoteException e) {
Log.w(LOG_TAG, "Remote process died");
mService = null;
- throw new MbmsException(MbmsException.ERROR_SERVICE_LOST);
+ throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST);
}
}
@@ -84,7 +143,9 @@
/**
* Stop streaming this service.
* This may throw a {@link MbmsException} with the error code
- * {@link MbmsException#ERROR_SERVICE_LOST}
+ * {@link MbmsException#ERROR_MIDDLEWARE_LOST}
+ *
+ * May also throw an {@link IllegalArgumentException} or an {@link IllegalStateException}
*/
public void stopStreaming() throws MbmsException {
if (mService == null) {
@@ -92,25 +153,34 @@
}
try {
- mService.stopStreaming(mAppName, mSubscriptionId, mServiceInfo.getServiceId());
+ mService.stopStreaming(mSubscriptionId, mServiceInfo.getServiceId());
} catch (RemoteException e) {
Log.w(LOG_TAG, "Remote process died");
mService = null;
- throw new MbmsException(MbmsException.ERROR_SERVICE_LOST);
+ throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST);
}
}
+ /**
+ * Disposes of this stream. Further operations on this object will fail with an
+ * {@link IllegalStateException}.
+ *
+ * This may throw a {@link MbmsException} with the error code
+ * {@link MbmsException#ERROR_MIDDLEWARE_LOST}
+ * May also throw an {@link IllegalArgumentException} or an {@link IllegalStateException}
+ */
public void dispose() throws MbmsException {
if (mService == null) {
throw new IllegalStateException("No streaming service attached");
}
try {
- mService.disposeStream(mAppName, mSubscriptionId, mServiceInfo.getServiceId());
+ mService.disposeStream(mSubscriptionId, mServiceInfo.getServiceId());
} catch (RemoteException e) {
Log.w(LOG_TAG, "Remote process died");
+ throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST);
+ } finally {
mService = null;
- throw new MbmsException(MbmsException.ERROR_SERVICE_LOST);
}
}
}
diff --git a/telephony/java/android/telephony/mbms/StreamingServiceCallback.java b/telephony/java/android/telephony/mbms/StreamingServiceCallback.java
index bd0a1b3..cab9c23 100644
--- a/telephony/java/android/telephony/mbms/StreamingServiceCallback.java
+++ b/telephony/java/android/telephony/mbms/StreamingServiceCallback.java
@@ -16,8 +16,6 @@
package android.telephony.mbms;
-import android.net.Uri;
-
/**
* A Callback class for use when the application is actively streaming content.
* @hide
@@ -33,6 +31,7 @@
*/
public static final int SIGNAL_STRENGTH_UNAVAILABLE = -1;
+ @Override
public void error(int errorCode, String message) {
// default implementation empty
}
@@ -43,17 +42,24 @@
* See {@link StreamingService#STATE_STOPPED}, {@link StreamingService#STATE_STARTED}
* and {@link StreamingService#STATE_STALLED}.
*/
- public void streamStateChanged(int state) {
+ @Override
+ public void streamStateUpdated(@StreamingService.StreamingState int state,
+ @StreamingService.StreamingStateChangeReason int reason) {
// default implementation empty
}
/**
- * Called to indicate published Download Services have changed.
+ * Called to indicate the mpd of a the stream has changed.
+ *
+ * Depending on the Dash Client it may need to be either reset
+ * (less drastic, but original spec didn't allow mpd to change so not
+ * always supported) or restarted.
*
* This may be called when a looping stream hits the end or
- * when the a new URI should be used to correct for time drift.
+ * when parameters have changed to account for time drift.
*/
- public void uriUpdated(Uri uri) {
+ @Override
+ public void mediaDescriptionUpdated() {
// default implementation empty
}
@@ -67,7 +73,29 @@
* {@link #SIGNAL_STRENGTH_UNAVAILABLE} if broadcast is not available
* for this service due to timing, geography or popularity.
*/
+ @Override
public void broadcastSignalStrengthUpdated(int signalStrength) {
// default implementation empty
}
+
+ /**
+ * Notify of bcast/unicast method being used.
+ *
+ * This is intended to be informational. Indicates
+ * whether we're able to use cell broadcast or have
+ * had to fallback to unicast for this stream.
+ *
+ * This must be called once at the beginning of the stream
+ * around the same time as we change to STATE_STARTED, but
+ * strict ordering is not specified. It must be called
+ * again if we change modes, but if that doesn't happen
+ * the callback won't be used again.
+ *
+ * See {@link StreamingService#BROADCAST_METHOD} and
+ * {@link StreamingService#UNICAST_METHOD}
+ */
+ @Override
+ public void streamMethodUpdated(int methodType) {
+ // default implementation empty
+ }
}
diff --git a/telephony/java/android/telephony/mbms/StreamingServiceInfo.java b/telephony/java/android/telephony/mbms/StreamingServiceInfo.java
index f559585..77ce3bb 100644
--- a/telephony/java/android/telephony/mbms/StreamingServiceInfo.java
+++ b/telephony/java/android/telephony/mbms/StreamingServiceInfo.java
@@ -20,6 +20,7 @@
import android.os.Parcelable;
import java.util.Date;
+import java.util.List;
import java.util.Locale;
import java.util.Map;
@@ -31,8 +32,8 @@
public class StreamingServiceInfo extends ServiceInfo implements Parcelable {
public StreamingServiceInfo(Map<Locale, String> newNames, String newClassName,
- Locale newLocale, String newServiceId, Date start, Date end) {
- super(newNames, newClassName, newLocale, newServiceId, start, end);
+ List<Locale> newLocales, String newServiceId, Date start, Date end) {
+ super(newNames, newClassName, newLocales, newServiceId, start, end);
}
public static final Parcelable.Creator<StreamingServiceInfo> CREATOR =
diff --git a/telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl b/telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl
index 6c2b816..0a76f32 100755
--- a/telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl
+++ b/telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl
@@ -19,55 +19,30 @@
import android.app.PendingIntent;
import android.net.Uri;
import android.telephony.mbms.DownloadRequest;
-import android.telephony.mbms.DownloadStatus;
+import android.telephony.mbms.FileInfo;
import android.telephony.mbms.IMbmsDownloadManagerCallback;
-import android.telephony.mbms.IDownloadCallback;
+import android.telephony.mbms.IDownloadProgressListener;
/**
- * The interface the opaque MbmsStreamingService will satisfy.
* @hide
*/
interface IMbmsDownloadService
{
- /**
- * Initialize download service
- * Registers this listener, subId with this appName
- *
- * No return value. Async errors may be reported, but none expected (not doing anything yet).
- */
- void initialize(String appName, int subId, IMbmsDownloadManagerCallback listener);
+ void initialize(int subId, IMbmsDownloadManagerCallback listener);
- /**
- * - Registers serviceClasses of interest with the uid/appName/subId key.
- * - Starts asynch fetching data on download services of matching classes to be reported
- * later by callback.
- *
- * Note that subsequent calls with the same callback, appName, subId and uid will replace
- * the service class list.
- */
- int getFileServices(String appName, int subId, in List<String> serviceClasses);
+ int getFileServices(int subId, in List<String> serviceClasses);
- /**
- * should move the params into a DownloadRequest parcelable
- */
- int download(in DownloadRequest downloadRequest, IDownloadCallback listener);
+ int setTempFileRootDirectory(int subId, String rootDirectoryPath);
- List<DownloadRequest> listPendingDownloads(String appName, int subscriptionId);
+ int download(in DownloadRequest downloadRequest, IDownloadProgressListener listener);
+
+ List<DownloadRequest> listPendingDownloads(int subscriptionId);
int cancelDownload(in DownloadRequest downloadRequest);
- DownloadStatus getDownloadStatus(in DownloadRequest downloadRequest);
+ int getDownloadStatus(in DownloadRequest downloadRequest, in FileInfo fileInfo);
- /*
- * named this for 2 reasons:
- * 1 don't want 'State' here as it conflicts with 'Status' of the previous function
- * 2 want to perfect typing 'Knowledge'
- */
- void resetDownloadKnowledge(in DownloadRequest downloadRequest);
+ int resetDownloadKnowledge(in DownloadRequest downloadRequest);
- /**
- * End of life for this MbmsDownloadManager.
- * Any pending downloads remain in affect and may start up independently in the future.
- */
- void dispose(String appName, int subId);
+ void dispose(int subId);
}
diff --git a/telephony/java/android/telephony/mbms/vendor/IMbmsStreamingService.aidl b/telephony/java/android/telephony/mbms/vendor/IMbmsStreamingService.aidl
index 8ff7fa7..04a53cb 100755
--- a/telephony/java/android/telephony/mbms/vendor/IMbmsStreamingService.aidl
+++ b/telephony/java/android/telephony/mbms/vendor/IMbmsStreamingService.aidl
@@ -22,33 +22,22 @@
import android.telephony.mbms.StreamingServiceInfo;
/**
- * The interface the opaque MbmsStreamingService will satisfy.
* @hide
*/
interface IMbmsStreamingService
{
- int initialize(IMbmsStreamingManagerCallback listener, String appName, int subId);
+ void initialize(IMbmsStreamingManagerCallback listener, int subId);
- int getStreamingServices(String appName, int subId, in List<String> serviceClasses);
+ int getStreamingServices(int subId, in List<String> serviceClasses);
- int startStreaming(String appName, int subId, String serviceId,
+ int startStreaming(int subId, String serviceId,
IStreamingServiceCallback listener);
- /**
- * Per-stream api. Note each specifies what stream they apply to.
- */
+ Uri getPlaybackUri(int subId, String serviceId);
- Uri getPlaybackUri(String appName, int subId, String serviceId);
+ void stopStreaming(int subId, String serviceId);
- void stopStreaming(String appName, int subId, String serviceId);
+ void disposeStream(int subId, String serviceId);
- void disposeStream(String appName, int subId, String serviceId);
-
- /**
- * End of life for all MbmsStreamingManager's created by this uid/appName/subId.
- * Ends any streams run under this uid/appname/subId and calls the disposed methods
- * an callbacks registered for this uid/appName/subId and the disposed methods on any
- * listeners registered with startStreaming.
- */
- void dispose(String appName, int subId);
+ void dispose(int subId);
}
diff --git a/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java b/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java
index 505aeae..d725d9f 100644
--- a/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java
+++ b/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java
@@ -16,11 +16,13 @@
package android.telephony.mbms.vendor;
+import android.annotation.NonNull;
import android.os.RemoteException;
import android.telephony.mbms.DownloadRequest;
-import android.telephony.mbms.DownloadStatus;
-import android.telephony.mbms.IDownloadCallback;
+import android.telephony.mbms.FileInfo;
+import android.telephony.mbms.IDownloadProgressListener;
import android.telephony.mbms.IMbmsDownloadManagerCallback;
+import android.telephony.mbms.MbmsException;
import java.util.List;
@@ -31,46 +33,166 @@
* TODO: future systemapi
*/
public class MbmsDownloadServiceBase extends IMbmsDownloadService.Stub {
+ /**
+ * Initialize the download service for this app and subId, registering the listener.
+ *
+ * Exceptions should not be thrown through this method -- this method is called from within a
+ * {@link android.content.ServiceConnection} defined by the framework, so apps have no way of
+ * catching them. Call {@link IMbmsDownloadManagerCallback#error(int, String)} instead.
+ *
+ * @param listener The callback to use to communicate with the app.
+ * @param subscriptionId The subscription ID to use.
+ */
@Override
- public void initialize(String appName, int subId, IMbmsDownloadManagerCallback listener)
- throws RemoteException {
+ public void initialize(int subscriptionId,
+ IMbmsDownloadManagerCallback listener) throws RemoteException {
}
+ /**
+ * Registers serviceClasses of interest with the appName/subId key.
+ * Starts async fetching data on streaming services of matching classes to be reported
+ * later via {@link IMbmsDownloadManagerCallback#fileServicesUpdated(List)}
+ *
+ * Note that subsequent calls with the same uid and subId will replace
+ * the service class list.
+ *
+ * May throw an {@link IllegalArgumentException} or an {@link IllegalStateException}
+ *
+ * @param subscriptionId The subscription id to use.
+ * @param serviceClasses The service classes that the app wishes to get info on. The strings
+ * may contain arbitrary data as negotiated between the app and the
+ * carrier.
+ * @return One of {@link MbmsException#SUCCESS} or
+ * {@link MbmsException.GeneralErrors#ERROR_MIDDLEWARE_NOT_YET_READY},
+ */
@Override
- public int getFileServices(String appName, int subId, List<String> serviceClasses) throws
- RemoteException {
- return 0;
- }
-
- @Override
- public int download(DownloadRequest downloadRequest, IDownloadCallback listener)
+ public int getFileServices(int subscriptionId, List<String> serviceClasses)
throws RemoteException {
return 0;
}
+ /**
+ * Sets the temp file root directory for this app/subscriptionId combination. The middleware
+ * should persist {@code rootDirectoryPath} and send it back when sending intents to the
+ * app's {@link android.telephony.mbms.MbmsDownloadReceiver}.
+ *
+ * If the calling app (as identified by the calling UID) currently has any pending download
+ * requests that have not been canceled, the middleware must return
+ * {@link MbmsException.DownloadErrors#ERROR_CANNOT_CHANGE_TEMP_FILE_ROOT} here.
+ *
+ * @param subscriptionId The subscription id the download is operating under.
+ * @param rootDirectoryPath The path to the app's temp file root directory.
+ * @return {@link MbmsException#SUCCESS},
+ * {@link MbmsException.GeneralErrors#ERROR_MIDDLEWARE_NOT_YET_READY} or
+ * {@link MbmsException.DownloadErrors#ERROR_CANNOT_CHANGE_TEMP_FILE_ROOT}
+ */
@Override
- public List<DownloadRequest> listPendingDownloads(String appName, int subscriptionId)
+ public int setTempFileRootDirectory(int subscriptionId,
+ String rootDirectoryPath) throws RemoteException {
+ return 0;
+ }
+
+ /**
+ * Issues a request to download a set of files.
+ *
+ * The middleware should expect that {@link #setTempFileRootDirectory(int, String)} has been
+ * called for this app between when the app was installed and when this method is called. If
+ * this is not the case, an {@link IllegalStateException} may be thrown.
+ *
+ * @param downloadRequest An object describing the set of files to be downloaded.
+ * @param listener A listener through which the middleware can provide progress updates to
+ * the app while both are still running.
+ * @return TODO: enumerate possible return values
+ */
+ @Override
+ public int download(DownloadRequest downloadRequest, IDownloadProgressListener listener)
+ throws RemoteException {
+ return 0;
+ }
+
+
+ /**
+ * Returns a list of pending {@link DownloadRequest}s that originated from the calling
+ * application, identified by its uid. A pending request is one that was issued via
+ * {@link #download(DownloadRequest, IDownloadCallback)} but not cancelled through
+ * {@link #cancelDownload(DownloadRequest)}.
+ * The middleware must return a non-null result synchronously or throw an exception
+ * inheriting from {@link RuntimeException}.
+ * @return A list, possibly empty, of {@link DownloadRequest}s
+ */
+ @Override
+ public @NonNull List<DownloadRequest> listPendingDownloads(int subscriptionId)
throws RemoteException {
return null;
}
+ /**
+ * Issues a request to cancel the specified download request.
+ *
+ * If the middleware is unable to cancel the request for whatever reason, it should return
+ * synchronously with an error. If this method returns {@link MbmsException#SUCCESS}, the app
+ * will no longer be expecting any more file-completed intents from the middleware for this
+ * {@link DownloadRequest}.
+ * @param downloadRequest The request to cancel
+ * @return {@link MbmsException#SUCCESS},
+ * {@link MbmsException.DownloadErrors#ERROR_UNKNOWN_DOWNLOAD_REQUEST},
+ * {@link MbmsException.GeneralErrors#ERROR_MIDDLEWARE_NOT_YET_READY}
+ */
@Override
public int cancelDownload(DownloadRequest downloadRequest) throws RemoteException {
return 0;
}
+ /**
+ * Gets information about the status of a file pending download.
+ *
+ * If the middleware has not yet been properly initialized or if it has no records of the
+ * file indicated by {@code fileInfo} being associated with {@code downloadRequest},
+ * {@link android.telephony.MbmsDownloadManager#STATUS_UNKNOWN} must be returned.
+ *
+ * @param downloadRequest The download request to query.
+ * @param fileInfo The particular file within the request to get information on.
+ * @return The status of the download.
+ */
@Override
- public DownloadStatus getDownloadStatus(DownloadRequest downloadRequest)
+ public int getDownloadStatus(DownloadRequest downloadRequest, FileInfo fileInfo)
throws RemoteException {
- return null;
+ return 0;
}
+ /**
+ * Resets the middleware's knowledge of previously-downloaded files in this download request.
+ *
+ * When this method is called, the middleware must attempt to re-download all the files
+ * specified by the {@link DownloadRequest}, even if the files have not changed on the server.
+ * In addition, current in-progress downloads must not be interrupted.
+ *
+ * If the middleware is not aware of the specified download request, return
+ * {@link MbmsException.DownloadErrors#ERROR_UNKNOWN_DOWNLOAD_REQUEST}.
+ *
+ * @param downloadRequest The request to re-download files for.
+ */
@Override
- public void resetDownloadKnowledge(DownloadRequest downloadRequest)
+ public int resetDownloadKnowledge(DownloadRequest downloadRequest)
throws RemoteException {
+ return 0;
}
+ /**
+ * Signals that the app wishes to dispose of the session identified by the
+ * {@code subscriptionId} argument and the caller's uid. No notification back to the
+ * app is required for this operation, and the corresponding callback provided via
+ * {@link #initialize(int, IMbmsDownloadManagerCallback)} should no longer be used
+ * after this method has been called by the app.
+ *
+ * Any download requests issued by the app should remain in effect until the app calls
+ * {@link #cancelDownload(DownloadRequest)} on another session.
+ *
+ * May throw an {@link IllegalStateException}
+ *
+ * @param subscriptionId The subscription id to use.
+ */
@Override
- public void dispose(String appName, int subscriptionId) throws RemoteException {
+ public void dispose(int subscriptionId) throws RemoteException {
}
}
diff --git a/telephony/java/android/telephony/mbms/vendor/MbmsStreamingServiceBase.java b/telephony/java/android/telephony/mbms/vendor/MbmsStreamingServiceBase.java
index 5b74312..f072c46 100644
--- a/telephony/java/android/telephony/mbms/vendor/MbmsStreamingServiceBase.java
+++ b/telephony/java/android/telephony/mbms/vendor/MbmsStreamingServiceBase.java
@@ -33,17 +33,17 @@
/**
* Initialize streaming service for this app and subId, registering the listener.
*
- * May throw an {@link IllegalArgumentException} or a {@link SecurityException}
+ * Exceptions should not be thrown through this method -- this method is called from within a
+ * {@link android.content.ServiceConnection} defined by the framework, so apps have no way of
+ * catching them. Call {@link IMbmsStreamingManagerCallback#error(int, String)} instead.
*
* @param listener The callback to use to communicate with the app.
- * @param appName The app name as negotiated with the wireless carrier.
* @param subscriptionId The subscription ID to use.
- * @return {@link MbmsException#SUCCESS} or {@link MbmsException#ERROR_ALREADY_INITIALIZED}
*/
@Override
- public int initialize(IMbmsStreamingManagerCallback listener, String appName,
- int subscriptionId) throws RemoteException {
- return 0;
+ public void initialize(IMbmsStreamingManagerCallback listener, int subscriptionId)
+ throws RemoteException {
+ return;
}
/**
@@ -51,22 +51,20 @@
* Starts async fetching data on streaming services of matching classes to be reported
* later via {@link IMbmsStreamingManagerCallback#streamingServicesUpdated(List)}
*
- * Note that subsequent calls with the same uid, appName and subId will replace
+ * Note that subsequent calls with the same uid and subId will replace
* the service class list.
*
* May throw an {@link IllegalArgumentException} or an {@link IllegalStateException}
*
- * @param appName The app name as negotiated with the wireless carrier.
* @param subscriptionId The subscription id to use.
* @param serviceClasses The service classes that the app wishes to get info on. The strings
* may contain arbitrary data as negotiated between the app and the
* carrier.
- * @return One of {@link MbmsException#SUCCESS},
- * {@link MbmsException#ERROR_MIDDLEWARE_NOT_BOUND},
- * {@link MbmsException#ERROR_CONCURRENT_SERVICE_LIMIT_REACHED}
+ * @return {@link MbmsException#SUCCESS} or any of the errors in
+ * {@link android.telephony.mbms.MbmsException.GeneralErrors}
*/
@Override
- public int getStreamingServices(String appName, int subscriptionId,
+ public int getStreamingServices(int subscriptionId,
List<String> serviceClasses) throws RemoteException {
return 0;
}
@@ -74,19 +72,18 @@
/**
* Starts streaming on a particular service. This method may perform asynchronous work. When
* the middleware is ready to send bits to the frontend, it should inform the app via
- * {@link IStreamingServiceCallback#streamStateChanged(int)}.
+ * {@link IStreamingServiceCallback#streamStateUpdated(int, int)}.
*
* May throw an {@link IllegalArgumentException} or an {@link IllegalStateException}
*
- * @param appName The app name as negotiated with the wireless carrier.
* @param subscriptionId The subscription id to use.
* @param serviceId The ID of the streaming service that the app has requested.
* @param listener The listener object on which the app wishes to receive updates.
- * @return TODO: document possible errors
+ * @return Any error in {@link android.telephony.mbms.MbmsException.GeneralErrors}
*/
@Override
- public int startStreaming(String appName, int subscriptionId,
- String serviceId, IStreamingServiceCallback listener) throws RemoteException {
+ public int startStreaming(int subscriptionId, String serviceId,
+ IStreamingServiceCallback listener) throws RemoteException {
return 0;
}
@@ -96,13 +93,12 @@
*
* May throw an {@link IllegalArgumentException} or an {@link IllegalStateException}
*
- * @param appName The app name as negotiated with the wireless carrier.
* @param subscriptionId The subscription id to use.
* @param serviceId The ID of the streaming service that the app has requested.
* @return An opaque {@link Uri} to be passed to a video player that understands the format.
*/
@Override
- public @Nullable Uri getPlaybackUri(String appName, int subscriptionId, String serviceId)
+ public @Nullable Uri getPlaybackUri(int subscriptionId, String serviceId)
throws RemoteException {
return null;
}
@@ -110,13 +106,15 @@
/**
* Stop streaming the stream identified by {@code serviceId}. Notification of the resulting
* stream state change should be reported to the app via
- * {@link IStreamingServiceCallback#streamStateChanged(int)}.
- * @param appName The app name as negotiated with the wireless carrier.
+ * {@link IStreamingServiceCallback#streamStateUpdated(int, int)}.
+ *
+ * May throw an {@link IllegalArgumentException} or an {@link IllegalStateException}
+ *
* @param subscriptionId The subscription id to use.
* @param serviceId The ID of the streaming service that the app wishes to stop.
*/
@Override
- public void stopStreaming(String appName, int subscriptionId, String serviceId)
+ public void stopStreaming(int subscriptionId, String serviceId)
throws RemoteException {
}
@@ -124,27 +122,31 @@
* Dispose of the stream identified by {@code serviceId} for the app identified by the
* {@code appName} and {@code subscriptionId} arguments along with the caller's uid.
* No notification back to the app is required for this operation, and the callback provided via
- * {@link #startStreaming(String, int, String, IStreamingServiceCallback)} should no longer be
+ * {@link #startStreaming(int, String, IStreamingServiceCallback)} should no longer be
* used after this method has called by the app.
- * @param appName The app name as negotiated with the wireless carrier.
+ *
+ * May throw an {@link IllegalArgumentException} or an {@link IllegalStateException}
+ *
* @param subscriptionId The subscription id to use.
* @param serviceId The ID of the streaming service that the app wishes to dispose of.
*/
@Override
- public void disposeStream(String appName, int subscriptionId, String serviceId)
+ public void disposeStream(int subscriptionId, String serviceId)
throws RemoteException {
}
/**
- * Signals that the app wishes to dispose of the session identified by the {@code appName} and
- * {@code subscriptionId} arguments, as well as the caller's uid. No notification back to the
+ * Signals that the app wishes to dispose of the session identified by the
+ * {@code subscriptionId} argument and the caller's uid. No notification back to the
* app is required for this operation, and the corresponding callback provided via
- * {@link #initialize(IMbmsStreamingManagerCallback, String, int)} should no longer be used
+ * {@link #initialize(IMbmsStreamingManagerCallback, int)} should no longer be used
* after this method has been called by the app.
- * @param appName The app name as negotiated with the wireless carrier.
+ *
+ * May throw an {@link IllegalStateException}
+ *
* @param subscriptionId The subscription id to use.
*/
@Override
- public void dispose(String appName, int subscriptionId) throws RemoteException {
+ public void dispose(int subscriptionId) throws RemoteException {
}
}
diff --git a/telephony/java/com/android/internal/telephony/ICarrierConfigLoader.aidl b/telephony/java/com/android/internal/telephony/ICarrierConfigLoader.aidl
index d77b27f..5115731 100644
--- a/telephony/java/com/android/internal/telephony/ICarrierConfigLoader.aidl
+++ b/telephony/java/com/android/internal/telephony/ICarrierConfigLoader.aidl
@@ -28,4 +28,7 @@
void notifyConfigChangedForSubId(int subId);
void updateConfigForPhoneId(int phoneId, String simState);
+
+ String getDefaultCarrierServicePackageName();
+
}
diff --git a/test-runner/Android.mk b/test-runner/Android.mk
index 0752661..3c3718a 100644
--- a/test-runner/Android.mk
+++ b/test-runner/Android.mk
@@ -16,23 +16,143 @@
LOCAL_PATH:= $(call my-dir)
+android_test_mock_source_files := $(call all-java-files-under, src/android/test/mock)
+
# Build the android.test.runner library
# =====================================
include $(CLEAR_VARS)
+LOCAL_SRC_FILES := \
+ $(filter-out $(android_test_mock_source_files), $(call all-java-files-under, src))
+
+LOCAL_JAVA_LIBRARIES := \
+ core-oj \
+ core-libart \
+ framework \
+ legacy-test \
+ android.test.mock \
+
+LOCAL_MODULE:= android.test.runner
+
+include $(BUILD_JAVA_LIBRARY)
+
+# Build the repackaged.android.test.runner library
+# ================================================
+include $(CLEAR_VARS)
+
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_JAVA_LIBRARIES := core-oj core-libart framework legacy-test
-LOCAL_MODULE:= android.test.runner
+LOCAL_JARJAR_RULES := $(LOCAL_PATH)/../legacy-test/jarjar-rules.txt
-include $(BUILD_JAVA_LIBRARY)
+LOCAL_MODULE:= repackaged.android.test.runner
+
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# Generate the stub source files for android.test.runner.stubs
+# ============================================================
+include $(CLEAR_VARS)
+
+# Exclude android.test.mock classes as stubs for them are created in the
+# android.test.mock.stubs target
+LOCAL_SRC_FILES := \
+ $(filter-out $(android_test_mock_source_files), $(call all-java-files-under, src))
+
+LOCAL_JAVA_LIBRARIES := \
+ core-oj \
+ core-libart \
+ framework \
+ legacy-test \
+ android.test.mock \
+
+LOCAL_MODULE_CLASS := JAVA_LIBRARIES
+LOCAL_DROIDDOC_SOURCE_PATH := $(LOCAL_PATH)/src
+
+ANDROID_TEST_RUNNER_OUTPUT_API_FILE := $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/android.test.runner.stubs_intermediates/api.txt
+ANDROID_TEST_RUNNER_OUTPUT_REMOVED_API_FILE := $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/android.test.runner.stubs_intermediates/removed.txt
+
+ANDROID_TEST_RUNNER_API_FILE := $(LOCAL_PATH)/api/android-test-runner-current.txt
+ANDROID_TEST_RUNNER_REMOVED_API_FILE := $(LOCAL_PATH)/api/android-test-runner-removed.txt
+
+LOCAL_DROIDDOC_OPTIONS:= \
+ -stubpackages android.test:android.test.suitebuilder:junit.runner:junit.textui \
+ -stubsourceonly \
+ -stubs $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/android.test.runner.stubs_intermediates/src \
+ -nodocs \
+ -api $(ANDROID_TEST_RUNNER_OUTPUT_API_FILE) \
+ -removedApi $(ANDROID_TEST_RUNNER_OUTPUT_REMOVED_API_FILE) \
+
+LOCAL_UNINSTALLABLE_MODULE := true
+LOCAL_MODULE := android-test-runner-api-stubs-gen
+
+include $(BUILD_DROIDDOC)
+
+# Remember the target that will trigger the code generation.
+android_test_runner_api_gen_stamp := $(full_target)
+
+# Add some additional dependencies
+$(ANDROID_TEST_RUNNER_OUTPUT_API_FILE): $(full_target)
+$(ANDROID_TEST_RUNNER_OUTPUT_REMOVED_API_FILE): $(full_target)
+
+# Build the android.test.runner.stubs library
+# ===========================================
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := android.test.runner.stubs
+
+LOCAL_JAVA_LIBRARIES := \
+ legacy.test.stubs \
+ android.test.mock.stubs \
+
+LOCAL_SOURCE_FILES_ALL_GENERATED := true
+
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# Make sure to run droiddoc first to generate the stub source files.
+$(full_classes_compiled_jar) : $(android_test_runner_api_gen_stamp)
+$(full_classes_jack) : $(android_test_runner_api_gen_stamp)
+
+# Archive a copy of the classes.jar in SDK build.
+$(call dist-for-goals,sdk win_sdk,$(full_classes_jar):android.test.runner.stubs.jar)
+
+# Check that the android.test.runner.stubs library has not changed
+# ================================================================
+
+# Check that the API we're building hasn't changed from the not-yet-released
+# SDK version.
+$(eval $(call check-api, \
+ check-android-test-runner-api-current, \
+ $(ANDROID_TEST_RUNNER_API_FILE), \
+ $(ANDROID_TEST_RUNNER_OUTPUT_API_FILE), \
+ $(ANDROID_TEST_RUNNER_REMOVED_API_FILE), \
+ $(ANDROID_TEST_RUNNER_OUTPUT_REMOVED_API_FILE), \
+ -error 2 -error 3 -error 4 -error 5 -error 6 \
+ -error 7 -error 8 -error 9 -error 10 -error 11 -error 12 -error 13 -error 14 -error 15 \
+ -error 16 -error 17 -error 18 -error 19 -error 20 -error 21 -error 23 -error 24 \
+ -error 25 -error 26 -error 27, \
+ cat $(LOCAL_PATH)/api/apicheck_msg_android_test_runner.txt, \
+ check-android-test-runner-api, \
+ $(call doc-timestamp-for,android-test-runner-api-stubs-gen) \
+ ))
+
+.PHONY: check-android-test-runner-api
+checkapi: check-android-test-runner-api
+
+.PHONY: update-android-test-runner-api
+update-api: update-android-test-runner-api
+
+update-android-test-runner-api: $(ANDROID_TEST_RUNNER_OUTPUT_API_FILE) | $(ACP)
+ @echo Copying current.txt
+ $(hide) $(ACP) $(ANDROID_TEST_RUNNER_OUTPUT_API_FILE) $(ANDROID_TEST_RUNNER_API_FILE)
+ @echo Copying removed.txt
+ $(hide) $(ACP) $(ANDROID_TEST_RUNNER_OUTPUT_REMOVED_API_FILE) $(ANDROID_TEST_RUNNER_REMOVED_API_FILE)
# Build the android.test.mock library
# ===================================
include $(CLEAR_VARS)
-LOCAL_SRC_FILES := $(call all-java-files-under, src/android/test/mock)
+LOCAL_SRC_FILES := $(android_test_mock_source_files)
LOCAL_JAVA_LIBRARIES := core-oj core-libart framework
@@ -40,33 +160,45 @@
include $(BUILD_JAVA_LIBRARY)
-# Generate the stub source files for android.test.mock.sdk
-# ========================================================
+# Generate the stub source files for android.test.mock.stubs
+# ==========================================================
include $(CLEAR_VARS)
-LOCAL_SRC_FILES := $(call all-java-files-under, src/android/test/mock)
+LOCAL_SRC_FILES := $(android_test_mock_source_files)
LOCAL_JAVA_LIBRARIES := core-oj core-libart framework
LOCAL_MODULE_CLASS := JAVA_LIBRARIES
LOCAL_DROIDDOC_SOURCE_PATH := $(LOCAL_PATH)/src/android/test/mock
+ANDROID_TEST_MOCK_OUTPUT_API_FILE := $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/android.test.mock.stubs_intermediates/api.txt
+ANDROID_TEST_MOCK_OUTPUT_REMOVED_API_FILE := $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/android.test.mock.stubs_intermediates/removed.txt
+
+ANDROID_TEST_MOCK_API_FILE := $(LOCAL_PATH)/api/android-test-mock-current.txt
+ANDROID_TEST_MOCK_REMOVED_API_FILE := $(LOCAL_PATH)/api/android-test-mock-removed.txt
+
LOCAL_DROIDDOC_OPTIONS:= \
-stubpackages android.test.mock \
- -stubs $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/android.test.mock.sdk_intermediates/src \
- -nodocs
+ -stubs $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/android.test.mock.stubs_intermediates/src \
+ -nodocs \
+ -api $(ANDROID_TEST_MOCK_OUTPUT_API_FILE) \
+ -removedApi $(ANDROID_TEST_MOCK_OUTPUT_REMOVED_API_FILE) \
LOCAL_UNINSTALLABLE_MODULE := true
-LOCAL_MODULE := android-test-mock-stubs-gen
+LOCAL_MODULE := android-test-mock-api-stubs-gen
include $(BUILD_DROIDDOC)
# Remember the target that will trigger the code generation.
android_test_mock_gen_stamp := $(full_target)
-# Build the android.test.mock.sdk library
-# =======================================
+# Add some additional dependencies
+$(ANDROID_TEST_MOCK_OUTPUT_API_FILE): $(full_target)
+$(ANDROID_TEST_MOCK_OUTPUT_REMOVED_API_FILE): $(full_target)
+
+# Build the android.test.mock.stubs library
+# =========================================
include $(CLEAR_VARS)
-LOCAL_MODULE := android.test.mock.sdk
+LOCAL_MODULE := android.test.mock.stubs
LOCAL_SOURCE_FILES_ALL_GENERATED := true
@@ -77,7 +209,49 @@
$(full_classes_jack) : $(android_test_mock_gen_stamp)
# Archive a copy of the classes.jar in SDK build.
-$(call dist-for-goals,sdk win_sdk,$(full_classes_jar):android.test.mock.jar)
+$(call dist-for-goals,sdk win_sdk,$(full_classes_jar):android.test.mock.stubs.jar)
+
+# Check that the android.test.mock.stubs library has not changed
+# ==============================================================
+
+# Check that the API we're building hasn't changed from the not-yet-released
+# SDK version.
+$(eval $(call check-api, \
+ check-android-test-mock-api-current, \
+ $(ANDROID_TEST_MOCK_API_FILE), \
+ $(ANDROID_TEST_MOCK_OUTPUT_API_FILE), \
+ $(ANDROID_TEST_MOCK_REMOVED_API_FILE), \
+ $(ANDROID_TEST_MOCK_OUTPUT_REMOVED_API_FILE), \
+ -error 2 -error 3 -error 4 -error 5 -error 6 \
+ -error 7 -error 8 -error 9 -error 10 -error 11 -error 12 -error 13 -error 14 -error 15 \
+ -error 16 -error 17 -error 18 -error 19 -error 20 -error 21 -error 23 -error 24 \
+ -error 25 -error 26 -error 27, \
+ cat $(LOCAL_PATH)/api/apicheck_msg_android_test_mock.txt, \
+ check-android-test-mock-api, \
+ $(call doc-timestamp-for,android-test-mock-api-stubs-gen) \
+ ))
+
+.PHONY: check-android-test-mock-api
+checkapi: check-android-test-mock-api
+
+.PHONY: update-android-test-mock-api
+update-api: update-android-test-mock-api
+
+update-android-test-mock-api: $(ANDROID_TEST_MOCK_OUTPUT_API_FILE) | $(ACP)
+ @echo Copying current.txt
+ $(hide) $(ACP) $(ANDROID_TEST_MOCK_OUTPUT_API_FILE) $(ANDROID_TEST_MOCK_API_FILE)
+ @echo Copying removed.txt
+ $(hide) $(ACP) $(ANDROID_TEST_MOCK_OUTPUT_REMOVED_API_FILE) $(ANDROID_TEST_MOCK_REMOVED_API_FILE)
+
+# Build the android.test.mock.sdk library
+# =======================================
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := android.test.mock.sdk
+
+LOCAL_STATIC_JAVA_LIBRARIES := android.test.mock.stubs
+
+include $(BUILD_STATIC_JAVA_LIBRARY)
# additionally, build unit tests in a separate .apk
include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/test-runner/api/android-test-mock-current.txt b/test-runner/api/android-test-mock-current.txt
new file mode 100644
index 0000000..4063ed7
--- /dev/null
+++ b/test-runner/api/android-test-mock-current.txt
@@ -0,0 +1,413 @@
+package android.test.mock {
+
+ public deprecated class MockApplication extends android.app.Application {
+ ctor public MockApplication();
+ }
+
+ public class MockContentProvider extends android.content.ContentProvider {
+ ctor protected MockContentProvider();
+ ctor public MockContentProvider(android.content.Context);
+ ctor public MockContentProvider(android.content.Context, java.lang.String, java.lang.String, android.content.pm.PathPermission[]);
+ method public android.content.ContentProviderResult[] applyBatch(java.util.ArrayList<android.content.ContentProviderOperation>);
+ method public int delete(android.net.Uri, java.lang.String, java.lang.String[]);
+ method public java.lang.String getType(android.net.Uri);
+ method public android.net.Uri insert(android.net.Uri, android.content.ContentValues);
+ method public boolean onCreate();
+ method public android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle);
+ method public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
+ method public int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
+ }
+
+ public class MockContentResolver extends android.content.ContentResolver {
+ ctor public MockContentResolver();
+ ctor public MockContentResolver(android.content.Context);
+ method protected android.content.IContentProvider acquireProvider(android.content.Context, java.lang.String);
+ method protected android.content.IContentProvider acquireUnstableProvider(android.content.Context, java.lang.String);
+ method public void addProvider(java.lang.String, android.content.ContentProvider);
+ method public boolean releaseProvider(android.content.IContentProvider);
+ method public boolean releaseUnstableProvider(android.content.IContentProvider);
+ method public void unstableProviderDied(android.content.IContentProvider);
+ }
+
+ public class MockContext extends android.content.Context {
+ ctor public MockContext();
+ method public boolean bindService(android.content.Intent, android.content.ServiceConnection, int);
+ method public boolean canLoadUnsafeResources();
+ method public int checkCallingOrSelfPermission(java.lang.String);
+ method public int checkCallingOrSelfUriPermission(android.net.Uri, int);
+ method public int checkCallingPermission(java.lang.String);
+ method public int checkCallingUriPermission(android.net.Uri, int);
+ method public int checkPermission(java.lang.String, int, int);
+ method public int checkPermission(java.lang.String, int, int, android.os.IBinder);
+ method public int checkSelfPermission(java.lang.String);
+ method public int checkUriPermission(android.net.Uri, int, int, int);
+ method public int checkUriPermission(android.net.Uri, java.lang.String, java.lang.String, int, int, int);
+ method public int checkUriPermission(android.net.Uri, int, int, int, android.os.IBinder);
+ method public void clearWallpaper();
+ method public android.content.Context createApplicationContext(android.content.pm.ApplicationInfo, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public android.content.Context createConfigurationContext(android.content.res.Configuration);
+ method public android.content.Context createContextForSplit(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public android.content.Context createCredentialProtectedStorageContext();
+ method public android.content.Context createDeviceProtectedStorageContext();
+ method public android.content.Context createDisplayContext(android.view.Display);
+ method public android.content.Context createPackageContext(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public android.content.Context createPackageContextAsUser(java.lang.String, int, android.os.UserHandle) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public java.lang.String[] databaseList();
+ method public boolean deleteDatabase(java.lang.String);
+ method public boolean deleteFile(java.lang.String);
+ method public boolean deleteSharedPreferences(java.lang.String);
+ method public void enforceCallingOrSelfPermission(java.lang.String, java.lang.String);
+ method public void enforceCallingOrSelfUriPermission(android.net.Uri, int, java.lang.String);
+ method public void enforceCallingPermission(java.lang.String, java.lang.String);
+ method public void enforceCallingUriPermission(android.net.Uri, int, java.lang.String);
+ method public void enforcePermission(java.lang.String, int, int, java.lang.String);
+ method public void enforceUriPermission(android.net.Uri, int, int, int, java.lang.String);
+ method public void enforceUriPermission(android.net.Uri, java.lang.String, java.lang.String, int, int, int, java.lang.String);
+ method public java.lang.String[] fileList();
+ method public android.content.Context getApplicationContext();
+ method public android.content.pm.ApplicationInfo getApplicationInfo();
+ method public android.content.res.AssetManager getAssets();
+ method public java.lang.String getBasePackageName();
+ method public java.io.File getCacheDir();
+ method public java.lang.ClassLoader getClassLoader();
+ method public java.io.File getCodeCacheDir();
+ method public android.content.ContentResolver getContentResolver();
+ method public java.io.File getDataDir();
+ method public java.io.File getDatabasePath(java.lang.String);
+ method public java.io.File getDir(java.lang.String, int);
+ method public android.view.Display getDisplay();
+ method public android.view.DisplayAdjustments getDisplayAdjustments(int);
+ method public java.io.File getExternalCacheDir();
+ method public java.io.File[] getExternalCacheDirs();
+ method public java.io.File getExternalFilesDir(java.lang.String);
+ method public java.io.File[] getExternalFilesDirs(java.lang.String);
+ method public java.io.File[] getExternalMediaDirs();
+ method public java.io.File getFileStreamPath(java.lang.String);
+ method public java.io.File getFilesDir();
+ method public android.os.Looper getMainLooper();
+ method public java.io.File getNoBackupFilesDir();
+ method public java.io.File getObbDir();
+ method public java.io.File[] getObbDirs();
+ method public java.lang.String getOpPackageName();
+ method public java.lang.String getPackageCodePath();
+ method public android.content.pm.PackageManager getPackageManager();
+ method public java.lang.String getPackageName();
+ method public java.lang.String getPackageResourcePath();
+ method public java.io.File getPreloadsFileCache();
+ method public android.content.res.Resources getResources();
+ method public android.content.SharedPreferences getSharedPreferences(java.lang.String, int);
+ method public android.content.SharedPreferences getSharedPreferences(java.io.File, int);
+ method public java.io.File getSharedPreferencesPath(java.lang.String);
+ method public java.lang.Object getSystemService(java.lang.String);
+ method public java.lang.String getSystemServiceName(java.lang.Class<?>);
+ method public android.content.res.Resources.Theme getTheme();
+ method public int getUserId();
+ method public android.graphics.drawable.Drawable getWallpaper();
+ method public int getWallpaperDesiredMinimumHeight();
+ method public int getWallpaperDesiredMinimumWidth();
+ method public void grantUriPermission(java.lang.String, android.net.Uri, int);
+ method public boolean isCredentialProtectedStorage();
+ method public boolean isDeviceProtectedStorage();
+ method public boolean moveDatabaseFrom(android.content.Context, java.lang.String);
+ method public boolean moveSharedPreferencesFrom(android.content.Context, java.lang.String);
+ method public java.io.FileInputStream openFileInput(java.lang.String) throws java.io.FileNotFoundException;
+ method public java.io.FileOutputStream openFileOutput(java.lang.String, int) throws java.io.FileNotFoundException;
+ method public android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase.CursorFactory);
+ method public android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase.CursorFactory, android.database.DatabaseErrorHandler);
+ method public android.graphics.drawable.Drawable peekWallpaper();
+ method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
+ method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, int);
+ method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler);
+ method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler, int);
+ method public android.content.Intent registerReceiverAsUser(android.content.BroadcastReceiver, android.os.UserHandle, android.content.IntentFilter, java.lang.String, android.os.Handler);
+ method public void reloadSharedPreferences();
+ method public void removeStickyBroadcast(android.content.Intent);
+ method public void removeStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
+ method public void revokeUriPermission(android.net.Uri, int);
+ method public void revokeUriPermission(java.lang.String, android.net.Uri, int);
+ method public void sendBroadcast(android.content.Intent);
+ method public void sendBroadcast(android.content.Intent, java.lang.String);
+ method public void sendBroadcast(android.content.Intent, java.lang.String, android.os.Bundle);
+ method public void sendBroadcast(android.content.Intent, java.lang.String, int);
+ method public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle);
+ method public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String);
+ method public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, android.os.Bundle);
+ method public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, int);
+ method public void sendBroadcastMultiplePermissions(android.content.Intent, java.lang.String[]);
+ method public void sendOrderedBroadcast(android.content.Intent, java.lang.String);
+ method public void sendOrderedBroadcast(android.content.Intent, java.lang.String, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
+ method public void sendOrderedBroadcast(android.content.Intent, java.lang.String, android.os.Bundle, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
+ method public void sendOrderedBroadcast(android.content.Intent, java.lang.String, int, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
+ method public void sendOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
+ method public void sendOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, int, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
+ method public void sendOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, int, android.os.Bundle, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
+ method public void sendStickyBroadcast(android.content.Intent);
+ method public void sendStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
+ method public void sendStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle, android.os.Bundle);
+ method public void sendStickyOrderedBroadcast(android.content.Intent, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
+ method public void sendStickyOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
+ method public void setTheme(int);
+ method public void setWallpaper(android.graphics.Bitmap) throws java.io.IOException;
+ method public void setWallpaper(java.io.InputStream) throws java.io.IOException;
+ method public void startActivities(android.content.Intent[]);
+ method public void startActivities(android.content.Intent[], android.os.Bundle);
+ method public void startActivity(android.content.Intent);
+ method public void startActivity(android.content.Intent, android.os.Bundle);
+ method public android.content.ComponentName startForegroundService(android.content.Intent);
+ method public android.content.ComponentName startForegroundServiceAsUser(android.content.Intent, android.os.UserHandle);
+ method public boolean startInstrumentation(android.content.ComponentName, java.lang.String, android.os.Bundle);
+ method public void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int) throws android.content.IntentSender.SendIntentException;
+ method public void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
+ method public android.content.ComponentName startService(android.content.Intent);
+ method public android.content.ComponentName startServiceAsUser(android.content.Intent, android.os.UserHandle);
+ method public boolean stopService(android.content.Intent);
+ method public boolean stopServiceAsUser(android.content.Intent, android.os.UserHandle);
+ method public void unbindService(android.content.ServiceConnection);
+ method public void unregisterReceiver(android.content.BroadcastReceiver);
+ method public void updateDisplay(int);
+ }
+
+ public deprecated class MockCursor implements android.database.Cursor {
+ ctor public MockCursor();
+ method public void close();
+ method public void copyStringToBuffer(int, android.database.CharArrayBuffer);
+ method public deprecated void deactivate();
+ method public byte[] getBlob(int);
+ method public int getColumnCount();
+ method public int getColumnIndex(java.lang.String);
+ method public int getColumnIndexOrThrow(java.lang.String);
+ method public java.lang.String getColumnName(int);
+ method public java.lang.String[] getColumnNames();
+ method public int getCount();
+ method public double getDouble(int);
+ method public android.os.Bundle getExtras();
+ method public float getFloat(int);
+ method public int getInt(int);
+ method public long getLong(int);
+ method public android.net.Uri getNotificationUri();
+ method public int getPosition();
+ method public short getShort(int);
+ method public java.lang.String getString(int);
+ method public int getType(int);
+ method public boolean getWantsAllOnMoveCalls();
+ method public boolean isAfterLast();
+ method public boolean isBeforeFirst();
+ method public boolean isClosed();
+ method public boolean isFirst();
+ method public boolean isLast();
+ method public boolean isNull(int);
+ method public boolean move(int);
+ method public boolean moveToFirst();
+ method public boolean moveToLast();
+ method public boolean moveToNext();
+ method public boolean moveToPosition(int);
+ method public boolean moveToPrevious();
+ method public void registerContentObserver(android.database.ContentObserver);
+ method public void registerDataSetObserver(android.database.DataSetObserver);
+ method public deprecated boolean requery();
+ method public android.os.Bundle respond(android.os.Bundle);
+ method public void setExtras(android.os.Bundle);
+ method public void setNotificationUri(android.content.ContentResolver, android.net.Uri);
+ method public void unregisterContentObserver(android.database.ContentObserver);
+ method public void unregisterDataSetObserver(android.database.DataSetObserver);
+ }
+
+ public deprecated class MockDialogInterface implements android.content.DialogInterface {
+ ctor public MockDialogInterface();
+ method public void cancel();
+ method public void dismiss();
+ }
+
+ public deprecated class MockPackageManager extends android.content.pm.PackageManager {
+ ctor public MockPackageManager();
+ method public void addCrossProfileIntentFilter(android.content.IntentFilter, int, int, int);
+ method public void addOnPermissionsChangeListener(android.content.pm.PackageManager.OnPermissionsChangedListener);
+ method public void addPackageToPreferred(java.lang.String);
+ method public boolean addPermission(android.content.pm.PermissionInfo);
+ method public boolean addPermissionAsync(android.content.pm.PermissionInfo);
+ method public void addPreferredActivity(android.content.IntentFilter, int, android.content.ComponentName[], android.content.ComponentName);
+ method public boolean canRequestPackageInstalls();
+ method public java.lang.String[] canonicalToCurrentPackageNames(java.lang.String[]);
+ method public int checkPermission(java.lang.String, java.lang.String);
+ method public int checkSignatures(java.lang.String, java.lang.String);
+ method public int checkSignatures(int, int);
+ method public void clearApplicationUserData(java.lang.String, android.content.pm.IPackageDataObserver);
+ method public void clearCrossProfileIntentFilters(int);
+ method public void clearInstantAppCookie();
+ method public void clearPackagePreferredActivities(java.lang.String);
+ method public java.lang.String[] currentToCanonicalPackageNames(java.lang.String[]);
+ method public void deleteApplicationCacheFiles(java.lang.String, android.content.pm.IPackageDataObserver);
+ method public void deleteApplicationCacheFilesAsUser(java.lang.String, int, android.content.pm.IPackageDataObserver);
+ method public void deletePackage(java.lang.String, android.content.pm.IPackageDeleteObserver, int);
+ method public void deletePackageAsUser(java.lang.String, android.content.pm.IPackageDeleteObserver, int, int);
+ method public void extendVerificationTimeout(int, int, long);
+ method public void flushPackageRestrictionsAsUser(int);
+ method public void freeStorage(java.lang.String, long, android.content.IntentSender);
+ method public void freeStorageAndNotify(java.lang.String, long, android.content.pm.IPackageDataObserver);
+ method public android.graphics.drawable.Drawable getActivityBanner(android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public android.graphics.drawable.Drawable getActivityBanner(android.content.Intent) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public android.graphics.drawable.Drawable getActivityIcon(android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public android.graphics.drawable.Drawable getActivityIcon(android.content.Intent) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public android.content.pm.ActivityInfo getActivityInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public android.graphics.drawable.Drawable getActivityLogo(android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public android.graphics.drawable.Drawable getActivityLogo(android.content.Intent) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public java.util.List<android.content.IntentFilter> getAllIntentFilters(java.lang.String);
+ method public java.util.List<android.content.pm.PermissionGroupInfo> getAllPermissionGroups(int);
+ method public android.graphics.drawable.Drawable getApplicationBanner(android.content.pm.ApplicationInfo);
+ method public android.graphics.drawable.Drawable getApplicationBanner(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public int getApplicationEnabledSetting(java.lang.String);
+ method public boolean getApplicationHiddenSettingAsUser(java.lang.String, android.os.UserHandle);
+ method public android.graphics.drawable.Drawable getApplicationIcon(android.content.pm.ApplicationInfo);
+ method public android.graphics.drawable.Drawable getApplicationIcon(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public android.content.pm.ApplicationInfo getApplicationInfo(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public android.content.pm.ApplicationInfo getApplicationInfoAsUser(java.lang.String, int, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public java.lang.CharSequence getApplicationLabel(android.content.pm.ApplicationInfo);
+ method public android.graphics.drawable.Drawable getApplicationLogo(android.content.pm.ApplicationInfo);
+ method public android.graphics.drawable.Drawable getApplicationLogo(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public android.content.pm.ChangedPackages getChangedPackages(int);
+ method public int getComponentEnabledSetting(android.content.ComponentName);
+ method public android.graphics.drawable.Drawable getDefaultActivityIcon();
+ method public java.lang.String getDefaultBrowserPackageNameAsUser(int);
+ method public android.graphics.drawable.Drawable getDrawable(java.lang.String, int, android.content.pm.ApplicationInfo);
+ method public android.content.ComponentName getHomeActivities(java.util.List<android.content.pm.ResolveInfo>);
+ method public int getInstallReason(java.lang.String, android.os.UserHandle);
+ method public java.util.List<android.content.pm.ApplicationInfo> getInstalledApplications(int);
+ method public java.util.List<android.content.pm.ApplicationInfo> getInstalledApplicationsAsUser(int, int);
+ method public java.util.List<android.content.pm.PackageInfo> getInstalledPackages(int);
+ method public java.util.List<android.content.pm.PackageInfo> getInstalledPackagesAsUser(int, int);
+ method public java.lang.String getInstallerPackageName(java.lang.String);
+ method public java.lang.String getInstantAppAndroidId(java.lang.String, android.os.UserHandle);
+ method public byte[] getInstantAppCookie();
+ method public int getInstantAppCookieMaxBytes();
+ method public int getInstantAppCookieMaxSize();
+ method public android.graphics.drawable.Drawable getInstantAppIcon(java.lang.String);
+ method public android.content.ComponentName getInstantAppInstallerComponent();
+ method public android.content.ComponentName getInstantAppResolverSettingsComponent();
+ method public java.util.List<android.content.pm.InstantAppInfo> getInstantApps();
+ method public android.content.pm.InstrumentationInfo getInstrumentationInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public java.util.List<android.content.pm.IntentFilterVerificationInfo> getIntentFilterVerifications(java.lang.String);
+ method public int getIntentVerificationStatusAsUser(java.lang.String, int);
+ method public android.content.pm.KeySet getKeySetByAlias(java.lang.String, java.lang.String);
+ method public android.content.Intent getLaunchIntentForPackage(java.lang.String);
+ method public android.content.Intent getLeanbackLaunchIntentForPackage(java.lang.String);
+ method public int getMoveStatus(int);
+ method public java.lang.String getNameForUid(int);
+ method public java.util.List<android.os.storage.VolumeInfo> getPackageCandidateVolumes(android.content.pm.ApplicationInfo);
+ method public android.os.storage.VolumeInfo getPackageCurrentVolume(android.content.pm.ApplicationInfo);
+ method public int[] getPackageGids(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public int[] getPackageGids(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public android.content.pm.PackageInfo getPackageInfo(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public android.content.pm.PackageInfo getPackageInfo(android.content.pm.VersionedPackage, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public android.content.pm.PackageInfo getPackageInfoAsUser(java.lang.String, int, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public android.content.pm.PackageInstaller getPackageInstaller();
+ method public void getPackageSizeInfoAsUser(java.lang.String, int, android.content.pm.IPackageStatsObserver);
+ method public int getPackageUid(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public int getPackageUidAsUser(java.lang.String, int, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public int getPackageUidAsUser(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public java.lang.String[] getPackagesForUid(int);
+ method public java.util.List<android.content.pm.PackageInfo> getPackagesHoldingPermissions(java.lang.String[], int);
+ method public java.lang.String getPermissionControllerPackageName();
+ method public int getPermissionFlags(java.lang.String, java.lang.String, android.os.UserHandle);
+ method public android.content.pm.PermissionGroupInfo getPermissionGroupInfo(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public android.content.pm.PermissionInfo getPermissionInfo(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public int getPreferredActivities(java.util.List<android.content.IntentFilter>, java.util.List<android.content.ComponentName>, java.lang.String);
+ method public java.util.List<android.content.pm.PackageInfo> getPreferredPackages(int);
+ method public java.util.List<android.os.storage.VolumeInfo> getPrimaryStorageCandidateVolumes();
+ method public android.os.storage.VolumeInfo getPrimaryStorageCurrentVolume();
+ method public android.content.pm.ProviderInfo getProviderInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public android.content.pm.ActivityInfo getReceiverInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public android.content.res.Resources getResourcesForActivity(android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public android.content.res.Resources getResourcesForApplication(android.content.pm.ApplicationInfo);
+ method public android.content.res.Resources getResourcesForApplication(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public android.content.res.Resources getResourcesForApplicationAsUser(java.lang.String, int);
+ method public android.content.pm.ServiceInfo getServiceInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public java.lang.String getServicesSystemSharedLibraryPackageName();
+ method public java.util.List<android.content.pm.SharedLibraryInfo> getSharedLibraries(int);
+ method public java.util.List<android.content.pm.SharedLibraryInfo> getSharedLibrariesAsUser(int, int);
+ method public java.lang.String getSharedSystemSharedLibraryPackageName();
+ method public android.content.pm.KeySet getSigningKeySet(java.lang.String);
+ method public android.content.pm.FeatureInfo[] getSystemAvailableFeatures();
+ method public java.lang.String[] getSystemSharedLibraryNames();
+ method public java.lang.CharSequence getText(java.lang.String, int, android.content.pm.ApplicationInfo);
+ method public int getUidForSharedUser(java.lang.String);
+ method public android.graphics.drawable.Drawable getUserBadgeForDensity(android.os.UserHandle, int);
+ method public android.graphics.drawable.Drawable getUserBadgeForDensityNoBackground(android.os.UserHandle, int);
+ method public android.graphics.drawable.Drawable getUserBadgedDrawableForDensity(android.graphics.drawable.Drawable, android.os.UserHandle, android.graphics.Rect, int);
+ method public android.graphics.drawable.Drawable getUserBadgedIcon(android.graphics.drawable.Drawable, android.os.UserHandle);
+ method public java.lang.CharSequence getUserBadgedLabel(java.lang.CharSequence, android.os.UserHandle);
+ method public android.content.pm.VerifierDeviceIdentity getVerifierDeviceIdentity();
+ method public android.content.res.XmlResourceParser getXml(java.lang.String, int, android.content.pm.ApplicationInfo);
+ method public void grantRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
+ method public boolean hasSystemFeature(java.lang.String);
+ method public boolean hasSystemFeature(java.lang.String, int);
+ method public int installExistingPackage(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public int installExistingPackage(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public int installExistingPackageAsUser(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public void installPackage(android.net.Uri, android.content.pm.IPackageInstallObserver, int, java.lang.String);
+ method public void installPackage(android.net.Uri, android.app.PackageInstallObserver, int, java.lang.String);
+ method public boolean isInstantApp();
+ method public boolean isInstantApp(java.lang.String);
+ method public boolean isPackageAvailable(java.lang.String);
+ method public boolean isPackageSuspendedForUser(java.lang.String, int);
+ method public boolean isPermissionReviewModeEnabled();
+ method public boolean isPermissionRevokedByPolicy(java.lang.String, java.lang.String);
+ method public boolean isSafeMode();
+ method public boolean isSignedBy(java.lang.String, android.content.pm.KeySet);
+ method public boolean isSignedByExactly(java.lang.String, android.content.pm.KeySet);
+ method public boolean isUpgrade();
+ method public android.graphics.drawable.Drawable loadItemIcon(android.content.pm.PackageItemInfo, android.content.pm.ApplicationInfo);
+ method public android.graphics.drawable.Drawable loadUnbadgedItemIcon(android.content.pm.PackageItemInfo, android.content.pm.ApplicationInfo);
+ method public int movePackage(java.lang.String, android.os.storage.VolumeInfo);
+ method public int movePrimaryStorage(android.os.storage.VolumeInfo);
+ method public java.util.List<android.content.pm.ResolveInfo> queryBroadcastReceivers(android.content.Intent, int);
+ method public java.util.List<android.content.pm.ResolveInfo> queryBroadcastReceiversAsUser(android.content.Intent, int, int);
+ method public java.util.List<android.content.pm.ProviderInfo> queryContentProviders(java.lang.String, int, int);
+ method public java.util.List<android.content.pm.InstrumentationInfo> queryInstrumentation(java.lang.String, int);
+ method public java.util.List<android.content.pm.ResolveInfo> queryIntentActivities(android.content.Intent, int);
+ method public java.util.List<android.content.pm.ResolveInfo> queryIntentActivitiesAsUser(android.content.Intent, int, int);
+ method public java.util.List<android.content.pm.ResolveInfo> queryIntentActivityOptions(android.content.ComponentName, android.content.Intent[], android.content.Intent, int);
+ method public java.util.List<android.content.pm.ResolveInfo> queryIntentContentProviders(android.content.Intent, int);
+ method public java.util.List<android.content.pm.ResolveInfo> queryIntentContentProvidersAsUser(android.content.Intent, int, int);
+ method public java.util.List<android.content.pm.ResolveInfo> queryIntentServices(android.content.Intent, int);
+ method public java.util.List<android.content.pm.ResolveInfo> queryIntentServicesAsUser(android.content.Intent, int, int);
+ method public java.util.List<android.content.pm.PermissionInfo> queryPermissionsByGroup(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public void registerDexModule(java.lang.String, android.content.pm.PackageManager.DexModuleRegisterCallback);
+ method public void registerMoveCallback(android.content.pm.PackageManager.MoveCallback, android.os.Handler);
+ method public void removeOnPermissionsChangeListener(android.content.pm.PackageManager.OnPermissionsChangedListener);
+ method public void removePackageFromPreferred(java.lang.String);
+ method public void removePermission(java.lang.String);
+ method public void replacePreferredActivity(android.content.IntentFilter, int, android.content.ComponentName[], android.content.ComponentName);
+ method public android.content.pm.ResolveInfo resolveActivity(android.content.Intent, int);
+ method public android.content.pm.ResolveInfo resolveActivityAsUser(android.content.Intent, int, int);
+ method public android.content.pm.ProviderInfo resolveContentProvider(java.lang.String, int);
+ method public android.content.pm.ProviderInfo resolveContentProviderAsUser(java.lang.String, int, int);
+ method public android.content.pm.ResolveInfo resolveService(android.content.Intent, int);
+ method public void revokeRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
+ method public void setApplicationCategoryHint(java.lang.String, int);
+ method public void setApplicationEnabledSetting(java.lang.String, int, int);
+ method public boolean setApplicationHiddenSettingAsUser(java.lang.String, boolean, android.os.UserHandle);
+ method public void setComponentEnabledSetting(android.content.ComponentName, int, int);
+ method public boolean setDefaultBrowserPackageNameAsUser(java.lang.String, int);
+ method public void setInstallerPackageName(java.lang.String, java.lang.String);
+ method public boolean setInstantAppCookie(byte[]);
+ method public java.lang.String[] setPackagesSuspendedAsUser(java.lang.String[], boolean, int);
+ method public void setUpdateAvailable(java.lang.String, boolean);
+ method public boolean shouldShowRequestPermissionRationale(java.lang.String);
+ method public void unregisterMoveCallback(android.content.pm.PackageManager.MoveCallback);
+ method public void updateInstantAppCookie(byte[]);
+ method public boolean updateIntentVerificationStatusAsUser(java.lang.String, int, int);
+ method public void updatePermissionFlags(java.lang.String, java.lang.String, int, int, android.os.UserHandle);
+ method public void verifyIntentFilter(int, int, java.util.List<java.lang.String>);
+ method public void verifyPendingInstall(int, int);
+ }
+
+ public deprecated class MockResources extends android.content.res.Resources {
+ ctor public MockResources();
+ method public int getColor(int) throws android.content.res.Resources.NotFoundException;
+ method public android.content.res.ColorStateList getColorStateList(int) throws android.content.res.Resources.NotFoundException;
+ method public android.graphics.drawable.Drawable getDrawable(int) throws android.content.res.Resources.NotFoundException;
+ method public void updateConfiguration(android.content.res.Configuration, android.util.DisplayMetrics);
+ }
+
+}
+
diff --git a/test-runner/api/android-test-mock-removed.txt b/test-runner/api/android-test-mock-removed.txt
new file mode 100644
index 0000000..9920f63d
--- /dev/null
+++ b/test-runner/api/android-test-mock-removed.txt
@@ -0,0 +1,9 @@
+package android.test.mock {
+
+ public deprecated class MockPackageManager extends android.content.pm.PackageManager {
+ method public deprecated java.lang.String getDefaultBrowserPackageName(int);
+ method public deprecated boolean setDefaultBrowserPackageName(java.lang.String, int);
+ }
+
+}
+
diff --git a/test-runner/api/android-test-runner-current.txt b/test-runner/api/android-test-runner-current.txt
new file mode 100644
index 0000000..905cfe7
--- /dev/null
+++ b/test-runner/api/android-test-runner-current.txt
@@ -0,0 +1,336 @@
+package android.test {
+
+ public abstract deprecated class ActivityInstrumentationTestCase<T extends android.app.Activity> extends android.test.ActivityTestCase {
+ ctor public ActivityInstrumentationTestCase(java.lang.String, java.lang.Class<T>);
+ ctor public ActivityInstrumentationTestCase(java.lang.String, java.lang.Class<T>, boolean);
+ method public T getActivity();
+ method public void testActivityTestCaseSetUpProperly() throws java.lang.Exception;
+ }
+
+ public abstract deprecated class ActivityInstrumentationTestCase2<T extends android.app.Activity> extends android.test.ActivityTestCase {
+ ctor public deprecated ActivityInstrumentationTestCase2(java.lang.String, java.lang.Class<T>);
+ ctor public ActivityInstrumentationTestCase2(java.lang.Class<T>);
+ method public T getActivity();
+ method public void setActivityInitialTouchMode(boolean);
+ method public void setActivityIntent(android.content.Intent);
+ }
+
+ public abstract deprecated class ActivityTestCase extends android.test.InstrumentationTestCase {
+ ctor public ActivityTestCase();
+ method protected android.app.Activity getActivity();
+ method protected void scrubClass(java.lang.Class<?>) throws java.lang.IllegalAccessException;
+ method protected void setActivity(android.app.Activity);
+ }
+
+ public abstract deprecated class ActivityUnitTestCase<T extends android.app.Activity> extends android.test.ActivityTestCase {
+ ctor public ActivityUnitTestCase(java.lang.Class<T>);
+ method public T getActivity();
+ method public int getFinishedActivityRequest();
+ method public int getRequestedOrientation();
+ method public android.content.Intent getStartedActivityIntent();
+ method public int getStartedActivityRequest();
+ method public boolean isFinishCalled();
+ method public void setActivityContext(android.content.Context);
+ method public void setApplication(android.app.Application);
+ method protected T startActivity(android.content.Intent, android.os.Bundle, java.lang.Object);
+ }
+
+ public deprecated class AndroidTestRunner extends junit.runner.BaseTestRunner {
+ ctor public AndroidTestRunner();
+ method public void addTestListener(junit.framework.TestListener);
+ method public void clearTestListeners();
+ method protected junit.framework.TestResult createTestResult();
+ method public java.util.List<junit.framework.TestCase> getTestCases();
+ method public java.lang.String getTestClassName();
+ method public junit.framework.TestResult getTestResult();
+ method protected java.lang.Class loadSuiteClass(java.lang.String) throws java.lang.ClassNotFoundException;
+ method protected void runFailed(java.lang.String);
+ method public void runTest();
+ method public void runTest(junit.framework.TestResult);
+ method public void setContext(android.content.Context);
+ method public deprecated void setInstrumentaiton(android.app.Instrumentation);
+ method public void setInstrumentation(android.app.Instrumentation);
+ method public void setTest(junit.framework.Test);
+ method public void setTestClassName(java.lang.String, java.lang.String);
+ method public void testEnded(java.lang.String);
+ method public void testFailed(int, junit.framework.Test, java.lang.Throwable);
+ method public void testStarted(java.lang.String);
+ }
+
+ public abstract deprecated class ApplicationTestCase<T extends android.app.Application> extends android.test.AndroidTestCase {
+ ctor public ApplicationTestCase(java.lang.Class<T>);
+ method protected final void createApplication();
+ method public T getApplication();
+ method public android.content.Context getSystemContext();
+ method protected final void terminateApplication();
+ method public final void testApplicationTestCaseSetUpProperly() throws java.lang.Exception;
+ }
+
+ public deprecated class AssertionFailedError extends java.lang.Error {
+ ctor public AssertionFailedError();
+ ctor public AssertionFailedError(java.lang.String);
+ }
+
+ public deprecated class ComparisonFailure extends android.test.AssertionFailedError {
+ ctor public ComparisonFailure(java.lang.String, java.lang.String, java.lang.String);
+ }
+
+ public deprecated class InstrumentationTestRunner extends android.app.Instrumentation implements android.test.TestSuiteProvider {
+ ctor public InstrumentationTestRunner();
+ method public junit.framework.TestSuite getAllTests();
+ method protected android.test.AndroidTestRunner getAndroidTestRunner();
+ method public android.os.Bundle getArguments();
+ method public java.lang.ClassLoader getLoader();
+ method public junit.framework.TestSuite getTestSuite();
+ field public static final java.lang.String REPORT_KEY_NAME_CLASS = "class";
+ field public static final java.lang.String REPORT_KEY_NAME_TEST = "test";
+ field public static final java.lang.String REPORT_KEY_NUM_CURRENT = "current";
+ field public static final java.lang.String REPORT_KEY_NUM_TOTAL = "numtests";
+ field public static final java.lang.String REPORT_KEY_STACK = "stack";
+ field public static final java.lang.String REPORT_VALUE_ID = "InstrumentationTestRunner";
+ field public static final int REPORT_VALUE_RESULT_ERROR = -1; // 0xffffffff
+ field public static final int REPORT_VALUE_RESULT_FAILURE = -2; // 0xfffffffe
+ field public static final int REPORT_VALUE_RESULT_OK = 0; // 0x0
+ field public static final int REPORT_VALUE_RESULT_START = 1; // 0x1
+ }
+
+ public deprecated class IsolatedContext extends android.content.ContextWrapper {
+ ctor public IsolatedContext(android.content.ContentResolver, android.content.Context);
+ method public java.util.List<android.content.Intent> getAndClearBroadcastIntents();
+ }
+
+ public class LoaderTestCase extends android.test.AndroidTestCase {
+ ctor public LoaderTestCase();
+ method public <T> T getLoaderResultSynchronously(android.content.Loader<T>);
+ }
+
+ public final deprecated class MoreAsserts {
+ method public static void assertAssignableFrom(java.lang.Class<?>, java.lang.Object);
+ method public static void assertAssignableFrom(java.lang.Class<?>, java.lang.Class<?>);
+ method public static java.util.regex.MatchResult assertContainsRegex(java.lang.String, java.lang.String, java.lang.String);
+ method public static java.util.regex.MatchResult assertContainsRegex(java.lang.String, java.lang.String);
+ method public static void assertContentsInAnyOrder(java.lang.String, java.lang.Iterable<?>, java.lang.Object...);
+ method public static void assertContentsInAnyOrder(java.lang.Iterable<?>, java.lang.Object...);
+ method public static void assertContentsInOrder(java.lang.String, java.lang.Iterable<?>, java.lang.Object...);
+ method public static void assertContentsInOrder(java.lang.Iterable<?>, java.lang.Object...);
+ method public static void assertEmpty(java.lang.String, java.lang.Iterable<?>);
+ method public static void assertEmpty(java.lang.Iterable<?>);
+ method public static void assertEmpty(java.lang.String, java.util.Map<?, ?>);
+ method public static void assertEmpty(java.util.Map<?, ?>);
+ method public static void assertEquals(java.lang.String, byte[], byte[]);
+ method public static void assertEquals(byte[], byte[]);
+ method public static void assertEquals(java.lang.String, int[], int[]);
+ method public static void assertEquals(int[], int[]);
+ method public static void assertEquals(java.lang.String, double[], double[]);
+ method public static void assertEquals(double[], double[]);
+ method public static void assertEquals(java.lang.String, java.lang.Object[], java.lang.Object[]);
+ method public static void assertEquals(java.lang.Object[], java.lang.Object[]);
+ method public static void assertEquals(java.lang.String, java.util.Set<? extends java.lang.Object>, java.util.Set<? extends java.lang.Object>);
+ method public static void assertEquals(java.util.Set<? extends java.lang.Object>, java.util.Set<? extends java.lang.Object>);
+ method public static java.util.regex.MatchResult assertMatchesRegex(java.lang.String, java.lang.String, java.lang.String);
+ method public static java.util.regex.MatchResult assertMatchesRegex(java.lang.String, java.lang.String);
+ method public static void assertNotContainsRegex(java.lang.String, java.lang.String, java.lang.String);
+ method public static void assertNotContainsRegex(java.lang.String, java.lang.String);
+ method public static void assertNotEmpty(java.lang.String, java.lang.Iterable<?>);
+ method public static void assertNotEmpty(java.lang.Iterable<?>);
+ method public static void assertNotEmpty(java.lang.String, java.util.Map<?, ?>);
+ method public static void assertNotEmpty(java.util.Map<?, ?>);
+ method public static void assertNotEqual(java.lang.String, java.lang.Object, java.lang.Object);
+ method public static void assertNotEqual(java.lang.Object, java.lang.Object);
+ method public static void assertNotMatchesRegex(java.lang.String, java.lang.String, java.lang.String);
+ method public static void assertNotMatchesRegex(java.lang.String, java.lang.String);
+ method public static void checkEqualsAndHashCodeMethods(java.lang.String, java.lang.Object, java.lang.Object, boolean);
+ method public static void checkEqualsAndHashCodeMethods(java.lang.Object, java.lang.Object, boolean);
+ }
+
+ public abstract deprecated class ProviderTestCase<T extends android.content.ContentProvider> extends android.test.InstrumentationTestCase {
+ ctor public ProviderTestCase(java.lang.Class<T>, java.lang.String);
+ method public android.test.mock.MockContentResolver getMockContentResolver();
+ method public android.test.IsolatedContext getMockContext();
+ method public T getProvider();
+ method public static <T extends android.content.ContentProvider> android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.Class<T>, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
+ }
+
+ public abstract class ProviderTestCase2<T extends android.content.ContentProvider> extends android.test.AndroidTestCase {
+ ctor public ProviderTestCase2(java.lang.Class<T>, java.lang.String);
+ method public android.test.mock.MockContentResolver getMockContentResolver();
+ method public android.test.IsolatedContext getMockContext();
+ method public T getProvider();
+ method public static <T extends android.content.ContentProvider> android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.String, java.lang.Class<T>, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
+ }
+
+ public deprecated class RenamingDelegatingContext extends android.content.ContextWrapper {
+ ctor public RenamingDelegatingContext(android.content.Context, java.lang.String);
+ ctor public RenamingDelegatingContext(android.content.Context, android.content.Context, java.lang.String);
+ method public java.lang.String getDatabasePrefix();
+ method public void makeExistingFilesAndDbsAccessible();
+ method public static <T extends android.content.ContentProvider> T providerWithRenamedContext(java.lang.Class<T>, android.content.Context, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public static <T extends android.content.ContentProvider> T providerWithRenamedContext(java.lang.Class<T>, android.content.Context, java.lang.String, boolean) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
+ }
+
+ public abstract deprecated class ServiceTestCase<T extends android.app.Service> extends android.test.AndroidTestCase {
+ ctor public ServiceTestCase(java.lang.Class<T>);
+ method protected android.os.IBinder bindService(android.content.Intent);
+ method public android.app.Application getApplication();
+ method public T getService();
+ method public android.content.Context getSystemContext();
+ method public void setApplication(android.app.Application);
+ method protected void setupService();
+ method protected void shutdownService();
+ method protected void startService(android.content.Intent);
+ method public void testServiceTestCaseSetUpProperly() throws java.lang.Exception;
+ }
+
+ public abstract deprecated class SingleLaunchActivityTestCase<T extends android.app.Activity> extends android.test.InstrumentationTestCase {
+ ctor public SingleLaunchActivityTestCase(java.lang.String, java.lang.Class<T>);
+ method public T getActivity();
+ method public void testActivityTestCaseSetUpProperly() throws java.lang.Exception;
+ }
+
+ public deprecated class SyncBaseInstrumentation extends android.test.InstrumentationTestCase {
+ ctor public SyncBaseInstrumentation();
+ method protected void cancelSyncsandDisableAutoSync();
+ method protected void syncProvider(android.net.Uri, java.lang.String, java.lang.String) throws java.lang.Exception;
+ }
+
+ public abstract deprecated interface TestSuiteProvider {
+ method public abstract junit.framework.TestSuite getTestSuite();
+ }
+
+ public deprecated class TouchUtils {
+ ctor public TouchUtils();
+ method public static void clickView(android.test.InstrumentationTestCase, android.view.View);
+ method public static deprecated void drag(android.test.ActivityInstrumentationTestCase, float, float, float, float, int);
+ method public static void drag(android.test.InstrumentationTestCase, float, float, float, float, int);
+ method public static deprecated void dragQuarterScreenDown(android.test.ActivityInstrumentationTestCase);
+ method public static void dragQuarterScreenDown(android.test.InstrumentationTestCase, android.app.Activity);
+ method public static deprecated void dragQuarterScreenUp(android.test.ActivityInstrumentationTestCase);
+ method public static void dragQuarterScreenUp(android.test.InstrumentationTestCase, android.app.Activity);
+ method public static deprecated int dragViewBy(android.test.ActivityInstrumentationTestCase, android.view.View, int, int, int);
+ method public static deprecated int dragViewBy(android.test.InstrumentationTestCase, android.view.View, int, int, int);
+ method public static deprecated int dragViewTo(android.test.ActivityInstrumentationTestCase, android.view.View, int, int, int);
+ method public static int dragViewTo(android.test.InstrumentationTestCase, android.view.View, int, int, int);
+ method public static deprecated void dragViewToBottom(android.test.ActivityInstrumentationTestCase, android.view.View);
+ method public static void dragViewToBottom(android.test.InstrumentationTestCase, android.app.Activity, android.view.View);
+ method public static deprecated void dragViewToBottom(android.test.ActivityInstrumentationTestCase, android.view.View, int);
+ method public static void dragViewToBottom(android.test.InstrumentationTestCase, android.app.Activity, android.view.View, int);
+ method public static deprecated void dragViewToTop(android.test.ActivityInstrumentationTestCase, android.view.View);
+ method public static deprecated void dragViewToTop(android.test.ActivityInstrumentationTestCase, android.view.View, int);
+ method public static void dragViewToTop(android.test.InstrumentationTestCase, android.view.View);
+ method public static void dragViewToTop(android.test.InstrumentationTestCase, android.view.View, int);
+ method public static deprecated int dragViewToX(android.test.ActivityInstrumentationTestCase, android.view.View, int, int);
+ method public static int dragViewToX(android.test.InstrumentationTestCase, android.view.View, int, int);
+ method public static deprecated int dragViewToY(android.test.ActivityInstrumentationTestCase, android.view.View, int, int);
+ method public static int dragViewToY(android.test.InstrumentationTestCase, android.view.View, int, int);
+ method public static deprecated void longClickView(android.test.ActivityInstrumentationTestCase, android.view.View);
+ method public static void longClickView(android.test.InstrumentationTestCase, android.view.View);
+ method public static deprecated void scrollToBottom(android.test.ActivityInstrumentationTestCase, android.view.ViewGroup);
+ method public static void scrollToBottom(android.test.InstrumentationTestCase, android.app.Activity, android.view.ViewGroup);
+ method public static deprecated void scrollToTop(android.test.ActivityInstrumentationTestCase, android.view.ViewGroup);
+ method public static void scrollToTop(android.test.InstrumentationTestCase, android.app.Activity, android.view.ViewGroup);
+ method public static void tapView(android.test.InstrumentationTestCase, android.view.View);
+ method public static void touchAndCancelView(android.test.InstrumentationTestCase, android.view.View);
+ }
+
+ public deprecated class ViewAsserts {
+ method public static void assertBaselineAligned(android.view.View, android.view.View);
+ method public static void assertBottomAligned(android.view.View, android.view.View);
+ method public static void assertBottomAligned(android.view.View, android.view.View, int);
+ method public static void assertGroupContains(android.view.ViewGroup, android.view.View);
+ method public static void assertGroupIntegrity(android.view.ViewGroup);
+ method public static void assertGroupNotContains(android.view.ViewGroup, android.view.View);
+ method public static void assertHasScreenCoordinates(android.view.View, android.view.View, int, int);
+ method public static void assertHorizontalCenterAligned(android.view.View, android.view.View);
+ method public static void assertLeftAligned(android.view.View, android.view.View);
+ method public static void assertLeftAligned(android.view.View, android.view.View, int);
+ method public static void assertOffScreenAbove(android.view.View, android.view.View);
+ method public static void assertOffScreenBelow(android.view.View, android.view.View);
+ method public static void assertOnScreen(android.view.View, android.view.View);
+ method public static void assertRightAligned(android.view.View, android.view.View);
+ method public static void assertRightAligned(android.view.View, android.view.View, int);
+ method public static void assertTopAligned(android.view.View, android.view.View);
+ method public static void assertTopAligned(android.view.View, android.view.View, int);
+ method public static void assertVerticalCenterAligned(android.view.View, android.view.View);
+ }
+
+}
+
+package android.test.suitebuilder {
+
+ public deprecated class TestMethod {
+ ctor public TestMethod(java.lang.reflect.Method, java.lang.Class<? extends junit.framework.TestCase>);
+ ctor public TestMethod(java.lang.String, java.lang.Class<? extends junit.framework.TestCase>);
+ ctor public TestMethod(junit.framework.TestCase);
+ method public junit.framework.TestCase createTest() throws java.lang.IllegalAccessException, java.lang.InstantiationException, java.lang.reflect.InvocationTargetException;
+ method public <T extends java.lang.annotation.Annotation> T getAnnotation(java.lang.Class<T>);
+ method public java.lang.Class<? extends junit.framework.TestCase> getEnclosingClass();
+ method public java.lang.String getEnclosingClassname();
+ method public java.lang.String getName();
+ }
+
+ public deprecated class TestSuiteBuilder {
+ ctor public TestSuiteBuilder(java.lang.Class);
+ ctor public TestSuiteBuilder(java.lang.String, java.lang.ClassLoader);
+ method public android.test.suitebuilder.TestSuiteBuilder addRequirements(java.util.List<com.android.internal.util.Predicate<android.test.suitebuilder.TestMethod>>);
+ method public final android.test.suitebuilder.TestSuiteBuilder addRequirements(com.android.internal.util.Predicate<android.test.suitebuilder.TestMethod>...);
+ method public final junit.framework.TestSuite build();
+ method public android.test.suitebuilder.TestSuiteBuilder excludePackages(java.lang.String...);
+ method protected java.lang.String getSuiteName();
+ method public final android.test.suitebuilder.TestSuiteBuilder includeAllPackagesUnderHere();
+ method public android.test.suitebuilder.TestSuiteBuilder includePackages(java.lang.String...);
+ method public android.test.suitebuilder.TestSuiteBuilder named(java.lang.String);
+ }
+
+ public static deprecated class TestSuiteBuilder.FailedToCreateTests extends junit.framework.TestCase {
+ ctor public TestSuiteBuilder.FailedToCreateTests(java.lang.Exception);
+ method public void testSuiteConstructionFailed();
+ }
+
+}
+
+package junit.runner {
+
+ public abstract class BaseTestRunner implements junit.framework.TestListener {
+ ctor public BaseTestRunner();
+ method public synchronized void addError(junit.framework.Test, java.lang.Throwable);
+ method public synchronized void addFailure(junit.framework.Test, junit.framework.AssertionFailedError);
+ method protected void clearStatus();
+ method public java.lang.String elapsedTimeAsString(long);
+ method public synchronized void endTest(junit.framework.Test);
+ method public java.lang.String extractClassName(java.lang.String);
+ method public static java.lang.String getFilteredTrace(java.lang.Throwable);
+ method public static java.lang.String getFilteredTrace(java.lang.String);
+ method public deprecated junit.runner.TestSuiteLoader getLoader();
+ method public static java.lang.String getPreference(java.lang.String);
+ method public static int getPreference(java.lang.String, int);
+ method protected static java.util.Properties getPreferences();
+ method public junit.framework.Test getTest(java.lang.String);
+ method public static deprecated boolean inVAJava();
+ method protected java.lang.Class<?> loadSuiteClass(java.lang.String) throws java.lang.ClassNotFoundException;
+ method protected java.lang.String processArguments(java.lang.String[]);
+ method protected abstract void runFailed(java.lang.String);
+ method public static void savePreferences() throws java.io.IOException;
+ method public void setLoading(boolean);
+ method public void setPreference(java.lang.String, java.lang.String);
+ method protected static void setPreferences(java.util.Properties);
+ method protected static boolean showStackRaw();
+ method public synchronized void startTest(junit.framework.Test);
+ method public abstract void testEnded(java.lang.String);
+ method public abstract void testFailed(int, junit.framework.Test, java.lang.Throwable);
+ method public abstract void testStarted(java.lang.String);
+ method public static java.lang.String truncate(java.lang.String);
+ method protected boolean useReloadingTestSuiteLoader();
+ field public static final java.lang.String SUITE_METHODNAME = "suite";
+ }
+
+ public abstract interface TestSuiteLoader {
+ method public abstract java.lang.Class load(java.lang.String) throws java.lang.ClassNotFoundException;
+ method public abstract java.lang.Class reload(java.lang.Class) throws java.lang.ClassNotFoundException;
+ }
+
+ public class Version {
+ method public static java.lang.String id();
+ }
+
+}
+
diff --git a/test-runner/api/android-test-runner-removed.txt b/test-runner/api/android-test-runner-removed.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/test-runner/api/android-test-runner-removed.txt
diff --git a/test-runner/api/apicheck_msg_android_test_mock.txt b/test-runner/api/apicheck_msg_android_test_mock.txt
new file mode 100644
index 0000000..e388935
--- /dev/null
+++ b/test-runner/api/apicheck_msg_android_test_mock.txt
@@ -0,0 +1,17 @@
+
+******************************
+You have tried to change the API from what has been previously approved.
+
+To make these errors go away, you have two choices:
+ 1) You can add "@hide" javadoc comments to the methods, etc. listed in the
+ errors above.
+
+ 2) You can update android-test-mock-current.txt by executing the following command:
+ make update-android-test-mock-api
+
+ To submit the revised android-test-mock-current.txt to the main Android repository,
+ you will need approval.
+******************************
+
+
+
diff --git a/test-runner/api/apicheck_msg_android_test_runner.txt b/test-runner/api/apicheck_msg_android_test_runner.txt
new file mode 100644
index 0000000..cf2d15e
--- /dev/null
+++ b/test-runner/api/apicheck_msg_android_test_runner.txt
@@ -0,0 +1,17 @@
+
+******************************
+You have tried to change the API from what has been previously approved.
+
+To make these errors go away, you have two choices:
+ 1) You can add "@hide" javadoc comments to the methods, etc. listed in the
+ errors above.
+
+ 2) You can update android-test-runner-current.txt by executing the following command:
+ make update-android-test-runner-api
+
+ To submit the revised android-test-runner-current.txt to the main Android repository,
+ you will need approval.
+******************************
+
+
+
diff --git a/test-runner/src/android/test/AndroidTestRunner.java b/test-runner/src/android/test/AndroidTestRunner.java
index 7313a28..f898516 100644
--- a/test-runner/src/android/test/AndroidTestRunner.java
+++ b/test-runner/src/android/test/AndroidTestRunner.java
@@ -18,7 +18,6 @@
import android.app.Instrumentation;
import android.content.Context;
-import android.os.PerformanceCollector.PerformanceResultsWriter;
import java.util.ArrayList;
import junit.framework.Test;
@@ -49,7 +48,6 @@
private List<TestListener> mTestListeners = new ArrayList<>();
private Instrumentation mInstrumentation;
- private PerformanceResultsWriter mPerfWriter;
@SuppressWarnings("unchecked")
public void setTestClassName(String testClassName, String testMethodName) {
@@ -194,7 +192,6 @@
for (TestCase testCase : mTestCases) {
setContextIfAndroidTestCase(testCase, mContext, testContext);
setInstrumentationIfInstrumentationTestCase(testCase, mInstrumentation);
- setPerformanceWriterIfPerformanceCollectorTestCase(testCase, mPerfWriter);
testCase.run(mTestResult);
}
}
@@ -217,13 +214,6 @@
}
}
- private void setPerformanceWriterIfPerformanceCollectorTestCase(
- Test test, PerformanceResultsWriter writer) {
- if (PerformanceCollectorTestCase.class.isAssignableFrom(test.getClass())) {
- ((PerformanceCollectorTestCase) test).setPerformanceResultsWriter(writer);
- }
- }
-
public void setInstrumentation(Instrumentation instrumentation) {
mInstrumentation = instrumentation;
}
@@ -237,13 +227,6 @@
setInstrumentation(instrumentation);
}
- /**
- * {@hide} Pending approval for public API.
- */
- public void setPerformanceResultsWriter(PerformanceResultsWriter writer) {
- mPerfWriter = writer;
- }
-
@Override
protected Class loadSuiteClass(String suiteClassName) throws ClassNotFoundException {
return mContext.getClassLoader().loadClass(suiteClassName);
diff --git a/test-runner/src/android/test/ClassPathPackageInfo.java b/test-runner/src/android/test/ClassPathPackageInfo.java
deleted file mode 100644
index 2cf76af..0000000
--- a/test-runner/src/android/test/ClassPathPackageInfo.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2008 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.test;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * The Package object doesn't allow you to iterate over the contained
- * classes and subpackages of that package. This is a version that does.
- *
- * {@hide} Not needed for 1.0 SDK.
- */
-@Deprecated
-public class ClassPathPackageInfo {
-
- private final ClassPathPackageInfoSource source;
- private final String packageName;
- private final Set<String> subpackageNames;
- private final Set<Class<?>> topLevelClasses;
-
- ClassPathPackageInfo(ClassPathPackageInfoSource source, String packageName,
- Set<String> subpackageNames, Set<Class<?>> topLevelClasses) {
- this.source = source;
- this.packageName = packageName;
- this.subpackageNames = Collections.unmodifiableSet(subpackageNames);
- this.topLevelClasses = Collections.unmodifiableSet(topLevelClasses);
- }
-
- public Set<ClassPathPackageInfo> getSubpackages() {
- Set<ClassPathPackageInfo> info = new HashSet<>();
- for (String name : subpackageNames) {
- info.add(source.getPackageInfo(name));
- }
- return info;
- }
-
- public Set<Class<?>> getTopLevelClassesRecursive() {
- Set<Class<?>> set = new HashSet<>();
- addTopLevelClassesTo(set);
- return set;
- }
-
- private void addTopLevelClassesTo(Set<Class<?>> set) {
- set.addAll(topLevelClasses);
- for (ClassPathPackageInfo info : getSubpackages()) {
- info.addTopLevelClassesTo(set);
- }
- }
-
- @Override
- public boolean equals(Object obj) {
- if (obj instanceof ClassPathPackageInfo) {
- ClassPathPackageInfo that = (ClassPathPackageInfo) obj;
- return (this.packageName).equals(that.packageName);
- }
- return false;
- }
-
- @Override
- public int hashCode() {
- return packageName.hashCode();
- }
-}
diff --git a/test-runner/src/android/test/ClassPathPackageInfoSource.java b/test-runner/src/android/test/ClassPathPackageInfoSource.java
index 9bcc25a..755b540 100644
--- a/test-runner/src/android/test/ClassPathPackageInfoSource.java
+++ b/test-runner/src/android/test/ClassPathPackageInfoSource.java
@@ -21,15 +21,12 @@
import java.io.File;
import java.io.IOException;
+import java.util.Collections;
import java.util.Enumeration;
-import java.util.HashMap;
import java.util.HashSet;
-import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import java.util.regex.Pattern;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
/**
* Generate {@link ClassPathPackageInfo}s by scanning apk paths.
@@ -39,11 +36,13 @@
@Deprecated
public class ClassPathPackageInfoSource {
- private static final String CLASS_EXTENSION = ".class";
-
private static final ClassLoader CLASS_LOADER
= ClassPathPackageInfoSource.class.getClassLoader();
+ private static String[] apkPaths;
+
+ private static ClassPathPackageInfoSource classPathSource;
+
private final SimpleCache<String, ClassPathPackageInfo> cache =
new SimpleCache<String, ClassPathPackageInfo>() {
@Override
@@ -54,23 +53,28 @@
// The class path of the running application
private final String[] classPath;
- private static String[] apkPaths;
- // A cache of jar file contents
- private final Map<File, Set<String>> jarFiles = new HashMap<>();
- private ClassLoader classLoader;
+ private final ClassLoader classLoader;
- ClassPathPackageInfoSource() {
+ private ClassPathPackageInfoSource(ClassLoader classLoader) {
+ this.classLoader = classLoader;
classPath = getClassPath();
}
-
- public static void setApkPaths(String[] apkPaths) {
+ static void setApkPaths(String[] apkPaths) {
ClassPathPackageInfoSource.apkPaths = apkPaths;
}
- public ClassPathPackageInfo getPackageInfo(String pkgName) {
- return cache.get(pkgName);
+ public static ClassPathPackageInfoSource forClassPath(ClassLoader classLoader) {
+ if (classPathSource == null) {
+ classPathSource = new ClassPathPackageInfoSource(classLoader);
+ }
+ return classPathSource;
+ }
+
+ public Set<Class<?>> getTopLevelClassesRecursive(String packageName) {
+ ClassPathPackageInfo packageInfo = cache.get(packageName);
+ return packageInfo.getTopLevelClassesRecursive();
}
private ClassPathPackageInfo createPackageInfo(String packageName) {
@@ -96,7 +100,7 @@
+ "'. Message: " + e.getMessage(), e);
}
}
- return new ClassPathPackageInfo(this, packageName, subpackageNames,
+ return new ClassPathPackageInfo(packageName, subpackageNames,
topLevelClasses);
}
@@ -107,9 +111,6 @@
*/
private void findClasses(String packageName, Set<String> classNames,
Set<String> subpackageNames) {
- String packagePrefix = packageName + '.';
- String pathPrefix = packagePrefix.replace('.', '/');
-
for (String entryName : classPath) {
File classPathEntry = new File(entryName);
@@ -150,58 +151,6 @@
/**
* Finds all classes and sub packages that are below the packageName and
- * add them to the respective sets. Searches the package in a class directory.
- */
- private void findClassesInDirectory(File classDir,
- String packagePrefix, String pathPrefix, Set<String> classNames,
- Set<String> subpackageNames)
- throws IOException {
- File directory = new File(classDir, pathPrefix);
-
- if (directory.exists()) {
- for (File f : directory.listFiles()) {
- String name = f.getName();
- if (name.endsWith(CLASS_EXTENSION) && isToplevelClass(name)) {
- classNames.add(packagePrefix + getClassName(name));
- } else if (f.isDirectory()) {
- subpackageNames.add(packagePrefix + name);
- }
- }
- }
- }
-
- /**
- * Finds all classes and sub packages that are below the packageName and
- * add them to the respective sets. Searches the package in a single jar file.
- */
- private void findClassesInJar(File jarFile, String pathPrefix,
- Set<String> classNames, Set<String> subpackageNames)
- throws IOException {
- Set<String> entryNames = getJarEntries(jarFile);
- // check if the Jar contains the package.
- if (!entryNames.contains(pathPrefix)) {
- return;
- }
- int prefixLength = pathPrefix.length();
- for (String entryName : entryNames) {
- if (entryName.startsWith(pathPrefix)) {
- if (entryName.endsWith(CLASS_EXTENSION)) {
- // check if the class is in the package itself or in one of its
- // subpackages.
- int index = entryName.indexOf('/', prefixLength);
- if (index >= 0) {
- String p = entryName.substring(0, index).replace('/', '.');
- subpackageNames.add(p);
- } else if (isToplevelClass(entryName)) {
- classNames.add(getClassName(entryName).replace('/', '.'));
- }
- }
- }
- }
- }
-
- /**
- * Finds all classes and sub packages that are below the packageName and
* add them to the respective sets. Searches the package in a single apk file.
*/
private void findClassesInApk(String apkPath, String packageName,
@@ -242,47 +191,6 @@
}
/**
- * Gets the class and package entries from a Jar.
- */
- private Set<String> getJarEntries(File jarFile)
- throws IOException {
- Set<String> entryNames = jarFiles.get(jarFile);
- if (entryNames == null) {
- entryNames = new HashSet<>();
- ZipFile zipFile = new ZipFile(jarFile);
- Enumeration<? extends ZipEntry> entries = zipFile.entries();
- while (entries.hasMoreElements()) {
- String entryName = entries.nextElement().getName();
- if (entryName.endsWith(CLASS_EXTENSION)) {
- // add the entry name of the class
- entryNames.add(entryName);
-
- // add the entry name of the classes package, i.e. the entry name of
- // the directory that the class is in. Used to quickly skip jar files
- // if they do not contain a certain package.
- //
- // Also add parent packages so that a JAR that contains
- // pkg1/pkg2/Foo.class will be marked as containing pkg1/ in addition
- // to pkg1/pkg2/ and pkg1/pkg2/Foo.class. We're still interested in
- // JAR files that contains subpackages of a given package, even if
- // an intermediate package contains no direct classes.
- //
- // Classes in the default package will cause a single package named
- // "" to be added instead.
- int lastIndex = entryName.lastIndexOf('/');
- do {
- String packageName = entryName.substring(0, lastIndex + 1);
- entryNames.add(packageName);
- lastIndex = entryName.lastIndexOf('/', lastIndex - 1);
- } while (lastIndex > 0);
- }
- }
- jarFiles.put(jarFile, entryNames);
- }
- return entryNames;
- }
-
- /**
* Checks if a given file name represents a toplevel class.
*/
private static boolean isToplevelClass(String fileName) {
@@ -290,14 +198,6 @@
}
/**
- * Given the absolute path of a class file, return the class name.
- */
- private static String getClassName(String className) {
- int classNameEnd = className.length() - CLASS_EXTENSION.length();
- return className.substring(0, classNameEnd);
- }
-
- /**
* Gets the class path from the System Property "java.class.path" and splits
* it up into the individual elements.
*/
@@ -307,7 +207,56 @@
return classPath.split(Pattern.quote(separator));
}
- public void setClassLoader(ClassLoader classLoader) {
- this.classLoader = classLoader;
+ /**
+ * The Package object doesn't allow you to iterate over the contained
+ * classes and subpackages of that package. This is a version that does.
+ */
+ private class ClassPathPackageInfo {
+
+ private final String packageName;
+ private final Set<String> subpackageNames;
+ private final Set<Class<?>> topLevelClasses;
+
+ private ClassPathPackageInfo(String packageName,
+ Set<String> subpackageNames, Set<Class<?>> topLevelClasses) {
+ this.packageName = packageName;
+ this.subpackageNames = Collections.unmodifiableSet(subpackageNames);
+ this.topLevelClasses = Collections.unmodifiableSet(topLevelClasses);
+ }
+
+ private Set<ClassPathPackageInfo> getSubpackages() {
+ Set<ClassPathPackageInfo> info = new HashSet<>();
+ for (String name : subpackageNames) {
+ info.add(cache.get(name));
+ }
+ return info;
+ }
+
+ private Set<Class<?>> getTopLevelClassesRecursive() {
+ Set<Class<?>> set = new HashSet<>();
+ addTopLevelClassesTo(set);
+ return set;
+ }
+
+ private void addTopLevelClassesTo(Set<Class<?>> set) {
+ set.addAll(topLevelClasses);
+ for (ClassPathPackageInfo info : getSubpackages()) {
+ info.addTopLevelClassesTo(set);
+ }
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof ClassPathPackageInfo) {
+ ClassPathPackageInfo that = (ClassPathPackageInfo) obj;
+ return (this.packageName).equals(that.packageName);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return packageName.hashCode();
+ }
}
}
diff --git a/test-runner/src/android/test/DatabaseTestUtils.java b/test-runner/src/android/test/DatabaseTestUtils.java
deleted file mode 100644
index 1980d92..0000000
--- a/test-runner/src/android/test/DatabaseTestUtils.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2008 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.test;
-
-import android.database.sqlite.SQLiteDatabase;
-import android.database.Cursor;
-
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * A collection of utilities for writing unit tests for database code.
- * @hide pending API council approval
- */
-@Deprecated
-public class DatabaseTestUtils {
-
- /**
- * Compares the schema of two databases and asserts that they are equal.
- * @param expectedDb the db that is known to have the correct schema
- * @param db the db whose schema should be checked
- */
- public static void assertSchemaEquals(SQLiteDatabase expectedDb, SQLiteDatabase db) {
- Set<String> expectedSchema = getSchemaSet(expectedDb);
- Set<String> schema = getSchemaSet(db);
- MoreAsserts.assertEquals(expectedSchema, schema);
- }
-
- private static Set<String> getSchemaSet(SQLiteDatabase db) {
- Set<String> schemaSet = new HashSet<>();
-
- Cursor entityCursor = db.rawQuery("SELECT sql FROM sqlite_master", null);
- try {
- while (entityCursor.moveToNext()) {
- String sql = entityCursor.getString(0);
- schemaSet.add(sql);
- }
- } finally {
- entityCursor.close();
- }
- return schemaSet;
- }
-}
diff --git a/test-runner/src/android/test/InstrumentationCoreTestRunner.java b/test-runner/src/android/test/InstrumentationCoreTestRunner.java
deleted file mode 100644
index 2b05e4a..0000000
--- a/test-runner/src/android/test/InstrumentationCoreTestRunner.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Copyright (C) 2008 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.test;
-
-import java.io.File;
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.util.List;
-
-import junit.framework.AssertionFailedError;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestListener;
-import android.os.Bundle;
-import android.test.suitebuilder.TestMethod;
-import android.test.suitebuilder.annotation.HasAnnotation;
-import android.util.Log;
-
-/**
- * This test runner extends the default InstrumentationTestRunner. It overrides
- * the {@code onCreate(Bundle)} method and sets the system properties necessary
- * for many core tests to run. This is needed because there are some core tests
- * that need writing access to the file system. We also need to set the harness
- * Thread's context ClassLoader. Otherwise some classes and resources will not
- * be found. Finally, we add a means to free memory allocated by a TestCase
- * after its execution.
- *
- * @hide
- */
-@Deprecated
-public class InstrumentationCoreTestRunner extends InstrumentationTestRunner {
-
- /**
- * Convenience definition of our log tag.
- */
- private static final String TAG = "InstrumentationCoreTestRunner";
-
- /**
- * True if (and only if) we are running in single-test mode (as opposed to
- * batch mode).
- */
- private boolean singleTest = false;
-
- @Override
- public void onCreate(Bundle arguments) {
- // We might want to move this to /sdcard, if is is mounted/writable.
- File cacheDir = getTargetContext().getCacheDir();
-
- // Set some properties that the core tests absolutely need.
- System.setProperty("user.language", "en");
- System.setProperty("user.region", "US");
-
- System.setProperty("java.home", cacheDir.getAbsolutePath());
- System.setProperty("user.home", cacheDir.getAbsolutePath());
- System.setProperty("java.io.tmpdir", cacheDir.getAbsolutePath());
-
- if (arguments != null) {
- String classArg = arguments.getString(ARGUMENT_TEST_CLASS);
- singleTest = classArg != null && classArg.contains("#");
- }
-
- super.onCreate(arguments);
- }
-
- @Override
- protected AndroidTestRunner getAndroidTestRunner() {
- AndroidTestRunner runner = super.getAndroidTestRunner();
-
- runner.addTestListener(new TestListener() {
- /**
- * The last test class we executed code from.
- */
- private Class<?> lastClass;
-
- /**
- * The minimum time we expect a test to take.
- */
- private static final int MINIMUM_TIME = 100;
-
- /**
- * The start time of our current test in System.currentTimeMillis().
- */
- private long startTime;
-
- public void startTest(Test test) {
- if (test.getClass() != lastClass) {
- lastClass = test.getClass();
- printMemory(test.getClass());
- }
-
- Thread.currentThread().setContextClassLoader(
- test.getClass().getClassLoader());
-
- startTime = System.currentTimeMillis();
- }
-
- public void endTest(Test test) {
- if (test instanceof TestCase) {
- cleanup((TestCase)test);
-
- /*
- * Make sure all tests take at least MINIMUM_TIME to
- * complete. If they don't, we wait a bit. The Cupcake
- * Binder can't handle too many operations in a very
- * short time, which causes headache for the CTS.
- */
- long timeTaken = System.currentTimeMillis() - startTime;
-
- if (timeTaken < MINIMUM_TIME) {
- try {
- Thread.sleep(MINIMUM_TIME - timeTaken);
- } catch (InterruptedException ignored) {
- // We don't care.
- }
- }
- }
- }
-
- public void addError(Test test, Throwable t) {
- // This space intentionally left blank.
- }
-
- public void addFailure(Test test, AssertionFailedError t) {
- // This space intentionally left blank.
- }
-
- /**
- * Dumps some memory info.
- */
- private void printMemory(Class<? extends Test> testClass) {
- Runtime runtime = Runtime.getRuntime();
-
- long total = runtime.totalMemory();
- long free = runtime.freeMemory();
- long used = total - free;
-
- Log.d(TAG, "Total memory : " + total);
- Log.d(TAG, "Used memory : " + used);
- Log.d(TAG, "Free memory : " + free);
- Log.d(TAG, "Now executing : " + testClass.getName());
- }
-
- /**
- * Nulls all non-static reference fields in the given test class.
- * This method helps us with those test classes that don't have an
- * explicit tearDown() method. Normally the garbage collector should
- * take care of everything, but since JUnit keeps references to all
- * test cases, a little help might be a good idea.
- */
- private void cleanup(TestCase test) {
- Class<?> clazz = test.getClass();
-
- while (clazz != TestCase.class) {
- Field[] fields = clazz.getDeclaredFields();
- for (int i = 0; i < fields.length; i++) {
- Field f = fields[i];
- if (!f.getType().isPrimitive() &&
- !Modifier.isStatic(f.getModifiers())) {
- try {
- f.setAccessible(true);
- f.set(test, null);
- } catch (Exception ignored) {
- // Nothing we can do about it.
- }
- }
- }
-
- clazz = clazz.getSuperclass();
- }
- }
-
- });
-
- return runner;
- }
-}
diff --git a/test-runner/src/android/test/InstrumentationTestRunner.java b/test-runner/src/android/test/InstrumentationTestRunner.java
index 9bd4c96..b2582c1 100644
--- a/test-runner/src/android/test/InstrumentationTestRunner.java
+++ b/test-runner/src/android/test/InstrumentationTestRunner.java
@@ -16,21 +16,18 @@
package android.test;
+import android.test.suitebuilder.annotation.MediumTest;
+import android.test.suitebuilder.annotation.SmallTest;
import com.android.internal.util.Predicate;
-import com.android.internal.util.Predicates;
import android.app.Activity;
import android.app.Instrumentation;
import android.os.Bundle;
import android.os.Debug;
import android.os.Looper;
-import android.os.Parcelable;
-import android.os.PerformanceCollector;
-import android.os.PerformanceCollector.PerformanceResultsWriter;
import android.test.suitebuilder.TestMethod;
import android.test.suitebuilder.TestPredicates;
import android.test.suitebuilder.TestSuiteBuilder;
-import android.test.suitebuilder.annotation.HasAnnotation;
import android.test.suitebuilder.annotation.LargeTest;
import android.util.Log;
@@ -52,6 +49,8 @@
import junit.runner.BaseTestRunner;
import junit.textui.ResultPrinter;
+import static android.test.suitebuilder.TestPredicates.hasAnnotation;
+
/**
* An {@link Instrumentation} that runs various types of {@link junit.framework.TestCase}s against
* an Android package (application).
@@ -178,13 +177,13 @@
public class InstrumentationTestRunner extends Instrumentation implements TestSuiteProvider {
/** @hide */
- public static final String ARGUMENT_TEST_CLASS = "class";
+ static final String ARGUMENT_TEST_CLASS = "class";
/** @hide */
- public static final String ARGUMENT_TEST_PACKAGE = "package";
+ private static final String ARGUMENT_TEST_PACKAGE = "package";
/** @hide */
- public static final String ARGUMENT_TEST_SIZE_PREDICATE = "size";
+ private static final String ARGUMENT_TEST_SIZE_PREDICATE = "size";
/** @hide */
- public static final String ARGUMENT_DELAY_MSEC = "delay_msec";
+ static final String ARGUMENT_DELAY_MSEC = "delay_msec";
private static final String SMALL_SUITE = "small";
private static final String MEDIUM_SUITE = "medium";
@@ -196,6 +195,12 @@
/** @hide */
static final String ARGUMENT_NOT_ANNOTATION = "notAnnotation";
+ private static final Predicate<TestMethod> SELECT_SMALL = hasAnnotation(SmallTest.class);
+
+ private static final Predicate<TestMethod> SELECT_MEDIUM = hasAnnotation(MediumTest.class);
+
+ private static final Predicate<TestMethod> SELECT_LARGE = hasAnnotation(LargeTest.class);
+
/**
* This constant defines the maximum allowed runtime (in ms) for a test included in the "small"
* suite. It is used to make an educated guess at what suite an unlabeled test belongs.
@@ -208,7 +213,7 @@
*/
private static final float MEDIUM_SUITE_MAX_RUNTIME = 1000;
- /**
+ /*
* The following keys are used in the status bundle to provide structured reports to
* an IInstrumentationWatcher.
*/
@@ -390,7 +395,6 @@
WatcherResultPrinter resultPrinter = new WatcherResultPrinter(mTestCount);
mTestRunner.addTestListener(new TestPrinter("TestRunner", false));
mTestRunner.addTestListener(resultPrinter);
- mTestRunner.setPerformanceResultsWriter(resultPrinter);
}
start();
}
@@ -464,11 +468,11 @@
private Predicate<TestMethod> getSizePredicateFromArg(String sizeArg) {
if (SMALL_SUITE.equals(sizeArg)) {
- return TestPredicates.SELECT_SMALL;
+ return SELECT_SMALL;
} else if (MEDIUM_SUITE.equals(sizeArg)) {
- return TestPredicates.SELECT_MEDIUM;
+ return SELECT_MEDIUM;
} else if (LARGE_SUITE.equals(sizeArg)) {
- return TestPredicates.SELECT_LARGE;
+ return SELECT_LARGE;
} else {
return null;
}
@@ -476,28 +480,28 @@
/**
* Returns the test predicate object, corresponding to the annotation class value provided via
- * the {@link ARGUMENT_ANNOTATION} argument.
+ * the {@link #ARGUMENT_ANNOTATION} argument.
*
* @return the predicate or <code>null</code>
*/
private Predicate<TestMethod> getAnnotationPredicate(String annotationClassName) {
Class<? extends Annotation> annotationClass = getAnnotationClass(annotationClassName);
if (annotationClass != null) {
- return new HasAnnotation(annotationClass);
+ return hasAnnotation(annotationClass);
}
return null;
}
/**
* Returns the negative test predicate object, corresponding to the annotation class value
- * provided via the {@link ARGUMENT_NOT_ANNOTATION} argument.
+ * provided via the {@link #ARGUMENT_NOT_ANNOTATION} argument.
*
* @return the predicate or <code>null</code>
*/
private Predicate<TestMethod> getNotAnnotationPredicate(String annotationClassName) {
Class<? extends Annotation> annotationClass = getAnnotationClass(annotationClassName);
if (annotationClass != null) {
- return Predicates.not(new HasAnnotation(annotationClass));
+ return TestPredicates.not(hasAnnotation(annotationClass));
}
return null;
}
@@ -743,15 +747,12 @@
/**
* This class sends status reports back to the IInstrumentationWatcher
*/
- private class WatcherResultPrinter implements TestListener, PerformanceResultsWriter {
+ private class WatcherResultPrinter implements TestListener {
private final Bundle mResultTemplate;
Bundle mTestResult;
int mTestNum = 0;
int mTestResultCode = 0;
String mTestClass = null;
- PerformanceCollector mPerfCollector = new PerformanceCollector();
- boolean mIsTimedTest = false;
- boolean mIncludeDetailedStats = false;
public WatcherResultPrinter(int numTests) {
mResultTemplate = new Bundle();
@@ -806,30 +807,6 @@
sendStatus(REPORT_VALUE_RESULT_START, mTestResult);
mTestResultCode = 0;
-
- mIsTimedTest = false;
- mIncludeDetailedStats = false;
- try {
- // Look for TimedTest annotation on both test class and test method
- if (testMethod != null && testMethod.isAnnotationPresent(TimedTest.class)) {
- mIsTimedTest = true;
- mIncludeDetailedStats = testMethod.getAnnotation(
- TimedTest.class).includeDetailedStats();
- } else if (test.getClass().isAnnotationPresent(TimedTest.class)) {
- mIsTimedTest = true;
- mIncludeDetailedStats = test.getClass().getAnnotation(
- TimedTest.class).includeDetailedStats();
- }
- } catch (SecurityException e) {
- // ignore - the test with given name cannot be accessed. Will be handled during
- // test execution
- }
-
- if (mIsTimedTest && mIncludeDetailedStats) {
- mPerfCollector.beginSnapshot("");
- } else if (mIsTimedTest) {
- mPerfCollector.startTiming("");
- }
}
/**
@@ -860,12 +837,6 @@
* @see junit.framework.TestListener#endTest(Test)
*/
public void endTest(Test test) {
- if (mIsTimedTest && mIncludeDetailedStats) {
- mTestResult.putAll(mPerfCollector.endSnapshot());
- } else if (mIsTimedTest) {
- writeStopTiming(mPerfCollector.stopTiming(""));
- }
-
if (mTestResultCode == 0) {
mTestResult.putString(Instrumentation.REPORT_KEY_STREAMRESULT, ".");
}
@@ -878,50 +849,6 @@
}
}
- public void writeBeginSnapshot(String label) {
- // Do nothing
- }
-
- public void writeEndSnapshot(Bundle results) {
- // Copy all snapshot data fields into mResults, which is outputted
- // via Instrumentation.finish
- mResults.putAll(results);
- }
-
- public void writeStartTiming(String label) {
- // Do nothing
- }
-
- public void writeStopTiming(Bundle results) {
- // Copy results into mTestResult by flattening list of iterations,
- // which is outputted via WatcherResultPrinter.endTest
- int i = 0;
- for (Parcelable p :
- results.getParcelableArrayList(PerformanceCollector.METRIC_KEY_ITERATIONS)) {
- Bundle iteration = (Bundle)p;
- String index = "iteration" + i + ".";
- mTestResult.putString(index + PerformanceCollector.METRIC_KEY_LABEL,
- iteration.getString(PerformanceCollector.METRIC_KEY_LABEL));
- mTestResult.putLong(index + PerformanceCollector.METRIC_KEY_CPU_TIME,
- iteration.getLong(PerformanceCollector.METRIC_KEY_CPU_TIME));
- mTestResult.putLong(index + PerformanceCollector.METRIC_KEY_EXECUTION_TIME,
- iteration.getLong(PerformanceCollector.METRIC_KEY_EXECUTION_TIME));
- i++;
- }
- }
-
- public void writeMeasurement(String label, long value) {
- mTestResult.putLong(label, value);
- }
-
- public void writeMeasurement(String label, float value) {
- mTestResult.putFloat(label, value);
- }
-
- public void writeMeasurement(String label, String value) {
- mTestResult.putString(label, value);
- }
-
// TODO report the end of the cycle
}
}
diff --git a/test-runner/src/android/test/InstrumentationUtils.java b/test-runner/src/android/test/InstrumentationUtils.java
deleted file mode 100644
index cc50813..0000000
--- a/test-runner/src/android/test/InstrumentationUtils.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2007 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.test;
-
-/**
- * The InstrumentationUtils class has all the utility functions needed for
- * instrumentation tests.
- *
- * {@hide} - Not currently used.
- */
-@Deprecated
-public class InstrumentationUtils {
- /**
- * An utility function that returns the menu identifier for a particular
- * menu item.
- *
- * @param cls Class object of the class that handles the menu ite,.
- * @param identifier Menu identifier.
- * @return The integer corresponding to the menu item.
- */
- public static int getMenuIdentifier(Class cls, String identifier) {
- int id = -1;
- try {
- Integer field = (Integer)cls.getDeclaredField(identifier).get(cls);
- id = field.intValue();
- } catch (NoSuchFieldException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
- return id;
- }
-
-}
diff --git a/test-runner/src/android/test/PackageInfoSources.java b/test-runner/src/android/test/PackageInfoSources.java
deleted file mode 100644
index 205f86b..0000000
--- a/test-runner/src/android/test/PackageInfoSources.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2008 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.test;
-
-/**
- * {@hide} Not needed for SDK.
- */
-@Deprecated
-public class PackageInfoSources {
-
- private static ClassPathPackageInfoSource classPathSource;
-
- private PackageInfoSources() {
- }
-
- public static ClassPathPackageInfoSource forClassPath(ClassLoader classLoader) {
- if (classPathSource == null) {
- classPathSource = new ClassPathPackageInfoSource();
- classPathSource.setClassLoader(classLoader);
- }
- return classPathSource;
- }
-
-}
diff --git a/test-runner/src/android/test/PerformanceCollectorTestCase.java b/test-runner/src/android/test/PerformanceCollectorTestCase.java
deleted file mode 100644
index 3a5dafc..0000000
--- a/test-runner/src/android/test/PerformanceCollectorTestCase.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2009 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.test;
-
-import android.os.PerformanceCollector;
-import android.os.PerformanceCollector.PerformanceResultsWriter;
-
-/**
- * A simple interface for passing in a PerformanceResultsWriter instance to be used with
- * PerformanceCollector.
- * <p/>
- * A one line implementation of {@link #setPerformanceResultsWriter(PerformanceResultsWriter)}
- * is sufficient in most cases:
- * <p/>
- * <code>mPerfCollector.setPerformanceResultsWriter(writer);</code>
- *
- * {@hide} Not needed for SDK.
- */
-@Deprecated
-public interface PerformanceCollectorTestCase {
- public PerformanceCollector mPerfCollector = new PerformanceCollector();
-
- public void setPerformanceResultsWriter(PerformanceResultsWriter writer);
-}
diff --git a/test-runner/src/android/test/TestCase.java b/test-runner/src/android/test/TestCase.java
deleted file mode 100644
index b234f44..0000000
--- a/test-runner/src/android/test/TestCase.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2006 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.test;
-
-import android.content.Context;
-
-/**
- * {@hide}
- * More complex interface for test cases.
- *
- * <p>Just implementing Runnable is enough for many test cases. If you
- * have additional setup or teardown, this interface might be for you,
- * especially if you need to share it between different test cases, or your
- * teardown code must execute regardless of whether your test passed.
- *
- * <p>See the android.test package documentation (click the more... link)
- * for a full description
- */
-@Deprecated
-public interface TestCase extends Runnable
-{
- /**
- * Called before run() is called.
- */
- public void setUp(Context context);
-
- /**
- * Called after run() is called, even if run() threw an exception, but
- * not if setUp() threw an execption.
- */
- public void tearDown();
-}
-
diff --git a/test-runner/src/android/test/TestCaseUtil.java b/test-runner/src/android/test/TestCaseUtil.java
index dc053a2..1562909 100644
--- a/test-runner/src/android/test/TestCaseUtil.java
+++ b/test-runner/src/android/test/TestCaseUtil.java
@@ -40,16 +40,6 @@
private TestCaseUtil() {
}
- @SuppressWarnings("unchecked")
- public static List<String> getTestCaseNames(Test test, boolean flatten) {
- List<Test> tests = (List<Test>) getTests(test, flatten);
- List<String> testCaseNames = new ArrayList<>();
- for (Test aTest : tests) {
- testCaseNames.add(getTestName(aTest));
- }
- return testCaseNames;
- }
-
public static List<? extends Test> getTests(Test test, boolean flatten) {
return getTests(test, flatten, new HashSet<Class<?>>());
}
@@ -92,7 +82,7 @@
return testCases;
}
- private static Test invokeSuiteMethodIfPossible(Class testClass,
+ static Test invokeSuiteMethodIfPossible(Class testClass,
Set<Class<?>> seen) {
try {
Method suiteMethod = testClass.getMethod(
@@ -120,7 +110,7 @@
return null;
}
- public static String getTestName(Test test) {
+ static String getTestName(Test test) {
if (test instanceof TestCase) {
TestCase testCase = (TestCase) test;
return testCase.getName();
@@ -138,34 +128,4 @@
}
return "";
}
-
- public static Test getTestAtIndex(TestSuite testSuite, int position) {
- int index = 0;
- Enumeration enumeration = testSuite.tests();
- while (enumeration.hasMoreElements()) {
- Test test = (Test) enumeration.nextElement();
- if (index == position) {
- return test;
- }
- index++;
- }
- return null;
- }
-
- public static TestSuite createTestSuite(Class<? extends Test> testClass)
- throws InstantiationException, IllegalAccessException {
-
- Test test = invokeSuiteMethodIfPossible(testClass,
- new HashSet<Class<?>>());
- if (test == null) {
- return new TestSuite(testClass);
-
- } else if (TestCase.class.isAssignableFrom(test.getClass())) {
- TestSuite testSuite = new TestSuite(test.getClass().getName());
- testSuite.addTest(test);
- return testSuite;
- }
-
- return (TestSuite) test;
- }
}
diff --git a/test-runner/src/android/test/TestPrinter.java b/test-runner/src/android/test/TestPrinter.java
index a23f06d..01d392d 100644
--- a/test-runner/src/android/test/TestPrinter.java
+++ b/test-runner/src/android/test/TestPrinter.java
@@ -21,7 +21,6 @@
import junit.framework.TestListener;
import java.util.HashSet;
-import java.util.List;
import java.util.Set;
/**
@@ -34,52 +33,37 @@
* {@hide} Not needed for 1.0 SDK.
*/
@Deprecated
-public class TestPrinter implements TestRunner.Listener, TestListener {
+class TestPrinter implements TestListener {
private String mTag;
private boolean mOnlyFailures;
private Set<String> mFailedTests = new HashSet<String>();
- public TestPrinter(String tag, boolean onlyFailures) {
+ TestPrinter(String tag, boolean onlyFailures) {
mTag = tag;
mOnlyFailures = onlyFailures;
}
- public void started(String className) {
+ private void started(String className) {
if (!mOnlyFailures) {
Log.i(mTag, "started: " + className);
}
}
- public void finished(String className) {
+ private void finished(String className) {
if (!mOnlyFailures) {
Log.i(mTag, "finished: " + className);
}
}
- public void performance(String className,
- long itemTimeNS, int iterations,
- List<TestRunner.IntermediateTime> intermediates) {
- Log.i(mTag, "perf: " + className + " = " + itemTimeNS + "ns/op (done "
- + iterations + " times)");
- if (intermediates != null && intermediates.size() > 0) {
- int N = intermediates.size();
- for (int i = 0; i < N; i++) {
- TestRunner.IntermediateTime time = intermediates.get(i);
- Log.i(mTag, " intermediate: " + time.name + " = "
- + time.timeInNS + "ns");
- }
- }
- }
-
- public void passed(String className) {
+ private void passed(String className) {
if (!mOnlyFailures) {
Log.i(mTag, "passed: " + className);
}
}
- public void failed(String className, Throwable exception) {
+ private void failed(String className, Throwable exception) {
Log.i(mTag, "failed: " + className);
Log.i(mTag, "----- begin exception -----");
Log.i(mTag, "", exception);
diff --git a/test-runner/src/android/test/TestRunner.java b/test-runner/src/android/test/TestRunner.java
deleted file mode 100644
index ff045c3..0000000
--- a/test-runner/src/android/test/TestRunner.java
+++ /dev/null
@@ -1,725 +0,0 @@
-/*
- * Copyright (C) 2006 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.test;
-
-import android.content.Context;
-import android.util.Log;
-import android.os.Debug;
-import android.os.SystemClock;
-
-import java.io.File;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.List;
-
-import junit.framework.TestSuite;
-import junit.framework.TestListener;
-import junit.framework.Test;
-import junit.framework.TestResult;
-
-/**
- * Support class that actually runs a test. Android uses this class,
- * and you probably will not need to instantiate, extend, or call this
- * class yourself. See the full {@link android.test} package description
- * to learn more about testing Android applications.
- *
- * {@hide} Not needed for 1.0 SDK.
- */
-@Deprecated
-public class TestRunner implements PerformanceTestCase.Intermediates {
- public static final int REGRESSION = 0;
- public static final int PERFORMANCE = 1;
- public static final int PROFILING = 2;
-
- public static final int CLEARSCREEN = 0;
- private static final String TAG = "TestHarness";
- private Context mContext;
-
- private int mMode = REGRESSION;
-
- private List<Listener> mListeners = new ArrayList<>();
- private int mPassed;
- private int mFailed;
-
- private int mInternalIterations;
- private long mStartTime;
- private long mEndTime;
-
- private String mClassName;
-
- List<IntermediateTime> mIntermediates = null;
-
- private static Class mRunnableClass;
- private static Class mJUnitClass;
-
- static {
- try {
- mRunnableClass = Class.forName("java.lang.Runnable", false, null);
- mJUnitClass = Class.forName("junit.framework.TestCase", false, null);
- } catch (ClassNotFoundException ex) {
- throw new RuntimeException("shouldn't happen", ex);
- }
- }
-
- public class JunitTestSuite extends TestSuite implements TestListener {
- boolean mError = false;
-
- public JunitTestSuite() {
- super();
- }
-
- @Override
- public void run(TestResult result) {
- result.addListener(this);
- super.run(result);
- result.removeListener(this);
- }
-
- /**
- * Implemented method of the interface TestListener which will listen for the
- * start of a test.
- *
- * @param test
- */
- public void startTest(Test test) {
- started(test.toString());
- }
-
- /**
- * Implemented method of the interface TestListener which will listen for the
- * end of the test.
- *
- * @param test
- */
- public void endTest(Test test) {
- finished(test.toString());
- if (!mError) {
- passed(test.toString());
- }
- }
-
- /**
- * Implemented method of the interface TestListener which will listen for an
- * mError while running the test.
- *
- * @param test
- */
- public void addError(Test test, Throwable t) {
- mError = true;
- failed(test.toString(), t);
- }
-
- public void addFailure(Test test, junit.framework.AssertionFailedError t) {
- mError = true;
- failed(test.toString(), t);
- }
- }
-
- /**
- * Listener.performance() 'intermediates' argument is a list of these.
- */
- public static class IntermediateTime {
- public IntermediateTime(String name, long timeInNS) {
- this.name = name;
- this.timeInNS = timeInNS;
- }
-
- public String name;
- public long timeInNS;
- }
-
- /**
- * Support class that receives status on test progress. You should not need to
- * extend this interface yourself.
- */
- public interface Listener {
- void started(String className);
- void finished(String className);
- void performance(String className,
- long itemTimeNS, int iterations,
- List<IntermediateTime> itermediates);
- void passed(String className);
- void failed(String className, Throwable execption);
- }
-
- public TestRunner(Context context) {
- mContext = context;
- }
-
- public void addListener(Listener listener) {
- mListeners.add(listener);
- }
-
- public void startProfiling() {
- File file = new File("/tmp/trace");
- file.mkdir();
- String base = "/tmp/trace/" + mClassName + ".dmtrace";
- Debug.startMethodTracing(base, 8 * 1024 * 1024);
- }
-
- public void finishProfiling() {
- Debug.stopMethodTracing();
- }
-
- private void started(String className) {
-
- int count = mListeners.size();
- for (int i = 0; i < count; i++) {
- mListeners.get(i).started(className);
- }
- }
-
- private void finished(String className) {
- int count = mListeners.size();
- for (int i = 0; i < count; i++) {
- mListeners.get(i).finished(className);
- }
- }
-
- private void performance(String className,
- long itemTimeNS,
- int iterations,
- List<IntermediateTime> intermediates) {
- int count = mListeners.size();
- for (int i = 0; i < count; i++) {
- mListeners.get(i).performance(className,
- itemTimeNS,
- iterations,
- intermediates);
- }
- }
-
- public void passed(String className) {
- mPassed++;
- int count = mListeners.size();
- for (int i = 0; i < count; i++) {
- mListeners.get(i).passed(className);
- }
- }
-
- public void failed(String className, Throwable exception) {
- mFailed++;
- int count = mListeners.size();
- for (int i = 0; i < count; i++) {
- mListeners.get(i).failed(className, exception);
- }
- }
-
- public int passedCount() {
- return mPassed;
- }
-
- public int failedCount() {
- return mFailed;
- }
-
- public void run(String[] classes) {
- for (String cl : classes) {
- run(cl);
- }
- }
-
- public void setInternalIterations(int count) {
- mInternalIterations = count;
- }
-
- public void startTiming(boolean realTime) {
- if (realTime) {
- mStartTime = System.currentTimeMillis();
- } else {
- mStartTime = SystemClock.currentThreadTimeMillis();
- }
- }
-
- public void addIntermediate(String name) {
- addIntermediate(name, (System.currentTimeMillis() - mStartTime) * 1000000);
- }
-
- public void addIntermediate(String name, long timeInNS) {
- mIntermediates.add(new IntermediateTime(name, timeInNS));
- }
-
- public void finishTiming(boolean realTime) {
- if (realTime) {
- mEndTime = System.currentTimeMillis();
- } else {
- mEndTime = SystemClock.currentThreadTimeMillis();
- }
- }
-
- public void setPerformanceMode(int mode) {
- mMode = mode;
- }
-
- private void missingTest(String className, Throwable e) {
- started(className);
- finished(className);
- failed(className, e);
- }
-
- /*
- This class determines if more suites are added to this class then adds all individual
- test classes to a test suite for run
- */
- public void run(String className) {
- try {
- mClassName = className;
- Class clazz = mContext.getClassLoader().loadClass(className);
- Method method = getChildrenMethod(clazz);
- if (method != null) {
- String[] children = getChildren(method);
- run(children);
- } else if (mRunnableClass.isAssignableFrom(clazz)) {
- Runnable test = (Runnable) clazz.newInstance();
- TestCase testcase = null;
- if (test instanceof TestCase) {
- testcase = (TestCase) test;
- }
- Throwable e = null;
- boolean didSetup = false;
- started(className);
- try {
- if (testcase != null) {
- testcase.setUp(mContext);
- didSetup = true;
- }
- if (mMode == PERFORMANCE) {
- runInPerformanceMode(test, className, false, className);
- } else if (mMode == PROFILING) {
- //Need a way to mark a test to be run in profiling mode or not.
- startProfiling();
- test.run();
- finishProfiling();
- } else {
- test.run();
- }
- } catch (Throwable ex) {
- e = ex;
- }
- if (testcase != null && didSetup) {
- try {
- testcase.tearDown();
- } catch (Throwable ex) {
- e = ex;
- }
- }
- finished(className);
- if (e == null) {
- passed(className);
- } else {
- failed(className, e);
- }
- } else if (mJUnitClass.isAssignableFrom(clazz)) {
- Throwable e = null;
- //Create a Junit Suite.
- JunitTestSuite suite = new JunitTestSuite();
- Method[] methods = getAllTestMethods(clazz);
- for (Method m : methods) {
- junit.framework.TestCase test = (junit.framework.TestCase) clazz.newInstance();
- test.setName(m.getName());
-
- if (test instanceof AndroidTestCase) {
- AndroidTestCase testcase = (AndroidTestCase) test;
- try {
- testcase.setContext(mContext);
- testcase.setTestContext(mContext);
- } catch (Exception ex) {
- Log.i("TestHarness", ex.toString());
- }
- }
- suite.addTest(test);
- }
- if (mMode == PERFORMANCE) {
- final int testCount = suite.testCount();
-
- for (int j = 0; j < testCount; j++) {
- Test test = suite.testAt(j);
- started(test.toString());
- try {
- runInPerformanceMode(test, className, true, test.toString());
- } catch (Throwable ex) {
- e = ex;
- }
- finished(test.toString());
- if (e == null) {
- passed(test.toString());
- } else {
- failed(test.toString(), e);
- }
- }
- } else if (mMode == PROFILING) {
- //Need a way to mark a test to be run in profiling mode or not.
- startProfiling();
- junit.textui.TestRunner.run(suite);
- finishProfiling();
- } else {
- junit.textui.TestRunner.run(suite);
- }
- } else {
- System.out.println("Test wasn't Runnable and didn't have a"
- + " children method: " + className);
- }
- } catch (ClassNotFoundException e) {
- Log.e("ClassNotFoundException for " + className, e.toString());
- if (isJunitTest(className)) {
- runSingleJunitTest(className);
- } else {
- missingTest(className, e);
- }
- } catch (InstantiationException e) {
- System.out.println("InstantiationException for " + className);
- missingTest(className, e);
- } catch (IllegalAccessException e) {
- System.out.println("IllegalAccessException for " + className);
- missingTest(className, e);
- }
- }
-
- public void runInPerformanceMode(Object testCase, String className, boolean junitTest,
- String testNameInDb) throws Exception {
- boolean increaseIterations = true;
- int iterations = 1;
- long duration = 0;
- mIntermediates = null;
-
- mInternalIterations = 1;
- Class clazz = mContext.getClassLoader().loadClass(className);
- Object perftest = clazz.newInstance();
-
- PerformanceTestCase perftestcase = null;
- if (perftest instanceof PerformanceTestCase) {
- perftestcase = (PerformanceTestCase) perftest;
- // only run the test if it is not marked as a performance only test
- if (mMode == REGRESSION && perftestcase.isPerformanceOnly()) return;
- }
-
- // First force GCs, to avoid GCs happening during out
- // test and skewing its time.
- Runtime.getRuntime().runFinalization();
- Runtime.getRuntime().gc();
-
- if (perftestcase != null) {
- mIntermediates = new ArrayList<IntermediateTime>();
- iterations = perftestcase.startPerformance(this);
- if (iterations > 0) {
- increaseIterations = false;
- } else {
- iterations = 1;
- }
- }
-
- // Pause briefly to let things settle down...
- Thread.sleep(1000);
- do {
- mEndTime = 0;
- if (increaseIterations) {
- // Test case does not implement
- // PerformanceTestCase or returned 0 iterations,
- // so we take care of measure the whole test time.
- mStartTime = SystemClock.currentThreadTimeMillis();
- } else {
- // Try to make it obvious if the test case
- // doesn't call startTiming().
- mStartTime = 0;
- }
-
- if (junitTest) {
- for (int i = 0; i < iterations; i++) {
- junit.textui.TestRunner.run((junit.framework.Test) testCase);
- }
- } else {
- Runnable test = (Runnable) testCase;
- for (int i = 0; i < iterations; i++) {
- test.run();
- }
- }
-
- long endTime = mEndTime;
- if (endTime == 0) {
- endTime = SystemClock.currentThreadTimeMillis();
- }
-
- duration = endTime - mStartTime;
- if (!increaseIterations) {
- break;
- }
- if (duration <= 1) {
- iterations *= 1000;
- } else if (duration <= 10) {
- iterations *= 100;
- } else if (duration < 100) {
- iterations *= 10;
- } else if (duration < 1000) {
- iterations *= (int) ((1000 / duration) + 2);
- } else {
- break;
- }
- } while (true);
-
- if (duration != 0) {
- iterations *= mInternalIterations;
- performance(testNameInDb, (duration * 1000000) / iterations,
- iterations, mIntermediates);
- }
- }
-
- public void runSingleJunitTest(String className) {
- Throwable excep = null;
- int index = className.lastIndexOf('$');
- String testName = "";
- String originalClassName = className;
- if (index >= 0) {
- className = className.substring(0, index);
- testName = originalClassName.substring(index + 1);
- }
- try {
- Class clazz = mContext.getClassLoader().loadClass(className);
- if (mJUnitClass.isAssignableFrom(clazz)) {
- junit.framework.TestCase test = (junit.framework.TestCase) clazz.newInstance();
- JunitTestSuite newSuite = new JunitTestSuite();
- test.setName(testName);
-
- if (test instanceof AndroidTestCase) {
- AndroidTestCase testcase = (AndroidTestCase) test;
- try {
- testcase.setContext(mContext);
- } catch (Exception ex) {
- Log.w(TAG, "Exception encountered while trying to set the context.", ex);
- }
- }
- newSuite.addTest(test);
-
- if (mMode == PERFORMANCE) {
- try {
- started(test.toString());
- runInPerformanceMode(test, className, true, test.toString());
- finished(test.toString());
- if (excep == null) {
- passed(test.toString());
- } else {
- failed(test.toString(), excep);
- }
- } catch (Throwable ex) {
- excep = ex;
- }
-
- } else if (mMode == PROFILING) {
- startProfiling();
- junit.textui.TestRunner.run(newSuite);
- finishProfiling();
- } else {
- junit.textui.TestRunner.run(newSuite);
- }
- }
- } catch (ClassNotFoundException e) {
- Log.e("TestHarness", "No test case to run", e);
- } catch (IllegalAccessException e) {
- Log.e("TestHarness", "Illegal Access Exception", e);
- } catch (InstantiationException e) {
- Log.e("TestHarness", "Instantiation Exception", e);
- }
- }
-
- public static Method getChildrenMethod(Class clazz) {
- try {
- return clazz.getMethod("children", (Class[]) null);
- } catch (NoSuchMethodException e) {
- }
-
- return null;
- }
-
- public static Method getChildrenMethod(Context c, String className) {
- try {
- return getChildrenMethod(c.getClassLoader().loadClass(className));
- } catch (ClassNotFoundException e) {
- }
- return null;
- }
-
- public static String[] getChildren(Context c, String className) {
- Method m = getChildrenMethod(c, className);
- String[] testChildren = getTestChildren(c, className);
- if (m == null & testChildren == null) {
- throw new RuntimeException("couldn't get children method for "
- + className);
- }
- if (m != null) {
- String[] children = getChildren(m);
- if (testChildren != null) {
- String[] allChildren = new String[testChildren.length + children.length];
- System.arraycopy(children, 0, allChildren, 0, children.length);
- System.arraycopy(testChildren, 0, allChildren, children.length, testChildren.length);
- return allChildren;
- } else {
- return children;
- }
- } else {
- if (testChildren != null) {
- return testChildren;
- }
- }
- return null;
- }
-
- public static String[] getChildren(Method m) {
- try {
- if (!Modifier.isStatic(m.getModifiers())) {
- throw new RuntimeException("children method is not static");
- }
- return (String[]) m.invoke(null, (Object[]) null);
- } catch (IllegalAccessException e) {
- } catch (InvocationTargetException e) {
- }
- return new String[0];
- }
-
- public static String[] getTestChildren(Context c, String className) {
- try {
- Class clazz = c.getClassLoader().loadClass(className);
-
- if (mJUnitClass.isAssignableFrom(clazz)) {
- return getTestChildren(clazz);
- }
- } catch (ClassNotFoundException e) {
- Log.e("TestHarness", "No class found", e);
- }
- return null;
- }
-
- public static String[] getTestChildren(Class clazz) {
- Method[] methods = getAllTestMethods(clazz);
-
- String[] onScreenTestNames = new String[methods.length];
- int index = 0;
- for (Method m : methods) {
- onScreenTestNames[index] = clazz.getName() + "$" + m.getName();
- index++;
- }
- return onScreenTestNames;
- }
-
- public static Method[] getAllTestMethods(Class clazz) {
- Method[] allMethods = clazz.getDeclaredMethods();
- int numOfMethods = 0;
- for (Method m : allMethods) {
- boolean mTrue = isTestMethod(m);
- if (mTrue) {
- numOfMethods++;
- }
- }
- int index = 0;
- Method[] testMethods = new Method[numOfMethods];
- for (Method m : allMethods) {
- boolean mTrue = isTestMethod(m);
- if (mTrue) {
- testMethods[index] = m;
- index++;
- }
- }
- return testMethods;
- }
-
- private static boolean isTestMethod(Method m) {
- return m.getName().startsWith("test") &&
- m.getReturnType() == void.class &&
- m.getParameterTypes().length == 0;
- }
-
- public static int countJunitTests(Class clazz) {
- Method[] allTestMethods = getAllTestMethods(clazz);
- int numberofMethods = allTestMethods.length;
-
- return numberofMethods;
- }
-
- public static boolean isTestSuite(Context c, String className) {
- boolean childrenMethods = getChildrenMethod(c, className) != null;
-
- try {
- Class clazz = c.getClassLoader().loadClass(className);
- if (mJUnitClass.isAssignableFrom(clazz)) {
- int numTests = countJunitTests(clazz);
- if (numTests > 0)
- childrenMethods = true;
- }
- } catch (ClassNotFoundException e) {
- }
- return childrenMethods;
- }
-
-
- public boolean isJunitTest(String className) {
- int index = className.lastIndexOf('$');
- if (index >= 0) {
- className = className.substring(0, index);
- }
- try {
- Class clazz = mContext.getClassLoader().loadClass(className);
- if (mJUnitClass.isAssignableFrom(clazz)) {
- return true;
- }
- } catch (ClassNotFoundException e) {
- }
- return false;
- }
-
- /**
- * Returns the number of tests that will be run if you try to do this.
- */
- public static int countTests(Context c, String className) {
- try {
- Class clazz = c.getClassLoader().loadClass(className);
- Method method = getChildrenMethod(clazz);
- if (method != null) {
-
- String[] children = getChildren(method);
- int rv = 0;
- for (String child : children) {
- rv += countTests(c, child);
- }
- return rv;
- } else if (mRunnableClass.isAssignableFrom(clazz)) {
- return 1;
- } else if (mJUnitClass.isAssignableFrom(clazz)) {
- return countJunitTests(clazz);
- }
- } catch (ClassNotFoundException e) {
- return 1; // this gets the count right, because either this test
- // is missing, and it will fail when run or it is a single Junit test to be run.
- }
- return 0;
- }
-
- /**
- * Returns a title to display given the className of a test.
- * <p/>
- * <p>Currently this function just returns the portion of the
- * class name after the last '.'
- */
- public static String getTitle(String className) {
- int indexDot = className.lastIndexOf('.');
- int indexDollar = className.lastIndexOf('$');
- int index = indexDot > indexDollar ? indexDot : indexDollar;
- if (index >= 0) {
- className = className.substring(index + 1);
- }
- return className;
- }
-}
diff --git a/test-runner/src/android/test/TimedTest.java b/test-runner/src/android/test/TimedTest.java
deleted file mode 100644
index cb15ef9..0000000
--- a/test-runner/src/android/test/TimedTest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2009 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.test;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * This annotation can be used on an {@link junit.framework.TestCase}'s test methods. When the
- * annotation is present, the test method is timed and the results written through instrumentation
- * output. It can also be used on the class itself, which is equivalent to tagging all test methods
- * with this annotation.
- * <p/>
- * Setting {@link #includeDetailedStats()} to true causes additional metrics such as memory usage
- * and binder transactions to be gathered and written through instrumentation output.
- *
- * {@hide} Pending approval for public API.
- */
-@Deprecated
-@Retention(RetentionPolicy.RUNTIME)
-public @interface TimedTest {
- boolean includeDetailedStats() default false;
-}
diff --git a/test-runner/src/android/test/suitebuilder/AssignableFrom.java b/test-runner/src/android/test/suitebuilder/AssignableFrom.java
index 38b4ee3..84db066 100644
--- a/test-runner/src/android/test/suitebuilder/AssignableFrom.java
+++ b/test-runner/src/android/test/suitebuilder/AssignableFrom.java
@@ -20,9 +20,9 @@
class AssignableFrom implements Predicate<TestMethod> {
- private final Class root;
+ private final Class<?> root;
- AssignableFrom(Class root) {
+ AssignableFrom(Class<?> root) {
this.root = root;
}
diff --git a/test-runner/src/android/test/suitebuilder/InstrumentationTestSuiteBuilder.java b/test-runner/src/android/test/suitebuilder/InstrumentationTestSuiteBuilder.java
deleted file mode 100644
index 128396e..0000000
--- a/test-runner/src/android/test/suitebuilder/InstrumentationTestSuiteBuilder.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2008 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.test.suitebuilder;
-
-/**
- * A suite builder that finds instrumentation tests.
- *
- * {@hide} Not needed for 1.0 SDK.
- */
-public class InstrumentationTestSuiteBuilder extends TestSuiteBuilder {
-
- public InstrumentationTestSuiteBuilder(Class clazz) {
- this(clazz.getName(), clazz.getClassLoader());
- }
-
-
- public InstrumentationTestSuiteBuilder(String name, ClassLoader classLoader) {
- super(name, classLoader);
- addRequirements(TestPredicates.SELECT_INSTRUMENTATION);
- }
-}
diff --git a/test-runner/src/android/test/suitebuilder/TestGrouping.java b/test-runner/src/android/test/suitebuilder/TestGrouping.java
index a2b94ff..030bc42 100644
--- a/test-runner/src/android/test/suitebuilder/TestGrouping.java
+++ b/test-runner/src/android/test/suitebuilder/TestGrouping.java
@@ -16,9 +16,7 @@
package android.test.suitebuilder;
-import android.test.ClassPathPackageInfo;
import android.test.ClassPathPackageInfoSource;
-import android.test.PackageInfoSources;
import android.util.Log;
import com.android.internal.util.Predicate;
import junit.framework.TestCase;
@@ -44,23 +42,23 @@
*
* {@hide} Not needed for 1.0 SDK.
*/
-public class TestGrouping {
+class TestGrouping {
private static final String LOG_TAG = "TestGrouping";
- SortedSet<Class<? extends TestCase>> testCaseClasses;
+ private final SortedSet<Class<? extends TestCase>> testCaseClasses;
- public static final Comparator<Class<? extends TestCase>> SORT_BY_SIMPLE_NAME
+ static final Comparator<Class<? extends TestCase>> SORT_BY_SIMPLE_NAME
= new SortBySimpleName();
- public static final Comparator<Class<? extends TestCase>> SORT_BY_FULLY_QUALIFIED_NAME
+ static final Comparator<Class<? extends TestCase>> SORT_BY_FULLY_QUALIFIED_NAME
= new SortByFullyQualifiedName();
- protected String firstIncludedPackage = null;
- private ClassLoader classLoader;
+ private final ClassLoader classLoader;
- public TestGrouping(Comparator<Class<? extends TestCase>> comparator) {
+ TestGrouping(Comparator<Class<? extends TestCase>> comparator, ClassLoader classLoader) {
testCaseClasses = new TreeSet<Class<? extends TestCase>>(comparator);
+ this.classLoader = classLoader;
}
/**
@@ -77,15 +75,11 @@
return testMethods;
}
- protected List<Method> getTestMethods(Class<? extends TestCase> testCaseClass) {
+ private List<Method> getTestMethods(Class<? extends TestCase> testCaseClass) {
List<Method> methods = Arrays.asList(testCaseClass.getMethods());
return select(methods, new TestMethodPredicate());
}
- SortedSet<Class<? extends TestCase>> getTestCaseClasses() {
- return testCaseClasses;
- }
-
public boolean equals(Object o) {
if (this == o) {
return true;
@@ -110,9 +104,8 @@
* or in a sub-package.
*
* @param packageNames Names of packages to add.
- * @return The {@link TestGrouping} for method chaining.
*/
- public TestGrouping addPackagesRecursive(String... packageNames) {
+ void addPackagesRecursive(String... packageNames) {
for (String packageName : packageNames) {
List<Class<? extends TestCase>> addedClasses = testCaseClassesInPackage(packageName);
if (addedClasses.isEmpty()) {
@@ -120,11 +113,7 @@
+ "' could not be found or has no tests");
}
testCaseClasses.addAll(addedClasses);
- if (firstIncludedPackage == null) {
- firstIncludedPackage = packageName;
- }
}
- return this;
}
/**
@@ -132,28 +121,17 @@
* specified.
*
* @param packageNames Names of packages to remove.
- * @return The {@link TestGrouping} for method chaining.
*/
- public TestGrouping removePackagesRecursive(String... packageNames) {
+ void removePackagesRecursive(String... packageNames) {
for (String packageName : packageNames) {
testCaseClasses.removeAll(testCaseClassesInPackage(packageName));
}
- return this;
- }
-
- /**
- * @return The first package name passed to {@link #addPackagesRecursive(String[])}, or null
- * if that method was never called.
- */
- public String getFirstIncludedPackage() {
- return firstIncludedPackage;
}
private List<Class<? extends TestCase>> testCaseClassesInPackage(String packageName) {
- ClassPathPackageInfoSource source = PackageInfoSources.forClassPath(classLoader);
- ClassPathPackageInfo packageInfo = source.getPackageInfo(packageName);
+ ClassPathPackageInfoSource source = ClassPathPackageInfoSource.forClassPath(classLoader);
- return selectTestClasses(packageInfo.getTopLevelClassesRecursive());
+ return selectTestClasses(source.getTopLevelClassesRecursive(packageName));
}
@SuppressWarnings("unchecked")
@@ -176,10 +154,6 @@
return selectedItems;
}
- public void setClassLoader(ClassLoader classLoader) {
- this.classLoader = classLoader;
- }
-
/**
* Sort classes by their simple names (i.e. without the package prefix), using
* their packages to sort classes with the same name.
diff --git a/test-runner/src/android/test/suitebuilder/TestPredicates.java b/test-runner/src/android/test/suitebuilder/TestPredicates.java
index 47aca55..616d1a9 100644
--- a/test-runner/src/android/test/suitebuilder/TestPredicates.java
+++ b/test-runner/src/android/test/suitebuilder/TestPredicates.java
@@ -17,30 +17,63 @@
package android.test.suitebuilder;
import android.test.InstrumentationTestCase;
-import android.test.suitebuilder.annotation.HasAnnotation;
-import android.test.suitebuilder.annotation.Suppress;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.SmallTest;
import android.test.suitebuilder.annotation.Smoke;
+import android.test.suitebuilder.annotation.Suppress;
import com.android.internal.util.Predicate;
-import com.android.internal.util.Predicates;
+import java.lang.annotation.Annotation;
/**
* {@hide} Not needed for 1.0 SDK.
*/
public class TestPredicates {
- public static final Predicate<TestMethod> SELECT_INSTRUMENTATION =
- new AssignableFrom(InstrumentationTestCase.class);
- public static final Predicate<TestMethod> REJECT_INSTRUMENTATION =
- Predicates.not(SELECT_INSTRUMENTATION);
+ static final Predicate<TestMethod> REJECT_INSTRUMENTATION =
+ not(new AssignableFrom(InstrumentationTestCase.class));
- public static final Predicate<TestMethod> SELECT_SMOKE = new HasAnnotation(Smoke.class);
- public static final Predicate<TestMethod> SELECT_SMALL = new HasAnnotation(SmallTest.class);
- public static final Predicate<TestMethod> SELECT_MEDIUM = new HasAnnotation(MediumTest.class);
- public static final Predicate<TestMethod> SELECT_LARGE = new HasAnnotation(LargeTest.class);
- public static final Predicate<TestMethod> REJECT_SUPPRESSED =
- Predicates.not(new HasAnnotation(Suppress.class));
+ static final Predicate<TestMethod> SELECT_SMOKE = hasAnnotation(Smoke.class);
+ static final Predicate<TestMethod> REJECT_SUPPRESSED = not(hasAnnotation(Suppress.class));
+
+ /**
+ * Return a predicate that checks to see if a {@link TestMethod} has an instance of the supplied
+ * annotation class, either on the method or on the containing class.
+ */
+ public static Predicate<TestMethod> hasAnnotation(Class<? extends Annotation> annotationClass) {
+ return new HasAnnotation(annotationClass);
+ }
+
+ private static class HasAnnotation implements Predicate<TestMethod> {
+
+ private final Class<? extends Annotation> annotationClass;
+
+ private HasAnnotation(Class<? extends Annotation> annotationClass) {
+ this.annotationClass = annotationClass;
+ }
+
+ @Override
+ public boolean apply(TestMethod testMethod) {
+ return testMethod.getAnnotation(annotationClass) != null ||
+ testMethod.getEnclosingClass().getAnnotation(annotationClass) != null;
+ }
+ }
+
+ /**
+ * Returns a Predicate that evaluates to true iff the given Predicate
+ * evaluates to false.
+ */
+ public static <T> Predicate<T> not(Predicate<? super T> predicate) {
+ return new NotPredicate<T>(predicate);
+ }
+
+ private static class NotPredicate<T> implements Predicate<T> {
+ private final Predicate<? super T> predicate;
+
+ private NotPredicate(Predicate<? super T> predicate) {
+ this.predicate = predicate;
+ }
+
+ public boolean apply(T t) {
+ return !predicate.apply(t);
+ }
+ }
}
diff --git a/test-runner/src/android/test/suitebuilder/TestSuiteBuilder.java b/test-runner/src/android/test/suitebuilder/TestSuiteBuilder.java
index cf6936b..6158e0c 100644
--- a/test-runner/src/android/test/suitebuilder/TestSuiteBuilder.java
+++ b/test-runner/src/android/test/suitebuilder/TestSuiteBuilder.java
@@ -44,8 +44,7 @@
@Deprecated
public class TestSuiteBuilder {
- private Context context;
- private final TestGrouping testGrouping = new TestGrouping(SORT_BY_FULLY_QUALIFIED_NAME);
+ private final TestGrouping testGrouping;
private final Set<Predicate<TestMethod>> predicates = new HashSet<Predicate<TestMethod>>();
private List<TestCase> testCases;
private TestSuite rootSuite;
@@ -67,7 +66,7 @@
public TestSuiteBuilder(String name, ClassLoader classLoader) {
this.suiteName = name;
- this.testGrouping.setClassLoader(classLoader);
+ this.testGrouping = new TestGrouping(SORT_BY_FULLY_QUALIFIED_NAME, classLoader);
this.testCases = new ArrayList<>();
addRequirements(REJECT_SUPPRESSED);
}
@@ -244,15 +243,6 @@
}
}
- /**
- * @return the test package that represents the packages that were included for our test suite.
- *
- * {@hide} Not needed for 1.0 SDK.
- */
- protected TestGrouping getTestGrouping() {
- return testGrouping;
- }
-
private boolean satisfiesAllPredicates(TestMethod test) {
for (Predicate<TestMethod> predicate : predicates) {
if (!predicate.apply(test)) {
diff --git a/test-runner/src/android/test/suitebuilder/annotation/HasAnnotation.java b/test-runner/src/android/test/suitebuilder/annotation/HasAnnotation.java
deleted file mode 100644
index a2868fc..0000000
--- a/test-runner/src/android/test/suitebuilder/annotation/HasAnnotation.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2008 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.test.suitebuilder.annotation;
-
-import static com.android.internal.util.Predicates.or;
-import com.android.internal.util.Predicate;
-import android.test.suitebuilder.TestMethod;
-
-import java.lang.annotation.Annotation;
-
-/**
- * A predicate that checks to see if a {@link TestMethod} has a specific annotation, either on the
- * method or on the containing class.
- *
- * {@hide} Not needed for 1.0 SDK.
- */
-public class HasAnnotation implements Predicate<TestMethod> {
-
- private Predicate<TestMethod> hasMethodOrClassAnnotation;
-
- public HasAnnotation(Class<? extends Annotation> annotationClass) {
- this.hasMethodOrClassAnnotation = or(
- new HasMethodAnnotation(annotationClass),
- new HasClassAnnotation(annotationClass));
- }
-
- public boolean apply(TestMethod testMethod) {
- return hasMethodOrClassAnnotation.apply(testMethod);
- }
-}
diff --git a/test-runner/src/android/test/suitebuilder/annotation/HasClassAnnotation.java b/test-runner/src/android/test/suitebuilder/annotation/HasClassAnnotation.java
deleted file mode 100644
index ac76f4c..0000000
--- a/test-runner/src/android/test/suitebuilder/annotation/HasClassAnnotation.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2008 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.test.suitebuilder.annotation;
-
-import java.lang.annotation.Annotation;
-
-import android.test.suitebuilder.TestMethod;
-import com.android.internal.util.Predicate;
-
-/**
- * A predicate that checks to see if a {@link android.test.suitebuilder.TestMethod} has a specific annotation on the
- * containing class. Consider using the public {@link HasAnnotation} class instead of this class.
- *
- * {@hide} Not needed for 1.0 SDK.
- */
-class HasClassAnnotation implements Predicate<TestMethod> {
-
- private Class<? extends Annotation> annotationClass;
-
- public HasClassAnnotation(Class<? extends Annotation> annotationClass) {
- this.annotationClass = annotationClass;
- }
-
- public boolean apply(TestMethod testMethod) {
- return testMethod.getEnclosingClass().getAnnotation(annotationClass) != null;
- }
-}
diff --git a/test-runner/src/android/test/suitebuilder/annotation/HasMethodAnnotation.java b/test-runner/src/android/test/suitebuilder/annotation/HasMethodAnnotation.java
deleted file mode 100644
index 96bd922..0000000
--- a/test-runner/src/android/test/suitebuilder/annotation/HasMethodAnnotation.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2008 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.test.suitebuilder.annotation;
-
-import com.android.internal.util.Predicate;
-import android.test.suitebuilder.TestMethod;
-
-import java.lang.annotation.Annotation;
-
-/**
- * A predicate that checks to see if a the method represented by {@link TestMethod} has a certain
- * annotation on it. Consider using the public {@link HasAnnotation} class instead of this class.
- *
- * {@hide} Not needed for 1.0 SDK.
- */
-class HasMethodAnnotation implements Predicate<TestMethod> {
-
- private final Class<? extends Annotation> annotationClass;
-
- public HasMethodAnnotation(Class<? extends Annotation> annotationClass) {
- this.annotationClass = annotationClass;
- }
-
- public boolean apply(TestMethod testMethod) {
- return testMethod.getAnnotation(annotationClass) != null;
- }
-}
diff --git a/test-runner/tests/Android.mk b/test-runner/tests/Android.mk
index 68fd662..7ee047e4 100644
--- a/test-runner/tests/Android.mk
+++ b/test-runner/tests/Android.mk
@@ -16,6 +16,13 @@
include $(CLEAR_VARS)
# We only want this apk build for tests.
+#
+# Run the tests using the following commands:
+# adb install -r ${ANDROID_PRODUCT_OUT}/data/app/FrameworkTestRunnerTests/FrameworkTestRunnerTests.apk
+# adb shell am instrument \
+ -e notAnnotation android.test.suitebuilder.examples.error.RunAsPartOfSeparateTest \
+ -w com.android.frameworks.testrunner.tests/android.test.InstrumentationTestRunner
+#
LOCAL_MODULE_TAGS := tests
LOCAL_JAVA_LIBRARIES := android.test.runner
diff --git a/test-runner/tests/src/android/test/TestCaseUtilTest.java b/test-runner/tests/src/android/test/TestCaseUtilTest.java
index bc6fa92..6d424b0 100644
--- a/test-runner/tests/src/android/test/TestCaseUtilTest.java
+++ b/test-runner/tests/src/android/test/TestCaseUtilTest.java
@@ -16,6 +16,8 @@
package android.test;
+import java.util.ArrayList;
+import java.util.HashSet;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
@@ -24,40 +26,50 @@
public class TestCaseUtilTest extends TestCase {
- public void testGetTestCaseNamesForTestSuiteWithSuiteMethod() throws Exception {
+ @SuppressWarnings("unchecked")
+ private static List<String> getTestCaseNames(Test test) {
+ List<Test> tests = (List<Test>) TestCaseUtil.getTests(test, false);
+ List<String> testCaseNames = new ArrayList<>();
+ for (Test aTest : tests) {
+ testCaseNames.add(TestCaseUtil.getTestName(aTest));
+ }
+ return testCaseNames;
+ }
+
+ public void testGetTests_ForTestSuiteWithSuiteMethod() throws Exception {
TestSuite testSuite = new TwoTestsInTestSuite();
- List<String> testCaseNames = TestCaseUtil.getTestCaseNames(testSuite, false);
+ List<String> testCaseNames = getTestCaseNames(testSuite);
- assertEquals(2, testCaseNames.size());
- assertTrue(testCaseNames.get(0).endsWith("OneTestTestCase"));
- assertTrue(testCaseNames.get(1).endsWith("OneTestTestSuite"));
+ assertEquals(0, testCaseNames.size());
}
- public void testGetTestCaseNamesForTestCaseWithSuiteMethod() throws Exception {
+ public void testGetTests_ForTestCaseWithSuiteMethod() throws Exception {
TestCase testCase = new OneTestTestCaseWithSuite();
- List<String> testCaseNames = TestCaseUtil.getTestCaseNames(testCase, false);
+ List<String> testCaseNames = getTestCaseNames(testCase);
assertEquals(1, testCaseNames.size());
assertTrue(testCaseNames.get(0).endsWith("testOne"));
}
- public void testCreateTestForTestCase() throws Exception {
- Test test = TestCaseUtil.createTestSuite(OneTestTestCase.class);
- assertEquals(1, test.countTestCases());
+ public void testInvokeSuiteMethodIfPossible_ForTestCase() throws Exception {
+ Test test = TestCaseUtil.invokeSuiteMethodIfPossible(OneTestTestCase.class, new HashSet<>());
+ assertNull(test);
}
-
- public void testCreateTestForTestSuiteWithSuiteMethod() throws Exception {
- Test test = TestCaseUtil.createTestSuite(TwoTestsInTestSuite.class);
+
+ public void testInvokeSuiteMethodIfPossible_ForTestSuiteWithSuiteMethod() throws Exception {
+ Test test = TestCaseUtil.invokeSuiteMethodIfPossible(TwoTestsInTestSuite.class, new HashSet<>());
+ assertNotNull(test);
assertEquals(2, test.countTestCases());
}
- public void testCreateTestForTestCaseWithSuiteMethod() throws Exception {
- Test test = TestCaseUtil.createTestSuite(OneTestTestCaseWithSuite.class);
+ public void testInvokeSuiteMethodIfPossible_ForTestCaseWithSuiteMethod() throws Exception {
+ Test test = TestCaseUtil.invokeSuiteMethodIfPossible(OneTestTestCaseWithSuite.class, new HashSet<>());
+ assertNotNull(test);
assertEquals(1, test.countTestCases());
}
-
+
public void testReturnEmptyStringForTestSuiteWithNoName() throws Exception {
assertEquals("", TestCaseUtil.getTestName(new TestSuite()));
}
diff --git a/test-runner/tests/src/android/test/suitebuilder/InstrumentationTestSuiteBuilderTest.java b/test-runner/tests/src/android/test/suitebuilder/InstrumentationTestSuiteBuilderTest.java
deleted file mode 100644
index 1872803..0000000
--- a/test-runner/tests/src/android/test/suitebuilder/InstrumentationTestSuiteBuilderTest.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) 2008 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.test.suitebuilder;
-
-import static android.test.suitebuilder.ListTestCaseNames.getTestCaseNames;
-import android.test.suitebuilder.examples.OuterTest;
-import android.test.suitebuilder.examples.instrumentation.InstrumentationTest;
-
-import junit.framework.AssertionFailedError;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestListener;
-import junit.framework.TestResult;
-import junit.framework.TestSuite;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-public class InstrumentationTestSuiteBuilderTest extends TestCase {
-
- private InstrumentationTestSuiteBuilder instrumentationTestSuiteBuilder;
-
- protected void setUp() throws Exception {
- super.setUp();
- instrumentationTestSuiteBuilder = new InstrumentationTestSuiteBuilder(getClass());
- }
-
- public void testShouldIncludeIntrumentationTests() throws Exception {
- instrumentationTestSuiteBuilder.includePackages(packageFor(InstrumentationTest.class));
-
- SuiteExecutionRecorder recorder = runSuite(instrumentationTestSuiteBuilder);
-
- assertEquals(1, recorder.testsSeen.size());
- assertTrue(recorder.saw("InstrumentationTest.testInstrumentation"));
- }
-
- public void testShouldOnlyIncludeIntrumentationTests() throws Exception {
- TestSuite testSuite = new OuterTest()
- .buildTestsUnderHereWith(instrumentationTestSuiteBuilder);
- List<String> testCaseNames = getTestCaseNames(testSuite);
- assertEquals(1, testCaseNames.size());
- assertEquals("testInstrumentation", testCaseNames.get(0));
- }
-
- private static String packageFor(Class clazz) {
- String className = clazz.getName();
- return className.substring(0, className.lastIndexOf('.'));
- }
-
- private SuiteExecutionRecorder runSuite(TestSuiteBuilder builder) {
- TestSuite suite = builder.build();
- SuiteExecutionRecorder recorder = new SuiteExecutionRecorder();
- TestResult result = new TestResult();
- result.addListener(recorder);
- suite.run(result);
- return recorder;
- }
-
- private class SuiteExecutionRecorder implements TestListener {
-
- private Set<String> failures = new HashSet<String>();
- private Set<String> errors = new HashSet<String>();
- private Set<String> testsSeen = new HashSet<String>();
-
- public void addError(Test test, Throwable t) {
- errors.add(testName(test));
- }
-
- public void addFailure(Test test, AssertionFailedError t) {
- failures.add(testName(test));
- }
-
- public void endTest(Test test) {
- }
-
- public void startTest(Test test) {
- testsSeen.add(testName(test));
- }
-
- public boolean saw(String testName) {
- return testsSeen.contains(testName);
- }
-
- public boolean failed(String testName) {
- return failures.contains(testName);
- }
-
- public boolean errored(String testName) {
- return errors.contains(testName);
- }
-
- public boolean passed(String testName) {
- return saw(testName) && !failed(testName) && !errored(testName);
- }
-
- private String testName(Test test) {
- TestCase testCase = (TestCase) test;
- return testCase.getClass().getSimpleName() + "." + testCase.getName();
- }
- }
-}
diff --git a/test-runner/tests/src/android/test/suitebuilder/TestGroupingTest.java b/test-runner/tests/src/android/test/suitebuilder/TestGroupingTest.java
index f4477d1..972bfb4 100644
--- a/test-runner/tests/src/android/test/suitebuilder/TestGroupingTest.java
+++ b/test-runner/tests/src/android/test/suitebuilder/TestGroupingTest.java
@@ -30,7 +30,7 @@
@Override
protected void setUp() throws Exception {
super.setUp();
- mGrouping = new TestGrouping(TestGrouping.SORT_BY_SIMPLE_NAME);
+ mGrouping = new TestGrouping(TestGrouping.SORT_BY_SIMPLE_NAME, getClass().getClassLoader());
}
/**
diff --git a/test-runner/tests/src/android/test/suitebuilder/TestPredicatesTest.java b/test-runner/tests/src/android/test/suitebuilder/TestPredicatesTest.java
new file mode 100644
index 0000000..3d8d5f1
--- /dev/null
+++ b/test-runner/tests/src/android/test/suitebuilder/TestPredicatesTest.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2008 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.test.suitebuilder;
+
+import com.android.internal.util.Predicate;
+import junit.framework.TestCase;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.lang.reflect.Method;
+
+public class TestPredicatesTest extends TestCase {
+
+ public void testThatMethodWithAnnotationIsReportedAsBeingAnnotated() throws Exception {
+ assertTrue(hasExampleAnnotation(ClassWithAnnotation.class, "testWithAnnotation"));
+ assertTrue(hasExampleAnnotation(ClassWithoutAnnotation.class, "testWithAnnotation"));
+ }
+
+ public void testThatMethodWithOutAnnotationIsNotReportedAsBeingAnnotated() throws Exception {
+ assertFalse(hasExampleAnnotation(ClassWithoutAnnotation.class, "testWithoutAnnotation"));
+ }
+
+ public void testThatClassAnnotatioCausesAllMethodsToBeReportedAsBeingAnnotated()
+ throws Exception {
+ assertTrue(hasExampleAnnotation(ClassWithAnnotation.class, "testWithoutAnnotation"));
+ }
+
+ private boolean hasExampleAnnotation(Class<? extends TestCase> aClass, String methodName)
+ throws NoSuchMethodException {
+ Method method = aClass.getMethod(methodName);
+ TestMethod testMethod = new TestMethod(method, aClass);
+ return TestPredicates.hasAnnotation(Example.class).apply(testMethod);
+ }
+
+ @Retention(RetentionPolicy.RUNTIME)
+ @Target({ElementType.TYPE, ElementType.METHOD})
+ public @interface Example {
+ }
+
+ @Example
+ static class ClassWithAnnotation extends TestCase {
+
+ @Example
+ public void testWithAnnotation() {
+ }
+
+ public void testWithoutAnnotation() {
+ }
+ }
+
+ static class ClassWithoutAnnotation extends TestCase {
+
+ @Example
+ public void testWithAnnotation() {
+ }
+
+ public void testWithoutAnnotation() {
+ }
+ }
+
+ private static final Predicate<Object> TRUE = new Predicate<Object>() {
+ public boolean apply(Object o) {
+ return true;
+ }
+ };
+
+ private static final Predicate<Object> FALSE = new Predicate<Object>() {
+ public boolean apply(Object o) {
+ return false;
+ }
+ };
+
+ public void testNotPredicate() throws Exception {
+ assertTrue(TestPredicates.not(FALSE).apply(null));
+ assertFalse(TestPredicates.not(TRUE).apply(null));
+ }
+}
diff --git a/test-runner/tests/src/android/test/suitebuilder/TestSuiteBuilderTest.java b/test-runner/tests/src/android/test/suitebuilder/TestSuiteBuilderTest.java
index 293c813..a2e51a1 100644
--- a/test-runner/tests/src/android/test/suitebuilder/TestSuiteBuilderTest.java
+++ b/test-runner/tests/src/android/test/suitebuilder/TestSuiteBuilderTest.java
@@ -135,10 +135,23 @@
TestSuite testSuite = new OuterTest().buildTestsUnderHereRecursively();
assertContentsInOrder(getTestCaseNames(testSuite),
- "testOuter", "testErrorOne", "testErrorTwo", "testFailOne", "testFailTwo",
- "testInstrumentation", "testLevel1", "testLevel2", "testAnotherOne",
- "testSimpleOne", "testSimpleTwo", "testNonSmoke", "testSmoke", "testSubclass",
- "testSuperclass", "testUnSuppressedMethod");
+ "testOuter",
+ "testPublicConstructor",
+ "testErrorOne",
+ "testErrorTwo",
+ "testFailOne",
+ "testFailTwo",
+ "testInstrumentation",
+ "testLevel1",
+ "testLevel2",
+ "testAnotherOne",
+ "testSimpleOne",
+ "testSimpleTwo",
+ "testNonSmoke",
+ "testSmoke",
+ "testSubclass",
+ "testSuperclass",
+ "testUnSuppressedMethod");
}
private void assertContentsInOrder(List<String> actual, String... source) {
diff --git a/test-runner/tests/src/android/test/suitebuilder/annotation/HasAnnotationTest.java b/test-runner/tests/src/android/test/suitebuilder/annotation/HasAnnotationTest.java
deleted file mode 100644
index edf067d..0000000
--- a/test-runner/tests/src/android/test/suitebuilder/annotation/HasAnnotationTest.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 2008 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.test.suitebuilder.annotation;
-
-import android.test.suitebuilder.TestMethod;
-import junit.framework.TestCase;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.reflect.Method;
-
-public class HasAnnotationTest extends TestCase {
-
- public void testThatMethodWithAnnotationIsReportedAsBeingAnnotated() throws Exception {
- assertTrue(hasExampleAnnotation(ClassWithAnnotation.class, "testWithAnnotation"));
- assertTrue(hasExampleAnnotation(ClassWithoutAnnotation.class, "testWithAnnotation"));
- }
-
- public void testThatMethodWithOutAnnotationIsNotReportedAsBeingAnnotated() throws Exception {
- assertFalse(hasExampleAnnotation(ClassWithoutAnnotation.class, "testWithoutAnnotation"));
- }
-
- public void testThatClassAnnotatioCausesAllMethodsToBeReportedAsBeingAnnotated()
- throws Exception {
- assertTrue(hasExampleAnnotation(ClassWithAnnotation.class, "testWithoutAnnotation"));
- }
-
- private boolean hasExampleAnnotation(Class<? extends TestCase> aClass, String methodName)
- throws NoSuchMethodException {
- Method method = aClass.getMethod(methodName);
- TestMethod testMethod = new TestMethod(method, aClass);
- return new HasAnnotation(Example.class).apply(testMethod);
- }
-
- @Retention(RetentionPolicy.RUNTIME)
- @Target({ElementType.TYPE, ElementType.METHOD})
- public @interface Example {
- }
-
- @Example
- static class ClassWithAnnotation extends TestCase {
-
- @Example
- public void testWithAnnotation() {
- }
-
- public void testWithoutAnnotation() {
- }
- }
-
- static class ClassWithoutAnnotation extends TestCase {
-
- @Example
- public void testWithAnnotation() {
- }
-
- public void testWithoutAnnotation() {
- }
- }
-}
diff --git a/test-runner/tests/src/android/test/suitebuilder/annotation/HasClassAnnotationTest.java b/test-runner/tests/src/android/test/suitebuilder/annotation/HasClassAnnotationTest.java
deleted file mode 100644
index 051ea54..0000000
--- a/test-runner/tests/src/android/test/suitebuilder/annotation/HasClassAnnotationTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2008 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.test.suitebuilder.annotation;
-
-import android.test.suitebuilder.TestMethod;
-import junit.framework.TestCase;
-
-import java.lang.reflect.Method;
-
-public class HasClassAnnotationTest extends TestCase {
-
- public void testShouldTellIfParentClassHasSpecifiedClassification()
- throws NoSuchMethodException {
- assertTrue(classHasAnnotation(SmokeTestExample.class, Smoke.class));
- }
-
- public void testShouldTellIfParentClassDoesNotHaveSpecifiedClassification()
- throws NoSuchMethodException {
- assertFalse(classHasAnnotation(NonSmokeTestExample.class, Smoke.class));
- }
-
- private boolean classHasAnnotation(
- Class<? extends TestCase> aClass,
- Class<Smoke> expectedClassification) throws NoSuchMethodException {
- Method method = aClass.getMethod("testSomeTest");
-
- TestMethod testMethod = new TestMethod(method, aClass);
- return new HasClassAnnotation(expectedClassification).apply(testMethod);
- }
-
- @Smoke
- static class SmokeTestExample extends TestCase {
-
- public void testSomeTest() {
- }
- }
-
- static class NonSmokeTestExample extends TestCase {
-
- public void testSomeTest() {
- }
- }
-}
diff --git a/test-runner/tests/src/android/test/suitebuilder/annotation/HasMethodAnnotationTest.java b/test-runner/tests/src/android/test/suitebuilder/annotation/HasMethodAnnotationTest.java
deleted file mode 100644
index c864e28..0000000
--- a/test-runner/tests/src/android/test/suitebuilder/annotation/HasMethodAnnotationTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2008 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.test.suitebuilder.annotation;
-
-import android.test.suitebuilder.TestMethod;
-import junit.framework.TestCase;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Method;
-
-
-public class HasMethodAnnotationTest extends TestCase {
-
- public void testMethodWithSpecifiedAttribute() throws Exception {
- assertTrue(methodHasAnnotation(AnnotatedMethodExample.class,
- "testThatIsAnnotated", Smoke.class));
- }
-
- public void testMethodWithoutSpecifiedAttribute() throws Exception {
- assertFalse(methodHasAnnotation(AnnotatedMethodExample.class,
- "testThatIsNotAnnotated", Smoke.class));
- }
-
- private boolean methodHasAnnotation(Class<? extends TestCase> aClass,
- String methodName,
- Class<? extends Annotation> expectedClassification
- ) throws NoSuchMethodException {
- Method method = aClass.getMethod(methodName);
- TestMethod testMethod = new TestMethod(method, aClass);
- return new HasMethodAnnotation(expectedClassification).apply(testMethod);
- }
-
- static class AnnotatedMethodExample extends TestCase {
-
- @Smoke
- public void testThatIsAnnotated() {
- }
-
- public void testThatIsNotAnnotated() {
- }
- }
-}
diff --git a/test-runner/tests/src/android/test/suitebuilder/examples/error/ErrorTest.java b/test-runner/tests/src/android/test/suitebuilder/examples/error/ErrorTest.java
index f1f6113..ddf5dd1 100644
--- a/test-runner/tests/src/android/test/suitebuilder/examples/error/ErrorTest.java
+++ b/test-runner/tests/src/android/test/suitebuilder/examples/error/ErrorTest.java
@@ -18,6 +18,7 @@
import junit.framework.TestCase;
+@RunAsPartOfSeparateTest
public class ErrorTest extends TestCase {
public void testErrorOne() throws Exception {
diff --git a/test-runner/tests/src/android/test/suitebuilder/examples/error/FailingTest.java b/test-runner/tests/src/android/test/suitebuilder/examples/error/FailingTest.java
index 428fd23..0170b2f 100644
--- a/test-runner/tests/src/android/test/suitebuilder/examples/error/FailingTest.java
+++ b/test-runner/tests/src/android/test/suitebuilder/examples/error/FailingTest.java
@@ -18,6 +18,7 @@
import junit.framework.TestCase;
+@RunAsPartOfSeparateTest
public class FailingTest extends TestCase {
public void testFailOne() throws Exception {
diff --git a/test-runner/tests/src/android/test/suitebuilder/examples/error/RunAsPartOfSeparateTest.java b/test-runner/tests/src/android/test/suitebuilder/examples/error/RunAsPartOfSeparateTest.java
new file mode 100644
index 0000000..2b3a252
--- /dev/null
+++ b/test-runner/tests/src/android/test/suitebuilder/examples/error/RunAsPartOfSeparateTest.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2017 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.test.suitebuilder.examples.error;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Annotation that marks tests that should only be run as part of a separate test and not on their
+ * own.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+public @interface RunAsPartOfSeparateTest {
+}
diff --git a/tests/AppLaunch/Android.mk b/tests/AppLaunch/Android.mk
index 9435893..d01b1f9 100644
--- a/tests/AppLaunch/Android.mk
+++ b/tests/AppLaunch/Android.mk
@@ -9,9 +9,9 @@
LOCAL_PACKAGE_NAME := AppLaunch
LOCAL_CERTIFICATE := platform
-LOCAL_JAVA_LIBRARIES := android.test.runner
+LOCAL_JAVA_LIBRARIES := legacy-android-test
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-test legacy-android-test
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-test
include $(BUILD_PACKAGE)
diff --git a/tests/Camera2Tests/SmartCamera/SimpleCamera/tests/Android.mk b/tests/Camera2Tests/SmartCamera/SimpleCamera/tests/Android.mk
index 1f14f03..527d1bbf 100644
--- a/tests/Camera2Tests/SmartCamera/SimpleCamera/tests/Android.mk
+++ b/tests/Camera2Tests/SmartCamera/SimpleCamera/tests/Android.mk
@@ -24,8 +24,8 @@
LOCAL_SRC_FILES += $(call all-java-files-under, src)
-LOCAL_JAVA_LIBRARIES := android.test.runner
-LOCAL_STATIC_JAVA_LIBRARIES := guava junit legacy-android-test
+LOCAL_JAVA_LIBRARIES := legacy-android-test
+LOCAL_STATIC_JAVA_LIBRARIES := guava junit
LOCAL_PROGUARD_ENABLED := disabled
diff --git a/tests/Compatibility/Android.mk b/tests/Compatibility/Android.mk
index 99e84bd..feeae02 100644
--- a/tests/Compatibility/Android.mk
+++ b/tests/Compatibility/Android.mk
@@ -18,8 +18,8 @@
# We only want this apk build for tests.
LOCAL_MODULE_TAGS := tests
-LOCAL_JAVA_LIBRARIES := android.test.runner
-LOCAL_STATIC_JAVA_LIBRARIES := junit legacy-android-test
+LOCAL_JAVA_LIBRARIES := legacy-android-test
+LOCAL_STATIC_JAVA_LIBRARIES := junit
# Include all test java files.
LOCAL_SRC_FILES := \
$(call all-java-files-under, src)
diff --git a/tests/MusicBrowserDemo/Android.mk b/tests/MusicBrowserDemo/Android.mk
deleted file mode 100644
index 207774b..0000000
--- a/tests/MusicBrowserDemo/Android.mk
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright (C) 2014 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.
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_PACKAGE_NAME := MusicBrowserDemo
-#LOCAL_SDK_VERSION := current
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-LOCAL_STATIC_JAVA_LIBRARIES := \
- android-support-v4 \
- android-support-v7-appcompat
-
-LOCAL_RESOURCE_DIR := \
- $(LOCAL_PATH)/res \
- frameworks/support/v7/appcompat/res
-LOCAL_PROGUARD_ENABLED := disabled
-#LOCAL_PROGUARD_FLAG_FILES := proguard.flags
-
-LOCAL_AAPT_FLAGS := \
- --auto-add-overlay \
- --extra-packages android.support.v7.appcompat
-include $(BUILD_PACKAGE)
diff --git a/tests/MusicBrowserDemo/AndroidManifest.xml b/tests/MusicBrowserDemo/AndroidManifest.xml
deleted file mode 100644
index d2acfe2..0000000
--- a/tests/MusicBrowserDemo/AndroidManifest.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2014 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.example.android.musicbrowserdemo"
- android:versionCode="1"
- android:versionName="1.0" >
-
- <uses-sdk
- android:minSdkVersion="9"
- android:targetSdkVersion="19" />
-
- <application
- android:allowBackup="true"
- android:icon="@drawable/ic_launcher"
- android:label="@string/app_name"
- android:theme="@style/AppTheme"
- >
-
- <activity
- android:name="com.example.android.musicbrowserdemo.MainActivity"
- android:label="@string/app_name"
- >
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
-
- </application>
-
-</manifest>
diff --git a/tests/MusicBrowserDemo/res/drawable-hdpi/ic_launcher.png b/tests/MusicBrowserDemo/res/drawable-hdpi/ic_launcher.png
deleted file mode 100644
index 47d6854..0000000
--- a/tests/MusicBrowserDemo/res/drawable-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/MusicBrowserDemo/res/drawable-mdpi/ic_launcher.png b/tests/MusicBrowserDemo/res/drawable-mdpi/ic_launcher.png
deleted file mode 100644
index 01b53fd..0000000
--- a/tests/MusicBrowserDemo/res/drawable-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/MusicBrowserDemo/res/drawable-xhdpi/ic_launcher.png b/tests/MusicBrowserDemo/res/drawable-xhdpi/ic_launcher.png
deleted file mode 100644
index af762f2..0000000
--- a/tests/MusicBrowserDemo/res/drawable-xhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/MusicBrowserDemo/res/drawable-xxhdpi/ic_launcher.png b/tests/MusicBrowserDemo/res/drawable-xxhdpi/ic_launcher.png
deleted file mode 100644
index eef47aa..0000000
--- a/tests/MusicBrowserDemo/res/drawable-xxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/MusicBrowserDemo/res/values/strings.xml b/tests/MusicBrowserDemo/res/values/strings.xml
deleted file mode 100644
index 858f278f..0000000
--- a/tests/MusicBrowserDemo/res/values/strings.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2014 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-<resources>
-
- <string name="app_name">Music Browser</string>
-
-</resources>
diff --git a/tests/MusicBrowserDemo/res/values/styles.xml b/tests/MusicBrowserDemo/res/values/styles.xml
deleted file mode 100644
index b83662d..0000000
--- a/tests/MusicBrowserDemo/res/values/styles.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2014 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-<resources>
-
- <!--
- Base application theme, dependent on API level. This theme is replaced
- by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
- -->
- <style name="AppBaseTheme" parent="Theme.AppCompat.Light">
- <!--
- Theme customizations available in newer API levels can go in
- res/values-vXX/styles.xml, while customizations related to
- backward-compatibility can go here.
- -->
- </style>
-
- <!-- Application theme. -->
- <style name="AppTheme" parent="AppBaseTheme">
- <!-- All customizations that are NOT specific to a particular API-level can go here. -->
- </style>
-
-</resources>
diff --git a/tests/MusicBrowserDemo/src/com/example/android/musicbrowserdemo/AppListFragment.java b/tests/MusicBrowserDemo/src/com/example/android/musicbrowserdemo/AppListFragment.java
deleted file mode 100644
index 4e18ce9..0000000
--- a/tests/MusicBrowserDemo/src/com/example/android/musicbrowserdemo/AppListFragment.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.example.android.musicbrowserdemo;
-
-import android.content.Context;
-import android.content.ComponentName;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.service.media.MediaBrowserService;
-import android.os.Bundle;
-import android.support.v4.app.FragmentActivity;
-import android.support.v4.app.FragmentTransaction;
-import android.support.v4.app.ListFragment;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.BaseAdapter;
-import android.widget.ListView;
-import android.widget.TextView;
-
-import java.util.ArrayList;
-import java.util.List;
-
-// TODO: Include an icon.
-
-public class AppListFragment extends ListFragment {
-
- private Adapter mAdapter;
- private List<Item> mItems;
-
- public AppListFragment() {
- }
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- mAdapter = new Adapter();
- setListAdapter(mAdapter);
- }
-
- @Override
- public void onListItemClick(ListView l, View v, int position, long id) {
- final Item item = mItems.get(position);
-
- Log.i("AppListFragment", "Item clicked: " + position + " -- " + item.component);
-
- final BrowserListFragment fragment = new BrowserListFragment();
-
- final Bundle args = new Bundle();
- args.putParcelable(BrowserListFragment.ARG_COMPONENT, item.component);
- fragment.setArguments(args);
-
- getFragmentManager().beginTransaction()
- .replace(android.R.id.content, fragment)
- .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
- .addToBackStack(null)
- .commit();
- }
-
- private static class Item {
- final String label;
- final ComponentName component;
-
- Item(String l, ComponentName c) {
- this.label = l;
- this.component = c;
- }
- }
-
- private class Adapter extends BaseAdapter {
- private final LayoutInflater mInflater;
-
- Adapter() {
- super();
-
- final Context context = getActivity();
- mInflater = LayoutInflater.from(context);
-
- // Load the data
- final PackageManager pm = context.getPackageManager();
- final Intent intent = new Intent(MediaBrowserService.SERVICE_INTERFACE);
- final List<ResolveInfo> list = pm.queryIntentServices(intent, 0);
- final int N = list.size();
- mItems = new ArrayList(N);
- for (int i=0; i<N; i++) {
- final ResolveInfo ri = list.get(i);
- mItems.add(new Item(ri.loadLabel(pm).toString(), new ComponentName(
- ri.serviceInfo.applicationInfo.packageName,
- ri.serviceInfo.name)));
- }
- }
-
- @Override
- public int getCount() {
- return mItems.size();
- }
-
- @Override
- public Item getItem(int position) {
- return mItems.get(position);
- }
-
- @Override
- public long getItemId(int position) {
- return position;
- }
-
- @Override
- public int getItemViewType(int position) {
- return 1;
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- if (convertView == null) {
- convertView = mInflater.inflate(android.R.layout.simple_list_item_1, parent, false);
- }
-
- final TextView tv = (TextView)convertView;
- final Item item = mItems.get(position);
- tv.setText(item.label);
-
- return convertView;
- }
-
- @Override
- public int getViewTypeCount() {
- return 1;
- }
- }
-}
-
-
diff --git a/tests/MusicBrowserDemo/src/com/example/android/musicbrowserdemo/BrowserListFragment.java b/tests/MusicBrowserDemo/src/com/example/android/musicbrowserdemo/BrowserListFragment.java
deleted file mode 100644
index 8cc9b97..0000000
--- a/tests/MusicBrowserDemo/src/com/example/android/musicbrowserdemo/BrowserListFragment.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.example.android.musicbrowserdemo;
-
-import android.content.Context;
-import android.content.ComponentName;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.media.browse.MediaBrowser;
-import android.service.media.MediaBrowserService;
-import android.os.Bundle;
-import android.net.Uri;
-import android.support.v4.app.FragmentActivity;
-import android.support.v4.app.FragmentTransaction;
-import android.support.v4.app.ListFragment;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.BaseAdapter;
-import android.widget.ListView;
-import android.widget.TextView;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class BrowserListFragment extends ListFragment {
- private static final String TAG = "BrowserListFragment";
-
- // Hints
- public static final String HINT_DISPLAY = "com.example.android.musicbrowserdemo.DISPLAY";
-
- // For args
- public static final String ARG_COMPONENT = "component";
- public static final String ARG_ID = "uri";
-
- private Adapter mAdapter;
- private List<Item> mItems = new ArrayList();
- private ComponentName mComponent;
- private String mNodeId;
- private MediaBrowser mBrowser;
-
- private static class Item {
- final MediaBrowser.MediaItem media;
-
- Item(MediaBrowser.MediaItem m) {
- this.media = m;
- }
- }
-
- public BrowserListFragment() {
- }
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- Log.d(TAG, "onActivityCreated -- " + hashCode());
- mAdapter = new Adapter();
- setListAdapter(mAdapter);
-
- // Get our arguments
- final Bundle args = getArguments();
- mComponent = args.getParcelable(ARG_COMPONENT);
- mNodeId = args.getString(ARG_ID);
-
- // A hint about who we are, so the service can customize the results if it wants to.
- final Bundle rootHints = new Bundle();
- rootHints.putBoolean(HINT_DISPLAY, true);
-
- mBrowser = new MediaBrowser(getActivity(), mComponent, mConnectionCallbacks, rootHints);
- }
-
- @Override
- public void onStart() {
- super.onStart();
- mBrowser.connect();
- }
-
- @Override
- public void onStop() {
- super.onStop();
- mBrowser.disconnect();
- }
-
- @Override
- public void onListItemClick(ListView l, View v, int position, long id) {
- final Item item = mItems.get(position);
-
- Log.i("BrowserListFragment", "Item clicked: " + position + " -- "
- + mAdapter.getItem(position).media.getDescription().getIconUri());
-
- final BrowserListFragment fragment = new BrowserListFragment();
-
- final Bundle args = new Bundle();
- args.putParcelable(BrowserListFragment.ARG_COMPONENT, mComponent);
- args.putParcelable(BrowserListFragment.ARG_ID, item.media.getDescription().getIconUri());
- fragment.setArguments(args);
-
- getFragmentManager().beginTransaction()
- .replace(android.R.id.content, fragment)
- .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
- .addToBackStack(null)
- .commit();
-
- }
-
- final MediaBrowser.ConnectionCallback mConnectionCallbacks
- = new MediaBrowser.ConnectionCallback() {
- @Override
- public void onConnected() {
- Log.d(TAG, "mConnectionCallbacks.onConnected");
- if (mNodeId == null) {
- mNodeId = mBrowser.getRoot();
- }
- mBrowser.subscribe(mNodeId, new MediaBrowser.SubscriptionCallback() {
- @Override
- public void onChildrenLoaded(String parentId,
- List<MediaBrowser.MediaItem> children) {
- Log.d(TAG, "onChildrenLoaded parentId=" + parentId
- + " children= " + children);
- mItems.clear();
- final int N = children.size();
- for (int i=0; i<N; i++) {
- mItems.add(new Item(children.get(i)));
- }
- mAdapter.notifyDataSetChanged();
- }
-
- @Override
- public void onError(String parentId) {
- Log.d(TAG, "onError parentId=" + parentId);
- }
- });
- }
-
- @Override
- public void onConnectionSuspended() {
- Log.d(TAG, "mConnectionCallbacks.onConnectionSuspended");
- }
-
- @Override
- public void onConnectionFailed() {
- Log.d(TAG, "mConnectionCallbacks.onConnectionFailed");
- }
- };
-
- private class Adapter extends BaseAdapter {
- private final LayoutInflater mInflater;
-
- Adapter() {
- super();
-
- final Context context = getActivity();
- mInflater = LayoutInflater.from(context);
- }
-
- @Override
- public int getCount() {
- return mItems.size();
- }
-
- @Override
- public Item getItem(int position) {
- return mItems.get(position);
- }
-
- @Override
- public long getItemId(int position) {
- return position;
- }
-
- @Override
- public int getItemViewType(int position) {
- return 1;
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- if (convertView == null) {
- convertView = mInflater.inflate(android.R.layout.simple_list_item_1, parent, false);
- }
-
- final TextView tv = (TextView)convertView;
- final Item item = mItems.get(position);
- tv.setText(item.media.getDescription().getTitle());
-
- return convertView;
- }
-
- @Override
- public int getViewTypeCount() {
- return 1;
- }
- }
-}
-
-
diff --git a/tests/MusicBrowserDemo/src/com/example/android/musicbrowserdemo/MainActivity.java b/tests/MusicBrowserDemo/src/com/example/android/musicbrowserdemo/MainActivity.java
deleted file mode 100644
index 4c28234..0000000
--- a/tests/MusicBrowserDemo/src/com/example/android/musicbrowserdemo/MainActivity.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.example.android.musicbrowserdemo;
-
-import android.support.v4.app.FragmentActivity;
-import android.support.v4.app.FragmentManager;
-
-import android.os.Bundle;
-import android.util.Log;
-import android.view.View;
-import android.widget.ArrayAdapter;
-import android.widget.ListView;
-
-/**
- * Main activity class.
- */
-public class MainActivity extends FragmentActivity {
-
- private static final String BROWSER_FRAGMENT_TAG = "browser";
-
- @Override
- protected void onCreate(Bundle icicle) {
- super.onCreate(icicle);
-
- Log.d("MainActivity", "-------------------------------------------------------");
-
- // If we are starting afresh, start at the app list.
- final FragmentManager fm = getSupportFragmentManager();
- if (fm.findFragmentById(android.R.id.content) == null) {
- fm.beginTransaction().add(android.R.id.content, new AppListFragment()).commit();
- }
- }
-}
-
diff --git a/tests/MusicServiceDemo/Android.mk b/tests/MusicServiceDemo/Android.mk
deleted file mode 100644
index feef67a..0000000
--- a/tests/MusicServiceDemo/Android.mk
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright (C) 2013 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_PACKAGE_NAME := MusicServiceDemo
-#LOCAL_SDK_VERSION := current
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-LOCAL_STATIC_JAVA_LIBRARIES := \
- android-support-v4 \
- android-support-v7-appcompat
-
-LOCAL_RESOURCE_DIR := \
- $(LOCAL_PATH)/res \
- frameworks/support/v7/appcompat/res
-LOCAL_PROGUARD_ENABLED := disabled
-#LOCAL_PROGUARD_FLAG_FILES := proguard.flags
-
-LOCAL_AAPT_FLAGS := \
- --auto-add-overlay \
- --extra-packages android.support.v7.appcompat
-include $(BUILD_PACKAGE)
diff --git a/tests/MusicServiceDemo/AndroidManifest.xml b/tests/MusicServiceDemo/AndroidManifest.xml
deleted file mode 100644
index e00e2e2..0000000
--- a/tests/MusicServiceDemo/AndroidManifest.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2014 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.example.android.musicservicedemo"
- android:versionCode="1"
- android:versionName="1.0" >
-
- <uses-permission android:name="android.permission.INTERNET" />
- <uses-permission android:name="android.permission.WAKE_LOCK" />
-
- <uses-sdk
- android:minSdkVersion="9"
- android:targetSdkVersion="19" />
-
- <application
- android:allowBackup="true"
- android:icon="@drawable/ic_launcher"
- android:label="@string/app_name"
- android:theme="@style/AppTheme"
- >
-
- <activity
- android:name="com.example.android.automotive.musicplayer.MainActivity"
- android:label="@string/app_name" >
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
-
- <service
- android:name=".BrowserService"
- android:exported="true"
- >
- <intent-filter>
- <action android:name="android.media.browse.MediaBrowserService" />
- </intent-filter>
- </service>
- </application>
-
-</manifest>
diff --git a/tests/MusicServiceDemo/proguard-project.txt b/tests/MusicServiceDemo/proguard-project.txt
deleted file mode 100644
index f2fe155..0000000
--- a/tests/MusicServiceDemo/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-# http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-# public *;
-#}
diff --git a/tests/MusicServiceDemo/res/drawable-hdpi/ic_launcher.png b/tests/MusicServiceDemo/res/drawable-hdpi/ic_launcher.png
deleted file mode 100644
index 47d6854..0000000
--- a/tests/MusicServiceDemo/res/drawable-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/MusicServiceDemo/res/drawable-mdpi/ic_launcher.png b/tests/MusicServiceDemo/res/drawable-mdpi/ic_launcher.png
deleted file mode 100644
index 01b53fd..0000000
--- a/tests/MusicServiceDemo/res/drawable-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/MusicServiceDemo/res/drawable-xhdpi/ic_launcher.png b/tests/MusicServiceDemo/res/drawable-xhdpi/ic_launcher.png
deleted file mode 100644
index af762f2..0000000
--- a/tests/MusicServiceDemo/res/drawable-xhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/MusicServiceDemo/res/drawable-xxhdpi/ic_launcher.png b/tests/MusicServiceDemo/res/drawable-xxhdpi/ic_launcher.png
deleted file mode 100644
index eef47aa..0000000
--- a/tests/MusicServiceDemo/res/drawable-xxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/tests/MusicServiceDemo/res/drawable-xxhdpi/thumbsup.png b/tests/MusicServiceDemo/res/drawable-xxhdpi/thumbsup.png
deleted file mode 100644
index ea98c95..0000000
--- a/tests/MusicServiceDemo/res/drawable-xxhdpi/thumbsup.png
+++ /dev/null
Binary files differ
diff --git a/tests/MusicServiceDemo/res/layout/activity_main.xml b/tests/MusicServiceDemo/res/layout/activity_main.xml
deleted file mode 100644
index 71753e3..0000000
--- a/tests/MusicServiceDemo/res/layout/activity_main.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2014 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.
- -->
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:id="@+id/container"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- tools:context="com.example.android.automotive.musicplayer.MainActivity"
- tools:ignore="MergeRootFrame" />
diff --git a/tests/MusicServiceDemo/res/layout/fragment_main.xml b/tests/MusicServiceDemo/res/layout/fragment_main.xml
deleted file mode 100644
index 8796e86..0000000
--- a/tests/MusicServiceDemo/res/layout/fragment_main.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2014 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.
- -->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingBottom="@dimen/activity_vertical_margin"
- android:paddingLeft="@dimen/activity_horizontal_margin"
- android:paddingRight="@dimen/activity_horizontal_margin"
- android:paddingTop="@dimen/activity_vertical_margin"
- tools:context="com.example.android.automotive.musicplayer.MainActivity$PlaceholderFragment" >
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/app_name" />
-
-</RelativeLayout>
diff --git a/tests/MusicServiceDemo/res/values/colors.xml b/tests/MusicServiceDemo/res/values/colors.xml
deleted file mode 100644
index 44dd05d..0000000
--- a/tests/MusicServiceDemo/res/values/colors.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2014 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<resources>
- <color name="yellow">#ffffff00</color>
- <color name="green">#ff00ff00</color>
- <color name="blue">#ff0000ff</color>
- <color name="red">#ffff0000</color>
-</resources>
diff --git a/tests/MusicServiceDemo/res/values/dimens.xml b/tests/MusicServiceDemo/res/values/dimens.xml
deleted file mode 100644
index 9f63ef2..0000000
--- a/tests/MusicServiceDemo/res/values/dimens.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2014 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-<resources>
-
- <!-- Default screen margins, per the Android Design guidelines. -->
- <dimen name="activity_horizontal_margin">16dp</dimen>
- <dimen name="activity_vertical_margin">16dp</dimen>
-
-</resources>
diff --git a/tests/MusicServiceDemo/res/values/strings.xml b/tests/MusicServiceDemo/res/values/strings.xml
deleted file mode 100644
index 14c0171..0000000
--- a/tests/MusicServiceDemo/res/values/strings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2014 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-<resources>
-
- <string name="app_name">Music Service Demo</string>
- <string name="action_settings">Settings</string>
- <string name="thumbs_up">Thumbs Up</string>
- <string name="music_error">No music found</string>
- <string name="now_playing">Now Playing</string>
-
-</resources>
diff --git a/tests/MusicServiceDemo/res/values/styles.xml b/tests/MusicServiceDemo/res/values/styles.xml
deleted file mode 100644
index b83662d..0000000
--- a/tests/MusicServiceDemo/res/values/styles.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2014 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-<resources>
-
- <!--
- Base application theme, dependent on API level. This theme is replaced
- by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
- -->
- <style name="AppBaseTheme" parent="Theme.AppCompat.Light">
- <!--
- Theme customizations available in newer API levels can go in
- res/values-vXX/styles.xml, while customizations related to
- backward-compatibility can go here.
- -->
- </style>
-
- <!-- Application theme. -->
- <style name="AppTheme" parent="AppBaseTheme">
- <!-- All customizations that are NOT specific to a particular API-level can go here. -->
- </style>
-
-</resources>
diff --git a/tests/MusicServiceDemo/src/com/example/android/musicservicedemo/BrowserService.java b/tests/MusicServiceDemo/src/com/example/android/musicservicedemo/BrowserService.java
deleted file mode 100644
index 4e2e47e..0000000
--- a/tests/MusicServiceDemo/src/com/example/android/musicservicedemo/BrowserService.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/*
- * Copyright (C) 2014 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.example.android.musicservicedemo;
-
-import android.app.SearchManager;
-import android.app.Service;
-import android.content.Context;
-import android.content.Intent;
-import android.content.UriMatcher;
-import android.content.res.Resources.NotFoundException;
-import android.database.MatrixCursor;
-import android.graphics.Bitmap;
-import android.media.AudioManager;
-import android.media.MediaDescription;
-import android.media.MediaPlayer;
-import android.media.MediaPlayer.OnCompletionListener;
-import android.media.MediaPlayer.OnErrorListener;
-import android.media.MediaPlayer.OnPreparedListener;
-import android.media.browse.MediaBrowser;
-import android.service.media.MediaBrowserService;
-import android.service.media.MediaBrowserService.BrowserRoot;
-import android.media.session.MediaSession;
-import android.net.Uri;
-import android.net.wifi.WifiManager;
-import android.net.wifi.WifiManager.WifiLock;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Message;
-import android.os.PowerManager;
-import android.os.RemoteException;
-import android.os.SystemClock;
-import android.util.Log;
-
-import com.example.android.musicservicedemo.browser.MusicProvider;
-import com.example.android.musicservicedemo.browser.MusicProviderTask;
-import com.example.android.musicservicedemo.browser.MusicProviderTaskListener;
-import com.example.android.musicservicedemo.browser.MusicTrack;
-
-import org.json.JSONException;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Service that implements MediaBrowserService and returns our menu hierarchy.
- */
-public class BrowserService extends MediaBrowserService {
- private static final String TAG = "BrowserService";
-
- // URI paths for browsing music
- public static final String BROWSE_ROOT_BASE_PATH = "browse";
- public static final String NOW_PLAYING_PATH = "now_playing";
- public static final String PIANO_BASE_PATH = "piano";
- public static final String VOICE_BASE_PATH = "voice";
-
- // Content URIs
- public static final String AUTHORITY = "com.example.android.automotive.musicplayer";
- public static final Uri BASE_URI = Uri.parse("content://" + AUTHORITY);
- public static final Uri BROWSE_URI = Uri.withAppendedPath(BASE_URI, BROWSE_ROOT_BASE_PATH);
-
- // URI matcher constants for browsing paths
- public static final int BROWSE_ROOT = 1;
- public static final int NOW_PLAYING = 2;
- public static final int PIANO = 3;
- public static final int VOICE = 4;
-
- // Map the the URI paths with the URI matcher constants
- private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
- static {
- sUriMatcher.addURI(AUTHORITY, BROWSE_ROOT_BASE_PATH, BROWSE_ROOT);
- sUriMatcher.addURI(AUTHORITY, NOW_PLAYING_PATH, NOW_PLAYING);
- sUriMatcher.addURI(AUTHORITY, PIANO_BASE_PATH, PIANO);
- sUriMatcher.addURI(AUTHORITY, VOICE_BASE_PATH, VOICE);
- }
-
- // Media metadata that will be provided for a media container
- public static final String[] MEDIA_CONTAINER_PROJECTION = {
- "uri",
- "title",
- "subtitle",
- "image_uri",
- "supported_actions"
- };
-
- // MusicProvider will download the music catalog
- private MusicProvider mMusicProvider;
-
- private MediaSession mSession;
-
- @Override
- public void onCreate() {
- super.onCreate();
-
- mSession = new MediaSession(this, "com.example.android.musicservicedemo.BrowserService");
- setSessionToken(mSession.getSessionToken());
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- }
-
- @Override
- public BrowserRoot onGetRoot(String clientPackageName, int clientUid, Bundle rootHints) {
- return new BrowserRoot(BROWSE_URI.toString(), null);
- }
-
- @Override
- public void onLoadChildren(final String parentId,
- final Result<List<MediaBrowser.MediaItem>> result) {
- new Handler().postDelayed(new Runnable() {
- public void run() {
- final ArrayList<MediaBrowser.MediaItem> list = new ArrayList();
-
- for (int i=0; i<10; i++) {
- MediaDescription.Builder bob = new MediaDescription.Builder();
- bob.setTitle("Title " + i);
- bob.setSubtitle("Summary " + i);
- bob.setMediaId(Uri.withAppendedPath(BASE_URI,
- Integer.toString(i)).toString());
- list.add(new MediaBrowser.MediaItem(bob.build(),
- MediaBrowser.MediaItem.FLAG_BROWSABLE));
- }
-
- result.sendResult(list);
- }
- }, 2000);
- result.detach();
- }
-
- /*
- @Override
- public void query(final Query query, final IMetadataResultHandler metadataResultHandler,
- final IErrorHandler errorHandler)
- throws RemoteException {
- Log.d(TAG, "query: " + query);
- Utils.checkNotNull(query);
- Utils.checkNotNull(metadataResultHandler);
- Utils.checkNotNull(errorHandler);
-
- // Handle async response
- new Thread(new Runnable() {
- public void run() {
- try {
- // Pre-load the list of music
- List<MusicTrack> musicTracks = getMusicList();
- if (musicTracks == null) {
- notifyListenersOnPlaybackStateUpdate(getCurrentPlaybackState());
- errorHandler.onError(new Error(Error.UNKNOWN,
- getString(R.string.music_error)));
- return;
- }
-
- final Uri uri = query.getUri();
- int match = sUriMatcher.match(uri);
- Log.d(TAG, "Queried: " + uri + "; match: " + match);
- switch (match) {
- case BROWSE_ROOT:
- {
- Log.d(TAG, "Browse_root");
-
- try {
- MatrixCursor matrixCursor = mMusicProvider
- .getRootContainerCurser();
- DataHolder holder = new DataHolder(MEDIA_CONTAINER_PROJECTION,
- matrixCursor, null);
-
- Log.d(TAG, "on metadata response called " + holder.getCount());
- metadataResultHandler.onMetadataResponse(holder);
- } catch (RemoteException e) {
- Log.w(TAG, "Error delivering metadata in the callback.", e);
- }
- break;
- }
- case NOW_PLAYING:
- {
- try {
- Log.d(TAG, "query NOW_PLAYING");
- MatrixCursor matrixCursor = mMusicProvider
- .getRootItemCursor(
- PIANO);
- DataHolder holder = new DataHolder(MEDIA_CONTAINER_PROJECTION,
- matrixCursor, null);
- Log.d(TAG, "on metadata response called " + holder.getCount());
- metadataResultHandler.onMetadataResponse(holder);
- } catch (RemoteException e) {
- Log.w(TAG, "Error querying NOW_PLAYING");
- }
- break;
- }
- case PIANO:
- {
- try {
- Log.d(TAG, "query PIANO");
- MatrixCursor matrixCursor = mMusicProvider
- .getRootItemCursor(
- PIANO);
- DataHolder holder = new DataHolder(MEDIA_CONTAINER_PROJECTION,
- matrixCursor, null);
- Log.d(TAG, "on metadata response called " + holder.getCount());
- metadataResultHandler.onMetadataResponse(holder);
- } catch (RemoteException e) {
- Log.w(TAG, "Error querying PIANO");
- }
- break;
- }
- case VOICE:
- {
- try {
- Log.d(TAG, "query VOICE");
- MatrixCursor matrixCursor = mMusicProvider
- .getRootItemCursor(
- VOICE);
- DataHolder holder = new DataHolder(MEDIA_CONTAINER_PROJECTION,
- matrixCursor, null);
- Log.d(TAG, "on metadata response called " + holder.getCount());
- metadataResultHandler.onMetadataResponse(holder);
- } catch (RemoteException e) {
- Log.w(TAG, "Error querying VOICE");
- }
- break;
- }
- default:
- {
- Log.w(TAG, "Skipping unmatched URI: " + uri);
- }
- }
- } catch (NotFoundException e) {
- Log.e(TAG, "::run:", e);
- } catch (RemoteException e) {
- Log.e(TAG, "::run:", e);
- }
- } // end run
- }).start();
- }
-
- */
-}
diff --git a/tests/MusicServiceDemo/src/com/example/android/musicservicedemo/MainActivity.java b/tests/MusicServiceDemo/src/com/example/android/musicservicedemo/MainActivity.java
deleted file mode 100644
index 99d44e6..0000000
--- a/tests/MusicServiceDemo/src/com/example/android/musicservicedemo/MainActivity.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/* Copyright 2014 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.example.android.musicservicedemo;
-
-import android.os.Bundle;
-import android.support.v4.app.Fragment;
-import android.support.v7.app.AppCompatActivity;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-
-import com.example.android.musicservicedemo.R;
-
-// TODO Local UI
-
-/**
- * Main activity of the app.
- */
-public class MainActivity extends AppCompatActivity {
-
- private static final String LOG = "MainActivity";
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
-
- if (savedInstanceState == null) {
- getSupportFragmentManager().beginTransaction()
- .add(R.id.container, new PlaceholderFragment())
- .commit();
- }
-
- }
-
- /*
- * (non-Javadoc)
- * @see android.app.Activity#onCreateOptionsMenu(android.view.Menu)
- */
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
-
- // Inflate the menu; this adds items to the action bar if it is present.
- //getMenuInflater().inflate(R.menu.main, menu);
- return true;
- }
-
- /*
- * (non-Javadoc)
- * @see android.app.Activity#onOptionsItemSelected(android.view.MenuItem)
- */
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- // Handle action bar item clicks here. The action bar will
- // automatically handle clicks on the Home/Up button, so long
- // as you specify a parent activity in AndroidManifest.xml.
- int id = item.getItemId();
- // if (id == R.id.action_settings) {
- // return true;
- // }
- return super.onOptionsItemSelected(item);
- }
-
- /**
- * A placeholder fragment containing a simple view.
- */
- public static class PlaceholderFragment extends Fragment {
-
- public PlaceholderFragment() {
- }
-
- /*
- * (non-Javadoc)
- * @see
- * android.support.v4.app.Fragment#onCreateView(android.view.LayoutInflater
- * , android.view.ViewGroup, android.os.Bundle)
- */
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- View rootView = inflater.inflate(R.layout.fragment_main, container, false);
- return rootView;
- }
- }
-
-}
diff --git a/tests/MusicServiceDemo/src/com/example/android/musicservicedemo/Utils.java b/tests/MusicServiceDemo/src/com/example/android/musicservicedemo/Utils.java
deleted file mode 100644
index 3589761..0000000
--- a/tests/MusicServiceDemo/src/com/example/android/musicservicedemo/Utils.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2014 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.example.android.musicservicedemo;
-
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.util.Log;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.HttpURLConnection;
-import java.net.URL;
-
-public class Utils {
-
- private static final String TAG = "Utils";
-
- /**
- * Utility method to check that parameters are not null
- *
- * @param object
- */
- public static final void checkNotNull(Object object) {
- if (object == null) {
- throw new NullPointerException();
- }
- }
-
- /**
- * Utility to download a bitmap
- *
- * @param source
- * @return
- */
- public static Bitmap getBitmapFromURL(String source) {
- try {
- URL url = new URL(source);
- HttpURLConnection httpConnection = (HttpURLConnection) url.openConnection();
- httpConnection.setDoInput(true);
- httpConnection.connect();
- InputStream inputStream = httpConnection.getInputStream();
- return BitmapFactory.decodeStream(inputStream);
- } catch (IOException e) {
- Log.e(TAG, "getBitmapFromUrl: " + source, e);
- }
- return null;
- }
-
- /**
- * Utility method to wrap an index
- *
- * @param i
- * @param size
- * @return
- */
- public static int wrapIndex(int i, int size) {
- int m = i % size;
- if (m < 0) { // java modulus can be negative
- m += size;
- }
- return m;
- }
-}
diff --git a/tests/MusicServiceDemo/src/com/example/android/musicservicedemo/browser/MusicProvider.java b/tests/MusicServiceDemo/src/com/example/android/musicservicedemo/browser/MusicProvider.java
deleted file mode 100644
index 15038d7..0000000
--- a/tests/MusicServiceDemo/src/com/example/android/musicservicedemo/browser/MusicProvider.java
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * Copyright (C) 2014 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.example.android.musicservicedemo.browser;
-
-import android.database.MatrixCursor;
-import android.media.session.PlaybackState;
-import android.net.Uri;
-import android.util.Log;
-
-import com.example.android.musicservicedemo.BrowserService;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.URLConnection;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Utility class to get a list of MusicTrack's based on a server-side JSON
- * configuration.
- */
-public class MusicProvider {
-
- private static final String TAG = "MusicProvider";
-
- private static final String MUSIC_URL = "http://storage.googleapis.com/automotive-media/music.json";
-
- private static String MUSIC = "music";
- private static String TITLE = "title";
- private static String ALBUM = "album";
- private static String ARTIST = "artist";
- private static String GENRE = "genre";
- private static String SOURCE = "source";
- private static String IMAGE = "image";
- private static String TRACK_NUMBER = "trackNumber";
- private static String TOTAL_TRACK_COUNT = "totalTrackCount";
- private static String DURATION = "duration";
-
- // Cache for music track data
- private static List<MusicTrack> mMusicList;
-
- /**
- * Get the cached list of music tracks
- *
- * @return
- * @throws JSONException
- */
- public List<MusicTrack> getMedia() throws JSONException {
- if (null != mMusicList && mMusicList.size() > 0) {
- return mMusicList;
- }
- return null;
- }
-
- /**
- * Get the list of music tracks from a server and return the list of
- * MusicTrack objects.
- *
- * @return
- * @throws JSONException
- */
- public List<MusicTrack> retreiveMedia() throws JSONException {
- if (null != mMusicList) {
- return mMusicList;
- }
- int slashPos = MUSIC_URL.lastIndexOf('/');
- String path = MUSIC_URL.substring(0, slashPos + 1);
- JSONObject jsonObj = parseUrl(MUSIC_URL);
-
- try {
- JSONArray videos = jsonObj.getJSONArray(MUSIC);
- if (null != videos) {
- mMusicList = new ArrayList<MusicTrack>();
- for (int j = 0; j < videos.length(); j++) {
- JSONObject music = videos.getJSONObject(j);
- String title = music.getString(TITLE);
- String album = music.getString(ALBUM);
- String artist = music.getString(ARTIST);
- String genre = music.getString(GENRE);
- String source = music.getString(SOURCE);
- // Media is stored relative to JSON file
- if (!source.startsWith("http")) {
- source = path + source;
- }
- String image = music.getString(IMAGE);
- if (!image.startsWith("http")) {
- image = path + image;
- }
- int trackNumber = music.getInt(TRACK_NUMBER);
- int totalTrackCount = music.getInt(TOTAL_TRACK_COUNT);
- int duration = music.getInt(DURATION) * 1000; // ms
-
- mMusicList.add(new MusicTrack(title, album, artist, genre, source,
- image, trackNumber, totalTrackCount, duration));
- }
- }
- } catch (NullPointerException e) {
- Log.e(TAG, "retreiveMedia", e);
- }
- return mMusicList;
- }
-
- /**
- * Download a JSON file from a server, parse the content and return the JSON
- * object.
- *
- * @param urlString
- * @return
- */
- private JSONObject parseUrl(String urlString) {
- InputStream is = null;
- try {
- java.net.URL url = new java.net.URL(urlString);
- URLConnection urlConnection = url.openConnection();
- is = new BufferedInputStream(urlConnection.getInputStream());
- BufferedReader reader = new BufferedReader(new InputStreamReader(
- urlConnection.getInputStream(), "iso-8859-1"), 8);
- StringBuilder sb = new StringBuilder();
- String line = null;
- while ((line = reader.readLine()) != null) {
- sb.append(line);
- }
- return new JSONObject(sb.toString());
- } catch (Exception e) {
- Log.d(TAG, "Failed to parse the json for media list", e);
- return null;
- } finally {
- if (null != is) {
- try {
- is.close();
- } catch (IOException e) {
- // ignore
- }
- }
- }
- }
-
- public MatrixCursor getRootContainerCurser() {
- MatrixCursor matrixCursor = new MatrixCursor(BrowserService.MEDIA_CONTAINER_PROJECTION);
- Uri.Builder pianoBuilder = new Uri.Builder();
- pianoBuilder.authority(BrowserService.AUTHORITY);
- pianoBuilder.appendPath(BrowserService.PIANO_BASE_PATH);
- matrixCursor.addRow(new Object[] {
- pianoBuilder.build(),
- BrowserService.PIANO_BASE_PATH,
- "subtitle",
- null,
- 0
- });
-
- Uri.Builder voiceBuilder = new Uri.Builder();
- voiceBuilder.authority(BrowserService.AUTHORITY);
- voiceBuilder.appendPath(BrowserService.VOICE_BASE_PATH);
- matrixCursor.addRow(new Object[] {
- voiceBuilder.build(),
- BrowserService.VOICE_BASE_PATH,
- "subtitle",
- null,
- 0
- });
- return matrixCursor;
- }
-
- public MatrixCursor getRootItemCursor(int type) {
- if (type == BrowserService.NOW_PLAYING) {
- MatrixCursor matrixCursor = new MatrixCursor(BrowserService.MEDIA_CONTAINER_PROJECTION);
-
- try {
- // Just return all of the tracks for now
- List<MusicTrack> musicTracks = retreiveMedia();
- for (MusicTrack musicTrack : musicTracks) {
- Uri.Builder builder = new Uri.Builder();
- builder.authority(BrowserService.AUTHORITY);
- builder.appendPath(BrowserService.NOW_PLAYING_PATH);
- builder.appendPath(musicTrack.getTitle());
- matrixCursor.addRow(new Object[] {
- builder.build(),
- musicTrack.getTitle(),
- musicTrack.getArtist(),
- musicTrack.getImage(),
- PlaybackState.ACTION_PLAY
- });
- Log.d(TAG, "Uri " + builder.build());
- }
- } catch (JSONException e) {
- Log.e(TAG, "::getRootItemCursor:", e);
- }
-
- Log.d(TAG, "cursor: " + matrixCursor.getCount());
- return matrixCursor;
- } else if (type == BrowserService.PIANO) {
- MatrixCursor matrixCursor = new MatrixCursor(BrowserService.MEDIA_CONTAINER_PROJECTION);
-
- try {
- List<MusicTrack> musicTracks = retreiveMedia();
- for (MusicTrack musicTrack : musicTracks) {
- Uri.Builder builder = new Uri.Builder();
- builder.authority(BrowserService.AUTHORITY);
- builder.appendPath(BrowserService.PIANO_BASE_PATH);
- builder.appendPath(musicTrack.getTitle());
- matrixCursor.addRow(new Object[] {
- builder.build(),
- musicTrack.getTitle(),
- musicTrack.getArtist(),
- musicTrack.getImage(),
- PlaybackState.ACTION_PLAY
- });
- Log.d(TAG, "Uri " + builder.build());
- }
- } catch (JSONException e) {
- Log.e(TAG, "::getRootItemCursor:", e);
- }
-
- Log.d(TAG, "cursor: " + matrixCursor.getCount());
- return matrixCursor;
- } else if (type == BrowserService.VOICE) {
- MatrixCursor matrixCursor = new MatrixCursor(BrowserService.MEDIA_CONTAINER_PROJECTION);
-
- try {
- List<MusicTrack> musicTracks = retreiveMedia();
- for (MusicTrack musicTrack : musicTracks) {
- Uri.Builder builder = new Uri.Builder();
- builder.authority(BrowserService.AUTHORITY);
- builder.appendPath(BrowserService.VOICE_BASE_PATH);
- builder.appendPath(musicTrack.getTitle());
- matrixCursor.addRow(new Object[] {
- builder.build(),
- musicTrack.getTitle(),
- musicTrack.getArtist(),
- musicTrack.getImage(),
- PlaybackState.ACTION_PLAY
- });
- Log.d(TAG, "Uri " + builder.build());
- }
- } catch (JSONException e) {
- Log.e(TAG, "::getRootItemCursor:", e);
- }
-
- Log.d(TAG, "cursor: " + matrixCursor.getCount());
- return matrixCursor;
-
- }
- return null;
- }
-}
diff --git a/tests/MusicServiceDemo/src/com/example/android/musicservicedemo/browser/MusicProviderTask.java b/tests/MusicServiceDemo/src/com/example/android/musicservicedemo/browser/MusicProviderTask.java
deleted file mode 100644
index ffda110..0000000
--- a/tests/MusicServiceDemo/src/com/example/android/musicservicedemo/browser/MusicProviderTask.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.example.android.musicservicedemo.browser;
-
-import android.os.AsyncTask;
-import android.util.Log;
-
-import org.json.JSONException;
-
-/**
- * Asynchronous task to retrieve the music data using MusicProvider.
- */
-public class MusicProviderTask extends AsyncTask<Void, Void, Void> {
-
- private static final String TAG = "MusicProviderTask";
-
- MusicProvider mMusicProvider;
- MusicProviderTaskListener mMusicProviderTaskListener;
-
- /**
- * Initialize the task with the provider to download the music data and the
- * listener to be informed when the task is done.
- *
- * @param musicProvider
- * @param listener
- */
- public MusicProviderTask(MusicProvider musicProvider,
- MusicProviderTaskListener listener) {
- mMusicProvider = musicProvider;
- mMusicProviderTaskListener = listener;
- }
-
- /*
- * (non-Javadoc)
- * @see android.os.AsyncTask#doInBackground(java.lang.Object[])
- */
- @Override
- protected Void doInBackground(Void... arg0) {
- try {
- mMusicProvider.retreiveMedia();
- } catch (JSONException e) {
- Log.e(TAG, "::doInBackground:", e);
- }
- return null;
- }
-
- /*
- * (non-Javadoc)
- * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
- */
- @Override
- protected void onPostExecute(Void result) {
- mMusicProviderTaskListener.onMusicProviderTaskCompleted();
- }
-
-}
diff --git a/tests/MusicServiceDemo/src/com/example/android/musicservicedemo/browser/MusicProviderTaskListener.java b/tests/MusicServiceDemo/src/com/example/android/musicservicedemo/browser/MusicProviderTaskListener.java
deleted file mode 100644
index b1d168f..0000000
--- a/tests/MusicServiceDemo/src/com/example/android/musicservicedemo/browser/MusicProviderTaskListener.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2014 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.example.android.musicservicedemo.browser;
-
-/**
- * Callback listener for completion of MusicProviderTask
- */
-public interface MusicProviderTaskListener {
- public void onMusicProviderTaskCompleted();
-}
diff --git a/tests/MusicServiceDemo/src/com/example/android/musicservicedemo/browser/MusicTrack.java b/tests/MusicServiceDemo/src/com/example/android/musicservicedemo/browser/MusicTrack.java
deleted file mode 100644
index 02ea899..0000000
--- a/tests/MusicServiceDemo/src/com/example/android/musicservicedemo/browser/MusicTrack.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright (C) 2014 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.example.android.musicservicedemo.browser;
-
-/**
- * A class to model music track metadata.
- */
-public class MusicTrack {
-
- private static final String TAG = "MusicTrack";
-
- private String mTitle;
- private String mAlbum;
- private String mArtist;
- private String mGenre;
- private String mSource;
- private String mImage;
- private int mTrackNumber;
- private int mTotalTrackCount;
- private int mDuration;
-
- /**
- * Constructor creating a MusicTrack instance.
- *
- * @param title
- * @param album
- * @param artist
- * @param genre
- * @param source
- * @param image
- * @param trackNumber
- * @param totalTrackCount
- * @param duration
- */
- public MusicTrack(String title, String album, String artist, String genre, String source,
- String image, int trackNumber, int totalTrackCount, int duration) {
- this.mTitle = title;
- this.mAlbum = album;
- this.mArtist = artist;
- this.mGenre = genre;
- this.mSource = source;
- this.mImage = image;
- this.mTrackNumber = trackNumber;
- this.mTotalTrackCount = totalTrackCount;
- this.mDuration = duration;
- }
-
- public String getTitle() {
- return mTitle;
- }
-
- public void setTitle(String mTitle) {
- this.mTitle = mTitle;
- }
-
- public String getAlbum() {
- return mAlbum;
- }
-
- public void setAlbum(String mAlbum) {
- this.mAlbum = mAlbum;
- }
-
- public String getArtist() {
- return mArtist;
- }
-
- public void setArtist(String mArtist) {
- this.mArtist = mArtist;
- }
-
- public String getGenre() {
- return mGenre;
- }
-
- public void setGenre(String mGenre) {
- this.mGenre = mGenre;
- }
-
- public String getSource() {
- return mSource;
- }
-
- public void setSource(String mSource) {
- this.mSource = mSource;
- }
-
- public String getImage() {
- return mImage;
- }
-
- public void setImage(String mImage) {
- this.mImage = mImage;
- }
-
- public int getTrackNumber() {
- return mTrackNumber;
- }
-
- public void setTrackNumber(int mTrackNumber) {
- this.mTrackNumber = mTrackNumber;
- }
-
- public int getTotalTrackCount() {
- return mTotalTrackCount;
- }
-
- public void setTotalTrackCount(int mTotalTrackCount) {
- this.mTotalTrackCount = mTotalTrackCount;
- }
-
- public int getDuration() {
- return mDuration;
- }
-
- public void setDuration(int mDuration) {
- this.mDuration = mDuration;
- }
-
- public String toString() {
- return mTitle;
- }
-
-}
diff --git a/tests/ShowWhenLockedApp/Android.mk b/tests/ShowWhenLockedApp/Android.mk
new file mode 100644
index 0000000..0064167
--- /dev/null
+++ b/tests/ShowWhenLockedApp/Android.mk
@@ -0,0 +1,10 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(call all-subdir-java-files)
+
+LOCAL_PACKAGE_NAME := ShowWhenLocked
+
+LOCAL_MODULE_TAGS := tests
+
+include $(BUILD_PACKAGE)
\ No newline at end of file
diff --git a/tests/ShowWhenLockedApp/AndroidManifest.xml b/tests/ShowWhenLockedApp/AndroidManifest.xml
new file mode 100644
index 0000000..a872e06
--- /dev/null
+++ b/tests/ShowWhenLockedApp/AndroidManifest.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.showwhenlocked">
+ <application android:label="ShowWhenLocked">
+ <activity android:name=".ShowWhenLockedActivity"
+ android:showWhenLocked="true"
+ android:turnScreenOn="true"
+ android:launchMode="singleTask">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN"/>
+ <category android:name="android.intent.category.LAUNCHER"/>
+ </intent-filter>
+ </activity>
+ </application>
+</manifest>
diff --git a/tests/ShowWhenLockedApp/src/com/android/showwhenlocked/ShowWhenLockedActivity.java b/tests/ShowWhenLockedApp/src/com/android/showwhenlocked/ShowWhenLockedActivity.java
new file mode 100644
index 0000000..f714831
--- /dev/null
+++ b/tests/ShowWhenLockedApp/src/com/android/showwhenlocked/ShowWhenLockedActivity.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.showwhenlocked;
+
+import android.app.Activity;
+import android.app.KeyguardManager;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+
+/**
+ * Sample app to test the manifest attrs {@link android.R.attr#showWhenLocked}
+ * and {@link android.R.attr#turnScreenOn}.
+ *
+ * <p>Run with adb shell am start -n com.android.showwhenlocked/.ShowWhenLockedActivity to test
+ * when the phone has a keyguard enabled and/or the screen is off.
+ *
+ * Use the extra {@link #EXTRA_SHOW_WHEN_LOCKED} and {@link #EXTRA_TURN_SCREEN_ON} to test
+ * multiple scenarios.
+ *
+ * Ex: adb shell am start -n com.android.showwhenlocked/.ShowWhenLockedActivity --ez \
+ * showWhenLocked false \
+ * setTurnScreenOnAtStop false
+ *
+ * Note: Behavior may change if values are set to true after the Activity is already created
+ * and only brought to the front. For example, turnScreenOn only takes effect on the next launch
+ * if set using the extra value.
+ */
+public class ShowWhenLockedActivity extends Activity {
+ private static final String TAG = ShowWhenLockedActivity.class.getSimpleName();
+
+ /**
+ * The value set for this extra sets {@link #setShowWhenLocked(boolean)} as soon as the app
+ * is launched. This may cause delays in when the value set takes affect.
+ */
+ private static final String EXTRA_SHOW_WHEN_LOCKED = "showWhenLocked";
+
+ /**
+ * The value set for this extra sets {@link #setTurnScreenOn(boolean)} as soon as the app
+ * is launched. This may cause delays in when the value set takes affect.
+ */
+ private static final String EXTRA_TURN_SCREEN_ON = "turnScreenOn";
+
+ /**
+ * The value set for this extra will call {@link #setShowWhenLocked(boolean)} at onStop so
+ * it take effect on the next launch.
+ */
+ private static final String EXTRA_SHOW_WHEN_LOCKED_STOP = "setShowWhenLockedAtStop";
+
+ /**
+ * The value set for this extra will call {@link #setTurnScreenOn(boolean)} at onStop so
+ * it take effect on the next launch.
+ */
+ private static final String EXTRA_TURN_SCREEN_ON_STOP = "setTurnScreenOnAtStop";
+
+ /**
+ * The value set for this extra will call
+ * {@link KeyguardManager#requestDismissKeyguard(Activity, KeyguardManager.KeyguardDismissCallback)}
+ * as soon as the app is launched.
+ */
+ private static final String EXTRA_DISMISS_KEYGUARD = "dismissKeyguard";
+
+ private boolean showWhenLockedAtStop = true;
+ private boolean turnScreenOnAtStop = true;
+
+ private KeyguardManager mKeyguardManager;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ Log.v(TAG, "onCreate");
+ mKeyguardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE);
+ handleExtras(getIntent().getExtras());
+ }
+
+ @Override
+ protected void onStart() {
+ super.onStart();
+ Log.v(TAG, "onStart");
+ }
+
+ @Override
+ protected void onNewIntent(Intent intent) {
+ super.onNewIntent(intent);
+ handleExtras(intent.getExtras());
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ Log.v(TAG, "onResume");
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ Log.v(TAG, "onPause");
+ }
+
+ @Override
+ protected void onStop() {
+ super.onStop();
+ Log.v(TAG, "onStop");
+
+ setShowWhenLocked(showWhenLockedAtStop);
+ setTurnScreenOn(turnScreenOnAtStop);
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ Log.v(TAG, "onDestroy");
+ }
+
+ private void handleExtras(Bundle extras) {
+ if (extras == null) {
+ return;
+ }
+
+ if (extras.containsKey(EXTRA_SHOW_WHEN_LOCKED)) {
+ boolean showWhenLocked = extras.getBoolean(EXTRA_SHOW_WHEN_LOCKED, true);
+ Log.v(TAG, "Setting showWhenLocked to " + showWhenLocked);
+ setShowWhenLocked(showWhenLocked);
+ }
+
+ if (extras.containsKey(EXTRA_TURN_SCREEN_ON)) {
+ boolean turnScreenOn = extras.getBoolean(EXTRA_TURN_SCREEN_ON, true);
+ Log.v(TAG, "Setting turnScreenOn to " + turnScreenOn);
+ setTurnScreenOn(turnScreenOn);
+ }
+
+ if (extras.containsKey(EXTRA_SHOW_WHEN_LOCKED_STOP)) {
+ showWhenLockedAtStop = extras.getBoolean(EXTRA_SHOW_WHEN_LOCKED_STOP, true);
+ Log.v(TAG, "Setting showWhenLockedAtStop to " + showWhenLockedAtStop);
+ }
+
+ if (extras.containsKey(EXTRA_TURN_SCREEN_ON_STOP)) {
+ turnScreenOnAtStop = extras.getBoolean(EXTRA_TURN_SCREEN_ON_STOP, true);
+ Log.v(TAG, "Setting turnScreenOnAtStop to " + turnScreenOnAtStop);
+ }
+
+ if (extras.containsKey(EXTRA_DISMISS_KEYGUARD)) {
+ if (extras.getBoolean(EXTRA_DISMISS_KEYGUARD, false)) {
+ Log.v(TAG, "Requesting dismiss keyguard");
+ mKeyguardManager.requestDismissKeyguard(this, null);
+ }
+ }
+ }
+}
+
diff --git a/tests/TouchLatency/.gitignore b/tests/TouchLatency/.gitignore
index cfb7164..bd79078 100644
--- a/tests/TouchLatency/.gitignore
+++ b/tests/TouchLatency/.gitignore
@@ -3,3 +3,4 @@
/.idea
.DS_Store
/build
+.iml
diff --git a/tests/TouchLatency/Android.mk b/tests/TouchLatency/Android.mk
index 6ad4705..969283d 100644
--- a/tests/TouchLatency/Android.mk
+++ b/tests/TouchLatency/Android.mk
@@ -8,19 +8,11 @@
# omit gradle 'build' dir
LOCAL_SRC_FILES := $(call all-java-files-under,app/src/main/java)
-# use appcompat/support lib from the tree, so improvements/
-# regressions are reflected in test data
LOCAL_RESOURCE_DIR := \
- $(LOCAL_PATH)/app/src/main/res \
- frameworks/support/v7/appcompat/res
+ $(LOCAL_PATH)/app/src/main/res
LOCAL_AAPT_FLAGS := \
- --auto-add-overlay \
- --extra-packages android.support.v7.appcompat
-
-LOCAL_STATIC_JAVA_LIBRARIES := \
- android-support-v4 \
- android-support-v7-appcompat
+ --auto-add-overlay
LOCAL_PACKAGE_NAME := TouchLatency
diff --git a/tests/TouchLatency/TouchLatency.iml b/tests/TouchLatency/TouchLatency.iml
deleted file mode 100644
index cd87cea..0000000
--- a/tests/TouchLatency/TouchLatency.iml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="GRADLE" external.system.module.group="" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
- <component name="FacetManager">
- <facet type="java-gradle" name="Java-Gradle">
- <configuration>
- <option name="BUILD_FOLDER_PATH" value="$MODULE_DIR$/build" />
- <option name="BUILDABLE" value="false" />
- </configuration>
- </facet>
- </component>
- <component name="NewModuleRootManager" inherit-compiler-output="true">
- <exclude-output />
- <content url="file://$MODULE_DIR$">
- <excludeFolder url="file://$MODULE_DIR$/.gradle" />
- </content>
- <orderEntry type="inheritedJdk" />
- <orderEntry type="sourceFolder" forTests="false" />
- </component>
-</module>
\ No newline at end of file
diff --git a/tests/TouchLatency/app/app.iml b/tests/TouchLatency/app/app.iml
deleted file mode 100644
index 689e5e0..0000000
--- a/tests/TouchLatency/app/app.iml
+++ /dev/null
@@ -1,92 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/.." external.system.id="GRADLE" external.system.module.group="TouchLatency" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
- <component name="FacetManager">
- <facet type="android-gradle" name="Android-Gradle">
- <configuration>
- <option name="GRADLE_PROJECT_PATH" value=":app" />
- </configuration>
- </facet>
- <facet type="android" name="Android">
- <configuration>
- <option name="SELECTED_BUILD_VARIANT" value="debug" />
- <option name="SELECTED_TEST_ARTIFACT" value="_android_test_" />
- <option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
- <option name="COMPILE_JAVA_TASK_NAME" value="compileDebugSources" />
- <option name="SOURCE_GEN_TASK_NAME" value="generateDebugSources" />
- <option name="ASSEMBLE_TEST_TASK_NAME" value="assembleDebugAndroidTest" />
- <option name="TEST_SOURCE_GEN_TASK_NAME" value="generateDebugAndroidTestSources" />
- <option name="ALLOW_USER_CONFIGURATION" value="false" />
- <option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
- <option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
- <option name="RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/src/main/res" />
- <option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />
- </configuration>
- </facet>
- </component>
- <component name="NewModuleRootManager" inherit-compiler-output="false">
- <output url="file://$MODULE_DIR$/build/intermediates/classes/debug" />
- <output-test url="file://$MODULE_DIR$/build/intermediates/classes/androidTest/debug" />
- <exclude-output />
- <content url="file://$MODULE_DIR$">
- <sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/debug" isTestSource="false" generated="true" />
- <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/debug" isTestSource="false" generated="true" />
- <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" />
- <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/debug" isTestSource="false" generated="true" />
- <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/debug" type="java-resource" />
- <sourceFolder url="file://$MODULE_DIR$/build/generated/res/generated/debug" type="java-resource" />
- <sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/androidTest/debug" isTestSource="true" generated="true" />
- <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/androidTest/debug" isTestSource="true" generated="true" />
- <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/debug" isTestSource="true" generated="true" />
- <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/androidTest/debug" isTestSource="true" generated="true" />
- <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/debug" type="java-test-resource" />
- <sourceFolder url="file://$MODULE_DIR$/build/generated/res/generated/androidTest/debug" type="java-test-resource" />
- <sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
- <sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
- <sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" />
- <sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />
- <sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
- <sourceFolder url="file://$MODULE_DIR$/src/debug/jni" isTestSource="false" />
- <sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
- <sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />
- <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
- <sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" />
- <sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
- <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
- <sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
- <sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
- <sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
- <sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
- <sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
- <sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
- <sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
- <sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
- <sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" />
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/coverage-instrumented-classes" />
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/dependency-cache" />
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/dex" />
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/dex-cache" />
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/jacoco" />
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/javaResources" />
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/libs" />
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/lint" />
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/ndk" />
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/pre-dexed" />
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/proguard" />
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
- <excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
- <excludeFolder url="file://$MODULE_DIR$/build/outputs" />
- <excludeFolder url="file://$MODULE_DIR$/build/tmp" />
- </content>
- <orderEntry type="jdk" jdkName="Android API 21 Platform" jdkType="Android SDK" />
- <orderEntry type="sourceFolder" forTests="false" />
- <orderEntry type="library" exported="" name="appcompat-v7-21.0.3" level="project" />
- <orderEntry type="library" exported="" name="support-annotations-21.0.3" level="project" />
- <orderEntry type="library" exported="" name="support-v4-21.0.3" level="project" />
- </component>
-</module>
\ No newline at end of file
diff --git a/tests/TouchLatency/app/build.gradle b/tests/TouchLatency/app/build.gradle
index 7133beb..2337110 100644
--- a/tests/TouchLatency/app/build.gradle
+++ b/tests/TouchLatency/app/build.gradle
@@ -18,8 +18,3 @@
}
}
}
-
-dependencies {
- compile fileTree(dir: 'libs', include: ['*.jar'])
- compile 'com.android.support:appcompat-v7:21.0.3'
-}
diff --git a/tests/TouchLatency/app/src/main/java/com/prefabulated/touchlatency/TouchLatencyActivity.java b/tests/TouchLatency/app/src/main/java/com/prefabulated/touchlatency/TouchLatencyActivity.java
index 55440c8..b763c78 100644
--- a/tests/TouchLatency/app/src/main/java/com/prefabulated/touchlatency/TouchLatencyActivity.java
+++ b/tests/TouchLatency/app/src/main/java/com/prefabulated/touchlatency/TouchLatencyActivity.java
@@ -16,12 +16,12 @@
package com.prefabulated.touchlatency;
+import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.CountDownTimer;
-import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.method.Touch;
import android.util.AttributeSet;
@@ -173,7 +173,7 @@
private float mVelocityX, mVelocityY;
}
-public class TouchLatencyActivity extends AppCompatActivity {
+public class TouchLatencyActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
diff --git a/tests/TouchLatency/app/src/main/res/menu/menu_touch_latency.xml b/tests/TouchLatency/app/src/main/res/menu/menu_touch_latency.xml
index 1824f4a..5aef72e 100644
--- a/tests/TouchLatency/app/src/main/res/menu/menu_touch_latency.xml
+++ b/tests/TouchLatency/app/src/main/res/menu/menu_touch_latency.xml
@@ -14,8 +14,7 @@
limitations under the License.
-->
<menu xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" tools:context=".TouchLatencyActivity">
<item android:id="@+id/action_settings" android:title="@string/mode"
- android:orderInCategory="100" app:showAsAction="always" />
+ android:orderInCategory="100" android:showAsAction="always" />
</menu>
diff --git a/tests/TouchLatency/app/src/main/res/values/styles.xml b/tests/TouchLatency/app/src/main/res/values/styles.xml
index aa7c09f..22da7c1 100644
--- a/tests/TouchLatency/app/src/main/res/values/styles.xml
+++ b/tests/TouchLatency/app/src/main/res/values/styles.xml
@@ -16,7 +16,7 @@
<resources>
<!-- Base application theme. -->
- <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
+ <style name="AppTheme" parent="@android:style/Theme.Material.Light.DarkActionBar">
<!-- Customize your theme here. -->
</style>
diff --git a/tests/UiBench/Android.mk b/tests/UiBench/Android.mk
index 71067ae..e6af4b02 100644
--- a/tests/UiBench/Android.mk
+++ b/tests/UiBench/Android.mk
@@ -15,21 +15,24 @@
frameworks/support/design/res \
frameworks/support/v7/appcompat/res \
frameworks/support/v7/cardview/res \
- frameworks/support/v7/recyclerview/res
+ frameworks/support/v7/recyclerview/res \
+ frameworks/support/v17/leanback/res
LOCAL_AAPT_FLAGS := \
--auto-add-overlay \
--extra-packages android.support.design \
--extra-packages android.support.v7.appcompat \
--extra-packages android.support.v7.cardview \
- --extra-packages android.support.v7.recyclerview
+ --extra-packages android.support.v7.recyclerview \
+ --extra-packages android.support.v17.leanback
LOCAL_STATIC_JAVA_LIBRARIES := \
android-support-design \
android-support-v4 \
android-support-v7-appcompat \
android-support-v7-cardview \
- android-support-v7-recyclerview
+ android-support-v7-recyclerview \
+ android-support-v17-leanback
LOCAL_PACKAGE_NAME := UiBench
diff --git a/tests/UiBench/AndroidManifest.xml b/tests/UiBench/AndroidManifest.xml
index c20be51..2521dc9 100644
--- a/tests/UiBench/AndroidManifest.xml
+++ b/tests/UiBench/AndroidManifest.xml
@@ -257,5 +257,15 @@
<category android:name="com.android.test.uibench.TEST" />
</intent-filter>
</activity>
+
+ <activity
+ android:name=".leanback.BrowseActivity"
+ android:theme="@style/Theme.Leanback.Browse"
+ android:label="Leanback/Browse Fragment" >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="com.android.test.uibench.TEST" />
+ </intent-filter>
+ </activity>
</application>
</manifest>
diff --git a/tests/UiBench/build.gradle b/tests/UiBench/build.gradle
index 03ef7f1..fa2cfcd 100644
--- a/tests/UiBench/build.gradle
+++ b/tests/UiBench/build.gradle
@@ -36,4 +36,5 @@
compile 'com.android.support:cardview-v7:23.0.1'
compile 'com.android.support:recyclerview-v7:23.0.1'
compile 'com.android.support:design:23.0.1'
+ compile 'com.android.support:leanback-v17:23.0.1'
}
diff --git a/tests/UiBench/src/com/android/test/uibench/leanback/BitmapLoader.java b/tests/UiBench/src/com/android/test/uibench/leanback/BitmapLoader.java
new file mode 100644
index 0000000..8af9d3b
--- /dev/null
+++ b/tests/UiBench/src/com/android/test/uibench/leanback/BitmapLoader.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.test.uibench.leanback;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.os.AsyncTask;
+import android.support.v4.util.LruCache;
+import android.util.DisplayMetrics;
+import android.widget.ImageView;
+
+/**
+ * This class simulates a typical Bitmap memory cache with up to 1.5 times of screen pixels.
+ * The sample bitmap is generated in worker threads in AsyncTask.THREAD_POOL_EXECUTOR.
+ * The class does not involve decoding, disk cache i/o, network i/o, as the test is mostly focusing
+ * on the graphics side.
+ * There will be two general use cases for cards in leanback test:
+ * 1. As a typical app, each card has its own id and load its own Bitmap, the test result will
+ * include impact of texture upload.
+ * 2. All cards share same id/Bitmap and there wont be texture upload.
+ */
+public class BitmapLoader {
+
+ /**
+ * Caches bitmaps with bytes adds up to 1.5 x screen
+ * DO NOT CHANGE this defines baseline of test result.
+ */
+ static final float CACHE_SIZE_TO_SCREEN = 1.5f;
+ /**
+ * 4 bytes per pixel for RGBA_8888
+ */
+ static final int BYTES_PER_PIXEL = 4;
+
+ static LruCache<Long, Bitmap> sLruCache;
+ static Paint sTextPaint = new Paint();
+
+ static {
+ sTextPaint.setColor(Color.BLACK);
+ }
+
+ /**
+ * get or initialize LruCache, the max is set to full screen pixels.
+ */
+ static LruCache<Long, Bitmap> getLruCache(Context context) {
+ if (sLruCache == null) {
+ DisplayMetrics metrics = context.getResources().getDisplayMetrics();
+ int width = metrics.widthPixels;
+ int height = metrics.heightPixels;
+ int maxBytes = (int) (width * height * BYTES_PER_PIXEL * CACHE_SIZE_TO_SCREEN);
+ sLruCache = new LruCache<Long, Bitmap>(maxBytes) {
+ @Override
+ protected int sizeOf(Long key, Bitmap value) {
+ return value.getByteCount();
+ }
+ };
+ }
+ return sLruCache;
+ }
+
+ static class BitmapAsyncTask extends AsyncTask<Void, Void, Bitmap> {
+
+ ImageView mImageView;
+ long mId;
+ int mWidth;
+ int mHeight;
+
+ BitmapAsyncTask(ImageView view, long id, int width, int height) {
+ mImageView = view;
+ mId = id;
+ mImageView.setTag(this);
+ mWidth = width;
+ mHeight = height;
+ }
+
+ @Override
+ protected Bitmap doInBackground(Void... voids) {
+ // generate a sample bitmap: white background and text showing id
+ Bitmap bitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);
+ Canvas canvas = new Canvas(bitmap);
+ canvas.drawARGB(0xff, 0xff, 0xff, 0xff);
+ canvas.drawText(Long.toString(mId), 0f, mHeight / 2, sTextPaint);
+ canvas.setBitmap(null);
+ bitmap.prepareToDraw();
+ return bitmap;
+ }
+
+ @Override
+ protected void onCancelled() {
+ if (mImageView.getTag() == this) {
+ mImageView.setTag(null);
+ }
+ }
+
+ @Override
+ protected void onPostExecute(Bitmap bitmap) {
+ if (mImageView.getTag() == this) {
+ mImageView.setTag(null);
+ sLruCache.put(mId, bitmap);
+ mImageView.setImageBitmap(bitmap);
+ }
+ }
+ }
+
+ public static void loadBitmap(ImageView view, long id, int width, int height) {
+ Context context = view.getContext();
+ Bitmap bitmap = getLruCache(context).get(id);
+ if (bitmap != null) {
+ view.setImageBitmap(bitmap);
+ return;
+ }
+ new BitmapAsyncTask(view, id, width, height)
+ .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+ }
+
+ public static void cancel(ImageView view) {
+ BitmapAsyncTask task = (BitmapAsyncTask) view.getTag();
+ if (task != null && task.mImageView == view) {
+ task.mImageView.setTag(null);
+ task.cancel(false);
+ }
+ }
+
+ public static void clear() {
+ if (sLruCache != null) {
+ sLruCache.evictAll();
+ }
+ }
+}
diff --git a/tests/UiBench/src/com/android/test/uibench/leanback/BrowseActivity.java b/tests/UiBench/src/com/android/test/uibench/leanback/BrowseActivity.java
new file mode 100644
index 0000000..d29f0ea
--- /dev/null
+++ b/tests/UiBench/src/com/android/test/uibench/leanback/BrowseActivity.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.android.test.uibench.leanback;
+
+import android.support.v4.app.FragmentActivity;
+import android.app.Activity;
+import android.os.Bundle;
+
+public class BrowseActivity extends FragmentActivity {
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ if (savedInstanceState == null) {
+ getSupportFragmentManager().beginTransaction()
+ .add(android.R.id.content, new BrowseFragment())
+ .commit();
+ }
+ }
+
+}
diff --git a/tests/UiBench/src/com/android/test/uibench/leanback/BrowseFragment.java b/tests/UiBench/src/com/android/test/uibench/leanback/BrowseFragment.java
new file mode 100644
index 0000000..11ea361
--- /dev/null
+++ b/tests/UiBench/src/com/android/test/uibench/leanback/BrowseFragment.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.test.uibench.leanback;
+
+import android.os.Bundle;
+
+public class BrowseFragment extends android.support.v17.leanback.app.BrowseSupportFragment {
+
+ public BrowseFragment() {
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ BitmapLoader.clear();
+ TestHelper.initBackground(getActivity());
+ boolean runEntranceTransition = TestHelper.runEntranceTransition(getActivity());
+ if (runEntranceTransition) {
+ prepareEntranceTransition();
+ }
+ setAdapter(TestHelper.initRowsAdapterBuilder(getActivity()).build());
+ if (runEntranceTransition) {
+ startEntranceTransition();
+ }
+ }
+
+}
diff --git a/tests/UiBench/src/com/android/test/uibench/leanback/CardPresenter.java b/tests/UiBench/src/com/android/test/uibench/leanback/CardPresenter.java
new file mode 100644
index 0000000..5194555
--- /dev/null
+++ b/tests/UiBench/src/com/android/test/uibench/leanback/CardPresenter.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.test.uibench.leanback;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.support.v17.leanback.widget.ImageCardView;
+import android.support.v17.leanback.widget.Presenter;
+import android.support.v4.content.res.ResourcesCompat;
+import android.view.ContextThemeWrapper;
+import android.view.ViewGroup;
+import android.view.ViewGroup.LayoutParams;
+
+public class CardPresenter extends Presenter {
+
+ private int mImageWidth = 0;
+ private int mImageHeight = 0;
+
+ public CardPresenter(int width, int height) {
+ mImageWidth = width;
+ mImageHeight = height;
+ }
+
+ @Override
+ public ViewHolder onCreateViewHolder(ViewGroup parent) {
+ Context context = parent.getContext();
+ ImageCardView v = new ImageCardView(context);
+ v.setFocusable(true);
+ v.setFocusableInTouchMode(true);
+ v.setMainImageAdjustViewBounds(true);
+ v.setMainImageDimensions(mImageWidth, mImageHeight);
+ return new ViewHolder(v);
+ }
+
+ @Override
+ public void onBindViewHolder(ViewHolder viewHolder, Object item) {
+ PhotoItem photoItem = (PhotoItem) item;
+ ImageCardView cardView = (ImageCardView) viewHolder.view;
+ cardView.setTitleText(photoItem.getTitle());
+ BitmapLoader.loadBitmap(cardView.getMainImageView(), photoItem.getId(),
+ mImageWidth, mImageHeight);
+ }
+
+ @Override
+ public void onUnbindViewHolder(ViewHolder viewHolder) {
+ ImageCardView cardView = (ImageCardView) viewHolder.view;
+ BitmapLoader.cancel(cardView.getMainImageView());
+ }
+}
diff --git a/tests/UiBench/src/com/android/test/uibench/leanback/PhotoItem.java b/tests/UiBench/src/com/android/test/uibench/leanback/PhotoItem.java
new file mode 100644
index 0000000..acb9a5d0
--- /dev/null
+++ b/tests/UiBench/src/com/android/test/uibench/leanback/PhotoItem.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.test.uibench.leanback;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class PhotoItem implements Parcelable {
+
+ private String mTitle;
+ private long mId;
+
+ public PhotoItem(String title, long id) {
+ mTitle = title;
+ mId = id;
+ }
+
+ public long getId() {
+ return mId;
+ }
+
+ public String getTitle() {
+ return mTitle;
+ }
+
+ @Override
+ public String toString() {
+ return mTitle;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(mTitle);
+ dest.writeLong(mId);
+ }
+
+ public static final Creator<PhotoItem> CREATOR
+ = new Creator<PhotoItem>() {
+ @Override
+ public PhotoItem createFromParcel(Parcel in) {
+ return new PhotoItem(in);
+ }
+
+ @Override
+ public PhotoItem[] newArray(int size) {
+ return new PhotoItem[size];
+ }
+ };
+
+ private PhotoItem(Parcel in) {
+ mTitle = in.readString();
+ mId = in.readLong();
+ }
+}
diff --git a/tests/UiBench/src/com/android/test/uibench/leanback/TestHelper.java b/tests/UiBench/src/com/android/test/uibench/leanback/TestHelper.java
new file mode 100644
index 0000000..2bf3885
--- /dev/null
+++ b/tests/UiBench/src/com/android/test/uibench/leanback/TestHelper.java
@@ -0,0 +1,238 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.test.uibench.leanback;
+
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.support.v17.leanback.app.BackgroundManager;
+import android.support.v17.leanback.widget.ArrayObjectAdapter;
+import android.support.v17.leanback.widget.HeaderItem;
+import android.support.v17.leanback.widget.ListRow;
+import android.support.v17.leanback.widget.ListRowPresenter;
+import android.support.v17.leanback.widget.ObjectAdapter;
+import android.support.v17.leanback.widget.Presenter;
+import android.util.DisplayMetrics;
+import android.util.TypedValue;
+
+public class TestHelper {
+
+ public static final String EXTRA_BACKGROUND = "extra_bg";
+ public static final String EXTRA_ROWS = "extra_rows";
+ public static final String EXTRA_CARDS_PER_ROW = "extra_cards_per_row";
+ public static final String EXTRA_CARD_HEIGHT_DP = "extra_card_height";
+ public static final String EXTRA_CARD_WIDTH_DP = "extra_card_width";
+ public static final String EXTRA_CARD_SHADOW = "extra_card_shadow";
+ public static final String EXTRA_CARD_ROUND_RECT = "extra_card_round_rect";
+ public static final String EXTRA_ENTRANCE_TRANSITION = "extra_entrance_transition";
+ public static final String EXTRA_BITMAP_UPLOAD = "extra_bitmap_upload";
+
+ /**
+ * Dont change the default values, they gave baseline for measuring the performance
+ */
+ static final int DEFAULT_CARD_HEIGHT_DP = 180;
+ static final int DEFAULT_CARD_WIDTH_DP = 125;
+ static final int DEFAULT_CARDS_PER_ROW = 20;
+ static final int DEFAULT_ROWS = 10;
+ static final boolean DEFAULT_ENTRANCE_TRANSITION = false;
+ static final boolean DEFAULT_BACKGROUND = true;
+ static final boolean DEFAULT_CARD_SHADOW = true;
+ static final boolean DEFAULT_CARD_ROUND_RECT = true;
+ static final boolean DEFAULT_BITMAP_UPLOAD = true;
+
+ static long sCardIdSeed = 0;
+ static long sRowIdSeed = 0;
+
+ public static class ListRowPresenterBuilder {
+
+ boolean mShadow = DEFAULT_CARD_SHADOW;
+ boolean mRoundedCorner = DEFAULT_CARD_ROUND_RECT;
+
+ ListRowPresenterBuilder(Context context) {
+ }
+
+ public ListRowPresenterBuilder configShadow(boolean shadow) {
+ mShadow = shadow;
+ return this;
+ }
+
+ public ListRowPresenterBuilder configRoundedCorner(boolean roundedCorner) {
+ mRoundedCorner = roundedCorner;
+ return this;
+ }
+
+ public ListRowPresenter build() {
+ ListRowPresenter listRowPresenter = new ListRowPresenter();
+ listRowPresenter.setShadowEnabled(mShadow);
+ listRowPresenter.enableChildRoundedCorners(mRoundedCorner);
+ return listRowPresenter;
+ }
+ }
+
+ public static class CardPresenterBuilder {
+ Context mContext;
+ int mWidthDP = DEFAULT_CARD_WIDTH_DP;
+ int mHeightDP = DEFAULT_CARD_HEIGHT_DP;
+
+ CardPresenterBuilder(Context context) {
+ mContext = context;
+ }
+
+ public CardPresenterBuilder configWidthDP(int widthDP) {
+ mWidthDP = widthDP;
+ return this;
+ }
+
+ public CardPresenterBuilder configHeightDP(int hightDP) {
+ mHeightDP = hightDP;
+ return this;
+ }
+
+ public Presenter build() {
+ DisplayMetrics dm = mContext.getResources().getDisplayMetrics();
+ return new CardPresenter(
+ (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, mWidthDP, dm),
+ (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, mHeightDP, dm));
+ }
+ }
+
+ public static class RowsAdapterBuilder {
+
+ Context mContext;
+ int mCardsPerRow = DEFAULT_CARDS_PER_ROW;
+ int mRows = DEFAULT_ROWS;
+ CardPresenterBuilder mCardPresenterBuilder;
+ ListRowPresenterBuilder mListRowPresenterBuilder;
+ Presenter mCardPresenter;
+ boolean mBitmapUpload = DEFAULT_BITMAP_UPLOAD;
+
+ static final String[] sSampleStrings = new String[] {
+ "Hello world", "This is a test", "Android TV", "UI Jank Test",
+ "Scroll Up", "Scroll Down", "Load Bitmaps"
+ };
+
+ /**
+ * Create a RowsAdapterBuilder with default settings
+ */
+ public RowsAdapterBuilder(Context context) {
+ mContext = context;
+ mCardPresenterBuilder = new CardPresenterBuilder(context);
+ mListRowPresenterBuilder = new ListRowPresenterBuilder(context);
+ }
+
+ public ListRowPresenterBuilder getListRowPresenterBuilder() {
+ return mListRowPresenterBuilder;
+ }
+
+ public CardPresenterBuilder getCardPresenterBuilder() {
+ return mCardPresenterBuilder;
+ }
+
+ public RowsAdapterBuilder configRows(int rows) {
+ mRows = rows;
+ return this;
+ }
+
+ public RowsAdapterBuilder configCardsPerRow(int cardsPerRow) {
+ mCardsPerRow = cardsPerRow;
+ return this;
+ }
+
+ public RowsAdapterBuilder configBitmapUpLoad(boolean bitmapUpload) {
+ mBitmapUpload = bitmapUpload;
+ return this;
+ }
+
+ public ListRow buildListRow() {
+ ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(mCardPresenter);
+ ListRow listRow = new ListRow(new HeaderItem(sRowIdSeed++, "Row"), listRowAdapter);
+ int indexSample = 0;
+ for (int i = 0; i < mCardsPerRow; i++) {
+ // when doing bitmap upload, use different id so each card has different bitmap
+ // otherwise all cards share the same bitmap
+ listRowAdapter.add(new PhotoItem(sSampleStrings[indexSample],
+ (mBitmapUpload ? sCardIdSeed++ : 0)));
+ indexSample++;
+ if (indexSample >= sSampleStrings.length) {
+ indexSample = 0;
+ }
+ }
+ return listRow;
+ }
+
+ public ObjectAdapter build() {
+ try {
+ mCardPresenter = mCardPresenterBuilder.build();
+ ArrayObjectAdapter adapter = new ArrayObjectAdapter(
+ mListRowPresenterBuilder.build());
+ for (int i = 0; i < mRows; i++) {
+ adapter.add(buildListRow());
+ }
+ return adapter;
+ } finally {
+ mCardPresenter = null;
+ }
+ }
+ }
+
+ public static boolean runEntranceTransition(Activity activity) {
+ return activity.getIntent().getBooleanExtra(EXTRA_ENTRANCE_TRANSITION,
+ DEFAULT_ENTRANCE_TRANSITION);
+ }
+
+ public static RowsAdapterBuilder initRowsAdapterBuilder(Activity activity) {
+ RowsAdapterBuilder builder = new RowsAdapterBuilder(activity);
+ boolean shadow = activity.getIntent().getBooleanExtra(EXTRA_CARD_SHADOW,
+ DEFAULT_CARD_SHADOW);
+ boolean roundRect = activity.getIntent().getBooleanExtra(EXTRA_CARD_ROUND_RECT,
+ DEFAULT_CARD_ROUND_RECT);
+ int widthDp = activity.getIntent().getIntExtra(EXTRA_CARD_WIDTH_DP,
+ DEFAULT_CARD_WIDTH_DP);
+ int heightDp = activity.getIntent().getIntExtra(EXTRA_CARD_HEIGHT_DP,
+ DEFAULT_CARD_HEIGHT_DP);
+ int rows = activity.getIntent().getIntExtra(EXTRA_ROWS, DEFAULT_ROWS);
+ int cardsPerRow = activity.getIntent().getIntExtra(EXTRA_CARDS_PER_ROW,
+ DEFAULT_CARDS_PER_ROW);
+ boolean bitmapUpload = activity.getIntent().getBooleanExtra(EXTRA_BITMAP_UPLOAD,
+ DEFAULT_BITMAP_UPLOAD);
+ builder.configRows(rows)
+ .configCardsPerRow(cardsPerRow)
+ .configBitmapUpLoad(bitmapUpload);
+ builder.getListRowPresenterBuilder()
+ .configRoundedCorner(roundRect)
+ .configShadow(shadow);
+ builder.getCardPresenterBuilder()
+ .configWidthDP(widthDp)
+ .configHeightDP(heightDp);
+ return builder;
+ }
+
+ public static void initBackground(Activity activity) {
+ if (activity.getIntent().getBooleanExtra(EXTRA_BACKGROUND, DEFAULT_BACKGROUND)) {
+ BackgroundManager manager = BackgroundManager.getInstance(activity);
+ manager.attach(activity.getWindow());
+ DisplayMetrics metrics = activity.getResources().getDisplayMetrics();
+ int width = metrics.widthPixels;
+ int height = metrics.heightPixels;
+ Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+ Canvas canvas = new Canvas(bitmap);
+ canvas.drawARGB(255, 128, 128, 128);
+ canvas.setBitmap(null);
+ manager.setBitmap(bitmap);
+ }
+ }
+}
diff --git a/tests/net/AndroidManifest.xml b/tests/net/AndroidManifest.xml
index e069dd0..ba1a2ea 100644
--- a/tests/net/AndroidManifest.xml
+++ b/tests/net/AndroidManifest.xml
@@ -32,7 +32,6 @@
<uses-permission android:name="android.permission.GET_DETAILED_TASKS" />
<uses-permission android:name="android.permission.MANAGE_NETWORK_POLICY" />
<uses-permission android:name="android.permission.READ_NETWORK_USAGE_HISTORY" />
- <uses-permission android:name="android.permission.MODIFY_NETWORK_ACCOUNTING" />
<uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.MANAGE_USERS" />
diff --git a/tests/net/OWNERS b/tests/net/OWNERS
new file mode 100644
index 0000000..fa26997
--- /dev/null
+++ b/tests/net/OWNERS
@@ -0,0 +1,7 @@
+set noparent
+
+per-file Android.mk = build.master@android.com
+
+ek@google.com
+hugobenichi@google.com
+lorenzo@google.com
diff --git a/tests/net/java/android/net/ip/IpManagerTest.java b/tests/net/java/android/net/ip/IpManagerTest.java
index 025b017..867324d 100644
--- a/tests/net/java/android/net/ip/IpManagerTest.java
+++ b/tests/net/java/android/net/ip/IpManagerTest.java
@@ -16,11 +16,26 @@
package android.net.ip;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.timeout;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.app.AlarmManager;
import android.content.ContentResolver;
import android.content.Context;
import android.content.res.Resources;
+import android.net.IpPrefix;
+import android.net.LinkAddress;
+import android.net.ip.IpManager.Callback;
+import android.net.ip.IpManager.InitialConfiguration;
+import android.net.ip.IpManager.ProvisioningConfiguration;
import android.os.INetworkManagementService;
import android.provider.Settings;
import android.support.test.filters.SmallTest;
@@ -31,11 +46,17 @@
import com.android.internal.R;
import org.junit.Before;
-import org.junit.runner.RunWith;
import org.junit.Test;
+import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import java.net.Inet4Address;
+import java.net.Inet6Address;
+import java.net.InetAddress;
+import java.util.HashSet;
+import java.util.Set;
+
/**
* Tests for IpManager.
*/
@@ -44,14 +65,21 @@
public class IpManagerTest {
private static final int DEFAULT_AVOIDBADWIFI_CONFIG_VALUE = 1;
+ private static final String VALID = "VALID";
+ private static final String INVALID = "INVALID";
+
@Mock private Context mContext;
@Mock private INetworkManagementService mNMService;
@Mock private Resources mResources;
+ @Mock private Callback mCb;
+ @Mock private AlarmManager mAlarm;
private MockContentResolver mContentResolver;
- @Before public void setUp() throws Exception {
+ @Before
+ public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
+ when(mContext.getSystemService(eq(Context.ALARM_SERVICE))).thenReturn(mAlarm);
when(mContext.getResources()).thenReturn(mResources);
when(mResources.getInteger(R.integer.config_networkAvoidBadWifi))
.thenReturn(DEFAULT_AVOIDBADWIFI_CONFIG_VALUE);
@@ -61,6 +89,13 @@
when(mContext.getContentResolver()).thenReturn(mContentResolver);
}
+ private IpManager makeIpManager(String ifname) throws Exception {
+ final IpManager ipm = new IpManager(mContext, ifname, mCb, mNMService);
+ verify(mNMService, timeout(100).times(1)).disableIpv6(ifname);
+ verify(mNMService, timeout(100).times(1)).clearInterfaceAddresses(ifname);
+ return ipm;
+ }
+
@Test
public void testNullCallbackDoesNotThrow() throws Exception {
final IpManager ipm = new IpManager(mContext, "lo", null, mNMService);
@@ -68,7 +103,153 @@
@Test
public void testInvalidInterfaceDoesNotThrow() throws Exception {
- final IpManager.Callback cb = new IpManager.Callback();
- final IpManager ipm = new IpManager(mContext, "test_wlan0", cb, mNMService);
+ final IpManager ipm = new IpManager(mContext, "test_wlan0", mCb, mNMService);
+ }
+
+ @Test
+ public void testDefaultProvisioningConfiguration() throws Exception {
+ final String iface = "test_wlan0";
+ final IpManager ipm = makeIpManager(iface);
+
+ ProvisioningConfiguration config = new ProvisioningConfiguration.Builder()
+ .withoutIPv4()
+ // TODO: mock IpReachabilityMonitor's dependencies (NetworkInterface, PowerManager)
+ // and enable it in this test
+ .withoutIpReachabilityMonitor()
+ .build();
+
+ ipm.startProvisioning(config);
+ verify(mCb, times(1)).setNeighborDiscoveryOffload(true);
+ verify(mCb, timeout(100).times(1)).setFallbackMulticastFilter(false);
+ verify(mCb, never()).onProvisioningFailure(any());
+
+ ipm.stop();
+ verify(mNMService, timeout(100).times(1)).disableIpv6(iface);
+ verify(mNMService, timeout(100).times(1)).clearInterfaceAddresses(iface);
+ }
+
+ @Test
+ public void testInitialConfigurations() throws Exception {
+ InitialConfigurationTestCase[] testcases = {
+ validConf("valid IPv4 configuration",
+ links("192.0.2.12/24"), prefixes("192.0.2.0/24"), dns("192.0.2.2")),
+ validConf("another valid IPv4 configuration",
+ links("192.0.2.12/24"), prefixes("192.0.2.0/24"), dns()),
+ validConf("valid IPv6 configurations",
+ links("2001:db8:dead:beef:f00::a0/64", "fe80::1/64"),
+ prefixes("2001:db8:dead:beef::/64", "fe80::/64"),
+ dns("2001:db8:dead:beef:f00::02")),
+ validConf("valid IPv6 configurations",
+ links("fe80::1/64"), prefixes("fe80::/64"), dns()),
+ validConf("valid IPv6/v4 configuration",
+ links("2001:db8:dead:beef:f00::a0/48", "192.0.2.12/24"),
+ prefixes("2001:db8:dead:beef::/64", "192.0.2.0/24"),
+ dns("192.0.2.2", "2001:db8:dead:beef:f00::02")),
+ validConf("valid IPv6 configuration without any GUA.",
+ links("fd00:1234:5678::1/48"),
+ prefixes("fd00:1234:5678::/48"),
+ dns("fd00:1234:5678::1000")),
+
+ invalidConf("v4 addr and dns not in any prefix",
+ links("192.0.2.12/24"), prefixes("198.51.100.0/24"), dns("192.0.2.2")),
+ invalidConf("v4 addr not in any prefix",
+ links("198.51.2.12/24"), prefixes("198.51.100.0/24"), dns("192.0.2.2")),
+ invalidConf("v4 dns addr not in any prefix",
+ links("192.0.2.12/24"), prefixes("192.0.2.0/24"), dns("198.51.100.2")),
+ invalidConf("v6 addr not in any prefix",
+ links("2001:db8:dead:beef:f00::a0/64", "fe80::1/64"),
+ prefixes("2001:db8:dead:beef::/64"),
+ dns("2001:db8:dead:beef:f00::02")),
+ invalidConf("v6 dns addr not in any prefix",
+ links("fe80::1/64"), prefixes("fe80::/64"), dns("2001:db8:dead:beef:f00::02")),
+ invalidConf("default ipv6 route and no GUA",
+ links("fd01:1111:2222:3333::a0/128"), prefixes("::/0"), dns()),
+ invalidConf("invalid v6 prefix length",
+ links("2001:db8:dead:beef:f00::a0/128"), prefixes("2001:db8:dead:beef::/32"),
+ dns()),
+ invalidConf("another invalid v6 prefix length",
+ links("2001:db8:dead:beef:f00::a0/128"), prefixes("2001:db8:dead:beef::/72"),
+ dns())
+ };
+
+ for (InitialConfigurationTestCase testcase : testcases) {
+ if (testcase.config.isValid() != testcase.isValid) {
+ fail(testcase.errorMessage());
+ }
+ }
+ }
+
+ static class InitialConfigurationTestCase {
+ String descr;
+ boolean isValid;
+ InitialConfiguration config;
+ public String errorMessage() {
+ return String.format("%s: expected configuration %s to be %s, but was %s",
+ descr, config, validString(isValid), validString(!isValid));
+ }
+ }
+
+ static String validString(boolean isValid) {
+ return isValid ? VALID : INVALID;
+ }
+
+ static InitialConfigurationTestCase validConf(String descr, Set<LinkAddress> links,
+ Set<IpPrefix> prefixes, Set<InetAddress> dns) {
+ return confTestCase(descr, true, conf(links, prefixes, dns));
+ }
+
+ static InitialConfigurationTestCase invalidConf(String descr, Set<LinkAddress> links,
+ Set<IpPrefix> prefixes, Set<InetAddress> dns) {
+ return confTestCase(descr, false, conf(links, prefixes, dns));
+ }
+
+ static InitialConfigurationTestCase confTestCase(
+ String descr, boolean isValid, InitialConfiguration config) {
+ InitialConfigurationTestCase testcase = new InitialConfigurationTestCase();
+ testcase.descr = descr;
+ testcase.isValid = isValid;
+ testcase.config = config;
+ return testcase;
+ }
+
+ static InitialConfiguration conf(
+ Set<LinkAddress> links, Set<IpPrefix> prefixes, Set<InetAddress> dns) {
+ InitialConfiguration conf = new InitialConfiguration();
+ conf.ipAddresses.addAll(links);
+ conf.directlyConnectedRoutes.addAll(prefixes);
+ conf.dnsServers.addAll(dns);
+ return conf;
+ }
+
+ static Set<IpPrefix> prefixes(String... prefixes) {
+ return mapIntoSet(prefixes, IpPrefix::new);
+ }
+
+ static Set<LinkAddress> links(String... addresses) {
+ return mapIntoSet(addresses, LinkAddress::new);
+ }
+
+ static Set<InetAddress> ips(String... addresses) {
+ return mapIntoSet(addresses, InetAddress::getByName);
+ }
+
+ static Set<InetAddress> dns(String... addresses) {
+ return ips(addresses);
+ }
+
+ static <A, B> Set<B> mapIntoSet(A[] in, Fn<A, B> fn) {
+ Set<B> out = new HashSet<>(in.length);
+ for (A item : in) {
+ try {
+ out.add(fn.call(item));
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+ return out;
+ }
+
+ interface Fn<A,B> {
+ B call(A a) throws Exception;
}
}
diff --git a/tests/net/java/android/net/nsd/NsdManagerTest.java b/tests/net/java/android/net/nsd/NsdManagerTest.java
index adf6998..f77608f 100644
--- a/tests/net/java/android/net/nsd/NsdManagerTest.java
+++ b/tests/net/java/android/net/nsd/NsdManagerTest.java
@@ -349,7 +349,6 @@
chan.connect(mContext, this, msg.replyTo);
chan.sendMessage(AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED);
}
-
}
public static MockServiceHandler create(Context context) {
diff --git a/tests/net/java/android/net/util/SharedLogTest.java b/tests/net/java/android/net/util/SharedLogTest.java
index 7fd7a63..d46facf 100644
--- a/tests/net/java/android/net/util/SharedLogTest.java
+++ b/tests/net/java/android/net/util/SharedLogTest.java
@@ -33,9 +33,8 @@
@RunWith(AndroidJUnit4.class)
@SmallTest
public class SharedLogTest {
- private static final String TIMESTAMP_PATTERN =
- "^[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9][0-9]";
- private static final String TIMESTAMP = "mm-dd HH:MM:SS.xxx";
+ private static final String TIMESTAMP_PATTERN = "\\d{2}:\\d{2}:\\d{2}";
+ private static final String TIMESTAMP = "HH:MM:SS";
@Test
public void testBasicOperation() {
@@ -53,12 +52,12 @@
logLevel2a.mark("ok: last post");
final String[] expected = {
- TIMESTAMP + " - MARK first post!",
- TIMESTAMP + " - [twoB] ERROR 2b or not 2b",
- TIMESTAMP + " - [twoA] WARN second post?",
- TIMESTAMP + " - still logging",
- TIMESTAMP + " - [twoA.three] 3 >> 2",
- TIMESTAMP + " - [twoA] MARK ok: last post",
+ " - MARK first post!",
+ " - [twoB] ERROR 2b or not 2b",
+ " - [twoA] WARN second post?",
+ " - still logging",
+ " - [twoA.three] 3 >> 2",
+ " - [twoA] MARK ok: last post",
};
// Verify the logs are all there and in the correct order.
verifyLogLines(expected, logTop);
@@ -82,13 +81,12 @@
final String[] lines = dumpOutput.split("\n");
assertEquals(expected.length, lines.length);
- for (int i = 0; i < lines.length; i++) {
- // Fix up the timestamps.
- lines[i] = lines[i].replaceAll(TIMESTAMP_PATTERN, TIMESTAMP);
- }
-
for (int i = 0; i < expected.length; i++) {
- assertEquals(expected[i], lines[i]);
+ String got = lines[i];
+ String want = expected[i];
+ assertTrue(String.format("'%s' did not contain '%s'", got, want), got.endsWith(want));
+ assertTrue(String.format("'%s' did not contain a %s timestamp", got, TIMESTAMP),
+ got.replaceFirst(TIMESTAMP_PATTERN, TIMESTAMP).contains(TIMESTAMP));
}
}
}
diff --git a/tests/net/java/com/android/internal/util/TestUtils.java b/tests/net/java/com/android/internal/util/TestUtils.java
new file mode 100644
index 0000000..c9fa340
--- /dev/null
+++ b/tests/net/java/com/android/internal/util/TestUtils.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.util;
+
+import static org.junit.Assert.fail;
+
+import android.os.ConditionVariable;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
+
+public final class TestUtils {
+ private TestUtils() { }
+
+ /**
+ * Block until the given Handler thread becomes idle, or until timeoutMs has passed.
+ */
+ public static void waitForIdleHandler(HandlerThread handlerThread, long timeoutMs) {
+ // TODO: convert to getThreadHandler once it is available on aosp
+ waitForIdleLooper(handlerThread.getLooper(), timeoutMs);
+ }
+
+ /**
+ * Block until the given Looper becomes idle, or until timeoutMs has passed.
+ */
+ public static void waitForIdleLooper(Looper looper, long timeoutMs) {
+ waitForIdleHandler(new Handler(looper), timeoutMs);
+ }
+
+ /**
+ * Block until the given Handler becomes idle, or until timeoutMs has passed.
+ */
+ public static void waitForIdleHandler(Handler handler, long timeoutMs) {
+ final ConditionVariable cv = new ConditionVariable();
+ handler.post(() -> cv.open());
+ if (!cv.block(timeoutMs)) {
+ fail(handler.toString() + " did not become idle after " + timeoutMs + " ms");
+ }
+ }
+}
diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java
index 198ddc6..f6481cf 100644
--- a/tests/net/java/com/android/server/ConnectivityServiceTest.java
+++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java
@@ -19,10 +19,13 @@
import static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
import static android.net.ConnectivityManager.TYPE_ETHERNET;
import static android.net.ConnectivityManager.TYPE_MOBILE;
+import static android.net.ConnectivityManager.TYPE_NONE;
import static android.net.ConnectivityManager.TYPE_WIFI;
import static android.net.ConnectivityManager.getNetworkTypeName;
import static android.net.NetworkCapabilities.*;
+import static com.android.internal.util.TestUtils.waitForIdleHandler;
+
import static org.mockito.Mockito.anyBoolean;
import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.eq;
@@ -112,6 +115,7 @@
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.BooleanSupplier;
+import java.util.function.Predicate;
/**
* Tests for {@link ConnectivityService}.
@@ -212,20 +216,8 @@
}
}
- /**
- * Block until the given handler becomes idle, or until timeoutMs has passed.
- */
- private static void waitForIdleHandler(HandlerThread handlerThread, int timeoutMs) {
- final ConditionVariable cv = new ConditionVariable();
- final Handler handler = new Handler(handlerThread.getLooper());
- handler.post(() -> cv.open());
- if (!cv.block(timeoutMs)) {
- fail("HandlerThread " + handlerThread.getName() +
- " did not become idle after " + timeoutMs + " ms");
- }
- }
-
- public void waitForIdle(int timeoutMs) {
+ public void waitForIdle(int timeoutMsAsInt) {
+ long timeoutMs = timeoutMsAsInt;
waitForIdleHandler(mService.mHandlerThread, timeoutMs);
waitForIdle(mCellNetworkAgent, timeoutMs);
waitForIdle(mWiFiNetworkAgent, timeoutMs);
@@ -233,7 +225,7 @@
waitForIdleHandler(mService.mHandlerThread, timeoutMs);
}
- public void waitForIdle(MockNetworkAgent agent, int timeoutMs) {
+ public void waitForIdle(MockNetworkAgent agent, long timeoutMs) {
if (agent == null) {
return;
}
@@ -327,6 +319,9 @@
case TRANSPORT_CELLULAR:
mScore = 50;
break;
+ case TRANSPORT_WIFI_AWARE:
+ mScore = 20;
+ break;
default:
throw new UnsupportedOperationException("unimplemented network type");
}
@@ -408,6 +403,15 @@
* @param validated Indicate if network should pretend to be validated.
*/
public void connect(boolean validated) {
+ connect(validated, true);
+ }
+
+ /**
+ * Transition this NetworkAgent to CONNECTED state.
+ * @param validated Indicate if network should pretend to be validated.
+ * @param hasInternet Indicate if network should pretend to have NET_CAPABILITY_INTERNET.
+ */
+ public void connect(boolean validated, boolean hasInternet) {
assertEquals("MockNetworkAgents can only be connected once",
mNetworkInfo.getDetailedState(), DetailedState.IDLE);
assertFalse(mNetworkCapabilities.hasCapability(NET_CAPABILITY_INTERNET));
@@ -430,7 +434,9 @@
};
mCm.registerNetworkCallback(request, callback);
}
- addCapability(NET_CAPABILITY_INTERNET);
+ if (hasInternet) {
+ addCapability(NET_CAPABILITY_INTERNET);
+ }
connectWithoutInternet();
@@ -784,7 +790,10 @@
* Fails if TIMEOUT_MS goes by before {@code conditionVariable} opens.
*/
static private void waitFor(ConditionVariable conditionVariable) {
- assertTrue(conditionVariable.block(TIMEOUT_MS));
+ if (conditionVariable.block(TIMEOUT_MS)) {
+ return;
+ }
+ fail("ConditionVariable was blocked for more than " + TIMEOUT_MS + "ms");
}
@Override
@@ -842,7 +851,7 @@
case TRANSPORT_CELLULAR:
return TYPE_MOBILE;
default:
- throw new IllegalStateException("Unknown transport " + transport);
+ return TYPE_NONE;
}
}
@@ -853,6 +862,9 @@
// Test getActiveNetwork()
assertNotNull(mCm.getActiveNetwork());
assertEquals(mCm.getActiveNetwork(), mCm.getActiveNetworkForUid(Process.myUid()));
+ if (!NetworkCapabilities.isValidTransport(transport)) {
+ throw new IllegalStateException("Unknown transport " + transport);
+ }
switch (transport) {
case TRANSPORT_WIFI:
assertEquals(mCm.getActiveNetwork(), mWiFiNetworkAgent.getNetwork());
@@ -861,7 +873,7 @@
assertEquals(mCm.getActiveNetwork(), mCellNetworkAgent.getNetwork());
break;
default:
- throw new IllegalStateException("Unknown transport" + transport);
+ break;
}
// Test getNetworkInfo(Network)
assertNotNull(mCm.getNetworkInfo(mCm.getActiveNetwork()));
@@ -873,13 +885,14 @@
}
private void verifyNoNetwork() {
+ waitForIdle();
// Test getActiveNetworkInfo()
assertNull(mCm.getActiveNetworkInfo());
// Test getActiveNetwork()
assertNull(mCm.getActiveNetwork());
assertNull(mCm.getActiveNetworkForUid(Process.myUid()));
// Test getAllNetworks()
- assertEquals(0, mCm.getAllNetworks().length);
+ assertEmpty(mCm.getAllNetworks());
}
/**
@@ -920,7 +933,7 @@
mCellNetworkAgent.connect(true);
waitFor(cv);
verifyActiveNetwork(TRANSPORT_CELLULAR);
- assertEquals(2, mCm.getAllNetworks().length);
+ assertLength(2, mCm.getAllNetworks());
assertTrue(mCm.getAllNetworks()[0].equals(mCm.getActiveNetwork()) ||
mCm.getAllNetworks()[1].equals(mCm.getActiveNetwork()));
assertTrue(mCm.getAllNetworks()[0].equals(mWiFiNetworkAgent.getNetwork()) ||
@@ -930,7 +943,7 @@
mWiFiNetworkAgent.connect(true);
waitFor(cv);
verifyActiveNetwork(TRANSPORT_WIFI);
- assertEquals(2, mCm.getAllNetworks().length);
+ assertLength(2, mCm.getAllNetworks());
assertTrue(mCm.getAllNetworks()[0].equals(mCm.getActiveNetwork()) ||
mCm.getAllNetworks()[1].equals(mCm.getActiveNetwork()));
assertTrue(mCm.getAllNetworks()[0].equals(mCellNetworkAgent.getNetwork()) ||
@@ -938,9 +951,9 @@
// Test cellular linger timeout.
waitFor(mCellNetworkAgent.getDisconnectedCV());
waitForIdle();
- assertEquals(1, mCm.getAllNetworks().length);
+ assertLength(1, mCm.getAllNetworks());
verifyActiveNetwork(TRANSPORT_WIFI);
- assertEquals(1, mCm.getAllNetworks().length);
+ assertLength(1, mCm.getAllNetworks());
assertEquals(mCm.getAllNetworks()[0], mCm.getActiveNetwork());
// Test WiFi disconnect.
cv = waitForConnectivityBroadcasts(1);
@@ -1281,7 +1294,26 @@
return expectCallback(state, agent, TIMEOUT_MS);
}
- void expectAvailableCallbacks(MockNetworkAgent agent, boolean expectSuspended, int timeoutMs) {
+ CallbackInfo expectCallbackLike(Predicate<CallbackInfo> fn) {
+ return expectCallbackLike(fn, TIMEOUT_MS);
+ }
+
+ CallbackInfo expectCallbackLike(Predicate<CallbackInfo> fn, int timeoutMs) {
+ int timeLeft = timeoutMs;
+ while (timeLeft > 0) {
+ long start = SystemClock.elapsedRealtime();
+ CallbackInfo info = nextCallback(timeLeft);
+ if (fn.test(info)) {
+ return info;
+ }
+ timeLeft -= (SystemClock.elapsedRealtime() - start);
+ }
+ fail("Did not receive expected callback after " + timeoutMs + "ms");
+ return null;
+ }
+
+ void expectAvailableCallbacks(
+ MockNetworkAgent agent, boolean expectSuspended, int timeoutMs) {
expectCallback(CallbackState.AVAILABLE, agent, timeoutMs);
if (expectSuspended) {
expectCallback(CallbackState.SUSPENDED, agent, timeoutMs);
@@ -1838,26 +1870,18 @@
@SmallTest
public void testNoMutableNetworkRequests() throws Exception {
PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, new Intent("a"), 0);
- NetworkRequest.Builder builder = new NetworkRequest.Builder();
- builder.addCapability(NET_CAPABILITY_VALIDATED);
- try {
- mCm.requestNetwork(builder.build(), new NetworkCallback());
- fail();
- } catch (IllegalArgumentException expected) {}
- try {
- mCm.requestNetwork(builder.build(), pendingIntent);
- fail();
- } catch (IllegalArgumentException expected) {}
- builder = new NetworkRequest.Builder();
- builder.addCapability(NET_CAPABILITY_CAPTIVE_PORTAL);
- try {
- mCm.requestNetwork(builder.build(), new NetworkCallback());
- fail();
- } catch (IllegalArgumentException expected) {}
- try {
- mCm.requestNetwork(builder.build(), pendingIntent);
- fail();
- } catch (IllegalArgumentException expected) {}
+ NetworkRequest request1 = new NetworkRequest.Builder()
+ .addCapability(NET_CAPABILITY_VALIDATED)
+ .build();
+ NetworkRequest request2 = new NetworkRequest.Builder()
+ .addCapability(NET_CAPABILITY_CAPTIVE_PORTAL)
+ .build();
+
+ Class<IllegalArgumentException> expected = IllegalArgumentException.class;
+ assertException(() -> { mCm.requestNetwork(request1, new NetworkCallback()); }, expected);
+ assertException(() -> { mCm.requestNetwork(request1, pendingIntent); }, expected);
+ assertException(() -> { mCm.requestNetwork(request2, new NetworkCallback()); }, expected);
+ assertException(() -> { mCm.requestNetwork(request2, pendingIntent); }, expected);
}
@SmallTest
@@ -1869,7 +1893,7 @@
mCellNetworkAgent.connectWithoutInternet();
waitFor(cv);
waitForIdle();
- assertEquals(0, mCm.getAllNetworks().length);
+ assertEmpty(mCm.getAllNetworks());
verifyNoNetwork();
// Test bringing up validated WiFi.
@@ -2543,7 +2567,7 @@
assertTrue(testFactory.getMyStartRequested());
// Bring up cell data and check that the factory stops looking.
- assertEquals(1, mCm.getAllNetworks().length);
+ assertLength(1, mCm.getAllNetworks());
mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR);
testFactory.expectAddRequests(2); // Because the cell request changes score twice.
mCellNetworkAgent.connect(true);
@@ -2554,7 +2578,7 @@
// Check that cell data stays up.
waitForIdle();
verifyActiveNetwork(TRANSPORT_WIFI);
- assertEquals(2, mCm.getAllNetworks().length);
+ assertLength(2, mCm.getAllNetworks());
// Turn off mobile data always on and expect the request to disappear...
testFactory.expectRemoveRequests(1);
@@ -2563,7 +2587,7 @@
// ... and cell data to be torn down.
cellNetworkCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent);
- assertEquals(1, mCm.getAllNetworks().length);
+ assertLength(1, mCm.getAllNetworks());
testFactory.unregister();
mCm.unregisterNetworkCallback(cellNetworkCallback);
@@ -2784,19 +2808,17 @@
NetworkRequest nr = new NetworkRequest.Builder().addTransportType(
NetworkCapabilities.TRANSPORT_WIFI).build();
final TestNetworkCallback networkCallback = new TestNetworkCallback();
- final int requestTimeoutMs = 100;
+ final int requestTimeoutMs = 50;
mCm.requestNetwork(nr, networkCallback, requestTimeoutMs);
mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI);
mWiFiNetworkAgent.connect(false);
- final int assertTimeoutMs = 150;
+ final int assertTimeoutMs = 100;
networkCallback.expectAvailableCallbacks(mWiFiNetworkAgent, false, assertTimeoutMs);
- sleepFor(20);
mWiFiNetworkAgent.disconnect();
networkCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent);
- // pass timeout and validate that UNAVAILABLE is not called
- sleepFor(100);
+ // Validate that UNAVAILABLE is not called
networkCallback.assertNoCallback();
}
@@ -2823,24 +2845,20 @@
}
/**
- * Validate that when a network request is unregistered (cancelled) the time-out for that
- * request doesn't trigger the onUnavailable() callback.
+ * Validate that when a network request is unregistered (cancelled), no posterior event can
+ * trigger the callback.
*/
@SmallTest
- public void testTimedoutAfterUnregisteredNetworkRequest() {
+ public void testNoCallbackAfterUnregisteredNetworkRequest() {
NetworkRequest nr = new NetworkRequest.Builder().addTransportType(
NetworkCapabilities.TRANSPORT_WIFI).build();
final TestNetworkCallback networkCallback = new TestNetworkCallback();
final int timeoutMs = 10;
+
mCm.requestNetwork(nr, networkCallback, timeoutMs);
-
- // remove request
mCm.unregisterNetworkCallback(networkCallback);
-
- // pass timeout and validate that no callbacks
- // Note: doesn't validate that nothing called from CS since even if called the CM already
- // unregisters the callback and won't pass it through!
- sleepFor(15);
+ // Regardless of the timeout, unregistering the callback in ConnectivityManager ensures
+ // that this callback will not be called.
networkCallback.assertNoCallback();
// create a network satisfying request - validate that request not triggered
@@ -3259,12 +3277,87 @@
}
}
- /* test utilities */
- // TODO: eliminate all usages of sleepFor and replace by proper timeouts/waitForIdle.
- static private void sleepFor(int ms) {
+ @SmallTest
+ public void testNetworkInfoOfTypeNone() {
+ ConditionVariable broadcastCV = waitForConnectivityBroadcasts(1);
+
+ verifyNoNetwork();
+ MockNetworkAgent wifiAware = new MockNetworkAgent(TRANSPORT_WIFI_AWARE);
+ assertNull(mCm.getActiveNetworkInfo());
+
+ Network[] allNetworks = mCm.getAllNetworks();
+ assertLength(1, allNetworks);
+ Network network = allNetworks[0];
+ NetworkCapabilities capabilities = mCm.getNetworkCapabilities(network);
+ assertTrue(capabilities.hasTransport(TRANSPORT_WIFI_AWARE));
+
+ final NetworkRequest request =
+ new NetworkRequest.Builder().addTransportType(TRANSPORT_WIFI_AWARE).build();
+ final TestNetworkCallback callback = new TestNetworkCallback();
+ mCm.registerNetworkCallback(request, callback);
+
+ // Bring up wifi aware network.
+ wifiAware.connect(false, false);
+ callback.expectAvailableCallbacks(wifiAware);
+
+ assertNull(mCm.getActiveNetworkInfo());
+ assertNull(mCm.getActiveNetwork());
+ // TODO: getAllNetworkInfo is dirty and returns a non-empty array right from the start
+ // of this test. Fix it and uncomment the assert below.
+ //assertEmpty(mCm.getAllNetworkInfo());
+
+ // Disconnect wifi aware network.
+ wifiAware.disconnect();
+ callback.expectCallbackLike((info) -> info.state == CallbackState.LOST, TIMEOUT_MS);
+ mCm.unregisterNetworkCallback(callback);
+
+ verifyNoNetwork();
+ if (broadcastCV.block(10)) {
+ fail("expected no broadcast, but got CONNECTIVITY_ACTION broadcast");
+ }
+ }
+
+ @SmallTest
+ public void testDeprecatedAndUnsupportedOperations() throws Exception {
+ final int TYPE_NONE = ConnectivityManager.TYPE_NONE;
+ assertNull(mCm.getNetworkInfo(TYPE_NONE));
+ assertNull(mCm.getNetworkForType(TYPE_NONE));
+ assertNull(mCm.getLinkProperties(TYPE_NONE));
+ assertFalse(mCm.isNetworkSupported(TYPE_NONE));
+
+ assertException(() -> { mCm.networkCapabilitiesForType(TYPE_NONE); },
+ IllegalArgumentException.class);
+
+ Class<UnsupportedOperationException> unsupported = UnsupportedOperationException.class;
+ assertException(() -> { mCm.startUsingNetworkFeature(TYPE_WIFI, ""); }, unsupported);
+ assertException(() -> { mCm.stopUsingNetworkFeature(TYPE_WIFI, ""); }, unsupported);
+ // TODO: let test context have configuration application target sdk version
+ // and test that pre-M requesting for TYPE_NONE sends back APN_REQUEST_FAILED
+ assertException(() -> { mCm.startUsingNetworkFeature(TYPE_NONE, ""); }, unsupported);
+ assertException(() -> { mCm.stopUsingNetworkFeature(TYPE_NONE, ""); }, unsupported);
+ assertException(() -> { mCm.requestRouteToHostAddress(TYPE_NONE, null); }, unsupported);
+ }
+
+ private static <T> void assertEmpty(T[] ts) {
+ int length = ts.length;
+ assertEquals("expected empty array, but length was " + length, 0, length);
+ }
+
+ private static <T> void assertLength(int expected, T[] got) {
+ int length = got.length;
+ assertEquals(String.format("expected array of length %s, but length was %s for %s",
+ expected, length, Arrays.toString(got)), expected, length);
+ }
+
+ private static <T> void assertException(Runnable block, Class<T> expected) {
try {
- Thread.sleep(ms);
- } catch (InterruptedException e) {
+ block.run();
+ fail("Expected exception of type " + expected);
+ } catch (Exception got) {
+ if (!got.getClass().equals(expected)) {
+ fail("Expected exception of type " + expected + " but got " + got);
+ }
+ return;
}
}
}
diff --git a/tests/net/java/com/android/server/connectivity/IpConnectivityEventBuilderTest.java b/tests/net/java/com/android/server/connectivity/IpConnectivityEventBuilderTest.java
index d11565a..eff04ab 100644
--- a/tests/net/java/com/android/server/connectivity/IpConnectivityEventBuilderTest.java
+++ b/tests/net/java/com/android/server/connectivity/IpConnectivityEventBuilderTest.java
@@ -201,9 +201,14 @@
" time_ms: 1",
" transports: 0",
" default_network_event <",
+ " default_network_duration_ms: 0",
+ " final_score: 0",
+ " initial_score: 0",
+ " ip_support: 0",
" network_id <",
" network_id: 102",
" >",
+ " no_default_network_duration_ms: 0",
" previous_network_id <",
" network_id: 101",
" >",
@@ -442,6 +447,8 @@
" program_updates_all: 7",
" program_updates_allowing_multicast: 3",
" received_ras: 10",
+ " total_packet_dropped: 0",
+ " total_packet_processed: 0",
" zero_lifetime_ras: 1",
" >",
">",
diff --git a/tests/net/java/com/android/server/connectivity/IpConnectivityMetricsTest.java b/tests/net/java/com/android/server/connectivity/IpConnectivityMetricsTest.java
index e01469b..cc18b7f 100644
--- a/tests/net/java/com/android/server/connectivity/IpConnectivityMetricsTest.java
+++ b/tests/net/java/com/android/server/connectivity/IpConnectivityMetricsTest.java
@@ -256,9 +256,14 @@
" time_ms: 300",
" transports: 0",
" default_network_event <",
+ " default_network_duration_ms: 0",
+ " final_score: 0",
+ " initial_score: 0",
+ " ip_support: 0",
" network_id <",
" network_id: 102",
" >",
+ " no_default_network_duration_ms: 0",
" previous_network_id <",
" network_id: 101",
" >",
@@ -308,6 +313,8 @@
" program_updates_all: 7",
" program_updates_allowing_multicast: 3",
" received_ras: 10",
+ " total_packet_dropped: 0",
+ " total_packet_processed: 0",
" zero_lifetime_ras: 1",
" >",
">",
@@ -367,6 +374,10 @@
" event_types: 1",
" event_types: 1",
" event_types: 2",
+ " getaddrinfo_error_count: 0",
+ " getaddrinfo_query_count: 0",
+ " gethostbyname_error_count: 0",
+ " gethostbyname_query_count: 0",
" latencies_ms: 3456",
" latencies_ms: 45",
" latencies_ms: 638",
@@ -384,6 +395,10 @@
" dns_lookup_batch <",
" event_types: 1",
" event_types: 2",
+ " getaddrinfo_error_count: 0",
+ " getaddrinfo_query_count: 0",
+ " gethostbyname_error_count: 0",
+ " gethostbyname_query_count: 0",
" latencies_ms: 56",
" latencies_ms: 34",
" return_codes: 0",
diff --git a/tests/net/java/com/android/server/connectivity/NetdEventListenerServiceTest.java b/tests/net/java/com/android/server/connectivity/NetdEventListenerServiceTest.java
index f98ab3d..46f395e 100644
--- a/tests/net/java/com/android/server/connectivity/NetdEventListenerServiceTest.java
+++ b/tests/net/java/com/android/server/connectivity/NetdEventListenerServiceTest.java
@@ -111,6 +111,10 @@
" event_types: 1",
" event_types: 2",
" event_types: 2",
+ " getaddrinfo_error_count: 0",
+ " getaddrinfo_query_count: 0",
+ " gethostbyname_error_count: 0",
+ " gethostbyname_query_count: 0",
" latencies_ms: 3456",
" latencies_ms: 267",
" latencies_ms: 1230",
@@ -142,6 +146,10 @@
" event_types: 2",
" event_types: 1",
" event_types: 1",
+ " getaddrinfo_error_count: 0",
+ " getaddrinfo_query_count: 0",
+ " gethostbyname_error_count: 0",
+ " gethostbyname_query_count: 0",
" latencies_ms: 56",
" latencies_ms: 78",
" latencies_ms: 14",
diff --git a/tests/net/java/com/android/server/connectivity/VpnTest.java b/tests/net/java/com/android/server/connectivity/VpnTest.java
index 506d9e5..f0b3724 100644
--- a/tests/net/java/com/android/server/connectivity/VpnTest.java
+++ b/tests/net/java/com/android/server/connectivity/VpnTest.java
@@ -27,13 +27,16 @@
import android.app.AppOpsManager;
import android.app.NotificationManager;
import android.content.Context;
-import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
import android.content.pm.UserInfo;
import android.net.NetworkInfo.DetailedState;
import android.net.UidRange;
-import android.os.Build;
+import android.net.VpnService;
+import android.os.Build.VERSION_CODES;
+import android.os.Bundle;
import android.os.INetworkManagementService;
import android.os.Looper;
import android.os.UserHandle;
@@ -45,22 +48,22 @@
import com.android.internal.net.VpnConfig;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Map;
-import java.util.Set;
-
import org.mockito.Answers;
-import org.mockito.ArgumentCaptor;
import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
+
/**
* Tests for {@link Vpn}.
*
* Build, install and run with:
- * runtest --path src/com/android/server/connectivity/VpnTest.java
+ * runtest --path java/com/android/server/connectivity/VpnTest.java
*/
public class VpnTest extends AndroidTestCase {
private static final String TAG = "VpnTest";
@@ -116,7 +119,7 @@
// Used by {@link Notification.Builder}
ApplicationInfo applicationInfo = new ApplicationInfo();
- applicationInfo.targetSdkVersion = Build.VERSION_CODES.CUR_DEVELOPMENT;
+ applicationInfo.targetSdkVersion = VERSION_CODES.CUR_DEVELOPMENT;
when(mContext.getApplicationInfo()).thenReturn(applicationInfo);
doNothing().when(mNetService).registerObserver(any());
@@ -315,6 +318,40 @@
}
@SmallTest
+ public void testIsAlwaysOnPackageSupported() throws Exception {
+ final Vpn vpn = createVpn(primaryUser.id);
+
+ ApplicationInfo appInfo = new ApplicationInfo();
+ when(mPackageManager.getApplicationInfoAsUser(eq(PKGS[0]), anyInt(), eq(primaryUser.id)))
+ .thenReturn(appInfo);
+
+ ServiceInfo svcInfo = new ServiceInfo();
+ ResolveInfo resInfo = new ResolveInfo();
+ resInfo.serviceInfo = svcInfo;
+ when(mPackageManager.queryIntentServicesAsUser(any(), eq(PackageManager.GET_META_DATA),
+ eq(primaryUser.id)))
+ .thenReturn(Collections.singletonList(resInfo));
+
+ // null package name should return false
+ assertFalse(vpn.isAlwaysOnPackageSupported(null));
+
+ // Pre-N apps are not supported
+ appInfo.targetSdkVersion = VERSION_CODES.M;
+ assertFalse(vpn.isAlwaysOnPackageSupported(PKGS[0]));
+
+ // N+ apps are supported by default
+ appInfo.targetSdkVersion = VERSION_CODES.N;
+ assertTrue(vpn.isAlwaysOnPackageSupported(PKGS[0]));
+
+ // Apps that opt out explicitly are not supported
+ appInfo.targetSdkVersion = VERSION_CODES.CUR_DEVELOPMENT;
+ Bundle metaData = new Bundle();
+ metaData.putBoolean(VpnService.METADATA_SUPPORTS_ALWAYS_ON, false);
+ svcInfo.metaData = metaData;
+ assertFalse(vpn.isAlwaysOnPackageSupported(PKGS[0]));
+ }
+
+ @SmallTest
public void testNotificationShownForAlwaysOnApp() {
final UserHandle userHandle = UserHandle.of(primaryUser.id);
final Vpn vpn = createVpn(primaryUser.id);
diff --git a/tests/net/java/com/android/server/net/NetworkStatsObserversTest.java b/tests/net/java/com/android/server/net/NetworkStatsObserversTest.java
index 92dcdac..2be5dae 100644
--- a/tests/net/java/com/android/server/net/NetworkStatsObserversTest.java
+++ b/tests/net/java/com/android/server/net/NetworkStatsObserversTest.java
@@ -27,6 +27,8 @@
import static android.net.TrafficStats.MB_IN_BYTES;
import static android.text.format.DateUtils.MINUTE_IN_MILLIS;
+import static com.android.internal.util.TestUtils.waitForIdleHandler;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@@ -56,7 +58,6 @@
import com.android.internal.net.VpnInfo;
import com.android.server.net.NetworkStatsService;
-import com.android.server.net.NetworkStatsServiceTest.IdleableHandlerThread;
import com.android.server.net.NetworkStatsServiceTest.LatchedHandler;
import java.util.ArrayList;
@@ -102,7 +103,7 @@
private long mElapsedRealtime;
- private IdleableHandlerThread mObserverHandlerThread;
+ private HandlerThread mObserverHandlerThread;
private Handler mObserverNoopHandler;
private LatchedHandler mHandler;
@@ -118,7 +119,7 @@
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
- mObserverHandlerThread = new IdleableHandlerThread("HandlerThread");
+ mObserverHandlerThread = new HandlerThread("HandlerThread");
mObserverHandlerThread.start();
final Looper observerLooper = mObserverHandlerThread.getLooper();
mStatsObservers = new NetworkStatsObservers() {
@@ -319,7 +320,7 @@
xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
VPN_INFO, TEST_START);
waitForObserverToIdle();
- assertEquals(NetworkStatsManager.CALLBACK_LIMIT_REACHED, mHandler.mLastMessageType);
+ assertEquals(NetworkStatsManager.CALLBACK_LIMIT_REACHED, mHandler.lastMessageType);
}
@Test
@@ -356,7 +357,7 @@
xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
VPN_INFO, TEST_START);
waitForObserverToIdle();
- assertEquals(NetworkStatsManager.CALLBACK_LIMIT_REACHED, mHandler.mLastMessageType);
+ assertEquals(NetworkStatsManager.CALLBACK_LIMIT_REACHED, mHandler.lastMessageType);
}
@Test
@@ -429,7 +430,7 @@
xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
VPN_INFO, TEST_START);
waitForObserverToIdle();
- assertEquals(NetworkStatsManager.CALLBACK_LIMIT_REACHED, mHandler.mLastMessageType);
+ assertEquals(NetworkStatsManager.CALLBACK_LIMIT_REACHED, mHandler.lastMessageType);
}
@Test
@@ -470,19 +471,7 @@
}
private void waitForObserverToIdle() {
- waitForIdleLooper(mObserverHandlerThread.getLooper(), WAIT_TIMEOUT_MS);
- waitForIdleLooper(mHandler.getLooper(), WAIT_TIMEOUT_MS);
+ waitForIdleHandler(mObserverHandlerThread, WAIT_TIMEOUT_MS);
+ waitForIdleHandler(mHandler, WAIT_TIMEOUT_MS);
}
-
- // TODO: unify with ConnectivityService.waitForIdleHandler and
- // NetworkServiceStatsTest.IdleableHandlerThread
- private static void waitForIdleLooper(Looper looper, long timeoutMs) {
- final ConditionVariable cv = new ConditionVariable();
- final Handler handler = new Handler(looper);
- handler.post(() -> cv.open());
- if (!cv.block(timeoutMs)) {
- fail("Looper did not become idle after " + timeoutMs + " ms");
- }
- }
-
}
diff --git a/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java b/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java
index 029693f..feb46d3 100644
--- a/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java
+++ b/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java
@@ -45,6 +45,7 @@
import static android.text.format.DateUtils.WEEK_IN_MILLIS;
import static com.android.server.net.NetworkStatsService.ACTION_NETWORK_STATS_POLL;
+import static com.android.internal.util.TestUtils.waitForIdleHandler;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
@@ -154,7 +155,7 @@
private @Mock IConnectivityManager mConnManager;
private @Mock IBinder mBinder;
private @Mock AlarmManager mAlarmManager;
- private IdleableHandlerThread mHandlerThread;
+ private HandlerThread mHandlerThread;
private Handler mHandler;
private NetworkStatsService mService;
@@ -181,7 +182,7 @@
mServiceContext, mNetManager, mAlarmManager, wakeLock, mTime,
TelephonyManager.getDefault(), mSettings, new NetworkStatsObservers(),
mStatsDir, getBaseDir(mStatsDir));
- mHandlerThread = new IdleableHandlerThread("HandlerThread");
+ mHandlerThread = new HandlerThread("HandlerThread");
mHandlerThread.start();
Handler.Callback callback = new NetworkStatsService.HandlerCallback(mService);
mHandler = new Handler(mHandlerThread.getLooper(), callback);
@@ -886,7 +887,7 @@
// Send dummy message to make sure that any previous message has been handled
mHandler.sendMessage(mHandler.obtainMessage(-1));
- mHandlerThread.waitForIdle(WAIT_TIMEOUT);
+ waitForIdleHandler(mHandler, WAIT_TIMEOUT);
@@ -908,7 +909,7 @@
assertNetworkTotal(sTemplateWifi, 1024L, 1L, 2048L, 2L, 0);
// make sure callback has not being called
- assertEquals(INVALID_TYPE, latchedHandler.mLastMessageType);
+ assertEquals(INVALID_TYPE, latchedHandler.lastMessageType);
// and bump forward again, with counters going higher. this is
// important, since it will trigger the data usage callback
@@ -926,7 +927,7 @@
// Wait for the caller to ack receipt of CALLBACK_LIMIT_REACHED
assertTrue(cv.block(WAIT_TIMEOUT));
- assertEquals(NetworkStatsManager.CALLBACK_LIMIT_REACHED, latchedHandler.mLastMessageType);
+ assertEquals(NetworkStatsManager.CALLBACK_LIMIT_REACHED, latchedHandler.lastMessageType);
cv.close();
// Allow binder to disconnect
@@ -937,7 +938,7 @@
// Wait for the caller to ack receipt of CALLBACK_RELEASED
assertTrue(cv.block(WAIT_TIMEOUT));
- assertEquals(NetworkStatsManager.CALLBACK_RELEASED, latchedHandler.mLastMessageType);
+ assertEquals(NetworkStatsManager.CALLBACK_RELEASED, latchedHandler.lastMessageType);
// Make sure that the caller binder gets disconnected
verify(mBinder).unlinkToDeath(any(IBinder.DeathRecipient.class), anyInt());
@@ -1203,12 +1204,12 @@
mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
// Send dummy message to make sure that any previous message has been handled
mHandler.sendMessage(mHandler.obtainMessage(-1));
- mHandlerThread.waitForIdle(WAIT_TIMEOUT);
+ waitForIdleHandler(mHandler, WAIT_TIMEOUT);
}
static class LatchedHandler extends Handler {
private final ConditionVariable mCv;
- int mLastMessageType = INVALID_TYPE;
+ int lastMessageType = INVALID_TYPE;
LatchedHandler(Looper looper, ConditionVariable cv) {
super(looper);
@@ -1217,49 +1218,9 @@
@Override
public void handleMessage(Message msg) {
- mLastMessageType = msg.what;
+ lastMessageType = msg.what;
mCv.open();
super.handleMessage(msg);
}
}
-
- /**
- * A subclass of HandlerThread that allows callers to wait for it to become idle. waitForIdle
- * will return immediately if the handler is already idle.
- */
- static class IdleableHandlerThread extends HandlerThread {
- private IdleHandler mIdleHandler;
-
- public IdleableHandlerThread(String name) {
- super(name);
- }
-
- public void waitForIdle(long timeoutMs) {
- final ConditionVariable cv = new ConditionVariable();
- final MessageQueue queue = getLooper().getQueue();
-
- synchronized (queue) {
- if (queue.isIdle()) {
- return;
- }
-
- assertNull("BUG: only one idle handler allowed", mIdleHandler);
- mIdleHandler = new IdleHandler() {
- public boolean queueIdle() {
- cv.open();
- mIdleHandler = null;
- return false; // Remove the handler.
- }
- };
- queue.addIdleHandler(mIdleHandler);
- }
-
- if (!cv.block(timeoutMs)) {
- fail("HandlerThread " + getName() + " did not become idle after " + timeoutMs
- + " ms");
- queue.removeIdleHandler(mIdleHandler);
- }
- }
- }
-
}
diff --git a/tests/net/jni/apf_jni.cpp b/tests/net/jni/apf_jni.cpp
index dc108c1..d415d22 100644
--- a/tests/net/jni/apf_jni.cpp
+++ b/tests/net/jni/apf_jni.cpp
@@ -14,8 +14,8 @@
* limitations under the License.
*/
-#include <JNIHelp.h>
-#include <ScopedUtfChars.h>
+#include <nativehelper/JNIHelp.h>
+#include <nativehelper/ScopedUtfChars.h>
#include <jni.h>
#include <pcap.h>
#include <stdlib.h>
diff --git a/tests/radio/Android.mk b/tests/radio/Android.mk
deleted file mode 100644
index dc55d0b..0000000
--- a/tests/radio/Android.mk
+++ /dev/null
@@ -1,33 +0,0 @@
-# Copyright (C) 2017 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.
-
-LOCAL_PATH:= $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_PACKAGE_NAME := RadioTests
-
-LOCAL_MODULE_TAGS := tests
-# TODO(b/13282254): uncomment when b/13282254 is fixed
-# LOCAL_SDK_VERSION := current
-
-LOCAL_STATIC_JAVA_LIBRARIES := compatibility-device-util android-support-test testng
-
-LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_DEX_PREOPT := false
-LOCAL_PROGUARD_ENABLED := disabled
-
-include $(BUILD_PACKAGE)
diff --git a/tests/radio/AndroidManifest.xml b/tests/radio/AndroidManifest.xml
deleted file mode 100644
index 150edbf..0000000
--- a/tests/radio/AndroidManifest.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="android.hardware.radio.tests">
-
- <application>
- <uses-library android:name="android.test.runner" />
- </application>
-
- <instrumentation
- android:name="android.support.test.runner.AndroidJUnitRunner"
- android:targetPackage="android.hardware.radio.tests"
- android:label="Tests for broadcast radio API" >
- </instrumentation>
-</manifest>
diff --git a/tests/radio/src/android/hardware/radio/tests/RadioTest.java b/tests/radio/src/android/hardware/radio/tests/RadioTest.java
deleted file mode 100644
index 47e104c..0000000
--- a/tests/radio/src/android/hardware/radio/tests/RadioTest.java
+++ /dev/null
@@ -1,375 +0,0 @@
-/*
- * Copyright (C) 2017 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.hardware.radio.tests;
-
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.hardware.radio.RadioManager;
-import android.hardware.radio.RadioTuner;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
-import android.util.Log;
-
-import java.lang.reflect.Constructor;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.Mockito;
-import org.mockito.MockitoAnnotations;
-
-import static org.junit.Assert.*;
-import static org.junit.Assume.*;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Mockito.after;
-import static org.mockito.Mockito.atMost;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.timeout;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.testng.Assert.assertThrows;
-
-/**
- * A test for broadcast radio API.
- */
-@RunWith(AndroidJUnit4.class)
-public class RadioTest {
- private static final String TAG = "RadioTest";
-
- public final Context mContext = InstrumentationRegistry.getContext();
-
- private final int kConfigCallbackTimeoutMs = 10000;
- private final int kCancelTimeoutMs = 1000;
- private final int kTuneCallbackTimeoutMs = 30000;
-
- private RadioManager mRadioManager;
- private RadioTuner mRadioTuner;
- private RadioManager.ModuleProperties mModule;
- private final List<RadioManager.ModuleProperties> mModules = new ArrayList<>();
- @Mock private RadioTuner.Callback mCallback;
-
- RadioManager.AmBandDescriptor mAmBandDescriptor;
- RadioManager.FmBandDescriptor mFmBandDescriptor;
-
- RadioManager.BandConfig mAmBandConfig;
- RadioManager.BandConfig mFmBandConfig;
-
- @Before
- public void setup() {
- MockitoAnnotations.initMocks(this);
-
- // check if radio is supported and skip the test if it's not
- PackageManager packageManager = mContext.getPackageManager();
- boolean isRadioSupported = packageManager.hasSystemFeature(PackageManager.FEATURE_RADIO);
- assumeTrue(isRadioSupported);
-
- mRadioManager = (RadioManager)mContext.getSystemService(Context.RADIO_SERVICE);
- assertNotNull(mRadioManager);
-
- int status = mRadioManager.listModules(mModules);
- assertEquals(RadioManager.STATUS_OK, status);
- assertFalse(mModules.isEmpty());
- }
-
- @After
- public void tearDown() {
- mRadioManager = null;
- mModules.clear();
- if (mRadioTuner != null) {
- mRadioTuner.close();
- mRadioTuner = null;
- }
- verifyNoMoreInteractions(mCallback);
- }
-
- private void openTuner() {
- openTuner(true);
- }
-
- private void resetCallback() {
- verifyNoMoreInteractions(mCallback);
- Mockito.reset(mCallback);
- }
-
- private void openTuner(boolean withAudio) {
- assertNull(mRadioTuner);
-
- // find FM band and build its config
- mModule = mModules.get(0);
- for (RadioManager.BandDescriptor band : mModule.getBands()) {
- if (band.getType() == RadioManager.BAND_AM) {
- mAmBandDescriptor = (RadioManager.AmBandDescriptor)band;
- }
- if (band.getType() == RadioManager.BAND_FM) {
- mFmBandDescriptor = (RadioManager.FmBandDescriptor)band;
- }
- }
- assertNotNull(mAmBandDescriptor);
- assertNotNull(mFmBandDescriptor);
- mAmBandConfig = new RadioManager.AmBandConfig.Builder(mAmBandDescriptor).build();
- mFmBandConfig = new RadioManager.FmBandConfig.Builder(mFmBandDescriptor).build();
-
- mRadioTuner = mRadioManager.openTuner(mModule.getId(),
- mFmBandConfig, withAudio, mCallback, null);
- assertNotNull(mRadioTuner);
- verify(mCallback, timeout(kConfigCallbackTimeoutMs)).onConfigurationChanged(any());
- resetCallback();
- }
-
- private void checkAntenna() {
- boolean isConnected = mRadioTuner.isAntennaConnected();
- assertTrue(isConnected);
- }
-
- @Test
- public void testOpenTuner() {
- openTuner();
- }
-
- @Test
- public void testReopenTuner() throws Throwable {
- openTuner();
- mRadioTuner.close();
- mRadioTuner = null;
- Thread.sleep(100); // TODO(b/36122635): force reopen
- openTuner();
- }
-
- @Test
- public void testDoubleClose() {
- openTuner();
- mRadioTuner.close();
- mRadioTuner.close();
- }
-
- @Test
- public void testUseAfterClose() {
- openTuner();
- mRadioTuner.close();
- int ret = mRadioTuner.cancel();
- assertEquals(RadioManager.STATUS_INVALID_OPERATION, ret);
- }
-
- @Test
- public void testSetAndGetConfiguration() {
- openTuner();
-
- // set
- int ret = mRadioTuner.setConfiguration(mAmBandConfig);
- assertEquals(RadioManager.STATUS_OK, ret);
- verify(mCallback, timeout(kConfigCallbackTimeoutMs)).onConfigurationChanged(any());
-
- // get
- RadioManager.BandConfig[] config = new RadioManager.BandConfig[1];
- ret = mRadioTuner.getConfiguration(config);
- assertEquals(RadioManager.STATUS_OK, ret);
-
- assertEquals(mAmBandConfig, config[0]);
- }
-
- @Test
- public void testSetBadConfiguration() throws Throwable {
- openTuner();
-
- // set bad config
- Constructor<RadioManager.AmBandConfig> configConstr =
- RadioManager.AmBandConfig.class.getDeclaredConstructor(
- int.class, int.class, int.class, int.class, int.class, boolean.class);
- configConstr.setAccessible(true);
- RadioManager.AmBandConfig badConfig = configConstr.newInstance(
- 0 /*region*/, RadioManager.BAND_AM /*type*/,
- 10000 /*lowerLimit*/, 1 /*upperLimit*/, 100 /*spacing*/, false /*stereo*/);
- int ret = mRadioTuner.setConfiguration(badConfig);
- assertEquals(RadioManager.STATUS_BAD_VALUE, ret);
- verify(mCallback, never()).onConfigurationChanged(any());
-
- // set null config
- ret = mRadioTuner.setConfiguration(null);
- assertEquals(RadioManager.STATUS_BAD_VALUE, ret);
- verify(mCallback, never()).onConfigurationChanged(any());
-
- // setting good config should recover
- ret = mRadioTuner.setConfiguration(mAmBandConfig);
- assertEquals(RadioManager.STATUS_OK, ret);
- verify(mCallback, timeout(kConfigCallbackTimeoutMs)).onConfigurationChanged(any());
- }
-
- @Test
- public void testMute() {
- openTuner();
-
- boolean isMuted = mRadioTuner.getMute();
- assertFalse(isMuted);
-
- int ret = mRadioTuner.setMute(true);
- assertEquals(RadioManager.STATUS_OK, ret);
- isMuted = mRadioTuner.getMute();
- assertTrue(isMuted);
-
- ret = mRadioTuner.setMute(false);
- assertEquals(RadioManager.STATUS_OK, ret);
- isMuted = mRadioTuner.getMute();
- assertFalse(isMuted);
- }
-
- @Test
- public void testMuteNoAudio() {
- openTuner(false);
-
- int ret = mRadioTuner.setMute(false);
- assertEquals(RadioManager.STATUS_ERROR, ret);
-
- boolean isMuted = mRadioTuner.getMute();
- assertTrue(isMuted);
- }
-
- @Test
- public void testStep() {
- openTuner();
- checkAntenna();
-
- int ret = mRadioTuner.step(RadioTuner.DIRECTION_DOWN, true);
- assertEquals(RadioManager.STATUS_OK, ret);
- verify(mCallback, timeout(kTuneCallbackTimeoutMs)).onProgramInfoChanged(any());
-
- resetCallback();
-
- ret = mRadioTuner.step(RadioTuner.DIRECTION_UP, false);
- assertEquals(RadioManager.STATUS_OK, ret);
- verify(mCallback, timeout(kTuneCallbackTimeoutMs)).onProgramInfoChanged(any());
- }
-
- @Test
- public void testTuneAndGetPI() {
- openTuner();
- checkAntenna();
-
- int channel = mFmBandConfig.getLowerLimit() + mFmBandConfig.getSpacing();
-
- // test tune
- int ret = mRadioTuner.tune(channel, 0);
- assertEquals(RadioManager.STATUS_OK, ret);
- ArgumentCaptor<RadioManager.ProgramInfo> infoc =
- ArgumentCaptor.forClass(RadioManager.ProgramInfo.class);
- verify(mCallback, timeout(kTuneCallbackTimeoutMs))
- .onProgramInfoChanged(infoc.capture());
- assertEquals(channel, infoc.getValue().getChannel());
-
- // test getProgramInformation
- RadioManager.ProgramInfo[] info = new RadioManager.ProgramInfo[1];
- ret = mRadioTuner.getProgramInformation(info);
- assertEquals(RadioManager.STATUS_OK, ret);
- assertNotNull(info[0]);
- assertEquals(channel, info[0].getChannel());
- }
-
- @Test
- public void testDummyCancel() {
- openTuner();
-
- int ret = mRadioTuner.cancel();
- assertEquals(RadioManager.STATUS_OK, ret);
- }
-
- @Test
- public void testLateCancel() {
- openTuner();
- checkAntenna();
-
- int ret = mRadioTuner.step(RadioTuner.DIRECTION_DOWN, false);
- assertEquals(RadioManager.STATUS_OK, ret);
- verify(mCallback, timeout(kTuneCallbackTimeoutMs)).onProgramInfoChanged(any());
-
- int cancelRet = mRadioTuner.cancel();
- assertEquals(RadioManager.STATUS_OK, cancelRet);
- }
-
- @Test
- public void testScanAndCancel() {
- openTuner();
- checkAntenna();
-
- /* There is a possible race condition between scan and cancel commands - the scan may finish
- * before cancel command is issued. Thus we accept both outcomes in this test.
- */
- int scanRet = mRadioTuner.scan(RadioTuner.DIRECTION_DOWN, true);
- int cancelRet = mRadioTuner.cancel();
-
- assertEquals(RadioManager.STATUS_OK, scanRet);
- assertEquals(RadioManager.STATUS_OK, cancelRet);
-
- verify(mCallback, after(kCancelTimeoutMs).atMost(1)).onError(RadioTuner.ERROR_CANCELLED);
- verify(mCallback, atMost(1)).onProgramInfoChanged(any());
- }
-
- @Test
- public void testStartBackgroundScan() {
- openTuner();
- checkAntenna();
-
- boolean ret = mRadioTuner.startBackgroundScan();
- boolean isSupported = mModule.isBackgroundScanningSupported();
- assertEquals(isSupported, ret);
- }
-
- @Test
- public void testGetProgramList() {
- openTuner();
- checkAntenna();
-
- try {
- List<RadioManager.ProgramInfo> list = mRadioTuner.getProgramList(null);
- assertNotNull(list);
- } catch (IllegalStateException e) {
- // the list may or may not be ready at this point
- Log.i(TAG, "Background list is not ready");
- }
- }
-
- @Test
- public void testForcedAnalog() {
- openTuner();
-
- boolean isSupported = true;
- boolean isForced;
- try {
- isForced = mRadioTuner.isAnalogForced();
- assertFalse(isForced);
- } catch (IllegalStateException ex) {
- Log.i(TAG, "Forced analog switch is not supported by this tuner");
- isSupported = false;
- }
-
- if (isSupported) {
- mRadioTuner.setAnalogForced(true);
- isForced = mRadioTuner.isAnalogForced();
- assertTrue(isForced);
-
- mRadioTuner.setAnalogForced(false);
- isForced = mRadioTuner.isAnalogForced();
- assertFalse(isForced);
- } else {
- assertThrows(IllegalStateException.class, () -> mRadioTuner.setAnalogForced(true));
- }
- }
-}
diff --git a/tests/testables/src/android/testing/TestableSettingsProvider.java b/tests/testables/src/android/testing/TestableSettingsProvider.java
index fe97bca1..5f2a224 100644
--- a/tests/testables/src/android/testing/TestableSettingsProvider.java
+++ b/tests/testables/src/android/testing/TestableSettingsProvider.java
@@ -36,7 +36,7 @@
public class TestableSettingsProvider extends MockContentProvider {
private static final String TAG = "TestableSettingsProvider";
- private static final boolean DEBUG = false;
+ private static final boolean DEBUG = true;
private static final String MY_UNIQUE_KEY = "Key_" + TestableSettingsProvider.class.getName();
private static TestableSettingsProvider sInstance;
diff --git a/tools/aapt/SdkConstants.h b/tools/aapt/SdkConstants.h
index d92de06..0dbf4ee 100644
--- a/tools/aapt/SdkConstants.h
+++ b/tools/aapt/SdkConstants.h
@@ -41,7 +41,8 @@
SDK_MNC = 23,
SDK_NOUGAT = 24,
SDK_NOUGAT_MR1 = 25,
- SDK_O = 26, // STOPSHIP replace with real version
+ SDK_O = 26,
+ SDK_O_MR1 = 10000, // STOPSHIP Replace with the real version.
};
#endif // H_AAPT_SDK_CONSTANTS
diff --git a/tools/aapt/pseudolocalize.cpp b/tools/aapt/pseudolocalize.cpp
index c7fee2c..5c47e0f 100644
--- a/tools/aapt/pseudolocalize.cpp
+++ b/tools/aapt/pseudolocalize.cpp
@@ -360,9 +360,15 @@
String16 result;
bool lastspace = true;
bool space = true;
+ bool escape = false;
+ const char16_t ESCAPE_CHAR = '\\';
for (size_t i=0; i<source.size(); i++) {
char16_t c = s[i];
- space = is_space(c);
+ if (!escape && c == ESCAPE_CHAR) {
+ escape = true;
+ continue;
+ }
+ space = (!escape && is_space(c)) || (escape && (c == 'n' || c == 't'));
if (lastspace && !space) {
// Word start
result += k_rlm + k_rlo;
@@ -371,6 +377,10 @@
result += k_pdf + k_rlm;
}
lastspace = space;
+ if (escape) {
+ result.append(&ESCAPE_CHAR, 1);
+ escape=false;
+ }
result.append(&c, 1);
}
if (!lastspace) {
diff --git a/tools/aapt/tests/Pseudolocales_test.cpp b/tools/aapt/tests/Pseudolocales_test.cpp
index 4670e9f..a6aed3a 100644
--- a/tools/aapt/tests/Pseudolocales_test.cpp
+++ b/tools/aapt/tests/Pseudolocales_test.cpp
@@ -87,6 +87,10 @@
"\xe2\x80\x8f\xE2\x80\xaehello\xE2\x80\xac\xe2\x80\x8f\n" \
" \xe2\x80\x8f\xE2\x80\xaeworld\xE2\x80\xac\xe2\x80\x8f\n",
PSEUDO_BIDI);
+ simple_helper("hello\\nworld\\n",
+ "\xe2\x80\x8f\xE2\x80\xaehello\xE2\x80\xac\xe2\x80\x8f\\n"
+ "\xe2\x80\x8f\xE2\x80\xaeworld\xE2\x80\xac\xe2\x80\x8f\\n",
+ PSEUDO_BIDI);
}
TEST(Pseudolocales, SimpleICU) {
diff --git a/tools/aapt2/Android.bp b/tools/aapt2/Android.bp
index 1dc47f8..14d05fd 100644
--- a/tools/aapt2/Android.bp
+++ b/tools/aapt2/Android.bp
@@ -85,6 +85,7 @@
"compile/Pseudolocalizer.cpp",
"compile/XmlIdCollector.cpp",
"configuration/ConfigurationParser.cpp",
+ "filter/AbiFilter.cpp",
"filter/ConfigFilter.cpp",
"flatten/Archive.cpp",
"flatten/TableFlattener.cpp",
@@ -110,6 +111,8 @@
"proto/TableProtoDeserializer.cpp",
"proto/TableProtoSerializer.cpp",
"split/TableSplitter.cpp",
+ "text/Unicode.cpp",
+ "text/Utf8Iterator.cpp",
"unflatten/BinaryResourceParser.cpp",
"unflatten/ResChunkPullParser.cpp",
"util/BigBuffer.cpp",
diff --git a/tools/aapt2/ConfigDescription.cpp b/tools/aapt2/ConfigDescription.cpp
index 46098cb..7ff0c72 100644
--- a/tools/aapt2/ConfigDescription.cpp
+++ b/tools/aapt2/ConfigDescription.cpp
@@ -877,7 +877,16 @@
}
bool ConfigDescription::Dominates(const ConfigDescription& o) const {
- if (*this == DefaultConfig() || *this == o) {
+ if (*this == o) {
+ return true;
+ }
+
+ // Locale de-duping is not-trivial, disable for now (b/62409213).
+ if (diff(o) & CONFIG_LOCALE) {
+ return false;
+ }
+
+ if (*this == DefaultConfig()) {
return true;
}
return MatchWithDensity(o) && !o.MatchWithDensity(*this) &&
diff --git a/tools/aapt2/DominatorTree_test.cpp b/tools/aapt2/DominatorTree_test.cpp
index e89c6be..efc523f 100644
--- a/tools/aapt2/DominatorTree_test.cpp
+++ b/tools/aapt2/DominatorTree_test.cpp
@@ -69,14 +69,12 @@
TEST(DominatorTreeTest, DefaultDominatesEverything) {
const ConfigDescription default_config = {};
const ConfigDescription land_config = test::ParseConfigOrDie("land");
- const ConfigDescription sw600dp_land_config =
- test::ParseConfigOrDie("sw600dp-land-v13");
+ const ConfigDescription sw600dp_land_config = test::ParseConfigOrDie("sw600dp-land-v13");
std::vector<std::unique_ptr<ResourceConfigValue>> configs;
configs.push_back(util::make_unique<ResourceConfigValue>(default_config, ""));
configs.push_back(util::make_unique<ResourceConfigValue>(land_config, ""));
- configs.push_back(
- util::make_unique<ResourceConfigValue>(sw600dp_land_config, ""));
+ configs.push_back(util::make_unique<ResourceConfigValue>(sw600dp_land_config, ""));
DominatorTree tree(configs);
PrettyPrinter printer;
@@ -91,16 +89,13 @@
TEST(DominatorTreeTest, ProductsAreDominatedSeparately) {
const ConfigDescription default_config = {};
const ConfigDescription land_config = test::ParseConfigOrDie("land");
- const ConfigDescription sw600dp_land_config =
- test::ParseConfigOrDie("sw600dp-land-v13");
+ const ConfigDescription sw600dp_land_config = test::ParseConfigOrDie("sw600dp-land-v13");
std::vector<std::unique_ptr<ResourceConfigValue>> configs;
configs.push_back(util::make_unique<ResourceConfigValue>(default_config, ""));
configs.push_back(util::make_unique<ResourceConfigValue>(land_config, ""));
- configs.push_back(
- util::make_unique<ResourceConfigValue>(default_config, "phablet"));
- configs.push_back(
- util::make_unique<ResourceConfigValue>(sw600dp_land_config, "phablet"));
+ configs.push_back(util::make_unique<ResourceConfigValue>(default_config, "phablet"));
+ configs.push_back(util::make_unique<ResourceConfigValue>(sw600dp_land_config, "phablet"));
DominatorTree tree(configs);
PrettyPrinter printer;
@@ -118,16 +113,11 @@
const ConfigDescription en_config = test::ParseConfigOrDie("en");
const ConfigDescription en_v21_config = test::ParseConfigOrDie("en-v21");
const ConfigDescription ldrtl_config = test::ParseConfigOrDie("ldrtl-v4");
- const ConfigDescription ldrtl_xhdpi_config =
- test::ParseConfigOrDie("ldrtl-xhdpi-v4");
- const ConfigDescription sw300dp_config =
- test::ParseConfigOrDie("sw300dp-v13");
- const ConfigDescription sw540dp_config =
- test::ParseConfigOrDie("sw540dp-v14");
- const ConfigDescription sw600dp_config =
- test::ParseConfigOrDie("sw600dp-v14");
- const ConfigDescription sw720dp_config =
- test::ParseConfigOrDie("sw720dp-v13");
+ const ConfigDescription ldrtl_xhdpi_config = test::ParseConfigOrDie("ldrtl-xhdpi-v4");
+ const ConfigDescription sw300dp_config = test::ParseConfigOrDie("sw300dp-v13");
+ const ConfigDescription sw540dp_config = test::ParseConfigOrDie("sw540dp-v14");
+ const ConfigDescription sw600dp_config = test::ParseConfigOrDie("sw600dp-v14");
+ const ConfigDescription sw720dp_config = test::ParseConfigOrDie("sw720dp-v13");
const ConfigDescription v20_config = test::ParseConfigOrDie("v20");
std::vector<std::unique_ptr<ResourceConfigValue>> configs;
@@ -135,8 +125,7 @@
configs.push_back(util::make_unique<ResourceConfigValue>(en_config, ""));
configs.push_back(util::make_unique<ResourceConfigValue>(en_v21_config, ""));
configs.push_back(util::make_unique<ResourceConfigValue>(ldrtl_config, ""));
- configs.push_back(
- util::make_unique<ResourceConfigValue>(ldrtl_xhdpi_config, ""));
+ configs.push_back(util::make_unique<ResourceConfigValue>(ldrtl_xhdpi_config, ""));
configs.push_back(util::make_unique<ResourceConfigValue>(sw300dp_config, ""));
configs.push_back(util::make_unique<ResourceConfigValue>(sw540dp_config, ""));
configs.push_back(util::make_unique<ResourceConfigValue>(sw600dp_config, ""));
@@ -148,15 +137,37 @@
std::string expected =
"<default>\n"
- " en\n"
- " en-v21\n"
" ldrtl-v4\n"
" ldrtl-xhdpi-v4\n"
" sw300dp-v13\n"
" sw540dp-v14\n"
" sw600dp-v14\n"
" sw720dp-v13\n"
- " v20\n";
+ " v20\n"
+ "en\n"
+ " en-v21\n";
+ EXPECT_EQ(expected, printer.ToString(&tree));
+}
+
+TEST(DominatorTreeTest, LocalesAreNeverDominated) {
+ const ConfigDescription fr_config = test::ParseConfigOrDie("fr");
+ const ConfigDescription fr_rCA_config = test::ParseConfigOrDie("fr-rCA");
+ const ConfigDescription fr_rFR_config = test::ParseConfigOrDie("fr-rFR");
+
+ std::vector<std::unique_ptr<ResourceConfigValue>> configs;
+ configs.push_back(util::make_unique<ResourceConfigValue>(ConfigDescription::DefaultConfig(), ""));
+ configs.push_back(util::make_unique<ResourceConfigValue>(fr_config, ""));
+ configs.push_back(util::make_unique<ResourceConfigValue>(fr_rCA_config, ""));
+ configs.push_back(util::make_unique<ResourceConfigValue>(fr_rFR_config, ""));
+
+ DominatorTree tree(configs);
+ PrettyPrinter printer;
+
+ std::string expected =
+ "<default>\n"
+ "fr\n"
+ "fr-rCA\n"
+ "fr-rFR\n";
EXPECT_EQ(expected, printer.ToString(&tree));
}
diff --git a/tools/aapt2/LoadedApk.cpp b/tools/aapt2/LoadedApk.cpp
index 8a8f8be..7e5efa1 100644
--- a/tools/aapt2/LoadedApk.cpp
+++ b/tools/aapt2/LoadedApk.cpp
@@ -57,6 +57,12 @@
bool LoadedApk::WriteToArchive(IAaptContext* context, const TableFlattenerOptions& options,
IArchiveWriter* writer) {
+ FilterChain empty;
+ return WriteToArchive(context, options, &empty, writer);
+}
+
+bool LoadedApk::WriteToArchive(IAaptContext* context, const TableFlattenerOptions& options,
+ FilterChain* filters, IArchiveWriter* writer) {
std::set<std::string> referenced_resources;
// List the files being referenced in the resource table.
for (auto& pkg : table_->packages) {
@@ -89,6 +95,13 @@
continue;
}
+ if (!filters->Keep(path)) {
+ if (context->IsVerbose()) {
+ context->GetDiagnostics()->Note(DiagMessage() << "Filtered '" << path << "' from APK.");
+ }
+ continue;
+ }
+
// The resource table needs to be re-serialized since it might have changed.
if (path == "resources.arsc") {
BigBuffer buffer(4096);
diff --git a/tools/aapt2/LoadedApk.h b/tools/aapt2/LoadedApk.h
index 59eb816..8aa9674 100644
--- a/tools/aapt2/LoadedApk.h
+++ b/tools/aapt2/LoadedApk.h
@@ -20,6 +20,7 @@
#include "androidfw/StringPiece.h"
#include "ResourceTable.h"
+#include "filter/Filter.h"
#include "flatten/Archive.h"
#include "flatten/TableFlattener.h"
#include "io/ZipArchive.h"
@@ -49,6 +50,14 @@
bool WriteToArchive(IAaptContext* context, const TableFlattenerOptions& options,
IArchiveWriter* writer);
+ /**
+ * Writes the APK on disk at the given path, while also removing the resource
+ * files that are not referenced in the resource table. The provided filter
+ * chain is applied to each entry in the APK file.
+ */
+ bool WriteToArchive(IAaptContext* context, const TableFlattenerOptions& options,
+ FilterChain* filters, IArchiveWriter* writer);
+
static std::unique_ptr<LoadedApk> LoadApkFromPath(IAaptContext* context,
const android::StringPiece& path);
diff --git a/tools/aapt2/Main.cpp b/tools/aapt2/Main.cpp
index 1d2e3a4..c5d38ab 100644
--- a/tools/aapt2/Main.cpp
+++ b/tools/aapt2/Main.cpp
@@ -27,7 +27,7 @@
static const char* sMajorVersion = "2";
// Update minor version whenever a feature or flag is added.
-static const char* sMinorVersion = "16";
+static const char* sMinorVersion = "18";
int PrintVersion() {
std::cerr << "Android Asset Packaging Tool (aapt) " << sMajorVersion << "."
diff --git a/tools/aapt2/OWNERS b/tools/aapt2/OWNERS
new file mode 100644
index 0000000..d76233e
--- /dev/null
+++ b/tools/aapt2/OWNERS
@@ -0,0 +1,2 @@
+set noparent
+adamlesinski@google.com
diff --git a/tools/aapt2/ResourceParser_test.cpp b/tools/aapt2/ResourceParser_test.cpp
index c6382b1..d47a529 100644
--- a/tools/aapt2/ResourceParser_test.cpp
+++ b/tools/aapt2/ResourceParser_test.cpp
@@ -25,11 +25,17 @@
#include "test/Test.h"
#include "xml/XmlPullParser.h"
+using ::aapt::test::StrValueEq;
using ::aapt::test::ValueEq;
+using ::android::ResTable_map;
+using ::android::Res_value;
using ::android::StringPiece;
using ::testing::Eq;
+using ::testing::IsEmpty;
+using ::testing::IsNull;
using ::testing::NotNull;
using ::testing::Pointee;
+using ::testing::SizeIs;
namespace aapt {
@@ -74,31 +80,31 @@
};
TEST_F(ResourceParserTest, ParseQuotedString) {
- std::string input = "<string name=\"foo\"> \" hey there \" </string>";
- ASSERT_TRUE(TestParse(input));
+ ASSERT_TRUE(TestParse(R"(<string name="foo"> " hey there " </string>)"));
String* str = test::GetValue<String>(&table_, "string/foo");
- ASSERT_NE(nullptr, str);
- EXPECT_EQ(std::string(" hey there "), *str->value);
- EXPECT_TRUE(str->untranslatable_sections.empty());
+ ASSERT_THAT(str, NotNull());
+ EXPECT_THAT(*str, StrValueEq(" hey there "));
+ EXPECT_THAT(str->untranslatable_sections, IsEmpty());
}
TEST_F(ResourceParserTest, ParseEscapedString) {
- std::string input = "<string name=\"foo\">\\?123</string>";
- ASSERT_TRUE(TestParse(input));
+ ASSERT_TRUE(TestParse(R"(<string name="foo">\?123</string>)"));
String* str = test::GetValue<String>(&table_, "string/foo");
- ASSERT_NE(nullptr, str);
- EXPECT_EQ(std::string("?123"), *str->value);
- EXPECT_TRUE(str->untranslatable_sections.empty());
+ ASSERT_THAT(str, NotNull());
+ EXPECT_THAT(*str, StrValueEq("?123"));
+ EXPECT_THAT(str->untranslatable_sections, IsEmpty());
+
+ ASSERT_TRUE(TestParse(R"(<string name="bar">This isn\’t a bad string</string>)"));
+ str = test::GetValue<String>(&table_, "string/bar");
+ ASSERT_THAT(str, NotNull());
+ EXPECT_THAT(*str, StrValueEq("This isn’t a bad string"));
}
TEST_F(ResourceParserTest, ParseFormattedString) {
- std::string input = "<string name=\"foo\">%d %s</string>";
- ASSERT_FALSE(TestParse(input));
-
- input = "<string name=\"foo\">%1$d %2$s</string>";
- ASSERT_TRUE(TestParse(input));
+ ASSERT_FALSE(TestParse(R"(<string name="foo">%d %s</string>)"));
+ ASSERT_TRUE(TestParse(R"(<string name="foo">%1$d %2$s</string>)"));
}
TEST_F(ResourceParserTest, ParseStyledString) {
@@ -109,98 +115,93 @@
ASSERT_TRUE(TestParse(input));
StyledString* str = test::GetValue<StyledString>(&table_, "string/foo");
- ASSERT_NE(nullptr, str);
+ ASSERT_THAT(str, NotNull());
- const std::string expected_str = "This is my aunt\u2019s fickle string";
- EXPECT_EQ(expected_str, *str->value->str);
- EXPECT_EQ(2u, str->value->spans.size());
- EXPECT_TRUE(str->untranslatable_sections.empty());
+ EXPECT_THAT(*str->value->str, Eq("This is my aunt\u2019s fickle string"));
+ EXPECT_THAT(str->value->spans, SizeIs(2));
+ EXPECT_THAT(str->untranslatable_sections, IsEmpty());
- EXPECT_EQ(std::string("b"), *str->value->spans[0].name);
- EXPECT_EQ(17u, str->value->spans[0].first_char);
- EXPECT_EQ(30u, str->value->spans[0].last_char);
+ EXPECT_THAT(*str->value->spans[0].name, Eq("b"));
+ EXPECT_THAT(str->value->spans[0].first_char, Eq(17u));
+ EXPECT_THAT(str->value->spans[0].last_char, Eq(30u));
- EXPECT_EQ(std::string("small"), *str->value->spans[1].name);
- EXPECT_EQ(24u, str->value->spans[1].first_char);
- EXPECT_EQ(30u, str->value->spans[1].last_char);
+ EXPECT_THAT(*str->value->spans[1].name, Eq("small"));
+ EXPECT_THAT(str->value->spans[1].first_char, Eq(24u));
+ EXPECT_THAT(str->value->spans[1].last_char, Eq(30u));
}
TEST_F(ResourceParserTest, ParseStringWithWhitespace) {
- std::string input = "<string name=\"foo\"> This is what I think </string>";
- ASSERT_TRUE(TestParse(input));
+ ASSERT_TRUE(TestParse(R"(<string name="foo"> This is what I think </string>)"));
String* str = test::GetValue<String>(&table_, "string/foo");
- ASSERT_NE(nullptr, str);
- EXPECT_EQ(std::string("This is what I think"), *str->value);
- EXPECT_TRUE(str->untranslatable_sections.empty());
+ ASSERT_THAT(str, NotNull());
+ EXPECT_THAT(*str->value, Eq("This is what I think"));
+ EXPECT_THAT(str->untranslatable_sections, IsEmpty());
- input = "<string name=\"foo2\">\" This is what I think \"</string>";
- ASSERT_TRUE(TestParse(input));
+ ASSERT_TRUE(TestParse(R"(<string name="foo2">" This is what I think "</string>)"));
str = test::GetValue<String>(&table_, "string/foo2");
- ASSERT_NE(nullptr, str);
- EXPECT_EQ(std::string(" This is what I think "), *str->value);
+ ASSERT_THAT(str, NotNull());
+ EXPECT_THAT(*str, StrValueEq(" This is what I think "));
}
TEST_F(ResourceParserTest, IgnoreXliffTagsOtherThanG) {
- std::string input = R"EOF(
+ std::string input = R"(
<string name="foo" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- There are <xliff:source>no</xliff:source> apples</string>)EOF";
+ There are <xliff:source>no</xliff:source> apples</string>)";
ASSERT_TRUE(TestParse(input));
String* str = test::GetValue<String>(&table_, "string/foo");
- ASSERT_NE(nullptr, str);
- EXPECT_EQ(StringPiece("There are no apples"), StringPiece(*str->value));
- EXPECT_TRUE(str->untranslatable_sections.empty());
+ ASSERT_THAT(str, NotNull());
+ EXPECT_THAT(*str, StrValueEq("There are no apples"));
+ EXPECT_THAT(str->untranslatable_sections, IsEmpty());
}
TEST_F(ResourceParserTest, NestedXliffGTagsAreIllegal) {
- std::string input = R"EOF(
+ std::string input = R"(
<string name="foo" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- Do not <xliff:g>translate <xliff:g>this</xliff:g></xliff:g></string>)EOF";
+ Do not <xliff:g>translate <xliff:g>this</xliff:g></xliff:g></string>)";
EXPECT_FALSE(TestParse(input));
}
TEST_F(ResourceParserTest, RecordUntranslateableXliffSectionsInString) {
- std::string input = R"EOF(
+ std::string input = R"(
<string name="foo" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- There are <xliff:g id="count">%1$d</xliff:g> apples</string>)EOF";
+ There are <xliff:g id="count">%1$d</xliff:g> apples</string>)";
ASSERT_TRUE(TestParse(input));
String* str = test::GetValue<String>(&table_, "string/foo");
- ASSERT_NE(nullptr, str);
- EXPECT_EQ(StringPiece("There are %1$d apples"), StringPiece(*str->value));
-
- ASSERT_EQ(1u, str->untranslatable_sections.size());
+ ASSERT_THAT(str, NotNull());
+ EXPECT_THAT(*str, StrValueEq("There are %1$d apples"));
+ ASSERT_THAT(str->untranslatable_sections, SizeIs(1));
// We expect indices and lengths that span to include the whitespace
// before %1$d. This is due to how the StringBuilder withholds whitespace unless
// needed (to deal with line breaks, etc.).
- EXPECT_EQ(9u, str->untranslatable_sections[0].start);
- EXPECT_EQ(14u, str->untranslatable_sections[0].end);
+ EXPECT_THAT(str->untranslatable_sections[0].start, Eq(9u));
+ EXPECT_THAT(str->untranslatable_sections[0].end, Eq(14u));
}
TEST_F(ResourceParserTest, RecordUntranslateableXliffSectionsInStyledString) {
- std::string input = R"EOF(
+ std::string input = R"(
<string name="foo" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- There are <b><xliff:g id="count">%1$d</xliff:g></b> apples</string>)EOF";
+ There are <b><xliff:g id="count">%1$d</xliff:g></b> apples</string>)";
ASSERT_TRUE(TestParse(input));
StyledString* str = test::GetValue<StyledString>(&table_, "string/foo");
- ASSERT_NE(nullptr, str);
- EXPECT_EQ(StringPiece("There are %1$d apples"), StringPiece(*str->value->str));
-
- ASSERT_EQ(1u, str->untranslatable_sections.size());
+ ASSERT_THAT(str, NotNull());
+ EXPECT_THAT(*str->value->str, Eq("There are %1$d apples"));
+ ASSERT_THAT(str->untranslatable_sections, SizeIs(1));
// We expect indices and lengths that span to include the whitespace
// before %1$d. This is due to how the StringBuilder withholds whitespace unless
// needed (to deal with line breaks, etc.).
- EXPECT_EQ(9u, str->untranslatable_sections[0].start);
- EXPECT_EQ(14u, str->untranslatable_sections[0].end);
+ EXPECT_THAT(str->untranslatable_sections[0].start, Eq(9u));
+ EXPECT_THAT(str->untranslatable_sections[0].end, Eq(14u));
}
TEST_F(ResourceParserTest, ParseNull) {
- std::string input = "<integer name=\"foo\">@null</integer>";
+ std::string input = R"(<integer name="foo">@null</integer>)";
ASSERT_TRUE(TestParse(input));
// The Android runtime treats a value of android::Res_value::TYPE_NULL as
@@ -211,38 +212,36 @@
ASSERT_THAT(null_ref, NotNull());
EXPECT_FALSE(null_ref->name);
EXPECT_FALSE(null_ref->id);
- EXPECT_EQ(Reference::Type::kResource, null_ref->reference_type);
+ EXPECT_THAT(null_ref->reference_type, Eq(Reference::Type::kResource));
}
TEST_F(ResourceParserTest, ParseEmpty) {
- std::string input = "<integer name=\"foo\">@empty</integer>";
+ std::string input = R"(<integer name="foo">@empty</integer>)";
ASSERT_TRUE(TestParse(input));
BinaryPrimitive* integer = test::GetValue<BinaryPrimitive>(&table_, "integer/foo");
- ASSERT_NE(nullptr, integer);
- EXPECT_EQ(uint16_t(android::Res_value::TYPE_NULL), integer->value.dataType);
- EXPECT_EQ(uint32_t(android::Res_value::DATA_NULL_EMPTY), integer->value.data);
+ ASSERT_THAT(integer, NotNull());
+ EXPECT_THAT(integer->value.dataType, Eq(Res_value::TYPE_NULL));
+ EXPECT_THAT(integer->value.data, Eq(Res_value::DATA_NULL_EMPTY));
}
TEST_F(ResourceParserTest, ParseAttr) {
- std::string input =
- "<attr name=\"foo\" format=\"string\"/>\n"
- "<attr name=\"bar\"/>";
+ std::string input = R"(
+ <attr name="foo" format="string"/>
+ <attr name="bar"/>)";
ASSERT_TRUE(TestParse(input));
Attribute* attr = test::GetValue<Attribute>(&table_, "attr/foo");
- ASSERT_NE(nullptr, attr);
- EXPECT_EQ(uint32_t(android::ResTable_map::TYPE_STRING), attr->type_mask);
+ ASSERT_THAT(attr, NotNull());
+ EXPECT_THAT(attr->type_mask, Eq(ResTable_map::TYPE_STRING));
attr = test::GetValue<Attribute>(&table_, "attr/bar");
- ASSERT_NE(nullptr, attr);
- EXPECT_EQ(uint32_t(android::ResTable_map::TYPE_ANY), attr->type_mask);
+ ASSERT_THAT(attr, NotNull());
+ EXPECT_THAT(attr->type_mask, Eq(ResTable_map::TYPE_ANY));
}
-// Old AAPT allowed attributes to be defined under different configurations, but
-// ultimately
-// stored them with the default configuration. Check that we have the same
-// behavior.
+// Old AAPT allowed attributes to be defined under different configurations, but ultimately
+// stored them with the default configuration. Check that we have the same behavior.
TEST_F(ResourceParserTest, ParseAttrAndDeclareStyleableUnderConfigButRecordAsNoConfig) {
const ConfigDescription watch_config = test::ParseConfigOrDie("watch");
std::string input = R"(
@@ -252,583 +251,519 @@
</declare-styleable>)";
ASSERT_TRUE(TestParse(input, watch_config));
- EXPECT_EQ(nullptr, test::GetValueForConfig<Attribute>(&table_, "attr/foo", watch_config));
- EXPECT_EQ(nullptr, test::GetValueForConfig<Attribute>(&table_, "attr/baz", watch_config));
- EXPECT_EQ(nullptr, test::GetValueForConfig<Styleable>(&table_, "styleable/bar", watch_config));
+ EXPECT_THAT(test::GetValueForConfig<Attribute>(&table_, "attr/foo", watch_config), IsNull());
+ EXPECT_THAT(test::GetValueForConfig<Attribute>(&table_, "attr/baz", watch_config), IsNull());
+ EXPECT_THAT(test::GetValueForConfig<Styleable>(&table_, "styleable/bar", watch_config), IsNull());
- EXPECT_NE(nullptr, test::GetValue<Attribute>(&table_, "attr/foo"));
- EXPECT_NE(nullptr, test::GetValue<Attribute>(&table_, "attr/baz"));
- EXPECT_NE(nullptr, test::GetValue<Styleable>(&table_, "styleable/bar"));
+ EXPECT_THAT(test::GetValue<Attribute>(&table_, "attr/foo"), NotNull());
+ EXPECT_THAT(test::GetValue<Attribute>(&table_, "attr/baz"), NotNull());
+ EXPECT_THAT(test::GetValue<Styleable>(&table_, "styleable/bar"), NotNull());
}
TEST_F(ResourceParserTest, ParseAttrWithMinMax) {
- std::string input =
- "<attr name=\"foo\" min=\"10\" max=\"23\" format=\"integer\"/>";
+ std::string input = R"(<attr name="foo" min="10" max="23" format="integer"/>)";
ASSERT_TRUE(TestParse(input));
Attribute* attr = test::GetValue<Attribute>(&table_, "attr/foo");
- ASSERT_NE(nullptr, attr);
- EXPECT_EQ(uint32_t(android::ResTable_map::TYPE_INTEGER), attr->type_mask);
- EXPECT_EQ(10, attr->min_int);
- EXPECT_EQ(23, attr->max_int);
+ ASSERT_THAT(attr, NotNull());
+ EXPECT_THAT(attr->type_mask, Eq(ResTable_map::TYPE_INTEGER));
+ EXPECT_THAT(attr->min_int, Eq(10));
+ EXPECT_THAT(attr->max_int, Eq(23));
}
TEST_F(ResourceParserTest, FailParseAttrWithMinMaxButNotInteger) {
- std::string input =
- "<attr name=\"foo\" min=\"10\" max=\"23\" format=\"string\"/>";
- ASSERT_FALSE(TestParse(input));
+ ASSERT_FALSE(TestParse(R"(<attr name="foo" min="10" max="23" format="string"/>)"));
}
TEST_F(ResourceParserTest, ParseUseAndDeclOfAttr) {
- std::string input =
- "<declare-styleable name=\"Styleable\">\n"
- " <attr name=\"foo\" />\n"
- "</declare-styleable>\n"
- "<attr name=\"foo\" format=\"string\"/>";
+ std::string input = R"(
+ <declare-styleable name="Styleable">
+ <attr name="foo" />
+ </declare-styleable>
+ <attr name="foo" format="string"/>)";
ASSERT_TRUE(TestParse(input));
Attribute* attr = test::GetValue<Attribute>(&table_, "attr/foo");
- ASSERT_NE(nullptr, attr);
- EXPECT_EQ(uint32_t(android::ResTable_map::TYPE_STRING), attr->type_mask);
+ ASSERT_THAT(attr, NotNull());
+ EXPECT_THAT(attr->type_mask, Eq(ResTable_map::TYPE_STRING));
}
TEST_F(ResourceParserTest, ParseDoubleUseOfAttr) {
- std::string input =
- "<declare-styleable name=\"Theme\">"
- " <attr name=\"foo\" />\n"
- "</declare-styleable>\n"
- "<declare-styleable name=\"Window\">\n"
- " <attr name=\"foo\" format=\"boolean\"/>\n"
- "</declare-styleable>";
+ std::string input = R"(
+ <declare-styleable name="Theme">
+ <attr name="foo" />
+ </declare-styleable>
+ <declare-styleable name="Window">
+ <attr name="foo" format="boolean"/>
+ </declare-styleable>)";
ASSERT_TRUE(TestParse(input));
Attribute* attr = test::GetValue<Attribute>(&table_, "attr/foo");
- ASSERT_NE(nullptr, attr);
- EXPECT_EQ(uint32_t(android::ResTable_map::TYPE_BOOLEAN), attr->type_mask);
+ ASSERT_THAT(attr, NotNull());
+ EXPECT_THAT(attr->type_mask, Eq(ResTable_map::TYPE_BOOLEAN));
}
TEST_F(ResourceParserTest, ParseEnumAttr) {
- std::string input =
- "<attr name=\"foo\">\n"
- " <enum name=\"bar\" value=\"0\"/>\n"
- " <enum name=\"bat\" value=\"1\"/>\n"
- " <enum name=\"baz\" value=\"2\"/>\n"
- "</attr>";
+ std::string input = R"(
+ <attr name="foo">
+ <enum name="bar" value="0"/>
+ <enum name="bat" value="1"/>
+ <enum name="baz" value="2"/>
+ </attr>)";
ASSERT_TRUE(TestParse(input));
Attribute* enum_attr = test::GetValue<Attribute>(&table_, "attr/foo");
- ASSERT_NE(enum_attr, nullptr);
- EXPECT_EQ(enum_attr->type_mask, android::ResTable_map::TYPE_ENUM);
- ASSERT_EQ(enum_attr->symbols.size(), 3u);
+ ASSERT_THAT(enum_attr, NotNull());
+ EXPECT_THAT(enum_attr->type_mask, Eq(ResTable_map::TYPE_ENUM));
+ ASSERT_THAT(enum_attr->symbols, SizeIs(3));
- AAPT_ASSERT_TRUE(enum_attr->symbols[0].symbol.name);
- EXPECT_EQ(enum_attr->symbols[0].symbol.name.value().entry, "bar");
- EXPECT_EQ(enum_attr->symbols[0].value, 0u);
+ ASSERT_TRUE(enum_attr->symbols[0].symbol.name);
+ EXPECT_THAT(enum_attr->symbols[0].symbol.name.value().entry, Eq("bar"));
+ EXPECT_THAT(enum_attr->symbols[0].value, Eq(0u));
- AAPT_ASSERT_TRUE(enum_attr->symbols[1].symbol.name);
- EXPECT_EQ(enum_attr->symbols[1].symbol.name.value().entry, "bat");
- EXPECT_EQ(enum_attr->symbols[1].value, 1u);
+ ASSERT_TRUE(enum_attr->symbols[1].symbol.name);
+ EXPECT_THAT(enum_attr->symbols[1].symbol.name.value().entry, Eq("bat"));
+ EXPECT_THAT(enum_attr->symbols[1].value, Eq(1u));
- AAPT_ASSERT_TRUE(enum_attr->symbols[2].symbol.name);
- EXPECT_EQ(enum_attr->symbols[2].symbol.name.value().entry, "baz");
- EXPECT_EQ(enum_attr->symbols[2].value, 2u);
+ ASSERT_TRUE(enum_attr->symbols[2].symbol.name);
+ EXPECT_THAT(enum_attr->symbols[2].symbol.name.value().entry, Eq("baz"));
+ EXPECT_THAT(enum_attr->symbols[2].value, Eq(2u));
}
TEST_F(ResourceParserTest, ParseFlagAttr) {
- std::string input =
- "<attr name=\"foo\">\n"
- " <flag name=\"bar\" value=\"0\"/>\n"
- " <flag name=\"bat\" value=\"1\"/>\n"
- " <flag name=\"baz\" value=\"2\"/>\n"
- "</attr>";
+ std::string input = R"(
+ <attr name="foo">
+ <flag name="bar" value="0"/>
+ <flag name="bat" value="1"/>
+ <flag name="baz" value="2"/>
+ </attr>)";
ASSERT_TRUE(TestParse(input));
Attribute* flag_attr = test::GetValue<Attribute>(&table_, "attr/foo");
- ASSERT_NE(nullptr, flag_attr);
- EXPECT_EQ(flag_attr->type_mask, android::ResTable_map::TYPE_FLAGS);
- ASSERT_EQ(flag_attr->symbols.size(), 3u);
+ ASSERT_THAT(flag_attr, NotNull());
+ EXPECT_THAT(flag_attr->type_mask, Eq(ResTable_map::TYPE_FLAGS));
+ ASSERT_THAT(flag_attr->symbols, SizeIs(3));
- AAPT_ASSERT_TRUE(flag_attr->symbols[0].symbol.name);
- EXPECT_EQ(flag_attr->symbols[0].symbol.name.value().entry, "bar");
- EXPECT_EQ(flag_attr->symbols[0].value, 0u);
+ ASSERT_TRUE(flag_attr->symbols[0].symbol.name);
+ EXPECT_THAT(flag_attr->symbols[0].symbol.name.value().entry, Eq("bar"));
+ EXPECT_THAT(flag_attr->symbols[0].value, Eq(0u));
- AAPT_ASSERT_TRUE(flag_attr->symbols[1].symbol.name);
- EXPECT_EQ(flag_attr->symbols[1].symbol.name.value().entry, "bat");
- EXPECT_EQ(flag_attr->symbols[1].value, 1u);
+ ASSERT_TRUE(flag_attr->symbols[1].symbol.name);
+ EXPECT_THAT(flag_attr->symbols[1].symbol.name.value().entry, Eq("bat"));
+ EXPECT_THAT(flag_attr->symbols[1].value, Eq(1u));
- AAPT_ASSERT_TRUE(flag_attr->symbols[2].symbol.name);
- EXPECT_EQ(flag_attr->symbols[2].symbol.name.value().entry, "baz");
- EXPECT_EQ(flag_attr->symbols[2].value, 2u);
+ ASSERT_TRUE(flag_attr->symbols[2].symbol.name);
+ EXPECT_THAT(flag_attr->symbols[2].symbol.name.value().entry, Eq("baz"));
+ EXPECT_THAT(flag_attr->symbols[2].value, Eq(2u));
std::unique_ptr<BinaryPrimitive> flag_value =
ResourceUtils::TryParseFlagSymbol(flag_attr, "baz|bat");
- ASSERT_NE(nullptr, flag_value);
- EXPECT_EQ(flag_value->value.data, 1u | 2u);
+ ASSERT_THAT(flag_value, NotNull());
+ EXPECT_THAT(flag_value->value.data, Eq(1u | 2u));
}
TEST_F(ResourceParserTest, FailToParseEnumAttrWithNonUniqueKeys) {
- std::string input =
- "<attr name=\"foo\">\n"
- " <enum name=\"bar\" value=\"0\"/>\n"
- " <enum name=\"bat\" value=\"1\"/>\n"
- " <enum name=\"bat\" value=\"2\"/>\n"
- "</attr>";
+ std::string input = R"(
+ <attr name="foo">
+ <enum name="bar" value="0"/>
+ <enum name="bat" value="1"/>
+ <enum name="bat" value="2"/>
+ </attr>)";
ASSERT_FALSE(TestParse(input));
}
TEST_F(ResourceParserTest, ParseStyle) {
- std::string input =
- "<style name=\"foo\" parent=\"@style/fu\">\n"
- " <item name=\"bar\">#ffffffff</item>\n"
- " <item name=\"bat\">@string/hey</item>\n"
- " <item name=\"baz\"><b>hey</b></item>\n"
- "</style>";
+ std::string input = R"(
+ <style name="foo" parent="@style/fu">
+ <item name="bar">#ffffffff</item>
+ <item name="bat">@string/hey</item>
+ <item name="baz"><b>hey</b></item>
+ </style>)";
ASSERT_TRUE(TestParse(input));
Style* style = test::GetValue<Style>(&table_, "style/foo");
- ASSERT_NE(nullptr, style);
- AAPT_ASSERT_TRUE(style->parent);
- AAPT_ASSERT_TRUE(style->parent.value().name);
- EXPECT_EQ(test::ParseNameOrDie("style/fu"),
- style->parent.value().name.value());
- ASSERT_EQ(3u, style->entries.size());
+ ASSERT_THAT(style, NotNull());
+ ASSERT_TRUE(style->parent);
+ EXPECT_THAT(style->parent.value().name, Eq(make_value(test::ParseNameOrDie("style/fu"))));
+ ASSERT_THAT(style->entries, SizeIs(3));
- AAPT_ASSERT_TRUE(style->entries[0].key.name);
- EXPECT_EQ(test::ParseNameOrDie("attr/bar"),
- style->entries[0].key.name.value());
-
- AAPT_ASSERT_TRUE(style->entries[1].key.name);
- EXPECT_EQ(test::ParseNameOrDie("attr/bat"),
- style->entries[1].key.name.value());
-
- AAPT_ASSERT_TRUE(style->entries[2].key.name);
- EXPECT_EQ(test::ParseNameOrDie("attr/baz"),
- style->entries[2].key.name.value());
+ EXPECT_THAT(style->entries[0].key.name, Eq(make_value(test::ParseNameOrDie("attr/bar"))));
+ EXPECT_THAT(style->entries[1].key.name, Eq(make_value(test::ParseNameOrDie("attr/bat"))));
+ EXPECT_THAT(style->entries[2].key.name, Eq(make_value(test::ParseNameOrDie("attr/baz"))));
}
TEST_F(ResourceParserTest, ParseStyleWithShorthandParent) {
- std::string input = "<style name=\"foo\" parent=\"com.app:Theme\"/>";
- ASSERT_TRUE(TestParse(input));
+ ASSERT_TRUE(TestParse(R"(<style name="foo" parent="com.app:Theme"/>)"));
Style* style = test::GetValue<Style>(&table_, "style/foo");
- ASSERT_NE(nullptr, style);
- AAPT_ASSERT_TRUE(style->parent);
- AAPT_ASSERT_TRUE(style->parent.value().name);
- EXPECT_EQ(test::ParseNameOrDie("com.app:style/Theme"),
- style->parent.value().name.value());
+ ASSERT_THAT(style, NotNull());
+ ASSERT_TRUE(style->parent);
+ EXPECT_THAT(style->parent.value().name, Eq(make_value(test::ParseNameOrDie("com.app:style/Theme"))));
}
TEST_F(ResourceParserTest, ParseStyleWithPackageAliasedParent) {
- std::string input =
- "<style xmlns:app=\"http://schemas.android.com/apk/res/android\"\n"
- " name=\"foo\" parent=\"app:Theme\"/>";
+ std::string input = R"(
+ <style xmlns:app="http://schemas.android.com/apk/res/android"
+ name="foo" parent="app:Theme"/>)";
ASSERT_TRUE(TestParse(input));
Style* style = test::GetValue<Style>(&table_, "style/foo");
- ASSERT_NE(nullptr, style);
- AAPT_ASSERT_TRUE(style->parent);
- AAPT_ASSERT_TRUE(style->parent.value().name);
- EXPECT_EQ(test::ParseNameOrDie("android:style/Theme"),
- style->parent.value().name.value());
+ ASSERT_THAT(style, NotNull());
+ ASSERT_TRUE(style->parent);
+ ASSERT_TRUE(style->parent.value().name);
+ EXPECT_THAT(style->parent.value().name, Eq(make_value(test::ParseNameOrDie("android:style/Theme"))));
}
TEST_F(ResourceParserTest, ParseStyleWithPackageAliasedItems) {
- std::string input =
- "<style xmlns:app=\"http://schemas.android.com/apk/res/android\" "
- "name=\"foo\">\n"
- " <item name=\"app:bar\">0</item>\n"
- "</style>";
+ std::string input = R"(
+ <style xmlns:app="http://schemas.android.com/apk/res/android" name="foo">
+ <item name="app:bar">0</item>
+ </style>)";
ASSERT_TRUE(TestParse(input));
Style* style = test::GetValue<Style>(&table_, "style/foo");
- ASSERT_NE(nullptr, style);
- ASSERT_EQ(1u, style->entries.size());
- EXPECT_EQ(test::ParseNameOrDie("android:attr/bar"),
- style->entries[0].key.name.value());
+ ASSERT_THAT(style, NotNull());
+ ASSERT_THAT(style->entries, SizeIs(1));
+ EXPECT_THAT(style->entries[0].key.name, Eq(make_value(test::ParseNameOrDie("android:attr/bar"))));
}
TEST_F(ResourceParserTest, ParseStyleWithInferredParent) {
- std::string input = "<style name=\"foo.bar\"/>";
- ASSERT_TRUE(TestParse(input));
+ ASSERT_TRUE(TestParse(R"(<style name="foo.bar"/>)"));
Style* style = test::GetValue<Style>(&table_, "style/foo.bar");
- ASSERT_NE(nullptr, style);
- AAPT_ASSERT_TRUE(style->parent);
- AAPT_ASSERT_TRUE(style->parent.value().name);
- EXPECT_EQ(style->parent.value().name.value(),
- test::ParseNameOrDie("style/foo"));
+ ASSERT_THAT(style, NotNull());
+ ASSERT_TRUE(style->parent);
+ EXPECT_THAT(style->parent.value().name, Eq(make_value(test::ParseNameOrDie("style/foo"))));
EXPECT_TRUE(style->parent_inferred);
}
-TEST_F(ResourceParserTest,
- ParseStyleWithInferredParentOverridenByEmptyParentAttribute) {
- std::string input = "<style name=\"foo.bar\" parent=\"\"/>";
- ASSERT_TRUE(TestParse(input));
+TEST_F(ResourceParserTest, ParseStyleWithInferredParentOverridenByEmptyParentAttribute) {
+ ASSERT_TRUE(TestParse(R"(<style name="foo.bar" parent=""/>)"));
Style* style = test::GetValue<Style>(&table_, "style/foo.bar");
- ASSERT_NE(nullptr, style);
- AAPT_EXPECT_FALSE(style->parent);
+ ASSERT_THAT(style, NotNull());
+ EXPECT_FALSE(style->parent);
EXPECT_FALSE(style->parent_inferred);
}
TEST_F(ResourceParserTest, ParseStyleWithPrivateParentReference) {
- std::string input =
- R"EOF(<style name="foo" parent="*android:style/bar" />)EOF";
- ASSERT_TRUE(TestParse(input));
+ ASSERT_TRUE(TestParse(R"(<style name="foo" parent="*android:style/bar" />)"));
Style* style = test::GetValue<Style>(&table_, "style/foo");
- ASSERT_NE(nullptr, style);
- AAPT_ASSERT_TRUE(style->parent);
+ ASSERT_THAT(style, NotNull());
+ ASSERT_TRUE(style->parent);
EXPECT_TRUE(style->parent.value().private_reference);
}
TEST_F(ResourceParserTest, ParseAutoGeneratedIdReference) {
- std::string input = "<string name=\"foo\">@+id/bar</string>";
- ASSERT_TRUE(TestParse(input));
-
- Id* id = test::GetValue<Id>(&table_, "id/bar");
- ASSERT_NE(id, nullptr);
+ ASSERT_TRUE(TestParse(R"(<string name="foo">@+id/bar</string>)"));
+ ASSERT_THAT(test::GetValue<Id>(&table_, "id/bar"), NotNull());
}
TEST_F(ResourceParserTest, ParseAttributesDeclareStyleable) {
- std::string input =
- "<declare-styleable name=\"foo\">\n"
- " <attr name=\"bar\" />\n"
- " <attr name=\"bat\" format=\"string|reference\"/>\n"
- " <attr name=\"baz\">\n"
- " <enum name=\"foo\" value=\"1\"/>\n"
- " </attr>\n"
- "</declare-styleable>";
+ std::string input = R"(
+ <declare-styleable name="foo">
+ <attr name="bar" />
+ <attr name="bat" format="string|reference"/>
+ <attr name="baz">
+ <enum name="foo" value="1"/>
+ </attr>
+ </declare-styleable>)";
ASSERT_TRUE(TestParse(input));
Maybe<ResourceTable::SearchResult> result =
table_.FindResource(test::ParseNameOrDie("styleable/foo"));
- AAPT_ASSERT_TRUE(result);
- EXPECT_EQ(SymbolState::kPublic, result.value().entry->symbol_status.state);
+ ASSERT_TRUE(result);
+ EXPECT_THAT(result.value().entry->symbol_status.state, Eq(SymbolState::kPublic));
Attribute* attr = test::GetValue<Attribute>(&table_, "attr/bar");
- ASSERT_NE(attr, nullptr);
+ ASSERT_THAT(attr, NotNull());
EXPECT_TRUE(attr->IsWeak());
attr = test::GetValue<Attribute>(&table_, "attr/bat");
- ASSERT_NE(attr, nullptr);
+ ASSERT_THAT(attr, NotNull());
EXPECT_TRUE(attr->IsWeak());
attr = test::GetValue<Attribute>(&table_, "attr/baz");
- ASSERT_NE(attr, nullptr);
+ ASSERT_THAT(attr, NotNull());
EXPECT_TRUE(attr->IsWeak());
- EXPECT_EQ(1u, attr->symbols.size());
+ EXPECT_THAT(attr->symbols, SizeIs(1));
- EXPECT_NE(nullptr, test::GetValue<Id>(&table_, "id/foo"));
+ EXPECT_THAT(test::GetValue<Id>(&table_, "id/foo"), NotNull());
Styleable* styleable = test::GetValue<Styleable>(&table_, "styleable/foo");
- ASSERT_NE(styleable, nullptr);
- ASSERT_EQ(3u, styleable->entries.size());
+ ASSERT_THAT(styleable, NotNull());
+ ASSERT_THAT(styleable->entries, SizeIs(3));
- EXPECT_EQ(test::ParseNameOrDie("attr/bar"),
- styleable->entries[0].name.value());
- EXPECT_EQ(test::ParseNameOrDie("attr/bat"),
- styleable->entries[1].name.value());
+ EXPECT_THAT(styleable->entries[0].name, Eq(make_value(test::ParseNameOrDie("attr/bar"))));
+ EXPECT_THAT(styleable->entries[1].name, Eq(make_value(test::ParseNameOrDie("attr/bat"))));
+ EXPECT_THAT(styleable->entries[2].name, Eq(make_value(test::ParseNameOrDie("attr/baz"))));
}
TEST_F(ResourceParserTest, ParsePrivateAttributesDeclareStyleable) {
- std::string input =
- "<declare-styleable name=\"foo\" "
- "xmlns:privAndroid=\"http://schemas.android.com/apk/prv/res/android\">\n"
- " <attr name=\"*android:bar\" />\n"
- " <attr name=\"privAndroid:bat\" />\n"
- "</declare-styleable>";
+ std::string input = R"(
+ <declare-styleable xmlns:privAndroid="http://schemas.android.com/apk/prv/res/android"
+ name="foo">
+ <attr name="*android:bar" />
+ <attr name="privAndroid:bat" />
+ </declare-styleable>)";
ASSERT_TRUE(TestParse(input));
Styleable* styleable = test::GetValue<Styleable>(&table_, "styleable/foo");
- ASSERT_NE(nullptr, styleable);
- ASSERT_EQ(2u, styleable->entries.size());
+ ASSERT_THAT(styleable, NotNull());
+ ASSERT_THAT(styleable->entries, SizeIs(2));
EXPECT_TRUE(styleable->entries[0].private_reference);
- AAPT_ASSERT_TRUE(styleable->entries[0].name);
- EXPECT_EQ(std::string("android"), styleable->entries[0].name.value().package);
+ ASSERT_TRUE(styleable->entries[0].name);
+ EXPECT_THAT(styleable->entries[0].name.value().package, Eq("android"));
EXPECT_TRUE(styleable->entries[1].private_reference);
- AAPT_ASSERT_TRUE(styleable->entries[1].name);
- EXPECT_EQ(std::string("android"), styleable->entries[1].name.value().package);
+ ASSERT_TRUE(styleable->entries[1].name);
+ EXPECT_THAT(styleable->entries[1].name.value().package, Eq("android"));
}
TEST_F(ResourceParserTest, ParseArray) {
- std::string input =
- "<array name=\"foo\">\n"
- " <item>@string/ref</item>\n"
- " <item>hey</item>\n"
- " <item>23</item>\n"
- "</array>";
+ std::string input = R"(
+ <array name="foo">
+ <item>@string/ref</item>
+ <item>hey</item>
+ <item>23</item>
+ </array>)";
ASSERT_TRUE(TestParse(input));
Array* array = test::GetValue<Array>(&table_, "array/foo");
- ASSERT_NE(array, nullptr);
- ASSERT_EQ(3u, array->items.size());
+ ASSERT_THAT(array, NotNull());
+ ASSERT_THAT(array->items, SizeIs(3));
- EXPECT_NE(nullptr, ValueCast<Reference>(array->items[0].get()));
- EXPECT_NE(nullptr, ValueCast<String>(array->items[1].get()));
- EXPECT_NE(nullptr, ValueCast<BinaryPrimitive>(array->items[2].get()));
+ EXPECT_THAT(ValueCast<Reference>(array->items[0].get()), NotNull());
+ EXPECT_THAT(ValueCast<String>(array->items[1].get()), NotNull());
+ EXPECT_THAT(ValueCast<BinaryPrimitive>(array->items[2].get()), NotNull());
}
TEST_F(ResourceParserTest, ParseStringArray) {
- std::string input = R"EOF(
+ std::string input = R"(
<string-array name="foo">
<item>"Werk"</item>"
- </string-array>)EOF";
+ </string-array>)";
ASSERT_TRUE(TestParse(input));
- EXPECT_NE(nullptr, test::GetValue<Array>(&table_, "array/foo"));
+ EXPECT_THAT(test::GetValue<Array>(&table_, "array/foo"), NotNull());
}
TEST_F(ResourceParserTest, ParseArrayWithFormat) {
- std::string input = R"EOF(
+ std::string input = R"(
<array name="foo" format="string">
<item>100</item>
- </array>)EOF";
+ </array>)";
ASSERT_TRUE(TestParse(input));
Array* array = test::GetValue<Array>(&table_, "array/foo");
- ASSERT_NE(nullptr, array);
-
- ASSERT_EQ(1u, array->items.size());
+ ASSERT_THAT(array, NotNull());
+ ASSERT_THAT(array->items, SizeIs(1));
String* str = ValueCast<String>(array->items[0].get());
- ASSERT_NE(nullptr, str);
- EXPECT_EQ(std::string("100"), *str->value);
+ ASSERT_THAT(str, NotNull());
+ EXPECT_THAT(*str, StrValueEq("100"));
}
TEST_F(ResourceParserTest, ParseArrayWithBadFormat) {
- std::string input = R"EOF(
+ std::string input = R"(
<array name="foo" format="integer">
<item>Hi</item>
- </array>)EOF";
+ </array>)";
ASSERT_FALSE(TestParse(input));
}
TEST_F(ResourceParserTest, ParsePlural) {
- std::string input =
- "<plurals name=\"foo\">\n"
- " <item quantity=\"other\">apples</item>\n"
- " <item quantity=\"one\">apple</item>\n"
- "</plurals>";
+ std::string input = R"(
+ <plurals name="foo">
+ <item quantity="other">apples</item>
+ <item quantity="one">apple</item>
+ </plurals>)";
ASSERT_TRUE(TestParse(input));
Plural* plural = test::GetValue<Plural>(&table_, "plurals/foo");
- ASSERT_NE(nullptr, plural);
- EXPECT_EQ(nullptr, plural->values[Plural::Zero]);
- EXPECT_EQ(nullptr, plural->values[Plural::Two]);
- EXPECT_EQ(nullptr, plural->values[Plural::Few]);
- EXPECT_EQ(nullptr, plural->values[Plural::Many]);
+ ASSERT_THAT(plural, NotNull());
+ EXPECT_THAT(plural->values[Plural::Zero], IsNull());
+ EXPECT_THAT(plural->values[Plural::Two], IsNull());
+ EXPECT_THAT(plural->values[Plural::Few], IsNull());
+ EXPECT_THAT(plural->values[Plural::Many], IsNull());
- EXPECT_NE(nullptr, plural->values[Plural::One]);
- EXPECT_NE(nullptr, plural->values[Plural::Other]);
+ EXPECT_THAT(plural->values[Plural::One], NotNull());
+ EXPECT_THAT(plural->values[Plural::Other], NotNull());
}
TEST_F(ResourceParserTest, ParseCommentsWithResource) {
- std::string input =
- "<!--This is a comment-->\n"
- "<string name=\"foo\">Hi</string>";
+ std::string input = R"(
+ <!--This is a comment-->
+ <string name="foo">Hi</string>)";
ASSERT_TRUE(TestParse(input));
String* value = test::GetValue<String>(&table_, "string/foo");
- ASSERT_NE(nullptr, value);
- EXPECT_EQ(value->GetComment(), "This is a comment");
+ ASSERT_THAT(value, NotNull());
+ EXPECT_THAT(value->GetComment(), Eq("This is a comment"));
}
TEST_F(ResourceParserTest, DoNotCombineMultipleComments) {
- std::string input =
- "<!--One-->\n"
- "<!--Two-->\n"
- "<string name=\"foo\">Hi</string>";
+ std::string input = R"(
+ <!--One-->
+ <!--Two-->
+ <string name="foo">Hi</string>)";
ASSERT_TRUE(TestParse(input));
String* value = test::GetValue<String>(&table_, "string/foo");
- ASSERT_NE(nullptr, value);
- EXPECT_EQ(value->GetComment(), "Two");
+ ASSERT_THAT(value, NotNull());
+ EXPECT_THAT(value->GetComment(), Eq("Two"));
}
TEST_F(ResourceParserTest, IgnoreCommentBeforeEndTag) {
- std::string input =
- "<!--One-->\n"
- "<string name=\"foo\">\n"
- " Hi\n"
- "<!--Two-->\n"
- "</string>";
-
+ std::string input = R"(
+ <!--One-->
+ <string name="foo">
+ Hi
+ <!--Two-->
+ </string>)";
ASSERT_TRUE(TestParse(input));
String* value = test::GetValue<String>(&table_, "string/foo");
- ASSERT_NE(nullptr, value);
- EXPECT_EQ(value->GetComment(), "One");
+ ASSERT_THAT(value, NotNull());
+ EXPECT_THAT(value->GetComment(), Eq("One"));
}
TEST_F(ResourceParserTest, ParseNestedComments) {
// We only care about declare-styleable and enum/flag attributes because
- // comments
- // from those end up in R.java
- std::string input = R"EOF(
- <declare-styleable name="foo">
- <!-- The name of the bar -->
- <attr name="barName" format="string|reference" />
- </declare-styleable>
+ // comments from those end up in R.java
+ std::string input = R"(
+ <declare-styleable name="foo">
+ <!-- The name of the bar -->
+ <attr name="barName" format="string|reference" />
+ </declare-styleable>
- <attr name="foo">
- <!-- The very first -->
- <enum name="one" value="1" />
- </attr>)EOF";
+ <attr name="foo">
+ <!-- The very first -->
+ <enum name="one" value="1" />
+ </attr>)";
ASSERT_TRUE(TestParse(input));
Styleable* styleable = test::GetValue<Styleable>(&table_, "styleable/foo");
- ASSERT_NE(nullptr, styleable);
- ASSERT_EQ(1u, styleable->entries.size());
-
- EXPECT_EQ(StringPiece("The name of the bar"),
- styleable->entries.front().GetComment());
+ ASSERT_THAT(styleable, NotNull());
+ ASSERT_THAT(styleable->entries, SizeIs(1));
+ EXPECT_THAT(styleable->entries[0].GetComment(), Eq("The name of the bar"));
Attribute* attr = test::GetValue<Attribute>(&table_, "attr/foo");
- ASSERT_NE(nullptr, attr);
- ASSERT_EQ(1u, attr->symbols.size());
-
- EXPECT_EQ(StringPiece("The very first"),
- attr->symbols.front().symbol.GetComment());
+ ASSERT_THAT(attr, NotNull());
+ ASSERT_THAT(attr->symbols, SizeIs(1));
+ EXPECT_THAT(attr->symbols[0].symbol.GetComment(), Eq("The very first"));
}
-/*
- * Declaring an ID as public should not require a separate definition
- * (as an ID has no value).
- */
+// Declaring an ID as public should not require a separate definition (as an ID has no value).
TEST_F(ResourceParserTest, ParsePublicIdAsDefinition) {
- std::string input = "<public type=\"id\" name=\"foo\"/>";
- ASSERT_TRUE(TestParse(input));
-
- Id* id = test::GetValue<Id>(&table_, "id/foo");
- ASSERT_NE(nullptr, id);
+ ASSERT_TRUE(TestParse(R"(<public type="id" name="foo"/>)"));
+ ASSERT_THAT(test::GetValue<Id>(&table_, "id/foo"), NotNull());
}
TEST_F(ResourceParserTest, KeepAllProducts) {
- std::string input = R"EOF(
- <string name="foo" product="phone">hi</string>
- <string name="foo" product="no-sdcard">ho</string>
- <string name="bar" product="">wee</string>
- <string name="baz">woo</string>
- <string name="bit" product="phablet">hoot</string>
- <string name="bot" product="default">yes</string>
- )EOF";
+ std::string input = R"(
+ <string name="foo" product="phone">hi</string>
+ <string name="foo" product="no-sdcard">ho</string>
+ <string name="bar" product="">wee</string>
+ <string name="baz">woo</string>
+ <string name="bit" product="phablet">hoot</string>
+ <string name="bot" product="default">yes</string>)";
ASSERT_TRUE(TestParse(input));
- EXPECT_NE(nullptr, test::GetValueForConfigAndProduct<String>(
- &table_, "string/foo",
- ConfigDescription::DefaultConfig(), "phone"));
- EXPECT_NE(nullptr, test::GetValueForConfigAndProduct<String>(
- &table_, "string/foo",
- ConfigDescription::DefaultConfig(), "no-sdcard"));
- EXPECT_NE(nullptr,
- test::GetValueForConfigAndProduct<String>(
- &table_, "string/bar", ConfigDescription::DefaultConfig(), ""));
- EXPECT_NE(nullptr,
- test::GetValueForConfigAndProduct<String>(
- &table_, "string/baz", ConfigDescription::DefaultConfig(), ""));
- EXPECT_NE(nullptr, test::GetValueForConfigAndProduct<String>(
- &table_, "string/bit",
- ConfigDescription::DefaultConfig(), "phablet"));
- EXPECT_NE(nullptr, test::GetValueForConfigAndProduct<String>(
- &table_, "string/bot",
- ConfigDescription::DefaultConfig(), "default"));
+ ASSERT_THAT(test::GetValueForConfigAndProduct<String>(&table_, "string/foo", ConfigDescription::DefaultConfig(), "phone"), NotNull());
+ ASSERT_THAT(test::GetValueForConfigAndProduct<String>(&table_, "string/foo",ConfigDescription::DefaultConfig(), "no-sdcard"), NotNull());
+ ASSERT_THAT(test::GetValueForConfigAndProduct<String>(&table_, "string/bar", ConfigDescription::DefaultConfig(), ""), NotNull());
+ ASSERT_THAT(test::GetValueForConfigAndProduct<String>(&table_, "string/baz", ConfigDescription::DefaultConfig(), ""), NotNull());
+ ASSERT_THAT(test::GetValueForConfigAndProduct<String>(&table_, "string/bit", ConfigDescription::DefaultConfig(), "phablet"), NotNull());
+ ASSERT_THAT(test::GetValueForConfigAndProduct<String>(&table_, "string/bot", ConfigDescription::DefaultConfig(), "default"), NotNull());
}
TEST_F(ResourceParserTest, AutoIncrementIdsInPublicGroup) {
- std::string input = R"EOF(
- <public-group type="attr" first-id="0x01010040">
- <public name="foo" />
- <public name="bar" />
- </public-group>)EOF";
+ std::string input = R"(
+ <public-group type="attr" first-id="0x01010040">
+ <public name="foo" />
+ <public name="bar" />
+ </public-group>)";
ASSERT_TRUE(TestParse(input));
- Maybe<ResourceTable::SearchResult> result =
- table_.FindResource(test::ParseNameOrDie("attr/foo"));
- AAPT_ASSERT_TRUE(result);
+ Maybe<ResourceTable::SearchResult> result = table_.FindResource(test::ParseNameOrDie("attr/foo"));
+ ASSERT_TRUE(result);
- AAPT_ASSERT_TRUE(result.value().package->id);
- AAPT_ASSERT_TRUE(result.value().type->id);
- AAPT_ASSERT_TRUE(result.value().entry->id);
+ ASSERT_TRUE(result.value().package->id);
+ ASSERT_TRUE(result.value().type->id);
+ ASSERT_TRUE(result.value().entry->id);
ResourceId actual_id(result.value().package->id.value(),
result.value().type->id.value(),
result.value().entry->id.value());
- EXPECT_EQ(ResourceId(0x01010040), actual_id);
+ EXPECT_THAT(actual_id, Eq(ResourceId(0x01010040)));
result = table_.FindResource(test::ParseNameOrDie("attr/bar"));
- AAPT_ASSERT_TRUE(result);
+ ASSERT_TRUE(result);
- AAPT_ASSERT_TRUE(result.value().package->id);
- AAPT_ASSERT_TRUE(result.value().type->id);
- AAPT_ASSERT_TRUE(result.value().entry->id);
+ ASSERT_TRUE(result.value().package->id);
+ ASSERT_TRUE(result.value().type->id);
+ ASSERT_TRUE(result.value().entry->id);
actual_id = ResourceId(result.value().package->id.value(),
result.value().type->id.value(),
result.value().entry->id.value());
- EXPECT_EQ(ResourceId(0x01010041), actual_id);
+ EXPECT_THAT(actual_id, Eq(ResourceId(0x01010041)));
}
TEST_F(ResourceParserTest, ExternalTypesShouldOnlyBeReferences) {
- std::string input =
- R"EOF(<item type="layout" name="foo">@layout/bar</item>)EOF";
- ASSERT_TRUE(TestParse(input));
-
- input = R"EOF(<item type="layout" name="bar">"this is a string"</item>)EOF";
- ASSERT_FALSE(TestParse(input));
+ ASSERT_TRUE(TestParse(R"(<item type="layout" name="foo">@layout/bar</item>)"));
+ ASSERT_FALSE(TestParse(R"(<item type="layout" name="bar">"this is a string"</item>)"));
}
TEST_F(ResourceParserTest, AddResourcesElementShouldAddEntryWithUndefinedSymbol) {
- std::string input = R"EOF(<add-resource name="bar" type="string" />)EOF";
- ASSERT_TRUE(TestParse(input));
+ ASSERT_TRUE(TestParse(R"(<add-resource name="bar" type="string" />)"));
Maybe<ResourceTable::SearchResult> result =
table_.FindResource(test::ParseNameOrDie("string/bar"));
- AAPT_ASSERT_TRUE(result);
+ ASSERT_TRUE(result);
const ResourceEntry* entry = result.value().entry;
- ASSERT_NE(nullptr, entry);
- EXPECT_EQ(SymbolState::kUndefined, entry->symbol_status.state);
+ ASSERT_THAT(entry, NotNull());
+ EXPECT_THAT(entry->symbol_status.state, Eq(SymbolState::kUndefined));
EXPECT_TRUE(entry->symbol_status.allow_new);
}
TEST_F(ResourceParserTest, ParseItemElementWithFormat) {
- std::string input = R"(<item name="foo" type="integer" format="float">0.3</item>)";
- ASSERT_TRUE(TestParse(input));
+ ASSERT_TRUE(TestParse(R"(<item name="foo" type="integer" format="float">0.3</item>)"));
BinaryPrimitive* val = test::GetValue<BinaryPrimitive>(&table_, "integer/foo");
ASSERT_THAT(val, NotNull());
- EXPECT_THAT(val->value.dataType, Eq(android::Res_value::TYPE_FLOAT));
+ EXPECT_THAT(val->value.dataType, Eq(Res_value::TYPE_FLOAT));
- input = R"(<item name="bar" type="integer" format="fraction">100</item>)";
- ASSERT_FALSE(TestParse(input));
+ ASSERT_FALSE(TestParse(R"(<item name="bar" type="integer" format="fraction">100</item>)"));
}
// An <item> without a format specifier accepts all types of values.
TEST_F(ResourceParserTest, ParseItemElementWithoutFormat) {
- std::string input = R"(<item name="foo" type="integer">100%p</item>)";
- ASSERT_TRUE(TestParse(input));
+ ASSERT_TRUE(TestParse(R"(<item name="foo" type="integer">100%p</item>)"));
BinaryPrimitive* val = test::GetValue<BinaryPrimitive>(&table_, "integer/foo");
ASSERT_THAT(val, NotNull());
- EXPECT_THAT(val->value.dataType, Eq(android::Res_value::TYPE_FRACTION));
+ EXPECT_THAT(val->value.dataType, Eq(Res_value::TYPE_FRACTION));
}
TEST_F(ResourceParserTest, ParseConfigVaryingItem) {
- std::string input = R"EOF(<item name="foo" type="configVarying">Hey</item>)EOF";
- ASSERT_TRUE(TestParse(input));
- ASSERT_NE(nullptr, test::GetValue<String>(&table_, "configVarying/foo"));
+ ASSERT_TRUE(TestParse(R"(<item name="foo" type="configVarying">Hey</item>)"));
+ ASSERT_THAT(test::GetValue<String>(&table_, "configVarying/foo"), NotNull());
}
TEST_F(ResourceParserTest, ParseBagElement) {
- std::string input =
- R"EOF(<bag name="bag" type="configVarying"><item name="test">Hello!</item></bag>)EOF";
+ std::string input = R"(
+ <bag name="bag" type="configVarying">
+ <item name="test">Hello!</item>
+ </bag>)";
ASSERT_TRUE(TestParse(input));
Style* val = test::GetValue<Style>(&table_, "configVarying/bag");
- ASSERT_NE(nullptr, val);
+ ASSERT_THAT(val, NotNull());
+ ASSERT_THAT(val->entries, SizeIs(1));
- ASSERT_EQ(1u, val->entries.size());
- EXPECT_EQ(Reference(test::ParseNameOrDie("attr/test")), val->entries[0].key);
- EXPECT_NE(nullptr, ValueCast<RawString>(val->entries[0].value.get()));
+ EXPECT_THAT(val->entries[0].key, Eq(Reference(test::ParseNameOrDie("attr/test"))));
+ EXPECT_THAT(ValueCast<RawString>(val->entries[0].value.get()), NotNull());
}
TEST_F(ResourceParserTest, ParseElementWithNoValue) {
@@ -840,12 +775,11 @@
String* str = test::GetValue<String>(&table_, "string/foo");
ASSERT_THAT(str, NotNull());
- EXPECT_THAT(*str->value, Eq(""));
+ EXPECT_THAT(*str, StrValueEq(""));
}
TEST_F(ResourceParserTest, ParsePlatformIndependentNewline) {
- std::string input = R"(<string name="foo">%1$s %n %2$s</string>)";
- ASSERT_TRUE(TestParse(input));
+ ASSERT_TRUE(TestParse(R"(<string name="foo">%1$s %n %2$s</string>)"));
}
} // namespace aapt
diff --git a/tools/aapt2/ResourceTable.cpp b/tools/aapt2/ResourceTable.cpp
index 168004f..ab59560 100644
--- a/tools/aapt2/ResourceTable.cpp
+++ b/tools/aapt2/ResourceTable.cpp
@@ -15,20 +15,24 @@
*/
#include "ResourceTable.h"
-#include "ConfigDescription.h"
-#include "NameMangler.h"
-#include "ResourceValues.h"
-#include "ValueVisitor.h"
-#include "util/Util.h"
-#include <android-base/logging.h>
-#include <androidfw/ResourceTypes.h>
#include <algorithm>
#include <memory>
#include <string>
#include <tuple>
-using android::StringPiece;
+#include "android-base/logging.h"
+#include "androidfw/ResourceTypes.h"
+
+#include "ConfigDescription.h"
+#include "NameMangler.h"
+#include "ResourceValues.h"
+#include "ValueVisitor.h"
+#include "text/Unicode.h"
+#include "util/Util.h"
+
+using ::aapt::text::IsValidResourceEntryName;
+using ::android::StringPiece;
namespace aapt {
@@ -283,12 +287,9 @@
return CollisionResult::kConflict;
}
-static constexpr const char* kValidNameChars = "._-";
-
static StringPiece ValidateName(const StringPiece& name) {
- auto iter = util::FindNonAlphaNumericAndNotInSet(name, kValidNameChars);
- if (iter != name.end()) {
- return StringPiece(iter, 1);
+ if (!IsValidResourceEntryName(name)) {
+ return name;
}
return {};
}
diff --git a/tools/aapt2/ResourceTable_test.cpp b/tools/aapt2/ResourceTable_test.cpp
index e2b37be..2a3c131 100644
--- a/tools/aapt2/ResourceTable_test.cpp
+++ b/tools/aapt2/ResourceTable_test.cpp
@@ -24,6 +24,8 @@
#include <ostream>
#include <string>
+using ::testing::NotNull;
+
namespace aapt {
TEST(ResourceTableTest, FailToAddResourceWithBadName) {
@@ -56,7 +58,7 @@
test::ValueBuilder<Id>().SetSource("test/path/file.xml", 23u).Build(),
test::GetDiagnostics()));
- ASSERT_NE(nullptr, test::GetValue<Id>(&table, "android:attr/id"));
+ EXPECT_THAT(test::GetValue<Id>(&table, "android:attr/id"), NotNull());
}
TEST(ResourceTableTest, AddMultipleResources) {
@@ -88,11 +90,10 @@
.Build(),
test::GetDiagnostics()));
- ASSERT_NE(nullptr, test::GetValue<Id>(&table, "android:attr/layout_width"));
- ASSERT_NE(nullptr, test::GetValue<Id>(&table, "android:attr/id"));
- ASSERT_NE(nullptr, test::GetValue<Id>(&table, "android:string/ok"));
- ASSERT_NE(nullptr, test::GetValueForConfig<BinaryPrimitive>(
- &table, "android:string/ok", language_config));
+ EXPECT_THAT(test::GetValue<Id>(&table, "android:attr/layout_width"), NotNull());
+ EXPECT_THAT(test::GetValue<Id>(&table, "android:attr/id"), NotNull());
+ EXPECT_THAT(test::GetValue<Id>(&table, "android:string/ok"), NotNull());
+ EXPECT_THAT(test::GetValueForConfig<BinaryPrimitive>(&table, "android:string/ok", language_config), NotNull());
}
TEST(ResourceTableTest, OverrideWeakResourceValue) {
@@ -103,7 +104,7 @@
util::make_unique<Attribute>(true), test::GetDiagnostics()));
Attribute* attr = test::GetValue<Attribute>(&table, "android:attr/foo");
- ASSERT_NE(nullptr, attr);
+ ASSERT_THAT(attr, NotNull());
EXPECT_TRUE(attr->IsWeak());
ASSERT_TRUE(table.AddResource(
@@ -111,7 +112,7 @@
util::make_unique<Attribute>(false), test::GetDiagnostics()));
attr = test::GetValue<Attribute>(&table, "android:attr/foo");
- ASSERT_NE(nullptr, attr);
+ ASSERT_THAT(attr, NotNull());
EXPECT_FALSE(attr->IsWeak());
}
@@ -127,16 +128,12 @@
util::make_unique<Id>(),
test::GetDiagnostics()));
- EXPECT_NE(nullptr, test::GetValueForConfigAndProduct<Id>(
- &table, "android:string/foo",
- test::ParseConfigOrDie("land"), "tablet"));
- EXPECT_NE(nullptr, test::GetValueForConfigAndProduct<Id>(
- &table, "android:string/foo",
- test::ParseConfigOrDie("land"), "phone"));
+ EXPECT_THAT(test::GetValueForConfigAndProduct<Id>(&table, "android:string/foo",test::ParseConfigOrDie("land"), "tablet"), NotNull());
+ EXPECT_THAT(test::GetValueForConfigAndProduct<Id>(&table, "android:string/foo",test::ParseConfigOrDie("land"), "phone"), NotNull());
Maybe<ResourceTable::SearchResult> sr =
table.FindResource(test::ParseNameOrDie("android:string/foo"));
- AAPT_ASSERT_TRUE(sr);
+ ASSERT_TRUE(sr);
std::vector<ResourceConfigValue*> values =
sr.value().entry->FindAllValues(test::ParseConfigOrDie("land"));
ASSERT_EQ(2u, values.size());
diff --git a/tools/aapt2/ResourceUtils.cpp b/tools/aapt2/ResourceUtils.cpp
index deeef6e..6e6a2ba 100644
--- a/tools/aapt2/ResourceUtils.cpp
+++ b/tools/aapt2/ResourceUtils.cpp
@@ -512,7 +512,7 @@
}
std::unique_ptr<BinaryPrimitive> TryParseInt(const StringPiece& str) {
- std::u16string str16 = util::Utf8ToUtf16(str);
+ std::u16string str16 = util::Utf8ToUtf16(util::TrimWhitespace(str));
android::Res_value value;
if (!android::ResTable::stringToInt(str16.data(), str16.size(), &value)) {
return {};
@@ -521,7 +521,7 @@
}
std::unique_ptr<BinaryPrimitive> TryParseFloat(const StringPiece& str) {
- std::u16string str16 = util::Utf8ToUtf16(str);
+ std::u16string str16 = util::Utf8ToUtf16(util::TrimWhitespace(str));
android::Res_value value;
if (!android::ResTable::stringToFloat(str16.data(), str16.size(), &value)) {
return {};
diff --git a/tools/aapt2/ResourceUtils_test.cpp b/tools/aapt2/ResourceUtils_test.cpp
index cdc34f1..e637c3e 100644
--- a/tools/aapt2/ResourceUtils_test.cpp
+++ b/tools/aapt2/ResourceUtils_test.cpp
@@ -20,96 +20,90 @@
#include "test/Test.h"
using ::aapt::test::ValueEq;
+using ::android::Res_value;
+using ::android::ResTable_map;
+using ::testing::Eq;
+using ::testing::NotNull;
using ::testing::Pointee;
namespace aapt {
TEST(ResourceUtilsTest, ParseBool) {
- EXPECT_EQ(Maybe<bool>(true), ResourceUtils::ParseBool("true"));
- EXPECT_EQ(Maybe<bool>(true), ResourceUtils::ParseBool("TRUE"));
- EXPECT_EQ(Maybe<bool>(true), ResourceUtils::ParseBool("True"));
- EXPECT_EQ(Maybe<bool>(false), ResourceUtils::ParseBool("false"));
- EXPECT_EQ(Maybe<bool>(false), ResourceUtils::ParseBool("FALSE"));
- EXPECT_EQ(Maybe<bool>(false), ResourceUtils::ParseBool("False"));
+ EXPECT_THAT(ResourceUtils::ParseBool("true"), Eq(Maybe<bool>(true)));
+ EXPECT_THAT(ResourceUtils::ParseBool("TRUE"), Eq(Maybe<bool>(true)));
+ EXPECT_THAT(ResourceUtils::ParseBool("True"), Eq(Maybe<bool>(true)));
+
+ EXPECT_THAT(ResourceUtils::ParseBool("false"), Eq(Maybe<bool>(false)));
+ EXPECT_THAT(ResourceUtils::ParseBool("FALSE"), Eq(Maybe<bool>(false)));
+ EXPECT_THAT(ResourceUtils::ParseBool("False"), Eq(Maybe<bool>(false)));
+
+ EXPECT_THAT(ResourceUtils::ParseBool(" False\n "), Eq(Maybe<bool>(false)));
}
TEST(ResourceUtilsTest, ParseResourceName) {
ResourceNameRef actual;
bool actual_priv = false;
- EXPECT_TRUE(ResourceUtils::ParseResourceName("android:color/foo", &actual,
- &actual_priv));
- EXPECT_EQ(ResourceNameRef("android", ResourceType::kColor, "foo"), actual);
+ EXPECT_TRUE(ResourceUtils::ParseResourceName("android:color/foo", &actual, &actual_priv));
+ EXPECT_THAT(actual, Eq(ResourceNameRef("android", ResourceType::kColor, "foo")));
EXPECT_FALSE(actual_priv);
- EXPECT_TRUE(
- ResourceUtils::ParseResourceName("color/foo", &actual, &actual_priv));
- EXPECT_EQ(ResourceNameRef({}, ResourceType::kColor, "foo"), actual);
+ EXPECT_TRUE(ResourceUtils::ParseResourceName("color/foo", &actual, &actual_priv));
+ EXPECT_THAT(actual, Eq(ResourceNameRef({}, ResourceType::kColor, "foo")));
EXPECT_FALSE(actual_priv);
- EXPECT_TRUE(ResourceUtils::ParseResourceName("*android:color/foo", &actual,
- &actual_priv));
- EXPECT_EQ(ResourceNameRef("android", ResourceType::kColor, "foo"), actual);
+ EXPECT_TRUE(ResourceUtils::ParseResourceName("*android:color/foo", &actual, &actual_priv));
+ EXPECT_THAT(actual, Eq(ResourceNameRef("android", ResourceType::kColor, "foo")));
EXPECT_TRUE(actual_priv);
EXPECT_FALSE(ResourceUtils::ParseResourceName(android::StringPiece(), &actual, &actual_priv));
}
TEST(ResourceUtilsTest, ParseReferenceWithNoPackage) {
- ResourceNameRef expected({}, ResourceType::kColor, "foo");
ResourceNameRef actual;
bool create = false;
bool private_ref = false;
- EXPECT_TRUE(ResourceUtils::ParseReference("@color/foo", &actual, &create,
- &private_ref));
- EXPECT_EQ(expected, actual);
+ EXPECT_TRUE(ResourceUtils::ParseReference("@color/foo", &actual, &create, &private_ref));
+ EXPECT_THAT(actual, Eq(ResourceNameRef({}, ResourceType::kColor, "foo")));
EXPECT_FALSE(create);
EXPECT_FALSE(private_ref);
}
TEST(ResourceUtilsTest, ParseReferenceWithPackage) {
- ResourceNameRef expected("android", ResourceType::kColor, "foo");
ResourceNameRef actual;
bool create = false;
bool private_ref = false;
- EXPECT_TRUE(ResourceUtils::ParseReference("@android:color/foo", &actual,
- &create, &private_ref));
- EXPECT_EQ(expected, actual);
+ EXPECT_TRUE(ResourceUtils::ParseReference("@android:color/foo", &actual, &create, &private_ref));
+ EXPECT_THAT(actual, Eq(ResourceNameRef("android", ResourceType::kColor, "foo")));
EXPECT_FALSE(create);
EXPECT_FALSE(private_ref);
}
TEST(ResourceUtilsTest, ParseReferenceWithSurroundingWhitespace) {
- ResourceNameRef expected("android", ResourceType::kColor, "foo");
ResourceNameRef actual;
bool create = false;
bool private_ref = false;
- EXPECT_TRUE(ResourceUtils::ParseReference("\t @android:color/foo\n \n\t",
- &actual, &create, &private_ref));
- EXPECT_EQ(expected, actual);
+ EXPECT_TRUE(ResourceUtils::ParseReference("\t @android:color/foo\n \n\t", &actual, &create, &private_ref));
+ EXPECT_THAT(actual, Eq(ResourceNameRef("android", ResourceType::kColor, "foo")));
EXPECT_FALSE(create);
EXPECT_FALSE(private_ref);
}
TEST(ResourceUtilsTest, ParseAutoCreateIdReference) {
- ResourceNameRef expected("android", ResourceType::kId, "foo");
ResourceNameRef actual;
bool create = false;
bool private_ref = false;
- EXPECT_TRUE(ResourceUtils::ParseReference("@+android:id/foo", &actual,
- &create, &private_ref));
- EXPECT_EQ(expected, actual);
+ EXPECT_TRUE(ResourceUtils::ParseReference("@+android:id/foo", &actual, &create, &private_ref));
+ EXPECT_THAT(actual, Eq(ResourceNameRef("android", ResourceType::kId, "foo")));
EXPECT_TRUE(create);
EXPECT_FALSE(private_ref);
}
TEST(ResourceUtilsTest, ParsePrivateReference) {
- ResourceNameRef expected("android", ResourceType::kId, "foo");
ResourceNameRef actual;
bool create = false;
bool private_ref = false;
- EXPECT_TRUE(ResourceUtils::ParseReference("@*android:id/foo", &actual,
- &create, &private_ref));
- EXPECT_EQ(expected, actual);
+ EXPECT_TRUE(ResourceUtils::ParseReference("@*android:id/foo", &actual, &create, &private_ref));
+ EXPECT_THAT(actual, Eq(ResourceNameRef("android", ResourceType::kId, "foo")));
EXPECT_FALSE(create);
EXPECT_TRUE(private_ref);
}
@@ -118,8 +112,7 @@
bool create = false;
bool private_ref = false;
ResourceNameRef actual;
- EXPECT_FALSE(ResourceUtils::ParseReference("@+android:color/foo", &actual,
- &create, &private_ref));
+ EXPECT_FALSE(ResourceUtils::ParseReference("@+android:color/foo", &actual, &create, &private_ref));
}
TEST(ResourceUtilsTest, ParseAttributeReferences) {
@@ -143,82 +136,81 @@
}
TEST(ResourceUtilsTest, ParseStyleParentReference) {
- const ResourceName kAndroidStyleFooName("android", ResourceType::kStyle,
- "foo");
+ const ResourceName kAndroidStyleFooName("android", ResourceType::kStyle, "foo");
const ResourceName kStyleFooName({}, ResourceType::kStyle, "foo");
std::string err_str;
- Maybe<Reference> ref =
- ResourceUtils::ParseStyleParentReference("@android:style/foo", &err_str);
- AAPT_ASSERT_TRUE(ref);
- EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName);
+ Maybe<Reference> ref = ResourceUtils::ParseStyleParentReference("@android:style/foo", &err_str);
+ ASSERT_TRUE(ref);
+ EXPECT_THAT(ref.value().name, Eq(make_value(kAndroidStyleFooName)));
ref = ResourceUtils::ParseStyleParentReference("@style/foo", &err_str);
- AAPT_ASSERT_TRUE(ref);
- EXPECT_EQ(ref.value().name.value(), kStyleFooName);
+ ASSERT_TRUE(ref);
+ EXPECT_THAT(ref.value().name, Eq(make_value(kStyleFooName)));
- ref =
- ResourceUtils::ParseStyleParentReference("?android:style/foo", &err_str);
- AAPT_ASSERT_TRUE(ref);
- EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName);
+ ref = ResourceUtils::ParseStyleParentReference("?android:style/foo", &err_str);
+ ASSERT_TRUE(ref);
+ EXPECT_THAT(ref.value().name, Eq(make_value(kAndroidStyleFooName)));
ref = ResourceUtils::ParseStyleParentReference("?style/foo", &err_str);
- AAPT_ASSERT_TRUE(ref);
- EXPECT_EQ(ref.value().name.value(), kStyleFooName);
+ ASSERT_TRUE(ref);
+ EXPECT_THAT(ref.value().name, Eq(make_value(kStyleFooName)));
ref = ResourceUtils::ParseStyleParentReference("android:style/foo", &err_str);
- AAPT_ASSERT_TRUE(ref);
- EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName);
+ ASSERT_TRUE(ref);
+ EXPECT_THAT(ref.value().name, Eq(make_value(kAndroidStyleFooName)));
ref = ResourceUtils::ParseStyleParentReference("android:foo", &err_str);
- AAPT_ASSERT_TRUE(ref);
- EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName);
+ ASSERT_TRUE(ref);
+ EXPECT_THAT(ref.value().name, Eq(make_value(kAndroidStyleFooName)));
ref = ResourceUtils::ParseStyleParentReference("@android:foo", &err_str);
- AAPT_ASSERT_TRUE(ref);
- EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName);
+ ASSERT_TRUE(ref);
+ EXPECT_THAT(ref.value().name, Eq(make_value(kAndroidStyleFooName)));
ref = ResourceUtils::ParseStyleParentReference("foo", &err_str);
- AAPT_ASSERT_TRUE(ref);
- EXPECT_EQ(ref.value().name.value(), kStyleFooName);
+ ASSERT_TRUE(ref);
+ EXPECT_THAT(ref.value().name, Eq(make_value(kStyleFooName)));
- ref =
- ResourceUtils::ParseStyleParentReference("*android:style/foo", &err_str);
- AAPT_ASSERT_TRUE(ref);
- EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName);
+ ref = ResourceUtils::ParseStyleParentReference("*android:style/foo", &err_str);
+ ASSERT_TRUE(ref);
+ EXPECT_THAT(ref.value().name, Eq(make_value(kAndroidStyleFooName)));
EXPECT_TRUE(ref.value().private_reference);
}
TEST(ResourceUtilsTest, ParseEmptyFlag) {
std::unique_ptr<Attribute> attr =
test::AttributeBuilder(false)
- .SetTypeMask(android::ResTable_map::TYPE_FLAGS)
+ .SetTypeMask(ResTable_map::TYPE_FLAGS)
.AddItem("one", 0x01)
.AddItem("two", 0x02)
.Build();
- std::unique_ptr<BinaryPrimitive> result =
- ResourceUtils::TryParseFlagSymbol(attr.get(), "");
- ASSERT_NE(nullptr, result);
- EXPECT_EQ(0u, result->value.data);
+ std::unique_ptr<BinaryPrimitive> result = ResourceUtils::TryParseFlagSymbol(attr.get(), "");
+ ASSERT_THAT(result, NotNull());
+ EXPECT_THAT(result->value.data, Eq(0u));
}
TEST(ResourceUtilsTest, NullIsEmptyReference) {
- auto null_value = ResourceUtils::MakeNull();
- ASSERT_THAT(null_value, Pointee(ValueEq(Reference())));
-
- auto value = ResourceUtils::TryParseNullOrEmpty("@null");
- ASSERT_THAT(value, Pointee(ValueEq(Reference())));
+ ASSERT_THAT(ResourceUtils::MakeNull(), Pointee(ValueEq(Reference())));
+ ASSERT_THAT(ResourceUtils::TryParseNullOrEmpty("@null"), Pointee(ValueEq(Reference())));
}
TEST(ResourceUtilsTest, EmptyIsBinaryPrimitive) {
- auto empty_value = ResourceUtils::MakeEmpty();
- ASSERT_THAT(empty_value, Pointee(ValueEq(BinaryPrimitive(android::Res_value::TYPE_NULL,
- android::Res_value::DATA_NULL_EMPTY))));
+ ASSERT_THAT(ResourceUtils::MakeEmpty(), Pointee(ValueEq(BinaryPrimitive(Res_value::TYPE_NULL, Res_value::DATA_NULL_EMPTY))));
+ ASSERT_THAT(ResourceUtils::TryParseNullOrEmpty("@empty"), Pointee(ValueEq(BinaryPrimitive(Res_value::TYPE_NULL, Res_value::DATA_NULL_EMPTY))));
+}
- auto value = ResourceUtils::TryParseNullOrEmpty("@empty");
- ASSERT_THAT(value, Pointee(ValueEq(BinaryPrimitive(android::Res_value::TYPE_NULL,
- android::Res_value::DATA_NULL_EMPTY))));
+TEST(ResourceUtilsTest, ItemsWithWhitespaceAreParsedCorrectly) {
+ EXPECT_THAT(ResourceUtils::TryParseItemForAttribute(" 12\n ", ResTable_map::TYPE_INTEGER),
+ Pointee(ValueEq(BinaryPrimitive(Res_value::TYPE_INT_DEC, 12u))));
+ EXPECT_THAT(ResourceUtils::TryParseItemForAttribute(" true\n ", ResTable_map::TYPE_BOOLEAN),
+ Pointee(ValueEq(BinaryPrimitive(Res_value::TYPE_INT_BOOLEAN, 0xffffffffu))));
+
+ const float expected_float = 12.0f;
+ const uint32_t expected_float_flattened = *(uint32_t*)&expected_float;
+ EXPECT_THAT(ResourceUtils::TryParseItemForAttribute(" 12.0\n ", ResTable_map::TYPE_FLOAT),
+ Pointee(ValueEq(BinaryPrimitive(Res_value::TYPE_FLOAT, expected_float_flattened))));
}
} // namespace aapt
diff --git a/tools/aapt2/ResourceValues.cpp b/tools/aapt2/ResourceValues.cpp
index e808984..947e091 100644
--- a/tools/aapt2/ResourceValues.cpp
+++ b/tools/aapt2/ResourceValues.cpp
@@ -533,75 +533,119 @@
}
}
-static void BuildAttributeMismatchMessage(DiagMessage* msg,
- const Attribute* attr,
- const Item* value) {
- *msg << "expected";
- if (attr->type_mask & android::ResTable_map::TYPE_BOOLEAN) {
- *msg << " boolean";
+static void BuildAttributeMismatchMessage(const Attribute& attr, const Item& value,
+ DiagMessage* out_msg) {
+ *out_msg << "expected";
+ if (attr.type_mask & android::ResTable_map::TYPE_BOOLEAN) {
+ *out_msg << " boolean";
}
- if (attr->type_mask & android::ResTable_map::TYPE_COLOR) {
- *msg << " color";
+ if (attr.type_mask & android::ResTable_map::TYPE_COLOR) {
+ *out_msg << " color";
}
- if (attr->type_mask & android::ResTable_map::TYPE_DIMENSION) {
- *msg << " dimension";
+ if (attr.type_mask & android::ResTable_map::TYPE_DIMENSION) {
+ *out_msg << " dimension";
}
- if (attr->type_mask & android::ResTable_map::TYPE_ENUM) {
- *msg << " enum";
+ if (attr.type_mask & android::ResTable_map::TYPE_ENUM) {
+ *out_msg << " enum";
}
- if (attr->type_mask & android::ResTable_map::TYPE_FLAGS) {
- *msg << " flags";
+ if (attr.type_mask & android::ResTable_map::TYPE_FLAGS) {
+ *out_msg << " flags";
}
- if (attr->type_mask & android::ResTable_map::TYPE_FLOAT) {
- *msg << " float";
+ if (attr.type_mask & android::ResTable_map::TYPE_FLOAT) {
+ *out_msg << " float";
}
- if (attr->type_mask & android::ResTable_map::TYPE_FRACTION) {
- *msg << " fraction";
+ if (attr.type_mask & android::ResTable_map::TYPE_FRACTION) {
+ *out_msg << " fraction";
}
- if (attr->type_mask & android::ResTable_map::TYPE_INTEGER) {
- *msg << " integer";
+ if (attr.type_mask & android::ResTable_map::TYPE_INTEGER) {
+ *out_msg << " integer";
}
- if (attr->type_mask & android::ResTable_map::TYPE_REFERENCE) {
- *msg << " reference";
+ if (attr.type_mask & android::ResTable_map::TYPE_REFERENCE) {
+ *out_msg << " reference";
}
- if (attr->type_mask & android::ResTable_map::TYPE_STRING) {
- *msg << " string";
+ if (attr.type_mask & android::ResTable_map::TYPE_STRING) {
+ *out_msg << " string";
}
- *msg << " but got " << *value;
+ *out_msg << " but got " << value;
}
-bool Attribute::Matches(const Item* item, DiagMessage* out_msg) const {
+bool Attribute::Matches(const Item& item, DiagMessage* out_msg) const {
+ constexpr const uint32_t TYPE_ENUM = android::ResTable_map::TYPE_ENUM;
+ constexpr const uint32_t TYPE_FLAGS = android::ResTable_map::TYPE_FLAGS;
+ constexpr const uint32_t TYPE_INTEGER = android::ResTable_map::TYPE_INTEGER;
+ constexpr const uint32_t TYPE_REFERENCE = android::ResTable_map::TYPE_REFERENCE;
+
android::Res_value val = {};
- item->Flatten(&val);
+ item.Flatten(&val);
+
+ const uint32_t flattened_data = util::DeviceToHost32(val.data);
// Always allow references.
- const uint32_t mask = type_mask | android::ResTable_map::TYPE_REFERENCE;
- if (!(mask & ResourceUtils::AndroidTypeToAttributeTypeMask(val.dataType))) {
+ const uint32_t actual_type = ResourceUtils::AndroidTypeToAttributeTypeMask(val.dataType);
+
+ // Only one type must match between the actual and expected.
+ if ((actual_type & (type_mask | TYPE_REFERENCE)) == 0) {
if (out_msg) {
- BuildAttributeMismatchMessage(out_msg, this, item);
+ BuildAttributeMismatchMessage(*this, item, out_msg);
}
return false;
+ }
- } else if (ResourceUtils::AndroidTypeToAttributeTypeMask(val.dataType) &
- android::ResTable_map::TYPE_INTEGER) {
- if (static_cast<int32_t>(util::DeviceToHost32(val.data)) < min_int) {
+ // Enums and flags are encoded as integers, so check them first before doing any range checks.
+ if ((type_mask & TYPE_ENUM) != 0 && (actual_type & TYPE_ENUM) != 0) {
+ for (const Symbol& s : symbols) {
+ if (flattened_data == s.value) {
+ return true;
+ }
+ }
+
+ // If the attribute accepts integers, we can't fail here.
+ if ((type_mask & TYPE_INTEGER) == 0) {
if (out_msg) {
- *out_msg << *item << " is less than minimum integer " << min_int;
+ *out_msg << item << " is not a valid enum";
}
return false;
- } else if (static_cast<int32_t>(util::DeviceToHost32(val.data)) > max_int) {
+ }
+ }
+
+ if ((type_mask & TYPE_FLAGS) != 0 && (actual_type & TYPE_FLAGS) != 0) {
+ uint32_t mask = 0u;
+ for (const Symbol& s : symbols) {
+ mask |= s.value;
+ }
+
+ // Check if the flattened data is covered by the flag bit mask.
+ // If the attribute accepts integers, we can't fail here.
+ if ((mask & flattened_data) == flattened_data) {
+ return true;
+ } else if ((type_mask & TYPE_INTEGER) == 0) {
if (out_msg) {
- *out_msg << *item << " is greater than maximum integer " << max_int;
+ *out_msg << item << " is not a valid flag";
+ }
+ return false;
+ }
+ }
+
+ // Finally check the integer range of the value.
+ if ((type_mask & TYPE_INTEGER) != 0 && (actual_type & TYPE_INTEGER) != 0) {
+ if (static_cast<int32_t>(flattened_data) < min_int) {
+ if (out_msg) {
+ *out_msg << item << " is less than minimum integer " << min_int;
+ }
+ return false;
+ } else if (static_cast<int32_t>(flattened_data) > max_int) {
+ if (out_msg) {
+ *out_msg << item << " is greater than maximum integer " << max_int;
}
return false;
}
diff --git a/tools/aapt2/ResourceValues.h b/tools/aapt2/ResourceValues.h
index ac5795f..7e7547f 100644
--- a/tools/aapt2/ResourceValues.h
+++ b/tools/aapt2/ResourceValues.h
@@ -264,7 +264,7 @@
Attribute* Clone(StringPool* new_pool) const override;
void PrintMask(std::ostream* out) const;
void Print(std::ostream* out) const override;
- bool Matches(const Item* item, DiagMessage* out_msg) const;
+ bool Matches(const Item& item, DiagMessage* out_msg = nullptr) const;
};
struct Style : public BaseValue<Style> {
diff --git a/tools/aapt2/ResourceValues_test.cpp b/tools/aapt2/ResourceValues_test.cpp
index 69f8e67..06c3404 100644
--- a/tools/aapt2/ResourceValues_test.cpp
+++ b/tools/aapt2/ResourceValues_test.cpp
@@ -190,4 +190,52 @@
EXPECT_EQ(0x0u, value.data);
}
+TEST(ResourcesValuesTest, AttributeMatches) {
+ constexpr const uint32_t TYPE_DIMENSION = android::ResTable_map::TYPE_DIMENSION;
+ constexpr const uint32_t TYPE_ENUM = android::ResTable_map::TYPE_ENUM;
+ constexpr const uint32_t TYPE_FLAGS = android::ResTable_map::TYPE_FLAGS;
+ constexpr const uint32_t TYPE_INTEGER = android::ResTable_map::TYPE_INTEGER;
+ constexpr const uint8_t TYPE_INT_DEC = android::Res_value::TYPE_INT_DEC;
+
+ Attribute attr1(false /*weak*/, TYPE_DIMENSION);
+ EXPECT_FALSE(attr1.Matches(*ResourceUtils::TryParseColor("#7fff00")));
+ EXPECT_TRUE(attr1.Matches(*ResourceUtils::TryParseFloat("23dp")));
+ EXPECT_TRUE(attr1.Matches(*ResourceUtils::TryParseReference("@android:string/foo")));
+
+ Attribute attr2(false /*weak*/, TYPE_INTEGER | TYPE_ENUM);
+ attr2.min_int = 0;
+ attr2.symbols.push_back(Attribute::Symbol{Reference(test::ParseNameOrDie("android:id/foo")),
+ static_cast<uint32_t>(-1)});
+ EXPECT_FALSE(attr2.Matches(*ResourceUtils::TryParseColor("#7fff00")));
+ EXPECT_TRUE(attr2.Matches(BinaryPrimitive(TYPE_INT_DEC, static_cast<uint32_t>(-1))));
+ EXPECT_TRUE(attr2.Matches(BinaryPrimitive(TYPE_INT_DEC, 1u)));
+ EXPECT_FALSE(attr2.Matches(BinaryPrimitive(TYPE_INT_DEC, static_cast<uint32_t>(-2))));
+
+ Attribute attr3(false /*weak*/, TYPE_INTEGER | TYPE_FLAGS);
+ attr3.max_int = 100;
+ attr3.symbols.push_back(
+ Attribute::Symbol{Reference(test::ParseNameOrDie("android:id/foo")), 0x01u});
+ attr3.symbols.push_back(
+ Attribute::Symbol{Reference(test::ParseNameOrDie("android:id/bar")), 0x02u});
+ attr3.symbols.push_back(
+ Attribute::Symbol{Reference(test::ParseNameOrDie("android:id/baz")), 0x04u});
+ attr3.symbols.push_back(
+ Attribute::Symbol{Reference(test::ParseNameOrDie("android:id/bat")), 0x80u});
+ EXPECT_FALSE(attr3.Matches(*ResourceUtils::TryParseColor("#7fff00")));
+ EXPECT_TRUE(attr3.Matches(BinaryPrimitive(TYPE_INT_DEC, 0x01u | 0x02u)));
+ EXPECT_TRUE(attr3.Matches(BinaryPrimitive(TYPE_INT_DEC, 0x01u | 0x02u | 0x80u)));
+
+ // Not a flag, but a value less than max_int.
+ EXPECT_TRUE(attr3.Matches(BinaryPrimitive(TYPE_INT_DEC, 0x08u)));
+
+ // Not a flag and greater than max_int.
+ EXPECT_FALSE(attr3.Matches(BinaryPrimitive(TYPE_INT_DEC, 127u)));
+
+ Attribute attr4(false /*weak*/, TYPE_ENUM);
+ attr4.symbols.push_back(
+ Attribute::Symbol{Reference(test::ParseNameOrDie("android:id/foo")), 0x01u});
+ EXPECT_TRUE(attr4.Matches(BinaryPrimitive(TYPE_INT_DEC, 0x01u)));
+ EXPECT_FALSE(attr4.Matches(BinaryPrimitive(TYPE_INT_DEC, 0x02u)));
+}
+
} // namespace aapt
diff --git a/tools/aapt2/SdkConstants.h b/tools/aapt2/SdkConstants.h
index e3745e8..864e57d 100644
--- a/tools/aapt2/SdkConstants.h
+++ b/tools/aapt2/SdkConstants.h
@@ -52,6 +52,7 @@
SDK_NOUGAT = 24,
SDK_NOUGAT_MR1 = 25,
SDK_O = 26,
+ SDK_O_MR1 = 10000, // STOPSHIP Replace with the real version.
};
ApiVersion FindAttributeSdkLevel(const ResourceId& id);
diff --git a/tools/aapt2/cmd/Link.cpp b/tools/aapt2/cmd/Link.cpp
index 740a401..e6bf3a6 100644
--- a/tools/aapt2/cmd/Link.cpp
+++ b/tools/aapt2/cmd/Link.cpp
@@ -989,7 +989,8 @@
manifest_class->GetCommentBuilder()->AppendComment(proper_annotation);
}
- const std::string& package_utf8 = context_->GetCompilationPackage();
+ const std::string package_utf8 =
+ options_.custom_java_package.value_or_default(context_->GetCompilationPackage());
std::string out_path = options_.generate_java_class_path.value();
file::AppendPath(&out_path, file::PackageToPath(package_utf8));
diff --git a/tools/aapt2/cmd/Optimize.cpp b/tools/aapt2/cmd/Optimize.cpp
index 194c0c8..9d71775 100644
--- a/tools/aapt2/cmd/Optimize.cpp
+++ b/tools/aapt2/cmd/Optimize.cpp
@@ -17,6 +17,7 @@
#include <memory>
#include <vector>
+#include "android-base/stringprintf.h"
#include "androidfw/StringPiece.h"
#include "Diagnostics.h"
@@ -26,6 +27,8 @@
#include "SdkConstants.h"
#include "ValueVisitor.h"
#include "cmd/Util.h"
+#include "configuration/ConfigurationParser.h"
+#include "filter/AbiFilter.h"
#include "flatten/TableFlattener.h"
#include "flatten/XmlFlattener.h"
#include "io/BigBufferInputStream.h"
@@ -33,14 +36,21 @@
#include "optimize/ResourceDeduper.h"
#include "optimize/VersionCollapser.h"
#include "split/TableSplitter.h"
+#include "util/Files.h"
-using android::StringPiece;
+using ::aapt::configuration::Abi;
+using ::aapt::configuration::Artifact;
+using ::aapt::configuration::PostProcessingConfiguration;
+using ::android::StringPiece;
+using ::android::base::StringPrintf;
namespace aapt {
struct OptimizeOptions {
// Path to the output APK.
- std::string output_path;
+ Maybe<std::string> output_path;
+ // Path to the output APK directory for splits.
+ Maybe<std::string> output_dir;
// Details of the app extracted from the AndroidManifest.xml
AppInfo app_info;
@@ -55,6 +65,8 @@
std::vector<SplitConstraints> split_constraints;
TableFlattenerOptions table_flattener_options;
+
+ Maybe<PostProcessingConfiguration> configuration;
};
class OptimizeContext : public IAaptContext {
@@ -175,10 +187,52 @@
++split_constraints_iter;
}
- std::unique_ptr<IArchiveWriter> writer =
- CreateZipFileArchiveWriter(context_->GetDiagnostics(), options_.output_path);
- if (!apk->WriteToArchive(context_, options_.table_flattener_options, writer.get())) {
- return 1;
+ if (options_.configuration && options_.output_dir) {
+ PostProcessingConfiguration& config = options_.configuration.value();
+
+ // For now, just write out the stripped APK since ABI splitting doesn't modify anything else.
+ for (const Artifact& artifact : config.artifacts) {
+ if (artifact.abi_group) {
+ const std::string& group = artifact.abi_group.value();
+
+ auto abi_group = config.abi_groups.find(group);
+ // TODO: Remove validation when configuration parser ensures referential integrity.
+ if (abi_group == config.abi_groups.end()) {
+ context_->GetDiagnostics()->Note(
+ DiagMessage() << "could not find referenced ABI group '" << group << "'");
+ return 1;
+ }
+ FilterChain filters;
+ filters.AddFilter(AbiFilter::FromAbiList(abi_group->second));
+
+ const std::string& path = apk->GetSource().path;
+ const StringPiece ext = file::GetExtension(path);
+ const std::string name = path.substr(0, path.rfind(ext.to_string()));
+
+ // Name is hard coded for now since only one split dimension is supported.
+ // TODO: Incorporate name generation into the configuration objects.
+ const std::string file_name =
+ StringPrintf("%s.%s%s", name.c_str(), group.c_str(), ext.data());
+ std::string out = options_.output_dir.value();
+ file::AppendPath(&out, file_name);
+
+ std::unique_ptr<IArchiveWriter> writer =
+ CreateZipFileArchiveWriter(context_->GetDiagnostics(), out);
+
+ if (!apk->WriteToArchive(context_, options_.table_flattener_options, &filters,
+ writer.get())) {
+ return 1;
+ }
+ }
+ }
+ }
+
+ if (options_.output_path) {
+ std::unique_ptr<IArchiveWriter> writer =
+ CreateZipFileArchiveWriter(context_->GetDiagnostics(), options_.output_path.value());
+ if (!apk->WriteToArchive(context_, options_.table_flattener_options, writer.get())) {
+ return 1;
+ }
}
return 0;
@@ -214,8 +268,8 @@
if (file_ref->file == nullptr) {
ResourceNameRef name(pkg->name, type->type, entry->name);
context_->GetDiagnostics()->Warn(DiagMessage(file_ref->GetSource())
- << "file for resource " << name << " with config '"
- << config_value->config << "' not found");
+ << "file for resource " << name << " with config '"
+ << config_value->config << "' not found");
continue;
}
@@ -293,13 +347,16 @@
int Optimize(const std::vector<StringPiece>& args) {
OptimizeContext context;
OptimizeOptions options;
+ Maybe<std::string> config_path;
Maybe<std::string> target_densities;
std::vector<std::string> configs;
std::vector<std::string> split_args;
bool verbose = false;
Flags flags =
Flags()
- .RequiredFlag("-o", "Path to the output APK.", &options.output_path)
+ .OptionalFlag("-o", "Path to the output APK.", &options.output_path)
+ .OptionalFlag("-d", "Path to the output directory (for splits).", &options.output_dir)
+ .OptionalFlag("-x", "Path to XML configuration file.", &config_path)
.OptionalFlag(
"--target-densities",
"Comma separated list of the screen densities that the APK will be optimized for.\n"
@@ -369,6 +426,22 @@
}
}
+ if (config_path) {
+ if (!options.output_dir) {
+ context.GetDiagnostics()->Error(
+ DiagMessage() << "Output directory is required when using a configuration file");
+ return 1;
+ }
+ std::string& path = config_path.value();
+ Maybe<ConfigurationParser> for_path = ConfigurationParser::ForPath(path);
+ if (for_path) {
+ options.configuration = for_path.value().WithDiagnostics(context.GetDiagnostics()).Parse();
+ } else {
+ context.GetDiagnostics()->Error(DiagMessage() << "Could not parse config file " << path);
+ return 1;
+ }
+ }
+
if (!ExtractAppDataFromManifest(&context, apk.get(), &options)) {
return 1;
}
diff --git a/tools/aapt2/compile/IdAssigner_test.cpp b/tools/aapt2/compile/IdAssigner_test.cpp
index d465091..5cff004 100644
--- a/tools/aapt2/compile/IdAssigner_test.cpp
+++ b/tools/aapt2/compile/IdAssigner_test.cpp
@@ -64,12 +64,12 @@
// Expect to fill in the gaps between 0x0101XXXX and 0x0104XXXX.
maybe_result = table->FindResource(test::ParseNameOrDie("android:dimen/two"));
- AAPT_ASSERT_TRUE(maybe_result);
+ ASSERT_TRUE(maybe_result);
EXPECT_EQ(make_value<uint8_t>(2), maybe_result.value().type->id);
maybe_result =
table->FindResource(test::ParseNameOrDie("android:integer/three"));
- AAPT_ASSERT_TRUE(maybe_result);
+ ASSERT_TRUE(maybe_result);
EXPECT_EQ(make_value<uint8_t>(3), maybe_result.value().type->id);
// Expect to bypass the reserved 0x0104XXXX IDs and use the next 0x0105XXXX
@@ -77,17 +77,17 @@
maybe_result =
table->FindResource(test::ParseNameOrDie("android:string/five"));
- AAPT_ASSERT_TRUE(maybe_result);
+ ASSERT_TRUE(maybe_result);
EXPECT_EQ(make_value<uint8_t>(5), maybe_result.value().type->id);
// Expect to fill in the gaps between 0x01040000 and 0x01040006.
maybe_result = table->FindResource(test::ParseNameOrDie("android:attr/bar"));
- AAPT_ASSERT_TRUE(maybe_result);
+ ASSERT_TRUE(maybe_result);
EXPECT_EQ(make_value<uint16_t>(1), maybe_result.value().entry->id);
maybe_result = table->FindResource(test::ParseNameOrDie("android:attr/baz"));
- AAPT_ASSERT_TRUE(maybe_result);
+ ASSERT_TRUE(maybe_result);
EXPECT_EQ(make_value<uint16_t>(2), maybe_result.value().entry->id);
}
@@ -121,7 +121,7 @@
ASSERT_TRUE(VerifyIds(table.get()));
Maybe<ResourceTable::SearchResult> result =
table->FindResource(test::ParseNameOrDie("android:attr/foo"));
- AAPT_ASSERT_TRUE(result);
+ ASSERT_TRUE(result);
const ResourceTable::SearchResult& search_result = result.value();
EXPECT_EQ(make_value<uint8_t>(0x01), search_result.package->id);
diff --git a/tools/aapt2/compile/Pseudolocalizer.cpp b/tools/aapt2/compile/Pseudolocalizer.cpp
index 15a3d8c..3a515fa 100644
--- a/tools/aapt2/compile/Pseudolocalizer.cpp
+++ b/tools/aapt2/compile/Pseudolocalizer.cpp
@@ -445,9 +445,15 @@
std::string result;
bool lastspace = true;
bool space = true;
+ bool escape = false;
+ const char ESCAPE_CHAR = '\\';
for (size_t i = 0; i < source.size(); i++) {
char c = s[i];
- space = isspace(c);
+ if (!escape && c == ESCAPE_CHAR) {
+ escape = true;
+ continue;
+ }
+ space = (!escape && isspace(c)) || (escape && (c == 'n' || c == 't'));
if (lastspace && !space) {
// Word start
result += kRlm + kRlo;
@@ -456,6 +462,10 @@
result += kPdf + kRlm;
}
lastspace = space;
+ if (escape) {
+ result.append(&ESCAPE_CHAR, 1);
+ escape=false;
+ }
result.append(&c, 1);
}
if (!lastspace) {
diff --git a/tools/aapt2/compile/Pseudolocalizer_test.cpp b/tools/aapt2/compile/Pseudolocalizer_test.cpp
index d3b7b02..65d2472 100644
--- a/tools/aapt2/compile/Pseudolocalizer_test.cpp
+++ b/tools/aapt2/compile/Pseudolocalizer_test.cpp
@@ -97,6 +97,11 @@
"\xe2\x80\x8f\xE2\x80\xaehello\xE2\x80\xac\xe2\x80\x8f\n"
" \xe2\x80\x8f\xE2\x80\xaeworld\xE2\x80\xac\xe2\x80\x8f\n",
Pseudolocalizer::Method::kBidi));
+ EXPECT_TRUE(
+ SimpleHelper("hello\\nworld\\n",
+ "\xe2\x80\x8f\xE2\x80\xaehello\xE2\x80\xac\xe2\x80\x8f\\n"
+ "\xe2\x80\x8f\xE2\x80\xaeworld\xE2\x80\xac\xe2\x80\x8f\\n",
+ Pseudolocalizer::Method::kBidi));
}
TEST(PseudolocalizerTest, SimpleICU) {
diff --git a/tools/aapt2/configuration/ConfigurationParser.cpp b/tools/aapt2/configuration/ConfigurationParser.cpp
index 89618d3..d051120 100644
--- a/tools/aapt2/configuration/ConfigurationParser.cpp
+++ b/tools/aapt2/configuration/ConfigurationParser.cpp
@@ -18,13 +18,18 @@
#include <algorithm>
#include <functional>
+#include <map>
#include <memory>
#include <utility>
+#include <android-base/file.h>
#include <android-base/logging.h>
#include "ConfigDescription.h"
#include "Diagnostics.h"
+#include "io/File.h"
+#include "io/FileSystem.h"
+#include "util/Maybe.h"
#include "util/Util.h"
#include "xml/XmlActionExecutor.h"
#include "xml/XmlDom.h"
@@ -38,10 +43,12 @@
using ::aapt::configuration::AndroidManifest;
using ::aapt::configuration::AndroidSdk;
using ::aapt::configuration::Artifact;
-using ::aapt::configuration::Configuration;
+using ::aapt::configuration::PostProcessingConfiguration;
using ::aapt::configuration::GlTexture;
using ::aapt::configuration::Group;
using ::aapt::configuration::Locale;
+using ::aapt::io::IFile;
+using ::aapt::io::RegularFile;
using ::aapt::util::TrimWhitespace;
using ::aapt::xml::Element;
using ::aapt::xml::FindRootElement;
@@ -49,16 +56,17 @@
using ::aapt::xml::XmlActionExecutor;
using ::aapt::xml::XmlActionExecutorPolicy;
using ::aapt::xml::XmlNodeAction;
+using ::android::base::ReadFileToString;
-const std::unordered_map<std::string, Abi> kAbiMap = {
- {"armeabi", Abi::kArmeV6},
- {"armeabi-v7a", Abi::kArmV7a},
- {"arm64-v8a", Abi::kArm64V8a},
- {"x86", Abi::kX86},
- {"x86_64", Abi::kX86_64},
- {"mips", Abi::kMips},
- {"mips64", Abi::kMips64},
- {"universal", Abi::kUniversal},
+const std::unordered_map<std::string, Abi> kStringToAbiMap = {
+ {"armeabi", Abi::kArmeV6}, {"armeabi-v7a", Abi::kArmV7a}, {"arm64-v8a", Abi::kArm64V8a},
+ {"x86", Abi::kX86}, {"x86_64", Abi::kX86_64}, {"mips", Abi::kMips},
+ {"mips64", Abi::kMips64}, {"universal", Abi::kUniversal},
+};
+const std::map<Abi, std::string> kAbiToStringMap = {
+ {Abi::kArmeV6, "armeabi"}, {Abi::kArmV7a, "armeabi-v7a"}, {Abi::kArm64V8a, "arm64-v8a"},
+ {Abi::kX86, "x86"}, {Abi::kX86_64, "x86_64"}, {Abi::kMips, "mips"},
+ {Abi::kMips64, "mips64"}, {Abi::kUniversal, "universal"},
};
constexpr const char* kAaptXmlNs = "http://schemas.android.com/tools/aapt";
@@ -96,12 +104,84 @@
} // namespace
+namespace configuration {
+
+const std::string& AbiToString(Abi abi) {
+ return kAbiToStringMap.find(abi)->second;
+}
+
+/**
+ * Attempts to replace the placeholder in the name string with the provided value. Returns true on
+ * success, or false if the either the placeholder is not found in the name, or the value is not
+ * present and the placeholder was.
+ */
+static bool ReplacePlaceholder(const std::string& placeholder, const Maybe<std::string>& value,
+ std::string* name, IDiagnostics* diag) {
+ size_t offset = name->find(placeholder);
+ if (value) {
+ if (offset == std::string::npos) {
+ diag->Error(DiagMessage() << "Missing placeholder for artifact: " << placeholder);
+ return false;
+ }
+ name->replace(offset, placeholder.length(), value.value());
+ return true;
+ }
+
+ // Make sure the placeholder was not present if the desired value was not present.
+ bool result = (offset == std::string::npos);
+ if (!result) {
+ diag->Error(DiagMessage() << "Placeholder present but no value for artifact: " << placeholder);
+ }
+ return result;
+}
+
+Maybe<std::string> Artifact::ToArtifactName(const std::string& format, IDiagnostics* diag) const {
+ std::string result = format;
+
+ if (!ReplacePlaceholder("{abi}", abi_group, &result, diag)) {
+ return {};
+ }
+
+ if (!ReplacePlaceholder("{density}", screen_density_group, &result, diag)) {
+ return {};
+ }
+
+ if (!ReplacePlaceholder("{locale}", locale_group, &result, diag)) {
+ return {};
+ }
+
+ if (!ReplacePlaceholder("{sdk}", android_sdk_group, &result, diag)) {
+ return {};
+ }
+
+ if (!ReplacePlaceholder("{feature}", device_feature_group, &result, diag)) {
+ return {};
+ }
+
+ if (!ReplacePlaceholder("{gl}", gl_texture_group, &result, diag)) {
+ return {};
+ }
+
+ return result;
+}
+
+} // namespace configuration
+
+/** Returns a ConfigurationParser for the file located at the provided path. */
+Maybe<ConfigurationParser> ConfigurationParser::ForPath(const std::string& path) {
+ std::string contents;
+ if (!ReadFileToString(path, &contents, true)) {
+ return {};
+ }
+ return ConfigurationParser(contents);
+}
+
ConfigurationParser::ConfigurationParser(std::string contents)
: contents_(std::move(contents)),
diag_(&noop_) {
}
-Maybe<Configuration> ConfigurationParser::Parse() {
+Maybe<PostProcessingConfiguration> ConfigurationParser::Parse() {
std::istringstream in(contents_);
auto doc = xml::Inflate(&in, diag_, Source("config.xml"));
@@ -133,10 +213,11 @@
XmlNodeAction& artifacts_action = root_action["artifacts"];
XmlNodeAction& groups_action = root_action["groups"];
- Configuration config;
+ PostProcessingConfiguration config;
// Helper to bind a static method to an action handler in the DOM executor.
- auto bind_handler = [&config](std::function<bool(Configuration*, Element*, IDiagnostics*)> h)
+ auto bind_handler =
+ [&config](std::function<bool(PostProcessingConfiguration*, Element*, IDiagnostics*)> h)
-> XmlNodeAction::ActionFuncWithDiag {
return std::bind(h, &config, std::placeholders::_1, std::placeholders::_2);
};
@@ -158,275 +239,266 @@
return {};
}
+ // TODO: Validate all references in the configuration are valid. It should be safe to assume from
+ // this point on that any references from one section to another will be present.
+
return {config};
}
ConfigurationParser::ActionHandler ConfigurationParser::artifact_handler_ =
- [](Configuration* config, Element* root_element, IDiagnostics* diag) -> bool {
- Artifact artifact{};
- for (const auto& attr : root_element->attributes) {
- if (attr.name == "name") {
- artifact.name = attr.value;
- } else if (attr.name == "abi-group") {
- artifact.abi_group = {attr.value};
- } else if (attr.name == "screen-density-group") {
- artifact.screen_density_group = {attr.value};
- } else if (attr.name == "locale-group") {
- artifact.locale_group = {attr.value};
- } else if (attr.name == "android-sdk-group") {
- artifact.android_sdk_group = {attr.value};
- } else if (attr.name == "gl-texture-group") {
- artifact.gl_texture_group = {attr.value};
- } else if (attr.name == "device-feature-group") {
- artifact.device_feature_group = {attr.value};
- } else {
- diag->Note(
- DiagMessage() << "Unknown artifact attribute: " << attr.name << " = " << attr.value);
- }
- }
- config->artifacts[artifact.name] = artifact;
- return true;
- };
+ [](PostProcessingConfiguration* config, Element* root_element, IDiagnostics* diag) -> bool {
+ Artifact artifact{};
+ for (const auto& attr : root_element->attributes) {
+ if (attr.name == "name") {
+ artifact.name = attr.value;
+ } else if (attr.name == "abi-group") {
+ artifact.abi_group = {attr.value};
+ } else if (attr.name == "screen-density-group") {
+ artifact.screen_density_group = {attr.value};
+ } else if (attr.name == "locale-group") {
+ artifact.locale_group = {attr.value};
+ } else if (attr.name == "android-sdk-group") {
+ artifact.android_sdk_group = {attr.value};
+ } else if (attr.name == "gl-texture-group") {
+ artifact.gl_texture_group = {attr.value};
+ } else if (attr.name == "device-feature-group") {
+ artifact.device_feature_group = {attr.value};
+ } else {
+ diag->Note(DiagMessage() << "Unknown artifact attribute: " << attr.name << " = "
+ << attr.value);
+ }
+ }
+ config->artifacts.push_back(artifact);
+ return true;
+};
ConfigurationParser::ActionHandler ConfigurationParser::artifact_format_handler_ =
- [](Configuration* config, Element* root_element, IDiagnostics* diag) -> bool {
- for (auto& node : root_element->children) {
+ [](PostProcessingConfiguration* config, Element* root_element, IDiagnostics* diag) -> bool {
+ for (auto& node : root_element->children) {
+ xml::Text* t;
+ if ((t = NodeCast<xml::Text>(node.get())) != nullptr) {
+ config->artifact_format = TrimWhitespace(t->text).to_string();
+ break;
+ }
+ }
+ return true;
+};
+
+ConfigurationParser::ActionHandler ConfigurationParser::abi_group_handler_ =
+ [](PostProcessingConfiguration* config, Element* root_element, IDiagnostics* diag) -> bool {
+ std::string label = GetLabel(root_element, diag);
+ if (label.empty()) {
+ return false;
+ }
+
+ auto& group = config->abi_groups[label];
+ bool valid = true;
+
+ for (auto* child : root_element->GetChildElements()) {
+ if (child->name != "abi") {
+ diag->Error(DiagMessage() << "Unexpected element in ABI group: " << child->name);
+ valid = false;
+ } else {
+ for (auto& node : child->children) {
xml::Text* t;
if ((t = NodeCast<xml::Text>(node.get())) != nullptr) {
- config->artifact_format = TrimWhitespace(t->text).to_string();
+ group.push_back(kStringToAbiMap.at(TrimWhitespace(t->text).to_string()));
break;
}
}
- return true;
- };
+ }
+ }
-ConfigurationParser::ActionHandler ConfigurationParser::abi_group_handler_ =
- [](Configuration* config, Element* root_element, IDiagnostics* diag) -> bool {
- std::string label = GetLabel(root_element, diag);
- if (label.empty()) {
- return false;
- }
-
- auto& group = config->abi_groups[label];
- bool valid = true;
-
- for (auto* child : root_element->GetChildElements()) {
- if (child->name != "abi") {
- diag->Error(
- DiagMessage() << "Unexpected element in ABI group: " << child->name);
- valid = false;
- } else {
- for (auto& node : child->children) {
- xml::Text* t;
- if ((t = NodeCast<xml::Text>(node.get())) != nullptr) {
- group.push_back(kAbiMap.at(TrimWhitespace(t->text).to_string()));
- break;
- }
- }
- }
- }
-
- return valid;
- };
+ return valid;
+};
ConfigurationParser::ActionHandler ConfigurationParser::screen_density_group_handler_ =
- [](Configuration* config, Element* root_element, IDiagnostics* diag) -> bool {
- std::string label = GetLabel(root_element, diag);
- if (label.empty()) {
- return false;
- }
+ [](PostProcessingConfiguration* config, Element* root_element, IDiagnostics* diag) -> bool {
+ std::string label = GetLabel(root_element, diag);
+ if (label.empty()) {
+ return false;
+ }
- auto& group = config->screen_density_groups[label];
- bool valid = true;
+ auto& group = config->screen_density_groups[label];
+ bool valid = true;
- for (auto* child : root_element->GetChildElements()) {
- if (child->name != "screen-density") {
- diag->Error(
- DiagMessage() << "Unexpected root_element in screen density group: "
- << child->name);
- valid = false;
- } else {
- for (auto& node : child->children) {
- xml::Text* t;
- if ((t = NodeCast<xml::Text>(node.get())) != nullptr) {
- ConfigDescription config_descriptor;
- const android::StringPiece& text = TrimWhitespace(t->text);
- if (ConfigDescription::Parse(text, &config_descriptor)) {
- // Copy the density with the minimum SDK version stripped out.
- group.push_back(config_descriptor.CopyWithoutSdkVersion());
- } else {
- diag->Error(
- DiagMessage() << "Could not parse config descriptor for screen-density: "
- << text);
- valid = false;
- }
- break;
- }
+ for (auto* child : root_element->GetChildElements()) {
+ if (child->name != "screen-density") {
+ diag->Error(DiagMessage() << "Unexpected root_element in screen density group: "
+ << child->name);
+ valid = false;
+ } else {
+ for (auto& node : child->children) {
+ xml::Text* t;
+ if ((t = NodeCast<xml::Text>(node.get())) != nullptr) {
+ ConfigDescription config_descriptor;
+ const android::StringPiece& text = TrimWhitespace(t->text);
+ if (ConfigDescription::Parse(text, &config_descriptor)) {
+ // Copy the density with the minimum SDK version stripped out.
+ group.push_back(config_descriptor.CopyWithoutSdkVersion());
+ } else {
+ diag->Error(DiagMessage()
+ << "Could not parse config descriptor for screen-density: " << text);
+ valid = false;
}
+ break;
}
}
+ }
+ }
- return valid;
- };
+ return valid;
+};
ConfigurationParser::ActionHandler ConfigurationParser::locale_group_handler_ =
- [](Configuration* config, Element* root_element, IDiagnostics* diag) -> bool {
- std::string label = GetLabel(root_element, diag);
- if (label.empty()) {
- return false;
- }
+ [](PostProcessingConfiguration* config, Element* root_element, IDiagnostics* diag) -> bool {
+ std::string label = GetLabel(root_element, diag);
+ if (label.empty()) {
+ return false;
+ }
- auto& group = config->locale_groups[label];
- bool valid = true;
+ auto& group = config->locale_groups[label];
+ bool valid = true;
- for (auto* child : root_element->GetChildElements()) {
- if (child->name != "locale") {
- diag->Error(
- DiagMessage() << "Unexpected root_element in screen density group: "
- << child->name);
- valid = false;
+ for (auto* child : root_element->GetChildElements()) {
+ if (child->name != "locale") {
+ diag->Error(DiagMessage() << "Unexpected root_element in screen density group: "
+ << child->name);
+ valid = false;
+ } else {
+ Locale entry;
+ for (const auto& attr : child->attributes) {
+ if (attr.name == "lang") {
+ entry.lang = {attr.value};
+ } else if (attr.name == "region") {
+ entry.region = {attr.value};
} else {
- Locale entry;
- for (const auto& attr : child->attributes) {
- if (attr.name == "lang") {
- entry.lang = {attr.value};
- } else if (attr.name == "region") {
- entry.region = {attr.value};
- } else {
- diag->Warn(DiagMessage() << "Unknown attribute: " << attr.name
- << " = " << attr.value);
- }
- }
- group.push_back(entry);
+ diag->Warn(DiagMessage() << "Unknown attribute: " << attr.name << " = " << attr.value);
}
}
+ group.push_back(entry);
+ }
+ }
- return valid;
- };
+ return valid;
+};
ConfigurationParser::ActionHandler ConfigurationParser::android_sdk_group_handler_ =
- [](Configuration* config, Element* root_element, IDiagnostics* diag) -> bool {
- std::string label = GetLabel(root_element, diag);
- if (label.empty()) {
- return false;
- }
+ [](PostProcessingConfiguration* config, Element* root_element, IDiagnostics* diag) -> bool {
+ std::string label = GetLabel(root_element, diag);
+ if (label.empty()) {
+ return false;
+ }
- auto& group = config->android_sdk_groups[label];
- bool valid = true;
+ auto& group = config->android_sdk_groups[label];
+ bool valid = true;
- for (auto* child : root_element->GetChildElements()) {
- if (child->name != "android-sdk") {
- diag->Error(
- DiagMessage() << "Unexpected root_element in ABI group: " << child->name);
- valid = false;
+ for (auto* child : root_element->GetChildElements()) {
+ if (child->name != "android-sdk") {
+ diag->Error(DiagMessage() << "Unexpected root_element in ABI group: " << child->name);
+ valid = false;
+ } else {
+ AndroidSdk entry;
+ for (const auto& attr : child->attributes) {
+ if (attr.name == "minSdkVersion") {
+ entry.min_sdk_version = {attr.value};
+ } else if (attr.name == "targetSdkVersion") {
+ entry.target_sdk_version = {attr.value};
+ } else if (attr.name == "maxSdkVersion") {
+ entry.max_sdk_version = {attr.value};
} else {
- AndroidSdk entry;
- for (const auto& attr : child->attributes) {
- if (attr.name == "minSdkVersion") {
- entry.min_sdk_version = {attr.value};
- } else if (attr.name == "targetSdkVersion") {
- entry.target_sdk_version = {attr.value};
- } else if (attr.name == "maxSdkVersion") {
- entry.max_sdk_version = {attr.value};
- } else {
- diag->Warn(DiagMessage() << "Unknown attribute: " << attr.name
- << " = " << attr.value);
- }
- }
-
- // TODO: Fill in the manifest details when they are finalised.
- for (auto node : child->GetChildElements()) {
- if (node->name == "manifest") {
- if (entry.manifest) {
- diag->Warn(DiagMessage() << "Found multiple manifest tags. Ignoring duplicates.");
- continue;
- }
- entry.manifest = {AndroidManifest()};
- }
- }
-
- group.push_back(entry);
+ diag->Warn(DiagMessage() << "Unknown attribute: " << attr.name << " = " << attr.value);
}
}
- return valid;
- };
+ // TODO: Fill in the manifest details when they are finalised.
+ for (auto node : child->GetChildElements()) {
+ if (node->name == "manifest") {
+ if (entry.manifest) {
+ diag->Warn(DiagMessage() << "Found multiple manifest tags. Ignoring duplicates.");
+ continue;
+ }
+ entry.manifest = {AndroidManifest()};
+ }
+ }
+
+ group.push_back(entry);
+ }
+ }
+
+ return valid;
+};
ConfigurationParser::ActionHandler ConfigurationParser::gl_texture_group_handler_ =
- [](Configuration* config, Element* root_element, IDiagnostics* diag) -> bool {
- std::string label = GetLabel(root_element, diag);
- if (label.empty()) {
- return false;
+ [](PostProcessingConfiguration* config, Element* root_element, IDiagnostics* diag) -> bool {
+ std::string label = GetLabel(root_element, diag);
+ if (label.empty()) {
+ return false;
+ }
+
+ auto& group = config->gl_texture_groups[label];
+ bool valid = true;
+
+ GlTexture result;
+ for (auto* child : root_element->GetChildElements()) {
+ if (child->name != "gl-texture") {
+ diag->Error(DiagMessage() << "Unexpected element in GL texture group: " << child->name);
+ valid = false;
+ } else {
+ for (const auto& attr : child->attributes) {
+ if (attr.name == "name") {
+ result.name = attr.value;
+ break;
+ }
}
- auto& group = config->gl_texture_groups[label];
- bool valid = true;
-
- GlTexture result;
- for (auto* child : root_element->GetChildElements()) {
- if (child->name != "gl-texture") {
- diag->Error(
- DiagMessage() << "Unexpected element in GL texture group: "
- << child->name);
+ for (auto* element : child->GetChildElements()) {
+ if (element->name != "texture-path") {
+ diag->Error(DiagMessage() << "Unexpected element in gl-texture element: " << child->name);
valid = false;
- } else {
- for (const auto& attr : child->attributes) {
- if (attr.name == "name") {
- result.name = attr.value;
- break;
- }
- }
-
- for (auto* element : child->GetChildElements()) {
- if (element->name != "texture-path") {
- diag->Error(
- DiagMessage() << "Unexpected element in gl-texture element: "
- << child->name);
- valid = false;
- continue;
- }
- for (auto& node : element->children) {
- xml::Text* t;
- if ((t = NodeCast<xml::Text>(node.get())) != nullptr) {
- result.texture_paths.push_back(TrimWhitespace(t->text).to_string());
- }
- }
+ continue;
+ }
+ for (auto& node : element->children) {
+ xml::Text* t;
+ if ((t = NodeCast<xml::Text>(node.get())) != nullptr) {
+ result.texture_paths.push_back(TrimWhitespace(t->text).to_string());
}
}
- group.push_back(result);
}
+ }
+ group.push_back(result);
+ }
- return valid;
- };
+ return valid;
+};
ConfigurationParser::ActionHandler ConfigurationParser::device_feature_group_handler_ =
- [](Configuration* config, Element* root_element, IDiagnostics* diag) -> bool {
- std::string label = GetLabel(root_element, diag);
- if (label.empty()) {
- return false;
- }
+ [](PostProcessingConfiguration* config, Element* root_element, IDiagnostics* diag) -> bool {
+ std::string label = GetLabel(root_element, diag);
+ if (label.empty()) {
+ return false;
+ }
- auto& group = config->device_feature_groups[label];
- bool valid = true;
+ auto& group = config->device_feature_groups[label];
+ bool valid = true;
- for (auto* child : root_element->GetChildElements()) {
- if (child->name != "supports-feature") {
- diag->Error(
- DiagMessage() << "Unexpected root_element in device feature group: "
- << child->name);
- valid = false;
- } else {
- for (auto& node : child->children) {
- xml::Text* t;
- if ((t = NodeCast<xml::Text>(node.get())) != nullptr) {
- group.push_back(TrimWhitespace(t->text).to_string());
- break;
- }
- }
+ for (auto* child : root_element->GetChildElements()) {
+ if (child->name != "supports-feature") {
+ diag->Error(DiagMessage() << "Unexpected root_element in device feature group: "
+ << child->name);
+ valid = false;
+ } else {
+ for (auto& node : child->children) {
+ xml::Text* t;
+ if ((t = NodeCast<xml::Text>(node.get())) != nullptr) {
+ group.push_back(TrimWhitespace(t->text).to_string());
+ break;
}
}
+ }
+ }
- return valid;
- };
+ return valid;
+};
} // namespace aapt
diff --git a/tools/aapt2/configuration/ConfigurationParser.h b/tools/aapt2/configuration/ConfigurationParser.h
index 0fb2f71..28c355e 100644
--- a/tools/aapt2/configuration/ConfigurationParser.h
+++ b/tools/aapt2/configuration/ConfigurationParser.h
@@ -20,8 +20,9 @@
#include <string>
#include <unordered_map>
#include <vector>
-#include <ConfigDescription.h>
+#include "ConfigDescription.h"
+#include "Diagnostics.h"
#include "util/Maybe.h"
namespace aapt {
@@ -48,6 +49,9 @@
Maybe<std::string> device_feature_group;
/** If present, uses the OpenGL texture group with this name. */
Maybe<std::string> gl_texture_group;
+
+ /** Convert an artifact name template into a name string based on configuration contents. */
+ Maybe<std::string> ToArtifactName(const std::string& format, IDiagnostics* diag) const;
};
/** Enumeration of currently supported ABIs. */
@@ -62,6 +66,9 @@
kUniversal
};
+/** Helper method to convert an ABI to a string representing the path within the APK. */
+const std::string& AbiToString(Abi abi);
+
/**
* Represents an individual locale. When a locale is included, it must be
* declared from least specific to most specific, as a region does not make
@@ -114,11 +121,10 @@
}
};
-/**
- * AAPT2 XML configuration binary representation.
- */
-struct Configuration {
- std::unordered_map<std::string, Artifact> artifacts;
+/** AAPT2 XML configuration file binary representation. */
+struct PostProcessingConfiguration {
+ // TODO: Support named artifacts?
+ std::vector<Artifact> artifacts;
Maybe<std::string> artifact_format;
Group<Abi> abi_groups;
@@ -142,18 +148,16 @@
*/
class ConfigurationParser {
public:
+
+ /** Returns a ConfigurationParser for the file located at the provided path. */
+ static Maybe<ConfigurationParser> ForPath(const std::string& path);
+
/** Returns a ConfigurationParser for the configuration in the provided file contents. */
static ConfigurationParser ForContents(const std::string& contents) {
ConfigurationParser parser{contents};
return parser;
}
- /** Returns a ConfigurationParser for the file located at the provided path. */
- static ConfigurationParser ForPath(const std::string& path) {
- // TODO: Read XML file into memory.
- return ForContents(path);
- }
-
/** Sets the diagnostics context to use when parsing. */
ConfigurationParser& WithDiagnostics(IDiagnostics* diagnostics) {
diag_ = diagnostics;
@@ -164,7 +168,7 @@
* Parses the configuration file and returns the results. If the configuration could not be parsed
* the result is empty and any errors will be displayed with the provided diagnostics context.
*/
- Maybe<configuration::Configuration> Parse();
+ Maybe<configuration::PostProcessingConfiguration> Parse();
protected:
/**
@@ -183,9 +187,8 @@
* An ActionHandler for processing XML elements in the XmlActionExecutor. Returns true if the
* element was successfully processed, otherwise returns false.
*/
- using ActionHandler = std::function<bool(configuration::Configuration* config,
- xml::Element* element,
- IDiagnostics* diag)>;
+ using ActionHandler = std::function<bool(configuration::PostProcessingConfiguration* config,
+ xml::Element* element, IDiagnostics* diag)>;
/** Handler for <artifact> tags. */
static ActionHandler artifact_handler_;
@@ -213,4 +216,4 @@
} // namespace aapt
-#endif //AAPT2_CONFIGURATION_H
+#endif // AAPT2_CONFIGURATION_H
diff --git a/tools/aapt2/configuration/ConfigurationParser_test.cpp b/tools/aapt2/configuration/ConfigurationParser_test.cpp
index 72a97b2..fb71e98 100644
--- a/tools/aapt2/configuration/ConfigurationParser_test.cpp
+++ b/tools/aapt2/configuration/ConfigurationParser_test.cpp
@@ -32,7 +32,8 @@
using android::ResTable_config;
using configuration::Abi;
using configuration::AndroidSdk;
-using configuration::Configuration;
+using configuration::Artifact;
+using configuration::PostProcessingConfiguration;
using configuration::DeviceFeature;
using configuration::GlTexture;
using configuration::Locale;
@@ -130,11 +131,16 @@
StdErrDiagnostics diag_;
};
+TEST_F(ConfigurationParserTest, ForPath_NoFile) {
+ auto result = ConfigurationParser::ForPath("./does_not_exist.xml");
+ EXPECT_FALSE(result);
+}
+
TEST_F(ConfigurationParserTest, ValidateFile) {
auto parser = ConfigurationParser::ForContents(kValidConfig).WithDiagnostics(&diag_);
auto result = parser.Parse();
ASSERT_TRUE(result);
- Configuration& value = result.value();
+ PostProcessingConfiguration& value = result.value();
EXPECT_EQ(2ul, value.artifacts.size());
ASSERT_TRUE(value.artifact_format);
EXPECT_EQ(
@@ -185,13 +191,13 @@
auto doc = test::BuildXmlDom(xml);
- Configuration config;
+ PostProcessingConfiguration config;
bool ok = artifact_handler_(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
ASSERT_TRUE(ok);
EXPECT_EQ(1ul, config.artifacts.size());
- auto& artifact = config.artifacts.begin()->second;
+ auto& artifact = config.artifacts.front();
EXPECT_EQ("", artifact.name); // TODO: make this fail.
EXPECT_EQ("arm", artifact.abi_group.value());
EXPECT_EQ("large", artifact.screen_density_group.value());
@@ -199,6 +205,21 @@
EXPECT_EQ("19", artifact.android_sdk_group.value());
EXPECT_EQ("dxt1", artifact.gl_texture_group.value());
EXPECT_EQ("low-latency", artifact.device_feature_group.value());
+
+ // Perform a second action to ensure we get 2 artifacts.
+ static constexpr const char* second = R"xml(
+ <artifact
+ abi-group="other"
+ screen-density-group="large"
+ locale-group="europe"
+ android-sdk-group="19"
+ gl-texture-group="dxt1"
+ device-feature-group="low-latency"/>)xml";
+ doc = test::BuildXmlDom(second);
+
+ ok = artifact_handler_(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
+ ASSERT_TRUE(ok);
+ EXPECT_EQ(2ul, config.artifacts.size());
}
TEST_F(ConfigurationParserTest, ArtifactFormatAction) {
@@ -209,7 +230,7 @@
auto doc = test::BuildXmlDom(xml);
- Configuration config;
+ PostProcessingConfiguration config;
bool ok = artifact_format_handler_(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
ASSERT_TRUE(ok);
ASSERT_TRUE(config.artifact_format);
@@ -232,7 +253,7 @@
auto doc = test::BuildXmlDom(xml);
- Configuration config;
+ PostProcessingConfiguration config;
bool ok = abi_group_handler_(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
ASSERT_TRUE(ok);
@@ -255,7 +276,7 @@
auto doc = test::BuildXmlDom(xml);
- Configuration config;
+ PostProcessingConfiguration config;
bool ok =
screen_density_group_handler_(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
ASSERT_TRUE(ok);
@@ -285,7 +306,7 @@
auto doc = test::BuildXmlDom(xml);
- Configuration config;
+ PostProcessingConfiguration config;
bool ok = locale_group_handler_(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
ASSERT_TRUE(ok);
@@ -321,7 +342,7 @@
auto doc = test::BuildXmlDom(xml);
- Configuration config;
+ PostProcessingConfiguration config;
bool ok = android_sdk_group_handler_(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
ASSERT_TRUE(ok);
@@ -353,7 +374,7 @@
auto doc = test::BuildXmlDom(xml);
- Configuration config;
+ PostProcessingConfiguration config;
bool ok = gl_texture_group_handler_(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
ASSERT_TRUE(ok);
@@ -382,7 +403,7 @@
auto doc = test::BuildXmlDom(xml);
- Configuration config;
+ PostProcessingConfiguration config;
bool ok
= device_feature_group_handler_(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
ASSERT_TRUE(ok);
@@ -397,5 +418,55 @@
ASSERT_THAT(out, ElementsAre(low_latency, pro));
}
+TEST(ArtifactTest, Simple) {
+ StdErrDiagnostics diag;
+ Artifact x86;
+ x86.abi_group = {"x86"};
+
+ auto x86_result = x86.ToArtifactName("something.{abi}.apk", &diag);
+ ASSERT_TRUE(x86_result);
+ EXPECT_EQ(x86_result.value(), "something.x86.apk");
+
+ Artifact arm;
+ arm.abi_group = {"armeabi-v7a"};
+
+ auto arm_result = arm.ToArtifactName("app.{abi}.apk", &diag);
+ ASSERT_TRUE(arm_result);
+ EXPECT_EQ(arm_result.value(), "app.armeabi-v7a.apk");
+}
+
+TEST(ArtifactTest, Complex) {
+ StdErrDiagnostics diag;
+ Artifact artifact;
+ artifact.abi_group = {"mips64"};
+ artifact.screen_density_group = {"ldpi"};
+ artifact.device_feature_group = {"df1"};
+ artifact.gl_texture_group = {"glx1"};
+ artifact.locale_group = {"en-AU"};
+ artifact.android_sdk_group = {"26"};
+
+ auto result =
+ artifact.ToArtifactName("app.{density}_{locale}_{feature}_{gl}.sdk{sdk}.{abi}.apk", &diag);
+ ASSERT_TRUE(result);
+ EXPECT_EQ(result.value(), "app.ldpi_en-AU_df1_glx1.sdk26.mips64.apk");
+}
+
+TEST(ArtifactTest, Missing) {
+ StdErrDiagnostics diag;
+ Artifact x86;
+ x86.abi_group = {"x86"};
+
+ EXPECT_FALSE(x86.ToArtifactName("something.{density}.apk", &diag));
+ EXPECT_FALSE(x86.ToArtifactName("something.apk", &diag));
+}
+
+TEST(ArtifactTest, Empty) {
+ StdErrDiagnostics diag;
+ Artifact artifact;
+
+ EXPECT_FALSE(artifact.ToArtifactName("something.{density}.apk", &diag));
+ EXPECT_TRUE(artifact.ToArtifactName("something.apk", &diag));
+}
+
} // namespace
} // namespace aapt
diff --git a/tools/aapt2/configuration/example/config.xml b/tools/aapt2/configuration/example/config.xml
index a8360f8..ce31e61 100644
--- a/tools/aapt2/configuration/example/config.xml
+++ b/tools/aapt2/configuration/example/config.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" ?>
-<post-process xmlns="http://schemas.android.com/tools/aapt2">
+<post-process xmlns="http://schemas.android.com/tools/aapt">
<groups>
<abi-group label="arm">
<abi>armeabi-v7a</abi>
diff --git a/tools/aapt2/filter/AbiFilter.cpp b/tools/aapt2/filter/AbiFilter.cpp
new file mode 100644
index 0000000..cb96235
--- /dev/null
+++ b/tools/aapt2/filter/AbiFilter.cpp
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#include "AbiFilter.h"
+
+#include <memory>
+
+#include "io/Util.h"
+
+namespace aapt {
+
+std::unique_ptr<AbiFilter> AbiFilter::FromAbiList(const std::vector<configuration::Abi>& abi_list) {
+ std::unordered_set<std::string> abi_set;
+ for (auto& abi : abi_list) {
+ abi_set.insert(configuration::AbiToString(abi));
+ }
+ // Make unique by hand as the constructor is private.
+ return std::unique_ptr<AbiFilter>(new AbiFilter(abi_set));
+}
+
+bool AbiFilter::Keep(const std::string& path) {
+ // We only care about libraries.
+ if (!util::StartsWith(path, kLibPrefix)) {
+ return true;
+ }
+
+ auto abi_end = path.find('/', kLibPrefixLen);
+ if (abi_end == std::string::npos) {
+ // Ignore any files in the top level lib directory.
+ return true;
+ }
+
+ // Strip the lib/ prefix.
+ const std::string& path_abi = path.substr(kLibPrefixLen, abi_end - kLibPrefixLen);
+ return (abis_.find(path_abi) != abis_.end());
+}
+
+} // namespace aapt
diff --git a/tools/aapt2/filter/AbiFilter.h b/tools/aapt2/filter/AbiFilter.h
new file mode 100644
index 0000000..d875cb2
--- /dev/null
+++ b/tools/aapt2/filter/AbiFilter.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#ifndef AAPT2_ABISPLITTER_H
+#define AAPT2_ABISPLITTER_H
+
+#include <memory>
+#include <string>
+#include <unordered_set>
+#include <vector>
+
+#include "configuration/ConfigurationParser.h"
+#include "filter/Filter.h"
+
+namespace aapt {
+
+/**
+ * Filters native library paths by ABI. ABIs present in the filter list are kept and all over
+ * libraries are removed. The filter is only applied to native library paths (this under lib/).
+ */
+class AbiFilter : public IPathFilter {
+ public:
+ /** Factory method to create a filter from a list of configuration::Abi. */
+ static std::unique_ptr<AbiFilter> FromAbiList(const std::vector<configuration::Abi>& abi_list);
+
+ /** Returns true if the path is for a native library in the list of desired ABIs. */
+ bool Keep(const std::string& path) override;
+
+ private:
+ explicit AbiFilter(std::unordered_set<std::string> abis) : abis_(std::move(abis)) {
+ }
+
+ /** The path prefix to where all native libs end up inside an APK file. */
+ static constexpr const char* kLibPrefix = "lib/";
+ static constexpr size_t kLibPrefixLen = 4;
+ const std::unordered_set<std::string> abis_;
+};
+
+} // namespace aapt
+
+#endif // AAPT2_ABISPLITTER_H
diff --git a/tools/aapt2/filter/AbiFilter_test.cpp b/tools/aapt2/filter/AbiFilter_test.cpp
new file mode 100644
index 0000000..0c8ea35
--- /dev/null
+++ b/tools/aapt2/filter/AbiFilter_test.cpp
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#include "filter/AbiFilter.h"
+
+#include <string>
+
+#include "gtest/gtest.h"
+
+namespace aapt {
+namespace {
+
+using ::aapt::configuration::Abi;
+
+struct TestData {
+ std::string path;
+ bool kept;
+};
+
+const TestData kTestData[] = {
+ /* Keep. */
+ {"lib/mips/libnative.so", true},
+ {"not/native/file.txt", true},
+ // Not sure if this is a valid use case.
+ {"lib/listing.txt", true},
+ {"lib/mips/foo/bar/baz.so", true},
+ {"lib/mips/x86/foo.so", true},
+ /* Discard. */
+ {"lib/mips_horse/foo.so", false},
+ {"lib/horse_mips/foo.so", false},
+ {"lib/mips64/armeabi-v7a/foo.so", false},
+ {"lib/mips64/x86_64/x86.so", false},
+ {"lib/x86/libnative.so", false},
+ {"lib/x86/foo/bar/baz.so", false},
+ {"lib/x86/x86/foo.so", false},
+ {"lib/x86_horse/foo.so", false},
+ {"lib/horse_x86/foo.so", false},
+ {"lib/x86/armeabi-v7a/foo.so", false},
+ {"lib/x86_64/x86_64/x86.so", false},
+};
+
+class AbiFilterTest : public ::testing::TestWithParam<TestData> {};
+
+TEST_P(AbiFilterTest, Keep) {
+ auto mips = AbiFilter::FromAbiList({Abi::kMips});
+ const TestData& data = GetParam();
+ EXPECT_EQ(mips->Keep(data.path), data.kept);
+}
+
+INSTANTIATE_TEST_CASE_P(NativePaths, AbiFilterTest, ::testing::ValuesIn(kTestData));
+
+} // namespace
+} // namespace aapt
diff --git a/tools/aapt2/filter/Filter.h b/tools/aapt2/filter/Filter.h
new file mode 100644
index 0000000..d737dc9
--- /dev/null
+++ b/tools/aapt2/filter/Filter.h
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#ifndef AAPT2_FILTER_H
+#define AAPT2_FILTER_H
+
+#include <string>
+#include <vector>
+
+#include "util/Util.h"
+
+namespace aapt {
+
+/** A filter to be applied to a path segment. */
+class IPathFilter {
+ public:
+ ~IPathFilter() = default;
+
+ /** Returns true if the path should be kept. */
+ virtual bool Keep(const std::string& path) = 0;
+};
+
+/**
+ * Path filter that keeps anything that matches the provided prefix.
+ */
+class PrefixFilter : public IPathFilter {
+ public:
+ explicit PrefixFilter(std::string prefix) : prefix_(std::move(prefix)) {
+ }
+
+ /** Returns true if the provided path matches the prefix. */
+ bool Keep(const std::string& path) override {
+ return util::StartsWith(path, prefix_);
+ }
+
+ private:
+ const std::string prefix_;
+};
+
+/** Applies a set of IPathFilters to a path and returns true iif all filters keep the path. */
+class FilterChain : public IPathFilter {
+ public:
+ /** Adds a filter to the list to be applied to each path. */
+ void AddFilter(std::unique_ptr<IPathFilter> filter) {
+ filters_.push_back(std::move(filter));
+ }
+
+ /** Returns true if all filters keep the path. */
+ bool Keep(const std::string& path) override {
+ for (auto& filter : filters_) {
+ if (!filter->Keep(path)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private:
+ std::vector<std::unique_ptr<IPathFilter>> filters_;
+};
+
+} // namespace aapt
+
+#endif // AAPT2_FILTER_H
diff --git a/tools/aapt2/filter/Filter_test.cpp b/tools/aapt2/filter/Filter_test.cpp
new file mode 100644
index 0000000..fb75a4b
--- /dev/null
+++ b/tools/aapt2/filter/Filter_test.cpp
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#include "filter/Filter.h"
+
+#include <string>
+
+#include "io/Util.h"
+
+#include "gtest/gtest.h"
+
+namespace aapt {
+namespace {
+
+TEST(FilterChainTest, EmptyChain) {
+ FilterChain chain;
+ ASSERT_TRUE(chain.Keep("some/random/path"));
+}
+
+TEST(FilterChainTest, SingleFilter) {
+ FilterChain chain;
+ chain.AddFilter(util::make_unique<PrefixFilter>("keep/"));
+
+ ASSERT_FALSE(chain.Keep("removed/path"));
+ ASSERT_TRUE(chain.Keep("keep/path/1"));
+ ASSERT_TRUE(chain.Keep("keep/path/2"));
+}
+
+TEST(FilterChainTest, MultipleFilters) {
+ FilterChain chain;
+ chain.AddFilter(util::make_unique<PrefixFilter>("keep/"));
+ chain.AddFilter(util::make_unique<PrefixFilter>("keep/really/"));
+
+ ASSERT_FALSE(chain.Keep("removed/path"));
+ ASSERT_FALSE(chain.Keep("/keep/really/wrong/prefix"));
+ ASSERT_FALSE(chain.Keep("keep/maybe/1"));
+ ASSERT_TRUE(chain.Keep("keep/really/1"));
+}
+
+} // namespace
+} // namespace aapt
diff --git a/tools/aapt2/flatten/TableFlattener_test.cpp b/tools/aapt2/flatten/TableFlattener_test.cpp
index 6d1350d..4fdb2ec 100644
--- a/tools/aapt2/flatten/TableFlattener_test.cpp
+++ b/tools/aapt2/flatten/TableFlattener_test.cpp
@@ -26,6 +26,9 @@
using namespace android;
+using ::testing::IsNull;
+using ::testing::NotNull;
+
namespace aapt {
class TableFlattenerTest : public ::testing::Test {
@@ -235,13 +238,12 @@
ResourceTable result;
ASSERT_TRUE(Flatten(context_.get(), {}, table.get(), &result));
- Attribute* actualAttr =
- test::GetValue<Attribute>(&result, "android:attr/foo");
- ASSERT_NE(nullptr, actualAttr);
- EXPECT_EQ(attr.IsWeak(), actualAttr->IsWeak());
- EXPECT_EQ(attr.type_mask, actualAttr->type_mask);
- EXPECT_EQ(attr.min_int, actualAttr->min_int);
- EXPECT_EQ(attr.max_int, actualAttr->max_int);
+ Attribute* actual_attr = test::GetValue<Attribute>(&result, "android:attr/foo");
+ ASSERT_THAT(actual_attr, NotNull());
+ EXPECT_EQ(attr.IsWeak(), actual_attr->IsWeak());
+ EXPECT_EQ(attr.type_mask, actual_attr->type_mask);
+ EXPECT_EQ(attr.min_int, actual_attr->min_int);
+ EXPECT_EQ(attr.max_int, actual_attr->max_int);
}
static std::unique_ptr<ResourceTable> BuildTableWithSparseEntries(
@@ -303,15 +305,13 @@
auto value = test::GetValueForConfig<BinaryPrimitive>(&sparse_table, "android:string/foo_0",
sparse_config);
- ASSERT_NE(nullptr, value);
+ ASSERT_THAT(value, NotNull());
EXPECT_EQ(0u, value->value.data);
- ASSERT_EQ(nullptr, test::GetValueForConfig<BinaryPrimitive>(&sparse_table, "android:string/foo_1",
- sparse_config));
+ ASSERT_THAT(test::GetValueForConfig<BinaryPrimitive>(&sparse_table, "android:string/foo_1", sparse_config), IsNull());
- value = test::GetValueForConfig<BinaryPrimitive>(&sparse_table, "android:string/foo_4",
- sparse_config);
- ASSERT_NE(nullptr, value);
+ value = test::GetValueForConfig<BinaryPrimitive>(&sparse_table, "android:string/foo_4", sparse_config);
+ ASSERT_THAT(value, NotNull());
EXPECT_EQ(4u, value->value.data);
}
@@ -372,7 +372,7 @@
Maybe<ResourceTable::SearchResult> search_result =
result.FindResource(test::ParseNameOrDie("lib:id/foo"));
- AAPT_ASSERT_TRUE(search_result);
+ ASSERT_TRUE(search_result);
EXPECT_EQ(0x00u, search_result.value().package->id.value());
auto iter = result.included_packages_.find(0x00);
@@ -398,7 +398,7 @@
ASSERT_TRUE(Flatten(context.get(), {}, table.get(), &result));
const DynamicRefTable* dynamic_ref_table = result.getDynamicRefTableForCookie(1);
- ASSERT_NE(nullptr, dynamic_ref_table);
+ ASSERT_THAT(dynamic_ref_table, NotNull());
const KeyedVector<String16, uint8_t>& entries = dynamic_ref_table->entries();
@@ -423,7 +423,7 @@
ASSERT_TRUE(Flatten(context.get(), {}, table.get(), &result));
const DynamicRefTable* dynamic_ref_table = result.getDynamicRefTableForCookie(1);
- ASSERT_NE(nullptr, dynamic_ref_table);
+ ASSERT_THAT(dynamic_ref_table, NotNull());
const KeyedVector<String16, uint8_t>& entries = dynamic_ref_table->entries();
ssize_t idx = entries.indexOfKey(android::String16("app"));
diff --git a/tools/aapt2/integration-tests/AppOne/res/values/styles.xml b/tools/aapt2/integration-tests/AppOne/res/values/styles.xml
index f05845c..19d96c0 100644
--- a/tools/aapt2/integration-tests/AppOne/res/values/styles.xml
+++ b/tools/aapt2/integration-tests/AppOne/res/values/styles.xml
@@ -25,6 +25,7 @@
<style name="Pop">
<item name="custom">@android:drawable/btn_default</item>
<item name="android:focusable">true</item>
+ <item name="android:numColumns">auto_fit</item>
</style>
<string name="yo">@string/wow</string>
diff --git a/tools/aapt2/java/AnnotationProcessor.cpp b/tools/aapt2/java/AnnotationProcessor.cpp
index a0ef00b..1f83fa0 100644
--- a/tools/aapt2/java/AnnotationProcessor.cpp
+++ b/tools/aapt2/java/AnnotationProcessor.cpp
@@ -18,12 +18,29 @@
#include <algorithm>
+#include "text/Unicode.h"
+#include "text/Utf8Iterator.h"
#include "util/Util.h"
-using android::StringPiece;
+using ::aapt::text::Utf8Iterator;
+using ::android::StringPiece;
namespace aapt {
+StringPiece AnnotationProcessor::ExtractFirstSentence(const StringPiece& comment) {
+ Utf8Iterator iter(comment);
+ while (iter.HasNext()) {
+ const char32_t codepoint = iter.Next();
+ if (codepoint == U'.') {
+ const size_t current_position = iter.Position();
+ if (!iter.HasNext() || text::IsWhitespace(iter.Next())) {
+ return comment.substr(0, current_position);
+ }
+ }
+ }
+ return comment;
+}
+
void AnnotationProcessor::AppendCommentLine(std::string& comment) {
static const std::string sDeprecated = "@deprecated";
static const std::string sSystemApi = "@SystemApi";
diff --git a/tools/aapt2/java/AnnotationProcessor.h b/tools/aapt2/java/AnnotationProcessor.h
index 99cd44f..a06eda0 100644
--- a/tools/aapt2/java/AnnotationProcessor.h
+++ b/tools/aapt2/java/AnnotationProcessor.h
@@ -53,6 +53,8 @@
*/
class AnnotationProcessor {
public:
+ static android::StringPiece ExtractFirstSentence(const android::StringPiece& comment);
+
/**
* Adds more comments. Since resources can have various values with different
* configurations,
diff --git a/tools/aapt2/java/AnnotationProcessor_test.cpp b/tools/aapt2/java/AnnotationProcessor_test.cpp
index 3e43c42..9ccac88 100644
--- a/tools/aapt2/java/AnnotationProcessor_test.cpp
+++ b/tools/aapt2/java/AnnotationProcessor_test.cpp
@@ -18,6 +18,10 @@
#include "test/Test.h"
+using ::testing::Eq;
+using ::testing::HasSubstr;
+using ::testing::Not;
+
namespace aapt {
TEST(AnnotationProcessorTest, EmitsDeprecated) {
@@ -33,7 +37,7 @@
processor.WriteToStream(&result, "");
std::string annotations = result.str();
- EXPECT_NE(std::string::npos, annotations.find("@Deprecated"));
+ EXPECT_THAT(annotations, HasSubstr("@Deprecated"));
}
TEST(AnnotationProcessorTest, EmitsSystemApiAnnotationAndRemovesFromComment) {
@@ -44,10 +48,20 @@
processor.WriteToStream(&result, "");
std::string annotations = result.str();
- EXPECT_NE(std::string::npos,
- annotations.find("@android.annotation.SystemApi"));
- EXPECT_EQ(std::string::npos, annotations.find("@SystemApi"));
- EXPECT_NE(std::string::npos, annotations.find("This is a system API"));
+ EXPECT_THAT(annotations, HasSubstr("@android.annotation.SystemApi"));
+ EXPECT_THAT(annotations, Not(HasSubstr("@SystemApi")));
+ EXPECT_THAT(annotations, HasSubstr("This is a system API"));
+}
+
+TEST(AnnotationProcessor, ExtractsFirstSentence) {
+ EXPECT_THAT(AnnotationProcessor::ExtractFirstSentence("This is the only sentence"),
+ Eq("This is the only sentence"));
+ EXPECT_THAT(AnnotationProcessor::ExtractFirstSentence(
+ "This is the\n first sentence. This is the rest of the paragraph."),
+ Eq("This is the\n first sentence."));
+ EXPECT_THAT(AnnotationProcessor::ExtractFirstSentence(
+ "This is the first sentence with a {@link android.R.styleable.Theme}."),
+ Eq("This is the first sentence with a {@link android.R.styleable.Theme}."));
}
} // namespace aapt
diff --git a/tools/aapt2/java/JavaClassGenerator.cpp b/tools/aapt2/java/JavaClassGenerator.cpp
index 2a23aa9..44fa0f1 100644
--- a/tools/aapt2/java/JavaClassGenerator.cpp
+++ b/tools/aapt2/java/JavaClassGenerator.cpp
@@ -299,24 +299,16 @@
}
const ResourceName& attr_name = entry.attr_ref->name.value();
- styleable_comment << "<tr><td>";
- styleable_comment << "<code>{@link #" << entry.field_name << " "
- << (!attr_name.package.empty()
- ? attr_name.package
- : context_->GetCompilationPackage())
- << ":" << attr_name.entry << "}</code>";
- styleable_comment << "</td>";
-
- styleable_comment << "<td>";
+ styleable_comment << "<tr><td><code>{@link #" << entry.field_name << " "
+ << (!attr_name.package.empty() ? attr_name.package
+ : context_->GetCompilationPackage())
+ << ":" << attr_name.entry << "}</code></td>";
// Only use the comment up until the first '.'. This is to stay compatible with
// the way old AAPT did it (presumably to keep it short and to avoid including
// annotations like @hide which would affect this Styleable).
- auto iter = std::find(attr_comment_line.begin(), attr_comment_line.end(), '.');
- if (iter != attr_comment_line.end()) {
- attr_comment_line = attr_comment_line.substr(0, (iter - attr_comment_line.begin()) + 1);
- }
- styleable_comment << attr_comment_line << "</td></tr>\n";
+ styleable_comment << "<td>" << AnnotationProcessor::ExtractFirstSentence(attr_comment_line)
+ << "</td></tr>\n";
}
styleable_comment << "</table>\n";
diff --git a/tools/aapt2/java/ManifestClassGenerator_test.cpp b/tools/aapt2/java/ManifestClassGenerator_test.cpp
index 5ebf508..9f6ec21 100644
--- a/tools/aapt2/java/ManifestClassGenerator_test.cpp
+++ b/tools/aapt2/java/ManifestClassGenerator_test.cpp
@@ -18,10 +18,101 @@
#include "test/Test.h"
+using ::testing::HasSubstr;
+using ::testing::Not;
+
namespace aapt {
-static ::testing::AssertionResult GetManifestClassText(IAaptContext* context,
- xml::XmlResource* res,
+static ::testing::AssertionResult GetManifestClassText(IAaptContext* context, xml::XmlResource* res,
+ std::string* out_str);
+
+TEST(ManifestClassGeneratorTest, NameIsProperlyGeneratedFromSymbol) {
+ std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
+ std::unique_ptr<xml::XmlResource> manifest = test::BuildXmlDom(R"(
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android">
+ <permission android:name="android.permission.ACCESS_INTERNET" />
+ <permission android:name="android.DO_DANGEROUS_THINGS" />
+ <permission android:name="com.test.sample.permission.HUH" />
+ <permission-group android:name="foo.bar.PERMISSION" />
+ </manifest>)");
+
+ std::string actual;
+ ASSERT_TRUE(GetManifestClassText(context.get(), manifest.get(), &actual));
+
+ ASSERT_THAT(actual, HasSubstr("public static final class permission {"));
+ ASSERT_THAT(actual, HasSubstr("public static final class permission_group {"));
+
+ const size_t permission_start_pos = actual.find("public static final class permission {");
+ const size_t permission_group_start_pos =
+ actual.find("public static final class permission_group {");
+
+ //
+ // Make sure these permissions are in the permission class.
+ //
+ const std::string permission_class =
+ actual.substr(permission_start_pos, permission_group_start_pos - permission_start_pos);
+
+ EXPECT_THAT(
+ permission_class,
+ HasSubstr(
+ "public static final String ACCESS_INTERNET=\"android.permission.ACCESS_INTERNET\";"));
+ EXPECT_THAT(
+ permission_class,
+ HasSubstr("public static final String DO_DANGEROUS_THINGS=\"android.DO_DANGEROUS_THINGS\";"));
+ EXPECT_THAT(permission_class,
+ HasSubstr("public static final String HUH=\"com.test.sample.permission.HUH\";"));
+
+ //
+ // Make sure these permissions are in the permission_group class
+ //
+ const std::string permission_group_class = actual.substr(permission_group_start_pos);
+
+ EXPECT_THAT(permission_group_class,
+ HasSubstr("public static final String PERMISSION=\"foo.bar.PERMISSION\";"));
+}
+
+TEST(ManifestClassGeneratorTest, CommentsAndAnnotationsArePresent) {
+ std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
+ std::unique_ptr<xml::XmlResource> manifest = test::BuildXmlDom(R"(
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android">
+ <!-- Required to access the internet.
+ Added in API 1. -->
+ <permission android:name="android.permission.ACCESS_INTERNET" />
+ <!-- @deprecated This permission is for playing outside. -->
+ <permission android:name="android.permission.PLAY_OUTSIDE" />
+ <!-- This is a private permission for system only!
+ @hide
+ @SystemApi -->
+ <permission android:name="android.permission.SECRET" />
+ </manifest>)");
+
+ std::string actual;
+ ASSERT_TRUE(GetManifestClassText(context.get(), manifest.get(), &actual));
+
+ const char* expected_access_internet = R"( /**
+ * Required to access the internet.
+ * Added in API 1.
+ */
+ public static final String ACCESS_INTERNET="android.permission.ACCESS_INTERNET";)";
+ EXPECT_THAT(actual, HasSubstr(expected_access_internet));
+
+ const char* expected_play_outside = R"( /**
+ * @deprecated This permission is for playing outside.
+ */
+ @Deprecated
+ public static final String PLAY_OUTSIDE="android.permission.PLAY_OUTSIDE";)";
+ EXPECT_THAT(actual, HasSubstr(expected_play_outside));
+
+ const char* expected_secret = R"( /**
+ * This is a private permission for system only!
+ * @hide
+ */
+ @android.annotation.SystemApi
+ public static final String SECRET="android.permission.SECRET";)";
+ EXPECT_THAT(actual, HasSubstr(expected_secret));
+}
+
+static ::testing::AssertionResult GetManifestClassText(IAaptContext* context, xml::XmlResource* res,
std::string* out_str) {
std::unique_ptr<ClassDefinition> manifest_class =
GenerateManifestClass(context->GetDiagnostics(), res);
@@ -30,8 +121,7 @@
}
std::stringstream out;
- if (!manifest_class->WriteJavaFile(manifest_class.get(), "android", true,
- &out)) {
+ if (!manifest_class->WriteJavaFile(manifest_class.get(), "android", true, &out)) {
return ::testing::AssertionFailure() << "failed to write java file";
}
@@ -39,103 +129,4 @@
return ::testing::AssertionSuccess();
}
-TEST(ManifestClassGeneratorTest, NameIsProperlyGeneratedFromSymbol) {
- std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
- std::unique_ptr<xml::XmlResource> manifest = test::BuildXmlDom(R"EOF(
- <manifest xmlns:android="http://schemas.android.com/apk/res/android">
- <permission android:name="android.permission.ACCESS_INTERNET" />
- <permission android:name="android.DO_DANGEROUS_THINGS" />
- <permission android:name="com.test.sample.permission.HUH" />
- <permission-group android:name="foo.bar.PERMISSION" />
- </manifest>)EOF");
-
- std::string actual;
- ASSERT_TRUE(GetManifestClassText(context.get(), manifest.get(), &actual));
-
- const size_t permission_class_pos =
- actual.find("public static final class permission {");
- const size_t permission_croup_class_pos =
- actual.find("public static final class permission_group {");
- ASSERT_NE(std::string::npos, permission_class_pos);
- ASSERT_NE(std::string::npos, permission_croup_class_pos);
-
- //
- // Make sure these permissions are in the permission class.
- //
-
- size_t pos = actual.find(
- "public static final String ACCESS_INTERNET="
- "\"android.permission.ACCESS_INTERNET\";");
- EXPECT_GT(pos, permission_class_pos);
- EXPECT_LT(pos, permission_croup_class_pos);
-
- pos = actual.find(
- "public static final String DO_DANGEROUS_THINGS="
- "\"android.DO_DANGEROUS_THINGS\";");
- EXPECT_GT(pos, permission_class_pos);
- EXPECT_LT(pos, permission_croup_class_pos);
-
- pos = actual.find(
- "public static final String HUH=\"com.test.sample.permission.HUH\";");
- EXPECT_GT(pos, permission_class_pos);
- EXPECT_LT(pos, permission_croup_class_pos);
-
- //
- // Make sure these permissions are in the permission_group class
- //
-
- pos = actual.find(
- "public static final String PERMISSION="
- "\"foo.bar.PERMISSION\";");
- EXPECT_GT(pos, permission_croup_class_pos);
- EXPECT_LT(pos, std::string::npos);
-}
-
-TEST(ManifestClassGeneratorTest, CommentsAndAnnotationsArePresent) {
- std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
- std::unique_ptr<xml::XmlResource> manifest = test::BuildXmlDom(R"EOF(
- <manifest xmlns:android="http://schemas.android.com/apk/res/android">
- <!-- Required to access the internet.
- Added in API 1. -->
- <permission android:name="android.permission.ACCESS_INTERNET" />
- <!-- @deprecated This permission is for playing outside. -->
- <permission android:name="android.permission.PLAY_OUTSIDE" />
- <!-- This is a private permission for system only!
- @hide
- @SystemApi -->
- <permission android:name="android.permission.SECRET" />
- </manifest>)EOF");
-
- std::string actual;
- ASSERT_TRUE(GetManifestClassText(context.get(), manifest.get(), &actual));
-
- const char* expected_access_internet =
- R"EOF( /**
- * Required to access the internet.
- * Added in API 1.
- */
- public static final String ACCESS_INTERNET="android.permission.ACCESS_INTERNET";)EOF";
-
- EXPECT_NE(std::string::npos, actual.find(expected_access_internet));
-
- const char* expected_play_outside =
- R"EOF( /**
- * @deprecated This permission is for playing outside.
- */
- @Deprecated
- public static final String PLAY_OUTSIDE="android.permission.PLAY_OUTSIDE";)EOF";
-
- EXPECT_NE(std::string::npos, actual.find(expected_play_outside));
-
- const char* expected_secret =
- R"EOF( /**
- * This is a private permission for system only!
- * @hide
- */
- @android.annotation.SystemApi
- public static final String SECRET="android.permission.SECRET";)EOF";
-
- EXPECT_NE(std::string::npos, actual.find(expected_secret));
-}
-
} // namespace aapt
diff --git a/tools/aapt2/java/ProguardRules.cpp b/tools/aapt2/java/ProguardRules.cpp
index 624a559..5f61fae 100644
--- a/tools/aapt2/java/ProguardRules.cpp
+++ b/tools/aapt2/java/ProguardRules.cpp
@@ -85,7 +85,11 @@
bool check_class = false;
bool check_name = false;
if (node->namespace_uri.empty()) {
- check_class = node->name == "view" || node->name == "fragment";
+ if (node->name == "view") {
+ check_class = true;
+ } else if (node->name == "fragment") {
+ check_class = check_name = true;
+ }
} else if (node->namespace_uri == xml::kSchemaAndroid) {
check_name = node->name == "fragment";
}
@@ -110,6 +114,32 @@
DISALLOW_COPY_AND_ASSIGN(LayoutVisitor);
};
+class MenuVisitor : public BaseVisitor {
+ public:
+ MenuVisitor(const Source& source, KeepSet* keep_set) : BaseVisitor(source, keep_set) {
+ }
+
+ virtual void Visit(xml::Element* node) override {
+ if (node->namespace_uri.empty() && node->name == "item") {
+ for (const auto& attr : node->attributes) {
+ if (attr.namespace_uri == xml::kSchemaAndroid) {
+ if ((attr.name == "actionViewClass" || attr.name == "actionProviderClass") &&
+ util::IsJavaClassName(attr.value)) {
+ AddClass(node->line_number, attr.value);
+ } else if (attr.name == "onClick") {
+ AddMethod(node->line_number, attr.value);
+ }
+ }
+ }
+ }
+
+ BaseVisitor::Visit(node);
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(MenuVisitor);
+};
+
class XmlResourceVisitor : public BaseVisitor {
public:
XmlResourceVisitor(const Source& source, KeepSet* keep_set)
@@ -267,6 +297,12 @@
break;
}
+ case ResourceType::kMenu: {
+ MenuVisitor visitor(source, keep_set);
+ res->root->Accept(&visitor);
+ break;
+ }
+
default:
break;
}
diff --git a/tools/aapt2/java/ProguardRules_test.cpp b/tools/aapt2/java/ProguardRules_test.cpp
new file mode 100644
index 0000000..900b073
--- /dev/null
+++ b/tools/aapt2/java/ProguardRules_test.cpp
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#include "java/ProguardRules.h"
+
+#include "test/Test.h"
+
+using ::testing::HasSubstr;
+using ::testing::Not;
+
+namespace aapt {
+
+TEST(ProguardRulesTest, FragmentNameRuleIsEmitted) {
+ std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
+ std::unique_ptr<xml::XmlResource> layout = test::BuildXmlDom(R"(
+ <fragment xmlns:android="http://schemas.android.com/apk/res/android"
+ android:name="com.foo.Bar"/>)");
+ layout->file.name = test::ParseNameOrDie("layout/foo");
+
+ proguard::KeepSet set;
+ ASSERT_TRUE(proguard::CollectProguardRules({}, layout.get(), &set));
+
+ std::stringstream out;
+ ASSERT_TRUE(proguard::WriteKeepSet(&out, set));
+
+ std::string actual = out.str();
+ EXPECT_THAT(actual, HasSubstr("com.foo.Bar"));
+}
+
+TEST(ProguardRulesTest, FragmentClassRuleIsEmitted) {
+ std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
+ std::unique_ptr<xml::XmlResource> layout =
+ test::BuildXmlDom(R"(<fragment class="com.foo.Bar"/>)");
+ layout->file.name = test::ParseNameOrDie("layout/foo");
+
+ proguard::KeepSet set;
+ ASSERT_TRUE(proguard::CollectProguardRules({}, layout.get(), &set));
+
+ std::stringstream out;
+ ASSERT_TRUE(proguard::WriteKeepSet(&out, set));
+
+ std::string actual = out.str();
+ EXPECT_THAT(actual, HasSubstr("com.foo.Bar"));
+}
+
+TEST(ProguardRulesTest, FragmentNameAndClassRulesAreEmitted) {
+ std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
+ std::unique_ptr<xml::XmlResource> layout = test::BuildXmlDom(R"(
+ <fragment xmlns:android="http://schemas.android.com/apk/res/android"
+ android:name="com.foo.Baz"
+ class="com.foo.Bar"/>)");
+ layout->file.name = test::ParseNameOrDie("layout/foo");
+
+ proguard::KeepSet set;
+ ASSERT_TRUE(proguard::CollectProguardRules({}, layout.get(), &set));
+
+ std::stringstream out;
+ ASSERT_TRUE(proguard::WriteKeepSet(&out, set));
+
+ std::string actual = out.str();
+ EXPECT_THAT(actual, HasSubstr("com.foo.Bar"));
+ EXPECT_THAT(actual, HasSubstr("com.foo.Baz"));
+}
+
+TEST(ProguardRulesTest, ViewOnClickRuleIsEmitted) {
+ std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
+ std::unique_ptr<xml::XmlResource> layout = test::BuildXmlDom(R"(
+ <View xmlns:android="http://schemas.android.com/apk/res/android"
+ android:onClick="bar_method" />)");
+ layout->file.name = test::ParseNameOrDie("layout/foo");
+
+ proguard::KeepSet set;
+ ASSERT_TRUE(proguard::CollectProguardRules({}, layout.get(), &set));
+
+ std::stringstream out;
+ ASSERT_TRUE(proguard::WriteKeepSet(&out, set));
+
+ std::string actual = out.str();
+ EXPECT_THAT(actual, HasSubstr("bar_method"));
+}
+
+TEST(ProguardRulesTest, MenuRulesAreEmitted) {
+ std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
+ std::unique_ptr<xml::XmlResource> menu = test::BuildXmlDom(R"(
+ <menu xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:onClick="on_click"
+ android:actionViewClass="com.foo.Bar"
+ android:actionProviderClass="com.foo.Baz"
+ android:name="com.foo.Bat" />
+ </menu>)");
+ menu->file.name = test::ParseNameOrDie("menu/foo");
+
+ proguard::KeepSet set;
+ ASSERT_TRUE(proguard::CollectProguardRules({}, menu.get(), &set));
+
+ std::stringstream out;
+ ASSERT_TRUE(proguard::WriteKeepSet(&out, set));
+
+ std::string actual = out.str();
+ EXPECT_THAT(actual, HasSubstr("on_click"));
+ EXPECT_THAT(actual, HasSubstr("com.foo.Bar"));
+ EXPECT_THAT(actual, HasSubstr("com.foo.Baz"));
+ EXPECT_THAT(actual, Not(HasSubstr("com.foo.Bat")));
+}
+
+} // namespace aapt
diff --git a/tools/aapt2/link/AutoVersioner_test.cpp b/tools/aapt2/link/AutoVersioner_test.cpp
index 755af0a..49639f8 100644
--- a/tools/aapt2/link/AutoVersioner_test.cpp
+++ b/tools/aapt2/link/AutoVersioner_test.cpp
@@ -19,43 +19,34 @@
#include "ConfigDescription.h"
#include "test/Test.h"
+using ::testing::NotNull;
+
namespace aapt {
TEST(AutoVersionerTest, GenerateVersionedResources) {
const ConfigDescription land_config = test::ParseConfigOrDie("land");
- const ConfigDescription sw600dp_land_config =
- test::ParseConfigOrDie("sw600dp-land");
+ const ConfigDescription sw600dp_land_config = test::ParseConfigOrDie("sw600dp-land");
ResourceEntry entry("foo");
- entry.values.push_back(util::make_unique<ResourceConfigValue>(
- ConfigDescription::DefaultConfig(), ""));
- entry.values.push_back(
- util::make_unique<ResourceConfigValue>(land_config, ""));
- entry.values.push_back(
- util::make_unique<ResourceConfigValue>(sw600dp_land_config, ""));
+ entry.values.push_back(util::make_unique<ResourceConfigValue>(ConfigDescription::DefaultConfig(), ""));
+ entry.values.push_back(util::make_unique<ResourceConfigValue>(land_config, ""));
+ entry.values.push_back(util::make_unique<ResourceConfigValue>(sw600dp_land_config, ""));
- EXPECT_TRUE(ShouldGenerateVersionedResource(
- &entry, ConfigDescription::DefaultConfig(), 17));
+ EXPECT_TRUE(ShouldGenerateVersionedResource(&entry, ConfigDescription::DefaultConfig(), 17));
EXPECT_TRUE(ShouldGenerateVersionedResource(&entry, land_config, 17));
}
TEST(AutoVersionerTest, GenerateVersionedResourceWhenHigherVersionExists) {
- const ConfigDescription sw600dp_v13_config =
- test::ParseConfigOrDie("sw600dp-v13");
+ const ConfigDescription sw600dp_v13_config = test::ParseConfigOrDie("sw600dp-v13");
const ConfigDescription v21_config = test::ParseConfigOrDie("v21");
ResourceEntry entry("foo");
- entry.values.push_back(util::make_unique<ResourceConfigValue>(
- ConfigDescription::DefaultConfig(), ""));
- entry.values.push_back(
- util::make_unique<ResourceConfigValue>(sw600dp_v13_config, ""));
- entry.values.push_back(
- util::make_unique<ResourceConfigValue>(v21_config, ""));
+ entry.values.push_back(util::make_unique<ResourceConfigValue>(ConfigDescription::DefaultConfig(), ""));
+ entry.values.push_back(util::make_unique<ResourceConfigValue>(sw600dp_v13_config, ""));
+ entry.values.push_back(util::make_unique<ResourceConfigValue>(v21_config, ""));
- EXPECT_TRUE(ShouldGenerateVersionedResource(
- &entry, ConfigDescription::DefaultConfig(), 17));
- EXPECT_FALSE(ShouldGenerateVersionedResource(
- &entry, ConfigDescription::DefaultConfig(), 22));
+ EXPECT_TRUE(ShouldGenerateVersionedResource(&entry, ConfigDescription::DefaultConfig(), 17));
+ EXPECT_FALSE(ShouldGenerateVersionedResource(&entry, ConfigDescription::DefaultConfig(), 22));
}
TEST(AutoVersionerTest, VersionStylesForTable) {
@@ -92,46 +83,28 @@
AutoVersioner versioner;
ASSERT_TRUE(versioner.Consume(context.get(), table.get()));
- Style* style = test::GetValueForConfig<Style>(table.get(), "app:style/Foo",
- test::ParseConfigOrDie("v4"));
- ASSERT_NE(style, nullptr);
+ Style* style = test::GetValueForConfig<Style>(table.get(), "app:style/Foo", test::ParseConfigOrDie("v4"));
+ ASSERT_THAT(style, NotNull());
ASSERT_EQ(style->entries.size(), 1u);
- AAPT_ASSERT_TRUE(style->entries.front().key.name);
- EXPECT_EQ(style->entries.front().key.name.value(),
- test::ParseNameOrDie("android:attr/onClick"));
+ EXPECT_EQ(make_value(test::ParseNameOrDie("android:attr/onClick")), style->entries.front().key.name);
- style = test::GetValueForConfig<Style>(table.get(), "app:style/Foo",
- test::ParseConfigOrDie("v13"));
- ASSERT_NE(style, nullptr);
+ style = test::GetValueForConfig<Style>(table.get(), "app:style/Foo", test::ParseConfigOrDie("v13"));
+ ASSERT_THAT(style, NotNull());
ASSERT_EQ(style->entries.size(), 2u);
- AAPT_ASSERT_TRUE(style->entries[0].key.name);
- EXPECT_EQ(style->entries[0].key.name.value(),
- test::ParseNameOrDie("android:attr/onClick"));
- AAPT_ASSERT_TRUE(style->entries[1].key.name);
- EXPECT_EQ(style->entries[1].key.name.value(),
- test::ParseNameOrDie("android:attr/requiresSmallestWidthDp"));
+ EXPECT_EQ(make_value(test::ParseNameOrDie("android:attr/onClick")),style->entries[0].key.name);
+ EXPECT_EQ(make_value(test::ParseNameOrDie("android:attr/requiresSmallestWidthDp")), style->entries[1].key.name);
- style = test::GetValueForConfig<Style>(table.get(), "app:style/Foo",
- test::ParseConfigOrDie("v17"));
- ASSERT_NE(style, nullptr);
+ style = test::GetValueForConfig<Style>(table.get(), "app:style/Foo", test::ParseConfigOrDie("v17"));
+ ASSERT_THAT(style, NotNull());
ASSERT_EQ(style->entries.size(), 3u);
- AAPT_ASSERT_TRUE(style->entries[0].key.name);
- EXPECT_EQ(style->entries[0].key.name.value(),
- test::ParseNameOrDie("android:attr/onClick"));
- AAPT_ASSERT_TRUE(style->entries[1].key.name);
- EXPECT_EQ(style->entries[1].key.name.value(),
- test::ParseNameOrDie("android:attr/requiresSmallestWidthDp"));
- AAPT_ASSERT_TRUE(style->entries[2].key.name);
- EXPECT_EQ(style->entries[2].key.name.value(),
- test::ParseNameOrDie("android:attr/paddingStart"));
+ EXPECT_EQ(make_value(test::ParseNameOrDie("android:attr/onClick")), style->entries[0].key.name);
+ EXPECT_EQ(make_value(test::ParseNameOrDie("android:attr/requiresSmallestWidthDp")), style->entries[1].key.name);
+ EXPECT_EQ(make_value(test::ParseNameOrDie("android:attr/paddingStart")), style->entries[2].key.name);
- style = test::GetValueForConfig<Style>(table.get(), "app:style/Foo",
- test::ParseConfigOrDie("v21"));
- ASSERT_NE(style, nullptr);
- ASSERT_EQ(style->entries.size(), 1u);
- AAPT_ASSERT_TRUE(style->entries.front().key.name);
- EXPECT_EQ(style->entries.front().key.name.value(),
- test::ParseNameOrDie("android:attr/paddingEnd"));
+ style = test::GetValueForConfig<Style>(table.get(), "app:style/Foo", test::ParseConfigOrDie("v21"));
+ ASSERT_THAT(style, NotNull());
+ ASSERT_EQ(1u, style->entries.size());
+ EXPECT_EQ(make_value(test::ParseNameOrDie("android:attr/paddingEnd")), style->entries.front().key.name);
}
} // namespace aapt
diff --git a/tools/aapt2/link/ManifestFixer.cpp b/tools/aapt2/link/ManifestFixer.cpp
index 99fd95b..a0ffefa 100644
--- a/tools/aapt2/link/ManifestFixer.cpp
+++ b/tools/aapt2/link/ManifestFixer.cpp
@@ -309,6 +309,9 @@
manifest_action["meta-data"] = meta_data_action;
manifest_action["uses-split"].Action(RequiredNameIsJavaPackage);
+ manifest_action["key-sets"]["key-set"]["public-key"];
+ manifest_action["key-sets"]["upgrade-key-set"];
+
// Application actions.
xml::XmlNodeAction& application_action = manifest_action["application"];
application_action.Action(OptionalNameIsJavaClassName);
diff --git a/tools/aapt2/link/ManifestFixer_test.cpp b/tools/aapt2/link/ManifestFixer_test.cpp
index 064d365..80edb35 100644
--- a/tools/aapt2/link/ManifestFixer_test.cpp
+++ b/tools/aapt2/link/ManifestFixer_test.cpp
@@ -18,7 +18,8 @@
#include "test/Test.h"
-using android::StringPiece;
+using ::android::StringPiece;
+using ::testing::NotNull;
namespace aapt {
@@ -420,4 +421,22 @@
EXPECT_EQ(nullptr, Verify(input));
}
+TEST_F(ManifestFixerTest, SupportKeySets) {
+ std::string input = R"(
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="android">
+ <key-sets>
+ <key-set android:name="old-set">
+ <public-key android:name="old-key" android:value="some+old+key" />
+ </key-set>
+ <key-set android:name="new-set">
+ <public-key android:name="new-key" android:value="some+new+key" />
+ </key-set>
+ <upgrade-key-set android:name="old-set" />
+ <upgrade-key-set android:name="new-set" />
+ </key-sets>
+ </manifest>)";
+ EXPECT_THAT(Verify(input), NotNull());
+}
+
} // namespace aapt
diff --git a/tools/aapt2/link/ReferenceLinker.cpp b/tools/aapt2/link/ReferenceLinker.cpp
index a8e510c..414e56e 100644
--- a/tools/aapt2/link/ReferenceLinker.cpp
+++ b/tools/aapt2/link/ReferenceLinker.cpp
@@ -109,18 +109,15 @@
entry.value->Accept(this);
// Now verify that the type of this item is compatible with the
- // attribute it
- // is defined for. We pass `nullptr` as the DiagMessage so that this
- // check is
- // fast and we avoid creating a DiagMessage when the match is
- // successful.
- if (!symbol->attribute->Matches(entry.value.get(), nullptr)) {
+ // attribute it is defined for. We pass `nullptr` as the DiagMessage so that this
+ // check is fast and we avoid creating a DiagMessage when the match is successful.
+ if (!symbol->attribute->Matches(*entry.value, nullptr)) {
// The actual type of this item is incompatible with the attribute.
DiagMessage msg(entry.key.GetSource());
// Call the matches method again, this time with a DiagMessage so we
// fill in the actual error message.
- symbol->attribute->Matches(entry.value.get(), &msg);
+ symbol->attribute->Matches(*entry.value, &msg);
context_->GetDiagnostics()->Error(msg);
error_ = true;
}
diff --git a/tools/aapt2/link/ReferenceLinker_test.cpp b/tools/aapt2/link/ReferenceLinker_test.cpp
index d8e33a4..72a9168 100644
--- a/tools/aapt2/link/ReferenceLinker_test.cpp
+++ b/tools/aapt2/link/ReferenceLinker_test.cpp
@@ -19,6 +19,7 @@
#include "test/Test.h"
using android::ResTable_map;
+using ::testing::NotNull;
namespace aapt {
@@ -54,18 +55,18 @@
ASSERT_TRUE(linker.Consume(context.get(), table.get()));
Reference* ref = test::GetValue<Reference>(table.get(), "com.app.test:string/foo");
- ASSERT_NE(nullptr, ref);
- AAPT_ASSERT_TRUE(ref->id);
+ ASSERT_THAT(ref, NotNull());
+ ASSERT_TRUE(ref->id);
EXPECT_EQ(ResourceId(0x7f020001), ref->id.value());
ref = test::GetValue<Reference>(table.get(), "com.app.test:string/bar");
- ASSERT_NE(nullptr, ref);
- AAPT_ASSERT_TRUE(ref->id);
+ ASSERT_THAT(ref, NotNull());
+ ASSERT_TRUE(ref->id);
EXPECT_EQ(ResourceId(0x7f020002), ref->id.value());
ref = test::GetValue<Reference>(table.get(), "com.app.test:string/baz");
- ASSERT_NE(nullptr, ref);
- AAPT_ASSERT_TRUE(ref->id);
+ ASSERT_THAT(ref, NotNull());
+ ASSERT_TRUE(ref->id);
EXPECT_EQ(ResourceId(0x01040034), ref->id.value());
}
@@ -84,10 +85,9 @@
{
// We need to fill in the value for the attribute android:attr/bar after we
- // build the
- // table, because we need access to the string pool.
+ // build the table, because we need access to the string pool.
Style* style = test::GetValue<Style>(table.get(), "com.app.test:style/Theme");
- ASSERT_NE(nullptr, style);
+ ASSERT_THAT(style, NotNull());
style->entries.back().value =
util::make_unique<RawString>(table->string_pool.MakeRef("one|two"));
}
@@ -118,20 +118,20 @@
ASSERT_TRUE(linker.Consume(context.get(), table.get()));
Style* style = test::GetValue<Style>(table.get(), "com.app.test:style/Theme");
- ASSERT_NE(nullptr, style);
- AAPT_ASSERT_TRUE(style->parent);
- AAPT_ASSERT_TRUE(style->parent.value().id);
+ ASSERT_THAT(style, NotNull());
+ ASSERT_TRUE(style->parent);
+ ASSERT_TRUE(style->parent.value().id);
EXPECT_EQ(ResourceId(0x01060000), style->parent.value().id.value());
ASSERT_EQ(2u, style->entries.size());
- AAPT_ASSERT_TRUE(style->entries[0].key.id);
+ ASSERT_TRUE(style->entries[0].key.id);
EXPECT_EQ(ResourceId(0x01010001), style->entries[0].key.id.value());
- ASSERT_NE(nullptr, ValueCast<BinaryPrimitive>(style->entries[0].value.get()));
+ ASSERT_THAT(ValueCast<BinaryPrimitive>(style->entries[0].value.get()), NotNull());
- AAPT_ASSERT_TRUE(style->entries[1].key.id);
+ ASSERT_TRUE(style->entries[1].key.id);
EXPECT_EQ(ResourceId(0x01010002), style->entries[1].key.id.value());
- ASSERT_NE(nullptr, ValueCast<BinaryPrimitive>(style->entries[1].value.get()));
+ ASSERT_THAT(ValueCast<BinaryPrimitive>(style->entries[1].value.get()), NotNull());
}
TEST(ReferenceLinkerTest, LinkMangledReferencesAndAttributes) {
@@ -165,9 +165,9 @@
ASSERT_TRUE(linker.Consume(context.get(), table.get()));
Style* style = test::GetValue<Style>(table.get(), "com.app.test:style/Theme");
- ASSERT_NE(nullptr, style);
+ ASSERT_THAT(style, NotNull());
ASSERT_EQ(1u, style->entries.size());
- AAPT_ASSERT_TRUE(style->entries.front().key.id);
+ ASSERT_TRUE(style->entries.front().key.id);
EXPECT_EQ(ResourceId(0x7f010000), style->entries.front().key.id.value());
}
@@ -266,7 +266,7 @@
const CallSite call_site{ResourceNameRef("com.app.test", ResourceType::kString, "foo")};
const SymbolTable::Symbol* symbol = ReferenceLinker::ResolveSymbolCheckVisibility(
*test::BuildReference("com.app.test:string/foo"), call_site, &table, &error);
- ASSERT_NE(nullptr, symbol);
+ ASSERT_THAT(symbol, NotNull());
EXPECT_TRUE(error.empty());
}
@@ -283,12 +283,12 @@
std::string error;
const CallSite call_site{ResourceNameRef("com.app.ext", ResourceType::kLayout, "foo")};
- AAPT_EXPECT_FALSE(ReferenceLinker::CompileXmlAttribute(
+ EXPECT_FALSE(ReferenceLinker::CompileXmlAttribute(
*test::BuildReference("com.app.test:attr/foo"), call_site, &table, &error));
EXPECT_FALSE(error.empty());
error = "";
- AAPT_ASSERT_TRUE(ReferenceLinker::CompileXmlAttribute(
+ ASSERT_TRUE(ReferenceLinker::CompileXmlAttribute(
*test::BuildReference("com.app.test:attr/public_foo"), call_site, &table, &error));
EXPECT_TRUE(error.empty());
}
diff --git a/tools/aapt2/link/XmlReferenceLinker_test.cpp b/tools/aapt2/link/XmlReferenceLinker_test.cpp
index de81e73..228cfb9 100644
--- a/tools/aapt2/link/XmlReferenceLinker_test.cpp
+++ b/tools/aapt2/link/XmlReferenceLinker_test.cpp
@@ -18,6 +18,9 @@
#include "test/Test.h"
+using ::testing::IsNull;
+using ::testing::NotNull;
+
namespace aapt {
class XmlReferenceLinkerTest : public ::testing::Test {
@@ -90,56 +93,48 @@
ASSERT_TRUE(linker.Consume(context_.get(), doc.get()));
xml::Element* view_el = xml::FindRootElement(doc.get());
- ASSERT_NE(nullptr, view_el);
+ ASSERT_THAT(view_el, NotNull());
xml::Attribute* xml_attr = view_el->FindAttribute(xml::kSchemaAndroid, "layout_width");
- ASSERT_NE(nullptr, xml_attr);
- AAPT_ASSERT_TRUE(xml_attr->compiled_attribute);
- AAPT_ASSERT_TRUE(xml_attr->compiled_attribute.value().id);
- EXPECT_EQ(ResourceId(0x01010000), xml_attr->compiled_attribute.value().id.value());
- ASSERT_NE(nullptr, xml_attr->compiled_value);
- ASSERT_NE(nullptr, ValueCast<BinaryPrimitive>(xml_attr->compiled_value.get()));
+ ASSERT_THAT(xml_attr, NotNull());
+ ASSERT_TRUE(xml_attr->compiled_attribute);
+ EXPECT_EQ(make_value(ResourceId(0x01010000)), xml_attr->compiled_attribute.value().id);
+ EXPECT_THAT(ValueCast<BinaryPrimitive>(xml_attr->compiled_value.get()), NotNull());
xml_attr = view_el->FindAttribute(xml::kSchemaAndroid, "background");
- ASSERT_NE(nullptr, xml_attr);
- AAPT_ASSERT_TRUE(xml_attr->compiled_attribute);
- AAPT_ASSERT_TRUE(xml_attr->compiled_attribute.value().id);
- EXPECT_EQ(ResourceId(0x01010001), xml_attr->compiled_attribute.value().id.value());
- ASSERT_NE(nullptr, xml_attr->compiled_value);
+ ASSERT_THAT(xml_attr, NotNull());
+ ASSERT_TRUE(xml_attr->compiled_attribute);
+ EXPECT_EQ(make_value(ResourceId(0x01010001)), xml_attr->compiled_attribute.value().id);
Reference* ref = ValueCast<Reference>(xml_attr->compiled_value.get());
- ASSERT_NE(nullptr, ref);
- AAPT_ASSERT_TRUE(ref->name);
- EXPECT_EQ(test::ParseNameOrDie("color/green"), ref->name.value()); // Make sure the name
- // didn't change.
- AAPT_ASSERT_TRUE(ref->id);
- EXPECT_EQ(ResourceId(0x7f020000), ref->id.value());
+ ASSERT_THAT(ref, NotNull());
+ EXPECT_EQ(make_value(test::ParseNameOrDie("color/green")), ref->name); // Make sure the name
+ // didn't change.
+ EXPECT_EQ(make_value(ResourceId(0x7f020000)), ref->id);
xml_attr = view_el->FindAttribute(xml::kSchemaAndroid, "text");
- ASSERT_NE(nullptr, xml_attr);
- AAPT_ASSERT_TRUE(xml_attr->compiled_attribute);
- ASSERT_FALSE(xml_attr->compiled_value); // Strings don't get compiled for memory sake.
+ ASSERT_THAT(xml_attr, NotNull());
+ EXPECT_TRUE(xml_attr->compiled_attribute);
+ EXPECT_THAT(xml_attr->compiled_value, IsNull()); // Strings don't get compiled for memory sake.
xml_attr = view_el->FindAttribute(xml::kSchemaAndroid, "attr");
- ASSERT_NE(nullptr, xml_attr);
- AAPT_ASSERT_TRUE(xml_attr->compiled_attribute);
- ASSERT_FALSE(xml_attr->compiled_value); // Should be a plain string.
+ ASSERT_THAT(xml_attr, NotNull());
+ EXPECT_TRUE(xml_attr->compiled_attribute);
+ EXPECT_THAT(xml_attr->compiled_value, IsNull()); // Should be a plain string.
xml_attr = view_el->FindAttribute("", "nonAaptAttr");
- ASSERT_NE(nullptr, xml_attr);
- AAPT_ASSERT_FALSE(xml_attr->compiled_attribute);
- ASSERT_NE(nullptr, xml_attr->compiled_value);
- ASSERT_NE(nullptr, ValueCast<BinaryPrimitive>(xml_attr->compiled_value.get()));
+ ASSERT_THAT(xml_attr, NotNull());
+ EXPECT_FALSE(xml_attr->compiled_attribute);
+ EXPECT_THAT(ValueCast<BinaryPrimitive>(xml_attr->compiled_value.get()), NotNull());
xml_attr = view_el->FindAttribute("", "nonAaptAttrRef");
- ASSERT_NE(nullptr, xml_attr);
- AAPT_ASSERT_FALSE(xml_attr->compiled_attribute);
- ASSERT_NE(nullptr, xml_attr->compiled_value);
- ASSERT_NE(nullptr, ValueCast<Reference>(xml_attr->compiled_value.get()));
+ ASSERT_THAT(xml_attr, NotNull());
+ EXPECT_FALSE(xml_attr->compiled_attribute);
+ EXPECT_THAT(ValueCast<Reference>(xml_attr->compiled_value.get()), NotNull());
xml_attr = view_el->FindAttribute("", "class");
- ASSERT_NE(nullptr, xml_attr);
- AAPT_ASSERT_FALSE(xml_attr->compiled_attribute);
- ASSERT_EQ(nullptr, xml_attr->compiled_value);
+ ASSERT_THAT(xml_attr, NotNull());
+ EXPECT_FALSE(xml_attr->compiled_attribute);
+ EXPECT_THAT(xml_attr->compiled_value, IsNull());
}
TEST_F(XmlReferenceLinkerTest, PrivateSymbolsAreNotLinked) {
@@ -169,15 +164,14 @@
ASSERT_TRUE(linker.Consume(context_.get(), doc.get()));
xml::Element* view_el = xml::FindRootElement(doc.get());
- ASSERT_NE(view_el, nullptr);
+ ASSERT_THAT(view_el, NotNull());
xml::Attribute* xml_attr =
view_el->FindAttribute(xml::BuildPackageNamespace("com.android.support"), "colorAccent");
- ASSERT_NE(xml_attr, nullptr);
- AAPT_ASSERT_TRUE(xml_attr->compiled_attribute);
- AAPT_ASSERT_TRUE(xml_attr->compiled_attribute.value().id);
- EXPECT_EQ(xml_attr->compiled_attribute.value().id.value(), ResourceId(0x7f010001));
- ASSERT_NE(ValueCast<BinaryPrimitive>(xml_attr->compiled_value.get()), nullptr);
+ ASSERT_THAT(xml_attr, NotNull());
+ ASSERT_TRUE(xml_attr->compiled_attribute);
+ EXPECT_EQ(make_value(ResourceId(0x7f010001)), xml_attr->compiled_attribute.value().id);
+ EXPECT_THAT(ValueCast<BinaryPrimitive>(xml_attr->compiled_value.get()), NotNull());
}
TEST_F(XmlReferenceLinkerTest, LinkAutoResReference) {
@@ -189,18 +183,16 @@
ASSERT_TRUE(linker.Consume(context_.get(), doc.get()));
xml::Element* view_el = xml::FindRootElement(doc.get());
- ASSERT_NE(view_el, nullptr);
+ ASSERT_THAT(view_el, NotNull());
xml::Attribute* xml_attr = view_el->FindAttribute(xml::kSchemaAuto, "colorAccent");
- ASSERT_NE(xml_attr, nullptr);
- AAPT_ASSERT_TRUE(xml_attr->compiled_attribute);
- AAPT_ASSERT_TRUE(xml_attr->compiled_attribute.value().id);
- EXPECT_EQ(xml_attr->compiled_attribute.value().id.value(), ResourceId(0x7f010000));
+ ASSERT_THAT(xml_attr, NotNull());
+ ASSERT_TRUE(xml_attr->compiled_attribute);
+ EXPECT_EQ(make_value(ResourceId(0x7f010000)), xml_attr->compiled_attribute.value().id);
Reference* ref = ValueCast<Reference>(xml_attr->compiled_value.get());
- ASSERT_NE(ref, nullptr);
- AAPT_ASSERT_TRUE(ref->name);
- AAPT_ASSERT_TRUE(ref->id);
- EXPECT_EQ(ref->id.value(), ResourceId(0x7f020001));
+ ASSERT_THAT(ref, NotNull());
+ ASSERT_TRUE(ref->name);
+ EXPECT_EQ(make_value(ResourceId(0x7f020001)), ref->id);
}
TEST_F(XmlReferenceLinkerTest, LinkViewWithShadowedPackageAlias) {
@@ -215,35 +207,31 @@
ASSERT_TRUE(linker.Consume(context_.get(), doc.get()));
xml::Element* view_el = xml::FindRootElement(doc.get());
- ASSERT_NE(view_el, nullptr);
+ ASSERT_THAT(view_el, NotNull());
// All attributes and references in this element should be referring to
// "android" (0x01).
xml::Attribute* xml_attr = view_el->FindAttribute(xml::kSchemaAndroid, "attr");
- ASSERT_NE(xml_attr, nullptr);
- AAPT_ASSERT_TRUE(xml_attr->compiled_attribute);
- AAPT_ASSERT_TRUE(xml_attr->compiled_attribute.value().id);
- EXPECT_EQ(xml_attr->compiled_attribute.value().id.value(), ResourceId(0x01010002));
+ ASSERT_THAT(xml_attr, NotNull());
+ ASSERT_TRUE(xml_attr->compiled_attribute);
+ EXPECT_EQ(make_value(ResourceId(0x01010002)), xml_attr->compiled_attribute.value().id);
Reference* ref = ValueCast<Reference>(xml_attr->compiled_value.get());
- ASSERT_NE(ref, nullptr);
- AAPT_ASSERT_TRUE(ref->id);
- EXPECT_EQ(ref->id.value(), ResourceId(0x01030000));
+ ASSERT_THAT(ref, NotNull());
+ EXPECT_EQ(make_value(ResourceId(0x01030000)), ref->id);
ASSERT_FALSE(view_el->GetChildElements().empty());
view_el = view_el->GetChildElements().front();
- ASSERT_NE(view_el, nullptr);
+ ASSERT_THAT(view_el, NotNull());
// All attributes and references in this element should be referring to
// "com.app.test" (0x7f).
xml_attr = view_el->FindAttribute(xml::BuildPackageNamespace("com.app.test"), "attr");
- ASSERT_NE(xml_attr, nullptr);
- AAPT_ASSERT_TRUE(xml_attr->compiled_attribute);
- AAPT_ASSERT_TRUE(xml_attr->compiled_attribute.value().id);
- EXPECT_EQ(xml_attr->compiled_attribute.value().id.value(), ResourceId(0x7f010002));
+ ASSERT_THAT(xml_attr, NotNull());
+ ASSERT_TRUE(xml_attr->compiled_attribute);
+ EXPECT_EQ(make_value(ResourceId(0x7f010002)), xml_attr->compiled_attribute.value().id);
ref = ValueCast<Reference>(xml_attr->compiled_value.get());
- ASSERT_NE(ref, nullptr);
- AAPT_ASSERT_TRUE(ref->id);
- EXPECT_EQ(ref->id.value(), ResourceId(0x7f030000));
+ ASSERT_THAT(ref, NotNull());
+ EXPECT_EQ(make_value(ResourceId(0x7f030000)), ref->id);
}
TEST_F(XmlReferenceLinkerTest, LinkViewWithLocalPackageAndAliasOfTheSameName) {
@@ -255,20 +243,17 @@
ASSERT_TRUE(linker.Consume(context_.get(), doc.get()));
xml::Element* view_el = xml::FindRootElement(doc.get());
- ASSERT_NE(view_el, nullptr);
+ ASSERT_THAT(view_el, NotNull());
// All attributes and references in this element should be referring to
// "com.app.test" (0x7f).
- xml::Attribute* xml_attr =
- view_el->FindAttribute(xml::BuildPackageNamespace("com.app.test"), "attr");
- ASSERT_NE(xml_attr, nullptr);
- AAPT_ASSERT_TRUE(xml_attr->compiled_attribute);
- AAPT_ASSERT_TRUE(xml_attr->compiled_attribute.value().id);
- EXPECT_EQ(xml_attr->compiled_attribute.value().id.value(), ResourceId(0x7f010002));
+ xml::Attribute* xml_attr = view_el->FindAttribute(xml::BuildPackageNamespace("com.app.test"), "attr");
+ ASSERT_THAT(xml_attr, NotNull());
+ ASSERT_TRUE(xml_attr->compiled_attribute);
+ EXPECT_EQ(make_value(ResourceId(0x7f010002)), xml_attr->compiled_attribute.value().id);
Reference* ref = ValueCast<Reference>(xml_attr->compiled_value.get());
- ASSERT_NE(ref, nullptr);
- AAPT_ASSERT_TRUE(ref->id);
- EXPECT_EQ(ref->id.value(), ResourceId(0x7f030000));
+ ASSERT_THAT(ref, NotNull());
+ EXPECT_EQ(make_value(ResourceId(0x7f030000)), ref->id);
}
} // namespace aapt
diff --git a/tools/aapt2/optimize/ResourceDeduper_test.cpp b/tools/aapt2/optimize/ResourceDeduper_test.cpp
index 4d00fa6..d9f384c0 100644
--- a/tools/aapt2/optimize/ResourceDeduper_test.cpp
+++ b/tools/aapt2/optimize/ResourceDeduper_test.cpp
@@ -19,69 +19,88 @@
#include "ResourceTable.h"
#include "test/Test.h"
+using ::aapt::test::HasValue;
+using ::testing::Not;
+
namespace aapt {
TEST(ResourceDeduperTest, SameValuesAreDeduped) {
std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
const ConfigDescription default_config = {};
+ const ConfigDescription ldrtl_config = test::ParseConfigOrDie("ldrtl");
+ const ConfigDescription ldrtl_v21_config = test::ParseConfigOrDie("ldrtl-v21");
const ConfigDescription en_config = test::ParseConfigOrDie("en");
const ConfigDescription en_v21_config = test::ParseConfigOrDie("en-v21");
- // Chosen because this configuration is compatible with en.
+ // Chosen because this configuration is compatible with ldrtl/en.
const ConfigDescription land_config = test::ParseConfigOrDie("land");
std::unique_ptr<ResourceTable> table =
test::ResourceTableBuilder()
- .AddString("android:string/dedupe", ResourceId{}, default_config,
- "dedupe")
- .AddString("android:string/dedupe", ResourceId{}, en_config, "dedupe")
- .AddString("android:string/dedupe", ResourceId{}, land_config,
- "dedupe")
- .AddString("android:string/dedupe2", ResourceId{}, default_config,
- "dedupe")
- .AddString("android:string/dedupe2", ResourceId{}, en_config,
- "dedupe")
- .AddString("android:string/dedupe2", ResourceId{}, en_v21_config,
- "keep")
- .AddString("android:string/dedupe2", ResourceId{}, land_config,
- "dedupe")
+ .AddString("android:string/dedupe", ResourceId{}, default_config, "dedupe")
+ .AddString("android:string/dedupe", ResourceId{}, ldrtl_config, "dedupe")
+ .AddString("android:string/dedupe", ResourceId{}, land_config, "dedupe")
+
+ .AddString("android:string/dedupe2", ResourceId{}, default_config, "dedupe")
+ .AddString("android:string/dedupe2", ResourceId{}, ldrtl_config, "dedupe")
+ .AddString("android:string/dedupe2", ResourceId{}, ldrtl_v21_config, "keep")
+ .AddString("android:string/dedupe2", ResourceId{}, land_config, "dedupe")
+
+ .AddString("android:string/dedupe3", ResourceId{}, default_config, "dedupe")
+ .AddString("android:string/dedupe3", ResourceId{}, en_config, "dedupe")
+ .AddString("android:string/dedupe3", ResourceId{}, en_v21_config, "dedupe")
.Build();
ASSERT_TRUE(ResourceDeduper().Consume(context.get(), table.get()));
- EXPECT_EQ(nullptr, test::GetValueForConfig<String>(
- table.get(), "android:string/dedupe", en_config));
- EXPECT_EQ(nullptr, test::GetValueForConfig<String>(
- table.get(), "android:string/dedupe", land_config));
- EXPECT_EQ(nullptr, test::GetValueForConfig<String>(
- table.get(), "android:string/dedupe2", en_config));
- EXPECT_NE(nullptr, test::GetValueForConfig<String>(
- table.get(), "android:string/dedupe2", en_v21_config));
+ EXPECT_THAT(table, Not(HasValue("android:string/dedupe", ldrtl_config)));
+ EXPECT_THAT(table, Not(HasValue("android:string/dedupe", land_config)));
+
+ EXPECT_THAT(table, HasValue("android:string/dedupe2", ldrtl_v21_config));
+ EXPECT_THAT(table, Not(HasValue("android:string/dedupe2", ldrtl_config)));
+
+ EXPECT_THAT(table, HasValue("android:string/dedupe3", default_config));
+ EXPECT_THAT(table, HasValue("android:string/dedupe3", en_config));
+ EXPECT_THAT(table, Not(HasValue("android:string/dedupe3", en_v21_config)));
}
TEST(ResourceDeduperTest, DifferentValuesAreKept) {
std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
const ConfigDescription default_config = {};
- const ConfigDescription en_config = test::ParseConfigOrDie("en");
- const ConfigDescription en_v21_config = test::ParseConfigOrDie("en-v21");
- // Chosen because this configuration is compatible with en.
+ const ConfigDescription ldrtl_config = test::ParseConfigOrDie("ldrtl");
+ const ConfigDescription ldrtl_v21_config = test::ParseConfigOrDie("ldrtl-v21");
+ // Chosen because this configuration is compatible with ldrtl.
const ConfigDescription land_config = test::ParseConfigOrDie("land");
std::unique_ptr<ResourceTable> table =
test::ResourceTableBuilder()
- .AddString("android:string/keep", ResourceId{}, default_config,
- "keep")
- .AddString("android:string/keep", ResourceId{}, en_config, "keep")
- .AddString("android:string/keep", ResourceId{}, en_v21_config,
- "keep2")
+ .AddString("android:string/keep", ResourceId{}, default_config, "keep")
+ .AddString("android:string/keep", ResourceId{}, ldrtl_config, "keep")
+ .AddString("android:string/keep", ResourceId{}, ldrtl_v21_config, "keep2")
.AddString("android:string/keep", ResourceId{}, land_config, "keep2")
.Build();
ASSERT_TRUE(ResourceDeduper().Consume(context.get(), table.get()));
- EXPECT_NE(nullptr, test::GetValueForConfig<String>(
- table.get(), "android:string/keep", en_config));
- EXPECT_NE(nullptr, test::GetValueForConfig<String>(
- table.get(), "android:string/keep", en_v21_config));
- EXPECT_NE(nullptr, test::GetValueForConfig<String>(
- table.get(), "android:string/keep", land_config));
+ EXPECT_THAT(table, HasValue("android:string/keep", ldrtl_config));
+ EXPECT_THAT(table, HasValue("android:string/keep", ldrtl_v21_config));
+ EXPECT_THAT(table, HasValue("android:string/keep", land_config));
+}
+
+TEST(ResourceDeduperTest, LocalesValuesAreKept) {
+ std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
+ const ConfigDescription default_config = {};
+ const ConfigDescription fr_config = test::ParseConfigOrDie("fr");
+ const ConfigDescription fr_rCA_config = test::ParseConfigOrDie("fr-rCA");
+
+ std::unique_ptr<ResourceTable> table =
+ test::ResourceTableBuilder()
+ .AddString("android:string/keep", ResourceId{}, default_config, "keep")
+ .AddString("android:string/keep", ResourceId{}, fr_config, "keep")
+ .AddString("android:string/keep", ResourceId{}, fr_rCA_config, "keep")
+ .Build();
+
+ ASSERT_TRUE(ResourceDeduper().Consume(context.get(), table.get()));
+ EXPECT_THAT(table, HasValue("android:string/keep", default_config));
+ EXPECT_THAT(table, HasValue("android:string/keep", fr_config));
+ EXPECT_THAT(table, HasValue("android:string/keep", fr_rCA_config));
}
} // namespace aapt
diff --git a/tools/aapt2/proto/TableProtoSerializer_test.cpp b/tools/aapt2/proto/TableProtoSerializer_test.cpp
index e6ce6d3..3ebb08e 100644
--- a/tools/aapt2/proto/TableProtoSerializer_test.cpp
+++ b/tools/aapt2/proto/TableProtoSerializer_test.cpp
@@ -20,6 +20,7 @@
#include "test/Test.h"
using ::google::protobuf::io::StringOutputStream;
+using ::testing::NotNull;
namespace aapt {
@@ -46,8 +47,7 @@
// Make a plural.
std::unique_ptr<Plural> plural = util::make_unique<Plural>();
- plural->values[Plural::One] =
- util::make_unique<String>(table->string_pool.MakeRef("one"));
+ plural->values[Plural::One] = util::make_unique<String>(table->string_pool.MakeRef("one"));
ASSERT_TRUE(table->AddResource(test::ParseNameOrDie("com.app.a:plurals/hey"),
ConfigDescription{}, {}, std::move(plural),
context->GetDiagnostics()));
@@ -77,19 +77,19 @@
context->GetDiagnostics()));
std::unique_ptr<pb::ResourceTable> pb_table = SerializeTableToPb(table.get());
- ASSERT_NE(nullptr, pb_table);
+ ASSERT_THAT(pb_table, NotNull());
std::unique_ptr<ResourceTable> new_table = DeserializeTableFromPb(
*pb_table, Source{"test"}, context->GetDiagnostics());
- ASSERT_NE(nullptr, new_table);
+ ASSERT_THAT(new_table, NotNull());
Id* new_id = test::GetValue<Id>(new_table.get(), "com.app.a:id/foo");
- ASSERT_NE(nullptr, new_id);
+ ASSERT_THAT(new_id, NotNull());
EXPECT_EQ(id->IsWeak(), new_id->IsWeak());
Maybe<ResourceTable::SearchResult> result =
new_table->FindResource(test::ParseNameOrDie("com.app.a:layout/main"));
- AAPT_ASSERT_TRUE(result);
+ ASSERT_TRUE(result);
EXPECT_EQ(SymbolState::kPublic, result.value().type->symbol_status.state);
EXPECT_EQ(SymbolState::kPublic, result.value().entry->symbol_status.state);
@@ -101,18 +101,18 @@
// Find the product-dependent values
BinaryPrimitive* prim = test::GetValueForConfigAndProduct<BinaryPrimitive>(
new_table.get(), "com.app.a:integer/one", test::ParseConfigOrDie("land"), "");
- ASSERT_NE(nullptr, prim);
+ ASSERT_THAT(prim, NotNull());
EXPECT_EQ(123u, prim->value.data);
prim = test::GetValueForConfigAndProduct<BinaryPrimitive>(
new_table.get(), "com.app.a:integer/one", test::ParseConfigOrDie("land"), "tablet");
- ASSERT_NE(nullptr, prim);
+ ASSERT_THAT(prim, NotNull());
EXPECT_EQ(321u, prim->value.data);
Reference* actual_ref = test::GetValue<Reference>(new_table.get(), "com.app.a:layout/abc");
- ASSERT_NE(nullptr, actual_ref);
- AAPT_ASSERT_TRUE(actual_ref->name);
- AAPT_ASSERT_TRUE(actual_ref->id);
+ ASSERT_THAT(actual_ref, NotNull());
+ ASSERT_TRUE(actual_ref->name);
+ ASSERT_TRUE(actual_ref->id);
EXPECT_EQ(expected_ref.name.value(), actual_ref->name.value());
EXPECT_EQ(expected_ref.id.value(), actual_ref->id.value());
}
@@ -159,7 +159,7 @@
std::unique_ptr<ResourceFile> file = DeserializeCompiledFileFromPb(
new_pb_file, Source("test"), context->GetDiagnostics());
- ASSERT_NE(nullptr, file);
+ ASSERT_THAT(file, NotNull());
uint64_t offset, len;
ASSERT_TRUE(in_file_stream.ReadDataMetaData(&offset, &len));
@@ -171,16 +171,14 @@
EXPECT_EQ(0u, offset & 0x03);
ASSERT_EQ(1u, file->exported_symbols.size());
- EXPECT_EQ(test::ParseNameOrDie("id/unchecked"),
- file->exported_symbols[0].name);
+ EXPECT_EQ(test::ParseNameOrDie("id/unchecked"), file->exported_symbols[0].name);
// Read the second compiled file.
ASSERT_TRUE(in_file_stream.ReadCompiledFile(&new_pb_file));
- file = DeserializeCompiledFileFromPb(new_pb_file, Source("test"),
- context->GetDiagnostics());
- ASSERT_NE(nullptr, file);
+ file = DeserializeCompiledFileFromPb(new_pb_file, Source("test"), context->GetDiagnostics());
+ ASSERT_THAT(file, NotNull());
ASSERT_TRUE(in_file_stream.ReadDataMetaData(&offset, &len));
diff --git a/tools/aapt2/readme.md b/tools/aapt2/readme.md
index 0290e30..c8d3617 100644
--- a/tools/aapt2/readme.md
+++ b/tools/aapt2/readme.md
@@ -1,9 +1,32 @@
# Android Asset Packaging Tool 2.0 (AAPT2) release notes
+## Version 2.18
+### `aapt2 ...`
+- Fixed issue where enum values were interpreted as integers and range checked. (bug 62358540)
+- Fixed issue where ints and floats with trailing whitespace would not be parsed. (bug 62902869)
+- Fixed issue where `--custom-package` was not honored when writing Manifest.java. (bug 62826426)
+- Add `<key-sets>` and its nested tags to the allowed set of XML tags in AndroidManifest.xml.
+ (bug 62839863)
+- Fixed issue where Java classes referenced from fragments and menus were not added to
+ the set of Proguard keep rules. (bug 62216174)
+- Fixed issue where escaped unicode characters would generate malformed UTF-8. (bug 62839202)
+- Fixed issue where apostrophes or quotes used in XML attribute values were ignored.
+ (bug 62840406, 62840718)
+
## Version 2.17
-### `aapt2 compile ...`
-- Fixed an issue where symlinks would not be followed when compiling PNGs. (bug 62144459)
+### `aapt2 ...`
+- Fixed issue where symlinks would not be followed when compiling PNGs. (bug 62144459)
- Fixed issue where overlays that declared `<add-resource>` did not compile. (bug 38355988)
+- Fixed issue where `%n` in a string resource was interpreted as a format argument. (bug 37132275)
+- Allow empty resources to compile, giving them a value of `""` or `@null`, depending on the
+ accepted formats. (bug 38425050)
+- Resources declared via `<item>` with no format attribute were changed to accept all
+ resource types. (bug 62260121)
+- Allow `<layout>` element under `<activity>` in AndroidManifest.xml. (bug 62189611)
+- Fix issue where `--no-version-vector` did not apply to `pathInterpolator` and `objectAnimator`.
+ (bug 62211148)
+- Fix issue where overlaid `<style>` would not be merged, and would replace the original resource
+ instead. This fix brings behavior in-line with AAPT. (bug 38355988)
## Version 2.16
### `aapt2 link ...`
diff --git a/tools/aapt2/test/Builders.h b/tools/aapt2/test/Builders.h
index f3da780..6b82076 100644
--- a/tools/aapt2/test/Builders.h
+++ b/tools/aapt2/test/Builders.h
@@ -212,8 +212,7 @@
}
StyleBuilder& AddItem(const android::StringPiece& str, std::unique_ptr<Item> value) {
- style_->entries.push_back(
- Style::Entry{Reference(ParseNameOrDie(str)), std::move(value)});
+ style_->entries.push_back(Style::Entry{Reference(ParseNameOrDie(str)), std::move(value)});
return *this;
}
@@ -224,7 +223,9 @@
return *this;
}
- std::unique_ptr<Style> Build() { return std::move(style_); }
+ std::unique_ptr<Style> Build() {
+ return std::move(style_);
+ }
private:
DISALLOW_COPY_AND_ASSIGN(StyleBuilder);
diff --git a/tools/aapt2/test/Common.h b/tools/aapt2/test/Common.h
index 01b2d14..d7b46ca 100644
--- a/tools/aapt2/test/Common.h
+++ b/tools/aapt2/test/Common.h
@@ -34,15 +34,6 @@
#include "io/File.h"
#include "process/IResourceTableConsumer.h"
-//
-// GTEST 1.7 doesn't explicitly cast to bool, which causes explicit operators to
-// fail to compile.
-//
-#define AAPT_ASSERT_TRUE(v) ASSERT_TRUE(bool(v))
-#define AAPT_ASSERT_FALSE(v) ASSERT_FALSE(bool(v))
-#define AAPT_EXPECT_TRUE(v) EXPECT_TRUE(bool(v))
-#define AAPT_EXPECT_FALSE(v) EXPECT_FALSE(bool(v))
-
namespace aapt {
namespace test {
@@ -156,6 +147,23 @@
return arg.Equals(&a);
}
+MATCHER_P(StrValueEq, a,
+ std::string(negation ? "isn't" : "is") + " equal to " + ::testing::PrintToString(a)) {
+ return *(arg.value) == a;
+}
+
+MATCHER_P(HasValue, name,
+ std::string(negation ? "does not have" : "has") + " value " +
+ ::testing::PrintToString(name)) {
+ return GetValueForConfig<Value>(&(*arg), name, {}) != nullptr;
+}
+
+MATCHER_P2(HasValue, name, config,
+ std::string(negation ? "does not have" : "has") + " value " +
+ ::testing::PrintToString(name) + " for config " + ::testing::PrintToString(config)) {
+ return GetValueForConfig<Value>(&(*arg), name, config) != nullptr;
+}
+
} // namespace test
} // namespace aapt
diff --git a/tools/aapt2/text/Unicode.cpp b/tools/aapt2/text/Unicode.cpp
new file mode 100644
index 0000000..75eeb46
--- /dev/null
+++ b/tools/aapt2/text/Unicode.cpp
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#include "text/Unicode.h"
+
+#include <algorithm>
+#include <array>
+
+#include "text/Utf8Iterator.h"
+
+using ::android::StringPiece;
+
+namespace aapt {
+namespace text {
+
+namespace {
+
+struct CharacterProperties {
+ enum : uint32_t {
+ kXidStart = 1 << 0,
+ kXidContinue = 1 << 1,
+ };
+
+ char32_t first_char;
+ char32_t last_char;
+ uint32_t properties;
+};
+
+// Incude the generated data table.
+#include "text/Unicode_data.cpp"
+
+bool CompareCharacterProperties(const CharacterProperties& a, char32_t codepoint) {
+ return a.last_char < codepoint;
+}
+
+uint32_t FindCharacterProperties(char32_t codepoint) {
+ const auto iter_end = sCharacterProperties.end();
+ const auto iter = std::lower_bound(sCharacterProperties.begin(), iter_end, codepoint,
+ CompareCharacterProperties);
+ if (iter != iter_end && codepoint >= iter->first_char) {
+ return iter->properties;
+ }
+ return 0u;
+}
+
+} // namespace
+
+bool IsXidStart(char32_t codepoint) {
+ return FindCharacterProperties(codepoint) & CharacterProperties::kXidStart;
+}
+
+bool IsXidContinue(char32_t codepoint) {
+ return FindCharacterProperties(codepoint) & CharacterProperties::kXidContinue;
+}
+
+// Hardcode the White_Space characters since they are few and the external/icu project doesn't
+// list them as data files to parse.
+// Sourced from http://www.unicode.org/Public/UCD/latest/ucd/PropList.txt
+bool IsWhitespace(char32_t codepoint) {
+ return (codepoint >= 0x0009 && codepoint <= 0x000d) || (codepoint == 0x0020) ||
+ (codepoint == 0x0085) || (codepoint == 0x00a0) || (codepoint == 0x1680) ||
+ (codepoint >= 0x2000 && codepoint <= 0x200a) || (codepoint == 0x2028) ||
+ (codepoint == 0x2029) || (codepoint == 0x202f) || (codepoint == 0x205f) ||
+ (codepoint == 0x3000);
+}
+
+bool IsJavaIdentifier(const StringPiece& str) {
+ Utf8Iterator iter(str);
+
+ // Check the first character.
+ if (!iter.HasNext()) {
+ return false;
+ }
+
+ if (!IsXidStart(iter.Next())) {
+ return false;
+ }
+
+ while (iter.HasNext()) {
+ const char32_t codepoint = iter.Next();
+ if (!IsXidContinue(codepoint) && codepoint != U'$') {
+ return false;
+ }
+ }
+ return true;
+}
+
+bool IsValidResourceEntryName(const StringPiece& str) {
+ Utf8Iterator iter(str);
+
+ // Check the first character.
+ if (!iter.HasNext()) {
+ return false;
+ }
+
+ // Resources are allowed to start with '_'
+ const char32_t first_codepoint = iter.Next();
+ if (!IsXidStart(first_codepoint) && first_codepoint != U'_') {
+ return false;
+ }
+
+ while (iter.HasNext()) {
+ const char32_t codepoint = iter.Next();
+ if (!IsXidContinue(codepoint) && codepoint != U'.' && codepoint != U'-') {
+ return false;
+ }
+ }
+ return true;
+}
+
+} // namespace text
+} // namespace aapt
diff --git a/tools/aapt2/text/Unicode.h b/tools/aapt2/text/Unicode.h
new file mode 100644
index 0000000..546714e
--- /dev/null
+++ b/tools/aapt2/text/Unicode.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#ifndef AAPT_TEXT_UNICODE_H
+#define AAPT_TEXT_UNICODE_H
+
+#include "androidfw/StringPiece.h"
+
+namespace aapt {
+namespace text {
+
+// Returns true if the Unicode codepoint has the XID_Start property, meaning it can be used as the
+// first character of a programming language identifier.
+// http://unicode.org/reports/tr31/#Default_Identifier_Syntax
+//
+// XID_Start is a Unicode Derived Core Property. It is a variation of the ID_Start
+// Derived Core Property, accounting for a few characters that, when normalized, yield valid
+// characters in the ID_Start set.
+bool IsXidStart(char32_t codepoint);
+
+// Returns true if the Unicode codepoint has the XID_Continue property, meaning it can be used in
+// any position of a programming language identifier, except the first.
+// http://unicode.org/reports/tr31/#Default_Identifier_Syntax
+//
+// XID_Continue is a Unicode Derived Core Property. It is a variation of the ID_Continue
+// Derived Core Property, accounting for a few characters that, when normalized, yield valid
+// characters in the ID_Continue set.
+bool IsXidContinue(char32_t codepoint);
+
+// Returns true if the Unicode codepoint has the White_Space property.
+// http://unicode.org/reports/tr44/#White_Space
+bool IsWhitespace(char32_t codepoint);
+
+// Returns true if the UTF8 string can be used as a Java identifier.
+// NOTE: This does not check against the set of reserved Java keywords.
+bool IsJavaIdentifier(const android::StringPiece& str);
+
+// Returns true if the UTF8 string can be used as the entry name of a resource name.
+// This is the `entry` part of package:type/entry.
+bool IsValidResourceEntryName(const android::StringPiece& str);
+
+} // namespace text
+} // namespace aapt
+
+#endif // AAPT_TEXT_UNICODE_H
diff --git a/tools/aapt2/text/Unicode_data.cpp b/tools/aapt2/text/Unicode_data.cpp
new file mode 100644
index 0000000..96dc57b
--- /dev/null
+++ b/tools/aapt2/text/Unicode_data.cpp
@@ -0,0 +1,629 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+const static std::array<CharacterProperties, 611> sCharacterProperties = {{
+ {0x0030, 0x0039, CharacterProperties::kXidContinue},
+ {0x0041, 0x005a, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x005f, 0x005f, CharacterProperties::kXidContinue},
+ {0x0061, 0x007a, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x00aa, 0x00aa, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x00b5, 0x00b5, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x00b7, 0x00b7, CharacterProperties::kXidContinue},
+ {0x00ba, 0x00ba, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x00c0, 0x00d6, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x00d8, 0x00f6, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x00f8, 0x02c1, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x02c6, 0x02d1, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x02e0, 0x02e4, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x02ec, 0x02ec, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x02ee, 0x02ee, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0300, 0x036f, CharacterProperties::kXidContinue},
+ {0x0370, 0x0374, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0376, 0x0377, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x037b, 0x037d, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x037f, 0x037f, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0386, 0x0386, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0387, 0x0387, CharacterProperties::kXidContinue},
+ {0x0388, 0x038a, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x038c, 0x038c, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x038e, 0x03a1, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x03a3, 0x03f5, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x03f7, 0x0481, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0483, 0x0487, CharacterProperties::kXidContinue},
+ {0x048a, 0x052f, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0531, 0x0556, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0559, 0x0559, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0561, 0x0587, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0591, 0x05bd, CharacterProperties::kXidContinue},
+ {0x05bf, 0x05bf, CharacterProperties::kXidContinue},
+ {0x05c1, 0x05c2, CharacterProperties::kXidContinue},
+ {0x05c4, 0x05c5, CharacterProperties::kXidContinue},
+ {0x05c7, 0x05c7, CharacterProperties::kXidContinue},
+ {0x05d0, 0x05ea, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x05f0, 0x05f2, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0610, 0x061a, CharacterProperties::kXidContinue},
+ {0x0620, 0x064a, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x064b, 0x0669, CharacterProperties::kXidContinue},
+ {0x066e, 0x066f, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0670, 0x0670, CharacterProperties::kXidContinue},
+ {0x0671, 0x06d3, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x06d5, 0x06d5, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x06d6, 0x06dc, CharacterProperties::kXidContinue},
+ {0x06df, 0x06e4, CharacterProperties::kXidContinue},
+ {0x06e5, 0x06e6, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x06e7, 0x06e8, CharacterProperties::kXidContinue},
+ {0x06ea, 0x06ed, CharacterProperties::kXidContinue},
+ {0x06ee, 0x06ef, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x06f0, 0x06f9, CharacterProperties::kXidContinue},
+ {0x06fa, 0x06fc, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x06ff, 0x06ff, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0710, 0x0710, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0711, 0x0711, CharacterProperties::kXidContinue},
+ {0x0712, 0x072f, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0730, 0x074a, CharacterProperties::kXidContinue},
+ {0x074d, 0x07a5, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x07a6, 0x07b0, CharacterProperties::kXidContinue},
+ {0x07b1, 0x07b1, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x07c0, 0x07c9, CharacterProperties::kXidContinue},
+ {0x07ca, 0x07ea, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x07eb, 0x07f3, CharacterProperties::kXidContinue},
+ {0x07f4, 0x07f5, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x07fa, 0x07fa, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0800, 0x0815, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0816, 0x0819, CharacterProperties::kXidContinue},
+ {0x081a, 0x081a, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x081b, 0x0823, CharacterProperties::kXidContinue},
+ {0x0824, 0x0824, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0825, 0x0827, CharacterProperties::kXidContinue},
+ {0x0828, 0x0828, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0829, 0x082d, CharacterProperties::kXidContinue},
+ {0x0840, 0x0858, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0859, 0x085b, CharacterProperties::kXidContinue},
+ {0x08a0, 0x08b4, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x08b6, 0x08bd, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x08d4, 0x08e1, CharacterProperties::kXidContinue},
+ {0x08e3, 0x0903, CharacterProperties::kXidContinue},
+ {0x0904, 0x0939, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x093a, 0x093c, CharacterProperties::kXidContinue},
+ {0x093d, 0x093d, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x093e, 0x094f, CharacterProperties::kXidContinue},
+ {0x0950, 0x0950, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0951, 0x0957, CharacterProperties::kXidContinue},
+ {0x0958, 0x0961, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0962, 0x0963, CharacterProperties::kXidContinue},
+ {0x0966, 0x096f, CharacterProperties::kXidContinue},
+ {0x0971, 0x0980, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0981, 0x0983, CharacterProperties::kXidContinue},
+ {0x0985, 0x098c, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x098f, 0x0990, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0993, 0x09a8, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x09aa, 0x09b0, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x09b2, 0x09b2, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x09b6, 0x09b9, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x09bc, 0x09bc, CharacterProperties::kXidContinue},
+ {0x09bd, 0x09bd, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x09be, 0x09c4, CharacterProperties::kXidContinue},
+ {0x09c7, 0x09c8, CharacterProperties::kXidContinue},
+ {0x09cb, 0x09cd, CharacterProperties::kXidContinue},
+ {0x09ce, 0x09ce, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x09d7, 0x09d7, CharacterProperties::kXidContinue},
+ {0x09dc, 0x09dd, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x09df, 0x09e1, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x09e2, 0x09e3, CharacterProperties::kXidContinue},
+ {0x09e6, 0x09ef, CharacterProperties::kXidContinue},
+ {0x09f0, 0x09f1, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0a01, 0x0a03, CharacterProperties::kXidContinue},
+ {0x0a05, 0x0a0a, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0a0f, 0x0a10, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0a13, 0x0a28, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0a2a, 0x0a30, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0a32, 0x0a33, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0a35, 0x0a36, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0a38, 0x0a39, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0a3c, 0x0a3c, CharacterProperties::kXidContinue},
+ {0x0a3e, 0x0a42, CharacterProperties::kXidContinue},
+ {0x0a47, 0x0a48, CharacterProperties::kXidContinue},
+ {0x0a4b, 0x0a4d, CharacterProperties::kXidContinue},
+ {0x0a51, 0x0a51, CharacterProperties::kXidContinue},
+ {0x0a59, 0x0a5c, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0a5e, 0x0a5e, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0a66, 0x0a71, CharacterProperties::kXidContinue},
+ {0x0a72, 0x0a74, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0a75, 0x0a75, CharacterProperties::kXidContinue},
+ {0x0a81, 0x0a83, CharacterProperties::kXidContinue},
+ {0x0a85, 0x0a8d, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0a8f, 0x0a91, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0a93, 0x0aa8, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0aaa, 0x0ab0, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0ab2, 0x0ab3, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0ab5, 0x0ab9, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0abc, 0x0abc, CharacterProperties::kXidContinue},
+ {0x0abd, 0x0abd, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0abe, 0x0ac5, CharacterProperties::kXidContinue},
+ {0x0ac7, 0x0ac9, CharacterProperties::kXidContinue},
+ {0x0acb, 0x0acd, CharacterProperties::kXidContinue},
+ {0x0ad0, 0x0ad0, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0ae0, 0x0ae1, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0ae2, 0x0ae3, CharacterProperties::kXidContinue},
+ {0x0ae6, 0x0aef, CharacterProperties::kXidContinue},
+ {0x0af9, 0x0af9, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0b01, 0x0b03, CharacterProperties::kXidContinue},
+ {0x0b05, 0x0b0c, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0b0f, 0x0b10, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0b13, 0x0b28, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0b2a, 0x0b30, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0b32, 0x0b33, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0b35, 0x0b39, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0b3c, 0x0b3c, CharacterProperties::kXidContinue},
+ {0x0b3d, 0x0b3d, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0b3e, 0x0b44, CharacterProperties::kXidContinue},
+ {0x0b47, 0x0b48, CharacterProperties::kXidContinue},
+ {0x0b4b, 0x0b4d, CharacterProperties::kXidContinue},
+ {0x0b56, 0x0b57, CharacterProperties::kXidContinue},
+ {0x0b5c, 0x0b5d, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0b5f, 0x0b61, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0b62, 0x0b63, CharacterProperties::kXidContinue},
+ {0x0b66, 0x0b6f, CharacterProperties::kXidContinue},
+ {0x0b71, 0x0b71, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0b82, 0x0b82, CharacterProperties::kXidContinue},
+ {0x0b83, 0x0b83, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0b85, 0x0b8a, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0b8e, 0x0b90, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0b92, 0x0b95, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0b99, 0x0b9a, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0b9c, 0x0b9c, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0b9e, 0x0b9f, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0ba3, 0x0ba4, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0ba8, 0x0baa, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0bae, 0x0bb9, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0bbe, 0x0bc2, CharacterProperties::kXidContinue},
+ {0x0bc6, 0x0bc8, CharacterProperties::kXidContinue},
+ {0x0bca, 0x0bcd, CharacterProperties::kXidContinue},
+ {0x0bd0, 0x0bd0, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0bd7, 0x0bd7, CharacterProperties::kXidContinue},
+ {0x0be6, 0x0bef, CharacterProperties::kXidContinue},
+ {0x0c00, 0x0c03, CharacterProperties::kXidContinue},
+ {0x0c05, 0x0c0c, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0c0e, 0x0c10, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0c12, 0x0c28, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0c2a, 0x0c39, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0c3d, 0x0c3d, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0c3e, 0x0c44, CharacterProperties::kXidContinue},
+ {0x0c46, 0x0c48, CharacterProperties::kXidContinue},
+ {0x0c4a, 0x0c4d, CharacterProperties::kXidContinue},
+ {0x0c55, 0x0c56, CharacterProperties::kXidContinue},
+ {0x0c58, 0x0c5a, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0c60, 0x0c61, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0c62, 0x0c63, CharacterProperties::kXidContinue},
+ {0x0c66, 0x0c6f, CharacterProperties::kXidContinue},
+ {0x0c80, 0x0c80, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0c81, 0x0c83, CharacterProperties::kXidContinue},
+ {0x0c85, 0x0c8c, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0c8e, 0x0c90, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0c92, 0x0ca8, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0caa, 0x0cb3, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0cb5, 0x0cb9, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0cbc, 0x0cbc, CharacterProperties::kXidContinue},
+ {0x0cbd, 0x0cbd, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0cbe, 0x0cc4, CharacterProperties::kXidContinue},
+ {0x0cc6, 0x0cc8, CharacterProperties::kXidContinue},
+ {0x0cca, 0x0ccd, CharacterProperties::kXidContinue},
+ {0x0cd5, 0x0cd6, CharacterProperties::kXidContinue},
+ {0x0cde, 0x0cde, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0ce0, 0x0ce1, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0ce2, 0x0ce3, CharacterProperties::kXidContinue},
+ {0x0ce6, 0x0cef, CharacterProperties::kXidContinue},
+ {0x0cf1, 0x0cf2, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0d01, 0x0d03, CharacterProperties::kXidContinue},
+ {0x0d05, 0x0d0c, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0d0e, 0x0d10, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0d12, 0x0d3a, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0d3d, 0x0d3d, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0d3e, 0x0d44, CharacterProperties::kXidContinue},
+ {0x0d46, 0x0d48, CharacterProperties::kXidContinue},
+ {0x0d4a, 0x0d4d, CharacterProperties::kXidContinue},
+ {0x0d4e, 0x0d4e, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0d54, 0x0d56, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0d57, 0x0d57, CharacterProperties::kXidContinue},
+ {0x0d5f, 0x0d61, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0d62, 0x0d63, CharacterProperties::kXidContinue},
+ {0x0d66, 0x0d6f, CharacterProperties::kXidContinue},
+ {0x0d7a, 0x0d7f, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0d82, 0x0d83, CharacterProperties::kXidContinue},
+ {0x0d85, 0x0d96, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0d9a, 0x0db1, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0db3, 0x0dbb, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0dbd, 0x0dbd, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0dc0, 0x0dc6, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0dca, 0x0dca, CharacterProperties::kXidContinue},
+ {0x0dcf, 0x0dd4, CharacterProperties::kXidContinue},
+ {0x0dd6, 0x0dd6, CharacterProperties::kXidContinue},
+ {0x0dd8, 0x0ddf, CharacterProperties::kXidContinue},
+ {0x0de6, 0x0def, CharacterProperties::kXidContinue},
+ {0x0df2, 0x0df3, CharacterProperties::kXidContinue},
+ {0x0e01, 0x0e30, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0e31, 0x0e31, CharacterProperties::kXidContinue},
+ {0x0e32, 0x0e32, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0e33, 0x0e3a, CharacterProperties::kXidContinue},
+ {0x0e40, 0x0e46, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0e47, 0x0e4e, CharacterProperties::kXidContinue},
+ {0x0e50, 0x0e59, CharacterProperties::kXidContinue},
+ {0x0e81, 0x0e82, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0e84, 0x0e84, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0e87, 0x0e88, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0e8a, 0x0e8a, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0e8d, 0x0e8d, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0e94, 0x0e97, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0e99, 0x0e9f, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0ea1, 0x0ea3, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0ea5, 0x0ea5, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0ea7, 0x0ea7, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0eaa, 0x0eab, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0ead, 0x0eb0, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0eb1, 0x0eb1, CharacterProperties::kXidContinue},
+ {0x0eb2, 0x0eb2, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0eb3, 0x0eb9, CharacterProperties::kXidContinue},
+ {0x0ebb, 0x0ebc, CharacterProperties::kXidContinue},
+ {0x0ebd, 0x0ebd, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0ec0, 0x0ec4, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0ec6, 0x0ec6, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0ec8, 0x0ecd, CharacterProperties::kXidContinue},
+ {0x0ed0, 0x0ed9, CharacterProperties::kXidContinue},
+ {0x0edc, 0x0edf, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0f00, 0x0f00, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0f18, 0x0f19, CharacterProperties::kXidContinue},
+ {0x0f20, 0x0f29, CharacterProperties::kXidContinue},
+ {0x0f35, 0x0f35, CharacterProperties::kXidContinue},
+ {0x0f37, 0x0f37, CharacterProperties::kXidContinue},
+ {0x0f39, 0x0f39, CharacterProperties::kXidContinue},
+ {0x0f3e, 0x0f3f, CharacterProperties::kXidContinue},
+ {0x0f40, 0x0f47, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0f49, 0x0f6c, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0f71, 0x0f84, CharacterProperties::kXidContinue},
+ {0x0f86, 0x0f87, CharacterProperties::kXidContinue},
+ {0x0f88, 0x0f8c, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x0f8d, 0x0f97, CharacterProperties::kXidContinue},
+ {0x0f99, 0x0fbc, CharacterProperties::kXidContinue},
+ {0x0fc6, 0x0fc6, CharacterProperties::kXidContinue},
+ {0x1000, 0x102a, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x102b, 0x103e, CharacterProperties::kXidContinue},
+ {0x103f, 0x103f, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1040, 0x1049, CharacterProperties::kXidContinue},
+ {0x1050, 0x1055, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1056, 0x1059, CharacterProperties::kXidContinue},
+ {0x105a, 0x105d, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x105e, 0x1060, CharacterProperties::kXidContinue},
+ {0x1061, 0x1061, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1062, 0x1064, CharacterProperties::kXidContinue},
+ {0x1065, 0x1066, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1067, 0x106d, CharacterProperties::kXidContinue},
+ {0x106e, 0x1070, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1071, 0x1074, CharacterProperties::kXidContinue},
+ {0x1075, 0x1081, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1082, 0x108d, CharacterProperties::kXidContinue},
+ {0x108e, 0x108e, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x108f, 0x109d, CharacterProperties::kXidContinue},
+ {0x10a0, 0x10c5, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x10c7, 0x10c7, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x10cd, 0x10cd, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x10d0, 0x10fa, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x10fc, 0x1248, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x124a, 0x124d, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1250, 0x1256, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1258, 0x1258, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x125a, 0x125d, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1260, 0x1288, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x128a, 0x128d, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1290, 0x12b0, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x12b2, 0x12b5, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x12b8, 0x12be, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x12c0, 0x12c0, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x12c2, 0x12c5, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x12c8, 0x12d6, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x12d8, 0x1310, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1312, 0x1315, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1318, 0x135a, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x135d, 0x135f, CharacterProperties::kXidContinue},
+ {0x1369, 0x1371, CharacterProperties::kXidContinue},
+ {0x1380, 0x138f, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x13a0, 0x13f5, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x13f8, 0x13fd, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1401, 0x166c, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x166f, 0x167f, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1681, 0x169a, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x16a0, 0x16ea, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x16ee, 0x16f8, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1700, 0x170c, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x170e, 0x1711, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1712, 0x1714, CharacterProperties::kXidContinue},
+ {0x1720, 0x1731, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1732, 0x1734, CharacterProperties::kXidContinue},
+ {0x1740, 0x1751, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1752, 0x1753, CharacterProperties::kXidContinue},
+ {0x1760, 0x176c, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x176e, 0x1770, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1772, 0x1773, CharacterProperties::kXidContinue},
+ {0x1780, 0x17b3, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x17b4, 0x17d3, CharacterProperties::kXidContinue},
+ {0x17d7, 0x17d7, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x17dc, 0x17dc, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x17dd, 0x17dd, CharacterProperties::kXidContinue},
+ {0x17e0, 0x17e9, CharacterProperties::kXidContinue},
+ {0x180b, 0x180d, CharacterProperties::kXidContinue},
+ {0x1810, 0x1819, CharacterProperties::kXidContinue},
+ {0x1820, 0x1877, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1880, 0x18a8, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x18a9, 0x18a9, CharacterProperties::kXidContinue},
+ {0x18aa, 0x18aa, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x18b0, 0x18f5, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1900, 0x191e, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1920, 0x192b, CharacterProperties::kXidContinue},
+ {0x1930, 0x193b, CharacterProperties::kXidContinue},
+ {0x1946, 0x194f, CharacterProperties::kXidContinue},
+ {0x1950, 0x196d, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1970, 0x1974, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1980, 0x19ab, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x19b0, 0x19c9, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x19d0, 0x19da, CharacterProperties::kXidContinue},
+ {0x1a00, 0x1a16, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1a17, 0x1a1b, CharacterProperties::kXidContinue},
+ {0x1a20, 0x1a54, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1a55, 0x1a5e, CharacterProperties::kXidContinue},
+ {0x1a60, 0x1a7c, CharacterProperties::kXidContinue},
+ {0x1a7f, 0x1a89, CharacterProperties::kXidContinue},
+ {0x1a90, 0x1a99, CharacterProperties::kXidContinue},
+ {0x1aa7, 0x1aa7, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1ab0, 0x1abd, CharacterProperties::kXidContinue},
+ {0x1b00, 0x1b04, CharacterProperties::kXidContinue},
+ {0x1b05, 0x1b33, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1b34, 0x1b44, CharacterProperties::kXidContinue},
+ {0x1b45, 0x1b4b, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1b50, 0x1b59, CharacterProperties::kXidContinue},
+ {0x1b6b, 0x1b73, CharacterProperties::kXidContinue},
+ {0x1b80, 0x1b82, CharacterProperties::kXidContinue},
+ {0x1b83, 0x1ba0, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1ba1, 0x1bad, CharacterProperties::kXidContinue},
+ {0x1bae, 0x1baf, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1bb0, 0x1bb9, CharacterProperties::kXidContinue},
+ {0x1bba, 0x1be5, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1be6, 0x1bf3, CharacterProperties::kXidContinue},
+ {0x1c00, 0x1c23, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1c24, 0x1c37, CharacterProperties::kXidContinue},
+ {0x1c40, 0x1c49, CharacterProperties::kXidContinue},
+ {0x1c4d, 0x1c4f, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1c50, 0x1c59, CharacterProperties::kXidContinue},
+ {0x1c5a, 0x1c7d, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1c80, 0x1c88, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1cd0, 0x1cd2, CharacterProperties::kXidContinue},
+ {0x1cd4, 0x1ce8, CharacterProperties::kXidContinue},
+ {0x1ce9, 0x1cec, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1ced, 0x1ced, CharacterProperties::kXidContinue},
+ {0x1cee, 0x1cf1, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1cf2, 0x1cf4, CharacterProperties::kXidContinue},
+ {0x1cf5, 0x1cf6, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1cf8, 0x1cf9, CharacterProperties::kXidContinue},
+ {0x1d00, 0x1dbf, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1dc0, 0x1df5, CharacterProperties::kXidContinue},
+ {0x1dfb, 0x1dff, CharacterProperties::kXidContinue},
+ {0x1e00, 0x1f15, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1f18, 0x1f1d, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1f20, 0x1f45, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1f48, 0x1f4d, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1f50, 0x1f57, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1f59, 0x1f59, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1f5b, 0x1f5b, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1f5d, 0x1f5d, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1f5f, 0x1f7d, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1f80, 0x1fb4, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1fb6, 0x1fbc, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1fbe, 0x1fbe, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1fc2, 0x1fc4, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1fc6, 0x1fcc, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1fd0, 0x1fd3, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1fd6, 0x1fdb, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1fe0, 0x1fec, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1ff2, 0x1ff4, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x1ff6, 0x1ffc, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x203f, 0x2040, CharacterProperties::kXidContinue},
+ {0x2054, 0x2054, CharacterProperties::kXidContinue},
+ {0x2071, 0x2071, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x207f, 0x207f, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x2090, 0x209c, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x20d0, 0x20dc, CharacterProperties::kXidContinue},
+ {0x20e1, 0x20e1, CharacterProperties::kXidContinue},
+ {0x20e5, 0x20f0, CharacterProperties::kXidContinue},
+ {0x2102, 0x2102, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x2107, 0x2107, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x210a, 0x2113, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x2115, 0x2115, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x2118, 0x211d, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x2124, 0x2124, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x2126, 0x2126, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x2128, 0x2128, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x212a, 0x2139, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x213c, 0x213f, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x2145, 0x2149, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x214e, 0x214e, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x2160, 0x2188, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x2c00, 0x2c2e, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x2c30, 0x2c5e, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x2c60, 0x2ce4, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x2ceb, 0x2cee, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x2cef, 0x2cf1, CharacterProperties::kXidContinue},
+ {0x2cf2, 0x2cf3, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x2d00, 0x2d25, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x2d27, 0x2d27, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x2d2d, 0x2d2d, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x2d30, 0x2d67, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x2d6f, 0x2d6f, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x2d7f, 0x2d7f, CharacterProperties::kXidContinue},
+ {0x2d80, 0x2d96, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x2da0, 0x2da6, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x2da8, 0x2dae, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x2db0, 0x2db6, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x2db8, 0x2dbe, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x2dc0, 0x2dc6, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x2dc8, 0x2dce, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x2dd0, 0x2dd6, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x2dd8, 0x2dde, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x2de0, 0x2dff, CharacterProperties::kXidContinue},
+ {0x3005, 0x3007, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x3021, 0x3029, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x302a, 0x302f, CharacterProperties::kXidContinue},
+ {0x3031, 0x3035, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x3038, 0x303c, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x3041, 0x3096, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x3099, 0x309a, CharacterProperties::kXidContinue},
+ {0x309d, 0x309f, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x30a1, 0x30fa, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x30fc, 0x30ff, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x3105, 0x312d, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x3131, 0x318e, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x31a0, 0x31ba, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x31f0, 0x31ff, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x3400, 0x4db5, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0x4e00, 0x9fd5, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xa000, 0xa48c, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xa4d0, 0xa4fd, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xa500, 0xa60c, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xa610, 0xa61f, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xa620, 0xa629, CharacterProperties::kXidContinue},
+ {0xa62a, 0xa62b, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xa640, 0xa66e, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xa66f, 0xa66f, CharacterProperties::kXidContinue},
+ {0xa674, 0xa67d, CharacterProperties::kXidContinue},
+ {0xa67f, 0xa69d, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xa69e, 0xa69f, CharacterProperties::kXidContinue},
+ {0xa6a0, 0xa6ef, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xa6f0, 0xa6f1, CharacterProperties::kXidContinue},
+ {0xa717, 0xa71f, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xa722, 0xa788, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xa78b, 0xa7ae, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xa7b0, 0xa7b7, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xa7f7, 0xa801, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xa802, 0xa802, CharacterProperties::kXidContinue},
+ {0xa803, 0xa805, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xa806, 0xa806, CharacterProperties::kXidContinue},
+ {0xa807, 0xa80a, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xa80b, 0xa80b, CharacterProperties::kXidContinue},
+ {0xa80c, 0xa822, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xa823, 0xa827, CharacterProperties::kXidContinue},
+ {0xa840, 0xa873, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xa880, 0xa881, CharacterProperties::kXidContinue},
+ {0xa882, 0xa8b3, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xa8b4, 0xa8c5, CharacterProperties::kXidContinue},
+ {0xa8d0, 0xa8d9, CharacterProperties::kXidContinue},
+ {0xa8e0, 0xa8f1, CharacterProperties::kXidContinue},
+ {0xa8f2, 0xa8f7, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xa8fb, 0xa8fb, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xa8fd, 0xa8fd, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xa900, 0xa909, CharacterProperties::kXidContinue},
+ {0xa90a, 0xa925, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xa926, 0xa92d, CharacterProperties::kXidContinue},
+ {0xa930, 0xa946, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xa947, 0xa953, CharacterProperties::kXidContinue},
+ {0xa960, 0xa97c, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xa980, 0xa983, CharacterProperties::kXidContinue},
+ {0xa984, 0xa9b2, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xa9b3, 0xa9c0, CharacterProperties::kXidContinue},
+ {0xa9cf, 0xa9cf, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xa9d0, 0xa9d9, CharacterProperties::kXidContinue},
+ {0xa9e0, 0xa9e4, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xa9e5, 0xa9e5, CharacterProperties::kXidContinue},
+ {0xa9e6, 0xa9ef, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xa9f0, 0xa9f9, CharacterProperties::kXidContinue},
+ {0xa9fa, 0xa9fe, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xaa00, 0xaa28, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xaa29, 0xaa36, CharacterProperties::kXidContinue},
+ {0xaa40, 0xaa42, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xaa43, 0xaa43, CharacterProperties::kXidContinue},
+ {0xaa44, 0xaa4b, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xaa4c, 0xaa4d, CharacterProperties::kXidContinue},
+ {0xaa50, 0xaa59, CharacterProperties::kXidContinue},
+ {0xaa60, 0xaa76, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xaa7a, 0xaa7a, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xaa7b, 0xaa7d, CharacterProperties::kXidContinue},
+ {0xaa7e, 0xaaaf, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xaab0, 0xaab0, CharacterProperties::kXidContinue},
+ {0xaab1, 0xaab1, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xaab2, 0xaab4, CharacterProperties::kXidContinue},
+ {0xaab5, 0xaab6, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xaab7, 0xaab8, CharacterProperties::kXidContinue},
+ {0xaab9, 0xaabd, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xaabe, 0xaabf, CharacterProperties::kXidContinue},
+ {0xaac0, 0xaac0, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xaac1, 0xaac1, CharacterProperties::kXidContinue},
+ {0xaac2, 0xaac2, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xaadb, 0xaadd, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xaae0, 0xaaea, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xaaeb, 0xaaef, CharacterProperties::kXidContinue},
+ {0xaaf2, 0xaaf4, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xaaf5, 0xaaf6, CharacterProperties::kXidContinue},
+ {0xab01, 0xab06, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xab09, 0xab0e, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xab11, 0xab16, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xab20, 0xab26, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xab28, 0xab2e, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xab30, 0xab5a, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xab5c, 0xab65, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xab70, 0xabe2, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xabe3, 0xabea, CharacterProperties::kXidContinue},
+ {0xabec, 0xabed, CharacterProperties::kXidContinue},
+ {0xabf0, 0xabf9, CharacterProperties::kXidContinue},
+ {0xac00, 0xd7a3, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xd7b0, 0xd7c6, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xd7cb, 0xd7fb, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xf900, 0xfa6d, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xfa70, 0xfad9, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xfb00, 0xfb06, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xfb13, 0xfb17, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xfb1d, 0xfb1d, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xfb1e, 0xfb1e, CharacterProperties::kXidContinue},
+ {0xfb1f, 0xfb28, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xfb2a, 0xfb36, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xfb38, 0xfb3c, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xfb3e, 0xfb3e, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xfb40, 0xfb41, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xfb43, 0xfb44, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xfb46, 0xfbb1, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xfbd3, 0xfc5d, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xfc64, 0xfd3d, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xfd50, 0xfd8f, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xfd92, 0xfdc7, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xfdf0, 0xfdf9, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xfe00, 0xfe0f, CharacterProperties::kXidContinue},
+ {0xfe20, 0xfe2f, CharacterProperties::kXidContinue},
+ {0xfe33, 0xfe34, CharacterProperties::kXidContinue},
+ {0xfe4d, 0xfe4f, CharacterProperties::kXidContinue},
+ {0xfe71, 0xfe71, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xfe73, 0xfe73, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xfe77, 0xfe77, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xfe79, 0xfe79, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xfe7b, 0xfe7b, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xfe7d, 0xfe7d, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xfe7f, 0xfefc, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xff10, 0xff19, CharacterProperties::kXidContinue},
+ {0xff21, 0xff3a, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xff3f, 0xff3f, CharacterProperties::kXidContinue},
+ {0xff41, 0xff5a, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xff66, 0xff9d, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xff9e, 0xff9f, CharacterProperties::kXidContinue},
+ {0xffa0, 0xffbe, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xffc2, 0xffc7, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xffca, 0xffcf, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xffd2, 0xffd7, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+ {0xffda, 0xffdc, CharacterProperties::kXidStart | CharacterProperties::kXidContinue},
+}};
diff --git a/tools/aapt2/text/Unicode_test.cpp b/tools/aapt2/text/Unicode_test.cpp
new file mode 100644
index 0000000..d47fb28
--- /dev/null
+++ b/tools/aapt2/text/Unicode_test.cpp
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#include "text/Unicode.h"
+
+#include "test/Test.h"
+
+using ::testing::Each;
+using ::testing::Eq;
+using ::testing::ResultOf;
+
+namespace aapt {
+namespace text {
+
+TEST(UnicodeTest, IsXidStart) {
+ std::u32string valid_input = U"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZˮø";
+ EXPECT_THAT(valid_input, Each(ResultOf(IsXidStart, Eq(true))));
+
+ std::u32string invalid_input = U"$;\'/<>+=-.{}[]()\\|?@#%^&*!~`\",1234567890_";
+ EXPECT_THAT(invalid_input, Each(ResultOf(IsXidStart, Eq(false))));
+}
+
+TEST(UnicodeTest, IsXidContinue) {
+ std::u32string valid_input = U"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_ˮø";
+ EXPECT_THAT(valid_input, Each(ResultOf(IsXidContinue, Eq(true))));
+
+ std::u32string invalid_input = U"$;\'/<>+=-.{}[]()\\|?@#%^&*!~`\",";
+ EXPECT_THAT(invalid_input, Each(ResultOf(IsXidContinue, Eq(false))));
+}
+
+TEST(UnicodeTest, IsJavaIdentifier) {
+ EXPECT_TRUE(IsJavaIdentifier("FøøBar_12"));
+ EXPECT_TRUE(IsJavaIdentifier("Føø$Bar"));
+
+ EXPECT_FALSE(IsJavaIdentifier("12FøøBar"));
+ EXPECT_FALSE(IsJavaIdentifier("_FøøBar"));
+ EXPECT_FALSE(IsJavaIdentifier("$Føø$Bar"));
+}
+
+TEST(UnicodeTest, IsValidResourceEntryName) {
+ EXPECT_TRUE(IsJavaIdentifier("FøøBar"));
+ EXPECT_TRUE(IsValidResourceEntryName("FøøBar_12"));
+ EXPECT_TRUE(IsValidResourceEntryName("Føø.Bar"));
+ EXPECT_TRUE(IsValidResourceEntryName("Føø-Bar"));
+ EXPECT_TRUE(IsValidResourceEntryName("_FøøBar"));
+
+ EXPECT_FALSE(IsValidResourceEntryName("12FøøBar"));
+ EXPECT_FALSE(IsValidResourceEntryName("Føø$Bar"));
+ EXPECT_FALSE(IsValidResourceEntryName("Føø/Bar"));
+ EXPECT_FALSE(IsValidResourceEntryName("Føø:Bar"));
+ EXPECT_FALSE(IsValidResourceEntryName("Føø;Bar"));
+}
+
+} // namespace text
+} // namespace aapt
diff --git a/tools/aapt2/text/Utf8Iterator.cpp b/tools/aapt2/text/Utf8Iterator.cpp
new file mode 100644
index 0000000..20b9073
--- /dev/null
+++ b/tools/aapt2/text/Utf8Iterator.cpp
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#include "text/Utf8Iterator.h"
+
+#include "android-base/logging.h"
+#include "utils/Unicode.h"
+
+using ::android::StringPiece;
+
+namespace aapt {
+namespace text {
+
+Utf8Iterator::Utf8Iterator(const StringPiece& str)
+ : str_(str), current_pos_(0), next_pos_(0), current_codepoint_(0) {
+ DoNext();
+}
+
+void Utf8Iterator::DoNext() {
+ current_pos_ = next_pos_;
+ int32_t result = utf32_from_utf8_at(str_.data(), str_.size(), current_pos_, &next_pos_);
+ if (result == -1) {
+ current_codepoint_ = 0u;
+ } else {
+ current_codepoint_ = static_cast<char32_t>(result);
+ }
+}
+
+bool Utf8Iterator::HasNext() const {
+ return current_codepoint_ != 0;
+}
+
+size_t Utf8Iterator::Position() const {
+ return current_pos_;
+}
+
+void Utf8Iterator::Skip(int amount) {
+ while (amount > 0 && HasNext()) {
+ Next();
+ --amount;
+ }
+}
+
+char32_t Utf8Iterator::Next() {
+ CHECK(HasNext()) << "Next() called after iterator exhausted";
+ char32_t result = current_codepoint_;
+ DoNext();
+ return result;
+}
+
+} // namespace text
+} // namespace aapt
diff --git a/tools/aapt2/text/Utf8Iterator.h b/tools/aapt2/text/Utf8Iterator.h
new file mode 100644
index 0000000..9318401
--- /dev/null
+++ b/tools/aapt2/text/Utf8Iterator.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#ifndef AAPT_TEXT_UTF8ITERATOR_H
+#define AAPT_TEXT_UTF8ITERATOR_H
+
+#include "android-base/macros.h"
+#include "androidfw/StringPiece.h"
+
+namespace aapt {
+namespace text {
+
+class Utf8Iterator {
+ public:
+ explicit Utf8Iterator(const android::StringPiece& str);
+
+ bool HasNext() const;
+
+ // Returns the current position of the iterator in bytes of the source UTF8 string.
+ // This position is the start of the codepoint returned by the next call to Next().
+ size_t Position() const;
+
+ void Skip(int amount);
+
+ char32_t Next();
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(Utf8Iterator);
+
+ void DoNext();
+
+ android::StringPiece str_;
+ size_t current_pos_;
+ size_t next_pos_;
+ char32_t current_codepoint_;
+};
+
+} // namespace text
+} // namespace aapt
+
+#endif // AAPT_TEXT_UTF8ITERATOR_H
diff --git a/tools/aapt2/text/Utf8Iterator_test.cpp b/tools/aapt2/text/Utf8Iterator_test.cpp
new file mode 100644
index 0000000..8c3e774
--- /dev/null
+++ b/tools/aapt2/text/Utf8Iterator_test.cpp
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#include "text/Utf8Iterator.h"
+
+#include "test/Test.h"
+
+using ::android::StringPiece;
+using ::testing::Eq;
+
+namespace aapt {
+namespace text {
+
+TEST(Utf8IteratorTest, IteratesOverAscii) {
+ Utf8Iterator iter("hello");
+
+ ASSERT_TRUE(iter.HasNext());
+ EXPECT_THAT(iter.Next(), Eq(U'h'));
+
+ ASSERT_TRUE(iter.HasNext());
+ EXPECT_THAT(iter.Next(), Eq(U'e'));
+
+ ASSERT_TRUE(iter.HasNext());
+ EXPECT_THAT(iter.Next(), Eq(U'l'));
+
+ ASSERT_TRUE(iter.HasNext());
+ EXPECT_THAT(iter.Next(), Eq(U'l'));
+
+ ASSERT_TRUE(iter.HasNext());
+ EXPECT_THAT(iter.Next(), Eq(U'o'));
+
+ EXPECT_FALSE(iter.HasNext());
+}
+
+TEST(Utf8IteratorTest, IteratesOverUnicode) {
+ Utf8Iterator iter("Hi there 華勵蓮🍩");
+ iter.Skip(9);
+
+ ASSERT_TRUE(iter.HasNext());
+ EXPECT_THAT(iter.Next(), Eq(U'華'));
+
+ ASSERT_TRUE(iter.HasNext());
+ EXPECT_THAT(iter.Next(), Eq(U'勵'));
+
+ ASSERT_TRUE(iter.HasNext());
+ EXPECT_THAT(iter.Next(), Eq(U'蓮'));
+
+ ASSERT_TRUE(iter.HasNext());
+ EXPECT_THAT(iter.Next(), Eq(U'🍩'));
+
+ EXPECT_FALSE(iter.HasNext());
+}
+
+TEST(Utf8IteratorTest, PositionPointsToTheCorrectPlace) {
+ const StringPiece expected("Mm🍩");
+ Utf8Iterator iter(expected);
+
+ // Before any character, the position should be 0.
+ EXPECT_THAT(iter.Position(), Eq(0u));
+
+ // The 'M' character, one byte.
+ ASSERT_TRUE(iter.HasNext());
+ iter.Next();
+ EXPECT_THAT(iter.Position(), Eq(1u));
+
+ // The 'm' character, one byte.
+ ASSERT_TRUE(iter.HasNext());
+ iter.Next();
+ EXPECT_THAT(iter.Position(), Eq(2u));
+
+ // The doughnut character, 4 bytes.
+ ASSERT_TRUE(iter.HasNext());
+ iter.Next();
+ EXPECT_THAT(iter.Position(), Eq(6u));
+
+ // There should be nothing left.
+ EXPECT_FALSE(iter.HasNext());
+ EXPECT_THAT(iter.Position(), Eq(expected.size()));
+}
+
+} // namespace text
+} // namespace aapt
diff --git a/tools/aapt2/tools/extract_unicode_properties.py b/tools/aapt2/tools/extract_unicode_properties.py
new file mode 100644
index 0000000..7577ec8
--- /dev/null
+++ b/tools/aapt2/tools/extract_unicode_properties.py
@@ -0,0 +1,102 @@
+#!/bin/env python3
+
+"""Extracts the XID_Start and XID_Continue Derived core properties from the ICU data files
+and emits a std::array<> for binary searching.
+"""
+
+import re
+import sys
+
+CharacterPropertyEnumMap = {
+ 1: "CharacterProperties::kXidStart",
+ 2: "CharacterProperties::kXidContinue"
+}
+
+class CharacterProperty:
+ def __init__(self, first_char, last_char, prop_type):
+ self.first_char = first_char
+ self.last_char = last_char
+ self.prop_type = prop_type
+
+ def key(self):
+ return self.first_char
+
+ def merge(self, other):
+ if self.last_char + 1 == other.first_char and self.prop_type == other.prop_type:
+ self.last_char = other.last_char
+ else:
+ raise KeyError()
+
+ def __repr__(self):
+ types = []
+ for enum_int, enum_str in CharacterPropertyEnumMap.items():
+ if enum_int & self.prop_type:
+ types.append(enum_str)
+ return "{}0x{:04x}, 0x{:04x}, {}{}".format(
+ "{", self.first_char, self.last_char, ' | '.join(types), "}")
+
+def extract_unicode_properties(f, props, chars_out):
+ prog = re.compile(r"^(?P<first>\w{4})(..(?P<last>\w{4}))?\W+;\W+(?P<prop>\w+)")
+ for line in f:
+ result = prog.match(line)
+ if result:
+ prop_type_str = result.group('prop')
+ first_char_str = result.group('first')
+ last_char_str = result.group('last')
+ if prop_type_str in props:
+ start_char = int(first_char_str, 16)
+ last_char = (int(last_char_str, 16) if last_char_str else start_char) + 1
+ prop_type = props[prop_type_str]
+ for char in range(start_char, last_char):
+ if char not in chars_out:
+ chars_out[char] = CharacterProperty(char, char, 0)
+ chars_out[char].prop_type |= prop_type
+ return chars_out
+
+def flatten_unicode_properties(chars):
+ result = []
+ for char_prop in sorted(chars.values(), key=CharacterProperty.key):
+ if len(result) == 0:
+ result.append(char_prop)
+ else:
+ try:
+ result[len(result) - 1].merge(char_prop)
+ except KeyError:
+ result.append(char_prop)
+ return result
+
+license = """/*
+ * Copyright (C) 2017 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.
+ */
+"""
+
+if __name__ == "__main__":
+ if len(sys.argv) < 2:
+ print("must specify path to icu DerivedCoreProperties file (e.g:" \
+ "external/icu/icu4c/source/data/unidata/DerivedCoreProperties.txt)")
+ sys.exit(1)
+
+ props = {"XID_Start": 1, "XID_Continue": 2}
+ char_props = {}
+ for file_path in sys.argv[1:]:
+ with open(file_path) as f:
+ extract_unicode_properties(f, props, char_props)
+ result = flatten_unicode_properties(char_props)
+ print("{}\nconst static std::array<CharacterProperties, {}> sCharacterProperties = {}"
+ .format(license, len(result), "{{"))
+ for prop in result:
+ print(" {},".format(prop))
+ print("}};")
+
diff --git a/tools/aapt2/util/BigBuffer_test.cpp b/tools/aapt2/util/BigBuffer_test.cpp
index 12c0b3e..a7776e3 100644
--- a/tools/aapt2/util/BigBuffer_test.cpp
+++ b/tools/aapt2/util/BigBuffer_test.cpp
@@ -18,12 +18,14 @@
#include "test/Test.h"
+using ::testing::NotNull;
+
namespace aapt {
TEST(BigBufferTest, AllocateSingleBlock) {
BigBuffer buffer(4);
- EXPECT_NE(nullptr, buffer.NextBlock<char>(2));
+ EXPECT_THAT(buffer.NextBlock<char>(2), NotNull());
EXPECT_EQ(2u, buffer.size());
}
@@ -31,10 +33,10 @@
BigBuffer buffer(16);
char* b1 = buffer.NextBlock<char>(8);
- EXPECT_NE(nullptr, b1);
+ EXPECT_THAT(b1, NotNull());
char* b2 = buffer.NextBlock<char>(4);
- EXPECT_NE(nullptr, b2);
+ EXPECT_THAT(b2, NotNull());
EXPECT_EQ(b1 + 8, b2);
}
@@ -42,7 +44,7 @@
TEST(BigBufferTest, AllocateExactSizeBlockIfLargerThanBlockSize) {
BigBuffer buffer(16);
- EXPECT_NE(nullptr, buffer.NextBlock<char>(32));
+ EXPECT_THAT(buffer.NextBlock<char>(32), NotNull());
EXPECT_EQ(32u, buffer.size());
}
@@ -50,13 +52,13 @@
BigBuffer buffer(16);
uint32_t* b1 = buffer.NextBlock<uint32_t>();
- ASSERT_NE(nullptr, b1);
+ ASSERT_THAT(b1, NotNull());
*b1 = 33;
{
BigBuffer buffer2(16);
b1 = buffer2.NextBlock<uint32_t>();
- ASSERT_NE(nullptr, b1);
+ ASSERT_THAT(b1, NotNull());
*b1 = 44;
buffer.AppendBuffer(std::move(buffer2));
@@ -83,7 +85,7 @@
TEST(BigBufferTest, PadAndAlignProperly) {
BigBuffer buffer(16);
- ASSERT_NE(buffer.NextBlock<char>(2), nullptr);
+ ASSERT_THAT(buffer.NextBlock<char>(2), NotNull());
ASSERT_EQ(2u, buffer.size());
buffer.Pad(2);
ASSERT_EQ(4u, buffer.size());
diff --git a/tools/aapt2/util/Maybe_test.cpp b/tools/aapt2/util/Maybe_test.cpp
index ca14793..2057ddc 100644
--- a/tools/aapt2/util/Maybe_test.cpp
+++ b/tools/aapt2/util/Maybe_test.cpp
@@ -80,22 +80,22 @@
TEST(MaybeTest, MakeNothing) {
Maybe<int> val = make_nothing<int>();
- AAPT_EXPECT_FALSE(val);
+ EXPECT_FALSE(val);
Maybe<std::string> val2 = make_nothing<std::string>();
- AAPT_EXPECT_FALSE(val2);
+ EXPECT_FALSE(val2);
val2 = make_nothing<std::string>();
- AAPT_EXPECT_FALSE(val2);
+ EXPECT_FALSE(val2);
}
TEST(MaybeTest, MakeSomething) {
Maybe<int> val = make_value(23);
- AAPT_ASSERT_TRUE(val);
+ ASSERT_TRUE(val);
EXPECT_EQ(23, val.value());
Maybe<std::string> val2 = make_value(std::string("hey"));
- AAPT_ASSERT_TRUE(val2);
+ ASSERT_TRUE(val2);
EXPECT_EQ(std::string("hey"), val2.value());
}
diff --git a/tools/aapt2/util/Util.cpp b/tools/aapt2/util/Util.cpp
index 8a8be85..51a75d7 100644
--- a/tools/aapt2/util/Util.cpp
+++ b/tools/aapt2/util/Util.cpp
@@ -16,19 +16,21 @@
#include "util/Util.h"
-#include <utils/Unicode.h>
#include <algorithm>
#include <ostream>
#include <string>
#include <vector>
#include "androidfw/StringPiece.h"
+#include "utils/Unicode.h"
+#include "text/Utf8Iterator.h"
#include "util/BigBuffer.h"
#include "util/Maybe.h"
-using android::StringPiece;
-using android::StringPiece16;
+using ::aapt::text::Utf8Iterator;
+using ::android::StringPiece;
+using ::android::StringPiece16;
namespace aapt {
namespace util {
@@ -283,33 +285,46 @@
return true;
}
-static Maybe<std::string> ParseUnicodeCodepoint(const char** start,
- const char* end) {
+static bool AppendCodepointToUtf8String(char32_t codepoint, std::string* output) {
+ ssize_t len = utf32_to_utf8_length(&codepoint, 1);
+ if (len < 0) {
+ return false;
+ }
+
+ const size_t start_append_pos = output->size();
+
+ // Make room for the next character.
+ output->resize(output->size() + len);
+
+ char* dst = &*(output->begin() + start_append_pos);
+ utf32_to_utf8(&codepoint, 1, dst, len + 1);
+ return true;
+}
+
+static bool AppendUnicodeCodepoint(Utf8Iterator* iter, std::string* output) {
char32_t code = 0;
- for (size_t i = 0; i < 4 && *start != end; i++, (*start)++) {
- char c = **start;
+ for (size_t i = 0; i < 4 && iter->HasNext(); i++) {
+ char32_t codepoint = iter->Next();
char32_t a;
- if (c >= '0' && c <= '9') {
- a = c - '0';
- } else if (c >= 'a' && c <= 'f') {
- a = c - 'a' + 10;
- } else if (c >= 'A' && c <= 'F') {
- a = c - 'A' + 10;
+ if (codepoint >= U'0' && codepoint <= U'9') {
+ a = codepoint - U'0';
+ } else if (codepoint >= U'a' && codepoint <= U'f') {
+ a = codepoint - U'a' + 10;
+ } else if (codepoint >= U'A' && codepoint <= U'F') {
+ a = codepoint - U'A' + 10;
} else {
return {};
}
code = (code << 4) | a;
}
+ return AppendCodepointToUtf8String(code, output);
+}
- ssize_t len = utf32_to_utf8_length(&code, 1);
- if (len < 0) {
- return {};
+static bool IsCodepointSpace(char32_t codepoint) {
+ if (static_cast<uint32_t>(codepoint) & 0xffffff00u) {
+ return false;
}
-
- std::string result_utf8;
- result_utf8.resize(len);
- utf32_to_utf8(&code, 1, &*result_utf8.begin(), len + 1);
- return result_utf8;
+ return isspace(static_cast<char>(codepoint));
}
StringBuilder::StringBuilder(bool preserve_spaces) : preserve_spaces_(preserve_spaces) {
@@ -321,57 +336,46 @@
}
// Where the new data will be appended to.
- size_t new_data_index = str_.size();
+ const size_t new_data_index = str_.size();
- const char* const end = str.end();
- const char* start = str.begin();
- const char* current = start;
- while (current != end) {
+ Utf8Iterator iter(str);
+ while (iter.HasNext()) {
+ const char32_t codepoint = iter.Next();
+
if (last_char_was_escape_) {
- switch (*current) {
- case 't':
+ switch (codepoint) {
+ case U't':
str_ += '\t';
break;
- case 'n':
+
+ case U'n':
str_ += '\n';
break;
- case '#':
- str_ += '#';
+
+ case U'#':
+ case U'@':
+ case U'?':
+ case U'"':
+ case U'\'':
+ case U'\\':
+ str_ += static_cast<char>(codepoint);
break;
- case '@':
- str_ += '@';
- break;
- case '?':
- str_ += '?';
- break;
- case '"':
- str_ += '"';
- break;
- case '\'':
- str_ += '\'';
- break;
- case '\\':
- str_ += '\\';
- break;
- case 'u': {
- current++;
- Maybe<std::string> c = ParseUnicodeCodepoint(¤t, end);
- if (!c) {
+
+ case U'u':
+ if (!AppendUnicodeCodepoint(&iter, &str_)) {
error_ = "invalid unicode escape sequence";
return *this;
}
- str_ += c.value();
- current -= 1;
break;
- }
default:
- // Ignore.
+ // Ignore the escape character and just include the codepoint.
+ AppendCodepointToUtf8String(codepoint, &str_);
break;
}
last_char_was_escape_ = false;
- start = current + 1;
- } else if (!preserve_spaces_ && *current == '"') {
+
+ } else if (!preserve_spaces_ && codepoint == U'"') {
if (!quote_ && trailing_space_) {
// We found an opening quote, and we have trailing space, so we should append that
// space now.
@@ -384,13 +388,13 @@
}
}
quote_ = !quote_;
- str_.append(start, current - start);
- start = current + 1;
- } else if (!preserve_spaces_ && *current == '\'' && !quote_) {
+
+ } else if (!preserve_spaces_ && codepoint == U'\'' && !quote_) {
// This should be escaped.
error_ = "unescaped apostrophe";
return *this;
- } else if (*current == '\\') {
+
+ } else if (codepoint == U'\\') {
// This is an escape sequence, convert to the real value.
if (!quote_ && trailing_space_) {
// We had trailing whitespace, so
@@ -400,40 +404,35 @@
}
trailing_space_ = false;
}
- str_.append(start, current - start);
- start = current + 1;
last_char_was_escape_ = true;
- } else if (!preserve_spaces_ && !quote_) {
- // This is not quoted text, so look for whitespace.
- if (isspace(*current)) {
- // We found whitespace, see if we have seen some
- // before.
- if (!trailing_space_) {
- // We didn't see a previous adjacent space,
- // so mark that we did.
+ } else {
+ if (preserve_spaces_ || quote_) {
+ // Quotes mean everything is taken, including whitespace.
+ AppendCodepointToUtf8String(codepoint, &str_);
+ } else {
+ // This is not quoted text, so we will accumulate whitespace and only emit a single
+ // character of whitespace if it is followed by a non-whitespace character.
+ if (IsCodepointSpace(codepoint)) {
+ // We found whitespace.
trailing_space_ = true;
- str_.append(start, current - start);
+ } else {
+ if (trailing_space_) {
+ // We saw trailing space before, so replace all
+ // that trailing space with one space.
+ if (!str_.empty()) {
+ str_ += ' ';
+ }
+ trailing_space_ = false;
+ }
+ AppendCodepointToUtf8String(codepoint, &str_);
}
-
- // Keep skipping whitespace.
- start = current + 1;
- } else if (trailing_space_) {
- // We saw trailing space before, so replace all
- // that trailing space with one space.
- if (!str_.empty()) {
- str_ += ' ';
- }
- trailing_space_ = false;
}
}
- current++;
}
- str_.append(start, end - start);
// Accumulate the added string's UTF-16 length.
- ssize_t len = utf8_to_utf16_length(
- reinterpret_cast<const uint8_t*>(str_.data()) + new_data_index,
- str_.size() - new_data_index);
+ ssize_t len = utf8_to_utf16_length(reinterpret_cast<const uint8_t*>(str_.data()) + new_data_index,
+ str_.size() - new_data_index);
if (len < 0) {
error_ = "invalid unicode code point";
return *this;
diff --git a/tools/aapt2/util/Util_test.cpp b/tools/aapt2/util/Util_test.cpp
index 5cced3e..adb5291 100644
--- a/tools/aapt2/util/Util_test.cpp
+++ b/tools/aapt2/util/Util_test.cpp
@@ -136,58 +136,34 @@
}
TEST(UtilTest, FullyQualifiedClassName) {
- Maybe<std::string> res = util::GetFullyQualifiedClassName("android", ".asdf");
- AAPT_ASSERT_TRUE(res);
- EXPECT_EQ(res.value(), "android.asdf");
-
- res = util::GetFullyQualifiedClassName("android", ".a.b");
- AAPT_ASSERT_TRUE(res);
- EXPECT_EQ(res.value(), "android.a.b");
-
- res = util::GetFullyQualifiedClassName("android", "a.b");
- AAPT_ASSERT_TRUE(res);
- EXPECT_EQ(res.value(), "a.b");
-
- res = util::GetFullyQualifiedClassName("", "a.b");
- AAPT_ASSERT_TRUE(res);
- EXPECT_EQ(res.value(), "a.b");
-
- res = util::GetFullyQualifiedClassName("android", "Class");
- AAPT_ASSERT_TRUE(res);
- EXPECT_EQ(res.value(), "android.Class");
-
- res = util::GetFullyQualifiedClassName("", "");
- AAPT_ASSERT_FALSE(res);
-
- res = util::GetFullyQualifiedClassName("android", "./Apple");
- AAPT_ASSERT_FALSE(res);
+ EXPECT_THAT(util::GetFullyQualifiedClassName("android", ".asdf"), Eq("android.asdf"));
+ EXPECT_THAT(util::GetFullyQualifiedClassName("android", ".a.b"), Eq("android.a.b"));
+ EXPECT_THAT(util::GetFullyQualifiedClassName("android", "a.b"), Eq("a.b"));
+ EXPECT_THAT(util::GetFullyQualifiedClassName("", "a.b"), Eq("a.b"));
+ EXPECT_THAT(util::GetFullyQualifiedClassName("android", "Class"), Eq("android.Class"));
+ EXPECT_FALSE(util::GetFullyQualifiedClassName("", ""));
+ EXPECT_FALSE(util::GetFullyQualifiedClassName("android", "./Apple"));
}
TEST(UtilTest, ExtractResourcePathComponents) {
StringPiece prefix, entry, suffix;
- ASSERT_TRUE(util::ExtractResFilePathParts("res/xml-sw600dp/entry.xml",
- &prefix, &entry, &suffix));
- EXPECT_EQ(prefix, "res/xml-sw600dp/");
- EXPECT_EQ(entry, "entry");
- EXPECT_EQ(suffix, ".xml");
+ ASSERT_TRUE(util::ExtractResFilePathParts("res/xml-sw600dp/entry.xml", &prefix, &entry, &suffix));
+ EXPECT_THAT(prefix, Eq("res/xml-sw600dp/"));
+ EXPECT_THAT(entry, Eq("entry"));
+ EXPECT_THAT(suffix, Eq(".xml"));
- ASSERT_TRUE(util::ExtractResFilePathParts("res/xml-sw600dp/entry.9.png",
- &prefix, &entry, &suffix));
+ ASSERT_TRUE(util::ExtractResFilePathParts("res/xml-sw600dp/entry.9.png", &prefix, &entry, &suffix));
+ EXPECT_THAT(prefix, Eq("res/xml-sw600dp/"));
+ EXPECT_THAT(entry, Eq("entry"));
+ EXPECT_THAT(suffix, Eq(".9.png"));
- EXPECT_EQ(prefix, "res/xml-sw600dp/");
- EXPECT_EQ(entry, "entry");
- EXPECT_EQ(suffix, ".9.png");
+ ASSERT_TRUE(util::ExtractResFilePathParts("res//.", &prefix, &entry, &suffix));
+ EXPECT_THAT(prefix, Eq("res//"));
+ EXPECT_THAT(entry, Eq(""));
+ EXPECT_THAT(suffix, Eq("."));
- EXPECT_FALSE(util::ExtractResFilePathParts("AndroidManifest.xml", &prefix,
- &entry, &suffix));
- EXPECT_FALSE(
- util::ExtractResFilePathParts("res/.xml", &prefix, &entry, &suffix));
-
- ASSERT_TRUE(
- util::ExtractResFilePathParts("res//.", &prefix, &entry, &suffix));
- EXPECT_EQ(prefix, "res//");
- EXPECT_EQ(entry, "");
- EXPECT_EQ(suffix, ".");
+ EXPECT_FALSE(util::ExtractResFilePathParts("AndroidManifest.xml", &prefix, &entry, &suffix));
+ EXPECT_FALSE(util::ExtractResFilePathParts("res/.xml", &prefix, &entry, &suffix));
}
TEST(UtilTest, VerifyJavaStringFormat) {
diff --git a/tools/aapt2/xml/XmlActionExecutor_test.cpp b/tools/aapt2/xml/XmlActionExecutor_test.cpp
index 7110c90..0fe7ab0 100644
--- a/tools/aapt2/xml/XmlActionExecutor_test.cpp
+++ b/tools/aapt2/xml/XmlActionExecutor_test.cpp
@@ -18,6 +18,8 @@
#include "test/Test.h"
+using ::testing::NotNull;
+
namespace aapt {
namespace xml {
@@ -42,12 +44,11 @@
test::BuildXmlDom("<manifest><application /></manifest>");
StdErrDiagnostics diag;
- ASSERT_TRUE(
- executor.Execute(XmlActionExecutorPolicy::kNone, &diag, doc.get()));
- ASSERT_NE(nullptr, manifest_el);
+ ASSERT_TRUE(executor.Execute(XmlActionExecutorPolicy::kNone, &diag, doc.get()));
+ ASSERT_THAT(manifest_el, NotNull());
EXPECT_EQ(std::string("manifest"), manifest_el->name);
- ASSERT_NE(nullptr, application_el);
+ ASSERT_THAT(application_el, NotNull());
EXPECT_EQ(std::string("application"), application_el->name);
}
@@ -58,8 +59,7 @@
std::unique_ptr<XmlResource> doc =
test::BuildXmlDom("<manifest><application /><activity /></manifest>");
StdErrDiagnostics diag;
- ASSERT_FALSE(
- executor.Execute(XmlActionExecutorPolicy::kWhitelist, &diag, doc.get()));
+ ASSERT_FALSE(executor.Execute(XmlActionExecutorPolicy::kWhitelist, &diag, doc.get()));
}
} // namespace xml
diff --git a/tools/aapt2/xml/XmlDom_test.cpp b/tools/aapt2/xml/XmlDom_test.cpp
index 031801e..f0122e8 100644
--- a/tools/aapt2/xml/XmlDom_test.cpp
+++ b/tools/aapt2/xml/XmlDom_test.cpp
@@ -21,6 +21,10 @@
#include "test/Test.h"
+using ::testing::Eq;
+using ::testing::NotNull;
+using ::testing::SizeIs;
+
namespace aapt {
constexpr const char* kXmlPreamble =
@@ -40,12 +44,12 @@
const Source source("test.xml");
StdErrDiagnostics diag;
std::unique_ptr<xml::XmlResource> doc = xml::Inflate(&in, &diag, source);
- ASSERT_NE(doc, nullptr);
+ ASSERT_THAT(doc, NotNull());
xml::Namespace* ns = xml::NodeCast<xml::Namespace>(doc->root.get());
- ASSERT_NE(ns, nullptr);
- EXPECT_EQ(ns->namespace_uri, xml::kSchemaAndroid);
- EXPECT_EQ(ns->namespace_prefix, "android");
+ ASSERT_THAT(ns, NotNull());
+ EXPECT_THAT(ns->namespace_uri, Eq(xml::kSchemaAndroid));
+ EXPECT_THAT(ns->namespace_prefix, Eq("android"));
}
// Escaping is handled after parsing of the values for resource-specific values.
@@ -53,31 +57,34 @@
std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDom(R"(
<element value="\?hello" pattern="\\d{5}">\\d{5}</element>)");
- xml::Element* el = xml::FindRootElement(doc->root.get());
- ASSERT_NE(nullptr, el);
+ xml::Element* el = xml::FindRootElement(doc.get());
+ ASSERT_THAT(el, NotNull());
xml::Attribute* attr = el->FindAttribute({}, "pattern");
- ASSERT_NE(nullptr, attr);
- EXPECT_EQ("\\\\d{5}", attr->value);
+ ASSERT_THAT(attr, NotNull());
+ EXPECT_THAT(attr->value, Eq("\\\\d{5}"));
attr = el->FindAttribute({}, "value");
- ASSERT_NE(nullptr, attr);
- EXPECT_EQ("\\?hello", attr->value);
+ ASSERT_THAT(attr, NotNull());
+ EXPECT_THAT(attr->value, Eq("\\?hello"));
+
+ ASSERT_THAT(el->children, SizeIs(1u));
xml::Text* text = xml::NodeCast<xml::Text>(el->children[0].get());
- ASSERT_NE(nullptr, text);
- EXPECT_EQ("\\\\d{5}", text->text);
+ ASSERT_THAT(text, NotNull());
+ EXPECT_THAT(text->text, Eq("\\\\d{5}"));
}
TEST(XmlDomTest, XmlEscapeSequencesAreParsed) {
std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDom(R"(<element value=""" />)");
xml::Element* el = xml::FindRootElement(doc.get());
- ASSERT_NE(nullptr, el);
+ ASSERT_THAT(el, NotNull());
xml::Attribute* attr = el->FindAttribute({}, "value");
- ASSERT_NE(nullptr, attr);
- EXPECT_EQ("\"", attr->value);
+ ASSERT_THAT(attr, NotNull());
+
+ EXPECT_THAT(attr->value, Eq("\""));
}
} // namespace aapt
diff --git a/tools/aapt2/xml/XmlUtil_test.cpp b/tools/aapt2/xml/XmlUtil_test.cpp
index 5eecc8f..cbded8f 100644
--- a/tools/aapt2/xml/XmlUtil_test.cpp
+++ b/tools/aapt2/xml/XmlUtil_test.cpp
@@ -21,37 +21,30 @@
namespace aapt {
TEST(XmlUtilTest, ExtractPackageFromNamespace) {
- AAPT_ASSERT_FALSE(xml::ExtractPackageFromNamespace("com.android"));
- AAPT_ASSERT_FALSE(
- xml::ExtractPackageFromNamespace("http://schemas.android.com/apk"));
- AAPT_ASSERT_FALSE(
- xml::ExtractPackageFromNamespace("http://schemas.android.com/apk/res"));
- AAPT_ASSERT_FALSE(
- xml::ExtractPackageFromNamespace("http://schemas.android.com/apk/res/"));
- AAPT_ASSERT_FALSE(xml::ExtractPackageFromNamespace(
- "http://schemas.android.com/apk/prv/res/"));
+ ASSERT_FALSE(xml::ExtractPackageFromNamespace("com.android"));
+ ASSERT_FALSE(xml::ExtractPackageFromNamespace("http://schemas.android.com/apk"));
+ ASSERT_FALSE(xml::ExtractPackageFromNamespace("http://schemas.android.com/apk/res"));
+ ASSERT_FALSE(xml::ExtractPackageFromNamespace("http://schemas.android.com/apk/res/"));
+ ASSERT_FALSE(xml::ExtractPackageFromNamespace("http://schemas.android.com/apk/prv/res/"));
Maybe<xml::ExtractedPackage> p =
xml::ExtractPackageFromNamespace("http://schemas.android.com/apk/res/a");
- AAPT_ASSERT_TRUE(p);
+ ASSERT_TRUE(p);
EXPECT_EQ(std::string("a"), p.value().package);
EXPECT_FALSE(p.value().private_namespace);
- p = xml::ExtractPackageFromNamespace(
- "http://schemas.android.com/apk/prv/res/android");
- AAPT_ASSERT_TRUE(p);
+ p = xml::ExtractPackageFromNamespace("http://schemas.android.com/apk/prv/res/android");
+ ASSERT_TRUE(p);
EXPECT_EQ(std::string("android"), p.value().package);
EXPECT_TRUE(p.value().private_namespace);
- p = xml::ExtractPackageFromNamespace(
- "http://schemas.android.com/apk/prv/res/com.test");
- AAPT_ASSERT_TRUE(p);
+ p = xml::ExtractPackageFromNamespace("http://schemas.android.com/apk/prv/res/com.test");
+ ASSERT_TRUE(p);
EXPECT_EQ(std::string("com.test"), p.value().package);
EXPECT_TRUE(p.value().private_namespace);
- p = xml::ExtractPackageFromNamespace(
- "http://schemas.android.com/apk/res-auto");
- AAPT_ASSERT_TRUE(p);
+ p = xml::ExtractPackageFromNamespace("http://schemas.android.com/apk/res-auto");
+ ASSERT_TRUE(p);
EXPECT_EQ(std::string(), p.value().package);
EXPECT_TRUE(p.value().private_namespace);
}
diff --git a/tools/bit/adb.cpp b/tools/bit/adb.cpp
index 0c8424d..c8faf5c 100644
--- a/tools/bit/adb.cpp
+++ b/tools/bit/adb.cpp
@@ -283,10 +283,19 @@
cmd.AddArg("instrument");
cmd.AddArg("-w");
cmd.AddArg("-m");
- if (className.length() > 0) {
- cmd.AddArg("-e");
- cmd.AddArg("class");
- cmd.AddArg(className);
+ const int classLen = className.length();
+ if (classLen > 0) {
+ if (classLen > 1 && className[classLen - 1] == '.') {
+ cmd.AddArg("-e");
+ cmd.AddArg("package");
+
+ // "am" actually accepts without removing the last ".", but for cleanlines...
+ cmd.AddArg(className.substr(0, classLen - 1));
+ } else {
+ cmd.AddArg("-e");
+ cmd.AddArg("class");
+ cmd.AddArg(className);
+ }
}
cmd.AddArg(packageName + "/" + runner);
diff --git a/tools/bit/main.cpp b/tools/bit/main.cpp
index d056ba5..a7fbc2e 100644
--- a/tools/bit/main.cpp
+++ b/tools/bit/main.cpp
@@ -342,6 +342,10 @@
fprintf(out, " Builds and installs CtsProtoTestCases.apk, and runs the testWrite\n");
fprintf(out, " and testRepeated test methods on that class.\n");
fprintf(out, "\n");
+ fprintf(out, " bit CtsProtoTestCases:android.util.proto.cts.\n");
+ fprintf(out, " Builds and installs CtsProtoTestCases.apk, and runs the tests in the java package\n");
+ fprintf(out, " \"android.util.proto.cts\".\n");
+ fprintf(out, "\n");
fprintf(out, " Launching an Activity\n");
fprintf(out, " ---------------------\n");
fprintf(out, " To launch an activity, specify the activity class name after\n");
@@ -731,7 +735,7 @@
InstallApk& apk = installApks[i];
if (!apk.file.fileInfo.exists || apk.file.HasChanged()) {
// It didn't exist before or it changed, so int needs install
- err = run_adb("install", "-r", apk.file.filename.c_str(), NULL);
+ err = run_adb("install", "-r", "-g", apk.file.filename.c_str(), NULL);
check_error(err);
apk.installed = true;
} else {
diff --git a/tools/incident_report/Android.mk b/tools/incident_report/Android.mk
index e57a959..9e56e3d 100644
--- a/tools/incident_report/Android.mk
+++ b/tools/incident_report/Android.mk
@@ -34,9 +34,6 @@
libplatformprotos \
libprotobuf-cpp-full
-# b/34740546, work around clang-tidy segmentation fault.
-LOCAL_TIDY_CHECKS := -modernize*
-
LOCAL_C_FLAGS := \
-Wno-unused-parameter
include $(BUILD_HOST_EXECUTABLE)
diff --git a/tools/incident_section_gen/Android.mk b/tools/incident_section_gen/Android.mk
index 0549026..acf3f83 100644
--- a/tools/incident_section_gen/Android.mk
+++ b/tools/incident_section_gen/Android.mk
@@ -21,8 +21,6 @@
include $(CLEAR_VARS)
LOCAL_MODULE := incident-section-gen
-# b/34740546, work around clang-tidy segmentation fault.
-LOCAL_TIDY_CHECKS := -modernize*
LOCAL_CFLAGS += -g -O0
LOCAL_C_INCLUDES := \
external/protobuf/src
diff --git a/tools/locked_region_code_injection/Android.mk b/tools/locked_region_code_injection/Android.mk
new file mode 100644
index 0000000..0aed0ce
--- /dev/null
+++ b/tools/locked_region_code_injection/Android.mk
@@ -0,0 +1,15 @@
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_JAR_MANIFEST := manifest.txt
+LOCAL_MODULE := lockedregioncodeinjection
+LOCAL_SRC_FILES := $(call all-java-files-under,src)
+LOCAL_STATIC_JAVA_LIBRARIES := \
+ asm-5.2 \
+ asm-commons-5.2 \
+ asm-tree-5.2 \
+ asm-analysis-5.2
+
+
+include $(BUILD_HOST_JAVA_LIBRARY)
diff --git a/tools/locked_region_code_injection/manifest.txt b/tools/locked_region_code_injection/manifest.txt
new file mode 100644
index 0000000..4b9de00
--- /dev/null
+++ b/tools/locked_region_code_injection/manifest.txt
@@ -0,0 +1 @@
+Main-Class: lockedregioncodeinjection.Main
diff --git a/tools/locked_region_code_injection/src/lockedregioncodeinjection/LockFindingClassVisitor.java b/tools/locked_region_code_injection/src/lockedregioncodeinjection/LockFindingClassVisitor.java
new file mode 100644
index 0000000..9374f23
--- /dev/null
+++ b/tools/locked_region_code_injection/src/lockedregioncodeinjection/LockFindingClassVisitor.java
@@ -0,0 +1,241 @@
+/*
+ * Copyright (C) 2017 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 lockedregioncodeinjection;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.commons.TryCatchBlockSorter;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.InsnList;
+import org.objectweb.asm.tree.LabelNode;
+import org.objectweb.asm.tree.MethodInsnNode;
+import org.objectweb.asm.tree.MethodNode;
+import org.objectweb.asm.tree.TryCatchBlockNode;
+import org.objectweb.asm.tree.analysis.Analyzer;
+import org.objectweb.asm.tree.analysis.AnalyzerException;
+import org.objectweb.asm.tree.analysis.BasicValue;
+import org.objectweb.asm.tree.analysis.Frame;
+
+/**
+ * This visitor does two things:
+ *
+ * 1. Finds all the MONITOR_ENTER / MONITOR_EXIT in the byte code and insert the corresponding pre
+ * and post methods calls should it matches one of the given target type in the Configuration.
+ *
+ * 2. Find all methods that are synchronized and insert pre method calls in the beginning and post
+ * method calls just before all return instructions.
+ */
+class LockFindingClassVisitor extends ClassVisitor {
+ private String className = null;
+ private final List<LockTarget> targets;
+
+ public LockFindingClassVisitor(List<LockTarget> targets, ClassVisitor chain) {
+ super(Utils.ASM_VERSION, chain);
+ this.targets = targets;
+ }
+
+ @Override
+ public MethodVisitor visitMethod(int access, String name, String desc, String signature,
+ String[] exceptions) {
+ assert this.className != null;
+ MethodNode mn = new TryCatchBlockSorter(null, access, name, desc, signature, exceptions);
+ MethodVisitor chain = super.visitMethod(access, name, desc, signature, exceptions);
+ return new LockFindingMethodVisitor(this.className, mn, chain);
+ }
+
+ @Override
+ public void visit(int version, int access, String name, String signature, String superName,
+ String[] interfaces) {
+ this.className = name;
+ super.visit(version, access, name, signature, superName, interfaces);
+ }
+
+ class LockFindingMethodVisitor extends MethodVisitor {
+ private String owner;
+ private MethodVisitor chain;
+
+ public LockFindingMethodVisitor(String owner, MethodNode mn, MethodVisitor chain) {
+ super(Opcodes.ASM5, mn);
+ assert owner != null;
+ this.owner = owner;
+ this.chain = chain;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void visitEnd() {
+ MethodNode mn = (MethodNode) mv;
+
+ Analyzer a = new Analyzer(new LockTargetStateAnalysis(targets));
+
+ LockTarget ownerMonitor = null;
+ if ((mn.access & Opcodes.ACC_SYNCHRONIZED) != 0) {
+ for (LockTarget t : targets) {
+ if (t.getTargetDesc().equals("L" + owner + ";")) {
+ ownerMonitor = t;
+ }
+ }
+ }
+
+ try {
+ a.analyze(owner, mn);
+ } catch (AnalyzerException e) {
+ e.printStackTrace();
+ }
+ InsnList instructions = mn.instructions;
+
+ Frame[] frames = a.getFrames();
+ List<Frame> frameMap = new LinkedList<>();
+ frameMap.addAll(Arrays.asList(frames));
+
+ List<List<TryCatchBlockNode>> handlersMap = new LinkedList<>();
+
+ for (int i = 0; i < instructions.size(); i++) {
+ handlersMap.add(a.getHandlers(i));
+ }
+
+ if (ownerMonitor != null) {
+ AbstractInsnNode s = instructions.getFirst();
+ MethodInsnNode call = new MethodInsnNode(Opcodes.INVOKESTATIC,
+ ownerMonitor.getPreOwner(), ownerMonitor.getPreMethod(), "()V", false);
+ insertMethodCallBefore(mn, frameMap, handlersMap, s, 0, call);
+ }
+
+ for (int i = 0; i < instructions.size(); i++) {
+ AbstractInsnNode s = instructions.get(i);
+
+ if (s.getOpcode() == Opcodes.MONITORENTER) {
+ Frame f = frameMap.get(i);
+ BasicValue operand = (BasicValue) f.getStack(f.getStackSize() - 1);
+ if (operand instanceof LockTargetState) {
+ LockTargetState state = (LockTargetState) operand;
+ for (int j = 0; j < state.getTargets().size(); j++) {
+ LockTarget target = state.getTargets().get(j);
+ MethodInsnNode call = new MethodInsnNode(Opcodes.INVOKESTATIC,
+ target.getPreOwner(), target.getPreMethod(), "()V", false);
+ insertMethodCallAfter(mn, frameMap, handlersMap, s, i, call);
+ }
+ }
+ }
+
+ if (s.getOpcode() == Opcodes.MONITOREXIT) {
+ Frame f = frameMap.get(i);
+ BasicValue operand = (BasicValue) f.getStack(f.getStackSize() - 1);
+ if (operand instanceof LockTargetState) {
+ LockTargetState state = (LockTargetState) operand;
+ for (int j = 0; j < state.getTargets().size(); j++) {
+ LockTarget target = state.getTargets().get(j);
+ MethodInsnNode call = new MethodInsnNode(Opcodes.INVOKESTATIC,
+ target.getPostOwner(), target.getPostMethod(), "()V", false);
+ insertMethodCallAfter(mn, frameMap, handlersMap, s, i, call);
+ }
+ }
+ }
+
+ if (ownerMonitor != null && (s.getOpcode() == Opcodes.RETURN
+ || s.getOpcode() == Opcodes.ARETURN || s.getOpcode() == Opcodes.DRETURN
+ || s.getOpcode() == Opcodes.FRETURN || s.getOpcode() == Opcodes.IRETURN)) {
+ MethodInsnNode call =
+ new MethodInsnNode(Opcodes.INVOKESTATIC, ownerMonitor.getPostOwner(),
+ ownerMonitor.getPostMethod(), "()V", false);
+ insertMethodCallBefore(mn, frameMap, handlersMap, s, i, call);
+ i++; // Skip ahead. Otherwise, we will revisit this instruction again.
+ }
+ }
+ super.visitEnd();
+ mn.accept(chain);
+ }
+ }
+
+ public static void insertMethodCallBefore(MethodNode mn, List<Frame> frameMap,
+ List<List<TryCatchBlockNode>> handlersMap, AbstractInsnNode node, int index,
+ MethodInsnNode call) {
+ List<TryCatchBlockNode> handlers = handlersMap.get(index);
+ InsnList instructions = mn.instructions;
+ LabelNode end = new LabelNode();
+ instructions.insert(node, end);
+ frameMap.add(index, null);
+ handlersMap.add(index, null);
+ instructions.insertBefore(node, call);
+ frameMap.add(index, null);
+ handlersMap.add(index, null);
+
+ LabelNode start = new LabelNode();
+ instructions.insert(node, start);
+ frameMap.add(index, null);
+ handlersMap.add(index, null);
+ updateCatchHandler(mn, handlers, start, end, handlersMap);
+ }
+
+ public static void insertMethodCallAfter(MethodNode mn, List<Frame> frameMap,
+ List<List<TryCatchBlockNode>> handlersMap, AbstractInsnNode node, int index,
+ MethodInsnNode call) {
+ List<TryCatchBlockNode> handlers = handlersMap.get(index + 1);
+ InsnList instructions = mn.instructions;
+
+ LabelNode end = new LabelNode();
+ instructions.insert(node, end);
+ frameMap.add(index + 1, null);
+ handlersMap.add(index + 1, null);
+
+ instructions.insert(node, call);
+ frameMap.add(index + 1, null);
+ handlersMap.add(index + 1, null);
+
+ LabelNode start = new LabelNode();
+ instructions.insert(node, start);
+ frameMap.add(index + 1, null);
+ handlersMap.add(index + 1, null);
+
+ updateCatchHandler(mn, handlers, start, end, handlersMap);
+ }
+
+ @SuppressWarnings("unchecked")
+ public static void updateCatchHandler(MethodNode mn, List<TryCatchBlockNode> handlers,
+ LabelNode start, LabelNode end, List<List<TryCatchBlockNode>> handlersMap) {
+ if (handlers == null || handlers.size() == 0) {
+ return;
+ }
+
+ InsnList instructions = mn.instructions;
+ List<TryCatchBlockNode> newNodes = new ArrayList<>(handlers.size());
+ for (TryCatchBlockNode handler : handlers) {
+ if (!(instructions.indexOf(handler.start) <= instructions.indexOf(start)
+ && instructions.indexOf(end) <= instructions.indexOf(handler.end))) {
+ TryCatchBlockNode newNode =
+ new TryCatchBlockNode(start, end, handler.handler, handler.type);
+ newNodes.add(newNode);
+ for (int i = instructions.indexOf(start); i <= instructions.indexOf(end); i++) {
+ if (handlersMap.get(i) == null) {
+ handlersMap.set(i, new ArrayList<>());
+ }
+ handlersMap.get(i).add(newNode);
+ }
+ } else {
+ for (int i = instructions.indexOf(start); i <= instructions.indexOf(end); i++) {
+ if (handlersMap.get(i) == null) {
+ handlersMap.set(i, new ArrayList<>());
+ }
+ handlersMap.get(i).add(handler);
+ }
+ }
+ }
+ mn.tryCatchBlocks.addAll(0, newNodes);
+ }
+}
diff --git a/tools/locked_region_code_injection/src/lockedregioncodeinjection/LockTarget.java b/tools/locked_region_code_injection/src/lockedregioncodeinjection/LockTarget.java
new file mode 100644
index 0000000..c5e59e3
--- /dev/null
+++ b/tools/locked_region_code_injection/src/lockedregioncodeinjection/LockTarget.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2017 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 lockedregioncodeinjection;
+
+/**
+ * Represent a specific class that is used for synchronization. A pre and post method can be
+ * specified to by the user to be called right after monitor_enter and after monitor_exit
+ * respectively.
+ */
+public class LockTarget {
+ public static final LockTarget NO_TARGET = new LockTarget("", null, null);
+
+ private final String targetDesc;
+ private final String pre;
+ private final String post;
+
+ public LockTarget(String targetDesc, String pre, String post) {
+ this.targetDesc = targetDesc;
+ this.pre = pre;
+ this.post = post;
+ }
+
+ public String getTargetDesc() {
+ return targetDesc;
+ }
+
+ public String getPre() {
+ return pre;
+ }
+
+ public String getPreOwner() {
+ return pre.substring(0, pre.lastIndexOf('.'));
+ }
+
+ public String getPreMethod() {
+ return pre.substring(pre.lastIndexOf('.') + 1);
+ }
+
+ public String getPost() {
+ return post;
+ }
+
+ public String getPostOwner() {
+ return post.substring(0, post.lastIndexOf('.'));
+ }
+
+ public String getPostMethod() {
+ return post.substring(post.lastIndexOf('.') + 1);
+ }
+}
diff --git a/tools/locked_region_code_injection/src/lockedregioncodeinjection/LockTargetState.java b/tools/locked_region_code_injection/src/lockedregioncodeinjection/LockTargetState.java
new file mode 100644
index 0000000..99d8418
--- /dev/null
+++ b/tools/locked_region_code_injection/src/lockedregioncodeinjection/LockTargetState.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2017 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 lockedregioncodeinjection;
+
+import java.util.List;
+import org.objectweb.asm.Type;
+import org.objectweb.asm.tree.analysis.BasicValue;
+
+public class LockTargetState extends BasicValue {
+ private final List<LockTarget> lockTargets;
+
+ /**
+ * @param type
+ */
+ public LockTargetState(Type type, List<LockTarget> lockTargets) {
+ super(type);
+ this.lockTargets = lockTargets;
+ }
+
+ public List<LockTarget> getTargets() {
+ return lockTargets;
+ }
+}
diff --git a/tools/locked_region_code_injection/src/lockedregioncodeinjection/LockTargetStateAnalysis.java b/tools/locked_region_code_injection/src/lockedregioncodeinjection/LockTargetStateAnalysis.java
new file mode 100644
index 0000000..1002c88
--- /dev/null
+++ b/tools/locked_region_code_injection/src/lockedregioncodeinjection/LockTargetStateAnalysis.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2017 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 lockedregioncodeinjection;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.objectweb.asm.Type;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.MethodInsnNode;
+import org.objectweb.asm.tree.analysis.AnalyzerException;
+import org.objectweb.asm.tree.analysis.BasicInterpreter;
+import org.objectweb.asm.tree.analysis.BasicValue;
+
+/**
+ * A simple dataflow analysis to determine if the operands on the stack must be one of target lock
+ * class type.
+ */
+public class LockTargetStateAnalysis extends BasicInterpreter {
+
+ private final List<LockTarget> targetLocks;
+
+ public LockTargetStateAnalysis(List<LockTarget> targetLocks) {
+ this.targetLocks = targetLocks;
+ }
+
+ @Override
+ public BasicValue naryOperation(AbstractInsnNode inst, @SuppressWarnings("rawtypes") List args)
+ throws AnalyzerException {
+ // We target the return type of any invocation.
+
+ @SuppressWarnings("unchecked")
+ BasicValue base = super.naryOperation(inst, args);
+ if (!(inst instanceof MethodInsnNode)) {
+ return base;
+ }
+
+ MethodInsnNode invoke = (MethodInsnNode) inst;
+ Type returnType = Type.getReturnType(invoke.desc);
+ if (returnType.equals(Type.VOID_TYPE)) {
+ return base;
+ }
+
+ List<LockTarget> types = new ArrayList<>();
+
+ for (LockTarget target : targetLocks) {
+ if (returnType.getDescriptor().equals(target.getTargetDesc())) {
+ types.add(target);
+ }
+ }
+
+ return new LockTargetState(base.getType(), types);
+ }
+
+ @Override
+ public BasicValue newValue(Type type) {
+ BasicValue base = super.newValue(type);
+ List<LockTarget> types = new ArrayList<>();
+
+ if (type == null) {
+ return base;
+ }
+ for (LockTarget target : targetLocks) {
+ if (type.getDescriptor().equals(target.getTargetDesc())) {
+ types.add(target);
+ }
+ }
+
+ if (types.isEmpty()) {
+ return base;
+ }
+
+ return new LockTargetState(base.getType(), types);
+ }
+
+ @Override
+ public BasicValue merge(BasicValue v1, BasicValue v2) {
+ BasicValue base = super.merge(v1, v2);
+
+ if (!(v1 instanceof LockTargetState)) {
+ return base;
+ }
+ if (!(v2 instanceof LockTargetState)) {
+ return base;
+ }
+
+ LockTargetState state1 = (LockTargetState) v1;
+ LockTargetState state2 = (LockTargetState) v2;
+
+ List<LockTarget> newList = new ArrayList<>(state1.getTargets());
+ for (LockTarget otherTarget : state2.getTargets()) {
+ if (!newList.contains(otherTarget)) {
+ newList.add(otherTarget);
+ }
+ }
+
+ return new LockTargetState(base.getType(), newList);
+ }
+}
diff --git a/tools/locked_region_code_injection/src/lockedregioncodeinjection/Main.java b/tools/locked_region_code_injection/src/lockedregioncodeinjection/Main.java
new file mode 100644
index 0000000..edb9a49
--- /dev/null
+++ b/tools/locked_region_code_injection/src/lockedregioncodeinjection/Main.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2017 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 lockedregioncodeinjection;
+
+import java.io.BufferedInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+import java.util.zip.ZipOutputStream;
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassWriter;
+
+public class Main {
+ public static void main(String[] args) throws IOException {
+ String inJar = null;
+ String outJar = null;
+
+ String legacyTargets = null;
+ String legacyPreMethods = null;
+ String legacyPostMethods = null;
+ for (int i = 0; i < args.length; i++) {
+ if ("-i".equals(args[i].trim())) {
+ i++;
+ inJar = args[i].trim();
+ } else if ("-o".equals(args[i].trim())) {
+ i++;
+ outJar = args[i].trim();
+ } else if ("--targets".equals(args[i].trim())) {
+ i++;
+ legacyTargets = args[i].trim();
+ } else if ("--pre".equals(args[i].trim())) {
+ i++;
+ legacyPreMethods = args[i].trim();
+ } else if ("--post".equals(args[i].trim())) {
+ i++;
+ legacyPostMethods = args[i].trim();
+ }
+
+ }
+
+ // TODO(acleung): Better help message than asserts.
+ assert inJar != null;
+ assert outJar != null;
+ assert legacyTargets == null || (legacyPreMethods != null && legacyPostMethods != null);
+
+ ZipFile zipSrc = new ZipFile(inJar);
+ ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(outJar));
+ List<LockTarget> targets = null;
+ if (legacyTargets != null) {
+ targets = Utils.getTargetsFromLegacyJackConfig(legacyTargets, legacyPreMethods,
+ legacyPostMethods);
+ } else {
+ targets = Collections.emptyList();
+ }
+
+ Enumeration<? extends ZipEntry> srcEntries = zipSrc.entries();
+ while (srcEntries.hasMoreElements()) {
+ ZipEntry entry = srcEntries.nextElement();
+ ZipEntry newEntry = new ZipEntry(entry.getName());
+ zos.putNextEntry(newEntry);
+ BufferedInputStream bis = new BufferedInputStream(zipSrc.getInputStream(entry));
+
+ if (entry.getName().endsWith(".class")) {
+ convert(bis, zos, targets);
+ } else {
+ while (bis.available() > 0) {
+ zos.write(bis.read());
+ }
+ zos.closeEntry();
+ bis.close();
+ }
+ }
+ zos.finish();
+ zos.close();
+ zipSrc.close();
+ }
+
+ private static void convert(InputStream in, OutputStream out, List<LockTarget> targets)
+ throws IOException {
+ ClassReader cr = new ClassReader(in);
+ ClassWriter cw = new ClassWriter(0);
+ LockFindingClassVisitor cv = new LockFindingClassVisitor(targets, cw);
+ cr.accept(cv, 0);
+ byte[] data = cw.toByteArray();
+ out.write(data);
+ }
+}
diff --git a/tools/locked_region_code_injection/src/lockedregioncodeinjection/Utils.java b/tools/locked_region_code_injection/src/lockedregioncodeinjection/Utils.java
new file mode 100644
index 0000000..d2a2e7b
--- /dev/null
+++ b/tools/locked_region_code_injection/src/lockedregioncodeinjection/Utils.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2017 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 lockedregioncodeinjection;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.objectweb.asm.Opcodes;
+
+public class Utils {
+
+ public static final int ASM_VERSION = Opcodes.ASM5;
+
+ /**
+ * Reads a comma separated configuration similar to the Jack definition.
+ */
+ public static List<LockTarget> getTargetsFromLegacyJackConfig(String classList,
+ String requestList, String resetList) {
+
+ String[] classes = classList.split(",");
+ String[] requests = requestList.split(",");
+ String[] resets = resetList.split(",");
+
+ int total = classes.length;
+ assert requests.length == total;
+ assert resets.length == total;
+
+ List<LockTarget> config = new ArrayList<LockTarget>();
+
+ for (int i = 0; i < total; i++) {
+ config.add(new LockTarget(classes[i], requests[i], resets[i]));
+ }
+
+ return config;
+ }
+}
diff --git a/tools/locked_region_code_injection/test/lockedregioncodeinjection/TestMain.java b/tools/locked_region_code_injection/test/lockedregioncodeinjection/TestMain.java
new file mode 100644
index 0000000..1d4f2d4
--- /dev/null
+++ b/tools/locked_region_code_injection/test/lockedregioncodeinjection/TestMain.java
@@ -0,0 +1,231 @@
+/*
+ * Copyright (C) 2017 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 lockedregioncodeinjection;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * To run the unit tests:
+ *
+ * <pre>
+ * <code>
+ * set -x
+ *
+ * # Clean
+ * rm -fr out/*
+ *
+ * # Make booster
+ * javac -cp lib/asm-all-5.2.jar src/*/*.java -d out/
+ * pushd out
+ * jar cfe lockedregioncodeinjection.jar lockedregioncodeinjection.Main */*.class
+ * popd
+ *
+ * # Make unit tests.
+ * javac -cp lib/junit-4.12.jar test/*/*.java -d out/
+ *
+ * pushd out
+ * jar cfe test_input.jar lockedregioncodeinjection.Test */*.class
+ * popd
+ *
+ * # Run tool on unit tests.
+ * java -ea -cp lib/asm-all-5.2.jar:out/lockedregioncodeinjection.jar \
+ * lockedregioncodeinjection.Main \
+ * -i out/test_input.jar -o out/test_output.jar \
+ * --targets 'Llockedregioncodeinjection/TestTarget;' \
+ * --pre 'lockedregioncodeinjection/TestTarget.boost' \
+ * --post 'lockedregioncodeinjection/TestTarget.unboost'
+ *
+ * # Run unit tests.
+ * java -ea -cp lib/hamcrest-core-1.3.jar:lib/junit-4.12.jar:out/test_output.jar \
+ * org.junit.runner.JUnitCore lockedregioncodeinjection.TestMain
+ * </code>
+ * </pre>
+ */
+public class TestMain {
+ @Test
+ public void testSimpleSynchronizedBlock() {
+ TestTarget.resetCount();
+ TestTarget t = new TestTarget();
+
+ Assert.assertEquals(TestTarget.boostCount, 0);
+ Assert.assertEquals(TestTarget.unboostCount, 0);
+ Assert.assertEquals(TestTarget.unboostCount, 0);
+
+ synchronized (t) {
+ Assert.assertEquals(TestTarget.boostCount, 1);
+ Assert.assertEquals(TestTarget.unboostCount, 0);
+ TestTarget.invoke();
+ }
+
+ Assert.assertEquals(TestTarget.boostCount, 1);
+ Assert.assertEquals(TestTarget.unboostCount, 1);
+ Assert.assertEquals(TestTarget.invokeCount, 1);
+ }
+
+ @Test
+ public void testSimpleSynchronizedMethod() {
+ TestTarget.resetCount();
+ TestTarget t = new TestTarget();
+
+ Assert.assertEquals(TestTarget.boostCount, 0);
+ Assert.assertEquals(TestTarget.unboostCount, 0);
+
+ t.synchronizedCall();
+
+ Assert.assertEquals(TestTarget.boostCount, 1);
+ Assert.assertEquals(TestTarget.unboostCount, 1);
+ Assert.assertEquals(TestTarget.invokeCount, 1);
+ }
+
+ @Test
+ public void testSimpleSynchronizedMethod2() {
+ TestTarget.resetCount();
+ TestTarget t = new TestTarget();
+
+ Assert.assertEquals(TestTarget.boostCount, 0);
+ Assert.assertEquals(TestTarget.unboostCount, 0);
+
+ t.synchronizedCallReturnInt();
+
+ Assert.assertEquals(TestTarget.boostCount, 1);
+ Assert.assertEquals(TestTarget.unboostCount, 1);
+ Assert.assertEquals(TestTarget.invokeCount, 1);
+ }
+
+ @Test
+ public void testSimpleSynchronizedMethod3() {
+ TestTarget.resetCount();
+ TestTarget t = new TestTarget();
+
+ Assert.assertEquals(TestTarget.boostCount, 0);
+ Assert.assertEquals(TestTarget.unboostCount, 0);
+
+ t.synchronizedCallReturnObject();
+
+ Assert.assertEquals(TestTarget.boostCount, 1);
+ Assert.assertEquals(TestTarget.unboostCount, 1);
+ Assert.assertEquals(TestTarget.invokeCount, 1);
+ }
+
+ @SuppressWarnings("unused")
+ @Test
+ public void testCaughtException() {
+ TestTarget.resetCount();
+ TestTarget t = new TestTarget();
+ boolean caughtException = false;
+
+ Assert.assertEquals(TestTarget.boostCount, 0);
+ Assert.assertEquals(TestTarget.unboostCount, 0);
+ Assert.assertEquals(TestTarget.unboostCount, 0);
+
+ try {
+ synchronized (t) {
+ Assert.assertEquals(TestTarget.boostCount, 1);
+ Assert.assertEquals(TestTarget.unboostCount, 0);
+ if (true) {
+ throw new RuntimeException();
+ }
+ TestTarget.invoke();
+ }
+ } catch (Throwable e) {
+ caughtException = true;
+ }
+
+ Assert.assertEquals(TestTarget.boostCount, 1);
+ Assert.assertEquals(TestTarget.unboostCount, 1);
+ Assert.assertEquals(TestTarget.invokeCount, 0); // Not called
+ Assert.assertTrue(caughtException);
+ }
+
+ @SuppressWarnings("unused")
+ private void testUncaughtException() {
+ TestTarget t = new TestTarget();
+ synchronized (t) {
+ if (true) {
+ throw new RuntimeException();
+ }
+ TestTarget.invoke();
+ }
+ }
+
+ @SuppressWarnings("unused")
+ @Test
+ public void testHandledFinally() {
+ TestTarget.resetCount();
+ try {
+ testUncaughtException();
+ } catch (Throwable t) {
+
+ }
+ Assert.assertEquals(TestTarget.boostCount, 1);
+ Assert.assertEquals(TestTarget.unboostCount, 1);
+ Assert.assertEquals(TestTarget.invokeCount, 0); // Not called
+ }
+
+ @Test
+ public void testNestedSynchronizedBlock() {
+ TestTarget.resetCount();
+ TestTarget t = new TestTarget();
+
+ Assert.assertEquals(TestTarget.boostCount, 0);
+ Assert.assertEquals(TestTarget.unboostCount, 0);
+ Assert.assertEquals(TestTarget.unboostCount, 0);
+
+ synchronized (t) {
+ synchronized (t) {
+ synchronized (t) {
+ synchronized (t) {
+ synchronized (t) {
+ synchronized (t) {
+ Assert.assertEquals(TestTarget.boostCount, 6);
+ Assert.assertEquals(TestTarget.unboostCount, 0);
+ TestTarget.invoke();
+ }
+ Assert.assertEquals(TestTarget.unboostCount, 1);
+ }
+ Assert.assertEquals(TestTarget.unboostCount, 2);
+ }
+ Assert.assertEquals(TestTarget.unboostCount, 3);
+ }
+ Assert.assertEquals(TestTarget.unboostCount, 4);
+ }
+ Assert.assertEquals(TestTarget.unboostCount, 5);
+ }
+
+ Assert.assertEquals(TestTarget.boostCount, 6);
+ Assert.assertEquals(TestTarget.unboostCount, 6);
+ Assert.assertEquals(TestTarget.invokeCount, 1);
+ }
+
+ @Test
+ public void testMethodWithControlFlow() {
+ TestTarget.resetCount();
+ TestTarget t = new TestTarget();
+
+ Assert.assertEquals(TestTarget.boostCount, 0);
+ Assert.assertEquals(TestTarget.unboostCount, 0);
+
+ if ((t.hashCode() + " ").contains("1")) {
+ t.synchronizedCall();
+ } else {
+ t.synchronizedCall();
+ }
+
+ // Should only be boosted once.
+ Assert.assertEquals(TestTarget.boostCount, 1);
+ Assert.assertEquals(TestTarget.unboostCount, 1);
+ Assert.assertEquals(TestTarget.invokeCount, 1);
+ }
+}
diff --git a/tools/locked_region_code_injection/test/lockedregioncodeinjection/TestTarget.java b/tools/locked_region_code_injection/test/lockedregioncodeinjection/TestTarget.java
new file mode 100644
index 0000000..8e7d478
--- /dev/null
+++ b/tools/locked_region_code_injection/test/lockedregioncodeinjection/TestTarget.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2017 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 lockedregioncodeinjection;
+
+public class TestTarget {
+ public static int boostCount = 0;
+ public static int unboostCount = 0;
+ public static int invokeCount = 0;
+
+ public static void boost() {
+ boostCount++;
+ }
+
+ public static void unboost() {
+ unboostCount++;
+ }
+
+ public static void invoke() {
+ invokeCount++;
+ }
+
+ public static void resetCount() {
+ boostCount = 0;
+ unboostCount = 0;
+ invokeCount = 0;
+ }
+
+ public synchronized void synchronizedCall() {
+ invoke();
+ }
+
+ public synchronized int synchronizedCallReturnInt() {
+ invoke();
+ return 0;
+ }
+
+ public synchronized Object synchronizedCallReturnObject() {
+ invoke();
+ return this;
+ }
+}
diff --git a/wifi/java/android/net/wifi/IRttManager.aidl b/wifi/java/android/net/wifi/IRttManager.aidl
index 90f66c4..3831809 100644
--- a/wifi/java/android/net/wifi/IRttManager.aidl
+++ b/wifi/java/android/net/wifi/IRttManager.aidl
@@ -23,6 +23,6 @@
*/
interface IRttManager
{
- Messenger getMessenger();
+ Messenger getMessenger(in IBinder binder, out int[] key);
RttManager.RttCapabilities getRttCapabilities();
}
diff --git a/wifi/java/android/net/wifi/RttManager.java b/wifi/java/android/net/wifi/RttManager.java
index a4b3bf2a..ac5df05 100644
--- a/wifi/java/android/net/wifi/RttManager.java
+++ b/wifi/java/android/net/wifi/RttManager.java
@@ -6,6 +6,7 @@
import android.annotation.SystemApi;
import android.annotation.SystemService;
import android.content.Context;
+import android.os.Binder;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
@@ -1187,6 +1188,8 @@
CMD_OP_ENALBE_RESPONDER_SUCCEEDED = BASE + 7;
public static final int
CMD_OP_ENALBE_RESPONDER_FAILED = BASE + 8;
+ /** @hide */
+ public static final int CMD_OP_REG_BINDER = BASE + 9;
private static final int INVALID_KEY = 0;
@@ -1215,9 +1218,10 @@
mContext = context;
mService = service;
Messenger messenger = null;
+ int[] key = new int[1];
try {
Log.d(TAG, "Get the messenger from " + mService);
- messenger = mService.getMessenger();
+ messenger = mService.getMessenger(new Binder(), key);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -1233,6 +1237,7 @@
// We cannot use fullyConnectSync because it sends the FULL_CONNECTION message
// synchronously, which causes RttService to receive the wrong replyTo value.
mAsyncChannel.sendMessage(AsyncChannel.CMD_CHANNEL_FULL_CONNECTION);
+ mAsyncChannel.sendMessage(CMD_OP_REG_BINDER, key[0]);
}
private void validateChannel() {
diff --git a/wifi/java/android/net/wifi/ScanResult.java b/wifi/java/android/net/wifi/ScanResult.java
index afee290..a552e62 100644
--- a/wifi/java/android/net/wifi/ScanResult.java
+++ b/wifi/java/android/net/wifi/ScanResult.java
@@ -431,6 +431,28 @@
*/
public AnqpInformationElement[] anqpElements;
+ /**
+ * Flag indicating if this AP is a carrier AP. The determination is based
+ * on the AP's SSID and if AP is using EAP security.
+ *
+ * @hide
+ */
+ public boolean isCarrierAp;
+
+ /**
+ * The EAP type {@link WifiEnterpriseConfig.Eap} associated with this AP if it is a carrier AP.
+ *
+ * @hide
+ */
+ public int carrierApEapType;
+
+ /**
+ * The name of the carrier that's associated with this AP if it is a carrier AP.
+ *
+ * @hide
+ */
+ public String carrierName;
+
/** {@hide} */
public ScanResult(WifiSsid wifiSsid, String BSSID, long hessid, int anqpDomainId,
byte[] osuProviders, String caps, int level, int frequency, long tsf) {
@@ -455,6 +477,9 @@
this.centerFreq0 = UNSPECIFIED;
this.centerFreq1 = UNSPECIFIED;
this.flags = 0;
+ this.isCarrierAp = false;
+ this.carrierApEapType = UNSPECIFIED;
+ this.carrierName = null;
}
/** {@hide} */
@@ -473,6 +498,9 @@
this.centerFreq0 = UNSPECIFIED;
this.centerFreq1 = UNSPECIFIED;
this.flags = 0;
+ this.isCarrierAp = false;
+ this.carrierApEapType = UNSPECIFIED;
+ this.carrierName = null;
}
/** {@hide} */
@@ -498,6 +526,9 @@
} else {
this.flags = 0;
}
+ this.isCarrierAp = false;
+ this.carrierApEapType = UNSPECIFIED;
+ this.carrierName = null;
}
/** {@hide} */
@@ -537,6 +568,9 @@
venueName = source.venueName;
operatorFriendlyName = source.operatorFriendlyName;
flags = source.flags;
+ isCarrierAp = source.isCarrierAp;
+ carrierApEapType = source.carrierApEapType;
+ carrierName = source.carrierName;
}
}
@@ -577,6 +611,9 @@
sb.append(", centerFreq1: ").append(centerFreq1);
sb.append(", 80211mcResponder: ");
sb.append(((flags & FLAG_80211mc_RESPONDER) != 0) ? "is supported" : "is not supported");
+ sb.append(", Carrier AP: ").append(isCarrierAp ? "yes" : "no");
+ sb.append(", Carrier AP EAP Type: ").append(carrierApEapType);
+ sb.append(", Carrier name: ").append(carrierName);
return sb.toString();
}
@@ -646,6 +683,9 @@
} else {
dest.writeInt(0);
}
+ dest.writeInt(isCarrierAp ? 1 : 0);
+ dest.writeInt(carrierApEapType);
+ dest.writeString(carrierName);
}
/** Implement the Parcelable interface {@hide} */
@@ -715,6 +755,9 @@
new AnqpInformationElement(vendorId, elementId, payload);
}
}
+ sr.isCarrierAp = in.readInt() != 0;
+ sr.carrierApEapType = in.readInt();
+ sr.carrierName = in.readString();
return sr;
}
diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java
index e7fbe4f..a145327 100644
--- a/wifi/java/android/net/wifi/WifiConfiguration.java
+++ b/wifi/java/android/net/wifi/WifiConfiguration.java
@@ -245,6 +245,7 @@
* (e.g., {@code 01a243f405}).
*/
public String SSID;
+
/**
* When set, this network configuration entry should only be used when
* associating with the AP having the specified BSSID. The value is
@@ -419,12 +420,6 @@
/**
* @hide
- * last failure
- */
- public String lastFailure;
-
- /**
- * @hide
* last time we connected, this configuration had validated internet access
*/
public boolean validatedInternetAccess;
@@ -740,22 +735,58 @@
}
/**
+ * Indicates if the creator of this configuration has expressed that it
+ * should be considered metered.
+ *
+ * @see #isMetered(WifiConfiguration, WifiInfo)
* @hide
- * A hint about whether or not the network represented by this WifiConfiguration
- * is metered. This is hinted at via the meteredHint bit on DHCP results set in
- * {@link com.android.server.wifi.WifiStateMachine}, or via a network score in
- * {@link com.android.server.wifi.ExternalScoreEvaluator}.
*/
@SystemApi
public boolean meteredHint;
+ /** {@hide} */
+ public static final int METERED_OVERRIDE_NONE = 0;
+ /** {@hide} */
+ public static final int METERED_OVERRIDE_METERED = 1;
+ /** {@hide} */
+ public static final int METERED_OVERRIDE_NOT_METERED = 2;
+
/**
+ * Indicates if the end user has expressed an explicit opinion about the
+ * meteredness of this network, such as through the Settings app.
+ * <p>
+ * This should always override any values from {@link #meteredHint} or
+ * {@link WifiInfo#getMeteredHint()}.
+ *
+ * @see #isMetered(WifiConfiguration, WifiInfo)
* @hide
- * Indicates if a user has specified the WifiConfiguration to be metered. Users
- * can toggle if a network is metered within Settings -> Data Usage -> Network
- * Restrictions.
*/
- public boolean meteredOverride;
+ public int meteredOverride = METERED_OVERRIDE_NONE;
+
+ /**
+ * Blend together all the various opinions to decide if the given network
+ * should be considered metered or not.
+ *
+ * @hide
+ */
+ public static boolean isMetered(WifiConfiguration config, WifiInfo info) {
+ boolean metered = false;
+ if (info != null && info.getMeteredHint()) {
+ metered = true;
+ }
+ if (config != null && config.meteredHint) {
+ metered = true;
+ }
+ if (config != null
+ && config.meteredOverride == WifiConfiguration.METERED_OVERRIDE_METERED) {
+ metered = true;
+ }
+ if (config != null
+ && config.meteredOverride == WifiConfiguration.METERED_OVERRIDE_NOT_METERED) {
+ metered = false;
+ }
+ return metered;
+ }
/**
* @hide
@@ -1380,6 +1411,53 @@
/**
* @hide
+ * This class is intended to store extra failure reason information for the most recent
+ * connection attempt, so that it may be surfaced to the settings UI
+ */
+ public static class RecentFailure {
+
+ /**
+ * No recent failure, or no specific reason given for the recent connection failure
+ */
+ public static final int NONE = 0;
+ /**
+ * Connection to this network recently failed due to Association Rejection Status 17
+ * (AP is full)
+ */
+ public static final int STATUS_AP_UNABLE_TO_HANDLE_NEW_STA = 17;
+ /**
+ * Association Rejection Status code (NONE for success/non-association-rejection-fail)
+ */
+ private int mAssociationStatus = NONE;
+
+ /**
+ * @param status the association status code for the recent failure
+ */
+ public void setAssociationStatus(int status) {
+ mAssociationStatus = status;
+ }
+ /**
+ * Sets the RecentFailure to NONE
+ */
+ public void clear() {
+ mAssociationStatus = NONE;
+ }
+ /**
+ * Get the recent failure code
+ */
+ public int getAssociationStatus() {
+ return mAssociationStatus;
+ }
+ }
+
+ /**
+ * @hide
+ * RecentFailure member
+ */
+ final public RecentFailure recentFailure = new RecentFailure();
+
+ /**
+ * @hide
* @return network selection status
*/
public NetworkSelectionStatus getNetworkSelectionStatus() {
@@ -1426,7 +1504,7 @@
didSelfAdd = false;
ephemeral = false;
meteredHint = false;
- meteredOverride = false;
+ meteredOverride = METERED_OVERRIDE_NONE;
useExternalScores = false;
validatedInternetAccess = false;
mIpConfiguration = new IpConfiguration();
@@ -1520,23 +1598,24 @@
sbuf.append(this.numNoInternetAccessReports).append("\n");
}
if (this.updateTime != null) {
- sbuf.append("update ").append(this.updateTime).append("\n");
+ sbuf.append(" update ").append(this.updateTime).append("\n");
}
if (this.creationTime != null) {
- sbuf.append("creation").append(this.creationTime).append("\n");
+ sbuf.append(" creation ").append(this.creationTime).append("\n");
}
if (this.didSelfAdd) sbuf.append(" didSelfAdd");
if (this.selfAdded) sbuf.append(" selfAdded");
if (this.validatedInternetAccess) sbuf.append(" validatedInternetAccess");
if (this.ephemeral) sbuf.append(" ephemeral");
if (this.meteredHint) sbuf.append(" meteredHint");
- if (this.meteredOverride) sbuf.append(" meteredOverride");
if (this.useExternalScores) sbuf.append(" useExternalScores");
if (this.didSelfAdd || this.selfAdded || this.validatedInternetAccess
- || this.ephemeral || this.meteredHint || this.meteredOverride
- || this.useExternalScores) {
+ || this.ephemeral || this.meteredHint || this.useExternalScores) {
sbuf.append("\n");
}
+ if (this.meteredOverride != METERED_OVERRIDE_NONE) {
+ sbuf.append(" meteredOverride ").append(meteredOverride).append("\n");
+ }
sbuf.append(" KeyMgmt:");
for (int k = 0; k < this.allowedKeyManagement.size(); k++) {
if (this.allowedKeyManagement.get(k)) {
@@ -1667,7 +1746,8 @@
sbuf.append('\n');
}
}
-
+ sbuf.append("recentFailure: ").append("Association Rejection code: ")
+ .append(recentFailure.getAssociationStatus()).append("\n");
return sbuf.toString();
}
@@ -1991,7 +2071,6 @@
visibility = new Visibility(source.visibility);
}
- lastFailure = source.lastFailure;
didSelfAdd = source.didSelfAdd;
lastConnectUid = source.lastConnectUid;
lastUpdateUid = source.lastUpdateUid;
@@ -2015,6 +2094,7 @@
creationTime = source.creationTime;
updateTime = source.updateTime;
shared = source.shared;
+ recentFailure.setAssociationStatus(source.recentFailure.getAssociationStatus());
}
}
@@ -2062,7 +2142,7 @@
dest.writeInt(isLegacyPasspointConfig ? 1 : 0);
dest.writeInt(ephemeral ? 1 : 0);
dest.writeInt(meteredHint ? 1 : 0);
- dest.writeInt(meteredOverride ? 1 : 0);
+ dest.writeInt(meteredOverride);
dest.writeInt(useExternalScores ? 1 : 0);
dest.writeInt(creatorUid);
dest.writeInt(lastConnectUid);
@@ -2081,6 +2161,7 @@
dest.writeInt(noInternetAccessExpected ? 1 : 0);
dest.writeInt(shared ? 1 : 0);
dest.writeString(mPasspointManagementObjectTree);
+ dest.writeInt(recentFailure.getAssociationStatus());
}
/** Implement the Parcelable interface {@hide} */
@@ -2129,7 +2210,7 @@
config.isLegacyPasspointConfig = in.readInt() != 0;
config.ephemeral = in.readInt() != 0;
config.meteredHint = in.readInt() != 0;
- config.meteredOverride = in.readInt() != 0;
+ config.meteredOverride = in.readInt();
config.useExternalScores = in.readInt() != 0;
config.creatorUid = in.readInt();
config.lastConnectUid = in.readInt();
@@ -2148,6 +2229,7 @@
config.noInternetAccessExpected = in.readInt() != 0;
config.shared = in.readInt() != 0;
config.mPasspointManagementObjectTree = in.readString();
+ config.recentFailure.setAssociationStatus(in.readInt());
return config;
}
diff --git a/wifi/java/android/net/wifi/WifiInfo.java b/wifi/java/android/net/wifi/WifiInfo.java
index 25c1a8b..f8485ef 100644
--- a/wifi/java/android/net/wifi/WifiInfo.java
+++ b/wifi/java/android/net/wifi/WifiInfo.java
@@ -468,7 +468,13 @@
return mMacAddress != null && !DEFAULT_MAC_ADDRESS.equals(mMacAddress);
}
- /** {@hide} */
+ /**
+ * Indicates if we've dynamically detected this active network connection as
+ * being metered.
+ *
+ * @see WifiConfiguration#isMetered(WifiConfiguration, WifiInfo)
+ * @hide
+ */
public void setMeteredHint(boolean meteredHint) {
mMeteredHint = meteredHint;
}
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index 7173775..598360c 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -1837,7 +1837,7 @@
}
/**
- * This call will be deprecated and removed in an upcoming release. It is no longer used to
+ * This call is deprecated and removed. It is no longer used to
* start WiFi Tethering. Please use {@link ConnectivityManager#startTethering(int, boolean,
* ConnectivityManager#OnStartTetheringCallback)} if
* the caller has proper permissions. Callers can also use the LocalOnlyHotspot feature for a
@@ -1849,8 +1849,11 @@
* @return {@code false}
*
* @hide
+ * @deprecated This API is nolonger supported.
+ * @removed
*/
@SystemApi
+ @Deprecated
@RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED)
public boolean setWifiApEnabled(WifiConfiguration wifiConfig, boolean enabled) {
String packageName = mContext.getOpPackageName();
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pManager.java b/wifi/java/android/net/wifi/p2p/WifiP2pManager.java
index 0d4359e..8075e17 100644
--- a/wifi/java/android/net/wifi/p2p/WifiP2pManager.java
+++ b/wifi/java/android/net/wifi/p2p/WifiP2pManager.java
@@ -41,6 +41,8 @@
import com.android.internal.util.AsyncChannel;
import com.android.internal.util.Protocol;
+import dalvik.system.CloseGuard;
+
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -668,15 +670,21 @@
* Most p2p operations require a Channel as an argument. An instance of Channel is obtained
* by doing a call on {@link #initialize}
*/
- public static class Channel {
- Channel(Context context, Looper looper, ChannelListener l, Binder binder) {
+ public static class Channel implements AutoCloseable {
+ /** @hide */
+ public Channel(Context context, Looper looper, ChannelListener l, Binder binder,
+ WifiP2pManager p2pManager) {
mAsyncChannel = new AsyncChannel();
mHandler = new P2pHandler(looper);
mChannelListener = l;
mContext = context;
mBinder = binder;
+ mP2pManager = p2pManager;
+
+ mCloseGuard.open("close");
}
private final static int INVALID_LISTENER_KEY = 0;
+ private final WifiP2pManager mP2pManager;
private ChannelListener mChannelListener;
private ServiceResponseListener mServRspListener;
private DnsSdServiceResponseListener mDnsSdServRspListener;
@@ -686,6 +694,41 @@
private final Object mListenerMapLock = new Object();
private int mListenerKey = 0;
+ private final CloseGuard mCloseGuard = CloseGuard.get();
+
+ /**
+ * Close the current P2P connection and indicate to the P2P service that connections
+ * created by the app can be removed.
+ */
+ public void close() {
+ if (mP2pManager == null) {
+ Log.w(TAG, "Channel.close(): Null mP2pManager!?");
+ } else {
+ try {
+ mP2pManager.mService.close(mBinder);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ mAsyncChannel.disconnect();
+ mCloseGuard.close();
+ }
+
+ /** @hide */
+ @Override
+ protected void finalize() throws Throwable {
+ try {
+ if (mCloseGuard != null) {
+ mCloseGuard.warnIfOpen();
+ }
+
+ close();
+ } finally {
+ super.finalize();
+ }
+ }
+
/* package */ final Binder mBinder;
private AsyncChannel mAsyncChannel;
@@ -913,11 +956,12 @@
Messenger messenger, Binder binder) {
if (messenger == null) return null;
- Channel c = new Channel(srcContext, srcLooper, listener, binder);
+ Channel c = new Channel(srcContext, srcLooper, listener, binder, this);
if (c.mAsyncChannel.connectSync(srcContext, c.mHandler, messenger)
== AsyncChannel.STATUS_SUCCESSFUL) {
return c;
} else {
+ c.close();
return null;
}
}
@@ -1422,24 +1466,6 @@
}
/**
- * Close the current P2P connection and clean-up any configuration requested by the
- * current app. Takes same action as taken when the app dies.
- *
- * @param c is the channel created at {@link #initialize}
- *
- * @hide
- */
- public void close(Channel c) {
- try {
- if (c != null) {
- mService.close(c.mBinder);
- }
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- /**
* Get a handover request message for use in WFA NFC Handover transfer.
* @hide
*/
diff --git a/wifi/tests/Android.mk b/wifi/tests/Android.mk
index 8dc244f..afab1a3 100644
--- a/wifi/tests/Android.mk
+++ b/wifi/tests/Android.mk
@@ -50,6 +50,7 @@
LOCAL_STATIC_JAVA_LIBRARIES := \
android-support-test \
+ core-test-rules \
guava \
mockito-target-minus-junit4 \
frameworks-base-testutils \
diff --git a/wifi/tests/src/android/net/wifi/p2p/WifiP2pManagerTest.java b/wifi/tests/src/android/net/wifi/p2p/WifiP2pManagerTest.java
new file mode 100644
index 0000000..1e8382f
--- /dev/null
+++ b/wifi/tests/src/android/net/wifi/p2p/WifiP2pManagerTest.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2017 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.net.wifi.p2p;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.os.test.TestLooper;
+
+import libcore.junit.util.ResourceLeakageDetector;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+/**
+ * Unit test harness for WifiP2pManager.
+ */
+public class WifiP2pManagerTest {
+ private WifiP2pManager mDut;
+ private TestLooper mTestLooper;
+
+ @Mock
+ public Context mContextMock;
+ @Mock
+ IWifiP2pManager mP2pServiceMock;
+
+ @Rule
+ public ResourceLeakageDetector.LeakageDetectorRule leakageDetectorRule =
+ ResourceLeakageDetector.getRule();
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+
+ mDut = new WifiP2pManager(mP2pServiceMock);
+ mTestLooper = new TestLooper();
+ }
+
+ /**
+ * Validate that on finalize we close the channel and flag a resource leakage.
+ */
+ @Test
+ public void testChannelFinalize() throws Exception {
+ WifiP2pManager.Channel channel = new WifiP2pManager.Channel(mContextMock,
+ mTestLooper.getLooper(), null, null, mDut);
+
+ leakageDetectorRule.assertUnreleasedResourceCount(channel, 1);
+ }
+
+ /**
+ * Validate that when close is called on a channel it frees up resources (i.e. don't
+ * get flagged again on finalize).
+ */
+ @Test
+ public void testChannelClose() throws Exception {
+ WifiP2pManager.Channel channel = new WifiP2pManager.Channel(mContextMock,
+ mTestLooper.getLooper(), null, null, mDut);
+
+ channel.close();
+ verify(mP2pServiceMock).close(any());
+
+ leakageDetectorRule.assertUnreleasedResourceCount(channel, 0);
+ }
+}